|
- /*
- ==============================================================================
-
- 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<Project::Item>& 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<Project::Item>& selectedNodes, int insertIndex) override
- {
- moveItems (selectedNodes, item, insertIndex);
- }
-
- void checkFileStatus() override
- {
- for (int i = 0; i < getNumSubItems(); ++i)
- if (ProjectTreeItemBase* p = dynamic_cast<ProjectTreeItemBase*> (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;
- }
- }
- };
|