/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2015 - ROLI 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 SourceFileItem : public ProjectTreeItemBase { public: SourceFileItem (const Project::Item& projectItem) : ProjectTreeItemBase (projectItem) { } bool acceptsFileDrop (const StringArray&) const override { return false; } bool acceptsDragItems (const OwnedArray &) override { return false; } String getDisplayName() const override { return getFile().getFileName(); } static File findCorrespondingHeaderOrCpp (const File& f) { if (f.hasFileExtension (sourceFileExtensions)) return f.withFileExtension (".h"); if (f.hasFileExtension (headerFileExtensions)) return f.withFileExtension (".cpp"); return File(); } void setName (const String& newName) override { if (newName != File::createLegalFileName (newName)) { AlertWindow::showMessageBox (AlertWindow::WarningIcon, "File Rename", "That filename contained some illegal characters!"); triggerAsyncRename (item); return; } File oldFile (getFile()); File newFile (oldFile.getSiblingFile (newName)); File correspondingFile (findCorrespondingHeaderOrCpp (oldFile)); if (correspondingFile.exists() && newFile.hasFileExtension (oldFile.getFileExtension())) { Project::Item correspondingItem (item.project.getMainGroup().findItemForFile (correspondingFile)); if (correspondingItem.isValid()) { if (AlertWindow::showOkCancelBox (AlertWindow::NoIcon, "File Rename", "Do you also want to rename the corresponding file \"" + correspondingFile.getFileName() + "\" to match?")) { if (! item.renameFile (newFile)) { AlertWindow::showMessageBox (AlertWindow::WarningIcon, "File Rename", "Failed to rename \"" + oldFile.getFullPathName() + "\"!\n\nCheck your file permissions!"); return; } if (! correspondingItem.renameFile (newFile.withFileExtension (correspondingFile.getFileExtension()))) { AlertWindow::showMessageBox (AlertWindow::WarningIcon, "File Rename", "Failed to rename \"" + correspondingFile.getFullPathName() + "\"!\n\nCheck your file permissions!"); } } } } if (! item.renameFile (newFile)) { AlertWindow::showMessageBox (AlertWindow::WarningIcon, "File Rename", "Failed to rename the file!\n\nCheck your file permissions!"); } } ProjectTreeItemBase* createSubItem (const Project::Item&) override { jassertfalse; return nullptr; } void showDocument() override { const File f (getFile()); if (f.exists()) if (ProjectContentComponent* pcc = getProjectContentComponent()) pcc->showEditorForFile (f, false); } void showPopupMenu() override { PopupMenu m; if (GroupItem* parentGroup = dynamic_cast (getParentProjectItem())) { parentGroup->addCreateFileMenuItems (m); m.addSeparator(); } m.addItem (1, "Open in external editor"); m.addItem (2, #if JUCE_MAC "Reveal in Finder"); #else "Reveal in Explorer"); #endif m.addItem (4, "Rename File..."); m.addSeparator(); m.addItem (3, "Delete"); launchPopupMenu (m); } void handlePopupMenuResult (int resultCode) override { switch (resultCode) { case 1: getFile().startAsProcess(); break; case 2: revealInFinder(); break; case 3: deleteAllSelectedItems(); break; case 4: triggerAsyncRename (item); break; default: if (GroupItem* parentGroup = dynamic_cast (getParentProjectItem())) parentGroup->processCreateFileMenuItem (resultCode); break; } } };