/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2013 - Raw Material Software Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) b) the Affero GPL v3 Details of these licenses can be found at: www.gnu.org/licenses JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.juce.com for more information. ============================================================================== */ class GroupItem : public ProjectTreeItemBase { public: GroupItem (const Project::Item& projectItem) : ProjectTreeItemBase (projectItem) { } bool isRoot() const override { return item.isMainGroup(); } bool acceptsFileDrop (const StringArray&) const override { return true; } void addNewGroup() { Project::Item newGroup (item.addNewSubGroup ("New Group", 0)); triggerAsyncRename (newGroup); } bool acceptsDragItems (const OwnedArray& selectedNodes) override { for (int i = selectedNodes.size(); --i >= 0;) if (item.canContain (*selectedNodes.getUnchecked(i))) return true; return false; } void addFiles (const StringArray& files, int insertIndex) override { for (int i = 0; i < files.size(); ++i) { const File file (files[i]); if (item.addFile (file, insertIndex, true)) ++insertIndex; } } void moveSelectedItemsTo (OwnedArray& selectedNodes, int insertIndex) override { moveItems (selectedNodes, item, insertIndex); } void checkFileStatus() override { for (int i = 0; i < getNumSubItems(); ++i) if (ProjectTreeItemBase* p = dynamic_cast (getSubItem(i))) p->checkFileStatus(); } ProjectTreeItemBase* createSubItem (const Project::Item& child) override { if (child.isGroup()) return new GroupItem (child); if (child.isFile()) return new SourceFileItem (child); jassertfalse; return nullptr; } void showDocument() override { if (ProjectContentComponent* pcc = getProjectContentComponent()) pcc->setEditorComponent (new GroupInformationComponent (item), nullptr); } static void openOrCloseAllSubGroups (TreeViewItem& item, bool shouldOpen) { item.setOpen (shouldOpen); for (int i = item.getNumSubItems(); --i >= 0;) if (TreeViewItem* sub = item.getSubItem(i)) openOrCloseAllSubGroups (*sub, shouldOpen); } static void setFilesToCompile (Project::Item item, const bool shouldCompile) { if (item.isFile()) item.getShouldCompileValue() = shouldCompile; for (int i = item.getNumChildren(); --i >= 0;) setFilesToCompile (item.getChild (i), shouldCompile); } void showPopupMenu() override { PopupMenu m; addCreateFileMenuItems (m); m.addSeparator(); if (isOpen()) m.addItem (1, "Collapse all Sub-groups"); else m.addItem (2, "Expand all Sub-groups"); m.addSeparator(); m.addItem (3, "Enable compiling of all enclosed files"); m.addItem (4, "Disable compiling of all enclosed files"); m.addSeparator(); m.addItem (5, "Sort Items Alphabetically"); m.addItem (6, "Sort Items Alphabetically (Groups first)"); m.addSeparator(); m.addItem (7, "Rename..."); if (! isRoot()) m.addItem (8, "Delete"); launchPopupMenu (m); } void handlePopupMenuResult (int resultCode) override { switch (resultCode) { case 1: openOrCloseAllSubGroups (*this, false); break; case 2: openOrCloseAllSubGroups (*this, true); break; case 3: setFilesToCompile (item, true); break; case 4: setFilesToCompile (item, false); break; case 5: item.sortAlphabetically (false); break; case 6: item.sortAlphabetically (true); break; case 7: triggerAsyncRename (item); break; case 8: deleteAllSelectedItems(); break; default: processCreateFileMenuItem (resultCode); break; } } void addCreateFileMenuItems (PopupMenu& m) { m.addItem (1001, "Add New Group"); m.addItem (1002, "Add Existing Files..."); m.addSeparator(); NewFileWizard().addWizardsToMenu (m); } void processCreateFileMenuItem (int menuID) { switch (menuID) { case 1001: addNewGroup(); break; case 1002: browseToAddExistingFiles(); break; default: NewFileWizard().runWizardFromMenu (menuID, item); break; } } };