| @@ -142,8 +142,15 @@ | |||
| <Option compile="0"/> | |||
| <Option link="0"/> | |||
| </Unit> | |||
| <Unit filename="../../Source/Project/jucer_ConfigPage.cpp"/> | |||
| <Unit filename="../../Source/Project/jucer_ConfigPage.h"> | |||
| <Unit filename="../../Source/Project/jucer_ConfigTree_Base.h"> | |||
| <Option compile="0"/> | |||
| <Option link="0"/> | |||
| </Unit> | |||
| <Unit filename="../../Source/Project/jucer_ConfigTree_Exporter.h"> | |||
| <Option compile="0"/> | |||
| <Option link="0"/> | |||
| </Unit> | |||
| <Unit filename="../../Source/Project/jucer_ConfigTree_Modules.h"> | |||
| <Option compile="0"/> | |||
| <Option link="0"/> | |||
| </Unit> | |||
| @@ -180,18 +187,20 @@ | |||
| <Option compile="0"/> | |||
| <Option link="0"/> | |||
| </Unit> | |||
| <Unit filename="../../Source/Project/jucer_ProjectTreeViewBase.cpp"/> | |||
| <Unit filename="../../Source/Project/jucer_ProjectTreeViewBase.h"> | |||
| <Unit filename="../../Source/Project/jucer_ProjectTree_Base.h"> | |||
| <Option compile="0"/> | |||
| <Option link="0"/> | |||
| </Unit> | |||
| <Unit filename="../../Source/Project/jucer_ProjectType.cpp"/> | |||
| <Unit filename="../../Source/Project/jucer_ProjectType.h"> | |||
| <Unit filename="../../Source/Project/jucer_ProjectTree_File.h"> | |||
| <Option compile="0"/> | |||
| <Option link="0"/> | |||
| </Unit> | |||
| <Unit filename="../../Source/Project/jucer_ProjectTree_Group.h"> | |||
| <Option compile="0"/> | |||
| <Option link="0"/> | |||
| </Unit> | |||
| <Unit filename="../../Source/Project/jucer_TreeViewTypes.cpp"/> | |||
| <Unit filename="../../Source/Project/jucer_TreeViewTypes.h"> | |||
| <Unit filename="../../Source/Project/jucer_ProjectType.cpp"/> | |||
| <Unit filename="../../Source/Project/jucer_ProjectType.h"> | |||
| <Option compile="0"/> | |||
| <Option link="0"/> | |||
| </Unit> | |||
| @@ -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" | |||
| @@ -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 = "<group>"; }; | |||
| 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 = "<group>"; }; | |||
| B8385E9A644BD3CD94876448 ); name = Project; sourceTree = "<group>"; }; | |||
| 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, | |||
| @@ -149,8 +149,9 @@ | |||
| </Filter> | |||
| <Filter Name="Project"> | |||
| <File RelativePath="..\..\Source\Project\jucer_AudioPluginModule.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ConfigPage.cpp"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ConfigPage.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ConfigTree_Base.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ConfigTree_Exporter.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ConfigTree_Modules.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_GroupInformationComponent.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_Module.cpp"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_Module.h"/> | |||
| @@ -163,12 +164,11 @@ | |||
| <File RelativePath="..\..\Source\Project\jucer_Project.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectContentComponent.cpp"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectContentComponent.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectTreeViewBase.cpp"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectTreeViewBase.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectTree_Base.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectTree_File.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectTree_Group.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectType.cpp"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectType.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_TreeViewTypes.cpp"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_TreeViewTypes.h"/> | |||
| </Filter> | |||
| <Filter Name="Project Saving"> | |||
| <File RelativePath="..\..\Source\Project Saving\jucer_ProjectExport_Android.h"/> | |||
| @@ -149,8 +149,9 @@ | |||
| </Filter> | |||
| <Filter Name="Project"> | |||
| <File RelativePath="..\..\Source\Project\jucer_AudioPluginModule.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ConfigPage.cpp"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ConfigPage.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ConfigTree_Base.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ConfigTree_Exporter.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ConfigTree_Modules.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_GroupInformationComponent.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_Module.cpp"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_Module.h"/> | |||
| @@ -163,12 +164,11 @@ | |||
| <File RelativePath="..\..\Source\Project\jucer_Project.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectContentComponent.cpp"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectContentComponent.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectTreeViewBase.cpp"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectTreeViewBase.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectTree_Base.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectTree_File.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectTree_Group.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectType.cpp"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_ProjectType.h"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_TreeViewTypes.cpp"/> | |||
| <File RelativePath="..\..\Source\Project\jucer_TreeViewTypes.h"/> | |||
| </Filter> | |||
| <Filter Name="Project Saving"> | |||
| <File RelativePath="..\..\Source\Project Saving\jucer_ProjectExport_Android.h"/> | |||
| @@ -134,15 +134,12 @@ | |||
| <ClCompile Include="..\..\Source\Application\jucer_Main.cpp"/> | |||
| <ClCompile Include="..\..\Source\Application\jucer_MainWindow.cpp"/> | |||
| <ClCompile Include="..\..\Source\Application\jucer_OpenDocumentManager.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ConfigPage.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_Module.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_NewFileWizard.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_NewProjectWizard.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_Project.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ProjectContentComponent.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ProjectTreeViewBase.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ProjectType.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_TreeViewTypes.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project Saving\jucer_ProjectExporter.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project Saving\jucer_ResourceFile.cpp"/> | |||
| <ClCompile Include="..\..\Source\Utility\jucer_CodeHelpers.cpp"/> | |||
| @@ -1022,7 +1019,9 @@ | |||
| <ClInclude Include="..\..\Source\Application\jucer_MainWindow.h"/> | |||
| <ClInclude Include="..\..\Source\Application\jucer_OpenDocumentManager.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_AudioPluginModule.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigPage.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigTree_Base.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigTree_Exporter.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigTree_Modules.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_GroupInformationComponent.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_Module.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ModulesPanel.h"/> | |||
| @@ -1030,9 +1029,10 @@ | |||
| <ClInclude Include="..\..\Source\Project\jucer_NewProjectWizard.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_Project.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectContentComponent.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTreeViewBase.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTree_Base.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTree_File.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTree_Group.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectType.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_TreeViewTypes.h"/> | |||
| <ClInclude Include="..\..\Source\Project Saving\jucer_ProjectExport_Android.h"/> | |||
| <ClInclude Include="..\..\Source\Project Saving\jucer_ProjectExport_CodeBlocks.h"/> | |||
| <ClInclude Include="..\..\Source\Project Saving\jucer_ProjectExport_Make.h"/> | |||
| @@ -268,9 +268,6 @@ | |||
| <ClCompile Include="..\..\Source\Application\jucer_OpenDocumentManager.cpp"> | |||
| <Filter>The Introjucer\Application</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ConfigPage.cpp"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\Project\jucer_Module.cpp"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClCompile> | |||
| @@ -286,15 +283,9 @@ | |||
| <ClCompile Include="..\..\Source\Project\jucer_ProjectContentComponent.cpp"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ProjectTreeViewBase.cpp"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ProjectType.cpp"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\Project\jucer_TreeViewTypes.cpp"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\Project Saving\jucer_ProjectExporter.cpp"> | |||
| <Filter>The Introjucer\Project Saving</Filter> | |||
| </ClCompile> | |||
| @@ -1332,7 +1323,13 @@ | |||
| <ClInclude Include="..\..\Source\Project\jucer_AudioPluginModule.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigPage.h"> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigTree_Base.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigTree_Exporter.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigTree_Modules.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_GroupInformationComponent.h"> | |||
| @@ -1356,13 +1353,16 @@ | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectContentComponent.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTreeViewBase.h"> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTree_Base.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectType.h"> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTree_File.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_TreeViewTypes.h"> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTree_Group.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectType.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project Saving\jucer_ProjectExport_Android.h"> | |||
| @@ -140,15 +140,12 @@ | |||
| <ClCompile Include="..\..\Source\Application\jucer_Main.cpp"/> | |||
| <ClCompile Include="..\..\Source\Application\jucer_MainWindow.cpp"/> | |||
| <ClCompile Include="..\..\Source\Application\jucer_OpenDocumentManager.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ConfigPage.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_Module.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_NewFileWizard.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_NewProjectWizard.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_Project.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ProjectContentComponent.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ProjectTreeViewBase.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ProjectType.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project\jucer_TreeViewTypes.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project Saving\jucer_ProjectExporter.cpp"/> | |||
| <ClCompile Include="..\..\Source\Project Saving\jucer_ResourceFile.cpp"/> | |||
| <ClCompile Include="..\..\Source\Utility\jucer_CodeHelpers.cpp"/> | |||
| @@ -1028,7 +1025,9 @@ | |||
| <ClInclude Include="..\..\Source\Application\jucer_MainWindow.h"/> | |||
| <ClInclude Include="..\..\Source\Application\jucer_OpenDocumentManager.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_AudioPluginModule.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigPage.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigTree_Base.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigTree_Exporter.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigTree_Modules.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_GroupInformationComponent.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_Module.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ModulesPanel.h"/> | |||
| @@ -1036,9 +1035,10 @@ | |||
| <ClInclude Include="..\..\Source\Project\jucer_NewProjectWizard.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_Project.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectContentComponent.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTreeViewBase.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTree_Base.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTree_File.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTree_Group.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectType.h"/> | |||
| <ClInclude Include="..\..\Source\Project\jucer_TreeViewTypes.h"/> | |||
| <ClInclude Include="..\..\Source\Project Saving\jucer_ProjectExport_Android.h"/> | |||
| <ClInclude Include="..\..\Source\Project Saving\jucer_ProjectExport_CodeBlocks.h"/> | |||
| <ClInclude Include="..\..\Source\Project Saving\jucer_ProjectExport_Make.h"/> | |||
| @@ -268,9 +268,6 @@ | |||
| <ClCompile Include="..\..\Source\Application\jucer_OpenDocumentManager.cpp"> | |||
| <Filter>The Introjucer\Application</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ConfigPage.cpp"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\Project\jucer_Module.cpp"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClCompile> | |||
| @@ -286,15 +283,9 @@ | |||
| <ClCompile Include="..\..\Source\Project\jucer_ProjectContentComponent.cpp"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ProjectTreeViewBase.cpp"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\Project\jucer_ProjectType.cpp"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\Project\jucer_TreeViewTypes.cpp"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\Project Saving\jucer_ProjectExporter.cpp"> | |||
| <Filter>The Introjucer\Project Saving</Filter> | |||
| </ClCompile> | |||
| @@ -1332,7 +1323,13 @@ | |||
| <ClInclude Include="..\..\Source\Project\jucer_AudioPluginModule.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigPage.h"> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigTree_Base.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigTree_Exporter.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ConfigTree_Modules.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_GroupInformationComponent.h"> | |||
| @@ -1356,13 +1353,16 @@ | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectContentComponent.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTreeViewBase.h"> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTree_Base.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectType.h"> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTree_File.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_TreeViewTypes.h"> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectTree_Group.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project\jucer_ProjectType.h"> | |||
| <Filter>The Introjucer\Project</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\Source\Project Saving\jucer_ProjectExport_Android.h"> | |||
| @@ -118,10 +118,12 @@ | |||
| <GROUP id="vGFZIJg" name="Project"> | |||
| <FILE id="a9a1b" name="jucer_AudioPluginModule.h" compile="0" resource="0" | |||
| file="Source/Project/jucer_AudioPluginModule.h"/> | |||
| <FILE id="tDp9h9" name="jucer_ConfigPage.cpp" compile="1" resource="0" | |||
| file="Source/Project/jucer_ConfigPage.cpp"/> | |||
| <FILE id="tlj7HT" name="jucer_ConfigPage.h" compile="0" resource="0" | |||
| file="Source/Project/jucer_ConfigPage.h"/> | |||
| <FILE id="xYS0qQ" name="jucer_ConfigTree_Base.h" compile="0" resource="0" | |||
| file="Source/Project/jucer_ConfigTree_Base.h"/> | |||
| <FILE id="mLHZta" name="jucer_ConfigTree_Exporter.h" compile="0" resource="0" | |||
| file="Source/Project/jucer_ConfigTree_Exporter.h"/> | |||
| <FILE id="OO3lfM" name="jucer_ConfigTree_Modules.h" compile="0" resource="0" | |||
| file="Source/Project/jucer_ConfigTree_Modules.h"/> | |||
| <FILE id="sQjHbVN" name="jucer_GroupInformationComponent.h" compile="0" | |||
| resource="0" file="Source/Project/jucer_GroupInformationComponent.h"/> | |||
| <FILE id="MJkOAX" name="jucer_Module.cpp" compile="1" resource="0" | |||
| @@ -145,18 +147,16 @@ | |||
| resource="0" file="Source/Project/jucer_ProjectContentComponent.cpp"/> | |||
| <FILE id="mIJMR08" name="jucer_ProjectContentComponent.h" compile="0" | |||
| resource="0" file="Source/Project/jucer_ProjectContentComponent.h"/> | |||
| <FILE id="TL3snCb" name="jucer_ProjectTreeViewBase.cpp" compile="1" | |||
| resource="0" file="Source/Project/jucer_ProjectTreeViewBase.cpp"/> | |||
| <FILE id="UwhAsi1" name="jucer_ProjectTreeViewBase.h" compile="0" resource="0" | |||
| file="Source/Project/jucer_ProjectTreeViewBase.h"/> | |||
| <FILE id="UwhAsi1" name="jucer_ProjectTree_Base.h" compile="0" resource="0" | |||
| file="Source/Project/jucer_ProjectTree_Base.h"/> | |||
| <FILE id="wiMMXX" name="jucer_ProjectTree_File.h" compile="0" resource="0" | |||
| file="Source/Project/jucer_ProjectTree_File.h"/> | |||
| <FILE id="WaT0B16" name="jucer_ProjectTree_Group.h" compile="0" resource="0" | |||
| file="Source/Project/jucer_ProjectTree_Group.h"/> | |||
| <FILE id="WQ6fWQ" name="jucer_ProjectType.cpp" compile="1" resource="0" | |||
| file="Source/Project/jucer_ProjectType.cpp"/> | |||
| <FILE id="davId" name="jucer_ProjectType.h" compile="0" resource="0" | |||
| file="Source/Project/jucer_ProjectType.h"/> | |||
| <FILE id="JTbTiIc" name="jucer_TreeViewTypes.cpp" compile="1" resource="0" | |||
| file="Source/Project/jucer_TreeViewTypes.cpp"/> | |||
| <FILE id="WaT0B16" name="jucer_TreeViewTypes.h" compile="0" resource="0" | |||
| file="Source/Project/jucer_TreeViewTypes.h"/> | |||
| </GROUP> | |||
| <GROUP id="{579C9644-D5C2-8469-9439-F91C81337531}" name="Project Saving"> | |||
| <FILE id="TtXohM" name="jucer_ProjectExport_Android.h" compile="0" | |||
| @@ -23,7 +23,6 @@ | |||
| */ | |||
| #include "jucer_ResourceFile.h" | |||
| #include "../Project/jucer_ProjectTreeViewBase.h" | |||
| #include "../Application/jucer_OpenDocumentManager.h" | |||
| static const char* resourceFileIdentifierString = "JUCER_BINARY_RESOURCE"; | |||
| @@ -1,469 +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 "../Project Saving/jucer_ProjectExporter.h" | |||
| #include "../Application/jucer_Application.h" | |||
| #include "jucer_ConfigPage.h" | |||
| #include "jucer_ModulesPanel.h" | |||
| //============================================================================== | |||
| void SettingsTreeViewItemBase::showSettingsPage (Component* content) | |||
| { | |||
| content->setComponentID (getUniqueName()); | |||
| ScopedPointer<Component> 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<PropertyPanelViewport*> (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<ProjectExporter> 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); | |||
| } | |||
| @@ -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<PropertyComponent> 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<int> 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 <SettingsTreeViewItemBase*> (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__ | |||
| @@ -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<PropertyComponent> 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<Component> comp (content); | |||
| if (ProjectContentComponent* pcc = getProjectContentComponent()) | |||
| pcc->setEditorComponent (new PropertyPanelViewport (comp.release()), nullptr); | |||
| } | |||
| void closeSettingsPage() | |||
| { | |||
| if (ProjectContentComponent* pcc = getProjectContentComponent()) | |||
| { | |||
| if (PropertyPanelViewport* ppv = dynamic_cast<PropertyPanelViewport*> (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<ConfigTreeItemBase*> (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<int> 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) | |||
| }; | |||
| @@ -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<ProjectExporter> 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) | |||
| }; | |||
| @@ -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) | |||
| }; | |||
| @@ -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<ProjectTreeItemBase*> (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<ConfigTreeItemBase*> (rootItem.get())) | |||
| if (root->isProjectSettings()) | |||
| root->setSelected (true, true); | |||
| } | |||
| void showModules() | |||
| { | |||
| if (ConfigTreeItemBase* root = dynamic_cast<ConfigTreeItemBase*> (rootItem.get())) | |||
| if (root->isProjectSettings()) | |||
| if (ConfigTreeItemBase* mods = dynamic_cast<ConfigTreeItemBase*> (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<FileTreeTab*> (treeViewTabs.getTabContentComponent (0))) | |||
| return &(ft->tree); | |||
| return nullptr; | |||
| } | |||
| ProjectTreeViewBase* ProjectContentComponent::getFilesTreeRoot() const | |||
| { | |||
| if (TreeView* tv = getFilesTreeView()) | |||
| return dynamic_cast <ProjectTreeViewBase*> (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<FileTreePanel*> (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<TreePanelBase*> (treeViewTabs.getCurrentContentComponent())) | |||
| if (SettingsTreeViewItemBase* root = dynamic_cast<SettingsTreeViewItemBase*> (tree->rootItem.get())) | |||
| if (root->isProjectSettings()) | |||
| root->setSelected (true, true); | |||
| if (ConfigTreePanel* const tree = dynamic_cast<ConfigTreePanel*> (treeViewTabs.getCurrentContentComponent())) | |||
| tree->showProjectSettings(); | |||
| } | |||
| void ProjectContentComponent::showModules() | |||
| { | |||
| showConfigTab(); | |||
| if (TreePanelBase* const tree = dynamic_cast<TreePanelBase*> (treeViewTabs.getCurrentContentComponent())) | |||
| if (SettingsTreeViewItemBase* root = dynamic_cast<SettingsTreeViewItemBase*> (tree->rootItem.get())) | |||
| if (root->isProjectSettings()) | |||
| if (SettingsTreeViewItemBase* mods = dynamic_cast<SettingsTreeViewItemBase*> (root->getSubItem (0))) | |||
| if (mods->isModulesList()) | |||
| mods->setSelected (true, true); | |||
| if (ConfigTreePanel* const tree = dynamic_cast<ConfigTreePanel*> (treeViewTabs.getCurrentContentComponent())) | |||
| tree->showModules(); | |||
| } | |||
| StringArray ProjectContentComponent::getExportersWhichCanLaunch() const | |||
| @@ -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) | |||
| @@ -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 <ProjectTreeViewBase*> (getParentItem())) | |||
| p->addFiles (files, insertIndex); | |||
| } | |||
| void ProjectTreeViewBase::moveSelectedItemsTo (OwnedArray <Project::Item>&, 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 <ProjectTreeViewBase*> (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 <ProjectTreeViewBase*> (tree->getRootItem())) | |||
| if (ProjectTreeViewBase* found = root->findTreeViewItem (itemToRename)) | |||
| found->showRenameBox(); | |||
| } | |||
| private: | |||
| Component::SafePointer<TreeView> 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 <File> filesToTrash; | |||
| OwnedArray <Project::Item> itemsToRemove; | |||
| for (int i = 0; i < numSelected; ++i) | |||
| { | |||
| if (const ProjectTreeViewBase* const p = dynamic_cast <ProjectTreeViewBase*> (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 <ProjectTreeViewBase*> (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 <Project::Item>& 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 <Project::Item>& selectedNodes) | |||
| { | |||
| TreeView* tree = dynamic_cast <TreeView*> (componentInTree); | |||
| if (tree == nullptr) | |||
| tree = componentInTree->findParentComponentOfClass<TreeView>(); | |||
| if (tree != nullptr) | |||
| { | |||
| const int numSelected = tree->getNumSelectedItems(); | |||
| for (int i = 0; i < numSelected; ++i) | |||
| if (const ProjectTreeViewBase* const p = dynamic_cast <ProjectTreeViewBase*> (tree->getSelectedItem (i))) | |||
| selectedNodes.add (new Project::Item (p->item)); | |||
| } | |||
| } | |||
| bool ProjectTreeViewBase::isInterestedInDragSource (const DragAndDropTarget::SourceDetails& dragSourceDetails) | |||
| { | |||
| if (dragSourceDetails.description != projectItemDragType) | |||
| return false; | |||
| OwnedArray <Project::Item> selectedNodes; | |||
| getAllSelectedNodesInTree (dragSourceDetails.sourceComponent, selectedNodes); | |||
| return selectedNodes.size() > 0 && acceptsDragItems (selectedNodes); | |||
| } | |||
| void ProjectTreeViewBase::itemDropped (const DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex) | |||
| { | |||
| OwnedArray <Project::Item> selectedNodes; | |||
| getAllSelectedNodesInTree (dragSourceDetails.sourceComponent, selectedNodes); | |||
| if (selectedNodes.size() > 0) | |||
| { | |||
| TreeView* tree = getOwnerView(); | |||
| ScopedPointer <XmlElement> 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 <ProjectTreeViewBase*> (getParentItem()); | |||
| } | |||
| @@ -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 <Project::Item>& 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 <Project::Item>& 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 <Project::Item>& 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 <Project::Item>& selectedNodes, | |||
| Project::Item destNode, int insertIndex); | |||
| ProjectTreeViewBase* getParentProjectItem() const; | |||
| }; | |||
| #endif // __JUCER_PROJECTTREEVIEWBASE_JUCEHEADER__ | |||
| @@ -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<Project::Item>& 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 <File> filesToTrash; | |||
| OwnedArray <Project::Item> itemsToRemove; | |||
| for (int i = 0; i < numSelected; ++i) | |||
| { | |||
| if (const ProjectTreeItemBase* const p = dynamic_cast<ProjectTreeItemBase*> (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<ProjectTreeItemBase*> (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 <Project::Item>& 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<ProjectTreeItemBase*> (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 <Project::Item> selectedNodes; | |||
| getAllSelectedNodesInTree (dragSourceDetails.sourceComponent, selectedNodes); | |||
| return selectedNodes.size() > 0 && acceptsDragItems (selectedNodes); | |||
| } | |||
| void itemDropped (const DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex) override | |||
| { | |||
| OwnedArray <Project::Item> selectedNodes; | |||
| getAllSelectedNodesInTree (dragSourceDetails.sourceComponent, selectedNodes); | |||
| if (selectedNodes.size() > 0) | |||
| { | |||
| TreeView* tree = getOwnerView(); | |||
| ScopedPointer <XmlElement> 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 <Project::Item>& selectedNodes) | |||
| { | |||
| TreeView* tree = dynamic_cast<TreeView*> (componentInTree); | |||
| if (tree == nullptr) | |||
| tree = componentInTree->findParentComponentOfClass<TreeView>(); | |||
| if (tree != nullptr) | |||
| { | |||
| const int numSelected = tree->getNumSelectedItems(); | |||
| for (int i = 0; i < numSelected; ++i) | |||
| if (const ProjectTreeItemBase* const p = dynamic_cast<ProjectTreeItemBase*> (tree->getSelectedItem (i))) | |||
| selectedNodes.add (new Project::Item (p->item)); | |||
| } | |||
| } | |||
| ProjectTreeItemBase* getParentProjectItem() const | |||
| { | |||
| return dynamic_cast<ProjectTreeItemBase*> (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<ProjectTreeItemBase*> (tree->getRootItem())) | |||
| if (ProjectTreeItemBase* found = root->findTreeViewItem (itemToRename)) | |||
| found->showRenameBox(); | |||
| } | |||
| private: | |||
| Component::SafePointer<TreeView> tree; | |||
| Project::Item itemToRename; | |||
| }; | |||
| (new RenameMessage (getOwnerView(), itemToRename))->post(); | |||
| } | |||
| static void moveItems (OwnedArray <Project::Item>& 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; | |||
| } | |||
| }; | |||
| @@ -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 <Project::Item>&) { 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<GroupItem*> (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<GroupItem*> (getParentProjectItem())) | |||
| parentGroup->processCreateFileMenuItem (resultCode); | |||
| break; | |||
| } | |||
| } | |||
| }; | |||
| @@ -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<Project::Item>& 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<Project::Item>& selectedNodes, int insertIndex) | |||
| { | |||
| moveItems (selectedNodes, item, insertIndex); | |||
| } | |||
| void checkFileStatus() | |||
| { | |||
| for (int i = 0; i < getNumSubItems(); ++i) | |||
| if (ProjectTreeItemBase* p = dynamic_cast<ProjectTreeItemBase*> (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; | |||
| } | |||
| } | |||
| }; | |||
| @@ -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 <Project::Item>& 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 <Project::Item>& selectedNodes, int insertIndex) | |||
| { | |||
| moveItems (selectedNodes, item, insertIndex); | |||
| } | |||
| void GroupTreeViewItem::checkFileStatus() | |||
| { | |||
| for (int i = 0; i < getNumSubItems(); ++i) | |||
| if (ProjectTreeViewBase* p = dynamic_cast <ProjectTreeViewBase*> (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 <GroupTreeViewItem*> (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 <GroupTreeViewItem*> (getParentProjectItem())) | |||
| parentGroup->processCreateFileMenuItem (resultCode); | |||
| break; | |||
| } | |||
| } | |||
| @@ -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 <Project::Item>&) { 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 <Project::Item>& selectedNodes); | |||
| void checkFileStatus(); | |||
| void moveSelectedItemsTo (OwnedArray <Project::Item>& 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__ | |||