diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h index c8fba4809c..1ab03bd833 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h @@ -405,8 +405,8 @@ private: { Array files; - for (int i = 0; i < groups.size(); ++i) - findAllFilesToCompile (groups.getReference(i), files); + for (int i = 0; i < getAllGroups().size(); ++i) + findAllFilesToCompile (getAllGroups().getReference(i), files); MemoryOutputStream mo; writeAndroidMk (mo, files); diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h index 4355706997..c51d70465a 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h @@ -555,9 +555,9 @@ public: if (hasResourceFile()) { - for (int i = 0; i < groups.size(); ++i) + for (int i = 0; i < getAllGroups().size(); ++i) { - Project::Item& group = groups.getReference(i); + Project::Item& group = getAllGroups().getReference(i); if (group.getID() == ProjectSaver::getGeneratedGroupID()) { @@ -672,9 +672,13 @@ protected: void createFiles (XmlElement& files) const { - for (int i = 0; i < groups.size(); ++i) - if (groups.getReference(i).getNumChildren() > 0) - addFiles (groups.getReference(i), files); + for (int i = 0; i < getAllGroups().size(); ++i) + { + const Project::Item& group = getAllGroups().getReference(i); + + if (group.getNumChildren() > 0) + addFiles (group, files); + } } //============================================================================== @@ -1242,9 +1246,13 @@ protected: XmlElement* cppFiles = projectXml.createNewChildElement ("ItemGroup"); XmlElement* headerFiles = projectXml.createNewChildElement ("ItemGroup"); - for (int i = 0; i < groups.size(); ++i) - if (groups.getReference(i).getNumChildren() > 0) - addFilesToCompile (groups.getReference(i), *cppFiles, *headerFiles, *otherFilesGroup); + for (int i = 0; i < getAllGroups().size(); ++i) + { + const Project::Item& group = getAllGroups().getReference(i); + + if (group.getNumChildren() > 0) + addFilesToCompile (group, *cppFiles, *headerFiles, *otherFilesGroup); + } } if (iconFile != File::nonexistent) @@ -1386,10 +1394,13 @@ protected: XmlElement* headers = filterXml.createNewChildElement ("ItemGroup"); ScopedPointer otherFilesGroup (new XmlElement ("ItemGroup")); - for (int i = 0; i < groups.size(); ++i) - if (groups.getReference(i).getNumChildren() > 0) - addFilesToFilter (groups.getReference(i), groups.getReference(i).getName(), - *cpps, *headers, *otherFilesGroup, *groupsXml); + for (int i = 0; i < getAllGroups().size(); ++i) + { + const Project::Item& group = getAllGroups().getReference(i); + + if (group.getNumChildren() > 0) + addFilesToFilter (group, group.getName(), *cpps, *headers, *otherFilesGroup, *groupsXml); + } if (iconFile.exists()) { diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h index d1d828c358..94e2d11179 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Make.h @@ -85,8 +85,8 @@ public: void create (const OwnedArray&) const { Array files; - for (int i = 0; i < groups.size(); ++i) - findAllFilesToCompile (groups.getReference(i), files); + for (int i = 0; i < getAllGroups().size(); ++i) + findAllFilesToCompile (getAllGroups().getReference(i), files); MemoryOutputStream mo; writeMakefile (mo, files); diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h index 4978ab567e..f81e663823 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h @@ -311,9 +311,13 @@ private: { StringArray topLevelGroupIDs; - for (int i = 0; i < groups.size(); ++i) - if (groups.getReference(i).getNumChildren() > 0) - topLevelGroupIDs.add (addProjectItem (groups.getReference(i))); + for (int i = 0; i < getAllGroups().size(); ++i) + { + const Project::Item& group = getAllGroups().getReference(i); + + if (group.getNumChildren() > 0) + topLevelGroupIDs.add (addProjectItem (group)); + } { // Add 'resources' group String resourcesGroupID (createID ("__resources")); diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp index d0fd771fd0..7203adddbb 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp @@ -123,6 +123,34 @@ ProjectExporter* ProjectExporter::createPlatformDefaultExporter (Project& projec return best.release(); } +bool ProjectExporter::canProjectBeLaunched (Project* project) +{ + if (project != nullptr) + { + const char* types[] = + { + #if JUCE_MAC + XCodeProjectExporter::getValueTreeTypeName (false), + XCodeProjectExporter::getValueTreeTypeName (true), + #elif JUCE_WINDOWS + MSVCProjectExporterVC2005::getValueTreeTypeName(), + MSVCProjectExporterVC2008::getValueTreeTypeName(), + MSVCProjectExporterVC2010::getValueTreeTypeName(), + #elif JUCE_LINUX + MakefileProjectExporter::getValueTreeTypeName(), + #endif + + nullptr + }; + + for (const char** type = types; *type != nullptr; ++type) + if (project->getExporters().getChildWithName (*type).isValid()) + return true; + } + + return false; +} + //============================================================================== ProjectExporter::ProjectExporter (Project& project_, const ValueTree& settings_) : xcodeIsBundle (false), @@ -139,7 +167,6 @@ ProjectExporter::ProjectExporter (Project& project_, const ValueTree& settings_) projectFolder (project_.getFile().getParentDirectory()), modulesGroup (nullptr) { - groups.add (project.getMainGroup().createCopy()); } ProjectExporter::~ProjectExporter() @@ -264,12 +291,19 @@ String ProjectExporter::replacePreprocessorTokens (const ProjectExporter::BuildC return replacePreprocessorDefs (getAllPreprocessorDefs (config), sourceString); } +void ProjectExporter::copyMainGroupFromProject() +{ + jassert (itemGroups.size() == 0); + itemGroups.add (project.getMainGroup().createCopy()); +} + Project::Item& ProjectExporter::getModulesGroup() { if (modulesGroup == nullptr) { - groups.add (Project::Item::createGroup (project, "Juce Modules", "__modulesgroup__")); - modulesGroup = &(groups.getReference (groups.size() - 1)); + jassert (itemGroups.size() > 0); // must call copyMainGroupFromProject before this. + itemGroups.add (Project::Item::createGroup (project, "Juce Modules", "__modulesgroup__")); + modulesGroup = &(itemGroups.getReference (itemGroups.size() - 1)); } return *modulesGroup; diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h index 26ecb039e5..1020ab9f3e 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h @@ -44,6 +44,7 @@ public: static ProjectExporter* createNewExporter (Project&, const String& name); static ProjectExporter* createExporter (Project&, const ValueTree& settings); static ProjectExporter* createPlatformDefaultExporter (Project&); + static bool canProjectBeLaunched (Project*); static String getCurrentPlatformExporterName(); @@ -123,7 +124,9 @@ public: RelativePath getJucePathFromProjectFolder() const; //============================================================================== - Array groups; + void copyMainGroupFromProject(); + Array& getAllGroups() noexcept { jassert (itemGroups.size() > 0); return itemGroups; } + const Array& getAllGroups() const noexcept { jassert (itemGroups.size() > 0); return itemGroups; } Project::Item& getModulesGroup(); //============================================================================== @@ -275,6 +278,9 @@ protected: const ProjectType& projectType; const String projectName; const File projectFolder; + + mutable Array itemGroups; + void initItemGroups() const; Project::Item* modulesGroup; virtual BuildConfiguration::Ptr createBuildConfig (const ValueTree&) const = 0; diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h index 1850b44cd0..e851593027 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h @@ -502,6 +502,7 @@ private: { if (exporter->getTargetFolder().createDirectory()) { + exporter->copyMainGroupFromProject(); exporter->settings = exporter->settings.createCopy(); exporter->addToExtraSearchPaths (RelativePath ("JuceLibraryCode", RelativePath::projectFolder)); @@ -513,7 +514,7 @@ private: modules.getUnchecked(j)->prepareExporter (*exporter, *this); sortGroupRecursively (generatedFilesGroup); - exporter->groups.add (generatedFilesGroup); + exporter->getAllGroups().add (generatedFilesGroup); threadPool.addJob (new ExporterJob (*this, exporter.exporter.release(), modules), true); } diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp index f0b55deb49..15a2359931 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp @@ -402,17 +402,6 @@ void ProjectContentComponent::updateMainWindowTitle() mw->updateTitle (currentDocument != nullptr ? currentDocument->getName() : String::empty); } -bool ProjectContentComponent::canProjectBeLaunched() const -{ - if (project != nullptr) - { - ScopedPointer launcher (ProjectExporter::createPlatformDefaultExporter (*project)); - return launcher != nullptr; - } - - return false; -} - ApplicationCommandTarget* ProjectContentComponent::getNextCommandTarget() { return findFirstTargetParentComponent(); @@ -507,7 +496,7 @@ void ProjectContentComponent::getCommandInfo (const CommandID commandID, Applica #endif "Launches the project in an external IDE", CommandCategories::general, 0); - result.setActive (canProjectBeLaunched()); + result.setActive (ProjectExporter::canProjectBeLaunched (project)); break; case CommandIDs::saveAndOpenInIDE: @@ -520,7 +509,7 @@ void ProjectContentComponent::getCommandInfo (const CommandID commandID, Applica #endif "Saves the project and launches it in an external IDE", CommandCategories::general, 0); - result.setActive (canProjectBeLaunched()); + result.setActive (ProjectExporter::canProjectBeLaunched (project)); result.defaultKeypresses.add (KeyPress ('l', ModifierKeys::commandModifier, 0)); break; diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h index 62e6d615b7..91c136f2e6 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h +++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h @@ -98,7 +98,6 @@ protected: void changeListenerCallback (ChangeBroadcaster*); void updateMainWindowTitle(); bool reinvokeCommandAfterClosingPropertyEditors (const InvocationInfo&); - bool canProjectBeLaunched() const; TreeView* getFilesTreeView() const; ProjectTreeViewBase* getFilesTreeRoot() const;