diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h index 7ba30f8a52..2fadeb6a28 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_XCode.h @@ -75,10 +75,13 @@ public: //============================================================================== Value getPListToMergeValue() { return getSetting ("customPList"); } - String getPListToMergeString() const { return settings ["customPList"]; } + String getPListToMergeString() const { return settings ["customPList"]; } Value getExtraFrameworksValue() { return getSetting (Ids::extraFrameworks); } - String getExtraFrameworksString() const { return settings [Ids::extraFrameworks]; } + String getExtraFrameworksString() const { return settings [Ids::extraFrameworks]; } + + Value getPostBuildScriptValue() { return getSetting (Ids::postbuildCommand); } + String getPostBuildScript() const { return settings [Ids::postbuildCommand]; } int getLaunchPreferenceOrderForCurrentOS() { @@ -138,6 +141,9 @@ public: props.add (new ChoicePropertyComponent (getLibraryType(), "Library Type", StringArray (libTypes), Array (libTypeValues))); } + + props.add (new TextPropertyComponent (getPostBuildScriptValue(), "Post-build shell script", 32768, true), + "Some shell-script that will be run after a build completes."); } void launchProject() @@ -615,14 +621,6 @@ private: { StringArray s; - { - String srcRoot = rebaseFromProjectFolderToBuildTarget (RelativePath (".", RelativePath::projectFolder)).toUnixStyle(); - if (srcRoot.endsWith ("/.")) - srcRoot = srcRoot.dropLastCharacters (2); - - s.add ("SRCROOT = " + srcRoot.quoted()); - } - const String arch (config.getMacArchitecture()); if (arch == osxArch_Native) s.add ("ARCHS = \"$(ARCHS_NATIVE)\""); else if (arch == osxArch_32BitUniversal) s.add ("ARCHS = \"$(ARCHS_STANDARD_32_BIT)\""); @@ -1131,15 +1129,15 @@ private: void addShellScriptPhase() const { - if (xcodeShellScript.isNotEmpty()) + if (getPostBuildScript().isNotEmpty()) { ValueTree* const v = addBuildPhase ("PBXShellScriptBuildPhase", StringArray()); - v->setProperty (Ids::name, xcodeShellScriptTitle, 0); + v->setProperty (Ids::name, "Post-build script", 0); v->setProperty ("shellPath", "/bin/sh", 0); - v->setProperty ("shellScript", xcodeShellScript.replace ("\\", "\\\\") - .replace ("\"", "\\\"") - .replace ("\r\n", "\\n") - .replace ("\n", "\\n"), 0); + v->setProperty ("shellScript", getPostBuildScript().replace ("\\", "\\\\") + .replace ("\"", "\\\"") + .replace ("\r\n", "\\n") + .replace ("\n", "\\n"), 0); } } diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp index 19f3499521..8b0013788b 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp @@ -209,12 +209,13 @@ void ProjectExporter::createPropertyEditors (PropertyListBuilder& props) for (int i = 0; i < modules.size(); ++i) modules.getUnchecked(i)->createPropertyEditors (*this, props); - props.add (new TextPropertyComponent (getExporterPreprocessorDefs(), "Extra Preprocessor Definitions", 32768, false), - "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace or commas to separate the items - to include a space or comma in a definition, precede it with a backslash."); + props.add (new TextPropertyComponent (getExporterPreprocessorDefs(), "Extra Preprocessor Definitions", 32768, true), + "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, " + "or new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash."); - props.add (new TextPropertyComponent (getExtraCompilerFlags(), "Extra compiler flags", 2048, false), + props.add (new TextPropertyComponent (getExtraCompilerFlags(), "Extra compiler flags", 2048, true), "Extra command-line flags to be passed to the compiler. This string can contain references to preprocessor definitions in the form ${NAME_OF_DEFINITION}, which will be replaced with their values."); - props.add (new TextPropertyComponent (getExtraLinkerFlags(), "Extra linker flags", 2048, false), + props.add (new TextPropertyComponent (getExtraLinkerFlags(), "Extra linker flags", 2048, true), "Extra command-line flags to be passed to the linker. You might want to use this for adding additional libraries. This string can contain references to preprocessor definitions in the form ${NAME_OF_VALUE}, which will be replaced with their values."); { @@ -500,17 +501,12 @@ void ProjectExporter::BuildConfiguration::createBasicPropertyEditors (PropertyLi "The folder in which the finished binary should be placed. Leave this blank to cause the binary to be placed " "in its default location in the build folder."); - props.add (new TextPropertyComponent (getHeaderSearchPathValue(), "Header search paths", 16384, false), - "Extra header search paths. Use semi-colons to separate multiple paths."); + props.addSearchPathProperty (getHeaderSearchPathValue(), "Header search paths", "Extra header search paths."); + props.addSearchPathProperty (getLibrarySearchPathValue(), "Extra library search paths", "Extra library search paths."); - props.add (new TextPropertyComponent (getLibrarySearchPathValue(), "Extra library search paths", 16384, false), - "Extra library search paths. Use semi-colons to separate multiple paths."); - - props.add (new TextPropertyComponent (getBuildConfigPreprocessorDefs(), "Preprocessor definitions", 32768, false), - "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace or commas to separate " - "the items - to include a space or comma in a definition, precede it with a backslash."); - - props.setPreferredHeight (22); + props.add (new TextPropertyComponent (getBuildConfigPreprocessorDefs(), "Preprocessor definitions", 32768, true), + "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace, commas, or " + "new-lines to separate the items - to include a space or comma in a definition, precede it with a backslash."); } StringPairArray ProjectExporter::BuildConfiguration::getAllPreprocessorDefs() const diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h index 8841fc4d2d..54f5c86f57 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.h @@ -86,7 +86,7 @@ public: String getExtraCompilerFlagsString() const { return getSettingString (Ids::extraCompilerFlags); } Value getExtraLinkerFlags() { return getSetting (Ids::extraLinkerFlags); } - String getExtraLinkerFlagsString() const { return getSettingString (Ids::extraLinkerFlags); } + String getExtraLinkerFlagsString() const { return getSettingString (Ids::extraLinkerFlags).replaceCharacters ("\r\n", " "); } // This adds the quotes, and may return angle-brackets, eg: or normal quotes. String getIncludePathForFileInJuceFolder (const String& pathFromJuceFolder, const File& targetIncludeFile) const; @@ -130,8 +130,7 @@ public: //============================================================================== String xcodePackageType, xcodeBundleSignature, xcodeBundleExtension; String xcodeProductType, xcodeProductInstallPath, xcodeFileType; - String xcodeShellScript, xcodeShellScriptTitle, xcodeOtherRezFlags; - String xcodeExcludedFiles64Bit; + String xcodeOtherRezFlags, xcodeExcludedFiles64Bit; bool xcodeIsBundle, xcodeCreatePList, xcodeCanUseDwarf; StringArray xcodeFrameworks; Array xcodeExtraLibrariesDebug, xcodeExtraLibrariesRelease; diff --git a/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h b/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h index 058e7ebb67..ca7cf23a8c 100644 --- a/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h +++ b/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h @@ -240,6 +240,10 @@ namespace RTASHelpers else getRTASFolder (exporter) = "~/SDKs/PT_80_SDK"; } + + if (exporter.settings [Ids::postbuildCommand].toString().isEmpty()) + exporter.getSetting (Ids::postbuildCommand) = String::fromUTF8 (BinaryData::AudioPluginXCodeScript_txt, + BinaryData::AudioPluginXCodeScript_txtSize); } static void addExtraSearchPaths (ProjectExporter& exporter) @@ -345,7 +349,7 @@ namespace RTASHelpers exporter.msvcDelayLoadedDLLs = "DAE.dll; DigiExt.dll; DSI.dll; PluginLib.dll; DSPManager.dll"; - if (! exporter.getExtraLinkerFlags().toString().contains ("/FORCE:multiple")) + if (! exporter.getExtraLinkerFlagsString().contains ("/FORCE:multiple")) exporter.getExtraLinkerFlags() = exporter.getExtraLinkerFlags().toString() + " /FORCE:multiple"; for (ProjectExporter::ConfigIterator config (exporter); config.next();) diff --git a/extras/Introjucer/Source/Project/jucer_Project.cpp b/extras/Introjucer/Source/Project/jucer_Project.cpp index 70e2751c06..256282e7a1 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.cpp +++ b/extras/Introjucer/Source/Project/jucer_Project.cpp @@ -373,8 +373,6 @@ void Project::createPropertyEditors (PropertyListBuilder& props) props.add (new TextPropertyComponent (getProjectPreprocessorDefs(), "Preprocessor definitions", 32768, false), "Extra preprocessor definitions. Use the form \"NAME1=value NAME2=value\", using whitespace or commas to separate the items - to include a space or comma in a definition, precede it with a backslash."); - - props.setPreferredHeight (22); } String Project::getVersionAsHex() const diff --git a/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp b/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp index 74552237a2..06cdadd19a 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp @@ -281,7 +281,6 @@ public: { ChoicePropertyComponent* c = new ChoicePropertyComponent (flags[i]->value, flags[i]->symbol, possibleValues, mappings); c->setTooltip (flags[i]->description); - c->setPreferredHeight (22); props.add (c); } } @@ -644,13 +643,12 @@ struct ProjectSettingsTreeClasses void valueTreeChildOrderChanged (ValueTree&) {} void valueTreeParentChanged (ValueTree&) {} - static void updateSizes (Component& comp, PropertyGroup* groups, int numGroups) + static void updateSize (Component& comp, PropertyGroup& group) { const int width = jmax (550, comp.getParentWidth() - 20); int y = 0; - for (int i = 0; i < numGroups; ++i) - y += groups[i].updateSize (12, y, width - 12); + y += group.updateSize (12, y, width - 12); comp.setSize (width, y); } @@ -746,7 +744,7 @@ struct ProjectSettingsTreeClasses parentSizeChanged(); } - void parentSizeChanged() { updateSizes (*this, &group, 1); } + void parentSizeChanged() { updateSize (*this, group); } private: PropertyGroup group; @@ -875,7 +873,7 @@ struct ProjectSettingsTreeClasses parentSizeChanged(); } - void parentSizeChanged() { updateSizes (*this, &group, 1); } + void parentSizeChanged() { updateSize (*this, group); } private: PropertyGroup group; @@ -886,6 +884,58 @@ struct ProjectSettingsTreeClasses JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ExporterItem); }; + //============================================================================== + class ModulesItem : public SettingsItemBase + { + public: + ModulesItem (Project& project_) : project (project_) {} + + bool isRoot() const { return false; } + bool canBeSelected() const { return true; } + bool mightContainSubItems() { return false; } + String getUniqueName() const { return project.getProjectUID() + "_modules"; } + String getRenamingName() const { return getDisplayName(); } + String getDisplayName() const { return "Modules"; } + void setName (const String&) {} + bool isMissing() { return false; } + const Drawable* getIcon() const { return project.getMainGroup().getIcon(); } + void showDocument() { showSettingsPage (new SettingsComp (project)); } + + private: + Project& project; + + //============================================================================== + class SettingsComp : public Component + { + public: + SettingsComp (Project& project_) : project (project_) + { + addAndMakeVisible (&group); + + PropertyListBuilder props; + props.add (new ModulesPanel (project)); + group.setProperties (props); + group.setName ("Modules"); + + parentSizeChanged(); + } + + void parentSizeChanged() + { + updateSize (*this, group); + } + + private: + Project& project; + var lastProjectType; + PropertyGroup group; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComp); + }; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModulesItem); + }; + //============================================================================== class RootItem : public SettingsItemBase { @@ -909,6 +959,8 @@ struct ProjectSettingsTreeClasses void addSubItems() { + addSubItem (new ModulesItem (project)); + int i = 0; for (Project::ExporterIterator exporter (project); exporter.next(); ++i) addSubItem (new ExporterItem (project, exporter.exporter.release(), i)); @@ -971,10 +1023,9 @@ struct ProjectSettingsTreeClasses SettingsComp (Project& project_) : project (project_) { - addAndMakeVisible (&groups[0]); - addAndMakeVisible (&groups[1]); + addAndMakeVisible (&group); - createAllPanels(); + updatePropertyList(); project.addChangeListener (this); } @@ -985,38 +1036,30 @@ struct ProjectSettingsTreeClasses void parentSizeChanged() { - updateSizes (*this, groups, 2); + updateSize (*this, group); } - void createAllPanels() + void updatePropertyList() { - { - PropertyListBuilder props; - project.createPropertyEditors (props); - groups[0].setProperties (props); - groups[0].setName ("Project Settings"); - - lastProjectType = project.getProjectTypeValue().getValue(); - } - PropertyListBuilder props; - props.add (new ModulesPanel (project)); - groups[1].setProperties (props); - groups[1].setName ("Modules"); + project.createPropertyEditors (props); + group.setProperties (props); + group.setName ("Project Settings"); + lastProjectType = project.getProjectTypeValue().getValue(); parentSizeChanged(); } void changeListenerCallback (ChangeBroadcaster*) { if (lastProjectType != project.getProjectTypeValue().getValue()) - createAllPanels(); + updatePropertyList(); } private: Project& project; var lastProjectType; - PropertyGroup groups[2]; + PropertyGroup group; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComp); }; diff --git a/extras/Introjucer/Source/Project/jucer_ProjectType.cpp b/extras/Introjucer/Source/Project/jucer_ProjectType.cpp index 64ece0972b..37ab8387f0 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectType.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectType.cpp @@ -275,9 +275,6 @@ public: exporter.xcodeProductType = "com.apple.product-type.bundle"; exporter.xcodeProductInstallPath = "$(HOME)/Library/Audio/Plug-Ins/Components/"; - exporter.xcodeShellScriptTitle = "Copy to the different plugin folders"; - exporter.xcodeShellScript = String::fromUTF8 (BinaryData::AudioPluginXCodeScript_txt, BinaryData::AudioPluginXCodeScript_txtSize); - exporter.xcodeOtherRezFlags = "-d ppc_$ppc -d i386_$i386 -d ppc64_$ppc64 -d x86_64_$x86_64" " -I /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers" " -I \\\"$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase\\\""; diff --git a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp index aa27042104..0d971c0c65 100644 --- a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp +++ b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp @@ -165,7 +165,7 @@ String replacePreprocessorDefs (const StringPairArray& definitions, String sourc StringArray getSearchPathsFromString (const String& searchPath) { StringArray s; - s.addTokens (searchPath, ";", String::empty); + s.addTokens (searchPath, ";\r\n", String::empty); s.trim(); s.removeEmptyStrings(); s.removeDuplicates (false); diff --git a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h index 59213faab6..4e6ffdd4d2 100644 --- a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h +++ b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h @@ -91,6 +91,12 @@ public: add (propertyComp); } + void addSearchPathProperty (const Value& value, const String& name, const String& mainHelpText) + { + add (new TextPropertyComponent (value, name, 16384, true), + mainHelpText + " Use semi-colons or new-lines to separate multiple paths."); + } + void setPreferredHeight (int height) { for (int j = components.size(); --j >= 0;) diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp index 17b359fc66..5dd51315bc 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp @@ -2539,8 +2539,8 @@ void LookAndFeel::drawPropertyComponentLabel (Graphics& g, int, int height, const Rectangle LookAndFeel::getPropertyComponentContentPosition (PropertyComponent& component) { - return Rectangle (component.getWidth() / 3, 1, - component.getWidth() - component.getWidth() / 3 - 1, component.getHeight() - 3); + const int textW = jmin (200, component.getWidth() / 3); + return Rectangle (textW, 1, component.getWidth() - textW - 1, component.getHeight() - 3); } //============================================================================== diff --git a/modules/juce_gui_basics/properties/juce_PropertyComponent.h b/modules/juce_gui_basics/properties/juce_PropertyComponent.h index 9aecc6f244..3d6c66ca38 100644 --- a/modules/juce_gui_basics/properties/juce_PropertyComponent.h +++ b/modules/juce_gui_basics/properties/juce_PropertyComponent.h @@ -114,9 +114,7 @@ protected: */ int preferredHeight; - private: - //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PropertyComponent); }; diff --git a/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp b/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp index 975106f38a..92ecaf6a5f 100644 --- a/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp +++ b/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp @@ -105,7 +105,7 @@ void TextPropertyComponent::createEditor (const int maxNumChars, const bool isMu if (isMultiLine) { textEditor->setJustificationType (Justification::topLeft); - preferredHeight = 120; + preferredHeight = 100; } }