diff --git a/extras/Introjucer/Builds/Linux/Makefile b/extras/Introjucer/Builds/Linux/Makefile index a9d71d0fd6..345dd21267 100644 --- a/extras/Introjucer/Builds/Linux/Makefile +++ b/extras/Introjucer/Builds/Linux/Makefile @@ -43,6 +43,7 @@ ifeq ($(CONFIG),Release) endif OBJECTS := \ + $(OBJDIR)/jucer_AppearanceSettings_788d9889.o \ $(OBJDIR)/jucer_CommandLine_f35de107.o \ $(OBJDIR)/jucer_DocumentEditorComponent_695dff1d.o \ $(OBJDIR)/jucer_FilePreviewComponent_55512f53.o \ @@ -92,6 +93,11 @@ clean: -@rm -rf $(OBJDIR)/* -@rm -rf $(OBJDIR) +$(OBJDIR)/jucer_AppearanceSettings_788d9889.o: ../../Source/Application/jucer_AppearanceSettings.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling jucer_AppearanceSettings.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/jucer_CommandLine_f35de107.o: ../../Source/Application/jucer_CommandLine.cpp -@mkdir -p $(OBJDIR) @echo "Compiling jucer_CommandLine.cpp" diff --git a/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj b/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj index fe712644b0..7cfa1b94bc 100644 --- a/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj +++ b/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 11D42F7EC6E6539D79A7F4B1 = { isa = PBXBuildFile; fileRef = E5D6C36496F5BC84D7213BE8; }; B980464FA2761CCD64B1FAD6 = { isa = PBXBuildFile; fileRef = CF6C8BD0DA3D8CD4E99EBADA; }; 1321E6C1C6170B6C898AD09D = { isa = PBXBuildFile; fileRef = 951128CA33CCDEF570436B1C; }; + 357A6AA6960EF95D92929BEE = { isa = PBXBuildFile; fileRef = 441CFEA771BAA50E187342E9; }; 954A036F5DDB375DB23FFB3E = { isa = PBXBuildFile; fileRef = 0400CB0E056A1D840304D2DE; }; 3EB3D569250C4BA4CA9AF578 = { isa = PBXBuildFile; fileRef = C7608A3967D9AB9481848F2B; }; 9A4D477F1924C31A52AF5C79 = { isa = PBXBuildFile; fileRef = F2FA27430D90E92F0C9EBEDF; }; @@ -152,6 +153,7 @@ 21FAFA7F2C5D0E8D99876EA8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Direct2DGraphicsContext.cpp"; path = "../../../../modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; 2210EB5F41023B53ADD0DFBD = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../../../modules/juce_cryptography/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; 221C1BAC4138F261F97121AD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GIFLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 223C4209F18A221EB183A056 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_AppearanceSettings.h"; path = "../../Source/Application/jucer_AppearanceSettings.h"; sourceTree = "SOURCE_ROOT"; }; 2247EE920DF0610CAF9F4513 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_OpenDocumentManager.cpp"; path = "../../Source/Application/jucer_OpenDocumentManager.cpp"; sourceTree = "SOURCE_ROOT"; }; 2252F2B96709F3C7CE07B5E7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Application.h"; path = "../../../../modules/juce_gui_basics/application/juce_Application.h"; sourceTree = "SOURCE_ROOT"; }; 225414095942818432AAE07D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Expression.cpp"; path = "../../../../modules/juce_core/maths/juce_Expression.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -231,6 +233,7 @@ 430239E0574C157689D83206 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeDocument.h"; path = "../../../../modules/juce_gui_extra/code_editor/juce_CodeDocument.h"; sourceTree = "SOURCE_ROOT"; }; 43B98AB307841FAAB076B882 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Justification.cpp"; path = "../../../../modules/juce_graphics/placement/juce_Justification.cpp"; sourceTree = "SOURCE_ROOT"; }; 441A0EA83E44264CB977F21B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CarbonViewWrapperComponent.h"; path = "../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 441CFEA771BAA50E187342E9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AppearanceSettings.cpp"; path = "../../Source/Application/jucer_AppearanceSettings.cpp"; sourceTree = "SOURCE_ROOT"; }; 442031AD0C8A280B68CE9EF0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableCornerComponent.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; 4437785A3DFF4AB2D6A78DB3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutResizerBar.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp"; sourceTree = "SOURCE_ROOT"; }; 444CA4B9CAD1F5ED5C45448B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemPalette.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -559,7 +562,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"; }; BD7C18F07DE633B97B4478E7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -599,9 +601,7 @@ C7E19F79947BEFC7DB7A9CE7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GlowEffect.cpp"; path = "../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; 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"; }; @@ -619,54 +619,54 @@ 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"; }; 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"; }; D00F311BFC3C2625C457CB9B = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; D0F1614CC861E8E0B59B7A06 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Messaging.cpp"; path = "../../../../modules/juce_events/native/juce_linux_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; - D10D51A0A2D63F38B4D86A60 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ResourceFile.cpp"; path = "../../Source/Project Saving/jucer_ResourceFile.cpp"; sourceTree = "SOURCE_ROOT"; }; D141433D3FE81F20490DE928 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Desktop.h"; path = "../../../../modules/juce_gui_basics/components/juce_Desktop.h"; sourceTree = "SOURCE_ROOT"; }; D1F9B0E9F5D54FE48BEB46EA = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; D253F74B7F5734984E568CA7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Files.cpp"; path = "../../../../modules/juce_core/native/juce_linux_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + D2F1CF252F7EC62B35A21CB6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadowEffect.cpp"; path = "../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; + D2F80DA0946A5EE01FC016CA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF32.h"; path = "../../../../modules/juce_core/text/juce_CharPointer_UTF32.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"; }; 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"; }; D4F2D42C58F4D86E00E76F31 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandID.h"; path = "../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandID.h"; sourceTree = "SOURCE_ROOT"; }; - D503780AB98993E8F0BA1311 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageComponent.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; - D5057D7B18ABD5E810A6F830 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeface.cpp"; path = "../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + D526C38D581425949BA0E4AC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FilePreviewComponent.h"; path = "../../Source/Application/jucer_FilePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; }; D53B54D1786A1FFC024BF064 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_cryptography.mm"; path = "../../../../modules/juce_cryptography/juce_cryptography.mm"; sourceTree = "SOURCE_ROOT"; }; D5A6D00DEFDC650AF432A698 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Initialisation.h"; path = "../../../../modules/juce_gui_basics/application/juce_Initialisation.h"; sourceTree = "SOURCE_ROOT"; }; D678882D133090214AF681BC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadLocalValue.h"; path = "../../../../modules/juce_core/threads/juce_ThreadLocalValue.h"; sourceTree = "SOURCE_ROOT"; }; - D6C91E2BF537F75A80F5C1DB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListBox.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ListBox.h"; sourceTree = "SOURCE_ROOT"; }; D75EAC16FAECCC51E3669193 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandInfo.h"; path = "../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h"; sourceTree = "SOURCE_ROOT"; }; D780ED33573AED5AD383A036 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CaretComponent.h"; path = "../../../../modules/juce_gui_basics/keyboard/juce_CaretComponent.h"; sourceTree = "SOURCE_ROOT"; }; D782DA091AD3ECE158FC6A5F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ButtonPropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; D800DE818BEDBF4579D15B1D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AppleRemote.mm"; path = "../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm"; 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"; }; - 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"; }; DC5E7FF30B01118F6DAEC38F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Time.cpp"; path = "../../../../modules/juce_core/time/juce_Time.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"; }; + 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"; }; E5D6C36496F5BC84D7213BE8 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - E60E28D1B7491047DEA236AE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ProjectContentComponent.h"; path = "../../Source/Project/jucer_ProjectContentComponent.h"; sourceTree = "SOURCE_ROOT"; }; - E70CA21960A64CCB835725FF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjectType.cpp"; path = "../../Source/Project/jucer_ProjectType.cpp"; 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"; }; - CF8011B3C67B609032974DA5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_NewCppFileTemplate.cpp"; path = "../../Source/BinaryData/jucer_NewCppFileTemplate.cpp"; sourceTree = "SOURCE_ROOT"; }; - D2F1CF252F7EC62B35A21CB6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadowEffect.cpp"; path = "../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; - D2F80DA0946A5EE01FC016CA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF32.h"; path = "../../../../modules/juce_core/text/juce_CharPointer_UTF32.h"; sourceTree = "SOURCE_ROOT"; }; - D526C38D581425949BA0E4AC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_FilePreviewComponent.h"; path = "../../Source/Application/jucer_FilePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + BBA6060656F685ED7FA52045 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TreeViewTypes.h"; path = "../../Source/Project/jucer_TreeViewTypes.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"; }; + C9616830BB2474066AC8C910 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ResourceFile.h"; path = "../../Source/Project Saving/jucer_ResourceFile.h"; sourceTree = "SOURCE_ROOT"; }; + D10D51A0A2D63F38B4D86A60 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ResourceFile.cpp"; path = "../../Source/Project Saving/jucer_ResourceFile.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"; }; + D503780AB98993E8F0BA1311 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageComponent.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_ImageComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + D5057D7B18ABD5E810A6F830 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeface.cpp"; path = "../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + D6C91E2BF537F75A80F5C1DB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListBox.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ListBox.h"; sourceTree = "SOURCE_ROOT"; }; D7A7F1AA9F313B0CCAAA73A0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MathsFunctions.h"; path = "../../../../modules/juce_core/maths/juce_MathsFunctions.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"; }; - 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"; }; - 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"; }; - DD985A60FB76E976AF91852D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SHA256.h"; path = "../../../../modules/juce_cryptography/hashing/juce_SHA256.h"; 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"; }; + DF7BB5B6B394EDEEF5F5B4B8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallbackMessage.h"; path = "../../../../modules/juce_events/messages/juce_CallbackMessage.h"; 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"; }; E1C16C872E34BCB144B469F9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_EdgeTable.h"; path = "../../../../modules/juce_graphics/geometry/juce_EdgeTable.h"; sourceTree = "SOURCE_ROOT"; }; @@ -680,10 +680,12 @@ E530742870F07704E9616358 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemComponent.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"; 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"; }; E642193A9990C48CFB6479A9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileListComponent.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.h"; sourceTree = "SOURCE_ROOT"; }; E654E3A3CD45A888C5F773DF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarModel.h"; path = "../../../../modules/juce_gui_basics/menus/juce_MenuBarModel.h"; sourceTree = "SOURCE_ROOT"; }; E65A820D34BF39478B7C5925 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_DocumentEditorComponent.h"; path = "../../Source/Application/jucer_DocumentEditorComponent.h"; sourceTree = "SOURCE_ROOT"; }; E6F5CEC32EDC917B054467EF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReadWriteLock.cpp"; path = "../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp"; sourceTree = "SOURCE_ROOT"; }; + E70CA21960A64CCB835725FF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ProjectType.cpp"; path = "../../Source/Project/jucer_ProjectType.cpp"; sourceTree = "SOURCE_ROOT"; }; E73C7E17116F6085765622E3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Drawable.h"; path = "../../../../modules/juce_gui_basics/drawables/juce_Drawable.h"; sourceTree = "SOURCE_ROOT"; }; E7A4604F766ABC8BE26C94A1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeParallelogram.cpp"; path = "../../../../modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp"; sourceTree = "SOURCE_ROOT"; }; 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"; }; @@ -691,6 +693,7 @@ 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"; }; + E7F7033084AC10FB77B0F77A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_ConfigPage.cpp"; path = "../../Source/Project/jucer_ConfigPage.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"; }; E9B8C3CA480AE94BEA852EA9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_Windowing.mm"; path = "../../../../modules/juce_gui_basics/native/juce_ios_Windowing.mm"; sourceTree = "SOURCE_ROOT"; }; @@ -748,6 +751,8 @@ FF10E9B389909FB45E229D5B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComboBox.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ComboBox.h"; sourceTree = "SOURCE_ROOT"; }; FF1F954094B14C1900C9495D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_posix_SharedCode.h"; path = "../../../../modules/juce_core/native/juce_posix_SharedCode.h"; sourceTree = "SOURCE_ROOT"; }; ACBAFA7D92DD82AD44ABE68A = { isa = PBXGroup; children = ( + 441CFEA771BAA50E187342E9, + 223C4209F18A221EB183A056, EE690110171E1648FF2118B8, 23A8DE16C0CDB8EED18B008B, 0400CB0E056A1D840304D2DE, @@ -1678,6 +1683,7 @@ C009859650B4628FDD068941 = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 1321E6C1C6170B6C898AD09D ); runOnlyForDeploymentPostprocessing = 0; }; 84449D044096A03F2582904B = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 357A6AA6960EF95D92929BEE, 954A036F5DDB375DB23FFB3E, 3EB3D569250C4BA4CA9AF578, 9A4D477F1924C31A52AF5C79, diff --git a/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj b/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj index 325cc860d2..66093f9c48 100644 --- a/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj +++ b/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj @@ -130,6 +130,8 @@ + + diff --git a/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj b/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj index 0f1b7fa9c2..e2d81e2bd6 100644 --- a/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj +++ b/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj @@ -130,6 +130,8 @@ + + diff --git a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj index 9b90410e0c..f3ac0ffbae 100644 --- a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj +++ b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj @@ -126,6 +126,7 @@ + @@ -965,6 +966,7 @@ + diff --git a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters index 2f409940fa..b9a7ccd616 100644 --- a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters +++ b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters @@ -229,6 +229,9 @@ + + The Introjucer\Application + The Introjucer\Application @@ -1194,6 +1197,9 @@ + + The Introjucer\Application + The Introjucer\Application diff --git a/extras/Introjucer/Introjucer.jucer b/extras/Introjucer/Introjucer.jucer index 49d047f7c1..b8155d278b 100644 --- a/extras/Introjucer/Introjucer.jucer +++ b/extras/Introjucer/Introjucer.jucer @@ -65,6 +65,10 @@ + + = 0;) + { + CodeEditorComponent::ColourScheme::TokenType& t = cs.types.getReference(i); + getColourValue (t.name) = t.colour.toString(); + } + + Font f (editor.getFont()); + f.setTypefaceName (f.getTypeface()->getName()); + getCodeFontValue() = f.toString(); +} + +bool AppearanceSettings::readFromFile (const File& file) +{ + const ScopedPointer xml (XmlDocument::parse (file)); + + if (xml != nullptr && xml->hasTagName (settings.getType().toString())) + { + settings = ValueTree::fromXml (*xml); + return true; + } + + return false; +} + +bool AppearanceSettings::writeToFile (const File& file) const +{ + const ScopedPointer xml (settings.createXml()); + return xml != nullptr && xml->writeToFile (file, String::empty); +} + +StringArray AppearanceSettings::getColourNames() const +{ + StringArray s; + + for (int i = 0; i < settings.getNumChildren(); ++i) + { + const ValueTree c (settings.getChild(i)); + + if (c.hasType ("COLOUR")) + s.add (c [Ids::name]); + } + + return s; +} + +void AppearanceSettings::applyToCodeEditor (CodeEditorComponent& editor) const +{ + CodeEditorComponent::ColourScheme cs (editor.getColourScheme()); + + for (int i = cs.types.size(); --i >= 0;) + { + CodeEditorComponent::ColourScheme::TokenType& t = cs.types.getReference(i); + getColour (t.name, t.colour); + } + + editor.setColourScheme (cs); + + Colour col; + if (getColour ("Plain Text", col)) editor.setColour (CodeEditorComponent::defaultTextColourId, col); + if (getColour ("Selected Background", col)) editor.setColour (CodeEditorComponent::highlightColourId, col); + + if (getColour ("Background", col)) + { + col = Colours::white.overlaidWith (col); + editor.setColour (CodeEditorComponent::backgroundColourId, col); + editor.setColour (CaretComponent::caretColourId, col.contrasting()); + } + + editor.setFont (getCodeFont()); +} + +Font AppearanceSettings::getCodeFont() const +{ + const String fontString (settings [Ids::font].toString()); + + if (fontString.isEmpty()) + { + #if JUCE_MAC + Font font (13.0f); + font.setTypefaceName ("Menlo"); + #else + Font font (10.0f); + font.setTypefaceName (Font::getDefaultMonospacedFontName()); + #endif + + return font; + } + + return Font::fromString (fontString); +} + +Value AppearanceSettings::getCodeFontValue() +{ + return settings.getPropertyAsValue (Ids::font, nullptr); +} + +Value AppearanceSettings::getColourValue (const String& colourName) +{ + ValueTree c (settings.getChildWithProperty (Ids::name, colourName)); + + if (! c.isValid()) + { + c = ValueTree ("COLOUR"); + c.setProperty (Ids::name, colourName, nullptr); + settings.addChild (c, -1, nullptr); + } + + return c.getPropertyAsValue (Ids::colour, nullptr); +} + +bool AppearanceSettings::getColour (const String& name, Colour& result) const +{ + const ValueTree colour (settings.getChildWithProperty (Ids::name, name)); + + if (colour.isValid()) + { + result = Colour::fromString (colour [Ids::colour].toString()); + return true; + } + + return false; +} + +//============================================================================== +struct AppearanceEditor +{ + class Window : public DialogWindow + { + public: + Window() : DialogWindow ("Appearance Settings", Colours::black, true, true) + { + setUsingNativeTitleBar (true); + setContentOwned (new EditorPanel(), false); + setResizable (true, true); + + const int width = 350; + setResizeLimits (width, 200, width, 1000); + + String windowState (getAppProperties().getValue (getWindowPosName())); + + if (windowState.isNotEmpty()) + restoreWindowStateFromString (windowState); + else + centreAroundComponent (Component::getCurrentlyFocusedComponent(), width, 500); + + setVisible (true); + } + + ~Window() + { + getAppProperties().setValue (getWindowPosName(), getWindowStateAsString()); + } + + void closeButtonPressed() + { + JucerApplication::getApp()->appearanceEditorWindow = nullptr; + } + + private: + static const char* getWindowPosName() { return "colourSchemeEditorPos"; } + + JUCE_DECLARE_NON_COPYABLE (Window); + }; + + //============================================================================== + class EditorPanel : public Component, + private Button::Listener + { + public: + EditorPanel() + : loadButton ("Load Scheme..."), + saveButton ("Save Scheme...") + { + setOpaque (true); + + rebuildProperties(); + addAndMakeVisible (&panel); + + loadButton.setColour (TextButton::buttonColourId, Colours::grey); + saveButton.setColour (TextButton::buttonColourId, Colours::grey); + + addAndMakeVisible (&loadButton); + addAndMakeVisible (&saveButton); + + loadButton.addListener (this); + saveButton.addListener (this); + } + + void rebuildProperties() + { + AppearanceSettings& scheme = getAppSettings().appearance; + + Array props; + Value fontValue (scheme.getCodeFontValue()); + props.add (FontNameValueSource::createProperty ("Code Editor Font", fontValue)); + props.add (FontSizeValueSource::createProperty ("Font Size", fontValue)); + + const StringArray colourNames (scheme.getColourNames()); + + for (int i = 0; i < colourNames.size(); ++i) + props.add (new ColourPropertyComponent (nullptr, colourNames[i], + scheme.getColourValue (colourNames[i]), + Colours::white, false)); + + panel.clear(); + panel.addProperties (props); + } + + void paint (Graphics& g) + { + g.fillAll (Colours::black); + } + + void resized() + { + Rectangle r (getLocalBounds()); + panel.setBounds (r.removeFromTop (getHeight() - 26).reduced (4, 3)); + loadButton.setBounds (r.removeFromLeft (getWidth() / 2).reduced (10, 3)); + saveButton.setBounds (r.reduced (10, 3)); + } + + private: + PropertyPanel panel; + TextButton loadButton, saveButton; + + void buttonClicked (Button* b) + { + if (b == &loadButton) + loadScheme(); + else + saveScheme(); + } + + void saveScheme() + { + FileChooser fc ("Select a file in which to save this colour-scheme...", + getAppSettings().getSchemesFolder().getNonexistentChildFile ("Scheme", ".editorscheme"), + "*.editorscheme"); + + if (fc.browseForFileToSave (true)) + { + File file (fc.getResult().withFileExtension (".editorscheme")); + getAppSettings().appearance.writeToFile (file); + } + } + + void loadScheme() + { + FileChooser fc ("Please select a colour-scheme file to load...", + getAppSettings().getSchemesFolder(), + "*.editorscheme"); + + if (fc.browseForFileToOpen()) + { + if (getAppSettings().appearance.readFromFile (fc.getResult())) + rebuildProperties(); + } + } + + JUCE_DECLARE_NON_COPYABLE (EditorPanel); + }; + + //============================================================================== + class FontNameValueSource : public ValueSourceFilter + { + public: + FontNameValueSource (const Value& source) : ValueSourceFilter (source) {} + + var getValue() const + { + return Font::fromString (sourceValue.toString()).getTypefaceName(); + } + + void setValue (const var& newValue) + { + Font font (Font::fromString (sourceValue.toString())); + font.setTypefaceName (newValue.toString()); + sourceValue = font.toString(); + } + + static ChoicePropertyComponent* createProperty (const String& title, const Value& value) + { + const StringArray& fontNames = getAppSettings().getFontNames(); + + Array values; + for (int i = 0; i < fontNames.size(); ++i) + values.add (fontNames[i]); + + return new ChoicePropertyComponent (Value (new FontNameValueSource (value)), + title, fontNames, values); + } + }; + + //============================================================================== + class FontSizeValueSource : public ValueSourceFilter + { + public: + FontSizeValueSource (const Value& source) : ValueSourceFilter (source) {} + + var getValue() const + { + return Font::fromString (sourceValue.toString()).getHeight(); + } + + void setValue (const var& newValue) + { + sourceValue = Font::fromString (sourceValue.toString()).withHeight (newValue).toString(); + } + + static PropertyComponent* createProperty (const String& title, const Value& value) + { + return new SliderPropertyComponent (Value (new FontSizeValueSource (value)), + title, 5.0, 40.0, 0.1, 0.5); + } + }; +}; + +Component* AppearanceSettings::createEditorWindow() +{ + return new AppearanceEditor::Window(); +} diff --git a/extras/Introjucer/Source/Application/jucer_AppearanceSettings.h b/extras/Introjucer/Source/Application/jucer_AppearanceSettings.h new file mode 100644 index 0000000000..69b74dc9d6 --- /dev/null +++ b/extras/Introjucer/Source/Application/jucer_AppearanceSettings.h @@ -0,0 +1,53 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-11 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online 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.rawmaterialsoftware.com/juce for more information. + + ============================================================================== +*/ + +#ifndef __JUCER_APPEARANCESETTINGS_H_34D762C7__ +#define __JUCER_APPEARANCESETTINGS_H_34D762C7__ + + +class AppearanceSettings +{ +public: + AppearanceSettings (const CodeEditorComponent& editorToCopyFrom); + + bool readFromFile (const File& file); + bool writeToFile (const File& file) const; + + void applyToCodeEditor (CodeEditorComponent& editor) const; + + StringArray getColourNames() const; + Value getColourValue (const String& colourName); + bool getColour (const String& name, Colour& resultIfFound) const; + + Font getCodeFont() const; + Value getCodeFontValue(); + + ValueTree settings; + + static Component* createEditorWindow(); +}; + + +#endif diff --git a/extras/Introjucer/Source/Application/jucer_Application.h b/extras/Introjucer/Source/Application/jucer_Application.h index 3264ce3583..c783b23dfa 100644 --- a/extras/Introjucer/Source/Application/jucer_Application.h +++ b/extras/Introjucer/Source/Application/jucer_Application.h @@ -30,6 +30,7 @@ #include "jucer_MainWindow.h" #include "jucer_JuceUpdater.h" #include "jucer_CommandLine.h" +#include "../Code Editor/jucer_SourceCodeEditor.h" //============================================================================== @@ -80,14 +81,15 @@ public: void shutdown() { + appearanceEditorWindow = nullptr; + #if JUCE_MAC MenuBarModel::setMacMainMenu (nullptr); #endif menuModel = nullptr; mainWindowList.forceCloseAllWindows(); - - OpenDocumentManager::deleteInstance(); + openDocumentManager.clear(); commandManager = nullptr; settings.flush(); } @@ -204,7 +206,7 @@ public: menu.addCommandItem (commandManager, CommandIDs::showProjectSettings); menu.addSeparator(); - menu.addCommandItem (commandManager, CommandIDs::test); + menu.addCommandItem (commandManager, CommandIDs::showAppearanceSettings); menu.addSeparator(); menu.addCommandItem (commandManager, CommandIDs::showGrid); @@ -223,11 +225,11 @@ public: menu.addCommandItem (commandManager, CommandIDs::closeWindow); menu.addSeparator(); - const int numDocs = jmin (50, OpenDocumentManager::getInstance()->getNumOpenDocuments()); + const int numDocs = jmin (50, getApp()->openDocumentManager.getNumOpenDocuments()); for (int i = 0; i < numDocs; ++i) { - OpenDocumentManager::Document* doc = OpenDocumentManager::getInstance()->getOpenDocument(i); + OpenDocumentManager::Document* doc = getApp()->openDocumentManager.getOpenDocument(i); menu.addItem (300 + i, doc->getName()); } @@ -255,7 +257,7 @@ public: } else if (menuItemID >= 300 && menuItemID < 400) { - OpenDocumentManager::Document* doc = OpenDocumentManager::getInstance()->getOpenDocument (menuItemID - 300); + OpenDocumentManager::Document* doc = getApp()->openDocumentManager.getOpenDocument (menuItemID - 300); jassert (doc != nullptr); getApp()->mainWindowList.openDocument (doc); @@ -274,6 +276,7 @@ public: CommandIDs::closeAllDocuments, CommandIDs::saveAll, CommandIDs::updateModules, + CommandIDs::showAppearanceSettings, CommandIDs::showUTF8Tool }; commands.addArray (ids, numElementsInArray (ids)); @@ -298,14 +301,18 @@ public: result.defaultKeypresses.add (KeyPress (',', ModifierKeys::commandModifier, 0)); break; + case CommandIDs::showAppearanceSettings: + result.setInfo ("Fonts and Colours...", "Shows the appearance settings window.", CommandCategories::general, 0); + break; + case CommandIDs::closeAllDocuments: result.setInfo ("Close All Documents", "Closes all open documents", CommandCategories::general, 0); - result.setActive (OpenDocumentManager::getInstance()->getNumOpenDocuments() > 0); + result.setActive (openDocumentManager.getNumOpenDocuments() > 0); break; case CommandIDs::saveAll: result.setInfo ("Save All", "Saves all open documents", CommandCategories::general, 0); - result.setActive (OpenDocumentManager::getInstance()->anyFilesNeedSaving()); + result.setActive (openDocumentManager.anyFilesNeedSaving()); break; case CommandIDs::updateModules: @@ -326,15 +333,17 @@ public: { switch (info.commandID) { - case CommandIDs::newProject: createNewProject(); break; - case CommandIDs::open: askUserToOpenFile(); break; - case CommandIDs::showPrefs: showPrefsPanel(); break; - case CommandIDs::saveAll: OpenDocumentManager::getInstance()->saveAll(); break; - case CommandIDs::closeAllDocuments: closeAllDocuments (true); break; - case CommandIDs::showUTF8Tool: showUTF8ToolWindow(); break; - case CommandIDs::updateModules: runModuleUpdate (String::empty); break; - - default: return JUCEApplication::perform (info); + case CommandIDs::newProject: createNewProject(); break; + case CommandIDs::open: askUserToOpenFile(); break; + case CommandIDs::showPrefs: showPrefsPanel(); break; + case CommandIDs::saveAll: openDocumentManager.saveAll(); break; + case CommandIDs::closeAllDocuments: closeAllDocuments (true); break; + case CommandIDs::showUTF8Tool: showUTF8ToolWindow(); break; + case CommandIDs::showAppearanceSettings: showAppearanceEditorWindow(); break; + case CommandIDs::updateModules: runModuleUpdate (String::empty); break; + + default: + return JUCEApplication::perform (info); } return true; @@ -371,7 +380,7 @@ public: bool closeAllDocuments (bool askUserToSave) { - return OpenDocumentManager::getInstance()->closeAll (askUserToSave); + return openDocumentManager.closeAll (askUserToSave); } bool makeSureUserHasSelectedModuleFolder() @@ -403,6 +412,14 @@ public: return ModuleList::isJuceOrModulesFolder (list.getModulesFolder()); } + void showAppearanceEditorWindow() + { + if (appearanceEditorWindow == nullptr) + appearanceEditorWindow = AppearanceSettings::createEditorWindow(); + + appearanceEditorWindow->toFront (true); + } + //============================================================================== virtual void doExtraInitialisation() {} virtual void addExtraConfigItems (Project&, TreeViewItem&) {} @@ -417,7 +434,11 @@ public: Icons icons; ScopedPointer menuModel; + MainWindowList mainWindowList; + OpenDocumentManager openDocumentManager; + + ScopedPointer appearanceEditorWindow; private: class AsyncQuitRetrier : public Timer diff --git a/extras/Introjucer/Source/Application/jucer_CommandIDs.h b/extras/Introjucer/Source/Application/jucer_CommandIDs.h index 8177d07c75..9bc51cb728 100644 --- a/extras/Introjucer/Source/Application/jucer_CommandIDs.h +++ b/extras/Introjucer/Source/Application/jucer_CommandIDs.h @@ -40,6 +40,7 @@ namespace CommandIDs static const int showProjectSettings = 0x200074; static const int updateModules = 0x200075; static const int showUTF8Tool = 0x200076; + static const int showAppearanceSettings = 0x200077; static const int saveAll = 0x200080; static const int undo = 0x200090; @@ -48,7 +49,6 @@ namespace CommandIDs static const int closeWindow = 0x201001; static const int closeAllDocuments = 0x201000; - static const int test = 0x202090; static const int toFront = 0x2020a0; static const int toBack = 0x2030a1; static const int showOrHideProperties = 0x2030b0; @@ -71,21 +71,11 @@ namespace CommandIDs static const int showGrid = 0x2020e0; static const int enableSnapToGrid = 0x2020f0; - - static const int editCompLayout = 0x202100; - static const int editCompGraphics = 0x202110; - - static const int bringBackLostItems = 0x202120; - static const int zoomIn = 0x202130; static const int zoomOut = 0x202140; static const int zoomNormal = 0x202150; static const int spaceBarDrag = 0x202160; - - static const int compOverlay0 = 0x202200; - static const int compOverlay33 = 0x202210; - static const int compOverlay66 = 0x202220; - static const int compOverlay100 = 0x202230; + static const int bringBackLostItems = 0x202120; static const int newDocumentBase = 0x322010; static const int newComponentBase = 0x302010; diff --git a/extras/Introjucer/Source/Application/jucer_DocumentEditorComponent.cpp b/extras/Introjucer/Source/Application/jucer_DocumentEditorComponent.cpp index 23672245ca..7a545e788a 100644 --- a/extras/Introjucer/Source/Application/jucer_DocumentEditorComponent.cpp +++ b/extras/Introjucer/Source/Application/jucer_DocumentEditorComponent.cpp @@ -25,18 +25,19 @@ #include "jucer_DocumentEditorComponent.h" #include "../Project/jucer_ProjectContentComponent.h" +#include "../Application/jucer_Application.h" //============================================================================== DocumentEditorComponent::DocumentEditorComponent (OpenDocumentManager::Document* document_) : document (document_) { - OpenDocumentManager::getInstance()->addListener (this); + JucerApplication::getApp()->openDocumentManager.addListener (this); } DocumentEditorComponent::~DocumentEditorComponent() { - OpenDocumentManager::getInstance()->removeListener (this); + JucerApplication::getApp()->openDocumentManager.removeListener (this); } void DocumentEditorComponent::documentAboutToClose (OpenDocumentManager::Document* closingDoc) diff --git a/extras/Introjucer/Source/Application/jucer_MainWindow.cpp b/extras/Introjucer/Source/Application/jucer_MainWindow.cpp index 1dc69f8876..6e4a30c27b 100644 --- a/extras/Introjucer/Source/Application/jucer_MainWindow.cpp +++ b/extras/Introjucer/Source/Application/jucer_MainWindow.cpp @@ -126,7 +126,7 @@ bool MainWindow::closeProject (Project* project) getAppProperties().setValue (getProjectWindowPosName(), getWindowStateAsString()); - if (! OpenDocumentManager::getInstance()->closeAllDocumentsUsingProject (*project, true)) + if (! JucerApplication::getApp()->openDocumentManager.closeAllDocumentsUsingProject (*project, true)) return false; ProjectContentComponent* const pcc = getProjectContentComponent(); @@ -174,7 +174,7 @@ void MainWindow::restoreWindowPosition() bool MainWindow::canOpenFile (const File& file) const { return file.hasFileExtension (Project::projectFileExtension) - || OpenDocumentManager::getInstance()->canOpenFile (file); + || JucerApplication::getApp()->openDocumentManager.canOpenFile (file); } bool MainWindow::openFile (const File& file) @@ -227,7 +227,7 @@ void MainWindow::activeWindowStatusChanged() if (getProjectContentComponent() != nullptr) getProjectContentComponent()->updateMissingFileStatuses(); - OpenDocumentManager::getInstance()->reloadModifiedFiles(); + JucerApplication::getApp()->openDocumentManager.reloadModifiedFiles(); } void MainWindow::updateTitle (const String& documentName) diff --git a/extras/Introjucer/Source/Application/jucer_OpenDocumentManager.cpp b/extras/Introjucer/Source/Application/jucer_OpenDocumentManager.cpp index 7064c709e4..cea504a456 100644 --- a/extras/Introjucer/Source/Application/jucer_OpenDocumentManager.cpp +++ b/extras/Introjucer/Source/Application/jucer_OpenDocumentManager.cpp @@ -91,10 +91,13 @@ OpenDocumentManager::OpenDocumentManager() OpenDocumentManager::~OpenDocumentManager() { - clearSingletonInstance(); } -juce_ImplementSingleton_SingleThreaded (OpenDocumentManager); +void OpenDocumentManager::clear() +{ + documents.clear(); + types.clear(); +} //============================================================================== void OpenDocumentManager::registerType (DocumentType* type) diff --git a/extras/Introjucer/Source/Application/jucer_OpenDocumentManager.h b/extras/Introjucer/Source/Application/jucer_OpenDocumentManager.h index 2bdbc0df28..4e7c3d2d81 100644 --- a/extras/Introjucer/Source/Application/jucer_OpenDocumentManager.h +++ b/extras/Introjucer/Source/Application/jucer_OpenDocumentManager.h @@ -38,8 +38,6 @@ public: OpenDocumentManager(); ~OpenDocumentManager(); - juce_DeclareSingleton_SingleThreaded_Minimal (OpenDocumentManager); - //============================================================================== class Document { @@ -68,6 +66,7 @@ public: int getNumOpenDocuments() const; Document* getOpenDocument (int index) const; void moveDocumentToTopOfStack (Document* doc); + void clear(); bool canOpenFile (const File& file); Document* openFile (Project* project, const File& file); diff --git a/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.cpp b/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.cpp index 156f246b02..f00a974599 100644 --- a/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.cpp +++ b/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.cpp @@ -37,7 +37,7 @@ SourceCodeEditor::SourceCodeEditor (OpenDocumentManager::Document* document_, addAndMakeVisible (&editor); #if JUCE_MAC - Font font (10.6f); + Font font (13.0f); font.setTypefaceName ("Menlo"); #else Font font (10.0f); @@ -46,10 +46,14 @@ SourceCodeEditor::SourceCodeEditor (OpenDocumentManager::Document* document_, editor.setFont (font); editor.setTabSize (4, true); + + updateColourScheme(); + getAppSettings().appearance.settings.addListener (this); } SourceCodeEditor::~SourceCodeEditor() { + getAppSettings().appearance.settings.removeListener (this); } void SourceCodeEditor::resized() @@ -71,6 +75,17 @@ CodeTokeniser* SourceCodeEditor::getTokeniserFor (const File& file) SourceCodeEditor* SourceCodeEditor::createFor (OpenDocumentManager::Document* document, CodeDocument& codeDocument) { - return new SourceCodeEditor (document, codeDocument, - getTokeniserFor (document->getFile())); + return new SourceCodeEditor (document, codeDocument, getTokeniserFor (document->getFile())); +} + +void SourceCodeEditor::valueTreePropertyChanged (ValueTree&, const Identifier&) { updateColourScheme(); } +void SourceCodeEditor::valueTreeChildAdded (ValueTree&, ValueTree&) { updateColourScheme(); } +void SourceCodeEditor::valueTreeChildRemoved (ValueTree&, ValueTree&) { updateColourScheme(); } +void SourceCodeEditor::valueTreeChildOrderChanged (ValueTree&) { updateColourScheme(); } +void SourceCodeEditor::valueTreeParentChanged (ValueTree&) { updateColourScheme(); } +void SourceCodeEditor::valueTreeRedirected (ValueTree&) { updateColourScheme(); } + +void SourceCodeEditor::updateColourScheme() +{ + getAppSettings().appearance.applyToCodeEditor (editor); } diff --git a/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.h b/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.h index e1e9bcefca..bafd8889aa 100644 --- a/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.h +++ b/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.h @@ -29,11 +29,9 @@ #include "../Project/jucer_Project.h" #include "../Application/jucer_DocumentEditorComponent.h" - //============================================================================== -/** -*/ -class SourceCodeEditor : public DocumentEditorComponent +class SourceCodeEditor : public DocumentEditorComponent, + private ValueTree::Listener { public: //============================================================================== @@ -54,6 +52,15 @@ public: CodeEditorComponent editor; private: + void valueTreePropertyChanged (ValueTree&, const Identifier&); + void valueTreeChildAdded (ValueTree&, ValueTree&); + void valueTreeChildRemoved (ValueTree&, ValueTree&); + void valueTreeChildOrderChanged (ValueTree&); + void valueTreeParentChanged (ValueTree&); + void valueTreeRedirected (ValueTree&); + + void updateColourScheme(); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SourceCodeEditor); }; diff --git a/extras/Introjucer/Source/Project/jucer_Project.cpp b/extras/Introjucer/Source/Project/jucer_Project.cpp index e89a7a8767..aa4b3a2bb8 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.cpp +++ b/extras/Introjucer/Source/Project/jucer_Project.cpp @@ -66,7 +66,7 @@ Project::Project (const File& file_) Project::~Project() { projectRoot.removeListener (this); - OpenDocumentManager::getInstance()->closeAllDocumentsUsingProject (*this, false); + JucerApplication::getApp()->openDocumentManager.closeAllDocumentsUsingProject (*this, false); } //============================================================================== @@ -537,7 +537,7 @@ bool Project::Item::renameFile (const File& newFile) || (newFile.exists() && ! oldFile.exists())) { setFile (newFile); - OpenDocumentManager::getInstance()->fileHasBeenRenamed (oldFile, newFile); + JucerApplication::getApp()->openDocumentManager.fileHasBeenRenamed (oldFile, newFile); return true; } diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp index c90fbde891..3ca17a6fe6 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp @@ -25,6 +25,7 @@ #include "jucer_ProjectContentComponent.h" #include "../Application/jucer_MainWindow.h" +#include "../Application/jucer_Application.h" #include "../Code Editor/jucer_SourceCodeEditor.h" #include "jucer_ConfigPage.h" #include "jucer_TreeViewTypes.h" @@ -109,6 +110,25 @@ void ProjectContentComponent::paint (Graphics& g) g.fillAll (Colour::greyLevel (0.8f)); } +void ProjectContentComponent::resized() +{ + Rectangle r (getLocalBounds()); + + treeViewTabs.setBounds (r.removeFromLeft (treeViewTabs.getWidth())); + + if (resizerBar != nullptr) + resizerBar->setBounds (r.removeFromLeft (4)); + + if (contentView != nullptr) + contentView->setBounds (r); +} + +void ProjectContentComponent::childBoundsChanged (Component* child) +{ + if (child == &treeViewTabs) + resized(); +} + void ProjectContentComponent::setProject (Project* newProject) { if (project != newProject) @@ -121,38 +141,44 @@ void ProjectContentComponent::setProject (Project* newProject) contentView = nullptr; resizerBar = nullptr; - treeViewTabs.clearTabs(); + if (project != nullptr && treeViewTabs.isShowing()) + { + if (treeViewTabs.getWidth() > 0) + settings.setValue ("projectTreeviewWidth_" + project->getProjectUID(), treeViewTabs.getWidth()); - if (treeViewTabs.isShowing() && treeViewTabs.getWidth() > 0) - settings.setValue ("projectTreeviewWidth", treeViewTabs.getWidth()); + settings.setValue ("lastTab_" + project->getProjectUID(), treeViewTabs.getCurrentTabName()); + } + treeViewTabs.clearTabs(); project = newProject; if (project != nullptr) { - treeViewTabs.setVisible (true); - addChildAndSetID (&treeViewTabs, "tree"); + addAndMakeVisible (&treeViewTabs); createProjectTabs(); - String lastTreeWidth (settings.getValue ("projectTreeviewWidth")); - if (lastTreeWidth.getIntValue() < 150) - lastTreeWidth = "250"; + const String lastTabName (settings.getValue ("lastTab_" + project->getProjectUID())); + int lastTabIndex = treeViewTabs.getTabNames().indexOf (lastTabName); - treeViewTabs.setBounds ("0, 0, left + " + lastTreeWidth + ", parent.height"); + if (lastTabIndex < 0 || lastTabIndex > treeViewTabs.getNumTabs()) + lastTabIndex = 1; - addChildAndSetID (resizerBar = new ResizableEdgeComponent (&treeViewTabs, &treeSizeConstrainer, - ResizableEdgeComponent::rightEdge), - "resizer"); + treeViewTabs.setCurrentTabIndex (lastTabIndex); - resizerBar->setBounds ("tree.right, 0, tree.right + 4, parent.height"); + int lastTreeWidth = settings.getValue ("projectTreeviewWidth_" + project->getProjectUID()).getIntValue(); + if (lastTreeWidth < 150) + lastTreeWidth = 250; - project->addChangeListener (this); + treeViewTabs.setBounds (0, 0, lastTreeWidth, getHeight()); + + addAndMakeVisible (resizerBar = new ResizableEdgeComponent (&treeViewTabs, &treeSizeConstrainer, + ResizableEdgeComponent::rightEdge)); - if (currentDocument == nullptr) - invokeDirectly (CommandIDs::showProjectSettings, true); + project->addChangeListener (this); updateMissingFileStatuses(); + resized(); } else { @@ -163,6 +189,7 @@ void ProjectContentComponent::setProject (Project* newProject) void ProjectContentComponent::createProjectTabs() { + jassert (project != nullptr); treeViewTabs.addTab ("Files", Colour::greyLevel (0.93f), new FileTreeTab (*project), true); treeViewTabs.addTab ("Config", Colour::greyLevel (0.93f), new ConfigTreeTab (*project), true); } @@ -205,7 +232,7 @@ void ProjectContentComponent::updateMissingFileStatuses() bool ProjectContentComponent::showEditorForFile (const File& f) { - return showDocument (OpenDocumentManager::getInstance()->openFile (project, f)); + return showDocument (JucerApplication::getApp()->openDocumentManager.openFile (project, f)); } bool ProjectContentComponent::showDocument (OpenDocumentManager::Document* doc) @@ -213,7 +240,7 @@ bool ProjectContentComponent::showDocument (OpenDocumentManager::Document* doc) if (doc == nullptr) return false; - OpenDocumentManager::getInstance()->moveDocumentToTopOfStack (doc); + JucerApplication::getApp()->openDocumentManager.moveDocumentToTopOfStack (doc); if (doc->hasFileBeenModifiedExternally()) doc->reloadFromFile(); @@ -242,11 +269,10 @@ bool ProjectContentComponent::setEditorComponent (Component* editor, OpenDocumen contentView = editor; currentDocument = doc; addAndMakeVisible (editor); - editor->setBounds ("resizer.right, 0, parent.right, parent.height"); + resized(); updateMainWindowTitle(); commandManager->commandStatusChanged(); - return true; } @@ -419,7 +445,7 @@ bool ProjectContentComponent::perform (const InvocationInfo& info) case CommandIDs::closeDocument: if (currentDocument != nullptr) - OpenDocumentManager::getInstance()->closeDocument (currentDocument, true); + JucerApplication::getApp()->openDocumentManager.closeDocument (currentDocument, true); break; case CommandIDs::openInIDE: diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h index 15ed2ccc92..8b0ab625b2 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h +++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h @@ -42,8 +42,6 @@ public: ProjectContentComponent(); ~ProjectContentComponent(); - void paint (Graphics& g); - Project* getProject() const noexcept { return project; } virtual void setProject (Project* project); void saveTreeViewState(); @@ -68,6 +66,10 @@ public: bool isCommandActive (const CommandID commandID); bool perform (const InvocationInfo& info); + void paint (Graphics& g); + void resized(); + void childBoundsChanged (Component* child); + protected: Project* project; OpenDocumentManager::Document* currentDocument; diff --git a/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.cpp b/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.cpp index a426ad8ec2..fda82243b6 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.cpp @@ -24,7 +24,7 @@ */ #include "jucer_ProjectTreeViewBase.h" -#include "../Application/jucer_OpenDocumentManager.h" +#include "../Application/jucer_Application.h" //============================================================================== @@ -220,11 +220,13 @@ void ProjectTreeViewBase::deleteAllSelectedItems() if (treeRootItem != nullptr) { + OpenDocumentManager& om = JucerApplication::getApp()->openDocumentManager; + for (int i = filesToTrash.size(); --i >= 0;) { const File f (*filesToTrash.getUnchecked(i)); - OpenDocumentManager::getInstance()->closeFile (f, false); + om.closeFile (f, false); if (! f.moveToTrash()) { @@ -238,7 +240,7 @@ void ProjectTreeViewBase::deleteAllSelectedItems() if (itemToRemove != nullptr) { - OpenDocumentManager::getInstance()->closeFile (itemToRemove->getFile(), false); + om.closeFile (itemToRemove->getFile(), false); itemToRemove->deleteItem(); } } diff --git a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h index b2a8fa05d7..75c82245d0 100644 --- a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h +++ b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h @@ -112,6 +112,7 @@ public: tree.setDefaultOpenness (true); tree.setColour (TreeView::backgroundColourId, Colours::transparentBlack); tree.setIndentSize (14); + tree.getViewport()->setScrollBarThickness (14); } ~TreePanelBase() diff --git a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp index 0d971c0c65..7ca97f2d86 100644 --- a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp +++ b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp @@ -468,7 +468,7 @@ class CallOutBoxCallback : public ModalComponentManager::Callback public: CallOutBoxCallback (Component& attachTo, Component* content_) : content (content_), - callout (*content_, attachTo, attachTo.getTopLevelComponent()) + callout (*content_, attachTo, nullptr) { callout.setVisible (true); callout.enterModalState (true, this); diff --git a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h index 4e6ffdd4d2..9759df61be 100644 --- a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h +++ b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h @@ -146,3 +146,204 @@ protected: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ValueSourceFilter); }; + +//============================================================================== +class PopupColourSelector : public Component, + public ChangeListener, + public Value::Listener, + public ButtonListener +{ +public: + PopupColourSelector (const Value& colourValue_, + const Colour& defaultColour_, + const bool canResetToDefault) + : defaultButton ("Reset to Default"), + colourValue (colourValue_), + defaultColour (defaultColour_) + { + addAndMakeVisible (&selector); + selector.setName ("Colour"); + selector.setCurrentColour (getColour()); + selector.addChangeListener (this); + + if (canResetToDefault) + { + addAndMakeVisible (&defaultButton); + defaultButton.addListener (this); + } + + colourValue.addListener (this); + setSize (300, 400); + } + + void resized() + { + if (defaultButton.isVisible()) + { + selector.setBounds (0, 0, getWidth(), getHeight() - 30); + defaultButton.changeWidthToFitText (22); + defaultButton.setTopLeftPosition (10, getHeight() - 26); + } + else + { + selector.setBounds (0, 0, getWidth(), getHeight()); + } + } + + Colour getColour() const + { + if (colourValue.toString().isEmpty()) + return defaultColour; + + return Colour::fromString (colourValue.toString()); + } + + void setColour (const Colour& newColour) + { + if (getColour() != newColour) + { + if (newColour == defaultColour && defaultButton.isVisible()) + colourValue = var::null; + else + colourValue = newColour.toDisplayString (true); + } + } + + void buttonClicked (Button*) + { + setColour (defaultColour); + selector.setCurrentColour (defaultColour); + } + + void changeListenerCallback (ChangeBroadcaster*) + { + if (selector.getCurrentColour() != getColour()) + setColour (selector.getCurrentColour()); + } + + void valueChanged (Value&) + { + selector.setCurrentColour (getColour()); + } + +private: + StoredSettings::ColourSelectorWithSwatches selector; + TextButton defaultButton; + Value colourValue; + Colour defaultColour; +}; + +//============================================================================== +/** + A component that shows a colour swatch with hex ARGB value, and which pops up + a colour selector when you click it. +*/ +class ColourEditorComponent : public Component, + public Value::Listener +{ +public: + ColourEditorComponent (UndoManager* undoManager_, const Value& colourValue_, + const Colour& defaultColour_, const bool canResetToDefault_) + : undoManager (undoManager_), colourValue (colourValue_), defaultColour (defaultColour_), + canResetToDefault (canResetToDefault_) + { + colourValue.addListener (this); + } + + void paint (Graphics& g) + { + const Colour colour (getColour()); + + g.fillAll (Colours::grey); + g.fillCheckerBoard (getLocalBounds().reduced (2, 2), + 10, 10, + Colour (0xffdddddd).overlaidWith (colour), + Colour (0xffffffff).overlaidWith (colour)); + + g.setColour (Colours::white.overlaidWith (colour).contrasting()); + g.setFont (Font (getHeight() * 0.6f, Font::bold)); + g.drawFittedText (colour.toDisplayString (true), + 2, 1, getWidth() - 4, getHeight() - 1, + Justification::centred, 1); + } + + Colour getColour() const + { + if (colourValue.toString().isEmpty()) + return defaultColour; + + return Colour::fromString (colourValue.toString()); + } + + void setColour (const Colour& newColour) + { + if (getColour() != newColour) + { + if (newColour == defaultColour && canResetToDefault) + colourValue = var::null; + else + colourValue = newColour.toDisplayString (true); + } + } + + void resetToDefault() + { + setColour (defaultColour); + } + + void refresh() + { + const Colour col (getColour()); + + if (col != lastColour) + { + lastColour = col; + repaint(); + } + } + + void mouseDown (const MouseEvent&) + { + if (undoManager != nullptr) + undoManager->beginNewTransaction(); + + launchAsyncCallOutBox (*this, new PopupColourSelector (colourValue, defaultColour, canResetToDefault)); + } + + void valueChanged (Value&) + { + refresh(); + } + +private: + UndoManager* undoManager; + Value colourValue; + Colour lastColour; + const Colour defaultColour; + const bool canResetToDefault; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ColourEditorComponent); +}; + +//============================================================================== +class ColourPropertyComponent : public PropertyComponent +{ +public: + ColourPropertyComponent (UndoManager* undoManager, const String& name, const Value& colour, + const Colour& defaultColour, bool canResetToDefault) + : PropertyComponent (name), + colourEditor (undoManager, colour, defaultColour, canResetToDefault) + { + addAndMakeVisible (&colourEditor); + } + + void resized() + { + colourEditor.setBounds (getLookAndFeel().getPropertyComponentContentPosition (*this)); + } + + void refresh() {} + +protected: + ColourEditorComponent colourEditor; +}; diff --git a/extras/Introjucer/Source/Utility/jucer_PresetIDs.h b/extras/Introjucer/Source/Utility/jucer_PresetIDs.h index 7f20b914c0..b2d7bbe9e1 100644 --- a/extras/Introjucer/Source/Utility/jucer_PresetIDs.h +++ b/extras/Introjucer/Source/Utility/jucer_PresetIDs.h @@ -117,6 +117,8 @@ namespace Ids DECLARE_ID (androidKeyStorePass); DECLARE_ID (androidKeyAlias); DECLARE_ID (androidKeyAliasPass); + DECLARE_ID (font); + DECLARE_ID (colour); const Identifier class_ ("class"); #undef DECLARE_ID diff --git a/extras/Introjucer/Source/Utility/jucer_StoredSettings.cpp b/extras/Introjucer/Source/Utility/jucer_StoredSettings.cpp index 467a93e30d..f8d1d1145a 100644 --- a/extras/Introjucer/Source/Utility/jucer_StoredSettings.cpp +++ b/extras/Introjucer/Source/Utility/jucer_StoredSettings.cpp @@ -38,10 +38,24 @@ PropertiesFile& getAppProperties() return getAppSettings().getProps(); } +static AppearanceSettings getDefaultScheme() +{ + CodeDocument doc; + CPlusPlusCodeTokeniser tokeniser; + CodeEditorComponent defaultComp (doc, &tokeniser); + return AppearanceSettings (defaultComp); +} + //============================================================================== StoredSettings::StoredSettings() + : appearance (getDefaultScheme()) { reload(); + + const File defaultSchemeFile (getSchemesFolder().getChildFile ("Default").withFileExtension (getSchemeFileSuffix())); + + if (! defaultSchemeFile.exists()) + appearance.writeToFile (defaultSchemeFile); } StoredSettings::~StoredSettings() @@ -59,6 +73,11 @@ void StoredSettings::flush() { if (props != nullptr) { + { + const ScopedPointer xml (appearance.settings.createXml()); + props->setValue ("editorColours", xml); + } + props->setValue ("recentFiles", recentFiles.toString()); props->removeValue ("keyMappings"); @@ -109,6 +128,10 @@ void StoredSettings::reload() recentFiles.restoreFromString (props->getValue ("recentFiles")); recentFiles.removeNonExistentFiles(); + const ScopedPointer xml (props->getXmlValue ("editorColours")); + if (xml != nullptr) + appearance.settings = ValueTree::fromXml (*xml); + loadSwatchColours(); } @@ -178,6 +201,13 @@ void StoredSettings::ColourSelectorWithSwatches::setSwatchColour (int index, con getAppSettings().swatchColours.set (index, newColour); } +File StoredSettings::getSchemesFolder() +{ + File f (getProps().getFile().getSiblingFile ("Colour Schemes")); + f.createDirectory(); + return f; +} + //============================================================================== const Icons& getIcons() { diff --git a/extras/Introjucer/Source/Utility/jucer_StoredSettings.h b/extras/Introjucer/Source/Utility/jucer_StoredSettings.h index 424e84d107..d9ef2ba5f1 100644 --- a/extras/Introjucer/Source/Utility/jucer_StoredSettings.h +++ b/extras/Introjucer/Source/Utility/jucer_StoredSettings.h @@ -26,16 +26,13 @@ #ifndef __JUCER_STOREDSETTINGS_JUCEHEADER__ #define __JUCER_STOREDSETTINGS_JUCEHEADER__ +#include "../Application/jucer_AppearanceSettings.h" + //============================================================================== -/** - A singleton to hold persistent settings, and to save them in a - suitable PropertiesFile. -*/ class StoredSettings { public: - //============================================================================== StoredSettings(); ~StoredSettings(); @@ -64,6 +61,12 @@ public: void setSwatchColour (int index, const Colour& newColour) const; }; + //============================================================================== + AppearanceSettings appearance; + + const char* getSchemeFileSuffix() const { return ".editorscheme"; } + File getSchemesFolder(); + private: ScopedPointer props; StringArray fontNames; diff --git a/modules/juce_data_structures/values/juce_ValueTree.cpp b/modules/juce_data_structures/values/juce_ValueTree.cpp index 19cbcaf1a9..199b7a620b 100644 --- a/modules/juce_data_structures/values/juce_ValueTree.cpp +++ b/modules/juce_data_structures/values/juce_ValueTree.cpp @@ -1011,6 +1011,8 @@ ValueTree ValueTree::readFromGZIPData (const void* const data, const size_t numB return readFromStream (gzipStream); } +void ValueTree::Listener::valueTreeRedirected (ValueTree&) {} + //============================================================================== #if JUCE_UNIT_TESTS diff --git a/modules/juce_data_structures/values/juce_ValueTree.h b/modules/juce_data_structures/values/juce_ValueTree.h index a9ba3a03e7..1dbb112759 100644 --- a/modules/juce_data_structures/values/juce_ValueTree.h +++ b/modules/juce_data_structures/values/juce_ValueTree.h @@ -416,7 +416,7 @@ public: When operator= is used to make a ValueTree refer to a different object, this callback will be made. */ - virtual void valueTreeRedirected (ValueTree& treeWhichHasBeenChanged) {} + virtual void valueTreeRedirected (ValueTree& treeWhichHasBeenChanged); }; /** Adds a listener to receive callbacks when this node is changed. diff --git a/modules/juce_gui_basics/layout/juce_ComponentBuilder.h b/modules/juce_gui_basics/layout/juce_ComponentBuilder.h index 7f416720c4..50ea614e71 100644 --- a/modules/juce_gui_basics/layout/juce_ComponentBuilder.h +++ b/modules/juce_gui_basics/layout/juce_ComponentBuilder.h @@ -45,7 +45,7 @@ object, or if you keep the ComponentBuilder around, it'll monitor any changes in the ValueTree and automatically update the component to reflect these changes. */ -class JUCE_API ComponentBuilder : public ValueTree::Listener +class JUCE_API ComponentBuilder : private ValueTree::Listener { public: /** Creates a ComponentBuilder that will use the given state. @@ -235,16 +235,6 @@ public: //============================================================================= /** @internal */ - void valueTreePropertyChanged (ValueTree& treeWhosePropertyHasChanged, const Identifier& property); - /** @internal */ - void valueTreeChildAdded (ValueTree& parentTree, ValueTree& childWhichHasBeenAdded); - /** @internal */ - void valueTreeChildRemoved (ValueTree& parentTree, ValueTree& childWhichHasBeenRemoved); - /** @internal */ - void valueTreeChildOrderChanged (ValueTree& parentTree); - /** @internal */ - void valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged); - /** @internal */ static void refreshBasicComponentProperties (Component&, const ValueTree&); /** @internal */ static RelativeRectangle getComponentBounds (const ValueTree&); @@ -258,6 +248,12 @@ private: WeakReference componentRef; #endif + void valueTreePropertyChanged (ValueTree&, const Identifier&); + void valueTreeChildAdded (ValueTree&, ValueTree&); + void valueTreeChildRemoved (ValueTree&, ValueTree&); + void valueTreeChildOrderChanged (ValueTree&); + void valueTreeParentChanged (ValueTree&); + static const Identifier positionID; void initialiseRecursively (Component&, const ValueTree&); diff --git a/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp b/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp index ae2350557e..786ad2d530 100644 --- a/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp +++ b/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp @@ -519,7 +519,7 @@ CodeEditorComponent::ColourScheme CPlusPlusCodeTokeniser::getDefaultColourScheme CodeEditorComponent::ColourScheme cs; for (int i = 0; i < sizeof (types) / sizeof (types[0]); ++i) // (NB: numElementsInArray doesn't work here in GCC4.2) - cs.add (types[i].name, Colour (types[i].colour)); + cs.set (types[i].name, Colour (types[i].colour)); return cs; } diff --git a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp index b34297d18c..fc4bf2f8d7 100644 --- a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp +++ b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp @@ -333,8 +333,8 @@ void CodeEditorComponent::codeDocumentChanged (const CodeDocument::Position& aff void CodeEditorComponent::resized() { - linesOnScreen = (getHeight() - scrollbarThickness) / lineHeight; - columnsOnScreen = (int) ((getWidth() - scrollbarThickness) / charWidth); + linesOnScreen = jmax (1, (getHeight() - scrollbarThickness) / lineHeight); + columnsOnScreen = jmax (1, (int) ((getWidth() - scrollbarThickness) / charWidth)); lines.clear(); rebuildLineTokens(); updateCaretPosition(); @@ -1087,8 +1087,18 @@ void CodeEditorComponent::setFont (const Font& newFont) resized(); } -void CodeEditorComponent::ColourScheme::add (const String& name, const Colour& colour) +void CodeEditorComponent::ColourScheme::set (const String& name, const Colour& colour) { + for (int i = 0; i < types.size(); ++i) + { + TokenType& tt = types.getReference(i); + if (tt.name == name) + { + tt.colour = colour; + return; + } + } + TokenType tt; tt.name = name; tt.colour = colour; diff --git a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h index 0938b39e93..d96b5fd02d 100644 --- a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h +++ b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h @@ -183,7 +183,7 @@ public: Array types; - void add (const String& name, const Colour& colour); + void set (const String& name, const Colour& colour); }; /** Changes the syntax highlighting scheme.