| @@ -438,18 +438,7 @@ public: | |||
| bool closeAllDocuments (bool askUserToSave) | |||
| { | |||
| for (int i = OpenDocumentManager::getInstance()->getNumOpenDocuments(); --i >= 0;) | |||
| { | |||
| OpenDocumentManager::Document* doc = OpenDocumentManager::getInstance()->getOpenDocument (i); | |||
| for (int j = mainWindows.size(); --j >= 0;) | |||
| mainWindows.getUnchecked(j)->getProjectContentComponent()->hideDocument (doc); | |||
| if (! OpenDocumentManager::getInstance()->closeDocument (i, askUserToSave)) | |||
| return false; | |||
| } | |||
| return true; | |||
| return OpenDocumentManager::getInstance()->closeAll (askUserToSave); | |||
| } | |||
| void updateRecentProjectList() | |||
| @@ -41,11 +41,8 @@ public: | |||
| } | |||
| //============================================================================== | |||
| class Type : public OpenDocumentManager::DocumentType | |||
| struct Type : public OpenDocumentManager::DocumentType | |||
| { | |||
| public: | |||
| Type() {} | |||
| bool canOpenFile (const File& file) { return SourceCodeEditor::isTextFile (file); } | |||
| Document* openFile (Project*, const File& file) { return new SourceCodeDocument (file); } | |||
| }; | |||
| @@ -123,12 +120,8 @@ public: | |||
| } | |||
| //============================================================================== | |||
| class Type : public OpenDocumentManager::DocumentType | |||
| struct Type : public OpenDocumentManager::DocumentType | |||
| { | |||
| public: | |||
| Type() {} | |||
| ~Type() {} | |||
| bool canOpenFile (const File&) { return true; } | |||
| Document* openFile (Project* project, const File& file) { return new UnknownDocument (project, file); } | |||
| }; | |||
| @@ -208,7 +201,7 @@ bool OpenDocumentManager::canOpenFile (const File& file) | |||
| return false; | |||
| } | |||
| OpenDocumentManager::Document* OpenDocumentManager::getDocumentForFile (Project* project, const File& file) | |||
| OpenDocumentManager::Document* OpenDocumentManager::openFile (Project* project, const File& file) | |||
| { | |||
| for (int i = documents.size(); --i >= 0;) | |||
| if (documents.getUnchecked(i)->isForFile (file)) | |||
| @@ -225,11 +218,9 @@ OpenDocumentManager::Document* OpenDocumentManager::getDocumentForFile (Project* | |||
| } | |||
| } | |||
| jassert (d != nullptr); | |||
| if (d != nullptr) | |||
| documents.add (d); | |||
| jassert (d != nullptr); // should always at least have been picked up by UnknownDocument | |||
| documents.add (d); | |||
| commandManager->commandStatusChanged(); | |||
| return d; | |||
| } | |||
| @@ -324,6 +315,15 @@ void OpenDocumentManager::closeFile (const File& f, bool saveIfNeeded) | |||
| } | |||
| } | |||
| bool OpenDocumentManager::closeAll (bool askUserToSave) | |||
| { | |||
| for (int i = getNumOpenDocuments(); --i >= 0;) | |||
| if (! closeDocument (i, askUserToSave)) | |||
| return false; | |||
| return true; | |||
| } | |||
| bool OpenDocumentManager::closeAllDocumentsUsingProject (Project& project, bool saveIfNeeded) | |||
| { | |||
| for (int i = documents.size(); --i >= 0;) | |||
| @@ -65,16 +65,16 @@ public: | |||
| virtual void fileHasBeenRenamed (const File& newFile) = 0; | |||
| }; | |||
| Document* getDocumentForFile (Project* project, const File& file); | |||
| bool canOpenFile (const File& file); | |||
| //============================================================================== | |||
| int getNumOpenDocuments() const; | |||
| Document* getOpenDocument (int index) const; | |||
| void moveDocumentToTopOfStack (Document* doc); | |||
| bool canOpenFile (const File& file); | |||
| Document* openFile (Project* project, const File& file); | |||
| bool closeDocument (int index, bool saveIfNeeded); | |||
| bool closeDocument (Document* document, bool saveIfNeeded); | |||
| bool closeAll (bool askUserToSave); | |||
| bool closeAllDocumentsUsingProject (Project& project, bool saveIfNeeded); | |||
| void closeFile (const File& f, bool saveIfNeeded); | |||
| bool anyFilesNeedSaving() const; | |||
| @@ -110,13 +110,11 @@ public: | |||
| { | |||
| Project::Item item (generatedFilesGroup.findItemForFile (file)); | |||
| if (! item.isValid()) | |||
| { | |||
| generatedFilesGroup.addFile (file, -1, true); | |||
| item = generatedFilesGroup.findItemForFile (file); | |||
| } | |||
| if (item.isValid()) | |||
| return item; | |||
| return item; | |||
| generatedFilesGroup.addFile (file, -1, true); | |||
| return generatedFilesGroup.findItemForFile (file); | |||
| } | |||
| void setExtraAppConfigFileContent (const String& content) | |||
| @@ -413,7 +411,7 @@ private: | |||
| void writeProjects (const OwnedArray<LibraryModule>& modules) | |||
| { | |||
| // keep a copy of the basic generated files group, as each exporter may modify it. | |||
| const ValueTree originalGeneratedGroup (generatedFilesGroup.getNode().createCopy()); | |||
| const ValueTree originalGeneratedGroup (generatedFilesGroup.state.createCopy()); | |||
| for (int i = project.getNumExporters(); --i >= 0;) | |||
| { | |||
| @@ -424,7 +422,7 @@ private: | |||
| { | |||
| exporter->addToExtraSearchPaths (RelativePath ("JuceLibraryCode", RelativePath::projectFolder)); | |||
| generatedFilesGroup.getNode() = originalGeneratedGroup.createCopy(); | |||
| generatedFilesGroup.state = originalGeneratedGroup.createCopy(); | |||
| project.getProjectType().prepareExporter (*exporter); | |||
| for (int j = 0; j < modules.size(); ++j) | |||
| @@ -34,12 +34,12 @@ GroupInformationComponent::GroupInformationComponent (const Project::Item& item_ | |||
| addAndMakeVisible (&list); | |||
| list.updateContent(); | |||
| list.setRowHeight (20); | |||
| item.getNode().addListener (this); | |||
| item.state.addListener (this); | |||
| } | |||
| GroupInformationComponent::~GroupInformationComponent() | |||
| { | |||
| item.getNode().removeListener (this); | |||
| item.state.removeListener (this); | |||
| } | |||
| void GroupInformationComponent::resized() | |||
| @@ -675,5 +675,5 @@ void LibraryModule::addBrowsableCode (ProjectExporter& exporter, const Array<Fil | |||
| sourceGroup.addFile (localModuleFolder.getChildFile (moduleFile.getRelativePathFrom (moduleFolder)), -1, false); | |||
| sourceGroup.addFile (getInclude (localModuleFolder), -1, false); | |||
| exporter.getModulesGroup().getNode().addChild (sourceGroup.getNode().createCopy(), -1, nullptr); | |||
| exporter.getModulesGroup().state.addChild (sourceGroup.state.createCopy(), -1, nullptr); | |||
| } | |||
| @@ -31,7 +31,7 @@ namespace | |||
| { | |||
| bool fillInNewCppFileTemplate (const File& file, const Project::Item& item, const char* templateName) | |||
| { | |||
| String s = item.getProject().getFileTemplate (templateName) | |||
| String s = item.project.getFileTemplate (templateName) | |||
| .replace ("FILENAME", file.getFileName(), false) | |||
| .replace ("DATE", Time::getCurrentTime().toString (true, true, true), false) | |||
| .replace ("AUTHOR", SystemStats::getFullUserName(), false) | |||
| @@ -98,10 +98,10 @@ void Project::setMissingDefaultValues() | |||
| if (! projectRoot.getChildWithName (Tags::projectMainGroup).isValid()) | |||
| { | |||
| Item mainGroup (*this, ValueTree (Tags::projectMainGroup)); | |||
| projectRoot.addChild (mainGroup.getNode(), 0, 0); | |||
| projectRoot.addChild (mainGroup.state, 0, 0); | |||
| } | |||
| getMainGroup().initialiseNodeValues(); | |||
| getMainGroup().initialiseMissingProperties(); | |||
| if (getDocumentTitle().isEmpty()) | |||
| setTitle ("Juce Project"); | |||
| @@ -359,22 +359,12 @@ String Project::getVersionAsHex() const | |||
| Image Project::getBigIcon() | |||
| { | |||
| Item icon (getMainGroup().findItemWithID (getBigIconImageItemID().toString())); | |||
| if (icon.isValid()) | |||
| return ImageCache::getFromFile (icon.getFile()); | |||
| return Image::null; | |||
| return getMainGroup().findItemWithID (getBigIconImageItemID().toString()).loadAsImageFile(); | |||
| } | |||
| Image Project::getSmallIcon() | |||
| { | |||
| Item icon (getMainGroup().findItemWithID (getSmallIconImageItemID().toString())); | |||
| if (icon.isValid()) | |||
| return ImageCache::getFromFile (icon.getFile()); | |||
| return Image::null; | |||
| return getMainGroup().findItemWithID (getSmallIconImageItemID().toString()).loadAsImageFile(); | |||
| } | |||
| StringPairArray Project::getPreprocessorDefs() const | |||
| @@ -407,51 +397,46 @@ void Project::findAllImageItems (OwnedArray<Project::Item>& items) | |||
| } | |||
| //============================================================================== | |||
| Project::Item::Item (Project& project_, const ValueTree& node_) | |||
| : project (&project_), node (node_) | |||
| Project::Item::Item (Project& project_, const ValueTree& state_) | |||
| : project (project_), state (state_) | |||
| { | |||
| } | |||
| Project::Item::Item (const Item& other) | |||
| : project (other.project), node (other.node) | |||
| : project (other.project), state (other.state) | |||
| { | |||
| } | |||
| Project::Item& Project::Item::operator= (const Project::Item& other) | |||
| { | |||
| project = other.project; | |||
| node = other.node; | |||
| return *this; | |||
| } | |||
| Project::Item Project::Item::createCopy() { Item i (*this); i.state = i.state.createCopy(); return i; } | |||
| Project::Item::~Item() | |||
| { | |||
| } | |||
| Project::Item Project::Item::createCopy() { Item i (*this); i.node = i.node.createCopy(); return i; } | |||
| String Project::Item::getID() const { return node [ComponentBuilder::idProperty]; } | |||
| void Project::Item::setID (const String& newID) { node.setProperty (ComponentBuilder::idProperty, newID, nullptr); } | |||
| String Project::Item::getID() const { return state [ComponentBuilder::idProperty]; } | |||
| void Project::Item::setID (const String& newID) { state.setProperty (ComponentBuilder::idProperty, newID, nullptr); } | |||
| String Project::Item::getImageFileID() const { return "id:" + getID(); } | |||
| Image Project::Item::loadAsImageFile() const | |||
| { | |||
| return isValid() ? ImageCache::getFromFile (getFile()) | |||
| : Image::null; | |||
| } | |||
| Project::Item Project::Item::createGroup (Project& project, const String& name, const String& uid) | |||
| { | |||
| Item group (project, ValueTree (Tags::group)); | |||
| group.setID (uid); | |||
| group.initialiseNodeValues(); | |||
| group.initialiseMissingProperties(); | |||
| group.getName() = name; | |||
| return group; | |||
| } | |||
| bool Project::Item::isFile() const { return node.hasType (Tags::file); } | |||
| bool Project::Item::isGroup() const { return node.hasType (Tags::group) || isMainGroup(); } | |||
| bool Project::Item::isMainGroup() const { return node.hasType (Tags::projectMainGroup); } | |||
| bool Project::Item::isFile() const { return state.hasType (Tags::file); } | |||
| bool Project::Item::isGroup() const { return state.hasType (Tags::group) || isMainGroup(); } | |||
| bool Project::Item::isMainGroup() const { return state.hasType (Tags::projectMainGroup); } | |||
| bool Project::Item::isImageFile() const { return isFile() && getFile().hasFileExtension ("png;jpg;jpeg;gif;drawable"); } | |||
| Project::Item Project::Item::findItemWithID (const String& targetId) const | |||
| { | |||
| if (node [ComponentBuilder::idProperty] == targetId) | |||
| if (state [ComponentBuilder::idProperty] == targetId) | |||
| return *this; | |||
| if (isGroup()) | |||
| @@ -464,7 +449,7 @@ Project::Item Project::Item::findItemWithID (const String& targetId) const | |||
| } | |||
| } | |||
| return Item (*project, ValueTree::invalid); | |||
| return Item (project, ValueTree::invalid); | |||
| } | |||
| bool Project::Item::canContain (const Item& child) const | |||
| @@ -479,24 +464,21 @@ bool Project::Item::canContain (const Item& child) const | |||
| return false; | |||
| } | |||
| bool Project::Item::shouldBeAddedToTargetProject() const | |||
| { | |||
| return isFile(); | |||
| } | |||
| bool Project::Item::shouldBeAddedToTargetProject() const { return isFile(); } | |||
| bool Project::Item::shouldBeCompiled() const { return getShouldCompileValue().getValue(); } | |||
| Value Project::Item::getShouldCompileValue() const { return node.getPropertyAsValue (Ids::compile, getUndoManager()); } | |||
| Value Project::Item::getShouldCompileValue() const { return state.getPropertyAsValue (Ids::compile, getUndoManager()); } | |||
| bool Project::Item::shouldBeAddedToBinaryResources() const { return getShouldAddToResourceValue().getValue(); } | |||
| Value Project::Item::getShouldAddToResourceValue() const { return node.getPropertyAsValue (Ids::resource, getUndoManager()); } | |||
| Value Project::Item::getShouldAddToResourceValue() const { return state.getPropertyAsValue (Ids::resource, getUndoManager()); } | |||
| Value Project::Item::getShouldInhibitWarningsValue() const { return node.getPropertyAsValue (Ids::noWarnings, getUndoManager()); } | |||
| Value Project::Item::getShouldUseStdCallValue() const { return node.getPropertyAsValue (Ids::useStdCall, nullptr); } | |||
| Value Project::Item::getShouldInhibitWarningsValue() const { return state.getPropertyAsValue (Ids::noWarnings, getUndoManager()); } | |||
| Value Project::Item::getShouldUseStdCallValue() const { return state.getPropertyAsValue (Ids::useStdCall, nullptr); } | |||
| String Project::Item::getFilePath() const | |||
| { | |||
| if (isFile()) | |||
| return node [Ids::file].toString(); | |||
| return state [Ids::file].toString(); | |||
| else | |||
| return String::empty; | |||
| } | |||
| @@ -504,14 +486,14 @@ String Project::Item::getFilePath() const | |||
| File Project::Item::getFile() const | |||
| { | |||
| if (isFile()) | |||
| return getProject().resolveFilename (node [Ids::file].toString()); | |||
| return project.resolveFilename (state [Ids::file].toString()); | |||
| else | |||
| return File::nonexistent; | |||
| } | |||
| void Project::Item::setFile (const File& file) | |||
| { | |||
| setFile (RelativePath (getProject().getRelativePathForFile (file), RelativePath::projectFolder)); | |||
| setFile (RelativePath (project.getRelativePathForFile (file), RelativePath::projectFolder)); | |||
| jassert (getFile() == file); | |||
| } | |||
| @@ -519,8 +501,8 @@ void Project::Item::setFile (const RelativePath& file) | |||
| { | |||
| jassert (file.getRoot() == RelativePath::projectFolder); | |||
| jassert (isFile()); | |||
| node.setProperty (Ids::file, file.toUnixStyle(), getUndoManager()); | |||
| node.setProperty (Ids::name, file.getFileName(), getUndoManager()); | |||
| state.setProperty (Ids::file, file.toUnixStyle(), getUndoManager()); | |||
| state.setProperty (Ids::name, file.getFileName(), getUndoManager()); | |||
| } | |||
| bool Project::Item::renameFile (const File& newFile) | |||
| @@ -539,7 +521,7 @@ bool Project::Item::renameFile (const File& newFile) | |||
| bool Project::Item::containsChildForFile (const RelativePath& file) const | |||
| { | |||
| return node.getChildWithProperty (Ids::file, file.toUnixStyle()).isValid(); | |||
| return state.getChildWithProperty (Ids::file, file.toUnixStyle()).isValid(); | |||
| } | |||
| Project::Item Project::Item::findItemForFile (const File& file) const | |||
| @@ -558,7 +540,7 @@ Project::Item Project::Item::findItemForFile (const File& file) const | |||
| } | |||
| } | |||
| return Item (getProject(), ValueTree::invalid); | |||
| return Item (project, ValueTree::invalid); | |||
| } | |||
| File Project::Item::determineGroupFolder() const | |||
| @@ -584,7 +566,7 @@ File Project::Item::determineGroupFolder() const | |||
| } | |||
| else | |||
| { | |||
| f = getProject().getFile().getParentDirectory(); | |||
| f = project.getFile().getParentDirectory(); | |||
| if (f.getChildFile ("Source").isDirectory()) | |||
| f = f.getChildFile ("Source"); | |||
| @@ -593,35 +575,35 @@ File Project::Item::determineGroupFolder() const | |||
| return f; | |||
| } | |||
| void Project::Item::initialiseNodeValues() | |||
| void Project::Item::initialiseMissingProperties() | |||
| { | |||
| if (! node.hasProperty (ComponentBuilder::idProperty)) | |||
| if (! state.hasProperty (ComponentBuilder::idProperty)) | |||
| setID (createAlphaNumericUID()); | |||
| if (isFile()) | |||
| { | |||
| node.setProperty (Ids::name, getFile().getFileName(), 0); | |||
| state.setProperty (Ids::name, getFile().getFileName(), 0); | |||
| } | |||
| else if (isGroup()) | |||
| { | |||
| for (int i = getNumChildren(); --i >= 0;) | |||
| getChild(i).initialiseNodeValues(); | |||
| getChild(i).initialiseMissingProperties(); | |||
| } | |||
| } | |||
| Value Project::Item::getName() const | |||
| { | |||
| return node.getPropertyAsValue (Ids::name, getUndoManager()); | |||
| return state.getPropertyAsValue (Ids::name, getUndoManager()); | |||
| } | |||
| void Project::Item::addChild (const Item& newChild, int insertIndex) | |||
| { | |||
| node.addChild (newChild.getNode(), insertIndex, getUndoManager()); | |||
| state.addChild (newChild.state, insertIndex, getUndoManager()); | |||
| } | |||
| void Project::Item::removeItemFromProject() | |||
| { | |||
| node.getParent().removeChild (node, getUndoManager()); | |||
| state.getParent().removeChild (state, getUndoManager()); | |||
| } | |||
| Project::Item Project::Item::getParent() const | |||
| @@ -629,7 +611,7 @@ Project::Item Project::Item::getParent() const | |||
| if (isMainGroup() || ! isGroup()) | |||
| return *this; | |||
| return Item (getProject(), node.getParent()); | |||
| return Item (project, state.getParent()); | |||
| } | |||
| struct ItemSorter | |||
| @@ -659,22 +641,22 @@ void Project::Item::sortAlphabetically (bool keepGroupsAtStart) | |||
| if (keepGroupsAtStart) | |||
| { | |||
| ItemSorterWithGroupsAtStart sorter; | |||
| node.sort (sorter, getUndoManager(), true); | |||
| state.sort (sorter, getUndoManager(), true); | |||
| } | |||
| else | |||
| { | |||
| ItemSorter sorter; | |||
| node.sort (sorter, getUndoManager(), true); | |||
| state.sort (sorter, getUndoManager(), true); | |||
| } | |||
| } | |||
| Project::Item Project::Item::getOrCreateSubGroup (const String& name) | |||
| { | |||
| for (int i = node.getNumChildren(); --i >= 0;) | |||
| for (int i = state.getNumChildren(); --i >= 0;) | |||
| { | |||
| const ValueTree child (node.getChild (i)); | |||
| const ValueTree child (state.getChild (i)); | |||
| if (child.getProperty (Ids::name) == name && child.hasType (Tags::group)) | |||
| return Item (getProject(), child); | |||
| return Item (project, child); | |||
| } | |||
| return addNewSubGroup (name, -1); | |||
| @@ -682,7 +664,7 @@ Project::Item Project::Item::getOrCreateSubGroup (const String& name) | |||
| Project::Item Project::Item::addNewSubGroup (const String& name, int insertIndex) | |||
| { | |||
| Item group (createGroup (getProject(), name, createGUID (getID() + name + String (getNumChildren())))); | |||
| Item group (createGroup (project, name, createGUID (getID() + name + String (getNumChildren())))); | |||
| jassert (canContain (group)); | |||
| addChild (group, insertIndex); | |||
| @@ -701,7 +683,7 @@ bool Project::Item::addFile (const File& file, int insertIndex, const bool shoul | |||
| DirectoryIterator iter (file, false, "*", File::findFilesAndDirectories); | |||
| while (iter.next()) | |||
| { | |||
| if (! getProject().getMainGroup().findItemForFile (iter.getFile()).isValid()) | |||
| if (! project.getMainGroup().findItemForFile (iter.getFile()).isValid()) | |||
| group.addFile (iter.getFile(), -1, shouldCompile); | |||
| } | |||
| @@ -709,7 +691,7 @@ bool Project::Item::addFile (const File& file, int insertIndex, const bool shoul | |||
| } | |||
| else if (file.existsAsFile()) | |||
| { | |||
| if (! getProject().getMainGroup().findItemForFile (file).isValid()) | |||
| if (! project.getMainGroup().findItemForFile (file).isValid()) | |||
| addFileUnchecked (file, insertIndex, shouldCompile); | |||
| } | |||
| else | |||
| @@ -722,11 +704,11 @@ bool Project::Item::addFile (const File& file, int insertIndex, const bool shoul | |||
| void Project::Item::addFileUnchecked (const File& file, int insertIndex, const bool shouldCompile) | |||
| { | |||
| Item item (getProject(), ValueTree (Tags::file)); | |||
| item.initialiseNodeValues(); | |||
| Item item (project, ValueTree (Tags::file)); | |||
| item.initialiseMissingProperties(); | |||
| item.getName() = file.getFileName(); | |||
| item.getShouldCompileValue() = shouldCompile && file.hasFileExtension ("cpp;mm;c;m;cc;cxx;r"); | |||
| item.getShouldAddToResourceValue() = getProject().shouldBeAddedToBinaryResourcesByDefault (file); | |||
| item.getShouldAddToResourceValue() = project.shouldBeAddedToBinaryResourcesByDefault (file); | |||
| if (canContain (item)) | |||
| { | |||
| @@ -737,11 +719,11 @@ void Project::Item::addFileUnchecked (const File& file, int insertIndex, const b | |||
| bool Project::Item::addRelativeFile (const RelativePath& file, int insertIndex, bool shouldCompile) | |||
| { | |||
| Item item (getProject(), ValueTree (Tags::file)); | |||
| item.initialiseNodeValues(); | |||
| Item item (project, ValueTree (Tags::file)); | |||
| item.initialiseMissingProperties(); | |||
| item.getName() = file.getFileName(); | |||
| item.getShouldCompileValue() = shouldCompile; | |||
| item.getShouldAddToResourceValue() = getProject().shouldBeAddedToBinaryResourcesByDefault (file); | |||
| item.getShouldAddToResourceValue() = project.shouldBeAddedToBinaryResourcesByDefault (file); | |||
| if (canContain (item)) | |||
| { | |||
| @@ -764,7 +746,7 @@ const Drawable* Project::Item::getIcon() const | |||
| } | |||
| else if (isMainGroup()) | |||
| { | |||
| return &(getProject().mainProjectIcon); | |||
| return &(project.mainProjectIcon); | |||
| } | |||
| return LookAndFeel::getDefaultLookAndFeel().getDefaultFolderImage(); | |||
| @@ -113,18 +113,13 @@ public: | |||
| //============================================================================== | |||
| Item (Project& project, const ValueTree& itemNode); | |||
| Item (const Item& other); | |||
| Item& operator= (const Item& other); | |||
| ~Item(); | |||
| static Item createGroup (Project& project, const String& name, const String& uid); | |||
| void initialiseNodeValues(); | |||
| void initialiseMissingProperties(); | |||
| //============================================================================== | |||
| bool isValid() const { return node.isValid(); } | |||
| const ValueTree& getNode() const noexcept { return node; } | |||
| ValueTree& getNode() noexcept { return node; } | |||
| Project& getProject() const noexcept { return *project; } | |||
| bool operator== (const Item& other) const { return node == other.node && project == other.project; } | |||
| bool isValid() const { return state.isValid(); } | |||
| bool operator== (const Item& other) const { return state == other.state && &project == &other.project; } | |||
| bool operator!= (const Item& other) const { return ! operator== (other); } | |||
| //============================================================================== | |||
| @@ -134,9 +129,11 @@ public: | |||
| bool isImageFile() const; | |||
| String getID() const; | |||
| void setID (const String& newID); | |||
| Item findItemWithID (const String& targetId) const; // (recursive search) | |||
| String getImageFileID() const; | |||
| void setID (const String& newID); | |||
| Image loadAsImageFile() const; | |||
| //============================================================================== | |||
| Value getName() const; | |||
| @@ -157,8 +154,8 @@ public: | |||
| //============================================================================== | |||
| bool canContain (const Item& child) const; | |||
| int getNumChildren() const { return node.getNumChildren(); } | |||
| Item getChild (int index) const { return Item (getProject(), node.getChild (index)); } | |||
| int getNumChildren() const { return state.getNumChildren(); } | |||
| Item getChild (int index) const { return Item (project, state.getChild (index)); } | |||
| Item addNewSubGroup (const String& name, int insertIndex); | |||
| Item getOrCreateSubGroup (const String& name); | |||
| @@ -174,14 +171,15 @@ public: | |||
| Item getParent() const; | |||
| Item createCopy(); | |||
| UndoManager* getUndoManager() const { return project.getUndoManagerFor (state); } | |||
| const Drawable* getIcon() const; | |||
| private: | |||
| //============================================================================== | |||
| Project* project; | |||
| ValueTree node; | |||
| Project& project; | |||
| ValueTree state; | |||
| UndoManager* getUndoManager() const { return getProject().getUndoManagerFor (node); } | |||
| private: | |||
| Item& operator= (const Item&); | |||
| }; | |||
| Item getMainGroup(); | |||
| @@ -125,8 +125,7 @@ void ProjectContentComponent::updateMissingFileStatuses() | |||
| bool ProjectContentComponent::showEditorForFile (const File& f) | |||
| { | |||
| return showDocument (OpenDocumentManager::getInstance() | |||
| ->getDocumentForFile (project, f)); | |||
| return showDocument (OpenDocumentManager::getInstance()->openFile (project, f)); | |||
| } | |||
| bool ProjectContentComponent::showDocument (OpenDocumentManager::Document* doc) | |||
| @@ -31,12 +31,12 @@ | |||
| ProjectTreeViewBase::ProjectTreeViewBase (const Project::Item& item_) | |||
| : item (item_), isFileMissing (false) | |||
| { | |||
| item.getNode().addListener (this); | |||
| item.state.addListener (this); | |||
| } | |||
| ProjectTreeViewBase::~ProjectTreeViewBase() | |||
| { | |||
| item.getNode().removeListener (this); | |||
| item.state.removeListener (this); | |||
| } | |||
| //============================================================================== | |||
| @@ -48,7 +48,7 @@ String ProjectTreeViewBase::getDisplayName() const | |||
| void ProjectTreeViewBase::setName (const String& newName) | |||
| { | |||
| if (item.isMainGroup()) | |||
| item.getProject().setTitle (newName); | |||
| item.project.setTitle (newName); | |||
| else | |||
| item.getName() = newName; | |||
| } | |||
| @@ -268,7 +268,7 @@ void ProjectTreeViewBase::moveItems (OwnedArray <Project::Item>& selectedNodes, | |||
| { | |||
| Project::Item* const n = selectedNodes.getUnchecked(i); | |||
| if (destNode == *n || destNode.getNode().isAChildOf (n->getNode())) // Check for recursion. | |||
| if (destNode == *n || destNode.state.isAChildOf (n->state)) // Check for recursion. | |||
| return; | |||
| if (! destNode.canContain (*n)) | |||
| @@ -282,7 +282,7 @@ void ProjectTreeViewBase::moveItems (OwnedArray <Project::Item>& selectedNodes, | |||
| for (int j = selectedNodes.size(); --j >= 0;) | |||
| { | |||
| if (j != i && n->getNode().isAChildOf (selectedNodes.getUnchecked(j)->getNode())) | |||
| if (j != i && n->state.isAChildOf (selectedNodes.getUnchecked(j)->state)) | |||
| { | |||
| selectedNodes.remove (i); | |||
| break; | |||
| @@ -295,8 +295,8 @@ void ProjectTreeViewBase::moveItems (OwnedArray <Project::Item>& selectedNodes, | |||
| { | |||
| Project::Item* selectedNode = selectedNodes.getUnchecked(i); | |||
| if (selectedNode->getNode().getParent() == destNode.getNode() | |||
| && indexOfNode (destNode.getNode(), selectedNode->getNode()) < insertIndex) | |||
| if (selectedNode->state.getParent() == destNode.state | |||
| && indexOfNode (destNode.state, selectedNode->state) < insertIndex) | |||
| --insertIndex; | |||
| selectedNode->removeItemFromProject(); | |||
| @@ -367,7 +367,7 @@ void ProjectTreeViewBase::itemDropped (const DragAndDropTarget::SourceDetails& d | |||
| //============================================================================== | |||
| void ProjectTreeViewBase::treeChildrenChanged (const ValueTree& parentTree) | |||
| { | |||
| if (parentTree == item.getNode()) | |||
| if (parentTree == item.state) | |||
| { | |||
| refreshSubItems(); | |||
| treeHasChanged(); | |||
| @@ -377,7 +377,7 @@ void ProjectTreeViewBase::treeChildrenChanged (const ValueTree& parentTree) | |||
| void ProjectTreeViewBase::valueTreePropertyChanged (ValueTree& tree, const Identifier& property) | |||
| { | |||
| if (tree == item.getNode()) | |||
| if (tree == item.state) | |||
| repaintItem(); | |||
| } | |||
| @@ -102,7 +102,7 @@ void GroupTreeViewItem::showDocument() | |||
| if (pcc != nullptr) | |||
| { | |||
| if (isRoot()) | |||
| pcc->setEditorComponent (new ProjectInformationComponent (item.getProject()), 0); | |||
| pcc->setEditorComponent (new ProjectInformationComponent (item.project), 0); | |||
| else | |||
| pcc->setEditorComponent (new GroupInformationComponent (item), 0); | |||
| } | |||
| @@ -194,7 +194,7 @@ void SourceFileTreeViewItem::setName (const String& newName) | |||
| if (correspondingFile.exists() && newFile.hasFileExtension (oldFile.getFileExtension())) | |||
| { | |||
| Project::Item correspondingItem (item.getProject().getMainGroup().findItemForFile (correspondingFile)); | |||
| Project::Item correspondingItem (item.project.getMainGroup().findItemForFile (correspondingFile)); | |||
| if (correspondingItem.isValid()) | |||
| { | |||
| @@ -158,12 +158,12 @@ void CallOutBox::updatePosition (const Rectangle<int>& newAreaToPointTo, const R | |||
| const float arrowIndent = borderSpace - arrowSize; | |||
| Point<float> targets[4] = { Point<float> ((float) targetArea.getCentreX(), (float) targetArea.getBottom()), | |||
| Point<float> ((float) targetArea.getRight(), (float) targetArea.getCentreY()), | |||
| Point<float> ((float) targetArea.getX(), (float) targetArea.getCentreY()), | |||
| Point<float> ((float) targetArea.getRight(), (float) targetArea.getCentreY()), | |||
| Point<float> ((float) targetArea.getX(), (float) targetArea.getCentreY()), | |||
| Point<float> ((float) targetArea.getCentreX(), (float) targetArea.getY()) }; | |||
| Line<float> lines[4] = { Line<float> (targets[0].translated (-hwReduced, hh - arrowIndent), targets[0].translated (hwReduced, hh - arrowIndent)), | |||
| Line<float> (targets[1].translated (hw - arrowIndent, -hhReduced), targets[1].translated (hw - arrowIndent, hhReduced)), | |||
| Line<float> lines[4] = { Line<float> (targets[0].translated (-hwReduced, hh - arrowIndent), targets[0].translated (hwReduced, hh - arrowIndent)), | |||
| Line<float> (targets[1].translated (hw - arrowIndent, -hhReduced), targets[1].translated (hw - arrowIndent, hhReduced)), | |||
| Line<float> (targets[2].translated (-(hw - arrowIndent), -hhReduced), targets[2].translated (-(hw - arrowIndent), hhReduced)), | |||
| Line<float> (targets[3].translated (-hwReduced, -(hh - arrowIndent)), targets[3].translated (hwReduced, -(hh - arrowIndent))) }; | |||
| @@ -205,50 +205,60 @@ void CallOutBox::refreshPath() | |||
| const float cornerSize = 9.0f; | |||
| const float cornerSize2 = 2.0f * cornerSize; | |||
| const float arrowBaseWidth = arrowSize * 0.7f; | |||
| const float left = content.getX() - gap, top = content.getY() - gap, right = content.getRight() + gap, bottom = content.getBottom() + gap; | |||
| const float targetX = targetPoint.getX() - getX(), targetY = targetPoint.getY() - getY(); | |||
| outline.startNewSubPath (left + cornerSize, top); | |||
| const Rectangle<float> area (content.getBounds().toFloat().expanded (gap, gap)); | |||
| const Point<float> target (targetPoint - getPosition().toFloat()); | |||
| if (targetY <= top) | |||
| outline.startNewSubPath (area.getX() + cornerSize, area.getY()); | |||
| const float targetLimitX = area.getX() + cornerSize + arrowBaseWidth; | |||
| const float targetLimitW = area.getWidth() - cornerSize2 - arrowBaseWidth * 2.0f; | |||
| const float targetLimitY = area.getY() + cornerSize + arrowBaseWidth; | |||
| const float targetLimitH = area.getHeight() - cornerSize2 - arrowBaseWidth * 2.0f; | |||
| if (Rectangle<float> (targetLimitX, 1.0f, | |||
| targetLimitW, area.getY() - 2.0f).contains (target)) | |||
| { | |||
| outline.lineTo (targetX - arrowBaseWidth, top); | |||
| outline.lineTo (targetX, targetY); | |||
| outline.lineTo (targetX + arrowBaseWidth, top); | |||
| outline.lineTo (target.x - arrowBaseWidth, area.getY()); | |||
| outline.lineTo (target.x, target.y); | |||
| outline.lineTo (target.x + arrowBaseWidth, area.getY()); | |||
| } | |||
| outline.lineTo (right - cornerSize, top); | |||
| outline.addArc (right - cornerSize2, top, cornerSize2, cornerSize2, 0, float_Pi * 0.5f); | |||
| outline.lineTo (area.getRight() - cornerSize, area.getY()); | |||
| outline.addArc (area.getRight() - cornerSize2, area.getY(), cornerSize2, cornerSize2, 0, float_Pi * 0.5f); | |||
| if (targetX >= right) | |||
| if (Rectangle<float> (area.getRight() + 1.0f, targetLimitY, | |||
| getWidth() - area.getRight() - 2.0f, targetLimitH).contains (target)) | |||
| { | |||
| outline.lineTo (right, targetY - arrowBaseWidth); | |||
| outline.lineTo (targetX, targetY); | |||
| outline.lineTo (right, targetY + arrowBaseWidth); | |||
| outline.lineTo (area.getRight(), target.y - arrowBaseWidth); | |||
| outline.lineTo (target.x, target.y); | |||
| outline.lineTo (area.getRight(), target.y + arrowBaseWidth); | |||
| } | |||
| outline.lineTo (right, bottom - cornerSize); | |||
| outline.addArc (right - cornerSize2, bottom - cornerSize2, cornerSize2, cornerSize2, float_Pi * 0.5f, float_Pi); | |||
| outline.lineTo (area.getRight(), area.getBottom() - cornerSize); | |||
| outline.addArc (area.getRight() - cornerSize2, area.getBottom() - cornerSize2, cornerSize2, cornerSize2, float_Pi * 0.5f, float_Pi); | |||
| if (targetY >= bottom) | |||
| if (Rectangle<float> (targetLimitX, area.getBottom() + 1.0f, | |||
| targetLimitW, getHeight() - area.getBottom() - 2.0f).contains (target)) | |||
| { | |||
| outline.lineTo (targetX + arrowBaseWidth, bottom); | |||
| outline.lineTo (targetX, targetY); | |||
| outline.lineTo (targetX - arrowBaseWidth, bottom); | |||
| outline.lineTo (target.x + arrowBaseWidth, area.getBottom()); | |||
| outline.lineTo (target.x, target.y); | |||
| outline.lineTo (target.x - arrowBaseWidth, area.getBottom()); | |||
| } | |||
| outline.lineTo (left + cornerSize, bottom); | |||
| outline.addArc (left, bottom - cornerSize2, cornerSize2, cornerSize2, float_Pi, float_Pi * 1.5f); | |||
| outline.lineTo (area.getX() + cornerSize, area.getBottom()); | |||
| outline.addArc (area.getX(), area.getBottom() - cornerSize2, cornerSize2, cornerSize2, float_Pi, float_Pi * 1.5f); | |||
| if (targetX <= left) | |||
| if (Rectangle<float> (1.0f, targetLimitY, area.getX() - 2.0f, targetLimitH).contains (target)) | |||
| { | |||
| outline.lineTo (left, targetY + arrowBaseWidth); | |||
| outline.lineTo (targetX, targetY); | |||
| outline.lineTo (left, targetY - arrowBaseWidth); | |||
| outline.lineTo (area.getX(), target.y + arrowBaseWidth); | |||
| outline.lineTo (target.x, target.y); | |||
| outline.lineTo (area.getX(), target.y - arrowBaseWidth); | |||
| } | |||
| outline.lineTo (left, top + cornerSize); | |||
| outline.addArc (left, top, cornerSize2, cornerSize2, float_Pi * 1.5f, float_Pi * 2.0f - 0.05f); | |||
| outline.lineTo (area.getX(), area.getY() + cornerSize); | |||
| outline.addArc (area.getX(), area.getY(), cornerSize2, cornerSize2, float_Pi * 1.5f, float_Pi * 2.0f - 0.05f); | |||
| outline.closeSubPath(); | |||
| } | |||