| @@ -405,8 +405,8 @@ private: | |||||
| { | { | ||||
| Array<RelativePath> files; | 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; | MemoryOutputStream mo; | ||||
| writeAndroidMk (mo, files); | writeAndroidMk (mo, files); | ||||
| @@ -555,9 +555,9 @@ public: | |||||
| if (hasResourceFile()) | 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()) | if (group.getID() == ProjectSaver::getGeneratedGroupID()) | ||||
| { | { | ||||
| @@ -672,9 +672,13 @@ protected: | |||||
| void createFiles (XmlElement& files) const | 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* cppFiles = projectXml.createNewChildElement ("ItemGroup"); | ||||
| XmlElement* headerFiles = 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) | if (iconFile != File::nonexistent) | ||||
| @@ -1386,10 +1394,13 @@ protected: | |||||
| XmlElement* headers = filterXml.createNewChildElement ("ItemGroup"); | XmlElement* headers = filterXml.createNewChildElement ("ItemGroup"); | ||||
| ScopedPointer<XmlElement> otherFilesGroup (new XmlElement ("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()) | if (iconFile.exists()) | ||||
| { | { | ||||
| @@ -85,8 +85,8 @@ public: | |||||
| void create (const OwnedArray<LibraryModule>&) const | void create (const OwnedArray<LibraryModule>&) const | ||||
| { | { | ||||
| Array<RelativePath> files; | 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; | MemoryOutputStream mo; | ||||
| writeMakefile (mo, files); | writeMakefile (mo, files); | ||||
| @@ -311,9 +311,13 @@ private: | |||||
| { | { | ||||
| StringArray topLevelGroupIDs; | 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 | { // Add 'resources' group | ||||
| String resourcesGroupID (createID ("__resources")); | String resourcesGroupID (createID ("__resources")); | ||||
| @@ -123,6 +123,34 @@ ProjectExporter* ProjectExporter::createPlatformDefaultExporter (Project& projec | |||||
| return best.release(); | 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_) | ProjectExporter::ProjectExporter (Project& project_, const ValueTree& settings_) | ||||
| : xcodeIsBundle (false), | : xcodeIsBundle (false), | ||||
| @@ -139,7 +167,6 @@ ProjectExporter::ProjectExporter (Project& project_, const ValueTree& settings_) | |||||
| projectFolder (project_.getFile().getParentDirectory()), | projectFolder (project_.getFile().getParentDirectory()), | ||||
| modulesGroup (nullptr) | modulesGroup (nullptr) | ||||
| { | { | ||||
| groups.add (project.getMainGroup().createCopy()); | |||||
| } | } | ||||
| ProjectExporter::~ProjectExporter() | ProjectExporter::~ProjectExporter() | ||||
| @@ -264,12 +291,19 @@ String ProjectExporter::replacePreprocessorTokens (const ProjectExporter::BuildC | |||||
| return replacePreprocessorDefs (getAllPreprocessorDefs (config), sourceString); | return replacePreprocessorDefs (getAllPreprocessorDefs (config), sourceString); | ||||
| } | } | ||||
| void ProjectExporter::copyMainGroupFromProject() | |||||
| { | |||||
| jassert (itemGroups.size() == 0); | |||||
| itemGroups.add (project.getMainGroup().createCopy()); | |||||
| } | |||||
| Project::Item& ProjectExporter::getModulesGroup() | Project::Item& ProjectExporter::getModulesGroup() | ||||
| { | { | ||||
| if (modulesGroup == nullptr) | 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; | return *modulesGroup; | ||||
| @@ -44,6 +44,7 @@ public: | |||||
| static ProjectExporter* createNewExporter (Project&, const String& name); | static ProjectExporter* createNewExporter (Project&, const String& name); | ||||
| static ProjectExporter* createExporter (Project&, const ValueTree& settings); | static ProjectExporter* createExporter (Project&, const ValueTree& settings); | ||||
| static ProjectExporter* createPlatformDefaultExporter (Project&); | static ProjectExporter* createPlatformDefaultExporter (Project&); | ||||
| static bool canProjectBeLaunched (Project*); | |||||
| static String getCurrentPlatformExporterName(); | static String getCurrentPlatformExporterName(); | ||||
| @@ -123,7 +124,9 @@ public: | |||||
| RelativePath getJucePathFromProjectFolder() const; | 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(); | Project::Item& getModulesGroup(); | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -275,6 +278,9 @@ protected: | |||||
| const ProjectType& projectType; | const ProjectType& projectType; | ||||
| const String projectName; | const String projectName; | ||||
| const File projectFolder; | const File projectFolder; | ||||
| mutable Array<Project::Item> itemGroups; | |||||
| void initItemGroups() const; | |||||
| Project::Item* modulesGroup; | Project::Item* modulesGroup; | ||||
| virtual BuildConfiguration::Ptr createBuildConfig (const ValueTree&) const = 0; | virtual BuildConfiguration::Ptr createBuildConfig (const ValueTree&) const = 0; | ||||
| @@ -502,6 +502,7 @@ private: | |||||
| { | { | ||||
| if (exporter->getTargetFolder().createDirectory()) | if (exporter->getTargetFolder().createDirectory()) | ||||
| { | { | ||||
| exporter->copyMainGroupFromProject(); | |||||
| exporter->settings = exporter->settings.createCopy(); | exporter->settings = exporter->settings.createCopy(); | ||||
| exporter->addToExtraSearchPaths (RelativePath ("JuceLibraryCode", RelativePath::projectFolder)); | exporter->addToExtraSearchPaths (RelativePath ("JuceLibraryCode", RelativePath::projectFolder)); | ||||
| @@ -513,7 +514,7 @@ private: | |||||
| modules.getUnchecked(j)->prepareExporter (*exporter, *this); | modules.getUnchecked(j)->prepareExporter (*exporter, *this); | ||||
| sortGroupRecursively (generatedFilesGroup); | sortGroupRecursively (generatedFilesGroup); | ||||
| exporter->groups.add (generatedFilesGroup); | |||||
| exporter->getAllGroups().add (generatedFilesGroup); | |||||
| threadPool.addJob (new ExporterJob (*this, exporter.exporter.release(), modules), true); | 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); | 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() | ApplicationCommandTarget* ProjectContentComponent::getNextCommandTarget() | ||||
| { | { | ||||
| return findFirstTargetParentComponent(); | return findFirstTargetParentComponent(); | ||||
| @@ -507,7 +496,7 @@ void ProjectContentComponent::getCommandInfo (const CommandID commandID, Applica | |||||
| #endif | #endif | ||||
| "Launches the project in an external IDE", | "Launches the project in an external IDE", | ||||
| CommandCategories::general, 0); | CommandCategories::general, 0); | ||||
| result.setActive (canProjectBeLaunched()); | |||||
| result.setActive (ProjectExporter::canProjectBeLaunched (project)); | |||||
| break; | break; | ||||
| case CommandIDs::saveAndOpenInIDE: | case CommandIDs::saveAndOpenInIDE: | ||||
| @@ -520,7 +509,7 @@ void ProjectContentComponent::getCommandInfo (const CommandID commandID, Applica | |||||
| #endif | #endif | ||||
| "Saves the project and launches it in an external IDE", | "Saves the project and launches it in an external IDE", | ||||
| CommandCategories::general, 0); | CommandCategories::general, 0); | ||||
| result.setActive (canProjectBeLaunched()); | |||||
| result.setActive (ProjectExporter::canProjectBeLaunched (project)); | |||||
| result.defaultKeypresses.add (KeyPress ('l', ModifierKeys::commandModifier, 0)); | result.defaultKeypresses.add (KeyPress ('l', ModifierKeys::commandModifier, 0)); | ||||
| break; | break; | ||||
| @@ -98,7 +98,6 @@ protected: | |||||
| void changeListenerCallback (ChangeBroadcaster*); | void changeListenerCallback (ChangeBroadcaster*); | ||||
| void updateMainWindowTitle(); | void updateMainWindowTitle(); | ||||
| bool reinvokeCommandAfterClosingPropertyEditors (const InvocationInfo&); | bool reinvokeCommandAfterClosingPropertyEditors (const InvocationInfo&); | ||||
| bool canProjectBeLaunched() const; | |||||
| TreeView* getFilesTreeView() const; | TreeView* getFilesTreeView() const; | ||||
| ProjectTreeViewBase* getFilesTreeRoot() const; | ProjectTreeViewBase* getFilesTreeRoot() const; | ||||