| @@ -250,6 +250,7 @@ public: | |||
| menu.addSeparator(); | |||
| menu.addCommandItem (commandManager, CommandIDs::closeDocument); | |||
| menu.addCommandItem (commandManager, CommandIDs::saveDocument); | |||
| menu.addCommandItem (commandManager, CommandIDs::saveDocumentAs); | |||
| menu.addSeparator(); | |||
| menu.addCommandItem (commandManager, CommandIDs::closeProject); | |||
| menu.addCommandItem (commandManager, CommandIDs::saveProject); | |||
| @@ -34,6 +34,7 @@ namespace CommandIDs | |||
| open = 0x200020, | |||
| closeDocument = 0x200030, | |||
| saveDocument = 0x200040, | |||
| saveDocumentAs = 0x200041, | |||
| closeProject = 0x200051, | |||
| saveProject = 0x200060, | |||
| @@ -54,6 +54,7 @@ public: | |||
| Project* getProject() const { return project; } | |||
| bool needsSaving() const { return false; } | |||
| bool save() { return true; } | |||
| bool saveAs() { return false; } | |||
| bool hasFileBeenModifiedExternally() { return fileModificationTime != file.getLastModificationTime(); } | |||
| void reloadFromFile() { fileModificationTime = file.getLastModificationTime(); } | |||
| String getName() const { return file.getFileName(); } | |||
| @@ -55,6 +55,7 @@ public: | |||
| virtual File getFile() const = 0; | |||
| virtual bool needsSaving() const = 0; | |||
| virtual bool save() = 0; | |||
| virtual bool saveAs() = 0; | |||
| virtual bool hasFileBeenModifiedExternally() = 0; | |||
| virtual void reloadFromFile() = 0; | |||
| virtual Component* createEditor() = 0; | |||
| @@ -63,27 +63,44 @@ void SourceCodeDocument::reloadInternal() | |||
| { | |||
| jassert (codeDoc != nullptr); | |||
| modDetector.updateHash(); | |||
| codeDoc->applyChanges (modDetector.getFile().loadFileAsString()); | |||
| codeDoc->applyChanges (getFile().loadFileAsString()); | |||
| codeDoc->setSavePoint(); | |||
| } | |||
| bool SourceCodeDocument::save() | |||
| static bool writeCodeDocToFile (const File& file, CodeDocument& doc) | |||
| { | |||
| TemporaryFile temp (modDetector.getFile()); | |||
| TemporaryFile temp (file); | |||
| { | |||
| FileOutputStream fo (temp.getFile()); | |||
| if (! (fo.openedOk() && getCodeDocument().writeToStream (fo))) | |||
| if (! (fo.openedOk() && doc.writeToStream (fo))) | |||
| return false; | |||
| } | |||
| if (! temp.overwriteTargetFileWithTemporary()) | |||
| return false; | |||
| return temp.overwriteTargetFileWithTemporary(); | |||
| } | |||
| getCodeDocument().setSavePoint(); | |||
| modDetector.updateHash(); | |||
| return true; | |||
| bool SourceCodeDocument::save() | |||
| { | |||
| if (writeCodeDocToFile (getFile(), getCodeDocument())) | |||
| { | |||
| getCodeDocument().setSavePoint(); | |||
| modDetector.updateHash(); | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| bool SourceCodeDocument::saveAs() | |||
| { | |||
| FileChooser fc (TRANS("Save As..."), getFile(), "*"); | |||
| if (! fc.browseForFileToSave (true)) | |||
| return true; | |||
| return writeCodeDocToFile (fc.getResult(), getCodeDocument()); | |||
| } | |||
| void SourceCodeDocument::updateLastState (CodeEditorComponent& editor) | |||
| @@ -59,7 +59,8 @@ public: | |||
| const char* extensions[] = { "h", "hpp", nullptr }; | |||
| return findCounterpart (file, extensions); | |||
| } | |||
| else if (file.hasFileExtension ("h;hpp")) | |||
| if (file.hasFileExtension ("h;hpp")) | |||
| { | |||
| const char* extensions[] = { "cpp", "mm", "cc", "cxx", "c", "m", nullptr }; | |||
| return findCounterpart (file, extensions); | |||
| @@ -83,6 +84,7 @@ public: | |||
| void reloadFromFile(); | |||
| bool save(); | |||
| bool saveAs(); | |||
| Component* createEditor(); | |||
| Component* createViewer() { return createEditor(); } | |||
| @@ -419,15 +419,20 @@ void ProjectContentComponent::closeDocument() | |||
| hideEditor(); | |||
| } | |||
| static void showSaveWarning (OpenDocumentManager::Document* currentDocument) | |||
| { | |||
| AlertWindow::showMessageBox (AlertWindow::WarningIcon, | |||
| TRANS("Save failed!"), | |||
| TRANS("Couldn't save the file:") | |||
| + "\n" + currentDocument->getFile().getFullPathName()); | |||
| } | |||
| void ProjectContentComponent::saveDocument() | |||
| { | |||
| if (currentDocument != nullptr) | |||
| { | |||
| if (! currentDocument->save()) | |||
| AlertWindow::showMessageBox (AlertWindow::WarningIcon, | |||
| TRANS("Save failed!"), | |||
| TRANS("Couldn't save the file:") | |||
| + "\n" + currentDocument->getFile().getFullPathName()); | |||
| showSaveWarning (currentDocument); | |||
| } | |||
| else | |||
| saveProject(); | |||
| @@ -435,6 +440,12 @@ void ProjectContentComponent::saveDocument() | |||
| updateMainWindowTitle(); | |||
| } | |||
| void ProjectContentComponent::saveAs() | |||
| { | |||
| if (currentDocument != nullptr && ! currentDocument->saveAs()) | |||
| showSaveWarning (currentDocument); | |||
| } | |||
| bool ProjectContentComponent::goToPreviousFile() | |||
| { | |||
| OpenDocumentManager::Document* doc = recentDocumentList.getCurrentDocument(); | |||
| @@ -544,6 +555,7 @@ ApplicationCommandTarget* ProjectContentComponent::getNextCommandTarget() | |||
| void ProjectContentComponent::getAllCommands (Array <CommandID>& commands) | |||
| { | |||
| const CommandID ids[] = { CommandIDs::saveDocument, | |||
| CommandIDs::saveDocumentAs, | |||
| CommandIDs::closeDocument, | |||
| CommandIDs::saveProject, | |||
| CommandIDs::closeProject, | |||
| @@ -595,6 +607,14 @@ void ProjectContentComponent::getCommandInfo (const CommandID commandID, Applica | |||
| result.defaultKeypresses.add (KeyPress ('s', ModifierKeys::commandModifier, 0)); | |||
| break; | |||
| case CommandIDs::saveDocumentAs: | |||
| result.setInfo ("Save As...", | |||
| "Saves the current document to a new location", | |||
| CommandCategories::general, 0); | |||
| result.setActive (currentDocument != nullptr || project != nullptr); | |||
| result.defaultKeypresses.add (KeyPress ('s', ModifierKeys::commandModifier | ModifierKeys::shiftModifier, 0)); | |||
| break; | |||
| case CommandIDs::closeDocument: | |||
| result.setInfo ("Close" + documentName, | |||
| "Closes the current document", | |||
| @@ -688,6 +708,7 @@ bool ProjectContentComponent::perform (const InvocationInfo& info) | |||
| case CommandIDs::saveProject: | |||
| case CommandIDs::closeProject: | |||
| case CommandIDs::saveDocument: | |||
| case CommandIDs::saveDocumentAs: | |||
| case CommandIDs::closeDocument: | |||
| case CommandIDs::goToPreviousDoc: | |||
| case CommandIDs::goToNextDoc: | |||
| @@ -710,6 +731,7 @@ bool ProjectContentComponent::perform (const InvocationInfo& info) | |||
| case CommandIDs::saveProject: saveProject(); break; | |||
| case CommandIDs::closeProject: closeProject(); break; | |||
| case CommandIDs::saveDocument: saveDocument(); break; | |||
| case CommandIDs::saveDocumentAs: saveAs(); break; | |||
| case CommandIDs::closeDocument: closeDocument(); break; | |||
| case CommandIDs::goToPreviousDoc: goToPreviousFile(); break; | |||
| @@ -58,6 +58,7 @@ public: | |||
| OpenDocumentManager::Document* getCurrentDocument() const { return currentDocument; } | |||
| void closeDocument(); | |||
| void saveDocument(); | |||
| void saveAs(); | |||
| void hideEditor(); | |||
| bool setEditorComponent (Component* editor, OpenDocumentManager::Document* doc); | |||
| @@ -137,15 +137,11 @@ FileBasedDocument::SaveResult FileBasedDocument::saveAs (const File& newFile, | |||
| if (newFile == File::nonexistent) | |||
| { | |||
| if (askUserForFileIfNotSpecified) | |||
| { | |||
| return saveAsInteractive (true); | |||
| } | |||
| else | |||
| { | |||
| // can't save to an unspecified file | |||
| jassertfalse; | |||
| return failedToWriteToFile; | |||
| } | |||
| // can't save to an unspecified file | |||
| jassertfalse; | |||
| return failedToWriteToFile; | |||
| } | |||
| if (warnAboutOverwritingExistingFiles && newFile.exists()) | |||
| @@ -208,16 +204,11 @@ FileBasedDocument::SaveResult FileBasedDocument::saveIfNeededAndUserAgrees() | |||
| TRANS("discard changes"), | |||
| TRANS("cancel")); | |||
| if (r == 1) | |||
| { | |||
| // save changes | |||
| if (r == 1) // save changes | |||
| return save (true, true); | |||
| } | |||
| else if (r == 2) | |||
| { | |||
| // discard changes | |||
| if (r == 2) // discard changes | |||
| return savedOk; | |||
| } | |||
| return userCancelledSave; | |||
| } | |||