diff --git a/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj b/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
index b73e9d3a5e..159e06267a 100644
--- a/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
+++ b/extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
@@ -222,6 +222,7 @@
3CABAAC1C4BC0D8105183D56 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; };
3CD57938B4C273D0AA6E6B8B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Path.h"; path = "../../../../modules/juce_graphics/geometry/juce_Path.h"; sourceTree = "SOURCE_ROOT"; };
3D2B51C71E3676F283B778EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropContainer.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h"; sourceTree = "SOURCE_ROOT"; };
+ 3DBB6D91397AE61D59C90510 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConcertinaPanel.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
3F1501FE4867042830B25DD5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CustomTypeface.cpp"; path = "../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp"; sourceTree = "SOURCE_ROOT"; };
3F222D26A164E7AD78A33B3D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToggleButton.h"; path = "../../../../modules/juce_gui_basics/buttons/juce_ToggleButton.h"; sourceTree = "SOURCE_ROOT"; };
3FAFD16944A6674164D23914 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_ASCII.h"; path = "../../../../modules/juce_core/text/juce_CharPointer_ASCII.h"; sourceTree = "SOURCE_ROOT"; };
@@ -514,6 +515,7 @@
A8DB614600D348C730AC3930 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GroupComponent.h"; path = "../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h"; sourceTree = "SOURCE_ROOT"; };
A8F9DE55079FC7F6440CF678 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LeakedObjectDetector.h"; path = "../../../../modules/juce_core/memory/juce_LeakedObjectDetector.h"; sourceTree = "SOURCE_ROOT"; };
A9F6985D38A1C25F0C75215B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Windowing.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_android_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; };
+ A9FA71357C5B2A46A75D9230 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; };
AA2D4949BD61CE8B891731E4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableComposite.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"; sourceTree = "SOURCE_ROOT"; };
AAA445B64E54BBA12D5E1358 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_ObjCHelpers.h"; path = "../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"; sourceTree = "SOURCE_ROOT"; };
AAB313919EE298E25D2EAD19 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TemporaryFile.cpp"; path = "../../../../modules/juce_core/files/juce_TemporaryFile.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1343,6 +1345,8 @@
7D50F21E9F18C152C9C662D5,
271A1D94B96A8B7C949FD8ED,
AE3E427DBCC8D50E3F356402,
+ 3DBB6D91397AE61D59C90510,
+ A9FA71357C5B2A46A75D9230,
6EE91491434D058606460AFB,
A8DB614600D348C730AC3930,
EA0D43AB5F47506D5CDA81BB,
diff --git a/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj b/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj
index fe5a539e61..0bd56ed820 100644
--- a/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj
+++ b/extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj
@@ -2454,6 +2454,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj b/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj
index 9e15f73d8d..04b64d4c81 100644
--- a/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj
+++ b/extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj
@@ -2454,6 +2454,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
index 874b4833bb..fb5677db47 100644
--- a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
+++ b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
@@ -688,6 +688,9 @@
true
+
+ true
+
true
@@ -1239,6 +1242,7 @@
+
diff --git a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
index 67973cf80a..affbaf0a06 100644
--- a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
+++ b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
@@ -868,6 +868,9 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
@@ -2016,6 +2019,9 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
diff --git a/extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj b/extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj
index bc90b77248..adf040fb3e 100644
--- a/extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj
+++ b/extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj
@@ -441,6 +441,7 @@
687E1D120E47EEFEEB73A4BF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableText.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp"; sourceTree = "SOURCE_ROOT"; };
690BE5039AADEF787D6E13D9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioDemoTabComponent.cpp; path = ../../Source/demos/AudioDemoTabComponent.cpp; sourceTree = "SOURCE_ROOT"; };
6A4819E134CD45BD043C3219 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Socket.cpp"; path = "../../../../modules/juce_core/network/juce_Socket.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 6A9868E67963F63A4819A56B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConcertinaPanel.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
6B03CB11D5DEABAEE7F9E0F1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GIFLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
6B0F3AF3FE7B113C33112897 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiDocumentPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h"; sourceTree = "SOURCE_ROOT"; };
6BBB8746C2C1BB5F3C3F1FC2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_UIViewComponentPeer.mm"; path = "../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm"; sourceTree = "SOURCE_ROOT"; };
@@ -610,6 +611,7 @@
9C7B5E573807ED59065B54DA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableCornerComponent.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h"; sourceTree = "SOURCE_ROOT"; };
9CD9B6E7197079625A165653 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_SystemStats.mm"; path = "../../../../modules/juce_core/native/juce_mac_SystemStats.mm"; sourceTree = "SOURCE_ROOT"; };
9CF4E56974B8290F34032432 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_CoreAudio.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 9CF6FE48B33DC0E8B4C407F6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; };
9D042E1CAB03CFCD4B937951 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WebBrowserComponent.h"; path = "../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; };
9D09225ABCE19597A944DEEA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PositionableAudioSource.h"; path = "../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h"; sourceTree = "SOURCE_ROOT"; };
9D18794763C086784ECE98D6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BubbleComponent.cpp"; path = "../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1666,6 +1668,8 @@
825BDA58C2694CE7F3FC2494,
422D4D8EE3470F57D56064AA,
CF2A1897A3C5610A282A2713,
+ 6A9868E67963F63A4819A56B,
+ 9CF6FE48B33DC0E8B4C407F6,
108D97ACAEDE5A8DF0A483B7,
3B32FA1EF99322D3DED5F162,
E453E312D607E60FAA6D1BF0,
diff --git a/extras/JuceDemo/Builds/VisualStudio2005/Juce Demo.vcproj b/extras/JuceDemo/Builds/VisualStudio2005/Juce Demo.vcproj
index 3b2a991d75..50b2a43c0b 100644
--- a/extras/JuceDemo/Builds/VisualStudio2005/Juce Demo.vcproj
+++ b/extras/JuceDemo/Builds/VisualStudio2005/Juce Demo.vcproj
@@ -3217,6 +3217,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/extras/JuceDemo/Builds/VisualStudio2008/Juce Demo.vcproj b/extras/JuceDemo/Builds/VisualStudio2008/Juce Demo.vcproj
index 8b33594313..df045f4cab 100644
--- a/extras/JuceDemo/Builds/VisualStudio2008/Juce Demo.vcproj
+++ b/extras/JuceDemo/Builds/VisualStudio2008/Juce Demo.vcproj
@@ -3217,6 +3217,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj b/extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj
index 6739cd5433..6e38b9e146 100644
--- a/extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj
+++ b/extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj
@@ -880,6 +880,9 @@
true
+
+ true
+
true
@@ -1513,6 +1516,7 @@
+
diff --git a/extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj.filters b/extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj.filters
index 2b81119b2e..1cfb44bd20 100644
--- a/extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj.filters
+++ b/extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj.filters
@@ -1144,6 +1144,9 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
@@ -2472,6 +2475,9 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
diff --git a/extras/JuceDemo/Builds/iOS/Juce Demo.xcodeproj/project.pbxproj b/extras/JuceDemo/Builds/iOS/Juce Demo.xcodeproj/project.pbxproj
index cb2df1c8d4..f8b0b8b627 100644
--- a/extras/JuceDemo/Builds/iOS/Juce Demo.xcodeproj/project.pbxproj
+++ b/extras/JuceDemo/Builds/iOS/Juce Demo.xcodeproj/project.pbxproj
@@ -433,6 +433,7 @@
687E1D120E47EEFEEB73A4BF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableText.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp"; sourceTree = "SOURCE_ROOT"; };
690BE5039AADEF787D6E13D9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AudioDemoTabComponent.cpp; path = ../../Source/demos/AudioDemoTabComponent.cpp; sourceTree = "SOURCE_ROOT"; };
6A4819E134CD45BD043C3219 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Socket.cpp"; path = "../../../../modules/juce_core/network/juce_Socket.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 6A9868E67963F63A4819A56B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConcertinaPanel.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
6B03CB11D5DEABAEE7F9E0F1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GIFLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
6B0F3AF3FE7B113C33112897 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiDocumentPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h"; sourceTree = "SOURCE_ROOT"; };
6BBB8746C2C1BB5F3C3F1FC2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_UIViewComponentPeer.mm"; path = "../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm"; sourceTree = "SOURCE_ROOT"; };
@@ -603,6 +604,7 @@
9C7B5E573807ED59065B54DA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableCornerComponent.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h"; sourceTree = "SOURCE_ROOT"; };
9CD9B6E7197079625A165653 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_SystemStats.mm"; path = "../../../../modules/juce_core/native/juce_mac_SystemStats.mm"; sourceTree = "SOURCE_ROOT"; };
9CF4E56974B8290F34032432 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_CoreAudio.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 9CF6FE48B33DC0E8B4C407F6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; };
9D042E1CAB03CFCD4B937951 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WebBrowserComponent.h"; path = "../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; };
9D09225ABCE19597A944DEEA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PositionableAudioSource.h"; path = "../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h"; sourceTree = "SOURCE_ROOT"; };
9D18794763C086784ECE98D6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BubbleComponent.cpp"; path = "../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1658,6 +1660,8 @@
825BDA58C2694CE7F3FC2494,
422D4D8EE3470F57D56064AA,
CF2A1897A3C5610A282A2713,
+ 6A9868E67963F63A4819A56B,
+ 9CF6FE48B33DC0E8B4C407F6,
108D97ACAEDE5A8DF0A483B7,
3B32FA1EF99322D3DED5F162,
E453E312D607E60FAA6D1BF0,
diff --git a/extras/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj b/extras/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj
index 3aeee4e0cb..ea1bd83c3f 100644
--- a/extras/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj
+++ b/extras/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj
@@ -350,6 +350,7 @@
5585BCF8B17AD03D9FB4A32A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MenuBarComponent.cpp"; path = "../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
5590FBD40E8A604534345F09 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_JSON.h"; path = "../../../../modules/juce_core/json/juce_JSON.h"; sourceTree = "SOURCE_ROOT"; };
5631EA8ECD79655B6BEDF8A3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUCarbonViewDispatch.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp; sourceTree = "DEVELOPER_DIR"; };
+ 5647736926AE116B8C392630 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; };
566547884532F1E16F7CF3F1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Initialisation.h"; path = "../../../../modules/juce_gui_basics/application/juce_Initialisation.h"; sourceTree = "SOURCE_ROOT"; };
56A295F04B7F248D0A52B878 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Fonts.mm"; path = "../../../../modules/juce_graphics/native/juce_mac_Fonts.mm"; sourceTree = "SOURCE_ROOT"; };
56BFD67859B81D9E53F5B727 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_URL.cpp"; path = "../../../../modules/juce_core/network/juce_URL.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -769,6 +770,7 @@
D722F49E225A9A47AA348628 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeLayout.cpp"; path = "../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp"; sourceTree = "SOURCE_ROOT"; };
D79B9A384D018B252B6C4D6B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Image.h"; path = "../../../../modules/juce_graphics/images/juce_Image.h"; sourceTree = "SOURCE_ROOT"; };
D7A2C53BADFE9FFDED204B6E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WindowsMediaAudioFormat.cpp"; path = "../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; };
+ D7FE483198CE40495DE72435 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConcertinaPanel.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
D85ABD84770A6A66B78C288B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiOutput.h"; path = "../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.h"; sourceTree = "SOURCE_ROOT"; };
D88796A40E58D524DE34989B = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MessageListener.cpp"; path = "../../../../modules/juce_events/messages/juce_MessageListener.cpp"; sourceTree = "SOURCE_ROOT"; };
D8DA09DFE4076AAD9BBFEC2A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FlacAudioFormat.h"; path = "../../../../modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1627,6 +1629,8 @@
A90A45FB8790A91DF1A78BE7,
9F6A1FA82A8C412622129993,
D18B1676A7BB2890B81717FD,
+ D7FE483198CE40495DE72435,
+ 5647736926AE116B8C392630,
4AB9AA07703E3BAE99B586C3,
6A3C840E1B6CD34CA8C8DB4B,
C859B01B55EAB67BC10ED803,
diff --git a/extras/audio plugin demo/Builds/VisualStudio2005/JuceDemoPlugin.vcproj b/extras/audio plugin demo/Builds/VisualStudio2005/JuceDemoPlugin.vcproj
index b4c3f75f27..c8d903f8f3 100644
--- a/extras/audio plugin demo/Builds/VisualStudio2005/JuceDemoPlugin.vcproj
+++ b/extras/audio plugin demo/Builds/VisualStudio2005/JuceDemoPlugin.vcproj
@@ -3097,6 +3097,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcproj b/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcproj
index f087a6d055..b230848172 100644
--- a/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcproj
+++ b/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcproj
@@ -3097,6 +3097,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj b/extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj
index 500ebbfefa..14763ab03b 100644
--- a/extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj
+++ b/extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj
@@ -356,6 +356,7 @@
5B1692FF63FBBA5E54EA1650 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../../../modules/juce_audio_utils/juce_module_info"; sourceTree = "SOURCE_ROOT"; };
5B2546F3B90333492AB00179 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Variant.h"; path = "../../../../modules/juce_core/containers/juce_Variant.h"; sourceTree = "SOURCE_ROOT"; };
5B4DD89CB29AEF782C6D878C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RectanglePlacement.h"; path = "../../../../modules/juce_graphics/placement/juce_RectanglePlacement.h"; sourceTree = "SOURCE_ROOT"; };
+ 5B6A592439B2BEA9C6B14720 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; };
5BB7139B57A1A26610868241 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertiesFile.cpp"; path = "../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp"; sourceTree = "SOURCE_ROOT"; };
5BF15549E7E4C7BA4161805D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TreeView.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_TreeView.cpp"; sourceTree = "SOURCE_ROOT"; };
5C24DE268797C1C7AC932837 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Socket.cpp"; path = "../../../../modules/juce_core/network/juce_Socket.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -538,6 +539,7 @@
956BE0B32D5B1410E43A3C58 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../../../modules/juce_data_structures/juce_module_info"; sourceTree = "SOURCE_ROOT"; };
957428BC0CD90C37ED1EB7E1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringArray.h"; path = "../../../../modules/juce_core/text/juce_StringArray.h"; sourceTree = "SOURCE_ROOT"; };
9647232A743A0C7BFE819385 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextPropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ 96E7B79CFB1B3EC9EC2505CD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConcertinaPanel.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
9712862E18881F1713110286 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Toolbar.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_Toolbar.h"; sourceTree = "SOURCE_ROOT"; };
9717C28D840C93B5A17B3EAD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsContext.h"; path = "../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; };
972960F84A014CAEFE281044 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputStream.h"; path = "../../../../modules/juce_core/streams/juce_InputStream.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1588,6 +1590,8 @@
BDD99C777FD1F57007F3BFAF,
C30597BA9A68B8B713B95A22,
6493E8C53EE6361EEA57D243,
+ 96E7B79CFB1B3EC9EC2505CD,
+ 5B6A592439B2BEA9C6B14720,
E218E66CE4F1DDA0B9BED814,
559A2F8A7A121471D8026D81,
F3FCF5C0D92A2991A513B0D3,
diff --git a/extras/audio plugin host/Builds/VisualStudio2005/Plugin Host.vcproj b/extras/audio plugin host/Builds/VisualStudio2005/Plugin Host.vcproj
index ed1eec309a..80723ba6d7 100644
--- a/extras/audio plugin host/Builds/VisualStudio2005/Plugin Host.vcproj
+++ b/extras/audio plugin host/Builds/VisualStudio2005/Plugin Host.vcproj
@@ -3140,6 +3140,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/extras/audio plugin host/Builds/VisualStudio2008/Plugin Host.vcproj b/extras/audio plugin host/Builds/VisualStudio2008/Plugin Host.vcproj
index 8d6ac46aa6..4eb190deff 100644
--- a/extras/audio plugin host/Builds/VisualStudio2008/Plugin Host.vcproj
+++ b/extras/audio plugin host/Builds/VisualStudio2008/Plugin Host.vcproj
@@ -3140,6 +3140,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/extras/example projects/Builds/MacOSX/HelloWorld.xcodeproj/project.pbxproj b/extras/example projects/Builds/MacOSX/HelloWorld.xcodeproj/project.pbxproj
index c7e1a70701..9c6fcbceec 100644
--- a/extras/example projects/Builds/MacOSX/HelloWorld.xcodeproj/project.pbxproj
+++ b/extras/example projects/Builds/MacOSX/HelloWorld.xcodeproj/project.pbxproj
@@ -282,6 +282,7 @@
6889EF825EA839830C733D07 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PathStrokeType.h"; path = "../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h"; sourceTree = "SOURCE_ROOT"; };
69266B83D819323230CB67B9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableWindow.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
6930D056DFFC6EAA2B52E045 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinate.h"; path = "../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h"; sourceTree = "SOURCE_ROOT"; };
+ 699E20F1575B18C3D909940A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; };
6A8D0F24F0A1F95A52845506 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Threads.mm"; path = "../../../../modules/juce_core/native/juce_mac_Threads.mm"; sourceTree = "SOURCE_ROOT"; };
6B1B6046C54E082A9E25D69C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeListener.h"; path = "../../../../modules/juce_events/broadcasters/juce_ChangeListener.h"; sourceTree = "SOURCE_ROOT"; };
6B252EAC72CB94D5DC06C284 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedPipe.h"; path = "../../../../modules/juce_core/network/juce_NamedPipe.h"; sourceTree = "SOURCE_ROOT"; };
@@ -629,6 +630,7 @@
FE8B93BA3F56CCC0BB37A5C8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Windowing.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; };
FEA9C3FC8BE313C619C3D195 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DocumentWindow.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
FED2586B3C7EA1BBA5512D58 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemComponent.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ FF06CDF5B9CF3DE2EA741D54 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConcertinaPanel.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
FF263A986694A1ADAA51D156 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertySet.h"; path = "../../../../modules/juce_core/containers/juce_PropertySet.h"; sourceTree = "SOURCE_ROOT"; };
FF49DBB348CFFF3F396FB712 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Font.cpp"; path = "../../../../modules/juce_graphics/fonts/juce_Font.cpp"; sourceTree = "SOURCE_ROOT"; };
39BDB517F5C4ED09B374411D = { isa = PBXGroup; children = (
@@ -1120,6 +1122,8 @@
C2012B18C8652969617417E3,
90CFC8BC9D8A156A512D2A39,
C22BEA19FDBE55F5AAFE9D36,
+ FF06CDF5B9CF3DE2EA741D54,
+ 699E20F1575B18C3D909940A,
D5054A3D5EBDC47D51FC99F6,
E143BF0720845D8A25BB16E6,
B2C3D53237084A8C79EE8B16,
diff --git a/extras/example projects/Builds/VisualStudio2005/HelloWorld.vcproj b/extras/example projects/Builds/VisualStudio2005/HelloWorld.vcproj
index c685afacc8..a18ed36f70 100644
--- a/extras/example projects/Builds/VisualStudio2005/HelloWorld.vcproj
+++ b/extras/example projects/Builds/VisualStudio2005/HelloWorld.vcproj
@@ -2178,6 +2178,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/extras/example projects/Builds/VisualStudio2008/HelloWorld.vcproj b/extras/example projects/Builds/VisualStudio2008/HelloWorld.vcproj
index c9a2751a14..8dd4ee506a 100644
--- a/extras/example projects/Builds/VisualStudio2008/HelloWorld.vcproj
+++ b/extras/example projects/Builds/VisualStudio2008/HelloWorld.vcproj
@@ -2178,6 +2178,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/extras/example projects/Builds/iOS/HelloWorld.xcodeproj/project.pbxproj b/extras/example projects/Builds/iOS/HelloWorld.xcodeproj/project.pbxproj
index 0eb9a3337d..13b7e8887d 100644
--- a/extras/example projects/Builds/iOS/HelloWorld.xcodeproj/project.pbxproj
+++ b/extras/example projects/Builds/iOS/HelloWorld.xcodeproj/project.pbxproj
@@ -281,6 +281,7 @@
6889EF825EA839830C733D07 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PathStrokeType.h"; path = "../../../../modules/juce_graphics/geometry/juce_PathStrokeType.h"; sourceTree = "SOURCE_ROOT"; };
69266B83D819323230CB67B9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableWindow.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_ResizableWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
6930D056DFFC6EAA2B52E045 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinate.h"; path = "../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h"; sourceTree = "SOURCE_ROOT"; };
+ 699E20F1575B18C3D909940A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; };
6A8D0F24F0A1F95A52845506 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Threads.mm"; path = "../../../../modules/juce_core/native/juce_mac_Threads.mm"; sourceTree = "SOURCE_ROOT"; };
6B1B6046C54E082A9E25D69C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeListener.h"; path = "../../../../modules/juce_events/broadcasters/juce_ChangeListener.h"; sourceTree = "SOURCE_ROOT"; };
6B252EAC72CB94D5DC06C284 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedPipe.h"; path = "../../../../modules/juce_core/network/juce_NamedPipe.h"; sourceTree = "SOURCE_ROOT"; };
@@ -614,6 +615,7 @@
F9816E9564DF0FD05C77B845 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiDocumentPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h"; sourceTree = "SOURCE_ROOT"; };
FA3161F4692D54C87001BCD7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableListBox.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_TableListBox.cpp"; sourceTree = "SOURCE_ROOT"; };
FB1A1B08CB724305EBC233A4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditor.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_TextEditor.h"; sourceTree = "SOURCE_ROOT"; };
+ FB3723E1113ED13B4B8DF09A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp"; sourceTree = "SOURCE_ROOT"; };
FB6FA17C00AB569935B5CFF8 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
FB9E2985FBE36494513C83A6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Label.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_Label.h"; sourceTree = "SOURCE_ROOT"; };
FC00A16A6756DBFE0B875F5C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableHeaderComponent.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -621,7 +623,6 @@
FD5D001673478C39B79A9C6A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BigInteger.h"; path = "../../../../modules/juce_core/maths/juce_BigInteger.h"; sourceTree = "SOURCE_ROOT"; };
FE9531D38CA4C273B6FB87A7 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
EA398D9C544440E06637C134 = { isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HelloWorld.app; sourceTree = "BUILT_PRODUCTS_DIR"; };
- FB3723E1113ED13B4B8DF09A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp"; sourceTree = "SOURCE_ROOT"; };
FB845B6C46248D66EB02A862 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_AppleRemote.mm"; path = "../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm"; sourceTree = "SOURCE_ROOT"; };
FD7E5A4B8C6532BD458B2A94 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CallOutBox.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp"; sourceTree = "SOURCE_ROOT"; };
FDDA86C3FCCC3C74F7CDA53D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_core.h"; path = "../../../../modules/juce_core/juce_core.h"; sourceTree = "SOURCE_ROOT"; };
@@ -629,6 +630,7 @@
FE8B93BA3F56CCC0BB37A5C8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Windowing.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_win32_Windowing.cpp"; sourceTree = "SOURCE_ROOT"; };
FEA9C3FC8BE313C619C3D195 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DocumentWindow.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_DocumentWindow.cpp"; sourceTree = "SOURCE_ROOT"; };
FED2586B3C7EA1BBA5512D58 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemComponent.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"; sourceTree = "SOURCE_ROOT"; };
+ FF06CDF5B9CF3DE2EA741D54 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConcertinaPanel.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
FF263A986694A1ADAA51D156 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertySet.h"; path = "../../../../modules/juce_core/containers/juce_PropertySet.h"; sourceTree = "SOURCE_ROOT"; };
FF49DBB348CFFF3F396FB712 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Font.cpp"; path = "../../../../modules/juce_graphics/fonts/juce_Font.cpp"; sourceTree = "SOURCE_ROOT"; };
39BDB517F5C4ED09B374411D = { isa = PBXGroup; children = (
@@ -1120,6 +1122,8 @@
C2012B18C8652969617417E3,
90CFC8BC9D8A156A512D2A39,
C22BEA19FDBE55F5AAFE9D36,
+ FF06CDF5B9CF3DE2EA741D54,
+ 699E20F1575B18C3D909940A,
D5054A3D5EBDC47D51FC99F6,
E143BF0720845D8A25BB16E6,
B2C3D53237084A8C79EE8B16,
diff --git a/extras/static library/Builds/VisualStudio2008/juce.vcproj b/extras/static library/Builds/VisualStudio2008/juce.vcproj
index c7c60f13a3..813cb0fd24 100644
--- a/extras/static library/Builds/VisualStudio2008/juce.vcproj
+++ b/extras/static library/Builds/VisualStudio2008/juce.vcproj
@@ -3102,6 +3102,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/extras/static library/Builds/VisualStudio2010/juce.vcxproj b/extras/static library/Builds/VisualStudio2010/juce.vcxproj
index df593b6675..d11666e21b 100644
--- a/extras/static library/Builds/VisualStudio2010/juce.vcxproj
+++ b/extras/static library/Builds/VisualStudio2010/juce.vcxproj
@@ -858,6 +858,9 @@
true
+
+ true
+
true
@@ -1481,6 +1484,7 @@
+
diff --git a/extras/static library/Builds/VisualStudio2010/juce.vcxproj.filters b/extras/static library/Builds/VisualStudio2010/juce.vcxproj.filters
index 3ffb6270a3..e3d9a16619 100644
--- a/extras/static library/Builds/VisualStudio2010/juce.vcxproj.filters
+++ b/extras/static library/Builds/VisualStudio2010/juce.vcxproj.filters
@@ -1075,6 +1075,9 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
@@ -2373,6 +2376,9 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
diff --git a/extras/the jucer/Builds/MacOSX/Jucer.xcodeproj/project.pbxproj b/extras/the jucer/Builds/MacOSX/Jucer.xcodeproj/project.pbxproj
index a50c185861..1bf930c775 100644
--- a/extras/the jucer/Builds/MacOSX/Jucer.xcodeproj/project.pbxproj
+++ b/extras/the jucer/Builds/MacOSX/Jucer.xcodeproj/project.pbxproj
@@ -236,6 +236,7 @@
3F47FAD4F18A9AC9F31D1AF0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_WebBrowserComponent.cpp"; path = "../../../../modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
3F75E8E94C7483C2090D5333 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AffineTransform.cpp"; path = "../../../../modules/juce_graphics/geometry/juce_AffineTransform.cpp"; sourceTree = "SOURCE_ROOT"; };
3F78AD99200269A71518EB23 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageCache.cpp"; path = "../../../../modules/juce_graphics/images/juce_ImageCache.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 40140516A838A42622A94550 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConcertinaPanel.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"; sourceTree = "SOURCE_ROOT"; };
4072A4A77C192E9EFFAB503F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "jucer_CommandIDs.h"; path = "../../src/ui/jucer_CommandIDs.h"; sourceTree = "SOURCE_ROOT"; };
417C8E8D9C316406EFF9AC74 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BubbleMessageComponent.cpp"; path = "../../../../modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
419ED5DB2D8FF395AB605C9D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BooleanPropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -459,6 +460,7 @@
8AEE7FFCCC5933EDA0F0E083 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileInputStream.h"; path = "../../../../modules/juce_core/files/juce_FileInputStream.h"; sourceTree = "SOURCE_ROOT"; };
8B315AF14598BE539480070E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBrowserComponent.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; };
8B928FD2BA805E1B0FD5A218 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadower.cpp"; path = "../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp"; sourceTree = "SOURCE_ROOT"; };
+ 8BC3E3B38EF9A601F212E5CB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; };
8C7A42B16018A7EFBCC84F13 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_win32_ComSmartPtr.h"; path = "../../../../modules/juce_core/native/juce_win32_ComSmartPtr.h"; sourceTree = "SOURCE_ROOT"; };
8C90BEA9F42B1CD3D358BE0C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_FileChooser.mm"; path = "../../../../modules/juce_gui_basics/native/juce_mac_FileChooser.mm"; sourceTree = "SOURCE_ROOT"; };
8C96948B01B70F125652B4A6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Variant.cpp"; path = "../../../../modules/juce_core/containers/juce_Variant.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1380,6 +1382,8 @@
DB5E058486E309D69E538BF6,
053D5E2DEC4DC4C3F89D664C,
2C7435982321C750169EDB7D,
+ 40140516A838A42622A94550,
+ 8BC3E3B38EF9A601F212E5CB,
0DCADB8BDB13B9EBA009CA73,
3B36C611C1D8FEAA6A744E28,
B32502920C2634ECD316B785,
diff --git a/extras/the jucer/Builds/VisualStudio2008/Jucer.vcproj b/extras/the jucer/Builds/VisualStudio2008/Jucer.vcproj
index 0b3522941d..218d6c17b6 100644
--- a/extras/the jucer/Builds/VisualStudio2008/Jucer.vcproj
+++ b/extras/the jucer/Builds/VisualStudio2008/Jucer.vcproj
@@ -2345,6 +2345,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj b/extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj
index daf99e8247..ce7c120499 100644
--- a/extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj
+++ b/extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj
@@ -664,6 +664,9 @@
true
+
+ true
+
true
@@ -1233,6 +1236,7 @@
+
diff --git a/extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj.filters b/extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj.filters
index 1b5655be90..5bfbdded11 100644
--- a/extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj.filters
+++ b/extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj.filters
@@ -859,6 +859,9 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
@@ -2061,6 +2064,9 @@
Juce Modules\juce_gui_basics\layout
+
+ Juce Modules\juce_gui_basics\layout
+
Juce Modules\juce_gui_basics\layout
diff --git a/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h b/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h
index 4efec0b77f..b25c42d650 100644
--- a/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h
+++ b/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h
@@ -153,4 +153,4 @@ public:
virtual int64 getHashCode() const = 0;
};
-#endif
+#endif // __JUCE_AUDIOTHUMBNAILBASE_JUCEHEADER__
diff --git a/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp b/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp
index 973cd24929..346b83d382 100644
--- a/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp
+++ b/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp
@@ -23,7 +23,6 @@
==============================================================================
*/
-
LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (const Image& image)
: savedState (new RenderingHelpers::SoftwareRendererSavedState (image, image.getBounds()))
{
diff --git a/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp b/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp
index fa23910d13..db69680e15 100644
--- a/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp
+++ b/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp
@@ -849,4 +849,4 @@ private:
}
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Direct2DLowLevelGraphicsContext);
-};
\ No newline at end of file
+};
diff --git a/modules/juce_gui_basics/juce_gui_basics.cpp b/modules/juce_gui_basics/juce_gui_basics.cpp
index 7a7786d711..2e03353dcc 100644
--- a/modules/juce_gui_basics/juce_gui_basics.cpp
+++ b/modules/juce_gui_basics/juce_gui_basics.cpp
@@ -182,6 +182,7 @@ namespace juce
#include "layout/juce_ComponentBoundsConstrainer.cpp"
#include "layout/juce_ComponentBuilder.cpp"
#include "layout/juce_ComponentMovementWatcher.cpp"
+#include "layout/juce_ConcertinaPanel.cpp"
#include "layout/juce_GroupComponent.cpp"
#include "layout/juce_MultiDocumentPanel.cpp"
#include "layout/juce_ResizableBorderComponent.cpp"
diff --git a/modules/juce_gui_basics/juce_gui_basics.h b/modules/juce_gui_basics/juce_gui_basics.h
index 2b1943b81f..d5e2cd0735 100644
--- a/modules/juce_gui_basics/juce_gui_basics.h
+++ b/modules/juce_gui_basics/juce_gui_basics.h
@@ -103,9 +103,6 @@ namespace juce
#ifndef __JUCE_FILEDRAGANDDROPTARGET_JUCEHEADER__
#include "mouse/juce_FileDragAndDropTarget.h"
#endif
-#ifndef __JUCE_TEXTDRAGANDDROPTARGET_JUCEHEADER__
- #include "mouse/juce_TextDragAndDropTarget.h"
-#endif
#ifndef __JUCE_LASSOCOMPONENT_JUCEHEADER__
#include "mouse/juce_LassoComponent.h"
#endif
@@ -124,6 +121,9 @@ namespace juce
#ifndef __JUCE_SELECTEDITEMSET_JUCEHEADER__
#include "mouse/juce_SelectedItemSet.h"
#endif
+#ifndef __JUCE_TEXTDRAGANDDROPTARGET_JUCEHEADER__
+ #include "mouse/juce_TextDragAndDropTarget.h"
+#endif
#ifndef __JUCE_TOOLTIPCLIENT_JUCEHEADER__
#include "mouse/juce_TooltipClient.h"
#endif
@@ -253,6 +253,9 @@ namespace juce
#ifndef __JUCE_COMPONENTMOVEMENTWATCHER_JUCEHEADER__
#include "layout/juce_ComponentMovementWatcher.h"
#endif
+#ifndef __JUCE_CONCERTINAPANEL_JUCEHEADER__
+ #include "layout/juce_ConcertinaPanel.h"
+#endif
#ifndef __JUCE_GROUPCOMPONENT_JUCEHEADER__
#include "layout/juce_GroupComponent.h"
#endif
diff --git a/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp b/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp
new file mode 100644
index 0000000000..e51bcdec50
--- /dev/null
+++ b/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp
@@ -0,0 +1,403 @@
+/*
+ ==============================================================================
+
+ 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.
+
+ ==============================================================================
+*/
+
+struct ConcertinaPanel::PanelSizes
+{
+ struct Panel
+ {
+ Panel() noexcept {}
+
+ Panel (const int sz, const int mn, const int mx) noexcept
+ : size (sz), minSize (mn), maxSize (mx) {}
+
+ int setSize (const int newSize) noexcept
+ {
+ jassert (minSize <= maxSize);
+ const int oldSize = size;
+ size = jlimit (minSize, maxSize, newSize);
+ return size - oldSize;
+ }
+
+ int expand (int amount) noexcept
+ {
+ amount = jmin (amount, maxSize - size);
+ size += amount;
+ return amount;
+ }
+
+ int reduce (int amount) noexcept
+ {
+ amount = jmin (amount, size - minSize);
+ size -= amount;
+ return amount;
+ }
+
+ bool canExpand() const noexcept { return size < maxSize; }
+ bool isMinimised() const noexcept { return size <= minSize; }
+
+ int size, minSize, maxSize;
+ };
+
+ Array sizes;
+
+ Panel& get (const int index) const noexcept { return sizes.getReference(index); }
+
+ PanelSizes withMovedPanel (const int index, int targetPosition, int totalSpace) const
+ {
+ const int num = sizes.size();
+ totalSpace = jmax (totalSpace, getMinimumSize (0, num));
+ targetPosition = jmax (targetPosition, totalSpace - getMaximumSize (index, num));
+
+ PanelSizes newSizes (*this);
+ newSizes.stretchRange (0, index, targetPosition - newSizes.getTotalSize (0, index), stretchLast);
+ newSizes.stretchRange (index, num, totalSpace - newSizes.getTotalSize (0, index) - newSizes.getTotalSize (index, num), stretchFirst);
+ return newSizes;
+ }
+
+ PanelSizes fittedInto (int totalSpace) const
+ {
+ PanelSizes newSizes (*this);
+ const int num = newSizes.sizes.size();
+ totalSpace = jmax (totalSpace, getMinimumSize (0, num));
+ newSizes.stretchRange (0, num, totalSpace - newSizes.getTotalSize (0, num), stretchAll);
+ return newSizes;
+ }
+
+ PanelSizes withResizedPanel (const int index, int panelHeight, int totalSpace) const
+ {
+ PanelSizes newSizes (*this);
+
+ if (totalSpace <= 0)
+ {
+ newSizes.get(index).size = panelHeight;
+ }
+ else
+ {
+ const int num = sizes.size();
+ const int minSize = getMinimumSize (0, num);
+ totalSpace = jmax (totalSpace, minSize);
+
+ newSizes.get(index).setSize (panelHeight);
+ newSizes.stretchRange (0, index, totalSpace - newSizes.getTotalSize (0, num), stretchLast);
+ newSizes.stretchRange (index, num, totalSpace - newSizes.getTotalSize (0, num), stretchLast);
+ newSizes = newSizes.fittedInto (totalSpace);
+ }
+
+ return newSizes;
+ }
+
+private:
+ enum ExpandMode
+ {
+ stretchAll,
+ stretchFirst,
+ stretchLast
+ };
+
+ void growRangeFirst (const int start, const int end, int spaceDiff) noexcept
+ {
+ for (int attempts = 4; --attempts >= 0 && spaceDiff > 0;)
+ for (int i = start; i < end && spaceDiff > 0; ++i)
+ spaceDiff -= get (i).expand (spaceDiff);
+ }
+
+ void growRangeLast (const int start, const int end, int spaceDiff) noexcept
+ {
+ for (int attempts = 4; --attempts >= 0 && spaceDiff > 0;)
+ for (int i = end; --i >= start && spaceDiff > 0;)
+ spaceDiff -= get (i).expand (spaceDiff);
+ }
+
+ void growRangeAll (const int start, const int end, int spaceDiff) noexcept
+ {
+ Array expandableItems;
+
+ for (int i = start; i < end; ++i)
+ if (get(i).canExpand() && ! get(i).isMinimised())
+ expandableItems.add (& get(i));
+
+ for (int attempts = 4; --attempts >= 0 && spaceDiff > 0;)
+ for (int i = expandableItems.size(); --i >= 0 && spaceDiff > 0;)
+ spaceDiff -= expandableItems.getUnchecked(i)->expand (spaceDiff / (i + 1));
+
+ growRangeLast (start, end, spaceDiff);
+ }
+
+ void shrinkRangeFirst (const int start, const int end, int spaceDiff) noexcept
+ {
+ for (int i = start; i < end && spaceDiff > 0; ++i)
+ spaceDiff -= get(i).reduce (spaceDiff);
+ }
+
+ void shrinkRangeLast (const int start, const int end, int spaceDiff) noexcept
+ {
+ for (int i = end; --i >= start && spaceDiff > 0;)
+ spaceDiff -= get(i).reduce (spaceDiff);
+ }
+
+ void stretchRange (const int start, const int end, const int amountToAdd,
+ const ExpandMode expandMode) noexcept
+ {
+ if (end > start)
+ {
+ if (amountToAdd > 0)
+ {
+ if (expandMode == stretchAll) growRangeAll (start, end, amountToAdd);
+ else if (expandMode == stretchFirst) growRangeFirst (start, end, amountToAdd);
+ else if (expandMode == stretchLast) growRangeLast (start, end, amountToAdd);
+ }
+ else
+ {
+ if (expandMode == stretchFirst) shrinkRangeFirst (start, end, -amountToAdd);
+ else shrinkRangeLast (start, end, -amountToAdd);
+ }
+ }
+ }
+
+ int getTotalSize (int start, const int end) const noexcept
+ {
+ int tot = 0;
+ while (start < end) tot += get(start++).size;
+ return tot;
+ }
+
+ int getMinimumSize (int start, const int end) const noexcept
+ {
+ int tot = 0;
+ while (start < end) tot += get(start++).minSize;
+ return tot;
+ }
+
+ int getMaximumSize (int start, const int end) const noexcept
+ {
+ int tot = 0;
+ while (start < end)
+ {
+ const int mx = get(start++).maxSize;
+ if (mx > 0x100000)
+ return mx;
+
+ tot += mx;
+ }
+
+ return tot;
+ }
+};
+
+//==============================================================================
+class ConcertinaPanel::PanelHolder : public Component
+{
+public:
+ PanelHolder (Component* const comp, bool takeOwnership)
+ : component (comp, takeOwnership)
+ {
+ setRepaintsOnMouseActivity (true);
+ setWantsKeyboardFocus (false);
+ addAndMakeVisible (comp);
+ }
+
+ void paint (Graphics& g)
+ {
+ const Rectangle area (getWidth(), getHeaderSize());
+ g.reduceClipRegion (area);
+
+ getLookAndFeel().drawConcertinaPanelHeader (g, area, isMouseOver(), isMouseButtonDown(),
+ getPanel(), *component);
+ }
+
+ void resized()
+ {
+ component->setBounds (getLocalBounds().withTop (getHeaderSize()));
+ }
+
+ void mouseDown (const MouseEvent& e)
+ {
+ mouseDownY = getY();
+ dragStartSizes = getPanel().getFittedSizes();
+ }
+
+ void mouseDrag (const MouseEvent& e)
+ {
+ ConcertinaPanel& panel = getPanel();
+ panel.setLayout (dragStartSizes.withMovedPanel (panel.holders.indexOf (this),
+ mouseDownY + e.getDistanceFromDragStartY(),
+ panel.getHeight()), false);
+ }
+
+ void mouseDoubleClick (const MouseEvent& e)
+ {
+ getPanel().panelHeaderDoubleClicked (component);
+ }
+
+ OptionalScopedPointer component;
+
+private:
+ PanelSizes dragStartSizes;
+ int mouseDownY;
+
+ int getHeaderSize() const noexcept
+ {
+ ConcertinaPanel& panel = getPanel();
+ const int ourIndex = panel.holders.indexOf (this);
+ return panel.currentSizes->get(ourIndex).minSize;
+ }
+
+ ConcertinaPanel& getPanel() const
+ {
+ ConcertinaPanel* const panel = dynamic_cast (getParentComponent());
+ jassert (panel != nullptr);
+ return *panel;
+ }
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PanelHolder);
+};
+
+//==============================================================================
+ConcertinaPanel::ConcertinaPanel()
+ : currentSizes (new PanelSizes()),
+ headerHeight (20)
+{
+}
+
+ConcertinaPanel::~ConcertinaPanel() {}
+
+void ConcertinaPanel::addPanel (int insertIndex, Component* component, bool takeOwnership)
+{
+ jassert (component != nullptr); // can't use a null pointer here!
+ jassert (indexOfComp (component) < 0); // You can't add the same component more than once!
+
+ PanelHolder* const holder = new PanelHolder (component, takeOwnership);
+ holders.insert (insertIndex, holder);
+ currentSizes->sizes.insert (insertIndex, PanelSizes::Panel (headerHeight, headerHeight, std::numeric_limits::max()));
+ addAndMakeVisible (holder);
+ resized();
+}
+
+void ConcertinaPanel::removePanel (Component* component)
+{
+ const int index = indexOfComp (component);
+
+ if (index >= 0)
+ {
+ currentSizes->sizes.remove (index);
+ holders.remove (index);
+ resized();
+ }
+}
+
+bool ConcertinaPanel::setPanelSize (Component* panelComponent, int height, const bool animate)
+{
+ const int index = indexOfComp (panelComponent);
+ jassert (index >= 0); // The specified component doesn't seem to have been added!
+
+ const int oldSize = currentSizes->get(index).size;
+ setLayout (currentSizes->withResizedPanel (index, height, getHeight()), animate);
+ return oldSize != currentSizes->get(index).size;
+}
+
+bool ConcertinaPanel::expandPanelFully (Component* component, const bool animate)
+{
+ return setPanelSize (component, getHeight(), animate);
+}
+
+void ConcertinaPanel::setMaximumPanelSize (Component* component, int maximumSize)
+{
+ const int index = indexOfComp (component);
+ jassert (index >= 0); // The specified component doesn't seem to have been added!
+
+ if (index >= 0)
+ {
+ currentSizes->get(index).maxSize = currentSizes->get(index).minSize + maximumSize;
+ resized();
+ }
+}
+
+void ConcertinaPanel::setPanelHeaderSize (Component* component, int headerSize)
+{
+ const int index = indexOfComp (component);
+ jassert (index >= 0); // The specified component doesn't seem to have been added!
+
+ if (index >= 0)
+ {
+ currentSizes->get(index).minSize = headerSize;
+ resized();
+ }
+}
+
+void ConcertinaPanel::resized()
+{
+ applyLayout (getFittedSizes(), false);
+}
+
+int ConcertinaPanel::indexOfComp (Component* comp) const noexcept
+{
+ for (int i = 0; i < holders.size(); ++i)
+ if (holders.getUnchecked(i)->component == comp)
+ return i;
+
+ return -1;
+}
+
+ConcertinaPanel::PanelSizes ConcertinaPanel::getFittedSizes() const
+{
+ return currentSizes->fittedInto (getHeight());
+}
+
+void ConcertinaPanel::applyLayout (const PanelSizes& sizes, const bool animate)
+{
+ if (! animate)
+ animator.cancelAllAnimations (false);
+
+ const int animationDuration = 150;
+ const int w = getWidth();
+ int y = 0;
+
+ for (int i = 0; i < holders.size(); ++i)
+ {
+ PanelHolder& p = *holders.getUnchecked(i);
+
+ const int h = sizes.get(i).size;
+ const Rectangle pos (0, y, w, h);
+
+ if (animate)
+ animator.animateComponent (&p, pos, 1.0f, animationDuration, false, 1.0, 1.0);
+ else
+ p.setBounds (pos);
+
+ y += h;
+ }
+}
+
+void ConcertinaPanel::setLayout (const PanelSizes& sizes, const bool animate)
+{
+ *currentSizes = sizes;
+ applyLayout (getFittedSizes(), animate);
+}
+
+void ConcertinaPanel::panelHeaderDoubleClicked (Component* component)
+{
+ if (! expandPanelFully (component, true))
+ setPanelSize (component, 0, true);
+}
diff --git a/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h b/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h
new file mode 100644
index 0000000000..8b2ecd0169
--- /dev/null
+++ b/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h
@@ -0,0 +1,121 @@
+/*
+ ==============================================================================
+
+ 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 __JUCE_CONCERTINAPANEL_JUCEHEADER__
+#define __JUCE_CONCERTINAPANEL_JUCEHEADER__
+
+//==============================================================================
+/**
+ A panel which holds a vertical stack of components which can be expanded
+ and contracted.
+
+ Each section has its own header bar which can be dragged up and down
+ to resize it, or double-clicked to fully expand that section.
+*/
+class JUCE_API ConcertinaPanel : public Component
+{
+public:
+ /** Creates an empty concertina panel.
+ You can call addPanel() to add some components to it.
+ */
+ ConcertinaPanel();
+
+ /** Destructor. */
+ ~ConcertinaPanel();
+
+ /** Adds a component to the panel.
+ @param insertIndex the index at which this component will be inserted, or
+ -1 to append it to the end of the list.
+ @param component the component that will be shown
+ @param takeOwnership if true, then the ConcertinaPanel will take ownership
+ of the content component, and will delete it later when
+ it's no longer needed. If false, it won't delete it, and
+ you must make sure it doesn't get deleted while in use.
+ */
+ void addPanel (int insertIndex, Component* component, bool takeOwnership);
+
+ /** Removes one of the panels.
+ If the takeOwnership flag was set when the panel was added, then
+ this will also delete the component.
+ */
+ void removePanel (Component* panelComponent);
+
+ /** Returns the number of panels.
+ @see getPanel
+ */
+ int getNumPanels() const noexcept;
+
+ /** Returns one of the panels.
+ @see getNumPanels()
+ */
+ Component* getPanel (int index) const noexcept;
+
+ /** Resizes one of the panels.
+ The panelComponent must point to a valid panel component.
+ If animate is true, the panels will be animated into their new positions;
+ if false, they will just be immediately resized.
+ */
+ bool setPanelSize (Component* panelComponent, int newHeight, bool animate);
+
+ /** Attempts to make one of the panels full-height.
+ The panelComponent must point to a valid panel component.
+ If this component has had a maximum size set, then it will be
+ expanded to that size. Otherwise, it'll fill as much of the total
+ space as possible.
+ */
+ bool expandPanelFully (Component* panelComponent, const bool animate);
+
+ /** Sets a maximum size for one of the panels. */
+ void setMaximumPanelSize (Component* panelComponent, int maximumSize);
+
+ /** Sets the height of the header section for one of the panels. */
+ void setPanelHeaderSize (Component* panelComponent, int headerSize);
+
+private:
+ void resized();
+
+ class PanelHolder;
+ struct PanelSizes;
+ friend class PanelHolder;
+ friend struct PanelSizes;
+ friend class ScopedPointer;
+ friend class OwnedArray;
+
+ ScopedPointer currentSizes;
+ OwnedArray holders;
+ ComponentAnimator animator;
+ int headerHeight;
+
+ int indexOfComp (Component*) const noexcept;
+ PanelSizes getFittedSizes() const;
+ void applyLayout (const PanelSizes&, bool animate);
+ void setLayout (const PanelSizes&, bool animate);
+ void panelHeaderDoubleClicked (Component*);
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ConcertinaPanel);
+};
+
+
+#endif // __JUCE_CONCERTINAPANEL_JUCEHEADER__
diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp
index 0b4ab4710a..467999eaba 100644
--- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp
+++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp
@@ -1685,6 +1685,19 @@ void LookAndFeel::layoutFilenameComponent (FilenameComponent& filenameComp,
filenameBox->setBounds (0, 0, browseButton->getX(), filenameComp.getHeight());
}
+//==============================================================================
+void LookAndFeel::drawConcertinaPanelHeader (Graphics& g, const Rectangle& area,
+ bool isMouseOver, bool isMouseDown,
+ ConcertinaPanel& concertina, Component& panel)
+{
+ g.fillAll (Colours::grey.withAlpha (isMouseOver ? 0.9f : 0.7f));
+ g.setColour (Colours::black.withAlpha (0.5f));
+ g.drawRect (area);
+
+ g.setColour (Colours::white);
+ g.setFont (Font (area.getHeight() * 0.7f).boldened());
+ g.drawFittedText (panel.getName(), 4, 0, area.getWidth() - 6, area.getHeight(), Justification::centredLeft, 1);
+}
//==============================================================================
void LookAndFeel::drawImageButton (Graphics& g, Image* image,
diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h
index 93d7e82fb4..b07bad6521 100644
--- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h
+++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h
@@ -462,6 +462,11 @@ public:
virtual void layoutFilenameComponent (FilenameComponent& filenameComp,
ComboBox* filenameBox, Button* browseButton);
+ //==============================================================================
+ virtual void drawConcertinaPanelHeader (Graphics& g, const Rectangle& area,
+ bool isMouseOver, bool isMouseDown,
+ ConcertinaPanel& concertina, Component& panel);
+
//==============================================================================
virtual void drawCornerResizer (Graphics& g,
int w, int h,
diff --git a/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp b/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp
index 3016cd0675..d285daf366 100644
--- a/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp
+++ b/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp
@@ -444,4 +444,4 @@ void FileDragAndDropTarget::fileDragExit (const StringArray&) {}
void TextDragAndDropTarget::textDragEnter (const String&, int, int) {}
void TextDragAndDropTarget::textDragMove (const String&, int, int) {}
-void TextDragAndDropTarget::textDragExit (const String&) {}
\ No newline at end of file
+void TextDragAndDropTarget::textDragExit (const String&) {}
diff --git a/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h b/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h
index 51055212a3..4cf779a943 100644
--- a/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h
+++ b/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h
@@ -101,4 +101,4 @@ public:
};
-#endif // __JTEXTDRAGANDDROPTARGET_JUCEHEADER__
+#endif // __JUCE_TEXTDRAGANDDROPTARGET_JUCEHEADER__
diff --git a/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp b/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp
index f6d8e8ed99..722a2a792f 100644
--- a/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp
+++ b/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp
@@ -23,7 +23,6 @@
==============================================================================
*/
-
namespace CppTokeniser
{
enum TokenType
diff --git a/modules/juce_opengl/native/juce_OpenGL_osx.h b/modules/juce_opengl/native/juce_OpenGL_osx.h
index f81d533c8c..020ba0360f 100644
--- a/modules/juce_opengl/native/juce_OpenGL_osx.h
+++ b/modules/juce_opengl/native/juce_OpenGL_osx.h
@@ -23,7 +23,6 @@
==============================================================================
*/
-
struct ThreadSafeNSOpenGLViewClass : public ObjCClass
{
ThreadSafeNSOpenGLViewClass() : ObjCClass ("JUCEGLView_")