| @@ -405,8 +405,8 @@ private: | |||
| { | |||
| Array<RelativePath> 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); | |||
| @@ -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<XmlElement> 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()) | |||
| { | |||
| @@ -85,8 +85,8 @@ public: | |||
| void create (const OwnedArray<LibraryModule>&) const | |||
| { | |||
| Array<RelativePath> 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); | |||
| @@ -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")); | |||
| @@ -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; | |||
| @@ -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<Project::Item> groups; | |||
| void copyMainGroupFromProject(); | |||
| Array<Project::Item>& getAllGroups() noexcept { jassert (itemGroups.size() > 0); return itemGroups; } | |||
| const Array<Project::Item>& 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<Project::Item> itemGroups; | |||
| void initItemGroups() const; | |||
| Project::Item* modulesGroup; | |||
| virtual BuildConfiguration::Ptr createBuildConfig (const ValueTree&) const = 0; | |||
| @@ -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); | |||
| } | |||
| @@ -402,17 +402,6 @@ void ProjectContentComponent::updateMainWindowTitle() | |||
| mw->updateTitle (currentDocument != nullptr ? currentDocument->getName() : String::empty); | |||
| } | |||
| bool ProjectContentComponent::canProjectBeLaunched() const | |||
| { | |||
| if (project != nullptr) | |||
| { | |||
| ScopedPointer <ProjectExporter> 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; | |||
| @@ -98,7 +98,6 @@ protected: | |||
| void changeListenerCallback (ChangeBroadcaster*); | |||
| void updateMainWindowTitle(); | |||
| bool reinvokeCommandAfterClosingPropertyEditors (const InvocationInfo&); | |||
| bool canProjectBeLaunched() const; | |||
| TreeView* getFilesTreeView() const; | |||
| ProjectTreeViewBase* getFilesTreeRoot() const; | |||