diff --git a/extras/Introjucer/Builds/CodeBlocks/The Introjucer.cbp b/extras/Introjucer/Builds/CodeBlocks/The Introjucer.cbp
index c84206931a..4ff7b821fd 100644
--- a/extras/Introjucer/Builds/CodeBlocks/The Introjucer.cbp
+++ b/extras/Introjucer/Builds/CodeBlocks/The Introjucer.cbp
@@ -142,8 +142,15 @@
-
-
+
+
+
+
+
+
+
+
+
@@ -180,8 +187,15 @@
-
-
+
+
+
+
+
+
+
+
+
@@ -190,11 +204,6 @@
-
-
-
-
-
diff --git a/extras/Introjucer/Builds/Linux/Makefile b/extras/Introjucer/Builds/Linux/Makefile
index cec80bd3e3..780a084747 100644
--- a/extras/Introjucer/Builds/Linux/Makefile
+++ b/extras/Introjucer/Builds/Linux/Makefile
@@ -56,15 +56,12 @@ OBJECTS := \
$(OBJDIR)/jucer_Main_f8488f5b.o \
$(OBJDIR)/jucer_MainWindow_1e163aeb.o \
$(OBJDIR)/jucer_OpenDocumentManager_4c72d210.o \
- $(OBJDIR)/jucer_ConfigPage_99b07caa.o \
$(OBJDIR)/jucer_Module_3f7666a5.o \
$(OBJDIR)/jucer_NewFileWizard_b8a19ef8.o \
$(OBJDIR)/jucer_NewProjectWizard_7a15bf5d.o \
$(OBJDIR)/jucer_Project_c131864a.o \
$(OBJDIR)/jucer_ProjectContentComponent_60de0eee.o \
- $(OBJDIR)/jucer_ProjectTreeViewBase_63c2bdbe.o \
$(OBJDIR)/jucer_ProjectType_1bc27a24.o \
- $(OBJDIR)/jucer_TreeViewTypes_4a765287.o \
$(OBJDIR)/jucer_ProjectExporter_eefe2e5b.o \
$(OBJDIR)/jucer_ResourceFile_6af120d3.o \
$(OBJDIR)/jucer_CodeHelpers_c317179c.o \
@@ -157,11 +154,6 @@ $(OBJDIR)/jucer_OpenDocumentManager_4c72d210.o: ../../Source/Application/jucer_O
@echo "Compiling jucer_OpenDocumentManager.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
-$(OBJDIR)/jucer_ConfigPage_99b07caa.o: ../../Source/Project/jucer_ConfigPage.cpp
- -@mkdir -p $(OBJDIR)
- @echo "Compiling jucer_ConfigPage.cpp"
- @$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
-
$(OBJDIR)/jucer_Module_3f7666a5.o: ../../Source/Project/jucer_Module.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling jucer_Module.cpp"
@@ -187,21 +179,11 @@ $(OBJDIR)/jucer_ProjectContentComponent_60de0eee.o: ../../Source/Project/jucer_P
@echo "Compiling jucer_ProjectContentComponent.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
-$(OBJDIR)/jucer_ProjectTreeViewBase_63c2bdbe.o: ../../Source/Project/jucer_ProjectTreeViewBase.cpp
- -@mkdir -p $(OBJDIR)
- @echo "Compiling jucer_ProjectTreeViewBase.cpp"
- @$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
-
$(OBJDIR)/jucer_ProjectType_1bc27a24.o: ../../Source/Project/jucer_ProjectType.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling jucer_ProjectType.cpp"
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
-$(OBJDIR)/jucer_TreeViewTypes_4a765287.o: ../../Source/Project/jucer_TreeViewTypes.cpp
- -@mkdir -p $(OBJDIR)
- @echo "Compiling jucer_TreeViewTypes.cpp"
- @$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
-
$(OBJDIR)/jucer_ProjectExporter_eefe2e5b.o: ../../Source/Project\ Saving/jucer_ProjectExporter.cpp
-@mkdir -p $(OBJDIR)
@echo "Compiling jucer_ProjectExporter.cpp"
diff --git a/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj b/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
index 61b2edc818..5ec4438098 100644
--- a/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
+++ b/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
@@ -20,15 +20,12 @@
95B44E6C74B1DED31DBE37EB = { isa = PBXBuildFile; fileRef = 8C52A3DDA62A746AA7A68535; };
AA9D0B8E23F3D87A23DE9F8A = { isa = PBXBuildFile; fileRef = 9069981E414A631B036CC9AC; };
244BA1BDA5FAA465EA3F9C6D = { isa = PBXBuildFile; fileRef = 2247EE920DF0610CAF9F4513; };
- D1A1998A202A88C617C9AB73 = { isa = PBXBuildFile; fileRef = E7F7033084AC10FB77B0F77A; };
3FCA61C401007B243E2E9035 = { isa = PBXBuildFile; fileRef = F797071D88542C813CF7222A; };
5BC89E7905397ABECD25ACCD = { isa = PBXBuildFile; fileRef = F1163B7856FDABA413A88D90; };
FBE57B26FE59319AA2E8B59D = { isa = PBXBuildFile; fileRef = 69A5D13490A62DAE9A7D5A22; };
30B921C38DCEE787B294B746 = { isa = PBXBuildFile; fileRef = BAC43B20E14A340CCF14119C; };
676D2E1E750E61AA2FAA335E = { isa = PBXBuildFile; fileRef = 86E468DE6556BB2AD76A3D80; };
- 9CBD0A9A700D28081C8182C5 = { isa = PBXBuildFile; fileRef = 4BAF0975F0958432B17D0D41; };
8012E6487639A7368E4C4470 = { isa = PBXBuildFile; fileRef = E70CA21960A64CCB835725FF; };
- B18DEBB2CBB335AFAE249E8E = { isa = PBXBuildFile; fileRef = F94ACCC426AB439B871699E3; };
1F37544891EC8DBB5E500C1C = { isa = PBXBuildFile; fileRef = F71AF6D2DF3E652F8B51EBAB; };
110221CD5578153B528AD2BE = { isa = PBXBuildFile; fileRef = D10D51A0A2D63F38B4D86A60; };
CD4F7B119CE718BCE78D61F4 = { isa = PBXBuildFile; fileRef = 9B9CAD20E1243B4351B4C8D8; };
@@ -251,6 +248,7 @@
35E6EE1E98DD7050DDFECD9B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ContentCompTemplate.h"; path = "../../Source/BinaryData/jucer_ContentCompTemplate.h"; sourceTree = "SOURCE_ROOT"; };
364D1A9B113320407A7E57B9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; };
36981345C70DCC6B95DEC59C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Initialisation.h"; path = "../../../../modules/juce_events/messages/juce_Initialisation.h"; sourceTree = "SOURCE_ROOT"; };
+ 375AFDF06A908D89DEC5205F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectTree_Base.h"; path = "../../Source/Project/jucer_ProjectTree_Base.h"; sourceTree = "SOURCE_ROOT"; };
37A0A38C2B5825B9A302879C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedArray.h"; path = "../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"; sourceTree = "SOURCE_ROOT"; };
3804BE13635F779ACB8C5491 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LassoComponent.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_LassoComponent.h"; sourceTree = "SOURCE_ROOT"; };
38CE1587800D612BA0C394A5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationBase.h"; path = "../../../../modules/juce_events/messages/juce_ApplicationBase.h"; sourceTree = "SOURCE_ROOT"; };
@@ -294,6 +292,7 @@
467A5E1882A75E01876A8C4A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedPositionBehaviours.h"; path = "../../../../modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h"; sourceTree = "SOURCE_ROOT"; };
46C2D683A917A9D3729EEAC4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedReadLock.h"; path = "../../../../modules/juce_core/threads/juce_ScopedReadLock.h"; sourceTree = "SOURCE_ROOT"; };
472F9A90F685220D730EBF6C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; };
+ 47B49049B85EED74D29C9906 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectTree_File.h"; path = "../../Source/Project/jucer_ProjectTree_File.h"; sourceTree = "SOURCE_ROOT"; };
47DD50A5A9091F9900E0EAD9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_JucerTreeViewBase.cpp"; path = "../../Source/Utility/jucer_JucerTreeViewBase.cpp"; sourceTree = "SOURCE_ROOT"; };
47F4C6341177140302CE802A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropTarget.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; };
48A2FBB4CB48AC4FCA796F2F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ContainerDeletePolicy.h"; path = "../../../../modules/juce_core/memory/juce_ContainerDeletePolicy.h"; sourceTree = "SOURCE_ROOT"; };
@@ -306,7 +305,6 @@
4AE0078871D92B6085C28313 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AlertWindow.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_AlertWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
4AF755C65E352951D80FB93B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationProperties.cpp"; path = "../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp"; sourceTree = "SOURCE_ROOT"; };
4B98FC7F079F93BCC4D65C86 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_FileChooser.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_linux_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; };
- 4BAF0975F0958432B17D0D41 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjectTreeViewBase.cpp"; path = "../../Source/Project/jucer_ProjectTreeViewBase.cpp"; sourceTree = "SOURCE_ROOT"; };
4BC9122A6E6496EAF716560E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ListBox.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_ListBox.cpp"; sourceTree = "SOURCE_ROOT"; };
4C150A1BF98D747EC218A602 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Component.cpp"; path = "../../../../modules/juce_gui_basics/components/juce_Component.cpp"; sourceTree = "SOURCE_ROOT"; };
4C2093BCD3528ACEDC7A2B33 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ImageButtonHandler.h"; path = "../../Source/ComponentEditor/components/jucer_ImageButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
@@ -320,6 +318,7 @@
4E60769DE992CA7FC1A4A486 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintRoutineEditor.h"; path = "../../Source/ComponentEditor/ui/jucer_PaintRoutineEditor.h"; sourceTree = "SOURCE_ROOT"; };
4E8FE9B1B8C90FC28D56523B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementEllipse.h"; path = "../../Source/ComponentEditor/paintelements/jucer_PaintElementEllipse.h"; sourceTree = "SOURCE_ROOT"; };
4F5843D423E67797070115B3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Timer.cpp"; path = "../../../../modules/juce_events/timers/juce_Timer.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 4F6365A0D2D51337151D85C3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectTree_Group.h"; path = "../../Source/Project/jucer_ProjectTree_Group.h"; sourceTree = "SOURCE_ROOT"; };
4F687965FBE86EAFDB3ACFEC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; };
4F88933C6D2AB8A83EB14E16 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LinkedListPointer.h"; path = "../../../../modules/juce_core/containers/juce_LinkedListPointer.h"; sourceTree = "SOURCE_ROOT"; };
50498FF6EA3901CBD58223B3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ObjectTypes.h"; path = "../../Source/ComponentEditor/jucer_ObjectTypes.h"; sourceTree = "SOURCE_ROOT"; };
@@ -453,6 +452,7 @@
79B3DE19D706135161A727B0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextDiff.h"; path = "../../../../modules/juce_core/text/juce_TextDiff.h"; sourceTree = "SOURCE_ROOT"; };
79F7CC3E9B848AAA3A5C682B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PathStrokeType.cpp"; path = "../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp"; sourceTree = "SOURCE_ROOT"; };
7A3E96D22F1C9EB4C739834F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PointComponent.h"; path = "../../Source/ComponentEditor/paintelements/jucer_PointComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 7B4E33B1E04139F359FB484B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ConfigTree_Exporter.h"; path = "../../Source/Project/jucer_ConfigTree_Exporter.h"; sourceTree = "SOURCE_ROOT"; };
7B824A2F1BBE334B140BD8AF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AttributedString.h"; path = "../../../../modules/juce_graphics/fonts/juce_AttributedString.h"; sourceTree = "SOURCE_ROOT"; };
7C02936574E000C436E3AD8E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Value.cpp"; path = "../../../../modules/juce_data_structures/values/juce_Value.cpp"; sourceTree = "SOURCE_ROOT"; };
7C48EA717C5B1136A39FF4FB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnection.cpp"; path = "../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -507,6 +507,7 @@
8DDA82E1200B61D3B6C526E8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_graphics.h"; path = "../../../../modules/juce_graphics/juce_graphics.h"; sourceTree = "SOURCE_ROOT"; };
8E00CF4CE2305C5CE5B60E37 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TopLevelWindow.h"; path = "../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.h"; sourceTree = "SOURCE_ROOT"; };
8F30A53C7FE4BC65171FB3E2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JucerDocument.h"; path = "../../Source/ComponentEditor/jucer_JucerDocument.h"; sourceTree = "SOURCE_ROOT"; };
+ 8F8BF1A7130D858E0A239F9E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ConfigTree_Base.h"; path = "../../Source/Project/jucer_ConfigTree_Base.h"; sourceTree = "SOURCE_ROOT"; };
8FF39B6B0D9DEB5BBE388A6F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MessageListener.h"; path = "../../../../modules/juce_events/messages/juce_MessageListener.h"; sourceTree = "SOURCE_ROOT"; };
9069981E414A631B036CC9AC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainWindow.cpp"; path = "../../Source/Application/jucer_MainWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
90BD70D106A80947463BCB1A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_NamedValueSet.cpp"; path = "../../../../modules/juce_core/containers/juce_NamedValueSet.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -516,7 +517,6 @@
915ACCF56213FACAB42B427D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ModifierKeys.h"; path = "../../../../modules/juce_gui_basics/keyboard/juce_ModifierKeys.h"; sourceTree = "SOURCE_ROOT"; };
920DA9E20EB14DD7D6139DD5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colours.h"; path = "../../../../modules/juce_graphics/colour/juce_Colours.h"; sourceTree = "SOURCE_ROOT"; };
921752D9B004A15973DDF56F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_TestComponent.cpp"; path = "../../Source/ComponentEditor/ui/jucer_TestComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
- 922DB1DA01DAF63CE86B5E53 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectTreeViewBase.h"; path = "../../Source/Project/jucer_ProjectTreeViewBase.h"; sourceTree = "SOURCE_ROOT"; };
925CC15E1449AED03A1CE4F8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GraphicsContext.h"; path = "../../../../modules/juce_graphics/contexts/juce_GraphicsContext.h"; sourceTree = "SOURCE_ROOT"; };
92F91DC29B64AD85B1F508BD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GenericComponentHandler.h"; path = "../../Source/ComponentEditor/components/jucer_GenericComponentHandler.h"; sourceTree = "SOURCE_ROOT"; };
93260AA1B96F74E928B7B07C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringRef.h"; path = "../../../../modules/juce_core/text/juce_StringRef.h"; sourceTree = "SOURCE_ROOT"; };
@@ -576,6 +576,7 @@
9F26333042DFB93B7DFEC870 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MACAddress.cpp"; path = "../../../../modules/juce_core/network/juce_MACAddress.cpp"; sourceTree = "SOURCE_ROOT"; };
9F41F3338BF00D0FC74C6390 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TestComponent.h"; path = "../../Source/ComponentEditor/ui/jucer_TestComponent.h"; sourceTree = "SOURCE_ROOT"; };
9F5483F3EEF0A1E0C71B95A5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_ImageButton.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 9F75811FE7B5F8D1321BEC69 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ConfigTree_Modules.h"; path = "../../Source/Project/jucer_ConfigTree_Modules.h"; sourceTree = "SOURCE_ROOT"; };
9F7896DA332F9718CAB6B162 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedObject.h"; path = "../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h"; sourceTree = "SOURCE_ROOT"; };
A004A03A932CDECDED29F19C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XmlElement.cpp"; path = "../../../../modules/juce_core/xml/juce_XmlElement.cpp"; sourceTree = "SOURCE_ROOT"; };
A071CAC9920625A3707CF949 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StandardHeader.h"; path = "../../../../modules/juce_core/system/juce_StandardHeader.h"; sourceTree = "SOURCE_ROOT"; };
@@ -666,7 +667,6 @@
BA5C7DE347A73A87F687703C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandTarget.h"; path = "../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h"; sourceTree = "SOURCE_ROOT"; };
BA95268EEE80F9509EC1F76F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBasedDocument.h"; path = "../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h"; sourceTree = "SOURCE_ROOT"; };
BAC43B20E14A340CCF14119C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Project.cpp"; path = "../../Source/Project/jucer_Project.cpp"; sourceTree = "SOURCE_ROOT"; };
- BBA6060656F685ED7FA52045 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TreeViewTypes.h"; path = "../../Source/Project/jucer_TreeViewTypes.h"; sourceTree = "SOURCE_ROOT"; };
BC17B02633EF1E31024051C2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeDocument.cpp"; path = "../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
BCAD13352CE76BA81629A6E7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableText.h"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h"; sourceTree = "SOURCE_ROOT"; };
BCCFDFB2C02C4AA436C0ECF8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SliderHandler.h"; path = "../../Source/ComponentEditor/components/jucer_SliderHandler.h"; sourceTree = "SOURCE_ROOT"; };
@@ -685,7 +685,6 @@
C094F3B6A65A79A6DF87C9C2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintElementGroup.h"; path = "../../Source/ComponentEditor/paintelements/jucer_PaintElementGroup.h"; sourceTree = "SOURCE_ROOT"; };
C187718F7B9EBA88584B43F3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintRoutine.cpp"; path = "../../Source/ComponentEditor/jucer_PaintRoutine.cpp"; sourceTree = "SOURCE_ROOT"; };
C1FDD2DDB01AC8C4DECB2C10 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableImage.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp"; sourceTree = "SOURCE_ROOT"; };
- C2080119AEDFDE0D477756FA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ConfigPage.h"; path = "../../Source/Project/jucer_ConfigPage.h"; sourceTree = "SOURCE_ROOT"; };
C22E03FEBEB6921978C5612A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeBroadcaster.h"; path = "../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h"; sourceTree = "SOURCE_ROOT"; };
C2D43E4F571D16F0E9B1E44E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileTreeComponent.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h"; sourceTree = "SOURCE_ROOT"; };
C2ECD077AC4C784A67BC3DDE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Socket.h"; path = "../../../../modules/juce_core/network/juce_Socket.h"; sourceTree = "SOURCE_ROOT"; };
@@ -710,9 +709,11 @@
C83992DA0BE30EA3CD06EA98 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ProgressBar.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.h"; sourceTree = "SOURCE_ROOT"; };
C85B4D62B96F4A44890F20E2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SortedSet.h"; path = "../../../../modules/juce_core/containers/juce_SortedSet.h"; sourceTree = "SOURCE_ROOT"; };
C8A229ACD244F402C57286CD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_MSVC.h"; path = "../../Source/Project Saving/jucer_ProjectExport_MSVC.h"; sourceTree = "SOURCE_ROOT"; };
+ C90C66C5727759D5CBD5FB07 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AbstractFifo.cpp"; path = "../../../../modules/juce_core/containers/juce_AbstractFifo.cpp"; sourceTree = "SOURCE_ROOT"; };
C9616830BB2474066AC8C910 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ResourceFile.h"; path = "../../Source/Project Saving/jucer_ResourceFile.h"; sourceTree = "SOURCE_ROOT"; };
C9871C46DEDD05103443DC33 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NewLine.h"; path = "../../../../modules/juce_core/text/juce_NewLine.h"; sourceTree = "SOURCE_ROOT"; };
C9DCA94BF8A4C583E5392755 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MultiTimer.cpp"; path = "../../../../modules/juce_events/timers/juce_MultiTimer.cpp"; sourceTree = "SOURCE_ROOT"; };
+ CA62F9F7C5F0D77D8E33D91F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SplashScreen.h"; path = "../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h"; sourceTree = "SOURCE_ROOT"; };
CB36CD7F57D0F4231DC98686 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Message.h"; path = "../../../../modules/juce_events/messages/juce_Message.h"; sourceTree = "SOURCE_ROOT"; };
CB48495010366C2E371BEFDB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemStats.cpp"; path = "../../../../modules/juce_core/system/juce_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; };
CBE0B96838EE76C9CB8E1230 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ColourGradient.cpp"; path = "../../../../modules/juce_graphics/colour/juce_ColourGradient.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -725,7 +726,6 @@
CDDF5BDC75277F7B83A38885 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertySet.cpp"; path = "../../../../modules/juce_core/containers/juce_PropertySet.cpp"; sourceTree = "SOURCE_ROOT"; };
CDF8F65F9079B2C14A740F0F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageButton.h"; path = "../../../../modules/juce_gui_basics/buttons/juce_ImageButton.h"; sourceTree = "SOURCE_ROOT"; };
CE1DFE4E3908943656E180AD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UnitTest.cpp"; path = "../../../../modules/juce_core/unit_tests/juce_UnitTest.cpp"; sourceTree = "SOURCE_ROOT"; };
- CF0615A1AF1A514A60322B50 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseCursor.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h"; sourceTree = "SOURCE_ROOT"; };
CF21D9DB3AEC0A4DCAB36A99 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_Icons.cpp"; path = "../../Source/Utility/jucer_Icons.cpp"; sourceTree = "SOURCE_ROOT"; };
CF6C8BD0DA3D8CD4E99EBADA = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
CF8011B3C67B609032974DA5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_NewCppFileTemplate.cpp"; path = "../../Source/BinaryData/jucer_NewCppFileTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -741,6 +741,7 @@
D2F80DA0946A5EE01FC016CA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF32.h"; path = "../../../../modules/juce_core/text/juce_CharPointer_UTF32.h"; sourceTree = "SOURCE_ROOT"; };
D374DC78AAC02504576AA9B3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GroupComponentHandler.h"; path = "../../Source/ComponentEditor/components/jucer_GroupComponentHandler.h"; sourceTree = "SOURCE_ROOT"; };
D376B9B54EC944E766AFEC45 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PopupMenu.cpp"; path = "../../../../modules/juce_gui_basics/menus/juce_PopupMenu.cpp"; sourceTree = "SOURCE_ROOT"; };
+ D3E139185095C486DD3D61F2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TranslationTool.h"; path = "../../Source/Utility/jucer_TranslationTool.h"; sourceTree = "SOURCE_ROOT"; };
D4444EC6342A2A7BC4F7BC46 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentTextProperty.h"; path = "../../Source/ComponentEditor/properties/jucer_ComponentTextProperty.h"; sourceTree = "SOURCE_ROOT"; };
D4697A0232AECE5DAC5E332E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChoicePropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
D4E56676E2EF83404EDCBA8C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextEditor.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_TextEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -759,49 +760,47 @@
D87FC8F6834E9DC9C8E88B94 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_JustificationProperty.h"; path = "../../Source/ComponentEditor/properties/jucer_JustificationProperty.h"; sourceTree = "SOURCE_ROOT"; };
D926E13AB5AD647A7A00F486 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Network.cpp"; path = "../../../../modules/juce_core/native/juce_linux_Network.cpp"; sourceTree = "SOURCE_ROOT"; };
D92A6E9404A30EED32DCE4ED = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_RelativePositionedRectangle.h"; path = "../../Source/ComponentEditor/ui/jucer_RelativePositionedRectangle.h"; sourceTree = "SOURCE_ROOT"; };
+ D9342535EA61901A1AD816C6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_WebBrowserComponent.cpp"; path = "../../../../modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
D95D7B49EC6C6BDCB5A1B988 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_MessageManager.mm"; path = "../../../../modules/juce_events/native/juce_ios_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; };
- D9B077E2ECDDA94961E134D7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPairArray.h"; path = "../../../../modules/juce_core/text/juce_StringPairArray.h"; sourceTree = "SOURCE_ROOT"; };
- DA345D5B9DABD049F90DC96F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GeneratedCode.h"; path = "../../Source/ComponentEditor/jucer_GeneratedCode.h"; sourceTree = "SOURCE_ROOT"; };
- DAF84A553D264705FA6EB6FF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TreeViewHandler.h"; path = "../../Source/ComponentEditor/components/jucer_TreeViewHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ D9E59DE07A815AB303A297D9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_data_structures.mm"; path = "../../../../modules/juce_data_structures/juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
DB20268A566DABEAE3F2CBEE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RectanglePlacement.cpp"; path = "../../../../modules/juce_graphics/placement/juce_RectanglePlacement.cpp"; sourceTree = "SOURCE_ROOT"; };
- DB876F7873F42DC685A58CA7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
DBE0CDE1B017190ABBFF557C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectExport_CodeBlocks.h"; path = "../../Source/Project Saving/jucer_ProjectExport_CodeBlocks.h"; sourceTree = "SOURCE_ROOT"; };
DC5E7FF30B01118F6DAEC38F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Time.cpp"; path = "../../../../modules/juce_core/time/juce_Time.cpp"; sourceTree = "SOURCE_ROOT"; };
- DCCB75165B7C73A589498E87 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Windowing.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; };
- DD2494D5F1C081898D616AF5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyListener.cpp"; path = "../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp"; sourceTree = "SOURCE_ROOT"; };
- DD985A60FB76E976AF91852D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SHA256.h"; path = "../../../../modules/juce_cryptography/hashing/juce_SHA256.h"; sourceTree = "SOURCE_ROOT"; };
- DE5F3C9EF6BFFDE73AF9E7FC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsDisplayComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
- DF725A596B7BCD7520CC0A9F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ResourceEditorPanel.cpp"; path = "../../Source/ComponentEditor/ui/jucer_ResourceEditorPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
- DF7BB5B6B394EDEEF5F5B4B8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallbackMessage.h"; path = "../../../../modules/juce_events/messages/juce_CallbackMessage.h"; sourceTree = "SOURCE_ROOT"; };
- E5D6C36496F5BC84D7213BE8 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
- E65A820D34BF39478B7C5925 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_DocumentEditorComponent.h"; path = "../../Source/Application/jucer_DocumentEditorComponent.h"; sourceTree = "SOURCE_ROOT"; };
- E7F7033084AC10FB77B0F77A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ConfigPage.cpp"; path = "../../Source/Project/jucer_ConfigPage.cpp"; sourceTree = "SOURCE_ROOT"; };
- E96597BBC6A98255B51B94DC = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
- 25F52316D256B4534BED16D1 = { isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Introjucer.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
- C90C66C5727759D5CBD5FB07 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AbstractFifo.cpp"; path = "../../../../modules/juce_core/containers/juce_AbstractFifo.cpp"; sourceTree = "SOURCE_ROOT"; };
- CA62F9F7C5F0D77D8E33D91F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SplashScreen.h"; path = "../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h"; sourceTree = "SOURCE_ROOT"; };
- D3E139185095C486DD3D61F2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TranslationTool.h"; path = "../../Source/Utility/jucer_TranslationTool.h"; sourceTree = "SOURCE_ROOT"; };
- D9342535EA61901A1AD816C6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_WebBrowserComponent.cpp"; path = "../../../../modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
- D9E59DE07A815AB303A297D9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_data_structures.mm"; path = "../../../../modules/juce_data_structures/juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; };
DC922C6A65D260C18E888E49 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ComponentTemplate.cpp"; path = "../../Source/BinaryData/jucer_ComponentTemplate.cpp"; sourceTree = "SOURCE_ROOT"; };
+ DCCB75165B7C73A589498E87 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Windowing.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_linux_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; };
DD00494140C86144306A9356 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Array.h"; path = "../../../../modules/juce_core/containers/juce_Array.h"; sourceTree = "SOURCE_ROOT"; };
+ DD2494D5F1C081898D616AF5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyListener.cpp"; path = "../../../../modules/juce_gui_basics/keyboard/juce_KeyListener.cpp"; sourceTree = "SOURCE_ROOT"; };
DE40B42B57F29C650CB7F2AD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RecentlyOpenedFilesList.h"; path = "../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h"; sourceTree = "SOURCE_ROOT"; };
+ DE5F3C9EF6BFFDE73AF9E7FC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsDisplayComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
DE8DF5D263F40F65581CFDE4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChildProcess.cpp"; path = "../../../../modules/juce_core/threads/juce_ChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; };
DEF579B1433EB8DEE7AB50F8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Drawable.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp"; sourceTree = "SOURCE_ROOT"; };
+ DF725A596B7BCD7520CC0A9F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ResourceEditorPanel.cpp"; path = "../../Source/ComponentEditor/ui/jucer_ResourceEditorPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
DFC6364D81D9C60BD4CA9D12 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeTime.cpp"; path = "../../../../modules/juce_core/time/juce_RelativeTime.cpp"; sourceTree = "SOURCE_ROOT"; };
- E07C56267CBB46FC44EF2026 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Image.cpp"; path = "../../../../modules/juce_graphics/images/juce_Image.cpp"; sourceTree = "SOURCE_ROOT"; };
E0F9CA57E44F7F7E7E217E47 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ComponentUndoableAction.h"; path = "../../Source/ComponentEditor/components/jucer_ComponentUndoableAction.h"; sourceTree = "SOURCE_ROOT"; };
- E1C16C872E34BCB144B469F9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_EdgeTable.h"; path = "../../../../modules/juce_graphics/geometry/juce_EdgeTable.h"; sourceTree = "SOURCE_ROOT"; };
E2374E15D65425C4101237E2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewComponentTemplate.h"; path = "../../Source/BinaryData/jucer_NewComponentTemplate.h"; sourceTree = "SOURCE_ROOT"; };
- E27F0860F27023BAA9798B46 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Rectangle.h"; path = "../../../../modules/juce_graphics/geometry/juce_Rectangle.h"; sourceTree = "SOURCE_ROOT"; };
E284B565DBD647DC0830D23B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ButtonPropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
E2C1C995D554A3F0A363CE58 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Thread.h"; path = "../../../../modules/juce_core/threads/juce_Thread.h"; sourceTree = "SOURCE_ROOT"; };
E2DBA3307837B64AFCCD8F8D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_File.cpp"; path = "../../../../modules/juce_core/files/juce_File.cpp"; sourceTree = "SOURCE_ROOT"; };
- E3FF16862AA1B2F943DC616C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageCache.cpp"; path = "../../../../modules/juce_graphics/images/juce_ImageCache.cpp"; sourceTree = "SOURCE_ROOT"; };
E446FFE889CD490FDE3F0F2B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadWithProgressWindow.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
E4BB22E27C5AA4B666F265BD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TextButtonHandler.h"; path = "../../Source/ComponentEditor/components/jucer_TextButtonHandler.h"; sourceTree = "SOURCE_ROOT"; };
- E4E74B2BC3F3CB5A4F4DC55E = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../../../modules/juce_gui_basics/juce_module_info"; sourceTree = "SOURCE_ROOT"; };
E530742870F07704E9616358 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemComponent.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ E5D6C36496F5BC84D7213BE8 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ E65A820D34BF39478B7C5925 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_DocumentEditorComponent.h"; path = "../../Source/Application/jucer_DocumentEditorComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ E7E1C4F416CFA44BE7DD1A74 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyboardFocusTraverser.h"; path = "../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h"; sourceTree = "SOURCE_ROOT"; };
+ E96597BBC6A98255B51B94DC = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
+ 25F52316D256B4534BED16D1 = { isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Introjucer.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
+ CF0615A1AF1A514A60322B50 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseCursor.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_MouseCursor.h"; sourceTree = "SOURCE_ROOT"; };
+ D9B077E2ECDDA94961E134D7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPairArray.h"; path = "../../../../modules/juce_core/text/juce_StringPairArray.h"; sourceTree = "SOURCE_ROOT"; };
+ DA345D5B9DABD049F90DC96F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GeneratedCode.h"; path = "../../Source/ComponentEditor/jucer_GeneratedCode.h"; sourceTree = "SOURCE_ROOT"; };
+ DAF84A553D264705FA6EB6FF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TreeViewHandler.h"; path = "../../Source/ComponentEditor/components/jucer_TreeViewHandler.h"; sourceTree = "SOURCE_ROOT"; };
+ DB876F7873F42DC685A58CA7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
+ DD985A60FB76E976AF91852D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SHA256.h"; path = "../../../../modules/juce_cryptography/hashing/juce_SHA256.h"; sourceTree = "SOURCE_ROOT"; };
+ DF7BB5B6B394EDEEF5F5B4B8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallbackMessage.h"; path = "../../../../modules/juce_events/messages/juce_CallbackMessage.h"; sourceTree = "SOURCE_ROOT"; };
+ E07C56267CBB46FC44EF2026 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Image.cpp"; path = "../../../../modules/juce_graphics/images/juce_Image.cpp"; sourceTree = "SOURCE_ROOT"; };
+ E1C16C872E34BCB144B469F9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_EdgeTable.h"; path = "../../../../modules/juce_graphics/geometry/juce_EdgeTable.h"; sourceTree = "SOURCE_ROOT"; };
+ E27F0860F27023BAA9798B46 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Rectangle.h"; path = "../../../../modules/juce_graphics/geometry/juce_Rectangle.h"; sourceTree = "SOURCE_ROOT"; };
+ E3FF16862AA1B2F943DC616C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageCache.cpp"; path = "../../../../modules/juce_graphics/images/juce_ImageCache.cpp"; sourceTree = "SOURCE_ROOT"; };
+ E4E74B2BC3F3CB5A4F4DC55E = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../../../modules/juce_gui_basics/juce_module_info"; sourceTree = "SOURCE_ROOT"; };
E54D0994D31E20A0A05EBA2B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemTrayIconComponent.h"; path = "../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h"; sourceTree = "SOURCE_ROOT"; };
E570E57CC1FCEF78B54A7084 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileOutputStream.h"; path = "../../../../modules/juce_core/files/juce_FileOutputStream.h"; sourceTree = "SOURCE_ROOT"; };
E60E28D1B7491047DEA236AE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectContentComponent.h"; path = "../../Source/Project/jucer_ProjectContentComponent.h"; sourceTree = "SOURCE_ROOT"; };
@@ -815,7 +814,6 @@
E7B6A0CBA0D27A095E83F5B7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_WebBrowserComponent.cpp"; path = "../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
E7D09B860F4D4A13D4312C38 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertiesFile.cpp"; path = "../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp"; sourceTree = "SOURCE_ROOT"; };
E7E122AE104E79BB641B07B3 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../../../modules/juce_data_structures/juce_module_info"; sourceTree = "SOURCE_ROOT"; };
- E7E1C4F416CFA44BE7DD1A74 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyboardFocusTraverser.h"; path = "../../../../modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h"; sourceTree = "SOURCE_ROOT"; };
E7E1D60BC7AEF79AA7B65B7C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_String.cpp"; path = "../../../../modules/juce_core/text/juce_String.cpp"; sourceTree = "SOURCE_ROOT"; };
E82C9EF1A74D867BBFF2090D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RSAKey.cpp"; path = "../../../../modules/juce_cryptography/encryption/juce_RSAKey.cpp"; sourceTree = "SOURCE_ROOT"; };
E99F5A31373E9BDEAC40792F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_FileChooser.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_android_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -867,7 +865,6 @@
F8AC12B589FCB90E66D84729 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterprocessConnection.h"; path = "../../../../modules/juce_events/interprocess/juce_InterprocessConnection.h"; sourceTree = "SOURCE_ROOT"; };
F8D0F7C0A19B4ADB58454F16 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ScrollBar.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ScrollBar.cpp"; sourceTree = "SOURCE_ROOT"; };
F92A6000284C0FDA0A4845CA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PopupMenu.h"; path = "../../../../modules/juce_gui_basics/menus/juce_PopupMenu.h"; sourceTree = "SOURCE_ROOT"; };
- F94ACCC426AB439B871699E3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_TreeViewTypes.cpp"; path = "../../Source/Project/jucer_TreeViewTypes.cpp"; sourceTree = "SOURCE_ROOT"; };
F994D79D564B5F8D06E6766E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextPropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
F9D77BAA08889D69E0C43F25 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemTrayIconComponent.cpp"; path = "../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
FA04E39EE7E83D445AF9E406 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FillType.h"; path = "../../Source/ComponentEditor/paintelements/jucer_FillType.h"; sourceTree = "SOURCE_ROOT"; };
@@ -905,8 +902,9 @@
563091B0916AD9AAA36C7DC5 ); name = Application; sourceTree = ""; };
891F84627A03FA733F37A199 = { isa = PBXGroup; children = (
93D03B2BC76998A3BDA747E8,
- E7F7033084AC10FB77B0F77A,
- C2080119AEDFDE0D477756FA,
+ 8F8BF1A7130D858E0A239F9E,
+ 7B4E33B1E04139F359FB484B,
+ 9F75811FE7B5F8D1321BEC69,
C7B47372A9D5970E3D9A5400,
F797071D88542C813CF7222A,
7211101FFA28400ADBB1D47A,
@@ -919,12 +917,11 @@
BF3CEF080FA013E2778DCE90,
86E468DE6556BB2AD76A3D80,
E60E28D1B7491047DEA236AE,
- 4BAF0975F0958432B17D0D41,
- 922DB1DA01DAF63CE86B5E53,
+ 375AFDF06A908D89DEC5205F,
+ 47B49049B85EED74D29C9906,
+ 4F6365A0D2D51337151D85C3,
E70CA21960A64CCB835725FF,
- B8385E9A644BD3CD94876448,
- F94ACCC426AB439B871699E3,
- BBA6060656F685ED7FA52045 ); name = Project; sourceTree = ""; };
+ B8385E9A644BD3CD94876448 ); name = Project; sourceTree = ""; };
E345840128627D533DF908AC = { isa = PBXGroup; children = (
6E7353DFEA8825B515049ABB,
DBE0CDE1B017190ABBFF557C,
@@ -1961,15 +1958,12 @@
95B44E6C74B1DED31DBE37EB,
AA9D0B8E23F3D87A23DE9F8A,
244BA1BDA5FAA465EA3F9C6D,
- D1A1998A202A88C617C9AB73,
3FCA61C401007B243E2E9035,
5BC89E7905397ABECD25ACCD,
FBE57B26FE59319AA2E8B59D,
30B921C38DCEE787B294B746,
676D2E1E750E61AA2FAA335E,
- 9CBD0A9A700D28081C8182C5,
8012E6487639A7368E4C4470,
- B18DEBB2CBB335AFAE249E8E,
1F37544891EC8DBB5E500C1C,
110221CD5578153B528AD2BE,
CD4F7B119CE718BCE78D61F4,
diff --git a/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj b/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj
index 72174a5410..1e6f8cc511 100644
--- a/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj
+++ b/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj
@@ -149,8 +149,9 @@
-
-
+
+
+
@@ -163,12 +164,11 @@
-
-
+
+
+
-
-
diff --git a/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj b/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj
index c896e589b3..df844bda5d 100644
--- a/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj
+++ b/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj
@@ -149,8 +149,9 @@
-
-
+
+
+
@@ -163,12 +164,11 @@
-
-
+
+
+
-
-
diff --git a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
index d8b471f84c..60cc76ec38 100644
--- a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
+++ b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
@@ -134,15 +134,12 @@
-
-
-
@@ -1022,7 +1019,9 @@
-
+
+
+
@@ -1030,9 +1029,10 @@
-
+
+
+
-
diff --git a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
index 94e7790765..b111e8769d 100644
--- a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
+++ b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
@@ -268,9 +268,6 @@
The Introjucer\Application
-
- The Introjucer\Project
-
The Introjucer\Project
@@ -286,15 +283,9 @@
The Introjucer\Project
-
- The Introjucer\Project
-
The Introjucer\Project
-
- The Introjucer\Project
-
The Introjucer\Project Saving
@@ -1332,7 +1323,13 @@
The Introjucer\Project
-
+
+ The Introjucer\Project
+
+
+ The Introjucer\Project
+
+
The Introjucer\Project
@@ -1356,15 +1353,18 @@
The Introjucer\Project
-
+
+ The Introjucer\Project
+
+
+ The Introjucer\Project
+
+
The Introjucer\Project
The Introjucer\Project
-
- The Introjucer\Project
-
The Introjucer\Project Saving
diff --git a/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj
index 6b4fa9e332..320a643956 100644
--- a/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj
+++ b/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj
@@ -140,15 +140,12 @@
-
-
-
@@ -1028,7 +1025,9 @@
-
+
+
+
@@ -1036,9 +1035,10 @@
-
+
+
+
-
diff --git a/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj.filters b/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj.filters
index 94e7790765..b111e8769d 100644
--- a/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj.filters
+++ b/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj.filters
@@ -268,9 +268,6 @@
The Introjucer\Application
-
- The Introjucer\Project
-
The Introjucer\Project
@@ -286,15 +283,9 @@
The Introjucer\Project
-
- The Introjucer\Project
-
The Introjucer\Project
-
- The Introjucer\Project
-
The Introjucer\Project Saving
@@ -1332,7 +1323,13 @@
The Introjucer\Project
-
+
+ The Introjucer\Project
+
+
+ The Introjucer\Project
+
+
The Introjucer\Project
@@ -1356,15 +1353,18 @@
The Introjucer\Project
-
+
+ The Introjucer\Project
+
+
+ The Introjucer\Project
+
+
The Introjucer\Project
The Introjucer\Project
-
- The Introjucer\Project
-
The Introjucer\Project Saving
diff --git a/extras/Introjucer/Introjucer.jucer b/extras/Introjucer/Introjucer.jucer
index 1e69f866e7..54489bf2af 100644
--- a/extras/Introjucer/Introjucer.jucer
+++ b/extras/Introjucer/Introjucer.jucer
@@ -118,10 +118,12 @@
-
-
+
+
+
-
-
+
+
+
-
-
setComponentID (getUniqueName());
-
- ScopedPointer comp (content);
-
- if (ProjectContentComponent* pcc = getProjectContentComponent())
- pcc->setEditorComponent (new PropertyPanelViewport (comp.release()), nullptr);
-}
-
-void SettingsTreeViewItemBase::closeSettingsPage()
-{
- if (ProjectContentComponent* pcc = getProjectContentComponent())
- {
- if (PropertyPanelViewport* ppv = dynamic_cast (pcc->getEditorComponent()))
- if (ppv->viewport.getViewedComponent()->getComponentID() == getUniqueName())
- pcc->hideEditor();
- }
-}
-
-//==============================================================================
-namespace ProjectSettingsTreeClasses
-{
- class ConfigItem : public SettingsTreeViewItemBase
- {
- public:
- ConfigItem (const ProjectExporter::BuildConfiguration::Ptr& conf, const String& expName)
- : config (conf), exporterName (expName), configTree (config->config)
- {
- jassert (config != nullptr);
- configTree.addListener (this);
- }
-
- bool isMissing() override { return false; }
- bool canBeSelected() const override { return true; }
- bool mightContainSubItems() override { return false; }
- String getUniqueName() const override { return "config_" + config->getName(); }
- String getRenamingName() const override { return getDisplayName(); }
- String getDisplayName() const override { return config->getName(); }
- void setName (const String&) override {}
- Icon getIcon() const override { return Icon (getIcons().config, getContrastingColour (Colours::green, 0.5f)); }
-
- void showDocument() override { showSettingsPage (new SettingsComp (config, exporterName)); }
- void itemOpennessChanged (bool) override {}
-
- void deleteItem() override
- {
- if (AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, "Delete Configuration",
- "Are you sure you want to delete this configuration?"))
- {
- closeSettingsPage();
- config->removeFromExporter();
- }
- }
-
- void showPopupMenu() override
- {
- PopupMenu menu;
- menu.addItem (1, "Create a copy of this configuration");
- menu.addSeparator();
- menu.addItem (2, "Delete this configuration");
-
- launchPopupMenu (menu);
- }
-
- void handlePopupMenuResult (int resultCode) override
- {
- if (resultCode == 2)
- {
- deleteAllSelectedItems();
- }
- else if (resultCode == 1)
- {
- for (Project::ExporterIterator exporter (config->project); exporter.next();)
- {
- if (config->config.isAChildOf (exporter.exporter->settings))
- {
- exporter.exporter->addNewConfiguration (config);
- break;
- }
- }
- }
- }
-
- var getDragSourceDescription()
- {
- return getParentItem()->getUniqueName() + "||" + config->getName();
- }
-
- void valueTreePropertyChanged (ValueTree&, const Identifier&) override { repaintItem(); }
-
- private:
- ProjectExporter::BuildConfiguration::Ptr config;
- String exporterName;
- ValueTree configTree;
-
- //==============================================================================
- class SettingsComp : public Component
- {
- public:
- SettingsComp (ProjectExporter::BuildConfiguration* conf, const String& expName)
- {
- addAndMakeVisible (&group);
-
- PropertyListBuilder props;
- conf->createPropertyEditors (props);
- group.setProperties (props);
- group.setName (expName + " / " + conf->getName());
- parentSizeChanged();
- }
-
- void parentSizeChanged() override { updateSize (*this, group); }
-
- private:
- PropertyGroup group;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComp)
- };
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ConfigItem)
- };
-
- //==============================================================================
- class ExporterItem : public SettingsTreeViewItemBase
- {
- public:
- ExporterItem (Project& p, ProjectExporter* e, int index)
- : project (p), exporter (e), configListTree (exporter->getConfigurations()),
- exporterIndex (index)
- {
- configListTree.addListener (this);
- jassert (exporter != nullptr);
- }
-
- bool canBeSelected() const override { return true; }
- bool mightContainSubItems() override { return exporter->getNumConfigurations() > 0; }
- String getUniqueName() const override { return "exporter_" + String (exporterIndex); }
- String getRenamingName() const override { return getDisplayName(); }
- String getDisplayName() const override { return exporter->getName(); }
- void setName (const String&) override {}
- bool isMissing() override { return false; }
- Icon getIcon() const override { return Icon (getIcons().exporter, getContrastingColour (0.5f)); }
- void showDocument() override { showSettingsPage (new SettingsComp (exporter)); }
-
- void deleteItem()
- {
- if (AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, "Delete Exporter",
- "Are you sure you want to delete this export target?"))
- {
- closeSettingsPage();
- ValueTree parent (exporter->settings.getParent());
- parent.removeChild (exporter->settings, project.getUndoManagerFor (parent));
- }
- }
-
- void addSubItems()
- {
- for (ProjectExporter::ConfigIterator config (*exporter); config.next();)
- addSubItem (new ConfigItem (config.config, exporter->getName()));
- }
-
- void showPopupMenu()
- {
- PopupMenu menu;
- menu.addItem (1, "Add a new configuration");
- menu.addSeparator();
- menu.addItem (2, "Delete this exporter");
-
- launchPopupMenu (menu);
- }
-
- void handlePopupMenuResult (int resultCode)
- {
- if (resultCode == 2)
- deleteAllSelectedItems();
- else if (resultCode == 1)
- exporter->addNewConfiguration (nullptr);
- }
-
- var getDragSourceDescription()
- {
- return getParentItem()->getUniqueName() + "/" + String (exporterIndex);
- }
-
- bool isInterestedInDragSource (const DragAndDropTarget::SourceDetails& dragSourceDetails)
- {
- return dragSourceDetails.description.toString().startsWith (getUniqueName());
- }
-
- void itemDropped (const DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex)
- {
- const int oldIndex = indexOfConfig (dragSourceDetails.description.toString().fromLastOccurrenceOf ("||", false, false));
-
- if (oldIndex >= 0)
- configListTree.moveChild (oldIndex, insertIndex, project.getUndoManagerFor (configListTree));
- }
-
- int indexOfConfig (const String& configName)
- {
- int i = 0;
- for (ProjectExporter::ConfigIterator config (*exporter); config.next(); ++i)
- if (config->getName() == configName)
- return i;
-
- return -1;
- }
-
- //==============================================================================
- void valueTreeChildAdded (ValueTree& parentTree, ValueTree&) override { refreshIfNeeded (parentTree); }
- void valueTreeChildRemoved (ValueTree& parentTree, ValueTree&) override { refreshIfNeeded (parentTree); }
- void valueTreeChildOrderChanged (ValueTree& parentTree) override { refreshIfNeeded (parentTree); }
-
- void refreshIfNeeded (ValueTree& changedTree)
- {
- if (changedTree == configListTree)
- refreshSubItems();
- }
-
- private:
- Project& project;
- ScopedPointer exporter;
- ValueTree configListTree;
- int exporterIndex;
-
- //==============================================================================
- class SettingsComp : public Component
- {
- public:
- SettingsComp (ProjectExporter* exp)
- {
- addAndMakeVisible (&group);
-
- PropertyListBuilder props;
- exp->createPropertyEditors (props);
- group.setProperties (props);
- group.setName ("Export target: " + exp->getName());
- parentSizeChanged();
- }
-
- void parentSizeChanged() override { updateSize (*this, group); }
-
- private:
- PropertyGroup group;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComp)
- };
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ExporterItem)
- };
-
- //==============================================================================
- class ModulesItem : public SettingsTreeViewItemBase
- {
- public:
- ModulesItem (Project& p) : project (p) {}
-
- bool isModulesList() const override { return true; }
- bool canBeSelected() const override { return true; }
- bool mightContainSubItems() override { return false; }
- String getUniqueName() const override { return "modules"; }
- String getRenamingName() const override { return getDisplayName(); }
- String getDisplayName() const override { return "Modules"; }
- void setName (const String&) override {}
- bool isMissing() override { return false; }
- Icon getIcon() const override { return Icon (getIcons().graph, getContrastingColour (Colours::red, 0.5f)); }
- void showDocument() override { showSettingsPage (new SettingsComp (project)); }
-
- private:
- Project& project;
-
- //==============================================================================
- class SettingsComp : public Component
- {
- public:
- SettingsComp (Project& p) : project (p)
- {
- addAndMakeVisible (&group);
-
- PropertyListBuilder props;
- props.add (new ModulesPanel (project));
- group.setProperties (props);
- group.setName ("Modules");
-
- parentSizeChanged();
- }
-
- void parentSizeChanged() override
- {
- 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 SettingsTreeViewItemBase
- {
- public:
- RootItem (Project& p)
- : project (p), exportersTree (p.getExporters())
- {
- exportersTree.addListener (this);
- }
-
- bool isProjectSettings() const override { return true; }
- String getRenamingName() const override { return getDisplayName(); }
- String getDisplayName() const override { return project.getTitle(); }
- void setName (const String&) override {}
- bool isMissing() override { return false; }
- Icon getIcon() const override { return project.getMainGroup().getIcon().withContrastingColourTo (getBackgroundColour()); }
- void showDocument() override { showSettingsPage (new SettingsComp (project)); }
- bool canBeSelected() const override { return true; }
- bool mightContainSubItems() override { return project.getNumExporters() > 0; }
- String getUniqueName() const override { return "config_root"; }
-
- void addSubItems() override
- {
- addSubItem (new ModulesItem (project));
- IntrojucerApp::getApp().addExtraConfigItems (project, *this);
-
- int i = 0;
- for (Project::ExporterIterator exporter (project); exporter.next(); ++i)
- addSubItem (new ExporterItem (project, exporter.exporter.release(), i));
- }
-
- void showPopupMenu() override
- {
- PopupMenu menu;
-
- const StringArray exporters (ProjectExporter::getExporterNames());
-
- for (int i = 0; i < exporters.size(); ++i)
- menu.addItem (i + 1, "Create a new " + exporters[i] + " target");
-
- launchPopupMenu (menu);
- }
-
- void handlePopupMenuResult (int resultCode) override
- {
- if (resultCode > 0)
- {
- String exporterName (ProjectExporter::getExporterNames() [resultCode - 1]);
-
- if (exporterName.isNotEmpty())
- project.addNewExporter (exporterName);
- }
- }
-
- bool isInterestedInDragSource (const DragAndDropTarget::SourceDetails& dragSourceDetails) override
- {
- return dragSourceDetails.description.toString().startsWith (getUniqueName());
- }
-
- void itemDropped (const DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex) override
- {
- int oldIndex = dragSourceDetails.description.toString().getTrailingIntValue();
- exportersTree.moveChild (oldIndex, jmax (0, insertIndex - 1), project.getUndoManagerFor (exportersTree));
- }
-
- //==============================================================================
- void valueTreeChildAdded (ValueTree& parentTree, ValueTree&) override { refreshIfNeeded (parentTree); }
- void valueTreeChildRemoved (ValueTree& parentTree, ValueTree&) override { refreshIfNeeded (parentTree); }
- void valueTreeChildOrderChanged (ValueTree& parentTree) override { refreshIfNeeded (parentTree); }
-
- void refreshIfNeeded (ValueTree& changedTree)
- {
- if (changedTree == exportersTree)
- refreshSubItems();
- }
-
- private:
- Project& project;
- ValueTree exportersTree;
-
- //==============================================================================
- class SettingsComp : public Component,
- private ChangeListener
- {
- public:
- SettingsComp (Project& p) : project (p)
- {
- addAndMakeVisible (&group);
-
- updatePropertyList();
- project.addChangeListener (this);
- }
-
- ~SettingsComp()
- {
- project.removeChangeListener (this);
- }
-
- void parentSizeChanged() override
- {
- updateSize (*this, group);
- }
-
- void updatePropertyList()
- {
- PropertyListBuilder props;
- project.createPropertyEditors (props);
- group.setProperties (props);
- group.setName ("Project Settings");
-
- lastProjectType = project.getProjectTypeValue().getValue();
- parentSizeChanged();
- }
-
- void changeListenerCallback (ChangeBroadcaster*) override
- {
- if (lastProjectType != project.getProjectTypeValue().getValue())
- updatePropertyList();
- }
-
- private:
- Project& project;
- var lastProjectType;
- PropertyGroup group;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComp)
- };
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RootItem)
- };
-}
-
-JucerTreeViewBase* createProjectConfigTreeViewRoot (Project& project)
-{
- return new ProjectSettingsTreeClasses::RootItem (project);
-}
diff --git a/extras/Introjucer/Source/Project/jucer_ConfigPage.h b/extras/Introjucer/Source/Project/jucer_ConfigPage.h
deleted file mode 100644
index 8a8f172abf..0000000000
--- a/extras/Introjucer/Source/Project/jucer_ConfigPage.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2013 - Raw Material Software 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.
-
- ==============================================================================
-*/
-
-#ifndef __JUCER_CONFIGPAGE_JUCEHEADER__
-#define __JUCER_CONFIGPAGE_JUCEHEADER__
-
-#include "jucer_Project.h"
-#include "../Utility/jucer_JucerTreeViewBase.h"
-
-//==============================================================================
-JucerTreeViewBase* createProjectConfigTreeViewRoot (Project& project);
-
-
-//==============================================================================
-class PropertyGroup : public Component
-{
-public:
- PropertyGroup() {}
-
- void setProperties (const PropertyListBuilder& newProps)
- {
- properties.clear();
- properties.addArray (newProps.components);
-
- for (int i = properties.size(); --i >= 0;)
- addAndMakeVisible (properties.getUnchecked(i));
- }
-
- int updateSize (int x, int y, int width)
- {
- int height = 38;
-
- for (int i = 0; i < properties.size(); ++i)
- {
- PropertyComponent* pp = properties.getUnchecked(i);
- pp->setBounds (10, height, width - 20, pp->getPreferredHeight());
- height += pp->getHeight();
- }
-
- height += 16;
- setBounds (x, y, width, height);
- return height;
- }
-
- void paint (Graphics& g) override
- {
- const Colour bkg (findColour (mainBackgroundColourId));
-
- g.setColour (Colours::white.withAlpha (0.35f));
- g.fillRect (0, 30, getWidth(), getHeight() - 38);
-
- g.setFont (Font (15.0f, Font::bold));
- g.setColour (bkg.contrasting (0.7f));
- g.drawFittedText (getName(), 12, 0, getWidth() - 16, 25, Justification::bottomLeft, 1);
- }
-
- OwnedArray properties;
-
-private:
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PropertyGroup)
-};
-
-//==============================================================================
-class PropertyPanelViewport : public Component
-{
-public:
- PropertyPanelViewport (Component* content)
- {
- addAndMakeVisible (&viewport);
- addAndMakeVisible (&rolloverHelp);
- viewport.setViewedComponent (content, true);
- }
-
- void paint (Graphics& g) override
- {
- IntrojucerLookAndFeel::fillWithBackgroundTexture (*this, g);
- }
-
- void resized() override
- {
- Rectangle r (getLocalBounds());
- rolloverHelp.setBounds (r.removeFromBottom (70).reduced (10, 0));
- viewport.setBounds (r);
- }
-
- Viewport viewport;
- RolloverHelpComp rolloverHelp;
-
-private:
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PropertyPanelViewport)
-};
-
-//==============================================================================
-class SettingsTreeViewItemBase : public JucerTreeViewBase,
- public ValueTree::Listener
-{
-public:
- SettingsTreeViewItemBase() {}
-
- void showSettingsPage (Component* content);
- void closeSettingsPage();
-
- void deleteAllSelectedItems() override
- {
- TreeView* const tree = getOwnerView();
- jassert (tree->getNumSelectedItems() <= 1); // multi-select should be disabled
-
- if (SettingsTreeViewItemBase* s = dynamic_cast (tree->getSelectedItem (0)))
- s->deleteItem();
- }
-
- void itemOpennessChanged (bool isNowOpen) override
- {
- if (isNowOpen)
- refreshSubItems();
- }
-
- void valueTreePropertyChanged (ValueTree&, const Identifier&) override {}
- void valueTreeChildAdded (ValueTree&, ValueTree&) override {}
- void valueTreeChildRemoved (ValueTree&, ValueTree&) override {}
- void valueTreeChildOrderChanged (ValueTree&) override {}
- void valueTreeParentChanged (ValueTree&) override {}
-
- virtual bool isProjectSettings() const { return false; }
- virtual bool isModulesList() const { return false; }
-
- static void updateSize (Component& comp, PropertyGroup& group)
- {
- const int width = jmax (550, comp.getParentWidth() - 20);
-
- int y = 0;
- y += group.updateSize (12, y, width - 12);
-
- comp.setSize (width, y);
- }
-};
-
-
-#endif // __JUCER_CONFIGPAGE_JUCEHEADER__
diff --git a/extras/Introjucer/Source/Project/jucer_ConfigTree_Base.h b/extras/Introjucer/Source/Project/jucer_ConfigTree_Base.h
new file mode 100644
index 0000000000..c497352321
--- /dev/null
+++ b/extras/Introjucer/Source/Project/jucer_ConfigTree_Base.h
@@ -0,0 +1,296 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2013 - Raw Material Software 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 PropertyGroupComponent : public Component
+{
+public:
+ PropertyGroupComponent() {}
+
+ void setProperties (const PropertyListBuilder& newProps)
+ {
+ properties.clear();
+ properties.addArray (newProps.components);
+
+ for (int i = properties.size(); --i >= 0;)
+ addAndMakeVisible (properties.getUnchecked(i));
+ }
+
+ int updateSize (int x, int y, int width)
+ {
+ int height = 38;
+
+ for (int i = 0; i < properties.size(); ++i)
+ {
+ PropertyComponent* pp = properties.getUnchecked(i);
+ pp->setBounds (10, height, width - 20, pp->getPreferredHeight());
+ height += pp->getHeight();
+ }
+
+ height += 16;
+ setBounds (x, y, width, height);
+ return height;
+ }
+
+ void paint (Graphics& g) override
+ {
+ const Colour bkg (findColour (mainBackgroundColourId));
+
+ g.setColour (Colours::white.withAlpha (0.35f));
+ g.fillRect (0, 30, getWidth(), getHeight() - 38);
+
+ g.setFont (Font (15.0f, Font::bold));
+ g.setColour (bkg.contrasting (0.7f));
+ g.drawFittedText (getName(), 12, 0, getWidth() - 16, 25, Justification::bottomLeft, 1);
+ }
+
+ OwnedArray properties;
+
+private:
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PropertyGroupComponent)
+};
+
+
+//==============================================================================
+class ConfigTreeItemBase : public JucerTreeViewBase,
+ public ValueTree::Listener
+{
+public:
+ ConfigTreeItemBase() {}
+
+ void showSettingsPage (Component* content)
+ {
+ content->setComponentID (getUniqueName());
+
+ ScopedPointer comp (content);
+
+ if (ProjectContentComponent* pcc = getProjectContentComponent())
+ pcc->setEditorComponent (new PropertyPanelViewport (comp.release()), nullptr);
+ }
+
+ void closeSettingsPage()
+ {
+ if (ProjectContentComponent* pcc = getProjectContentComponent())
+ {
+ if (PropertyPanelViewport* ppv = dynamic_cast (pcc->getEditorComponent()))
+ if (ppv->viewport.getViewedComponent()->getComponentID() == getUniqueName())
+ pcc->hideEditor();
+ }
+ }
+
+ void deleteAllSelectedItems() override
+ {
+ TreeView* const tree = getOwnerView();
+ jassert (tree->getNumSelectedItems() <= 1); // multi-select should be disabled
+
+ if (ConfigTreeItemBase* s = dynamic_cast (tree->getSelectedItem (0)))
+ s->deleteItem();
+ }
+
+ void itemOpennessChanged (bool isNowOpen) override
+ {
+ if (isNowOpen)
+ refreshSubItems();
+ }
+
+ void valueTreePropertyChanged (ValueTree&, const Identifier&) override {}
+ void valueTreeChildAdded (ValueTree&, ValueTree&) override {}
+ void valueTreeChildRemoved (ValueTree&, ValueTree&) override {}
+ void valueTreeChildOrderChanged (ValueTree&) override {}
+ void valueTreeParentChanged (ValueTree&) override {}
+
+ virtual bool isProjectSettings() const { return false; }
+ virtual bool isModulesList() const { return false; }
+
+ static void updateSize (Component& comp, PropertyGroupComponent& group)
+ {
+ const int width = jmax (550, comp.getParentWidth() - 20);
+
+ int y = 0;
+ y += group.updateSize (12, y, width - 12);
+
+ comp.setSize (width, y);
+ }
+
+private:
+ //==============================================================================
+ class PropertyPanelViewport : public Component
+ {
+ public:
+ PropertyPanelViewport (Component* content)
+ {
+ addAndMakeVisible (&viewport);
+ addAndMakeVisible (&rolloverHelp);
+ viewport.setViewedComponent (content, true);
+ }
+
+ void paint (Graphics& g) override
+ {
+ IntrojucerLookAndFeel::fillWithBackgroundTexture (*this, g);
+ }
+
+ void resized() override
+ {
+ Rectangle r (getLocalBounds());
+ rolloverHelp.setBounds (r.removeFromBottom (70).reduced (10, 0));
+ viewport.setBounds (r);
+ }
+
+ Viewport viewport;
+ RolloverHelpComp rolloverHelp;
+
+ private:
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PropertyPanelViewport)
+ };
+};
+
+//==============================================================================
+class RootItem : public ConfigTreeItemBase
+{
+public:
+ RootItem (Project& p)
+ : project (p), exportersTree (p.getExporters())
+ {
+ exportersTree.addListener (this);
+ }
+
+ bool isProjectSettings() const override { return true; }
+ String getRenamingName() const override { return getDisplayName(); }
+ String getDisplayName() const override { return project.getTitle(); }
+ void setName (const String&) override {}
+ bool isMissing() override { return false; }
+ Icon getIcon() const override { return project.getMainGroup().getIcon().withContrastingColourTo (getBackgroundColour()); }
+ void showDocument() override { showSettingsPage (new SettingsComp (project)); }
+ bool canBeSelected() const override { return true; }
+ bool mightContainSubItems() override { return project.getNumExporters() > 0; }
+ String getUniqueName() const override { return "config_root"; }
+
+ void addSubItems() override
+ {
+ addSubItem (new ModulesItem (project));
+ IntrojucerApp::getApp().addExtraConfigItems (project, *this);
+
+ int i = 0;
+ for (Project::ExporterIterator exporter (project); exporter.next(); ++i)
+ addSubItem (new ExporterItem (project, exporter.exporter.release(), i));
+ }
+
+ void showPopupMenu() override
+ {
+ PopupMenu menu;
+
+ const StringArray exporters (ProjectExporter::getExporterNames());
+
+ for (int i = 0; i < exporters.size(); ++i)
+ menu.addItem (i + 1, "Create a new " + exporters[i] + " target");
+
+ launchPopupMenu (menu);
+ }
+
+ void handlePopupMenuResult (int resultCode) override
+ {
+ if (resultCode > 0)
+ {
+ String exporterName (ProjectExporter::getExporterNames() [resultCode - 1]);
+
+ if (exporterName.isNotEmpty())
+ project.addNewExporter (exporterName);
+ }
+ }
+
+ bool isInterestedInDragSource (const DragAndDropTarget::SourceDetails& dragSourceDetails) override
+ {
+ return dragSourceDetails.description.toString().startsWith (getUniqueName());
+ }
+
+ void itemDropped (const DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex) override
+ {
+ int oldIndex = dragSourceDetails.description.toString().getTrailingIntValue();
+ exportersTree.moveChild (oldIndex, jmax (0, insertIndex - 1), project.getUndoManagerFor (exportersTree));
+ }
+
+ //==============================================================================
+ void valueTreeChildAdded (ValueTree& parentTree, ValueTree&) override { refreshIfNeeded (parentTree); }
+ void valueTreeChildRemoved (ValueTree& parentTree, ValueTree&) override { refreshIfNeeded (parentTree); }
+ void valueTreeChildOrderChanged (ValueTree& parentTree) override { refreshIfNeeded (parentTree); }
+
+ void refreshIfNeeded (ValueTree& changedTree)
+ {
+ if (changedTree == exportersTree)
+ refreshSubItems();
+ }
+
+private:
+ Project& project;
+ ValueTree exportersTree;
+
+ //==============================================================================
+ class SettingsComp : public Component,
+ private ChangeListener
+ {
+ public:
+ SettingsComp (Project& p) : project (p)
+ {
+ addAndMakeVisible (&group);
+
+ updatePropertyList();
+ project.addChangeListener (this);
+ }
+
+ ~SettingsComp()
+ {
+ project.removeChangeListener (this);
+ }
+
+ void parentSizeChanged() override
+ {
+ updateSize (*this, group);
+ }
+
+ void updatePropertyList()
+ {
+ PropertyListBuilder props;
+ project.createPropertyEditors (props);
+ group.setProperties (props);
+ group.setName ("Project Settings");
+
+ lastProjectType = project.getProjectTypeValue().getValue();
+ parentSizeChanged();
+ }
+
+ void changeListenerCallback (ChangeBroadcaster*) override
+ {
+ if (lastProjectType != project.getProjectTypeValue().getValue())
+ updatePropertyList();
+ }
+
+ private:
+ Project& project;
+ var lastProjectType;
+ PropertyGroupComponent group;
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComp)
+ };
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RootItem)
+};
diff --git a/extras/Introjucer/Source/Project/jucer_ConfigTree_Exporter.h b/extras/Introjucer/Source/Project/jucer_ConfigTree_Exporter.h
new file mode 100644
index 0000000000..2a6a8cb5c4
--- /dev/null
+++ b/extras/Introjucer/Source/Project/jucer_ConfigTree_Exporter.h
@@ -0,0 +1,251 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2013 - Raw Material Software 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 ExporterItem : public ConfigTreeItemBase
+{
+public:
+ ExporterItem (Project& p, ProjectExporter* e, int index)
+ : project (p), exporter (e), configListTree (exporter->getConfigurations()),
+ exporterIndex (index)
+ {
+ configListTree.addListener (this);
+ jassert (exporter != nullptr);
+ }
+
+ bool canBeSelected() const override { return true; }
+ bool mightContainSubItems() override { return exporter->getNumConfigurations() > 0; }
+ String getUniqueName() const override { return "exporter_" + String (exporterIndex); }
+ String getRenamingName() const override { return getDisplayName(); }
+ String getDisplayName() const override { return exporter->getName(); }
+ void setName (const String&) override {}
+ bool isMissing() override { return false; }
+ Icon getIcon() const override { return Icon (getIcons().exporter, getContrastingColour (0.5f)); }
+ void showDocument() override { showSettingsPage (new SettingsComp (exporter)); }
+
+ void deleteItem()
+ {
+ if (AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, "Delete Exporter",
+ "Are you sure you want to delete this export target?"))
+ {
+ closeSettingsPage();
+ ValueTree parent (exporter->settings.getParent());
+ parent.removeChild (exporter->settings, project.getUndoManagerFor (parent));
+ }
+ }
+
+ void addSubItems()
+ {
+ for (ProjectExporter::ConfigIterator config (*exporter); config.next();)
+ addSubItem (new ConfigItem (config.config, exporter->getName()));
+ }
+
+ void showPopupMenu()
+ {
+ PopupMenu menu;
+ menu.addItem (1, "Add a new configuration");
+ menu.addSeparator();
+ menu.addItem (2, "Delete this exporter");
+
+ launchPopupMenu (menu);
+ }
+
+ void handlePopupMenuResult (int resultCode)
+ {
+ if (resultCode == 2)
+ deleteAllSelectedItems();
+ else if (resultCode == 1)
+ exporter->addNewConfiguration (nullptr);
+ }
+
+ var getDragSourceDescription()
+ {
+ return getParentItem()->getUniqueName() + "/" + String (exporterIndex);
+ }
+
+ bool isInterestedInDragSource (const DragAndDropTarget::SourceDetails& dragSourceDetails)
+ {
+ return dragSourceDetails.description.toString().startsWith (getUniqueName());
+ }
+
+ void itemDropped (const DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex)
+ {
+ const int oldIndex = indexOfConfig (dragSourceDetails.description.toString().fromLastOccurrenceOf ("||", false, false));
+
+ if (oldIndex >= 0)
+ configListTree.moveChild (oldIndex, insertIndex, project.getUndoManagerFor (configListTree));
+ }
+
+ int indexOfConfig (const String& configName)
+ {
+ int i = 0;
+ for (ProjectExporter::ConfigIterator config (*exporter); config.next(); ++i)
+ if (config->getName() == configName)
+ return i;
+
+ return -1;
+ }
+
+ //==============================================================================
+ void valueTreeChildAdded (ValueTree& parentTree, ValueTree&) override { refreshIfNeeded (parentTree); }
+ void valueTreeChildRemoved (ValueTree& parentTree, ValueTree&) override { refreshIfNeeded (parentTree); }
+ void valueTreeChildOrderChanged (ValueTree& parentTree) override { refreshIfNeeded (parentTree); }
+
+ void refreshIfNeeded (ValueTree& changedTree)
+ {
+ if (changedTree == configListTree)
+ refreshSubItems();
+ }
+
+private:
+ Project& project;
+ ScopedPointer exporter;
+ ValueTree configListTree;
+ int exporterIndex;
+
+ //==============================================================================
+ class SettingsComp : public Component
+ {
+ public:
+ SettingsComp (ProjectExporter* exp)
+ {
+ addAndMakeVisible (&group);
+
+ PropertyListBuilder props;
+ exp->createPropertyEditors (props);
+ group.setProperties (props);
+ group.setName ("Export target: " + exp->getName());
+ parentSizeChanged();
+ }
+
+ void parentSizeChanged() override { updateSize (*this, group); }
+
+ private:
+ PropertyGroupComponent group;
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComp)
+ };
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ExporterItem)
+};
+
+
+//==============================================================================
+class ConfigItem : public ConfigTreeItemBase
+{
+public:
+ ConfigItem (const ProjectExporter::BuildConfiguration::Ptr& conf, const String& expName)
+ : config (conf), exporterName (expName), configTree (config->config)
+ {
+ jassert (config != nullptr);
+ configTree.addListener (this);
+ }
+
+ bool isMissing() override { return false; }
+ bool canBeSelected() const override { return true; }
+ bool mightContainSubItems() override { return false; }
+ String getUniqueName() const override { return "config_" + config->getName(); }
+ String getRenamingName() const override { return getDisplayName(); }
+ String getDisplayName() const override { return config->getName(); }
+ void setName (const String&) override {}
+ Icon getIcon() const override { return Icon (getIcons().config, getContrastingColour (Colours::green, 0.5f)); }
+
+ void showDocument() override { showSettingsPage (new SettingsComp (config, exporterName)); }
+ void itemOpennessChanged (bool) override {}
+
+ void deleteItem() override
+ {
+ if (AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, "Delete Configuration",
+ "Are you sure you want to delete this configuration?"))
+ {
+ closeSettingsPage();
+ config->removeFromExporter();
+ }
+ }
+
+ void showPopupMenu() override
+ {
+ PopupMenu menu;
+ menu.addItem (1, "Create a copy of this configuration");
+ menu.addSeparator();
+ menu.addItem (2, "Delete this configuration");
+
+ launchPopupMenu (menu);
+ }
+
+ void handlePopupMenuResult (int resultCode) override
+ {
+ if (resultCode == 2)
+ {
+ deleteAllSelectedItems();
+ }
+ else if (resultCode == 1)
+ {
+ for (Project::ExporterIterator exporter (config->project); exporter.next();)
+ {
+ if (config->config.isAChildOf (exporter.exporter->settings))
+ {
+ exporter.exporter->addNewConfiguration (config);
+ break;
+ }
+ }
+ }
+ }
+
+ var getDragSourceDescription()
+ {
+ return getParentItem()->getUniqueName() + "||" + config->getName();
+ }
+
+ void valueTreePropertyChanged (ValueTree&, const Identifier&) override { repaintItem(); }
+
+private:
+ ProjectExporter::BuildConfiguration::Ptr config;
+ String exporterName;
+ ValueTree configTree;
+
+ //==============================================================================
+ class SettingsComp : public Component
+ {
+ public:
+ SettingsComp (ProjectExporter::BuildConfiguration* conf, const String& expName)
+ {
+ addAndMakeVisible (&group);
+
+ PropertyListBuilder props;
+ conf->createPropertyEditors (props);
+ group.setProperties (props);
+ group.setName (expName + " / " + conf->getName());
+ parentSizeChanged();
+ }
+
+ void parentSizeChanged() override { updateSize (*this, group); }
+
+ private:
+ PropertyGroupComponent group;
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComp)
+ };
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ConfigItem)
+};
diff --git a/extras/Introjucer/Source/Project/jucer_ConfigTree_Modules.h b/extras/Introjucer/Source/Project/jucer_ConfigTree_Modules.h
new file mode 100644
index 0000000000..aa2951cab9
--- /dev/null
+++ b/extras/Introjucer/Source/Project/jucer_ConfigTree_Modules.h
@@ -0,0 +1,73 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2013 - Raw Material Software 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 ModulesItem : public ConfigTreeItemBase
+{
+public:
+ ModulesItem (Project& p) : project (p) {}
+
+ bool isModulesList() const override { return true; }
+ bool canBeSelected() const override { return true; }
+ bool mightContainSubItems() override { return false; }
+ String getUniqueName() const override { return "modules"; }
+ String getRenamingName() const override { return getDisplayName(); }
+ String getDisplayName() const override { return "Modules"; }
+ void setName (const String&) override {}
+ bool isMissing() override { return false; }
+ Icon getIcon() const override { return Icon (getIcons().graph, getContrastingColour (Colours::red, 0.5f)); }
+ void showDocument() override { showSettingsPage (new SettingsComp (project)); }
+
+private:
+ Project& project;
+
+ class SettingsComp : public Component
+ {
+ public:
+ SettingsComp (Project& p) : project (p)
+ {
+ addAndMakeVisible (&group);
+
+ PropertyListBuilder props;
+ props.add (new ModulesPanel (project));
+ group.setProperties (props);
+ group.setName ("Modules");
+
+ parentSizeChanged();
+ }
+
+ void parentSizeChanged() override
+ {
+ updateSize (*this, group);
+ }
+
+ private:
+ Project& project;
+ var lastProjectType;
+ PropertyGroupComponent group;
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComp)
+ };
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModulesItem)
+};
diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp
index 8c4a95a2d0..d8a52ee386 100644
--- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp
+++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp
@@ -26,32 +26,45 @@
#include "../Application/jucer_MainWindow.h"
#include "../Application/jucer_Application.h"
#include "../Code Editor/jucer_SourceCodeEditor.h"
-#include "jucer_ConfigPage.h"
-#include "jucer_TreeViewTypes.h"
#include "../Project Saving/jucer_ProjectExporter.h"
#include "../Utility/jucer_TranslationTool.h"
+#include "../Utility/jucer_JucerTreeViewBase.h"
+#include "jucer_NewFileWizard.h"
+#include "jucer_GroupInformationComponent.h"
+#include "jucer_ModulesPanel.h"
//==============================================================================
-class FileTreeTab : public TreePanelBase
+class FileTreePanel : public TreePanelBase
{
public:
- FileTreeTab (Project& p)
+ FileTreePanel (Project& p)
: TreePanelBase (&p, "fileTreeState")
{
tree.setMultiSelectEnabled (true);
- setRoot (new GroupTreeViewItem (p.getMainGroup()));
+ setRoot (new GroupItem (p.getMainGroup()));
}
+
+ void updateMissingFileStatuses()
+ {
+ if (ProjectTreeItemBase* p = dynamic_cast (rootItem.get()))
+ p->checkFileStatus();
+ }
+
+private:
+ #include "jucer_ProjectTree_Base.h"
+ #include "jucer_ProjectTree_Group.h"
+ #include "jucer_ProjectTree_File.h"
};
//==============================================================================
-class ConfigTreeTab : public TreePanelBase
+class ConfigTreePanel : public TreePanelBase
{
public:
- ConfigTreeTab (Project& p)
+ ConfigTreePanel (Project& p)
: TreePanelBase (&p, "settingsTreeState")
{
tree.setMultiSelectEnabled (false);
- setRoot (createProjectConfigTreeViewRoot (p));
+ setRoot (new RootItem (p));
if (tree.getNumSelectedItems() == 0)
tree.getRootItem()->setSelected (true, true);
@@ -85,7 +98,28 @@ public:
tree.setBounds (r);
}
+ void showProjectSettings()
+ {
+ if (ConfigTreeItemBase* root = dynamic_cast (rootItem.get()))
+ if (root->isProjectSettings())
+ root->setSelected (true, true);
+ }
+
+ void showModules()
+ {
+ if (ConfigTreeItemBase* root = dynamic_cast (rootItem.get()))
+ if (root->isProjectSettings())
+ if (ConfigTreeItemBase* mods = dynamic_cast (root->getSubItem (0)))
+ if (mods->isModulesList())
+ mods->setSelected (true, true);
+ }
+
TextButton openProjectButton, saveAndOpenButton;
+
+private:
+ #include "jucer_ConfigTree_Base.h"
+ #include "jucer_ConfigTree_Modules.h"
+ #include "jucer_ConfigTree_Exporter.h"
};
//==============================================================================
@@ -249,8 +283,8 @@ void ProjectContentComponent::createProjectTabs()
jassert (project != nullptr);
const Colour tabColour (Colours::transparentBlack);
- treeViewTabs.addTab ("Files", tabColour, new FileTreeTab (*project), true);
- treeViewTabs.addTab ("Config", tabColour, new ConfigTreeTab (*project), true);
+ treeViewTabs.addTab ("Files", tabColour, new FileTreePanel (*project), true);
+ treeViewTabs.addTab ("Config", tabColour, new ConfigTreePanel (*project), true);
}
void ProjectContentComponent::deleteProjectTabs()
@@ -269,22 +303,6 @@ void ProjectContentComponent::deleteProjectTabs()
treeViewTabs.clearTabs();
}
-TreeView* ProjectContentComponent::getFilesTreeView() const
-{
- if (FileTreeTab* ft = dynamic_cast (treeViewTabs.getTabContentComponent (0)))
- return &(ft->tree);
-
- return nullptr;
-}
-
-ProjectTreeViewBase* ProjectContentComponent::getFilesTreeRoot() const
-{
- if (TreeView* tv = getFilesTreeView())
- return dynamic_cast (tv->getRootItem());
-
- return nullptr;
-}
-
void ProjectContentComponent::saveTreeViewState()
{
for (int i = treeViewTabs.getNumTabs(); --i >= 0;)
@@ -329,8 +347,8 @@ void ProjectContentComponent::changeListenerCallback (ChangeBroadcaster*)
void ProjectContentComponent::updateMissingFileStatuses()
{
- if (ProjectTreeViewBase* p = getFilesTreeRoot())
- p->checkFileStatus();
+ if (FileTreePanel* tree = dynamic_cast (treeViewTabs.getTabContentComponent (0)))
+ tree->updateMissingFileStatuses();
}
bool ProjectContentComponent::showEditorForFile (const File& f, bool grabFocus)
@@ -507,22 +525,16 @@ void ProjectContentComponent::showProjectSettings()
{
showConfigTab();
- if (TreePanelBase* const tree = dynamic_cast (treeViewTabs.getCurrentContentComponent()))
- if (SettingsTreeViewItemBase* root = dynamic_cast (tree->rootItem.get()))
- if (root->isProjectSettings())
- root->setSelected (true, true);
+ if (ConfigTreePanel* const tree = dynamic_cast (treeViewTabs.getCurrentContentComponent()))
+ tree->showProjectSettings();
}
void ProjectContentComponent::showModules()
{
showConfigTab();
- if (TreePanelBase* const tree = dynamic_cast (treeViewTabs.getCurrentContentComponent()))
- if (SettingsTreeViewItemBase* root = dynamic_cast (tree->rootItem.get()))
- if (root->isProjectSettings())
- if (SettingsTreeViewItemBase* mods = dynamic_cast (root->getSubItem (0)))
- if (mods->isModulesList())
- mods->setSelected (true, true);
+ if (ConfigTreePanel* const tree = dynamic_cast (treeViewTabs.getCurrentContentComponent()))
+ tree->showModules();
}
StringArray ProjectContentComponent::getExportersWhichCanLaunch() const
diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h
index 58f9c20165..92e39c9463 100644
--- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h
+++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h
@@ -27,7 +27,7 @@
#include "jucer_Project.h"
#include "../Application/jucer_OpenDocumentManager.h"
-class ProjectTreeViewBase;
+
//==============================================================================
/**
@@ -119,8 +119,6 @@ protected:
void documentAboutToClose (OpenDocumentManager::Document*) override;
void changeListenerCallback (ChangeBroadcaster*) override;
- TreeView* getFilesTreeView() const;
- ProjectTreeViewBase* getFilesTreeRoot() const;
void showTranslationTool();
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjectContentComponent)
diff --git a/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.cpp b/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.cpp
deleted file mode 100644
index 8991db42a8..0000000000
--- a/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.cpp
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2013 - Raw Material Software 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.
-
- ==============================================================================
-*/
-
-#include "jucer_ProjectTreeViewBase.h"
-#include "../Application/jucer_Application.h"
-
-
-//==============================================================================
-ProjectTreeViewBase::ProjectTreeViewBase (const Project::Item& item_)
- : item (item_), isFileMissing (false)
-{
- item.state.addListener (this);
-}
-
-ProjectTreeViewBase::~ProjectTreeViewBase()
-{
- item.state.removeListener (this);
-}
-
-//==============================================================================
-String ProjectTreeViewBase::getDisplayName() const
-{
- return item.getName();
-}
-
-void ProjectTreeViewBase::setName (const String& newName)
-{
- if (item.isMainGroup())
- item.project.setTitle (newName);
- else
- item.getNameValue() = newName;
-}
-
-//==============================================================================
-File ProjectTreeViewBase::getFile() const
-{
- return item.getFile();
-}
-
-void ProjectTreeViewBase::browseToAddExistingFiles()
-{
- const File location (item.isGroup() ? item.determineGroupFolder() : getFile());
- FileChooser fc ("Add Files to Jucer Project", location, String::empty, false);
-
- if (fc.browseForMultipleFilesOrDirectories())
- {
- StringArray files;
-
- for (int i = 0; i < fc.getResults().size(); ++i)
- files.add (fc.getResults().getReference(i).getFullPathName());
-
- addFiles (files, 0);
- }
-}
-
-void ProjectTreeViewBase::addFiles (const StringArray& files, int insertIndex)
-{
- if (ProjectTreeViewBase* p = dynamic_cast (getParentItem()))
- p->addFiles (files, insertIndex);
-}
-
-void ProjectTreeViewBase::moveSelectedItemsTo (OwnedArray &, int /*insertIndex*/)
-{
- jassertfalse;
-}
-
-//==============================================================================
-ProjectTreeViewBase* ProjectTreeViewBase::findTreeViewItem (const Project::Item& itemToFind)
-{
- if (item == itemToFind)
- return this;
-
- const bool wasOpen = isOpen();
- setOpen (true);
-
- for (int i = getNumSubItems(); --i >= 0;)
- {
- if (ProjectTreeViewBase* pg = dynamic_cast (getSubItem(i)))
- if (ProjectTreeViewBase* found = pg->findTreeViewItem (itemToFind))
- return found;
- }
-
- setOpen (wasOpen);
- return nullptr;
-}
-
-//==============================================================================
-void ProjectTreeViewBase::triggerAsyncRename (const Project::Item& itemToRename)
-{
- class RenameMessage : public CallbackMessage
- {
- public:
- RenameMessage (TreeView* const t, const Project::Item& i)
- : tree (t), itemToRename (i) {}
-
- void messageCallback() override
- {
- if (tree != nullptr)
- if (ProjectTreeViewBase* root = dynamic_cast (tree->getRootItem()))
- if (ProjectTreeViewBase* found = root->findTreeViewItem (itemToRename))
- found->showRenameBox();
- }
-
- private:
- Component::SafePointer tree;
- Project::Item itemToRename;
- };
-
- (new RenameMessage (getOwnerView(), itemToRename))->post();
-}
-
-//==============================================================================
-void ProjectTreeViewBase::checkFileStatus()
-{
- const File file (getFile());
- const bool nowMissing = file != File::nonexistent && ! file.exists();
-
- if (nowMissing != isFileMissing)
- {
- isFileMissing = nowMissing;
- repaintItem();
- }
-}
-
-void ProjectTreeViewBase::revealInFinder() const
-{
- getFile().revealToUser();
-}
-
-void ProjectTreeViewBase::deleteItem()
-{
- item.removeItemFromProject();
-}
-
-void ProjectTreeViewBase::deleteAllSelectedItems()
-{
- TreeView* tree = getOwnerView();
- const int numSelected = tree->getNumSelectedItems();
- OwnedArray filesToTrash;
- OwnedArray itemsToRemove;
-
- for (int i = 0; i < numSelected; ++i)
- {
- if (const ProjectTreeViewBase* const p = dynamic_cast (tree->getSelectedItem (i)))
- {
- itemsToRemove.add (new Project::Item (p->item));
-
- if (p->getFile().existsAsFile())
- filesToTrash.add (new File (p->getFile()));
- }
- }
-
- if (filesToTrash.size() > 0)
- {
- String fileList;
- const int maxFilesToList = 10;
- for (int i = jmin (maxFilesToList, filesToTrash.size()); --i >= 0;)
- fileList << filesToTrash.getUnchecked(i)->getFullPathName() << "\n";
-
- if (filesToTrash.size() > maxFilesToList)
- fileList << "\n...plus " << (filesToTrash.size() - maxFilesToList) << " more files...";
-
- int r = AlertWindow::showYesNoCancelBox (AlertWindow::NoIcon, "Delete Project Items",
- "As well as removing the selected item(s) from the project, do you also want to move their files to the trash:\n\n"
- + fileList,
- "Just remove references",
- "Also move files to Trash",
- "Cancel",
- tree->getTopLevelComponent());
-
- if (r == 0)
- return;
-
- if (r != 2)
- filesToTrash.clear();
- }
-
- if (ProjectTreeViewBase* treeRootItem = dynamic_cast (tree->getRootItem()))
- {
- OpenDocumentManager& om = IntrojucerApp::getApp().openDocumentManager;
-
- for (int i = filesToTrash.size(); --i >= 0;)
- {
- const File f (*filesToTrash.getUnchecked(i));
-
- om.closeFile (f, false);
-
- if (! f.moveToTrash())
- {
- // xxx
- }
- }
-
- for (int i = itemsToRemove.size(); --i >= 0;)
- {
- if (ProjectTreeViewBase* itemToRemove = treeRootItem->findTreeViewItem (*itemsToRemove.getUnchecked(i)))
- {
- om.closeFile (itemToRemove->getFile(), false);
- itemToRemove->deleteItem();
- }
- }
- }
- else
- {
- jassertfalse;
- }
-}
-
-static int indexOfNode (const ValueTree& parent, const ValueTree& child)
-{
- for (int i = parent.getNumChildren(); --i >= 0;)
- if (parent.getChild (i) == child)
- return i;
-
- return -1;
-}
-
-void ProjectTreeViewBase::moveItems (OwnedArray & selectedNodes,
- Project::Item destNode, int insertIndex)
-{
- for (int i = selectedNodes.size(); --i >= 0;)
- {
- Project::Item* const n = selectedNodes.getUnchecked(i);
-
- if (destNode == *n || destNode.state.isAChildOf (n->state)) // Check for recursion.
- return;
-
- if (! destNode.canContain (*n))
- selectedNodes.remove (i);
- }
-
- // Don't include any nodes that are children of other selected nodes..
- for (int i = selectedNodes.size(); --i >= 0;)
- {
- Project::Item* const n = selectedNodes.getUnchecked(i);
-
- for (int j = selectedNodes.size(); --j >= 0;)
- {
- if (j != i && n->state.isAChildOf (selectedNodes.getUnchecked(j)->state))
- {
- selectedNodes.remove (i);
- break;
- }
- }
- }
-
- // Remove and re-insert them one at a time..
- for (int i = 0; i < selectedNodes.size(); ++i)
- {
- Project::Item* selectedNode = selectedNodes.getUnchecked(i);
-
- if (selectedNode->state.getParent() == destNode.state
- && indexOfNode (destNode.state, selectedNode->state) < insertIndex)
- --insertIndex;
-
- selectedNode->removeItemFromProject();
- destNode.addChild (*selectedNode, insertIndex++);
- }
-}
-
-//==============================================================================
-bool ProjectTreeViewBase::isInterestedInFileDrag (const StringArray& files)
-{
- return acceptsFileDrop (files);
-}
-
-void ProjectTreeViewBase::filesDropped (const StringArray& files, int insertIndex)
-{
- addFiles (files, insertIndex);
-}
-
-void ProjectTreeViewBase::getAllSelectedNodesInTree (Component* componentInTree, OwnedArray & selectedNodes)
-{
- TreeView* tree = dynamic_cast (componentInTree);
-
- if (tree == nullptr)
- tree = componentInTree->findParentComponentOfClass();
-
- if (tree != nullptr)
- {
- const int numSelected = tree->getNumSelectedItems();
-
- for (int i = 0; i < numSelected; ++i)
- if (const ProjectTreeViewBase* const p = dynamic_cast (tree->getSelectedItem (i)))
- selectedNodes.add (new Project::Item (p->item));
- }
-}
-
-bool ProjectTreeViewBase::isInterestedInDragSource (const DragAndDropTarget::SourceDetails& dragSourceDetails)
-{
- if (dragSourceDetails.description != projectItemDragType)
- return false;
-
- OwnedArray selectedNodes;
- getAllSelectedNodesInTree (dragSourceDetails.sourceComponent, selectedNodes);
-
- return selectedNodes.size() > 0 && acceptsDragItems (selectedNodes);
-}
-
-void ProjectTreeViewBase::itemDropped (const DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex)
-{
- OwnedArray selectedNodes;
- getAllSelectedNodesInTree (dragSourceDetails.sourceComponent, selectedNodes);
-
- if (selectedNodes.size() > 0)
- {
- TreeView* tree = getOwnerView();
- ScopedPointer oldOpenness (tree->getOpennessState (false));
-
- moveSelectedItemsTo (selectedNodes, insertIndex);
-
- if (oldOpenness != nullptr)
- tree->restoreOpennessState (*oldOpenness, false);
- }
-}
-
-//==============================================================================
-void ProjectTreeViewBase::treeChildrenChanged (const ValueTree& parentTree)
-{
- if (parentTree == item.state)
- {
- refreshSubItems();
- treeHasChanged();
- setOpen (true);
- }
-}
-
-void ProjectTreeViewBase::valueTreePropertyChanged (ValueTree& tree, const Identifier&)
-{
- if (tree == item.state)
- repaintItem();
-}
-
-void ProjectTreeViewBase::valueTreeChildAdded (ValueTree& parentTree, ValueTree&)
-{
- treeChildrenChanged (parentTree);
-}
-
-void ProjectTreeViewBase::valueTreeChildRemoved (ValueTree& parentTree, ValueTree&)
-{
- treeChildrenChanged (parentTree);
-}
-
-void ProjectTreeViewBase::valueTreeChildOrderChanged (ValueTree& parentTree)
-{
- treeChildrenChanged (parentTree);
-}
-
-void ProjectTreeViewBase::valueTreeParentChanged (ValueTree&)
-{
-}
-
-//==============================================================================
-bool ProjectTreeViewBase::mightContainSubItems()
-{
- return item.getNumChildren() > 0;
-}
-
-String ProjectTreeViewBase::getUniqueName() const
-{
- jassert (item.getID().isNotEmpty());
- return item.getID();
-}
-
-void ProjectTreeViewBase::itemOpennessChanged (bool isNowOpen)
-{
- if (isNowOpen)
- refreshSubItems();
-}
-
-void ProjectTreeViewBase::addSubItems()
-{
- for (int i = 0; i < item.getNumChildren(); ++i)
- if (ProjectTreeViewBase* p = createSubItem (item.getChild(i)))
- addSubItem (p);
-}
-
-static void treeViewMultiSelectItemChosen (int resultCode, ProjectTreeViewBase* item)
-{
- switch (resultCode)
- {
- case 1: item->deleteAllSelectedItems(); break;
- default: break;
- }
-}
-
-void ProjectTreeViewBase::showMultiSelectionPopupMenu()
-{
- PopupMenu m;
- m.addItem (1, "Delete");
-
- m.showMenuAsync (PopupMenu::Options(),
- ModalCallbackFunction::create (treeViewMultiSelectItemChosen, this));
-}
-
-String ProjectTreeViewBase::getTooltip()
-{
- return String::empty;
-}
-
-var ProjectTreeViewBase::getDragSourceDescription()
-{
- cancelDelayedSelectionTimer();
- return projectItemDragType;
-}
-
-int ProjectTreeViewBase::getMillisecsAllowedForDragGesture()
-{
- // for images, give the user longer to start dragging before assuming they're
- // clicking to select it for previewing..
- return item.isImageFile() ? 250 : JucerTreeViewBase::getMillisecsAllowedForDragGesture();
-}
-
-//==============================================================================
-ProjectTreeViewBase* ProjectTreeViewBase::getParentProjectItem() const
-{
- return dynamic_cast (getParentItem());
-}
diff --git a/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.h b/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.h
deleted file mode 100644
index 1a760d4c86..0000000000
--- a/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2013 - Raw Material Software 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.
-
- ==============================================================================
-*/
-
-#ifndef __JUCER_PROJECTTREEVIEWBASE_JUCEHEADER__
-#define __JUCER_PROJECTTREEVIEWBASE_JUCEHEADER__
-
-#include "../jucer_Headers.h"
-#include "../Utility/jucer_JucerTreeViewBase.h"
-#include "jucer_Project.h"
-
-
-//==============================================================================
-class ProjectTreeViewBase : public JucerTreeViewBase,
- public ValueTree::Listener
-{
-protected:
- //==============================================================================
- ProjectTreeViewBase (const Project::Item& item);
- ~ProjectTreeViewBase();
-
-public:
- //==============================================================================
- virtual bool isRoot() const { return false; }
-
- virtual bool acceptsFileDrop (const StringArray& files) const = 0;
- virtual bool acceptsDragItems (const OwnedArray & selectedNodes) = 0;
-
- //==============================================================================
- virtual String getDisplayName() const;
- virtual String getRenamingName() const { return getDisplayName(); }
- virtual void setName (const String& newName);
- virtual bool isMissing() { return isFileMissing; }
- virtual File getFile() const;
-
- virtual void deleteItem();
- virtual void deleteAllSelectedItems();
- virtual void revealInFinder() const;
- virtual void browseToAddExistingFiles();
- virtual void checkFileStatus(); // (recursive)
-
- virtual void addFiles (const StringArray& files, int insertIndex);
- virtual void moveSelectedItemsTo (OwnedArray & selectedNodes, int insertIndex);
- virtual void showMultiSelectionPopupMenu();
-
- virtual ProjectTreeViewBase* findTreeViewItem (const Project::Item& itemToFind);
-
- //==============================================================================
- void valueTreePropertyChanged (ValueTree& tree, const Identifier& property) override;
- void valueTreeChildAdded (ValueTree& parentTree, ValueTree& childWhichHasBeenAdded) override;
- void valueTreeChildRemoved (ValueTree& parentTree, ValueTree& childWhichHasBeenRemoved) override;
- void valueTreeChildOrderChanged (ValueTree& parentTree) override;
- void valueTreeParentChanged (ValueTree& tree) override;
-
- //==============================================================================
- bool mightContainSubItems() override;
- String getUniqueName() const override;
- void itemOpennessChanged (bool isNowOpen) override;
- bool canBeSelected() const override { return true; }
- String getTooltip() override;
- var getDragSourceDescription() override;
- void addSubItems() override;
-
- //==============================================================================
- // Drag-and-drop stuff..
- bool isInterestedInFileDrag (const StringArray& files) override;
- void filesDropped (const StringArray& files, int insertIndex) override;
- bool isInterestedInDragSource (const DragAndDropTarget::SourceDetails& dragSourceDetails) override;
- void itemDropped (const DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex) override;
- int getMillisecsAllowedForDragGesture() override;
-
- static void getAllSelectedNodesInTree (Component* componentInTree, OwnedArray & selectedNodes);
-
- File getDraggableFile() const override { return getFile(); }
-
- //==============================================================================
- Project::Item item;
-
-protected:
- bool isFileMissing;
-
- //==============================================================================
- void treeChildrenChanged (const ValueTree& parentTree);
- virtual ProjectTreeViewBase* createSubItem (const Project::Item& node) = 0;
-
- Icon getIcon() const override { return item.getIcon().withContrastingColourTo (getBackgroundColour()); }
- bool isIconCrossedOut() const override { return item.isIconCrossedOut(); }
-
- //==============================================================================
- void triggerAsyncRename (const Project::Item& itemToRename);
- static void moveItems (OwnedArray & selectedNodes,
- Project::Item destNode, int insertIndex);
-
- ProjectTreeViewBase* getParentProjectItem() const;
-};
-
-
-#endif // __JUCER_PROJECTTREEVIEWBASE_JUCEHEADER__
diff --git a/extras/Introjucer/Source/Project/jucer_ProjectTree_Base.h b/extras/Introjucer/Source/Project/jucer_ProjectTree_Base.h
new file mode 100644
index 0000000000..de5f97c786
--- /dev/null
+++ b/extras/Introjucer/Source/Project/jucer_ProjectTree_Base.h
@@ -0,0 +1,419 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2013 - Raw Material Software 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 ProjectTreeItemBase : public JucerTreeViewBase,
+ public ValueTree::Listener
+{
+public:
+ ProjectTreeItemBase (const Project::Item& projectItem)
+ : item (projectItem), isFileMissing (false)
+ {
+ item.state.addListener (this);
+ }
+
+ ~ProjectTreeItemBase()
+ {
+ item.state.removeListener (this);
+ }
+
+ //==============================================================================
+ virtual bool isRoot() const { return false; }
+
+ virtual bool acceptsFileDrop (const StringArray& files) const = 0;
+ virtual bool acceptsDragItems (const OwnedArray& selectedNodes) = 0;
+
+ //==============================================================================
+ virtual String getDisplayName() const { return item.getName(); }
+ virtual String getRenamingName() const { return getDisplayName(); }
+
+ virtual void setName (const String& newName)
+ {
+ if (item.isMainGroup())
+ item.project.setTitle (newName);
+ else
+ item.getNameValue() = newName;
+ }
+
+ virtual bool isMissing() { return isFileMissing; }
+ virtual File getFile() const { return item.getFile(); }
+
+ virtual void deleteItem() { item.removeItemFromProject(); }
+
+ virtual void deleteAllSelectedItems()
+ {
+ TreeView* tree = getOwnerView();
+ const int numSelected = tree->getNumSelectedItems();
+ OwnedArray filesToTrash;
+ OwnedArray itemsToRemove;
+
+ for (int i = 0; i < numSelected; ++i)
+ {
+ if (const ProjectTreeItemBase* const p = dynamic_cast (tree->getSelectedItem (i)))
+ {
+ itemsToRemove.add (new Project::Item (p->item));
+
+ if (p->getFile().existsAsFile())
+ filesToTrash.add (new File (p->getFile()));
+ }
+ }
+
+ if (filesToTrash.size() > 0)
+ {
+ String fileList;
+ const int maxFilesToList = 10;
+ for (int i = jmin (maxFilesToList, filesToTrash.size()); --i >= 0;)
+ fileList << filesToTrash.getUnchecked(i)->getFullPathName() << "\n";
+
+ if (filesToTrash.size() > maxFilesToList)
+ fileList << "\n...plus " << (filesToTrash.size() - maxFilesToList) << " more files...";
+
+ int r = AlertWindow::showYesNoCancelBox (AlertWindow::NoIcon, "Delete Project Items",
+ "As well as removing the selected item(s) from the project, do you also want to move their files to the trash:\n\n"
+ + fileList,
+ "Just remove references",
+ "Also move files to Trash",
+ "Cancel",
+ tree->getTopLevelComponent());
+
+ if (r == 0)
+ return;
+
+ if (r != 2)
+ filesToTrash.clear();
+ }
+
+ if (ProjectTreeItemBase* treeRootItem = dynamic_cast (tree->getRootItem()))
+ {
+ OpenDocumentManager& om = IntrojucerApp::getApp().openDocumentManager;
+
+ for (int i = filesToTrash.size(); --i >= 0;)
+ {
+ const File f (*filesToTrash.getUnchecked(i));
+
+ om.closeFile (f, false);
+
+ if (! f.moveToTrash())
+ {
+ // xxx
+ }
+ }
+
+ for (int i = itemsToRemove.size(); --i >= 0;)
+ {
+ if (ProjectTreeItemBase* itemToRemove = treeRootItem->findTreeViewItem (*itemsToRemove.getUnchecked(i)))
+ {
+ om.closeFile (itemToRemove->getFile(), false);
+ itemToRemove->deleteItem();
+ }
+ }
+ }
+ else
+ {
+ jassertfalse;
+ }
+ }
+
+ virtual void revealInFinder() const
+ {
+ getFile().revealToUser();
+ }
+
+ virtual void browseToAddExistingFiles()
+ {
+ const File location (item.isGroup() ? item.determineGroupFolder() : getFile());
+ FileChooser fc ("Add Files to Jucer Project", location, String::empty, false);
+
+ if (fc.browseForMultipleFilesOrDirectories())
+ {
+ StringArray files;
+
+ for (int i = 0; i < fc.getResults().size(); ++i)
+ files.add (fc.getResults().getReference(i).getFullPathName());
+
+ addFiles (files, 0);
+ }
+ }
+
+ virtual void checkFileStatus() // (recursive)
+ {
+ const File file (getFile());
+ const bool nowMissing = file != File::nonexistent && ! file.exists();
+
+ if (nowMissing != isFileMissing)
+ {
+ isFileMissing = nowMissing;
+ repaintItem();
+ }
+ }
+
+ virtual void addFiles (const StringArray& files, int insertIndex)
+ {
+ if (ProjectTreeItemBase* p = getParentProjectItem())
+ p->addFiles (files, insertIndex);
+ }
+
+ virtual void moveSelectedItemsTo (OwnedArray & selectedNodes, int insertIndex)
+ {
+ jassertfalse;
+ }
+
+ virtual void showMultiSelectionPopupMenu()
+ {
+ PopupMenu m;
+ m.addItem (1, "Delete");
+
+ m.showMenuAsync (PopupMenu::Options(),
+ ModalCallbackFunction::create (treeViewMultiSelectItemChosen, this));
+ }
+
+ static void treeViewMultiSelectItemChosen (int resultCode, ProjectTreeItemBase* item)
+ {
+ switch (resultCode)
+ {
+ case 1: item->deleteAllSelectedItems(); break;
+ default: break;
+ }
+ }
+
+ virtual ProjectTreeItemBase* findTreeViewItem (const Project::Item& itemToFind)
+ {
+ if (item == itemToFind)
+ return this;
+
+ const bool wasOpen = isOpen();
+ setOpen (true);
+
+ for (int i = getNumSubItems(); --i >= 0;)
+ {
+ if (ProjectTreeItemBase* pg = dynamic_cast (getSubItem(i)))
+ if (ProjectTreeItemBase* found = pg->findTreeViewItem (itemToFind))
+ return found;
+ }
+
+ setOpen (wasOpen);
+ return nullptr;
+ }
+
+ //==============================================================================
+ void valueTreePropertyChanged (ValueTree& tree, const Identifier& property) override
+ {
+ if (tree == item.state)
+ repaintItem();
+ }
+
+ void valueTreeChildAdded (ValueTree& parentTree, ValueTree&) override { treeChildrenChanged (parentTree); }
+ void valueTreeChildRemoved (ValueTree& parentTree, ValueTree&) override { treeChildrenChanged (parentTree); }
+ void valueTreeChildOrderChanged (ValueTree& parentTree) override { treeChildrenChanged (parentTree); }
+ void valueTreeParentChanged (ValueTree&) override {}
+
+ //==============================================================================
+ bool mightContainSubItems() override { return item.getNumChildren() > 0; }
+ String getUniqueName() const override { jassert (item.getID().isNotEmpty()); return item.getID(); }
+ bool canBeSelected() const override { return true; }
+ String getTooltip() override { return String::empty; }
+ File getDraggableFile() const override { return getFile(); }
+
+ var getDragSourceDescription() override
+ {
+ cancelDelayedSelectionTimer();
+ return projectItemDragType;
+ }
+
+ void addSubItems() override
+ {
+ for (int i = 0; i < item.getNumChildren(); ++i)
+ if (ProjectTreeItemBase* p = createSubItem (item.getChild(i)))
+ addSubItem (p);
+ }
+
+ void itemOpennessChanged (bool isNowOpen) override
+ {
+ if (isNowOpen)
+ refreshSubItems();
+ }
+
+ //==============================================================================
+ bool isInterestedInFileDrag (const StringArray& files) override
+ {
+ return acceptsFileDrop (files);
+ }
+
+ void filesDropped (const StringArray& files, int insertIndex) override
+ {
+ addFiles (files, insertIndex);
+ }
+
+ bool isInterestedInDragSource (const DragAndDropTarget::SourceDetails& dragSourceDetails) override
+ {
+ if (dragSourceDetails.description != projectItemDragType)
+ return false;
+
+ OwnedArray selectedNodes;
+ getAllSelectedNodesInTree (dragSourceDetails.sourceComponent, selectedNodes);
+
+ return selectedNodes.size() > 0 && acceptsDragItems (selectedNodes);
+ }
+
+ void itemDropped (const DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex) override
+ {
+ OwnedArray selectedNodes;
+ getAllSelectedNodesInTree (dragSourceDetails.sourceComponent, selectedNodes);
+
+ if (selectedNodes.size() > 0)
+ {
+ TreeView* tree = getOwnerView();
+ ScopedPointer oldOpenness (tree->getOpennessState (false));
+
+ moveSelectedItemsTo (selectedNodes, insertIndex);
+
+ if (oldOpenness != nullptr)
+ tree->restoreOpennessState (*oldOpenness, false);
+ }
+ }
+
+ int getMillisecsAllowedForDragGesture() override
+ {
+ // for images, give the user longer to start dragging before assuming they're
+ // clicking to select it for previewing..
+ return item.isImageFile() ? 250 : JucerTreeViewBase::getMillisecsAllowedForDragGesture();
+ }
+
+ static void getAllSelectedNodesInTree (Component* componentInTree, OwnedArray & selectedNodes)
+ {
+ TreeView* tree = dynamic_cast (componentInTree);
+
+ if (tree == nullptr)
+ tree = componentInTree->findParentComponentOfClass();
+
+ if (tree != nullptr)
+ {
+ const int numSelected = tree->getNumSelectedItems();
+
+ for (int i = 0; i < numSelected; ++i)
+ if (const ProjectTreeItemBase* const p = dynamic_cast (tree->getSelectedItem (i)))
+ selectedNodes.add (new Project::Item (p->item));
+ }
+ }
+
+ ProjectTreeItemBase* getParentProjectItem() const
+ {
+ return dynamic_cast (getParentItem());
+ }
+
+ //==============================================================================
+ Project::Item item;
+
+protected:
+ bool isFileMissing;
+
+ virtual ProjectTreeItemBase* createSubItem (const Project::Item& node) = 0;
+
+ Icon getIcon() const override { return item.getIcon().withContrastingColourTo (getBackgroundColour()); }
+ bool isIconCrossedOut() const override { return item.isIconCrossedOut(); }
+
+ void treeChildrenChanged (const ValueTree& parentTree)
+ {
+ if (parentTree == item.state)
+ {
+ refreshSubItems();
+ treeHasChanged();
+ setOpen (true);
+ }
+ }
+
+ void triggerAsyncRename (const Project::Item& itemToRename)
+ {
+ class RenameMessage : public CallbackMessage
+ {
+ public:
+ RenameMessage (TreeView* const t, const Project::Item& i)
+ : tree (t), itemToRename (i) {}
+
+ void messageCallback() override
+ {
+ if (tree != nullptr)
+ if (ProjectTreeItemBase* root = dynamic_cast (tree->getRootItem()))
+ if (ProjectTreeItemBase* found = root->findTreeViewItem (itemToRename))
+ found->showRenameBox();
+ }
+
+ private:
+ Component::SafePointer tree;
+ Project::Item itemToRename;
+ };
+
+ (new RenameMessage (getOwnerView(), itemToRename))->post();
+ }
+
+ static void moveItems (OwnedArray & selectedNodes, Project::Item destNode, int insertIndex)
+ {
+ for (int i = selectedNodes.size(); --i >= 0;)
+ {
+ Project::Item* const n = selectedNodes.getUnchecked(i);
+
+ if (destNode == *n || destNode.state.isAChildOf (n->state)) // Check for recursion.
+ return;
+
+ if (! destNode.canContain (*n))
+ selectedNodes.remove (i);
+ }
+
+ // Don't include any nodes that are children of other selected nodes..
+ for (int i = selectedNodes.size(); --i >= 0;)
+ {
+ Project::Item* const n = selectedNodes.getUnchecked(i);
+
+ for (int j = selectedNodes.size(); --j >= 0;)
+ {
+ if (j != i && n->state.isAChildOf (selectedNodes.getUnchecked(j)->state))
+ {
+ selectedNodes.remove (i);
+ break;
+ }
+ }
+ }
+
+ // Remove and re-insert them one at a time..
+ for (int i = 0; i < selectedNodes.size(); ++i)
+ {
+ Project::Item* selectedNode = selectedNodes.getUnchecked(i);
+
+ if (selectedNode->state.getParent() == destNode.state
+ && indexOfNode (destNode.state, selectedNode->state) < insertIndex)
+ --insertIndex;
+
+ selectedNode->removeItemFromProject();
+ destNode.addChild (*selectedNode, insertIndex++);
+ }
+ }
+
+ static int indexOfNode (const ValueTree& parent, const ValueTree& child)
+ {
+ for (int i = parent.getNumChildren(); --i >= 0;)
+ if (parent.getChild (i) == child)
+ return i;
+
+ return -1;
+ }
+};
diff --git a/extras/Introjucer/Source/Project/jucer_ProjectTree_File.h b/extras/Introjucer/Source/Project/jucer_ProjectTree_File.h
new file mode 100644
index 0000000000..e8cf0f11e1
--- /dev/null
+++ b/extras/Introjucer/Source/Project/jucer_ProjectTree_File.h
@@ -0,0 +1,154 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2013 - Raw Material Software 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 { return false; }
+ bool acceptsDragItems (const OwnedArray &) { return false; }
+
+ String getDisplayName() const
+ {
+ return getFile().getFileName();
+ }
+
+ static File findCorrespondingHeaderOrCpp (const File& f)
+ {
+ if (f.hasFileExtension (sourceFileExtensions))
+ return f.withFileExtension (".h");
+ else if (f.hasFileExtension (headerFileExtensions))
+ return f.withFileExtension (".cpp");
+
+ return File::nonexistent;
+ }
+
+ void setName (const String& newName)
+ {
+ 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&)
+ {
+ jassertfalse;
+ return nullptr;
+ }
+
+ void showDocument()
+ {
+ const File f (getFile());
+
+ if (f.exists())
+ if (ProjectContentComponent* pcc = getProjectContentComponent())
+ pcc->showEditorForFile (f, false);
+ }
+
+ void showPopupMenu()
+ {
+ 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)
+ {
+ 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;
+ }
+ }
+};
diff --git a/extras/Introjucer/Source/Project/jucer_ProjectTree_Group.h b/extras/Introjucer/Source/Project/jucer_ProjectTree_Group.h
new file mode 100644
index 0000000000..809c52019d
--- /dev/null
+++ b/extras/Introjucer/Source/Project/jucer_ProjectTree_Group.h
@@ -0,0 +1,172 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2013 - Raw Material Software 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 GroupItem : public ProjectTreeItemBase
+{
+public:
+ GroupItem (const Project::Item& projectItem)
+ : ProjectTreeItemBase (projectItem)
+ {
+ }
+
+ bool isRoot() const { return item.isMainGroup(); }
+ bool acceptsFileDrop (const StringArray&) const { return true; }
+
+ void addNewGroup()
+ {
+ Project::Item newGroup (item.addNewSubGroup ("New Group", 0));
+ triggerAsyncRename (newGroup);
+ }
+
+ bool acceptsDragItems (const OwnedArray& selectedNodes)
+ {
+ for (int i = selectedNodes.size(); --i >= 0;)
+ if (item.canContain (*selectedNodes.getUnchecked(i)))
+ return true;
+
+ return false;
+ }
+
+ void addFiles (const StringArray& files, int insertIndex)
+ {
+ for (int i = 0; i < files.size(); ++i)
+ {
+ const File file (files[i]);
+
+ if (item.addFile (file, insertIndex, true))
+ ++insertIndex;
+ }
+ }
+
+ void moveSelectedItemsTo (OwnedArray& selectedNodes, int insertIndex)
+ {
+ moveItems (selectedNodes, item, insertIndex);
+ }
+
+ void checkFileStatus()
+ {
+ for (int i = 0; i < getNumSubItems(); ++i)
+ if (ProjectTreeItemBase* p = dynamic_cast (getSubItem(i)))
+ p->checkFileStatus();
+ }
+
+ ProjectTreeItemBase* createSubItem (const Project::Item& child)
+ {
+ if (child.isGroup()) return new GroupItem (child);
+ if (child.isFile()) return new SourceFileItem (child);
+
+ jassertfalse;
+ return nullptr;
+ }
+
+ void showDocument()
+ {
+ if (ProjectContentComponent* pcc = getProjectContentComponent())
+ pcc->setEditorComponent (new GroupInformationComponent (item), nullptr);
+ }
+
+ static void openOrCloseAllSubGroups (TreeViewItem& item, bool shouldOpen)
+ {
+ item.setOpen (shouldOpen);
+
+ for (int i = item.getNumSubItems(); --i >= 0;)
+ if (TreeViewItem* sub = item.getSubItem(i))
+ openOrCloseAllSubGroups (*sub, shouldOpen);
+ }
+
+ static void setFilesToCompile (Project::Item item, const bool shouldCompile)
+ {
+ if (item.isFile())
+ item.getShouldCompileValue() = shouldCompile;
+
+ for (int i = item.getNumChildren(); --i >= 0;)
+ setFilesToCompile (item.getChild (i), shouldCompile);
+ }
+
+ void showPopupMenu()
+ {
+ PopupMenu m;
+ addCreateFileMenuItems (m);
+
+ m.addSeparator();
+
+ if (isOpen())
+ m.addItem (1, "Collapse all Sub-groups");
+ else
+ m.addItem (2, "Expand all Sub-groups");
+
+ m.addSeparator();
+ m.addItem (3, "Enable compiling of all enclosed files");
+ m.addItem (4, "Disable compiling of all enclosed files");
+
+ m.addSeparator();
+ m.addItem (5, "Sort Items Alphabetically");
+ m.addItem (6, "Sort Items Alphabetically (Groups first)");
+ m.addSeparator();
+ m.addItem (7, "Rename...");
+
+ if (! isRoot())
+ m.addItem (8, "Delete");
+
+ launchPopupMenu (m);
+ }
+
+ void handlePopupMenuResult (int resultCode)
+ {
+ switch (resultCode)
+ {
+ case 1: openOrCloseAllSubGroups (*this, false); break;
+ case 2: openOrCloseAllSubGroups (*this, true); break;
+ case 3: setFilesToCompile (item, true); break;
+ case 4: setFilesToCompile (item, false); break;
+ case 5: item.sortAlphabetically (false); break;
+ case 6: item.sortAlphabetically (true); break;
+ case 7: triggerAsyncRename (item); break;
+ case 8: deleteAllSelectedItems(); break;
+ default: processCreateFileMenuItem (resultCode); break;
+ }
+ }
+
+ void addCreateFileMenuItems (PopupMenu& m)
+ {
+ m.addItem (1001, "Add New Group");
+ m.addItem (1002, "Add Existing Files...");
+
+ m.addSeparator();
+ NewFileWizard().addWizardsToMenu (m);
+ }
+
+ void processCreateFileMenuItem (int menuID)
+ {
+ switch (menuID)
+ {
+ case 1001: addNewGroup(); break;
+ case 1002: browseToAddExistingFiles(); break;
+
+ default:
+ NewFileWizard().runWizardFromMenu (menuID, item);
+ break;
+ }
+ }
+};
diff --git a/extras/Introjucer/Source/Project/jucer_TreeViewTypes.cpp b/extras/Introjucer/Source/Project/jucer_TreeViewTypes.cpp
deleted file mode 100644
index 70148d11dd..0000000000
--- a/extras/Introjucer/Source/Project/jucer_TreeViewTypes.cpp
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2013 - Raw Material Software 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.
-
- ==============================================================================
-*/
-
-#include "jucer_TreeViewTypes.h"
-#include "jucer_ConfigPage.h"
-#include "jucer_GroupInformationComponent.h"
-#include "../Application/jucer_OpenDocumentManager.h"
-#include "../Code Editor/jucer_SourceCodeEditor.h"
-#include "jucer_NewFileWizard.h"
-#include "jucer_ProjectContentComponent.h"
-
-//==============================================================================
-GroupTreeViewItem::GroupTreeViewItem (const Project::Item& i)
- : ProjectTreeViewBase (i)
-{
-}
-
-GroupTreeViewItem::~GroupTreeViewItem()
-{
-}
-
-void GroupTreeViewItem::addNewGroup()
-{
- Project::Item newGroup (item.addNewSubGroup ("New Group", 0));
- triggerAsyncRename (newGroup);
-}
-
-bool GroupTreeViewItem::acceptsDragItems (const OwnedArray & selectedNodes)
-{
- for (int i = selectedNodes.size(); --i >= 0;)
- if (item.canContain (*selectedNodes.getUnchecked(i)))
- return true;
-
- return false;
-}
-
-void GroupTreeViewItem::addFiles (const StringArray& files, int insertIndex)
-{
- for (int i = 0; i < files.size(); ++i)
- {
- const File file (files[i]);
-
- if (item.addFile (file, insertIndex, true))
- ++insertIndex;
- }
-}
-
-void GroupTreeViewItem::moveSelectedItemsTo (OwnedArray & selectedNodes, int insertIndex)
-{
- moveItems (selectedNodes, item, insertIndex);
-}
-
-void GroupTreeViewItem::checkFileStatus()
-{
- for (int i = 0; i < getNumSubItems(); ++i)
- if (ProjectTreeViewBase* p = dynamic_cast (getSubItem(i)))
- p->checkFileStatus();
-}
-
-ProjectTreeViewBase* GroupTreeViewItem::createSubItem (const Project::Item& child)
-{
- if (child.isGroup()) return new GroupTreeViewItem (child);
- if (child.isFile()) return new SourceFileTreeViewItem (child);
-
- jassertfalse;
- return nullptr;
-}
-
-void GroupTreeViewItem::showDocument()
-{
- if (ProjectContentComponent* pcc = getProjectContentComponent())
- pcc->setEditorComponent (new GroupInformationComponent (item), nullptr);
-}
-
-static void openOrCloseAllSubGroups (TreeViewItem& item, bool shouldOpen)
-{
- item.setOpen (shouldOpen);
-
- for (int i = item.getNumSubItems(); --i >= 0;)
- if (TreeViewItem* sub = item.getSubItem(i))
- openOrCloseAllSubGroups (*sub, shouldOpen);
-}
-
-static void setFilesToCompile (Project::Item item, const bool shouldCompile)
-{
- if (item.isFile())
- item.getShouldCompileValue() = shouldCompile;
-
- for (int i = item.getNumChildren(); --i >= 0;)
- setFilesToCompile (item.getChild (i), shouldCompile);
-}
-
-void GroupTreeViewItem::showPopupMenu()
-{
- PopupMenu m;
- addCreateFileMenuItems (m);
-
- m.addSeparator();
-
- if (isOpen())
- m.addItem (1, "Collapse all Sub-groups");
- else
- m.addItem (2, "Expand all Sub-groups");
-
- m.addSeparator();
- m.addItem (3, "Enable compiling of all enclosed files");
- m.addItem (4, "Disable compiling of all enclosed files");
-
- m.addSeparator();
- m.addItem (5, "Sort Items Alphabetically");
- m.addItem (6, "Sort Items Alphabetically (Groups first)");
- m.addSeparator();
- m.addItem (7, "Rename...");
-
- if (! isRoot())
- m.addItem (8, "Delete");
-
- launchPopupMenu (m);
-}
-
-void GroupTreeViewItem::handlePopupMenuResult (int resultCode)
-{
- switch (resultCode)
- {
- case 1: openOrCloseAllSubGroups (*this, false); break;
- case 2: openOrCloseAllSubGroups (*this, true); break;
- case 3: setFilesToCompile (item, true); break;
- case 4: setFilesToCompile (item, false); break;
- case 5: item.sortAlphabetically (false); break;
- case 6: item.sortAlphabetically (true); break;
- case 7: triggerAsyncRename (item); break;
- case 8: deleteAllSelectedItems(); break;
- default: processCreateFileMenuItem (resultCode); break;
- }
-}
-
-void GroupTreeViewItem::addCreateFileMenuItems (PopupMenu& m)
-{
- m.addItem (1001, "Add New Group");
- m.addItem (1002, "Add Existing Files...");
-
- m.addSeparator();
- NewFileWizard().addWizardsToMenu (m);
-}
-
-void GroupTreeViewItem::processCreateFileMenuItem (int menuID)
-{
- switch (menuID)
- {
- case 1001: addNewGroup(); break;
- case 1002: browseToAddExistingFiles(); break;
-
- default:
- NewFileWizard().runWizardFromMenu (menuID, item);
- break;
- }
-}
-
-//==============================================================================
-//==============================================================================
-SourceFileTreeViewItem::SourceFileTreeViewItem (const Project::Item& item_)
- : ProjectTreeViewBase (item_)
-{
-}
-
-SourceFileTreeViewItem::~SourceFileTreeViewItem()
-{
-}
-
-String SourceFileTreeViewItem::getDisplayName() const
-{
- return getFile().getFileName();
-}
-
-static File findCorrespondingHeaderOrCpp (const File& f)
-{
- if (f.hasFileExtension (sourceFileExtensions))
- return f.withFileExtension (".h");
- else if (f.hasFileExtension (headerFileExtensions))
- return f.withFileExtension (".cpp");
-
- return File::nonexistent;
-}
-
-void SourceFileTreeViewItem::setName (const String& newName)
-{
- 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!");
- }
-}
-
-ProjectTreeViewBase* SourceFileTreeViewItem::createSubItem (const Project::Item&)
-{
- jassertfalse;
- return nullptr;
-}
-
-void SourceFileTreeViewItem::showDocument()
-{
- const File f (getFile());
-
- if (f.exists())
- if (ProjectContentComponent* pcc = getProjectContentComponent())
- pcc->showEditorForFile (f, false);
-}
-
-void SourceFileTreeViewItem::showPopupMenu()
-{
- PopupMenu m;
-
- if (GroupTreeViewItem* 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 SourceFileTreeViewItem::handlePopupMenuResult (int resultCode)
-{
- switch (resultCode)
- {
- case 1: getFile().startAsProcess(); break;
- case 2: revealInFinder(); break;
- case 3: deleteAllSelectedItems(); break;
- case 4: triggerAsyncRename (item); break;
-
- default:
- if (GroupTreeViewItem* parentGroup = dynamic_cast (getParentProjectItem()))
- parentGroup->processCreateFileMenuItem (resultCode);
-
- break;
- }
-}
diff --git a/extras/Introjucer/Source/Project/jucer_TreeViewTypes.h b/extras/Introjucer/Source/Project/jucer_TreeViewTypes.h
deleted file mode 100644
index c0fe3d44a8..0000000000
--- a/extras/Introjucer/Source/Project/jucer_TreeViewTypes.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2013 - Raw Material Software 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.
-
- ==============================================================================
-*/
-
-#ifndef __JUCER_TREEVIEWTYPES_JUCEHEADER__
-#define __JUCER_TREEVIEWTYPES_JUCEHEADER__
-
-#include "jucer_ProjectTreeViewBase.h"
-
-
-//==============================================================================
-class SourceFileTreeViewItem : public ProjectTreeViewBase
-{
-public:
- SourceFileTreeViewItem (const Project::Item& item);
- ~SourceFileTreeViewItem();
-
- bool acceptsFileDrop (const StringArray&) const { return false; }
- bool acceptsDragItems (const OwnedArray &) { return false; }
- ProjectTreeViewBase* createSubItem (const Project::Item& child);
- void showDocument();
- void showPopupMenu();
- void handlePopupMenuResult (int resultCode);
- String getDisplayName() const;
- void setName (const String& newName);
-};
-
-//==============================================================================
-class GroupTreeViewItem : public ProjectTreeViewBase
-{
-public:
- GroupTreeViewItem (const Project::Item& item);
- ~GroupTreeViewItem();
-
- bool isRoot() const { return item.isMainGroup(); }
- bool acceptsFileDrop (const StringArray&) const { return true; }
- bool acceptsDragItems (const OwnedArray & selectedNodes);
- void checkFileStatus();
- void moveSelectedItemsTo (OwnedArray & selectedNodes, int insertIndex);
- ProjectTreeViewBase* createSubItem (const Project::Item& child);
- void showDocument();
- void showPopupMenu();
- void handlePopupMenuResult (int resultCode);
-
- void addFiles (const StringArray& files, int insertIndex);
- void addNewGroup();
-
- void addCreateFileMenuItems (PopupMenu& m);
- void processCreateFileMenuItem (int item);
-};
-
-
-#endif // __JUCER_TREEVIEWTYPES_JUCEHEADER__