diff --git a/extras/Introjucer/Builds/CodeBlocks/The Introjucer.cbp b/extras/Introjucer/Builds/CodeBlocks/The Introjucer.cbp
index 1641653eb9..f230bb1940 100644
--- a/extras/Introjucer/Builds/CodeBlocks/The Introjucer.cbp
+++ b/extras/Introjucer/Builds/CodeBlocks/The Introjucer.cbp
@@ -579,10 +579,18 @@
+
+
+
+
+
+
+
+
diff --git a/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj b/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
index 12fbbf8521..48e162795c 100644
--- a/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
+++ b/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
@@ -509,6 +509,7 @@
7E45364D59D84EF762F1A928 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryBlock.h"; path = "../../../../modules/juce_core/memory/juce_MemoryBlock.h"; sourceTree = "SOURCE_ROOT"; };
7ECD37A096E0B99622585950 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Variant.h"; path = "../../../../modules/juce_core/containers/juce_Variant.h"; sourceTree = "SOURCE_ROOT"; };
7EF2BB6A11579386E7181553 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseEvent.cpp"; path = "../../../../modules/juce_gui_basics/mouse/juce_MouseEvent.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 7F29F77B1C00A9704E6D0859 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_UTF8Component.h"; path = "../../Source/Utility/jucer_UTF8Component.h"; sourceTree = "SOURCE_ROOT"; };
7FC13BEF6B2A5E5E5E92D3FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemComponent.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
7FDC4820A86DBA34E62B241E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AsyncUpdater.cpp"; path = "../../../../modules/juce_events/broadcasters/juce_AsyncUpdater.cpp"; sourceTree = "SOURCE_ROOT"; };
7FF7EFDC3CF13673541E332D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativePointPath.cpp"; path = "../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -696,6 +697,7 @@
B00F60201606F195058BB575 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ColourPropertyComponent.h"; path = "../../Source/ComponentEditor/properties/jucer_ColourPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
B01CBF496E7C88105DF4B52A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableShape.h"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h"; sourceTree = "SOURCE_ROOT"; };
B06C7C053DB0660CDA8B5C2C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_PaintRoutinePanel.h"; path = "../../Source/ComponentEditor/ui/jucer_PaintRoutinePanel.h"; sourceTree = "SOURCE_ROOT"; };
+ B0D2198D1261755918CD454D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_SVGPathDataComponent.h"; path = "../../Source/Utility/jucer_SVGPathDataComponent.h"; sourceTree = "SOURCE_ROOT"; };
B15E33E7342F6EB4F95C9B1D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_PaintRoutineEditor.cpp"; path = "../../Source/ComponentEditor/ui/jucer_PaintRoutineEditor.cpp"; sourceTree = "SOURCE_ROOT"; };
B1963F0D8C0046E54FD9E023 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_ColouredElement.h"; path = "../../Source/ComponentEditor/paintelements/jucer_ColouredElement.h"; sourceTree = "SOURCE_ROOT"; };
B1B44E3A7614189E65CB9FBE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WaitableEvent.h"; path = "../../../../modules/juce_core/threads/juce_WaitableEvent.h"; sourceTree = "SOURCE_ROOT"; };
@@ -769,6 +771,7 @@
C7B47372A9D5970E3D9A5400 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GroupInformationComponent.h"; path = "../../Source/Project/jucer_GroupInformationComponent.h"; sourceTree = "SOURCE_ROOT"; };
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"; };
@@ -783,19 +786,19 @@
CD140A1C0161176682F6CA29 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableWindow.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
CD3216F23C7B273B010A8D12 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CustomTypeface.h"; path = "../../../../modules/juce_graphics/fonts/juce_CustomTypeface.h"; sourceTree = "SOURCE_ROOT"; };
CDCAF0EC777DA2884AEB2B59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Label.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_Label.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 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"; };
D00F311BFC3C2625C457CB9B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
+ D041043D3B554B88F855C174 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HighResolutionTimer.h"; path = "../../../../modules/juce_core/threads/juce_HighResolutionTimer.h"; sourceTree = "SOURCE_ROOT"; };
D0D8B580D0689FFF4B9B823B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_StrokeType.h"; path = "../../Source/ComponentEditor/paintelements/jucer_StrokeType.h"; sourceTree = "SOURCE_ROOT"; };
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"; };
D374DC78AAC02504576AA9B3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GroupComponentHandler.h"; path = "../../Source/ComponentEditor/components/jucer_GroupComponentHandler.h"; sourceTree = "SOURCE_ROOT"; };
@@ -805,64 +808,66 @@
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"; };
+ 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"; };
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"; };
- D9E59DE07A815AB303A297D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_data_structures.mm"; path = "../../../../modules/juce_data_structures/juce_data_structures.mm"; 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"; };
DA345D5B9DABD049F90DC96F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_GeneratedCode.h"; path = "../../Source/ComponentEditor/jucer_GeneratedCode.h"; 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"; };
+ DC5E7FF30B01118F6DAEC38F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Time.cpp"; path = "../../../../modules/juce_core/time/juce_Time.cpp"; 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"; };
- 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"; };
+ DFC6364D81D9C60BD4CA9D12 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeTime.cpp"; path = "../../../../modules/juce_core/time/juce_RelativeTime.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"; };
+ E19160CF7208320D128786CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Javascript.h"; path = "../../../../modules/juce_core/javascript/juce_Javascript.h"; sourceTree = "SOURCE_ROOT"; };
E1D8CCD9F4ACBE1EC1D5BEA0 = {isa = PBXFileReference; lastKnownFileType = file.svg; name = "wizard_AudioApp.svg"; path = "../../Source/BinaryData/wizard_AudioApp.svg"; sourceTree = "SOURCE_ROOT"; };
E2374E15D65425C4101237E2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_NewComponentTemplate.h"; path = "../../Source/BinaryData/jucer_NewComponentTemplate.h"; 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"; };
E3B56C5718D87CA0EFCB2662 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_AudioComponentTemplate.cpp"; path = "../../Source/BinaryData/jucer_AudioComponentTemplate.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"; };
E4BD4C43370651B49F75855B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_MainTemplate_SimpleWindow.cpp"; path = "../../Source/BinaryData/jucer_MainTemplate_SimpleWindow.cpp"; 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"; };
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"; };
+ E6F5CEC32EDC917B054467EF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReadWriteLock.cpp"; path = "../../../../modules/juce_core/threads/juce_ReadWriteLock.cpp"; sourceTree = "SOURCE_ROOT"; };
+ E720FBCD836FF3AA466C31B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HighResolutionTimer.cpp"; path = "../../../../modules/juce_core/threads/juce_HighResolutionTimer.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"; };
C68355AA4D62939EECAD469E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Random.h"; path = "../../../../modules/juce_core/maths/juce_Random.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"; };
- CDDF5BDC75277F7B83A38885 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertySet.cpp"; path = "../../../../modules/juce_core/containers/juce_PropertySet.cpp"; sourceTree = "SOURCE_ROOT"; };
- D041043D3B554B88F855C174 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HighResolutionTimer.h"; path = "../../../../modules/juce_core/threads/juce_HighResolutionTimer.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"; };
+ D253F74B7F5734984E568CA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Files.cpp"; path = "../../../../modules/juce_core/native/juce_linux_Files.cpp"; sourceTree = "SOURCE_ROOT"; };
D3E139185095C486DD3D61F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TranslationTool.h"; path = "../../Source/Utility/jucer_TranslationTool.h"; 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"; };
- D678882D133090214AF681BC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadLocalValue.h"; path = "../../../../modules/juce_core/threads/juce_ThreadLocalValue.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"; };
D7A7F1AA9F313B0CCAAA73A0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MathsFunctions.h"; path = "../../../../modules/juce_core/maths/juce_MathsFunctions.h"; 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"; };
+ 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"; };
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"; };
DAF84A553D264705FA6EB6FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_TreeViewHandler.h"; path = "../../Source/ComponentEditor/components/jucer_TreeViewHandler.h"; 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"; };
DCBB17488227A2CA7D3D3947 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "jucer_DependencyPathPropertyComponent.cpp"; path = "../../Source/Project/jucer_DependencyPathPropertyComponent.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"; };
DE40B42B57F29C650CB7F2AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RecentlyOpenedFilesList.h"; path = "../../../../modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h"; 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"; };
+ DE5F3C9EF6BFFDE73AF9E7FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsDisplayComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.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"; };
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"; };
- E19160CF7208320D128786CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Javascript.h"; path = "../../../../modules/juce_core/javascript/juce_Javascript.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"; };
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"; };
E3869AC657E984565F1718AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConnectedChildProcess.h"; path = "../../../../modules/juce_events/interprocess/juce_ConnectedChildProcess.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"; };
E446FFE889CD490FDE3F0F2B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadWithProgressWindow.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -870,15 +875,12 @@
E4F9D1E097CC2C1D1291823C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V2.cpp"; path = "../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp"; 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"; };
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"; };
E62D9BA6E92FE7BB6EF65699 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_JSON.h"; path = "../../../../modules/juce_core/javascript/juce_JSON.h"; sourceTree = "SOURCE_ROOT"; };
E63F54CF8D5D922A319C6962 = {isa = PBXFileReference; lastKnownFileType = image.png; name = projectIconXcodeIOS.png; path = ../../Source/BinaryData/projectIconXcodeIOS.png; 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"; };
- 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"; };
- E720FBCD836FF3AA466C31B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HighResolutionTimer.cpp"; path = "../../../../modules/juce_core/threads/juce_HighResolutionTimer.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"; };
@@ -1128,7 +1130,9 @@
C22791DB75870C4F102AA8A3,
631983AA62673015F8D7453B,
9BC8AE609A07657CEF587548,
+ B0D2198D1261755918CD454D,
D3E139185095C486DD3D61F2,
+ 7F29F77B1C00A9704E6D0859,
8090981F07A76E465DAAADF4, ); name = Utility; sourceTree = ""; };
EA13CB5FD121EE215A7A51BE = {isa = PBXGroup; children = (
A69024A225F2AC31F17B1314,
diff --git a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
index ad6ce9c9ec..e9b4f2f003 100644
--- a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
+++ b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
@@ -1174,7 +1174,9 @@
+
+
diff --git a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
index b4cbd0658b..c83b6885f5 100644
--- a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
+++ b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
@@ -1689,9 +1689,15 @@
The Introjucer\Utility
+
+ The Introjucer\Utility
+
The Introjucer\Utility
+
+ The Introjucer\Utility
+
The Introjucer\Utility
diff --git a/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj
index ded066f24f..b8351e949a 100644
--- a/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj
+++ b/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj
@@ -1180,7 +1180,9 @@
+
+
diff --git a/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj.filters b/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj.filters
index b4cbd0658b..c83b6885f5 100644
--- a/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj.filters
+++ b/extras/Introjucer/Builds/VisualStudio2012/The Introjucer.vcxproj.filters
@@ -1689,9 +1689,15 @@
The Introjucer\Utility
+
+ The Introjucer\Utility
+
The Introjucer\Utility
+
+ The Introjucer\Utility
+
The Introjucer\Utility
diff --git a/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj
index 26923aeddf..c3d7d7ea61 100644
--- a/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj
+++ b/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj
@@ -1180,7 +1180,9 @@
+
+
diff --git a/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj.filters b/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj.filters
index 376a63ddaa..8706c1de20 100644
--- a/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj.filters
+++ b/extras/Introjucer/Builds/VisualStudio2013/The Introjucer.vcxproj.filters
@@ -1689,9 +1689,15 @@
The Introjucer\Utility
+
+ The Introjucer\Utility
+
The Introjucer\Utility
+
+ The Introjucer\Utility
+
The Introjucer\Utility
diff --git a/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj
index e344a9c9ac..08a3aa2f6a 100644
--- a/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj
+++ b/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj
@@ -1180,7 +1180,9 @@
+
+
diff --git a/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj.filters b/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj.filters
index 0d2a9325ad..834b34d4f5 100644
--- a/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj.filters
+++ b/extras/Introjucer/Builds/VisualStudio2015/The Introjucer.vcxproj.filters
@@ -1689,9 +1689,15 @@
The Introjucer\Utility
+
+ The Introjucer\Utility
+
The Introjucer\Utility
+
+ The Introjucer\Utility
+
The Introjucer\Utility
diff --git a/extras/Introjucer/Introjucer.jucer b/extras/Introjucer/Introjucer.jucer
index 429d5b27bd..6fb9589d2b 100644
--- a/extras/Introjucer/Introjucer.jucer
+++ b/extras/Introjucer/Introjucer.jucer
@@ -461,8 +461,12 @@
file="Source/Utility/jucer_StoredSettings.cpp"/>
+
+
diff --git a/extras/Introjucer/Source/Application/jucer_Application.h b/extras/Introjucer/Source/Application/jucer_Application.h
index 7a2fe9f9ed..f14792bbbf 100644
--- a/extras/Introjucer/Source/Application/jucer_Application.h
+++ b/extras/Introjucer/Source/Application/jucer_Application.h
@@ -31,6 +31,8 @@
#include "../Project/jucer_Module.h"
#include "jucer_AutoUpdater.h"
#include "../Code Editor/jucer_SourceCodeEditor.h"
+#include "../Utility/jucer_UTF8Component.h"
+#include "../Utility/jucer_SVGPathDataComponent.h"
void createGUIEditorMenu (PopupMenu&);
void handleGUIEditorMenuCommand (int);
@@ -211,9 +213,8 @@ public:
}
//==============================================================================
- class MainMenuModel : public MenuBarModel
+ struct MainMenuModel : public MenuBarModel
{
- public:
MainMenuModel()
{
setApplicationCommandManagerToWatch (&getCommandManager());
@@ -453,8 +454,8 @@ public:
case CommandIDs::open: askUserToOpenFile(); break;
case CommandIDs::saveAll: openDocumentManager.saveAll(); break;
case CommandIDs::closeAllDocuments: closeAllDocuments (true); break;
- case CommandIDs::showUTF8Tool: showUTF8ToolWindow (utf8Window); break;
- case CommandIDs::showSVGPathTool: showSVGPathDataToolWindow (svgPathWindow); break;
+ case CommandIDs::showUTF8Tool: showUTF8ToolWindow(); break;
+ case CommandIDs::showSVGPathTool: showSVGPathDataToolWindow(); break;
case CommandIDs::showGlobalPreferences: AppearanceSettings::showGlobalPreferences (globalPreferencesWindow); break;
default: return JUCEApplication::perform (info);
@@ -496,6 +497,29 @@ public:
return mainWindowList.askAllWindowsToClose();
}
+ //==============================================================================
+ void showUTF8ToolWindow()
+ {
+ if (utf8Window != nullptr)
+ utf8Window->toFront (true);
+ else
+ new FloatingToolWindow ("UTF-8 String Literal Converter",
+ "utf8WindowPos",
+ new UTF8Component(), utf8Window,
+ 500, 500, 300, 300, 1000, 1000);
+ }
+
+ void showSVGPathDataToolWindow()
+ {
+ if (svgPathWindow != nullptr)
+ svgPathWindow->toFront (true);
+ else
+ new FloatingToolWindow ("SVG Path Converter",
+ "svgPathWindowPos",
+ new SVGPathDataComponent(), svgPathWindow,
+ 500, 500, 300, 300, 1000, 1000);
+ }
+
//==============================================================================
struct FileWithTime
{
diff --git a/extras/Introjucer/Source/Project/jucer_ConfigTree_Base.h b/extras/Introjucer/Source/Project/jucer_ConfigTree_Base.h
index 4822bf0bdb..15d540f035 100644
--- a/extras/Introjucer/Source/Project/jucer_ConfigTree_Base.h
+++ b/extras/Introjucer/Source/Project/jucer_ConfigTree_Base.h
@@ -70,6 +70,77 @@ private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PropertyGroupComponent)
};
+//==============================================================================
+class RolloverHelpComp : public Component,
+ private Timer
+{
+public:
+ RolloverHelpComp() : lastComp (nullptr)
+ {
+ setInterceptsMouseClicks (false, false);
+ startTimer (150);
+ }
+
+ void paint (Graphics& g) override
+ {
+ AttributedString s;
+ s.setJustification (Justification::centredLeft);
+ s.append (lastTip, Font (14.0f), findColour (mainBackgroundColourId).contrasting (0.7f));
+
+ TextLayout tl;
+ tl.createLayoutWithBalancedLineLengths (s, getWidth() - 10.0f);
+ if (tl.getNumLines() > 3)
+ tl.createLayout (s, getWidth() - 10.0f);
+
+ tl.draw (g, getLocalBounds().toFloat());
+ }
+
+private:
+ Component* lastComp;
+ String lastTip;
+
+ void timerCallback() override
+ {
+ Component* newComp = Desktop::getInstance().getMainMouseSource().getComponentUnderMouse();
+
+ if (newComp != nullptr
+ && (newComp->getTopLevelComponent() != getTopLevelComponent()
+ || newComp->isCurrentlyBlockedByAnotherModalComponent()))
+ newComp = nullptr;
+
+ if (newComp != lastComp)
+ {
+ lastComp = newComp;
+
+ String newTip (findTip (newComp));
+
+ if (newTip != lastTip)
+ {
+ lastTip = newTip;
+ repaint();
+ }
+ }
+ }
+
+ static String findTip (Component* c)
+ {
+ while (c != nullptr)
+ {
+ if (TooltipClient* tc = dynamic_cast (c))
+ {
+ const String tip (tc->getTooltip());
+
+ if (tip.isNotEmpty())
+ return tip;
+ }
+
+ c = c->getParentComponent();
+ }
+
+ return String();
+ }
+};
+
//==============================================================================
class ConfigTreeItemBase : public JucerTreeViewBase,
@@ -134,9 +205,8 @@ public:
private:
//==============================================================================
- class PropertyPanelViewport : public Component
+ struct PropertyPanelViewport : public Component
{
- public:
PropertyPanelViewport (Component* content)
{
addAndMakeVisible (viewport);
@@ -159,7 +229,6 @@ private:
Viewport viewport;
RolloverHelpComp rolloverHelp;
- private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PropertyPanelViewport)
};
};
diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp
index fea26157ac..66177cdd4b 100644
--- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp
+++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp
@@ -740,6 +740,38 @@ void ProjectContentComponent::showTranslationTool()
}
}
+//==============================================================================
+struct AsyncCommandRetrier : public Timer
+{
+ AsyncCommandRetrier (const ApplicationCommandTarget::InvocationInfo& i) : info (i)
+ {
+ info.originatingComponent = nullptr;
+ startTimer (500);
+ }
+
+ void timerCallback() override
+ {
+ stopTimer();
+ IntrojucerApp::getCommandManager().invoke (info, true);
+ delete this;
+ }
+
+ ApplicationCommandTarget::InvocationInfo info;
+
+ JUCE_DECLARE_NON_COPYABLE (AsyncCommandRetrier)
+};
+
+bool reinvokeCommandAfterCancellingModalComps (const ApplicationCommandTarget::InvocationInfo& info)
+{
+ if (ModalComponentManager::getInstance()->cancelAllModalComponents())
+ {
+ new AsyncCommandRetrier (info);
+ return true;
+ }
+
+ return false;
+}
+
//==============================================================================
ApplicationCommandTarget* ProjectContentComponent::getNextCommandTarget()
{
diff --git a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp
index 373a764842..6434855bca 100644
--- a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp
+++ b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.cpp
@@ -23,32 +23,6 @@
*/
#include "../jucer_Headers.h"
-#include "../Application/jucer_Application.h"
-
-namespace
-{
- bool keyFoundAndNotSequentialDuplicate (XmlElement* xml, const String& key)
- {
- forEachXmlChildElementWithTagName (*xml, element, "key")
- {
- if (element->getAllSubText().trim().equalsIgnoreCase (key))
- {
- if (element->getNextElement() != nullptr && element->getNextElement()->hasTagName ("key"))
- {
- // found broken plist format (sequential duplicate), fix by removing
- xml->removeChildElement (element, true);
- return false;
- }
-
- // key found (not sequential duplicate)
- return true;
- }
- }
-
- // key not found
- return false;
- }
-}
//==============================================================================
String createAlphaNumericUID()
@@ -208,31 +182,56 @@ StringArray getCleanedStringArray (StringArray s)
return s;
}
+//==============================================================================
+static bool keyFoundAndNotSequentialDuplicate (XmlElement* xml, const String& key)
+{
+ forEachXmlChildElementWithTagName (*xml, element, "key")
+ {
+ if (element->getAllSubText().trim().equalsIgnoreCase (key))
+ {
+ if (element->getNextElement() != nullptr && element->getNextElement()->hasTagName ("key"))
+ {
+ // found broken plist format (sequential duplicate), fix by removing
+ xml->removeChildElement (element, true);
+ return false;
+ }
+
+ // key found (not sequential duplicate)
+ return true;
+ }
+ }
+
+ // key not found
+ return false;
+}
+
+static bool addKeyIfNotFound (XmlElement* xml, const String& key)
+{
+ if (! keyFoundAndNotSequentialDuplicate (xml, key))
+ {
+ xml->createNewChildElement ("key")->addTextElement (key);
+ return true;
+ }
+
+ return false;
+}
+
void addPlistDictionaryKey (XmlElement* xml, const String& key, const String& value)
{
- if (keyFoundAndNotSequentialDuplicate (xml, key))
- return;
-
- xml->createNewChildElement ("key")->addTextElement (key);
- xml->createNewChildElement ("string")->addTextElement (value);
+ if (addKeyIfNotFound (xml, key))
+ xml->createNewChildElement ("string")->addTextElement (value);
}
void addPlistDictionaryKeyBool (XmlElement* xml, const String& key, const bool value)
{
- if (keyFoundAndNotSequentialDuplicate (xml, key))
- return;
-
- xml->createNewChildElement ("key")->addTextElement (key);
- xml->createNewChildElement (value ? "true" : "false");
+ if (addKeyIfNotFound (xml, key))
+ xml->createNewChildElement (value ? "true" : "false");
}
void addPlistDictionaryKeyInt (XmlElement* xml, const String& key, int value)
{
- if (keyFoundAndNotSequentialDuplicate (xml, key))
- return;
-
- xml->createNewChildElement ("key")->addTextElement (key);
- xml->createNewChildElement ("integer")->addTextElement (String (value));
+ if (addKeyIfNotFound (xml, key))
+ xml->createNewChildElement ("integer")->addTextElement (String (value));
}
//==============================================================================
@@ -277,298 +276,3 @@ bool fileNeedsCppSyntaxHighlighting (const File& file)
&& String (fileStart).trimStart().startsWith ("// -*- C++ -*-");
}
-//==============================================================================
-RolloverHelpComp::RolloverHelpComp()
- : lastComp (nullptr)
-{
- setInterceptsMouseClicks (false, false);
- startTimer (150);
-}
-
-void RolloverHelpComp::paint (Graphics& g)
-{
- AttributedString s;
- s.setJustification (Justification::centredLeft);
- s.append (lastTip, Font (14.0f), findColour (mainBackgroundColourId).contrasting (0.7f));
-
- TextLayout tl;
- tl.createLayoutWithBalancedLineLengths (s, getWidth() - 10.0f);
- if (tl.getNumLines() > 3)
- tl.createLayout (s, getWidth() - 10.0f);
-
- tl.draw (g, getLocalBounds().toFloat());
-}
-
-void RolloverHelpComp::timerCallback()
-{
- Component* newComp = Desktop::getInstance().getMainMouseSource().getComponentUnderMouse();
-
- if (newComp != nullptr
- && (newComp->getTopLevelComponent() != getTopLevelComponent()
- || newComp->isCurrentlyBlockedByAnotherModalComponent()))
- newComp = nullptr;
-
- if (newComp != lastComp)
- {
- lastComp = newComp;
-
- String newTip (findTip (newComp));
-
- if (newTip != lastTip)
- {
- lastTip = newTip;
- repaint();
- }
- }
-}
-
-String RolloverHelpComp::findTip (Component* c)
-{
- while (c != nullptr)
- {
- if (TooltipClient* const tc = dynamic_cast (c))
- {
- const String tip (tc->getTooltip());
-
- if (tip.isNotEmpty())
- return tip;
- }
-
- c = c->getParentComponent();
- }
-
- return String::empty;
-}
-
-//==============================================================================
-class UTF8Component : public Component,
- private TextEditorListener
-{
-public:
- UTF8Component()
- : desc (String::empty,
- "Type any string into the box, and it'll be shown below as a portable UTF-8 literal, "
- "ready to cut-and-paste into your source-code...")
- {
- desc.setJustificationType (Justification::centred);
- desc.setColour (Label::textColourId, Colours::white);
- addAndMakeVisible (desc);
-
- const Colour bkgd (Colours::white.withAlpha (0.6f));
-
- userText.setMultiLine (true, true);
- userText.setReturnKeyStartsNewLine (true);
- userText.setColour (TextEditor::backgroundColourId, bkgd);
- addAndMakeVisible (userText);
- userText.addListener (this);
-
- resultText.setFont (getAppSettings().appearance.getCodeFont().withHeight (13.0f));
- resultText.setMultiLine (true, true);
- resultText.setColour (TextEditor::backgroundColourId, bkgd);
- resultText.setReadOnly (true);
- resultText.setSelectAllWhenFocused (true);
- addAndMakeVisible (resultText);
-
- userText.setText (getLastText());
- }
-
- void textEditorTextChanged (TextEditor&)
- {
- update();
- }
-
- void textEditorEscapeKeyPressed (TextEditor&)
- {
- getTopLevelComponent()->exitModalState (0);
- }
-
- void update()
- {
- getLastText() = userText.getText();
- resultText.setText (CodeHelpers::stringLiteral (getLastText(), 100), false);
- }
-
- void resized()
- {
- Rectangle r (getLocalBounds().reduced (8));
- desc.setBounds (r.removeFromTop (44));
- r.removeFromTop (8);
- userText.setBounds (r.removeFromTop (r.getHeight() / 2));
- r.removeFromTop (8);
- resultText.setBounds (r);
- }
-
-private:
- Label desc;
- TextEditor userText, resultText;
-
- String& getLastText()
- {
- static String t;
- return t;
- }
-};
-
-void showUTF8ToolWindow (ScopedPointer& ownerPointer)
-{
- if (ownerPointer != nullptr)
- {
- ownerPointer->toFront (true);
- }
- else
- {
- new FloatingToolWindow ("UTF-8 String Literal Converter",
- "utf8WindowPos",
- new UTF8Component(), ownerPointer,
- 500, 500,
- 300, 300, 1000, 1000);
- }
-}
-
-//==============================================================================
-class SVGPathDataComponent : public Component,
- private TextEditorListener
-{
-public:
- SVGPathDataComponent()
- : desc (String::empty,
- "Paste an SVG path string into the top box, and it'll be converted to some C++ "
- "code that will load it as a Path object..")
- {
- desc.setJustificationType (Justification::centred);
- desc.setColour (Label::textColourId, Colours::white);
- addAndMakeVisible (desc);
-
- const Colour bkgd (Colours::white.withAlpha (0.6f));
-
- userText.setFont (getAppSettings().appearance.getCodeFont().withHeight (13.0f));
- userText.setMultiLine (true, true);
- userText.setReturnKeyStartsNewLine (true);
- userText.setColour (TextEditor::backgroundColourId, bkgd);
- addAndMakeVisible (userText);
- userText.addListener (this);
-
- resultText.setFont (getAppSettings().appearance.getCodeFont().withHeight (13.0f));
- resultText.setMultiLine (true, true);
- resultText.setColour (TextEditor::backgroundColourId, bkgd);
- resultText.setReadOnly (true);
- resultText.setSelectAllWhenFocused (true);
- addAndMakeVisible (resultText);
-
- userText.setText (getLastText());
- }
-
- void textEditorTextChanged (TextEditor&)
- {
- update();
- }
-
- void textEditorEscapeKeyPressed (TextEditor&)
- {
- getTopLevelComponent()->exitModalState (0);
- }
-
- void update()
- {
- getLastText() = userText.getText();
-
- path = Drawable::parseSVGPath (getLastText().trim().unquoted().trim());
-
- String result = "No path generated.. Not a valid SVG path string?";
-
- if (! path.isEmpty())
- {
- MemoryOutputStream data;
- path.writePathToStream (data);
-
- MemoryOutputStream out;
-
- out << "static const unsigned char pathData[] = ";
- CodeHelpers::writeDataAsCppLiteral (data.getMemoryBlock(), out, false, true);
- out << newLine
- << newLine
- << "Path path;" << newLine
- << "path.loadPathFromData (pathData, sizeof (pathData));" << newLine;
-
- result = out.toString();
- }
-
- resultText.setText (result, false);
- repaint (previewPathArea);
- }
-
- void resized()
- {
- Rectangle r (getLocalBounds().reduced (8));
- desc.setBounds (r.removeFromTop (44));
- r.removeFromTop (8);
- userText.setBounds (r.removeFromTop (r.getHeight() / 2));
- r.removeFromTop (8);
- previewPathArea = r.removeFromRight (r.getHeight());
- resultText.setBounds (r);
- }
-
- void paint (Graphics& g)
- {
- g.setColour (Colours::white);
- g.fillPath (path, path.getTransformToScaleToFit (previewPathArea.reduced (4).toFloat(), true));
- }
-
-private:
- Label desc;
- TextEditor userText, resultText;
- Rectangle previewPathArea;
- Path path;
-
- String& getLastText()
- {
- static String t;
- return t;
- }
-};
-
-void showSVGPathDataToolWindow (ScopedPointer& ownerPointer)
-{
- if (ownerPointer != nullptr)
- ownerPointer->toFront (true);
- else
- new FloatingToolWindow ("SVG Path Converter",
- "svgPathWindowPos",
- new SVGPathDataComponent(), ownerPointer,
- 500, 500,
- 300, 300, 1000, 1000);
-}
-
-//==============================================================================
-class AsyncCommandRetrier : public Timer
-{
-public:
- AsyncCommandRetrier (const ApplicationCommandTarget::InvocationInfo& inf)
- : info (inf)
- {
- info.originatingComponent = nullptr;
- startTimer (500);
- }
-
- void timerCallback() override
- {
- stopTimer();
- IntrojucerApp::getCommandManager().invoke (info, true);
- delete this;
- }
-
- ApplicationCommandTarget::InvocationInfo info;
-
- JUCE_DECLARE_NON_COPYABLE (AsyncCommandRetrier)
-};
-
-bool reinvokeCommandAfterCancellingModalComps (const ApplicationCommandTarget::InvocationInfo& info)
-{
- if (ModalComponentManager::getInstance()->cancelAllModalComponents())
- {
- new AsyncCommandRetrier (info);
- return true;
- }
-
- return false;
-}
diff --git a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h
index 082c045efb..65bdaf3931 100644
--- a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h
+++ b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h
@@ -57,31 +57,10 @@ int indexOfLineStartingWith (const StringArray& lines, const String& text, int s
void autoScrollForMouseEvent (const MouseEvent& e, bool scrollX = true, bool scrollY = true);
-void showUTF8ToolWindow (ScopedPointer& ownerPointer);
-void showSVGPathDataToolWindow (ScopedPointer& ownerPointer);
-
bool cancelAnyModalComponents();
-bool reinvokeCommandAfterCancellingModalComps (const ApplicationCommandTarget::InvocationInfo&);
StringArray getCleanedStringArray (StringArray);
-//==============================================================================
-class RolloverHelpComp : public Component,
- private Timer
-{
-public:
- RolloverHelpComp();
-
- void paint (Graphics&) override;
- void timerCallback() override;
-
-private:
- Component* lastComp;
- String lastTip;
-
- static String findTip (Component*);
-};
-
//==============================================================================
class PropertyListBuilder
{
diff --git a/extras/Introjucer/Source/Utility/jucer_SVGPathDataComponent.h b/extras/Introjucer/Source/Utility/jucer_SVGPathDataComponent.h
new file mode 100644
index 0000000000..6172b04d4f
--- /dev/null
+++ b/extras/Introjucer/Source/Utility/jucer_SVGPathDataComponent.h
@@ -0,0 +1,125 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2015 - ROLI 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 SVGPathDataComponent : public Component,
+ private TextEditorListener
+{
+public:
+ SVGPathDataComponent()
+ : desc (String::empty,
+ "Paste an SVG path string into the top box, and it'll be converted to some C++ "
+ "code that will load it as a Path object..")
+ {
+ desc.setJustificationType (Justification::centred);
+ desc.setColour (Label::textColourId, Colours::white);
+ addAndMakeVisible (desc);
+
+ const Colour bkgd (Colours::white.withAlpha (0.6f));
+
+ userText.setFont (getAppSettings().appearance.getCodeFont().withHeight (13.0f));
+ userText.setMultiLine (true, true);
+ userText.setReturnKeyStartsNewLine (true);
+ userText.setColour (TextEditor::backgroundColourId, bkgd);
+ addAndMakeVisible (userText);
+ userText.addListener (this);
+
+ resultText.setFont (getAppSettings().appearance.getCodeFont().withHeight (13.0f));
+ resultText.setMultiLine (true, true);
+ resultText.setColour (TextEditor::backgroundColourId, bkgd);
+ resultText.setReadOnly (true);
+ resultText.setSelectAllWhenFocused (true);
+ addAndMakeVisible (resultText);
+
+ userText.setText (getLastText());
+ }
+
+ void textEditorTextChanged (TextEditor&)
+ {
+ update();
+ }
+
+ void textEditorEscapeKeyPressed (TextEditor&)
+ {
+ getTopLevelComponent()->exitModalState (0);
+ }
+
+ void update()
+ {
+ getLastText() = userText.getText();
+
+ path = Drawable::parseSVGPath (getLastText().trim().unquoted().trim());
+
+ String result = "No path generated.. Not a valid SVG path string?";
+
+ if (! path.isEmpty())
+ {
+ MemoryOutputStream data;
+ path.writePathToStream (data);
+
+ MemoryOutputStream out;
+
+ out << "static const unsigned char pathData[] = ";
+ CodeHelpers::writeDataAsCppLiteral (data.getMemoryBlock(), out, false, true);
+ out << newLine
+ << newLine
+ << "Path path;" << newLine
+ << "path.loadPathFromData (pathData, sizeof (pathData));" << newLine;
+
+ result = out.toString();
+ }
+
+ resultText.setText (result, false);
+ repaint (previewPathArea);
+ }
+
+ void resized()
+ {
+ Rectangle r (getLocalBounds().reduced (8));
+ desc.setBounds (r.removeFromTop (44));
+ r.removeFromTop (8);
+ userText.setBounds (r.removeFromTop (r.getHeight() / 2));
+ r.removeFromTop (8);
+ previewPathArea = r.removeFromRight (r.getHeight());
+ resultText.setBounds (r);
+ }
+
+ void paint (Graphics& g)
+ {
+ g.setColour (Colours::white);
+ g.fillPath (path, path.getTransformToScaleToFit (previewPathArea.reduced (4).toFloat(), true));
+ }
+
+private:
+ Label desc;
+ TextEditor userText, resultText;
+ Rectangle previewPathArea;
+ Path path;
+
+ String& getLastText()
+ {
+ static String t;
+ return t;
+ }
+};
diff --git a/extras/Introjucer/Source/Utility/jucer_UTF8Component.h b/extras/Introjucer/Source/Utility/jucer_UTF8Component.h
new file mode 100644
index 0000000000..bc715038f7
--- /dev/null
+++ b/extras/Introjucer/Source/Utility/jucer_UTF8Component.h
@@ -0,0 +1,92 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2015 - ROLI 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 UTF8Component : public Component,
+ private TextEditorListener
+{
+public:
+ UTF8Component()
+ : desc (String::empty,
+ "Type any string into the box, and it'll be shown below as a portable UTF-8 literal, "
+ "ready to cut-and-paste into your source-code...")
+ {
+ desc.setJustificationType (Justification::centred);
+ desc.setColour (Label::textColourId, Colours::white);
+ addAndMakeVisible (desc);
+
+ const Colour bkgd (Colours::white.withAlpha (0.6f));
+
+ userText.setMultiLine (true, true);
+ userText.setReturnKeyStartsNewLine (true);
+ userText.setColour (TextEditor::backgroundColourId, bkgd);
+ addAndMakeVisible (userText);
+ userText.addListener (this);
+
+ resultText.setFont (getAppSettings().appearance.getCodeFont().withHeight (13.0f));
+ resultText.setMultiLine (true, true);
+ resultText.setColour (TextEditor::backgroundColourId, bkgd);
+ resultText.setReadOnly (true);
+ resultText.setSelectAllWhenFocused (true);
+ addAndMakeVisible (resultText);
+
+ userText.setText (getLastText());
+ }
+
+ void textEditorTextChanged (TextEditor&)
+ {
+ update();
+ }
+
+ void textEditorEscapeKeyPressed (TextEditor&)
+ {
+ getTopLevelComponent()->exitModalState (0);
+ }
+
+ void update()
+ {
+ getLastText() = userText.getText();
+ resultText.setText (CodeHelpers::stringLiteral (getLastText(), 100), false);
+ }
+
+ void resized()
+ {
+ Rectangle r (getLocalBounds().reduced (8));
+ desc.setBounds (r.removeFromTop (44));
+ r.removeFromTop (8);
+ userText.setBounds (r.removeFromTop (r.getHeight() / 2));
+ r.removeFromTop (8);
+ resultText.setBounds (r);
+ }
+
+private:
+ Label desc;
+ TextEditor userText, resultText;
+
+ String& getLastText()
+ {
+ static String t;
+ return t;
+ }
+};