From 9973f5a81e3554cf4f50453825812c3416b498a7 Mon Sep 17 00:00:00 2001 From: Julian Storer Date: Wed, 29 Dec 2010 23:11:05 +0000 Subject: [PATCH] New class ComponentBuilder, and some refactoring of Drawables to use it. --- Builds/Linux/Makefile | 10 +- Builds/MacOSX/Juce.xcodeproj/project.pbxproj | 6 + Builds/VisualStudio2005/Juce.vcproj | 2 + Builds/VisualStudio2008/Juce.vcproj | 2 + Builds/VisualStudio2008_DLL/Juce.vcproj | 2 + Builds/VisualStudio2010/Juce.vcxproj | 2 + Builds/VisualStudio2010/Juce.vcxproj.filters | 6 + Builds/iPhone/Juce.xcodeproj/project.pbxproj | 6 + Juce.jucer | 4 + amalgamation/juce_amalgamated_template.cpp | 1 + extras/juce demo/Builds/MacOSX/Icon.icns | Bin 81944 -> 81944 bytes .../Builds/VisualStudio2005/icon.ico | Bin 82726 -> 82726 bytes .../Builds/VisualStudio2008/icon.ico | Bin 82726 -> 82726 bytes .../Builds/VisualStudio2010/icon.ico | Bin 82726 -> 82726 bytes extras/juce demo/Builds/iPhone/Icon.icns | Bin 81944 -> 81944 bytes juce.h | 9 + juce_amalgamated.cpp | 1069 +++++++++-------- juce_amalgamated.h | 452 ++++--- src/core/juce_PlatformDefs.h | 4 +- src/core/juce_StandardHeader.h | 2 +- .../filebrowser/juce_FileBrowserComponent.cpp | 33 +- .../filebrowser/juce_FileBrowserComponent.h | 9 +- src/gui/components/juce_Component.cpp | 426 +++---- src/gui/components/juce_Component.h | 60 +- .../layout/juce_ComponentBoundsConstrainer.h | 10 + .../layout/juce_ComponentBuilder.cpp | 276 +++++ .../components/layout/juce_ComponentBuilder.h | 190 +++ .../lookandfeel/juce_LookAndFeel.cpp | 8 +- .../components/windows/juce_ComponentPeer.cpp | 25 +- .../components/windows/juce_ResizableWindow.h | 22 +- src/gui/graphics/drawables/juce_Drawable.cpp | 66 +- src/gui/graphics/drawables/juce_Drawable.h | 52 +- .../drawables/juce_DrawableComposite.cpp | 186 +-- .../drawables/juce_DrawableComposite.h | 86 +- .../graphics/drawables/juce_DrawableImage.cpp | 15 +- .../graphics/drawables/juce_DrawableImage.h | 6 +- .../graphics/drawables/juce_DrawablePath.cpp | 10 +- .../graphics/drawables/juce_DrawablePath.h | 6 +- .../drawables/juce_DrawableRectangle.cpp | 10 +- .../drawables/juce_DrawableRectangle.h | 6 +- .../graphics/drawables/juce_DrawableShape.cpp | 16 +- .../graphics/drawables/juce_DrawableShape.h | 16 +- .../graphics/drawables/juce_DrawableText.cpp | 8 +- .../graphics/drawables/juce_DrawableText.h | 6 +- src/gui/graphics/drawables/juce_SVGParser.cpp | 2 +- src/juce_app_includes.h | 3 + src/native/windows/juce_win32_Windowing.cpp | 26 - 47 files changed, 1812 insertions(+), 1344 deletions(-) create mode 100644 src/gui/components/layout/juce_ComponentBuilder.cpp create mode 100644 src/gui/components/layout/juce_ComponentBuilder.h diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile index a528aa28c3..6de1c013b5 100644 --- a/Builds/Linux/Makefile +++ b/Builds/Linux/Makefile @@ -12,7 +12,7 @@ ifeq ($(CONFIG),Debug) BINDIR := build LIBDIR := build OBJDIR := build/intermediate/Debug - OUTDIR := build + OUTDIR := ../../bin CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -I "/usr/include" -I "/usr/include/freetype2" CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 CXXFLAGS += $(CFLAGS) @@ -27,7 +27,7 @@ ifeq ($(CONFIG),Release) BINDIR := build LIBDIR := build OBJDIR := build/intermediate/Release - OUTDIR := build + OUTDIR := ../../bin CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -I "/usr/include" -I "/usr/include/freetype2" CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -Os CXXFLAGS += $(CFLAGS) @@ -171,6 +171,7 @@ OBJECTS := \ $(OBJDIR)/juce_ModifierKeys_eea16d64.o \ $(OBJDIR)/juce_ComponentAnimator_ad5663d2.o \ $(OBJDIR)/juce_ComponentBoundsConstrainer_a33c10ae.o \ + $(OBJDIR)/juce_ComponentBuilder_2aa6c5a.o \ $(OBJDIR)/juce_ComponentMovementWatcher_cbb3e7cc.o \ $(OBJDIR)/juce_GroupComponent_456e237a.o \ $(OBJDIR)/juce_MultiDocumentPanel_50e05aac.o \ @@ -1022,6 +1023,11 @@ $(OBJDIR)/juce_ComponentBoundsConstrainer_a33c10ae.o: ../../src/gui/components/l @echo "Compiling juce_ComponentBoundsConstrainer.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/juce_ComponentBuilder_2aa6c5a.o: ../../src/gui/components/layout/juce_ComponentBuilder.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling juce_ComponentBuilder.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/juce_ComponentMovementWatcher_cbb3e7cc.o: ../../src/gui/components/layout/juce_ComponentMovementWatcher.cpp -@mkdir -p $(OBJDIR) @echo "Compiling juce_ComponentMovementWatcher.cpp" diff --git a/Builds/MacOSX/Juce.xcodeproj/project.pbxproj b/Builds/MacOSX/Juce.xcodeproj/project.pbxproj index f8eea8800c..80452f8435 100644 --- a/Builds/MacOSX/Juce.xcodeproj/project.pbxproj +++ b/Builds/MacOSX/Juce.xcodeproj/project.pbxproj @@ -140,6 +140,7 @@ 5FFFA4B8857D64FE36B4B125 = { isa = PBXBuildFile; fileRef = B1E8FF009812F29C2620E6BB; }; 1D406F33F6B9FE7F92A71438 = { isa = PBXBuildFile; fileRef = 921B616E2229AEB6390D2B57; }; 806FF2617B7CC21609927A11 = { isa = PBXBuildFile; fileRef = 07191E1A9805FA6E6F253FF6; }; + 9AA76460DA7D34CE6A69E2B1 = { isa = PBXBuildFile; fileRef = 45E5EE9E0173683D721FABDA; }; 4E81BC4A50CF1883F529E152 = { isa = PBXBuildFile; fileRef = F8FCCCE06D31FEF697FCD80D; }; 8FBB6BF0C5406E1BA481CFEF = { isa = PBXBuildFile; fileRef = A6AD7357F905309D1B461EB7; }; F5F3F25D9F377128DC74D95B = { isa = PBXBuildFile; fileRef = FF046140CCF1EDB0DFF80178; }; @@ -659,6 +660,8 @@ FE1072B5FB77E8FEE1BEBDFE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentAnimator.h; path = ../../src/gui/components/layout/juce_ComponentAnimator.h; sourceTree = SOURCE_ROOT; }; 07191E1A9805FA6E6F253FF6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentBoundsConstrainer.cpp; path = ../../src/gui/components/layout/juce_ComponentBoundsConstrainer.cpp; sourceTree = SOURCE_ROOT; }; 2EC173A08676F6E592A7B347 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentBoundsConstrainer.h; path = ../../src/gui/components/layout/juce_ComponentBoundsConstrainer.h; sourceTree = SOURCE_ROOT; }; + 45E5EE9E0173683D721FABDA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentBuilder.cpp; path = ../../src/gui/components/layout/juce_ComponentBuilder.cpp; sourceTree = SOURCE_ROOT; }; + 2D3A362DD3833B9E70B10FD3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentBuilder.h; path = ../../src/gui/components/layout/juce_ComponentBuilder.h; sourceTree = SOURCE_ROOT; }; F8FCCCE06D31FEF697FCD80D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentMovementWatcher.cpp; path = ../../src/gui/components/layout/juce_ComponentMovementWatcher.cpp; sourceTree = SOURCE_ROOT; }; 44CDA79090B115C3B62A2168 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentMovementWatcher.h; path = ../../src/gui/components/layout/juce_ComponentMovementWatcher.h; sourceTree = SOURCE_ROOT; }; A6AD7357F905309D1B461EB7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GroupComponent.cpp; path = ../../src/gui/components/layout/juce_GroupComponent.cpp; sourceTree = SOURCE_ROOT; }; @@ -1388,6 +1391,8 @@ FE1072B5FB77E8FEE1BEBDFE, 07191E1A9805FA6E6F253FF6, 2EC173A08676F6E592A7B347, + 45E5EE9E0173683D721FABDA, + 2D3A362DD3833B9E70B10FD3, F8FCCCE06D31FEF697FCD80D, 44CDA79090B115C3B62A2168, A6AD7357F905309D1B461EB7, @@ -2069,6 +2074,7 @@ 5FFFA4B8857D64FE36B4B125, 1D406F33F6B9FE7F92A71438, 806FF2617B7CC21609927A11, + 9AA76460DA7D34CE6A69E2B1, 4E81BC4A50CF1883F529E152, 8FBB6BF0C5406E1BA481CFEF, F5F3F25D9F377128DC74D95B, diff --git a/Builds/VisualStudio2005/Juce.vcproj b/Builds/VisualStudio2005/Juce.vcproj index 0a16d06e48..2c373303ea 100644 --- a/Builds/VisualStudio2005/Juce.vcproj +++ b/Builds/VisualStudio2005/Juce.vcproj @@ -542,6 +542,8 @@ + + diff --git a/Builds/VisualStudio2008/Juce.vcproj b/Builds/VisualStudio2008/Juce.vcproj index 2cd35bb5d8..c95082b1f1 100644 --- a/Builds/VisualStudio2008/Juce.vcproj +++ b/Builds/VisualStudio2008/Juce.vcproj @@ -542,6 +542,8 @@ + + diff --git a/Builds/VisualStudio2008_DLL/Juce.vcproj b/Builds/VisualStudio2008_DLL/Juce.vcproj index bc877c0ad3..241319cb67 100644 --- a/Builds/VisualStudio2008_DLL/Juce.vcproj +++ b/Builds/VisualStudio2008_DLL/Juce.vcproj @@ -544,6 +544,8 @@ + + diff --git a/Builds/VisualStudio2010/Juce.vcxproj b/Builds/VisualStudio2010/Juce.vcxproj index a131ef48d7..7ed1943b4b 100644 --- a/Builds/VisualStudio2010/Juce.vcxproj +++ b/Builds/VisualStudio2010/Juce.vcxproj @@ -254,6 +254,7 @@ + @@ -603,6 +604,7 @@ + diff --git a/Builds/VisualStudio2010/Juce.vcxproj.filters b/Builds/VisualStudio2010/Juce.vcxproj.filters index 7e199964b5..df1b24df2d 100644 --- a/Builds/VisualStudio2010/Juce.vcxproj.filters +++ b/Builds/VisualStudio2010/Juce.vcxproj.filters @@ -616,6 +616,9 @@ Juce\Source\gui\components\layout + + Juce\Source\gui\components\layout + Juce\Source\gui\components\layout @@ -1737,6 +1740,9 @@ Juce\Source\gui\components\layout + + Juce\Source\gui\components\layout + Juce\Source\gui\components\layout diff --git a/Builds/iPhone/Juce.xcodeproj/project.pbxproj b/Builds/iPhone/Juce.xcodeproj/project.pbxproj index 2e47dd4fb0..e7da403ef1 100644 --- a/Builds/iPhone/Juce.xcodeproj/project.pbxproj +++ b/Builds/iPhone/Juce.xcodeproj/project.pbxproj @@ -140,6 +140,7 @@ 5FFFA4B8857D64FE36B4B125 = { isa = PBXBuildFile; fileRef = B1E8FF009812F29C2620E6BB; }; 1D406F33F6B9FE7F92A71438 = { isa = PBXBuildFile; fileRef = 921B616E2229AEB6390D2B57; }; 806FF2617B7CC21609927A11 = { isa = PBXBuildFile; fileRef = 07191E1A9805FA6E6F253FF6; }; + 9AA76460DA7D34CE6A69E2B1 = { isa = PBXBuildFile; fileRef = 45E5EE9E0173683D721FABDA; }; 4E81BC4A50CF1883F529E152 = { isa = PBXBuildFile; fileRef = F8FCCCE06D31FEF697FCD80D; }; 8FBB6BF0C5406E1BA481CFEF = { isa = PBXBuildFile; fileRef = A6AD7357F905309D1B461EB7; }; F5F3F25D9F377128DC74D95B = { isa = PBXBuildFile; fileRef = FF046140CCF1EDB0DFF80178; }; @@ -659,6 +660,8 @@ FE1072B5FB77E8FEE1BEBDFE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentAnimator.h; path = ../../src/gui/components/layout/juce_ComponentAnimator.h; sourceTree = SOURCE_ROOT; }; 07191E1A9805FA6E6F253FF6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentBoundsConstrainer.cpp; path = ../../src/gui/components/layout/juce_ComponentBoundsConstrainer.cpp; sourceTree = SOURCE_ROOT; }; 2EC173A08676F6E592A7B347 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentBoundsConstrainer.h; path = ../../src/gui/components/layout/juce_ComponentBoundsConstrainer.h; sourceTree = SOURCE_ROOT; }; + 45E5EE9E0173683D721FABDA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentBuilder.cpp; path = ../../src/gui/components/layout/juce_ComponentBuilder.cpp; sourceTree = SOURCE_ROOT; }; + 2D3A362DD3833B9E70B10FD3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentBuilder.h; path = ../../src/gui/components/layout/juce_ComponentBuilder.h; sourceTree = SOURCE_ROOT; }; F8FCCCE06D31FEF697FCD80D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentMovementWatcher.cpp; path = ../../src/gui/components/layout/juce_ComponentMovementWatcher.cpp; sourceTree = SOURCE_ROOT; }; 44CDA79090B115C3B62A2168 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentMovementWatcher.h; path = ../../src/gui/components/layout/juce_ComponentMovementWatcher.h; sourceTree = SOURCE_ROOT; }; A6AD7357F905309D1B461EB7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GroupComponent.cpp; path = ../../src/gui/components/layout/juce_GroupComponent.cpp; sourceTree = SOURCE_ROOT; }; @@ -1388,6 +1391,8 @@ FE1072B5FB77E8FEE1BEBDFE, 07191E1A9805FA6E6F253FF6, 2EC173A08676F6E592A7B347, + 45E5EE9E0173683D721FABDA, + 2D3A362DD3833B9E70B10FD3, F8FCCCE06D31FEF697FCD80D, 44CDA79090B115C3B62A2168, A6AD7357F905309D1B461EB7, @@ -2069,6 +2074,7 @@ 5FFFA4B8857D64FE36B4B125, 1D406F33F6B9FE7F92A71438, 806FF2617B7CC21609927A11, + 9AA76460DA7D34CE6A69E2B1, 4E81BC4A50CF1883F529E152, 8FBB6BF0C5406E1BA481CFEF, F5F3F25D9F377128DC74D95B, diff --git a/Juce.jucer b/Juce.jucer index 056b57a198..300ec3a2f4 100644 --- a/Juce.jucer +++ b/Juce.jucer @@ -716,6 +716,10 @@ resource="0" file="src/gui/components/layout/juce_ComponentBoundsConstrainer.cpp"/> + + *cLQ&}m3L@CBU@zCM*K)62KoBda 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 O&n@P^lXP&V!v6!sJ?Y*6 literal 81944 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 E0G6?2yZ`_I diff --git a/extras/juce demo/Builds/VisualStudio2005/icon.ico b/extras/juce demo/Builds/VisualStudio2005/icon.ico index f95f8be2b7b6609a268bb3b4d062d5a1d9baab20..ace691c5639b0e519b6d438029447f0655cff212 100644 GIT binary patch literal 82726 zcmeF42Y3}l*T+vxqG+GoH>2Y%LyYNgw=vCMGp5}nW7^+fOrr<>G%+0? zeu2Adh1XCp?U)heulxCr4p$lzRl^vsiZRvt88hM*{#OF38B_mcV=^BzCc4FK4{<+K z&o1R-hkp23z4wi&b3E5p1?n18w6!taM)AKUP!Gs3CTof@C2#)q&q9eEj&XNKCm-Lx z)Gfd7==y{)XWl_O{r!95o6z0~{I70I!8*p&?rqF4u1SB%nAof*?&AI!)lsnN-4|y* zV@&zB#>6);rY(4O8evR@&c-wapNvk%w1yt_2N+YjjWL}cF(zsBmmhFzG2LIN!?ROc zKL=jm>(P$-n%J1OE;Qz*M~!I!J_U5V7C_&!rgH6t-^}CI61u-|(?`bEr~S&^{d=qR zFlN9x#xyzBn6C7{$#KS1>c%)ud_P8hmyMzwdrjds0?Ky716(AT=~ z(Be&>+D|a1)dw8E>bIYx6NluGfvD6=YNt*8<+~0~hWbGrjiG(-v;F!C((hIm8&l@t z?R#R{yfE4|oMW5*K+7VN*Dq@EyfGc=V;5wl+f(3v8nSp3vT^&?Erq*%FfPYE`|O-k zI(p#3NhPNK@@3Im{@hUPwr!iM-neO1(XlHY^eQ|h9m;D-jP@?CnwWSU{p?UOx0?)9 z+?4EjtC6HRg@6Ls5&<{lfY5PWqic1~t}NfqWN>XeK=w*yiVV+xcZmi4G@uNS0aOO6 z0F{6WKq&wUcn516xn;j4jDFXT16p6g`Sy8^=F zP`R!?i>_S?dU5AOr;K~LaLbR^6gunoJ+ZeLlk&7N#b*KNRPp~{7qAgY*JI~~t=}G7 z`=v!uv3>3WkCEKp8Ym4M3@sA4z9!H=s!)$xqgu}UKK9z(rqMgboHpN>v*sDoa<(za z*v1mHoiY;}`x<@(8&YMCF-5R>aT7N0j;{W~f`VR!i>XJnkbL9?2lcxKxStSP^uif2 zL)ULBi(Mc6u`%Or#%}k)UUW5PJpP~^b}fDecKvN*E~d>h=>G(4;F;{V`iOJ)VGlbm zS|1{>r6DIs&s?)~RKy%uajkY!uyBk}_m@8k!7t+?{&>GP~Pa1w#;+dOvmVeWj$*<$5 zUM45N6NJ`=FP9!cHkQJv)gyqR57L}xDAIFiTKO7 zIxl@$&?`8Ic0}XwlFEVhF;$*Kk*{+mdW|Lk*|@@ zn}{4#M=p~t-EI<6&bX6yngH=(2vm$KSZhquso!rd@ro~3o!>L&Bz&Wda{}#V<3gXW zqVB||`)NM|nY_!Gns1?_^eH~;y+yc+-n1QzlO*#E6U$!rL<(_L8hz?O+sD!W+rBZT z@0rvOE%%{AEn_AjX9>vLKK&Oxkk<~w;p1H7Q@TpOlFr(=E4FZtiL_TS(Ens`>J;B{ z?&2ad@a@R^*emeW$05U)8S^4~J^2n}Qq|9(oYgSq!fT*^uzj_Q>=otMsZ)%3^$TOp z!8V*o9mUXvG-wf5_ReQ$yB?r^s}zm(Y79yoyk=9$H{cgG#rBu_wJi*thhAjNy)%vJ zK7zPMvZizB#CcayXDj~e7`PQf7ET_IJ%EngMq`_r(`WQ`Fvt2s2Wy*}ez2gh=P?@a zl5FefWK6+6qZ7~Cuv7Nyf_tcocC-1cK2dj3+8H*{m}{^x?ZHEF>)5HZ!SOWOJ!KNM z=W=735nC3NynvtO3-`x0gofyIu~(3R?n~Ab@(OjNZTU)-VsSAios~3Ui?yE@+{=Bz z_MPm7^tue~jlI&CbFW1{o`N>CJMkuCS{%oH^ff!KcK2xu{uexKOjYc5?6E7>74i}~ z(XMMhjrPw-ny`6Kg}05lMw&*~j3u!T-p_ zIb2^CxsDmI;(OZfK>KdoQzX7%-;)y0*zi{=_? zqTk40yJ6Vd>#+Hzg|(;E3BB&*?{;2uVSb8W54^k$jkUR z_*7c5E*#J?^|t`^_8DW$Eac;S+Dw!!2A}hxyV{EdPK6I+;7hdb5gtJtICcqgT?QKv z*Z9NtFt*ibKf7o@q1ngpC&SN{v~lqr*o-#NtGh9yrWo@wI(Zj#sn?f!B^$IC1rDdt zo^6MH@whcKxB~fYJ1BHrs1K6QOFqO_pck>F?!B3YgZ4*wq$ZWV?Xr~XcAFIRv@JNC z^8vnZ5p4rKPWS5%%2oor7=AIwrF*Wg&?LRRF|Tm%wNDTe^kYoa+?YY=O|MU(&4^$B zjPrUbehc?Ov9VsYR!M``tSbQziqO|euVG)HN3lkswp|;cZE6$rQSFP~!E?~QY-?j~ zrM&^~qnFs;Ui2pw+m_t&y*HpW*@1|qSVDzacc)FK{pT5PeS&WtO5LJ&uzvkV7t1oP zJo6g{w%N=DhfxtM{1L=3l*4*c;UBAlr6GMi=%@XcAj{{;Z_&Tec-VN~}*j*Z`hZ z#zv(gBZ3&uQ@z?QQ&-$?m z_nsJ4_RY(RH2D0Uw3Z7WiLd$5ZP6uPnHU#+{V_$nDwVlOg3!<3~8pG+h&TAYk8Tls^;UYZC1LCl3 zu~@IMkaX37_LXO;3seKrfnq?ozvj>pDZ;x1Ae@^5odM-}P5_hx8V0yLkha>_ag8(k z16_dTfcm0*-;wHvWJEER@K&tZ8#oy_vtU7QVoae@S4BrPzqN4T&i59I?ek!Pn7$7c ziaqARLWR5B8y%H-TTE2BX;8&4cEj$tQ@5D7(OXU2s4XVuxDC5wJFnXjRr{OGF(qDE z7L|DE>oGC4r*r>!>KOs3AEHMkKzee>wv&6qi*!x0DznxR7(yQD9MLnr=>4BW)&F)& z+$lRu(slTAVw#e~nI&IkTr7Ac1p3eMV$TvQ-bCzm+D_u^9u)1N9CC zB!{&D$!31|8;ym<*ZP2Heri-~^P8g69{DV$+uA=9E+vk{*QSDBX<~q)#OR5{v&Clm z`9I|V9Telga&n5Diqfy5^d)I3KDzI^?a?Kk{W3bX{cY5L8X#UY0u&Se9bYZnm19(H zsXsJ2D=u#6V^P(=`8|PgdlLARCQdqIp)t=aV+{2bKwjhG#f+OdS2WOv6k;jmt6CAq z^!b=L>K*p!tMX_?iM`a1!gW?`jg1}iEbW{_d&dE?UFw7IIM^bY5#5FRv4x|f$Hy1B z;q9ob^}7_;BoSlw1CM9H^>SjIS{;e68jjH|SD=RA(NuVe~@8lU%3tKM51F57yU;ziZ?T6@p^yExZfOB@LqK1 zj7j95pj8t6E^;S2RPpomMT%6J1YSLWDnM>LkbEir>K~VO`z!IIcUnIrTV4vi`p=hs zer+Ea2)6J3Lu={B`}4>@;UhHu&C`9{AI-JTeMp`OyHs4dFk!bzE%V6x$k7mRlRcDe ziBx3kTPMV%oE2ODtDogd?OYVJm*07A1-Xm%;DM|j5Esb`w0soXGw5vo=M{h5S00(8 z?e6p;nRey(;#z&PF)=><0`O}OXzUvvUnp*p&FPt1^t=ZX#%$dq-|u{90(S8DPq7m- z@H4VIx#_N>zqaV`?OfmQO#W8~g6DGkPrai54AK7$nan8k$&f&eG&Nkb88<`ORA70y5~&MN7!{P6rqDVSjocI$|$xygxM0kQe+# z6YS}ER~mCRvZ^>l^b;Ow52MSKK3^Lj6|Yz?k_^emwMt8Ab4hHgwcErq@vaegKa1Qv zJ%{aF=5^5FHM@L!oz$52uo)5Q8p3}Xbm)H;*Bl7{YFq=1zmd5KbiUeK;Ec^yzR~sp z{fq7L%dX_4{#Sx$Ye2H@ieyQ4r$chu)JJ1a{maIUvYQWM2RaV$WhNTASDY~NLSsI} zw|T^2nA}5v?!r9412>(m3H|B)1ecZCo1+Nj_@UrD`#yp9O2YfZ@q0`{>K(JdQ!#1=;Nl|L&5DKax5??V-cPz3xdHdS#5YrJr~Wd4!wp{} zd<(HXWis}0wJ~=-70QdNA9VnSAN%J{B}SmX`{*zHkbUYfkog;E{1AHH_Z)cMjN|GP z_txwP-_f}m#7c^5Q?TW+>2nsvMHe~-e5I>y%%*-+;duY}DjzRPy$_r9A8`Mg+?RMC zE+gtoUH^DW3-WaL8uRvN1@OIkH{=?beh_Hbn`@!%KKbQfeWCw_=)+U! zKwb1%v0!ZbwOeCinv4p=U-YjMTd>@q*rqFfD+=wke&9;5gyzfFJNi#t!WP1MlPPx#S*FMF!_u+VXK)Ubhb?s=&@uW;+W-j#C5f!-sT*|!t z0b|1E;Hvyeut=7w6)kr4RdIv=F!FZ^@at-9*I3%~$^pU)+14CUGuoas-Ix{Yu$haA z5zY?z9qF%d5rF@-PhfkF;lJd|;YK|T`}#gh>kLvFat6H|6wi>-G6kYG50+~>^9Yy>)`)W9~rZ1 zn=wCaLRPLoR)lMK`#J`m*E|gE(1~onB;0fk{v|bHE|hu~EW^(XXKjLHPP`UBbRGRa zlm1Ouggu-I?OUzemK5J>ICy3NE_UE=b}5=1?=?zEf9IW~8$;tR?$caUUvM7tCI0wx z`t!XXt5oVl8^Rko-G_GIsQBPoWVU!~&O4lhmjfN6k5}Dg%oanv=y%VNwA+ICglj6( z??*rM=fRTD$%Jwr&rggktk|toHpV&sNS`YvCygDKaMH%Vg7JS6vZOK0J>M{%8Xp=1 zNLCy!;al*JhMw0$|NX8*q7NERTn1n7U5oFY@6S))@g8G`FPJ+-rzAUxqyN~QntIt4 z;CG-rM2V!>!YyJeFIb#*pC5ZGe%1J8{8#A1&EQ;aKX?cFk%Ye9#eK0&xjqt)+_m&U z^RJT2Qpjrx?P+bE_^$tU4PyPpE7OXkDehEmMDb>BMKN7Q(bU_ni0ij`kH+r8KMp(| zT7?}R2riOQ*LH4Oa4L=*JcZqhX>tJkRR?l7@>13aedfo@igj$uscd6pc@bs-INso!5(8=8xYbKSQbe9`xGgp>o699Y;T#^!9C2{DJ7Nd$>Mp zIJS5Z{DM|)%#wHo{VD&^M`dx2Dnu<>0i|?ux~JPAUWYknO92xYXx3{ksm|wR9`7V}JH@({)`7 z?MotK&%ocx$ct?U9>jFpup_Pbt(vQmuXSS;{^q$9Vew0PY?0e06>k6QcJWj>?>Oi) z@Ke^`q0h&S_Hnf_rRzg&_>bRwn)6e!?Pnr`5o18&J8;H_R`7~ zamD3#`1Y#utK@M%!3Ngy>1^dlynsI`(Ej8zm@`0TPMU{5gTKX|LjL=0+EpOs*_&v$ zGN63s-z}C8iAAnGEvm+-qF?A#0moEqFgBYyF?`%t0pKfQ^DLqP=WjaqzWU_LVT#j=vu)cAO>bc`2MIXS*(;|gWZYgfMfq|TKqoZr4kT%RT!uM!t${g7y_>m$X$ z96qW=;|Spu1m!o}esIk9w-F`mrg)w)a|-xdEhJ)p7e-&(O$;)%UClZoZKu$rwrY8@ z=dtd{KK;Pu+`uzZq3w2Uv3}fcN2zYRTKgm_b8HKE-W(l|u$`jglqvT2;J0%^_t|ZP z`d90G03VAd`wm~*4=C>XbqN~Cr~UQ(0EHAKb;%6Yur7q z4%Mf6T^s!Uw;W{(I9`iKj;|V*rT~f|6_aU=k@DCAtrHPwERq|zYur7$U-hUy)vNj? zJ8DnuI+@__zvT!}Ks=W&N_nPxq@H)u(z@ zzuHlIYFF(G58>lvL3j#Z;Vt~tkAF+vDG<(g=~hWVHaG(i&83&(LlZ#!5x?329f2-D zH=qa53+My%1&#sw0sTWTfUN^}Oy_l-uI~-#e$}J;RIlo92dF)@tM-LQEkJl>0K!vp zng;wU2M{5TB{#my&PvB>0QCUTTzV;e?F5KF;<0!*5I6xC0-Oj81x^Nr10zB(lID>G;juRCNLH_8#o6T7lL!y3eF3FJLay@^}1J}dQ_k4 zRsCv5?WtY0FFb^g@DhIV6T(;Wx<5JK^#A*!c-i@P>525k>AU=^=qTSSzuX0oO+FS7 z?WLoq0^*JMB;Jh&CIAzGi-3!POMposxRmYWTtMdpx>olHREOqkRiElr{c1<;sa>@{ z43K@0FA;v70pTmWg}?d{l!G+(ivaP!|JU(?`mO#a0jWRhR~hePnZuGhV)L!kOp?-W4os6Dl-_JxP=5nd+( z@)5#U@*0$bpgmB3)o=Ab4u}T+zm!-yDxFUOiUDPS3_$b=>U&rA`vT(oP~cQRwph0M z0zmpX1(;f(K!K|Z6iT=*Dz?=0$~D_PP_xYW;e-0E#=n?e zwcP{Me{+EX3D>DTwHs<*cnBZag)xBe6u!b+_=n3ub&h2K>bLrz42T{v!2fcQj7!!f z^Rj^@fpnlMP#2Kjl)i{wLB5Y-|13cMTDJI7;PL_mqNWvs9|>vo?y1)JjOR-?f>(9s z|K@q$8P8j5yuyI}ul+T~EBL+fVt{f#vUV2GHXL+b_gc_>K!Q8A#*}XH*-weJ@1Iw{ z#p$z(6t8zrp{U|F2@l~D!b|uGPvIMs17{Chd{Bq;>UViSba1vny79kQB-^t0@_SC_ zbG9`Z~x4}=VI$v3%K5R zoi-ZpgssLqcbD-lW@eOitA%f8t;GGngQ2bd2cW=h{&n7kdyIGXPU9W_hw-wgrw;X% zrrvCMLM|#V-f>Yw_l{;Jf_Ui%7f%ZTT;8;NZQ+gx)kse(Hh@Mx(CRUgpQ)1v#)!IC>&?~e2 zFP|5y;R*U$W$QJ58U&00Y#wNVI|?c>d`w(Rj=ej?L^;&EL?((7()BaehtY2auBz4TeYm`7guO--it}a8r?}> zf^u*!`)2^^r}`@&*BOv4Xb6Zd6@XHJ=q0-Sx5_{?xXX^oo)raT-(>G=1M>4(fYW)! zN~Zzm02cuA@7VbY)6?r;{zgK*Icq#`cVon)<|cp|=+W?h_J zzs#EfycGRA0GwESu;r!jkYl%Eso3N7Y%H7HJ-&vDd_0l(@q7tuD ze}GAV`lo)Xzv{PaL3f}n&;$^DL?_WpbQAsl+r|e$Utb*j%K^^bXY#)z&>J`bkS<8) z#{-I^FOM%$?xxg=r_M~QiEsB-?y@wkhP@q#FUNie2S1pIcnK%BY!%sgr2-$!h>emC)6*1uwRMd#Ak<5JLGp!L*Rr|hvFSr84lcdY1qzUY2l>XBVwt+DVc z1`c|!o_7;)(l%s(STSzV)~JS`tV?fp?}zb;}e^qR>n4Y2XQeD}V3q$q!jjT@E7FCw#$EK0>lk3j5$) z1k{o}uzq1zLX(faPb_=Vlj=91_*QX&=pni|e;|4(MiTwf0T&nkQ|&-BI10BEpd=vP z*94jXSwK(VI6(GJvGDnT{NWXK+FtjT=PljldBjf|YxAyzq(^)@2JO4(9xYvm=i>D_ zJn!-t&q2=njaL-@Y0US381wB`W4_qHJ8zcq&P`%>D+kYDqw}J}xm=@m^_-uTE!i3B zll;YUOvm>p55iyes)&38{qka!TcDq1zuHu;_PANN>C?;qOxVSKA z2So3GN(u5_I0kv&j{RPMeB3F(SU`4fa#U2*w9-u<{M1WZvBT1Y@mnF{c>At3J?DTf zNykKA*>v$;``0e!IoEB*Y~Q1G=8=m|{j!~R1ANP~y42+nGaRf8s9o_`_C+>DvR4yc z>U%hK(QkW>daVs&D_^90_OT1}!^$!DsDGZuEwTk^-~3sp!=3Mka*2~ebP;_<0-~4b zmIXK&aCSiPKpgN-DbjoSr%1e4T%)m$eB3#}g}`M+N@d-b+U&C*;rkvh8J#EBqVH44 z&IjqI_q~aCvhSBKK+n-}$M!|5cy<-N>Tv;l8OAeHLwRQGRGwM8l6QA}?#qR)U9b^* zAsK*&5&08=XVPn3UmBdoe`d_=AB|a$JZ;-;%wJTxZ5PimVsqa8nP=6$=2_<1Trb4! zQE|THQ?^Prza0?d{W$h7@(L7~+PdSYr@c~3|FHd6PVEvu=Mrw~3!rbZwP$>cUEkvK z^RJzJM*`k9IE{0afoPyOkP(7(wy6Ny#$59S`Y(Zb1OCN@>N}7Oi1*^*nebimrm}}R zcI+_bPwb9^oyfp$` zH|l9@fyRl738X918D|IN3ltA1Ce*l~D3AmkO&L(z!a?#VoT>xDQ8r6*EBPG-i1!y4 ziYa|<<>uGC>F4e6gBmYS_s4QUo>*HC{aP@_er=sk-_7t}@4@ItuE+9QPrTFu8ib%8 zTL(I(bBX@BXXf~IJh95>tK=%17h(L-`$)w9o6u>M--##G?)i6t=OF6q0(AGc=|gya z`zrsP58okQTO=#U!xm)p_HTG!%G7q6h0m)%mKsYr7B&Uk?gtO$=@;;+t zt(!`<_~1LM^UBXp*kkRz#_^8#*4D#!>CDAn`gHsYoBJqqs)2pCIxfCf2gGB?@7%V! z20Ng4TfBu{s?1#L`;tg9p!Nk1tnjbZw@k_$&;4ZqwJUj2eWgNM?d!OpA@B9T_vl+g zpDxBn;2TuF+Qj>os7G?8_#uZ3%<}WoI%el6(x3~u&G!AD`mA{Asy9MA$$)%;;sM2k z-GNp>J)kmB8b}4?e~)B5=;A%KEgXc4a1w69@pwRTD;suEdV19x8gzSYiOt_t{n^TV z2D+g!Qi%{voWE`M3eU`c=hN=z-*|`U4baBXxhntj!uN1_fM1Fae%)-$PVBV&x%_mv zZI;a*H_vbTvqfAZ8zSDicGY$ysKar|g_8yDJ9d&W?|gyJ_{)!1?#3P{c2pbctCM++ zPc=?VpUt^zf$Gr5TVdK9^Zb`-B`RD8{VoK?0vb0R3v>Z8fjU42ps|)>uOk@`I-jq2 zF9Q%REr71TKtQ+(=L^fHSGvA&j~5o&c$Yaj<>}MW`Jf(Hzx*ukw0qB(MVoy3uf*|0>VkS3CFX5i3!QYrZwsL)I2|Lzt%+E>gUXZ zyq7K%gb!zbYRr$sRw|z?I0I1Lv@g&e(73P~;NrnV{)<0{tH|yv-jLl_{Na3l7XSMI z!c90%h>A(Q(kpk@T+ds+%ldrAcglmfF};%k(LvuF+q_fM!Pl$*y?_Ehe(_%XQOtl0 zTy&4$&Wk@_hls(XhlY0EX8UdbK^xQL zU+BARklMENKn6sk(l2xTbaF+ZwFYT*?tB-TDpz(Ma2hZO=mofVunPah5Ao%2#)Gmi zvNQ5I6@j{d^ZAPRMghWcQvG%}zCliJhvofgJ8WDPKE9LAwS3Lb-H9?c;sdPSC9$MZ$01Hn@=2tPO7Z@G1PWOKDMvEL<7xve-M3kW%2@!k-v}}1buBUh^t+y#yEsD7HEd=mxX|#D_|N_>uxB9?b6|yCVCdc;DH5`Jhg~ z06;!pvFgQj+noQLS8~~(miHsK+wXp=Pfq96SJ__WXTRPIHPDCg=%v+n#n$=7@9=t* zFMt=1GOkon9?|CTo?x7bJy5yoNv@IZ%Z7*F|9AFPpZp2-;N)q%Kl5kXZF4<1*zqoM z;pn57Q1r5M2g5@1M`f07t=D|yW6;;dgTwhRx{LnJfm(oz1>~ReI~I^kNw!J@Re**- z79hKS5-ffl7lJCoZufXFmCr?~l#q zII^d4qLTx~1DgNx&Sq_aw~F!ar$3dd(Bc-+IYjTFY{O##jm6V|{PY7Z=2M(m0jLcq z-k1H!w);_W$y4iepS{e+`mD=Qt~03j>X+gz`MkG(^85bAJof7Vhm+<`E~JCSflkJJ z$#_hrCxaM3wjb7;&%foIbTmKX4%c>YtNzkXG_v*{K0sv^@_3x$e|&**5ZN*Sex)P> zgIQaImaN$du zcbWdCaP+$UZgbq>xqPep*trY7@bjhXex+Z10r^JpCP<^h^&k5y8F=bVpYF|wKlI&P zm0O4d4~y;3tuKl(+VBoFav>_~{vf|On`1M=audiv8ppggnm1auqj8s8-h$?e1(aVI z324l%yny_G#)R_EMS=Vn4>;W~L46rO9Y8T(4`47b8kkVE{t5S?_q(*7y1;bCF>m>{ z)yc88*3UuXWxvD!-MoYRjw4KO#|QlT*|%7d+nj^5MZ>QKAB{VXlq?D#*}WFzCCL%0 z$QRVXZfaZ-q@8?$=1Ht=Ex&M6+3F`g1l=bBX9CU-wBx`0a%G?tAbU1jxNR9RKYFK9XXH`9M>3EKbR=Im-^WAwN#zD|hX7{)7c}jD&pVd)70F-U8d>)x z3tEeDA3j#)E{$&vN1W|+Jh!d*uQ5gkV-_y=-{rb#C$S%(xFGwR4!PZbIF5&8GM$)k z<@c;x_=|Tuzp<|kP#kUZgYn7_t}@Mg-2RsQE<6|uoD3WTv;&+C(0EXBKrC=5MYcmW zqzs^3kNkd6_s2DFJ@{_&)jRCE7UF%aoe%20`)_SON#!HEH8 z5pV7A(J{(5drg5lz~SKWf$CJd&|~maVo_xAW#m9(lb{Vy{zNggeJ(}0A^bq~#={@- zyn^S$7iR;y@?UX44WJz0#sd63s3Mz@2owV<0E+pQYmnc!x?i?@^~(!2Ui6FA{Xtvp zdT9A6$MfLUt)2RAt50w{e-96isO=B(09s#o4{M0fH5JVd+Faey;=gP_S%5L{ysv$n zG;gTfc#w{Ihq@gT9?x26=839z`eaSTYAxjllyg@cpz(NHKw|;r=oGgpA0S(PFhw>) zwnK4*#`}$c_CSANIB-twPEWjRd0%dwNq&@^)$6{@2Jva+3rJ$0~5GUV+h3&8dE5)P<){{V{~GXVwZR|7yoAY zKL)!G{TzOgw#sX0Y&$13?my*v_UY@<^Ofr}EOrA^z84>-vABwjnxK zJDK^oUo1Linquoj;Aq$**Y6NsRlrMYAGF?3YX%fMIU2gHY;F8~;G536@^VWySFGOd zCirp=AlrNl&<-yr)H?U@wPT{O)(c1mJmyzq12Vhb_B!7Oz5w2g3h_z&65kHi2ZYCc!7<;7)HkML zl>A%*D>_9(0#5O5z3XTD?>B(`$0kOoeUWp(1-pE(Kl`dO(s`vwlPd$M{@d3fO zPkAJbC0*P%g8$-04XT_7O@75L{o&jG@YpY$ zrpmYYd10P4t+ZrQv0`N|hF3u!a4_S5aNA#(x-_rU8_?MDtQI|Pd>-B3;Wgi2?6;f` zp!4DQx_ymnwEjWmtCjSjC!km$oGyoJUp@yLptZUxN0tB19)Z&{@A&wPAwG_@M%mHN zZfE*FAYQRcbv<9W+O+6=@#FAGJ|H*_sKvg^2k&nj;NpJ8i$U8zfc=rtvGL<;c7A)Y z@($jRZFXKVd_7kXKlv@iF7}x{bY6Nd(7s*si415wz);tG_6_lDKh9(Sj)*U)?ziS~|%zrgwQ2b927x!O$7k`C+OJWo~zoT_7cfezq zTidU1U(VV$_7kp>+y1jzXT8~W$*hO3@8ajx$4L+JTol*nxroK9Sbr0`Mk(Rfeq#Lt zV;)zuPExe7wm@-le#=3K|FhorTRfuUztH@X*MqemZ~5*2$XIA1bP@06Gi|;UnmL~- zd#dr1v$4UgashVT_yFEJLJZKb#~WY3yR!hrY?`ZW1!x>!0VoDY&%;a5_iMb+5YV_! zzWS+Mvhb&-ol>>VGO~2KP?_*!FM}E~G2}jAC+TdKv zG33JOw~9>UJL~yI`BK&;tz};F2miaam*Xq7UZN{>bYtg;GJw2TA26A^_1r*(rN1Yp zRJaJfX}qpnU=~mxs0idXA0(e3-yk0$Um>5Nc?9MBPOIPca%>8=pZDO!J&etPH$mPz z-M@XAdgOm6)%sKMojBX_PW%(du8W^Kmk6Ne%Ee#%!-GVa_on7KK#C6@0stgix010 z&FBl%^GpOg0RPM41MK>c401sQR`03Z^85$jTQCOD{GI0UN&%7b0OEfNPzI<5D0irF z|DeJ#31`*s`pg`=_Neb>`yQU)nqJ9)o}p0OvT-NRTocpVxpeVY{f|UbcU*jseCS%} z6Wzzp#eEu*BS!^2$E{~=?cBZOAX1(6IDRldn^(bil^dXIzVg2j^-15=FJ!*aseE@G z`Thp|c4awwKI2{g9R?$&8Pn=4?D%o$GBTnZ@ClRoHZ(ln_J@DRL&$*E&?qOkj~$qW zY+-x74!o<yjH%L^ASe5UvZh>zhhU>wJS zMf}%V5#Qh0nZ=%%`qL4hMk;w)K#7RP>Wg zKnAp}&3N!3AL^|-$1m}CiB=)EQzHeo-u@?HyU zy`G)QAp(uR@Wjgnxj^%s5O-0fB3wx#(~jya!&7Z zhkqIah>zl@_$vO2&*FEmXkTN43V_B6t${wkuohjWK1l4h$7}MdDMDYu*YztVQI1FD z{ROly-b-!|)UUjrmmG*@&5apw>0X^udx{UIVGq6b0Q}6e+=ci*Xew*KcCg;=BkmQ> zdF8+E7hhzvX}1(M?-gk9d&pOdQIEaFI%DL)UMKw3kG$3&P8;rTNqnHP6xnYY!3HQ7 zml19nHGj`JDI{;-mPvzcFBt|8=>x4bT@D-hSXCFUhBPJvN&XPr`qV{jhBg zw64dk>%Da*?TZhG+RyNQ2lqv9*#lyO>u7V?TAv2axX&y@U6L{}1th zz$D`C?f!E(7U#U+Ek2^_;;Yt-U;YR&8ZxA^kQnV+bTdQxo&g+;OoihZ+*jYRtCCaM zfGN^5XrO$Xb(TZ)Ev?dJVb^L!g%`K@cjdv{NMY$cb- zwB|}x=Kf+#E%Z=vcXk{w3*CH`W5?RHp}UeAy!ILV6aU4>wt#Ya8G!gKeg{h={`cd8 z5nhEizO?*jou9`2k~1fBj{h(J;Pc7Ae^ru{&zZ$YyV_jD)MW`tl`%=-pQV%_|J|mBNkVYtj%8@cqf%)QhZX~?!Nro zfoT$cnWH&hW&t|$x8 zTHg^3dwjImj{SINlipPm%=*rSVY>_J(cjt#ojF{5cYT!% zg5!&GeLOC}=7|5|ft7)o{`*z@=Y^N=s@Ca4_-1o}(&PQ<|Ni(tvToOfYi!;Z9aD}W z$bYq~ob{}=jH957##2X>|Bg121KC}8p*h6o-Ves$kc>HT^~cf?D}VXT=d+k?0@$9 zK=J=|j$I_&R_w0We*TL5;D1KeV#faDm8bges>-%EA-R(bKD(N@1pezic}Io+qLKI@ z-ia^BLe|;-yB^$FOuj+6SB<6ZwOp4m*k5aDpZ{vj@kIaL=wtjj+4UQJTK~4$&*RAc z+WI9!YER(!bGWyX-3)B(O+HTl!3JsWN6*$c{kJ*5%ec;4wYx;i`Ku3+|B4f2FRcGB z+iLO8mj74!@kNmTiao@Cy@y#3(O>$2+6E3cE%sNxc!KUaKJ}dF&q40-$!6odJBXb! z1^_2u`!{fclQve!^kXa++i5)a^laYYL>)GcP~5M!k0jq+UnSef-7%N=9eHnk=sjlm zCC7jHXT3L_cx`ub=9k#*JlTIPv+-cW_`h`KlJ)i*3|HmOe>?tzhSxl~@xCqhG0yqBfN|g@_d??_T-z9s?4$!n z8-Le6{it*z&#nB-IDnW$&k5(o|Kw&?|K0e{jsG*?srVc|{tM=R>Tq7yEB`Yrz0KD@ zTK?ze|7Yx7%lYga@R5xS#VY?8x=C+^7qWR0{m7n&lT#3c$}KbfYpe{*hluV+Tjw3` zwT1tB5Ak>Fm?wt+9kEeC{#*Y~|K$IRW`4O^`~$?tyyX8}{$Kph&i_|yzxaC_|4+^( z{)his)2CveqfMp#e-i)Yi)53C@9uiRkM)JC-t~1a_H$dv{_B|L6_mHNb2Pf=pTv9d zANybJWX3kX@a)ny*4c&Wzm5Ni4;ZiSF4M-w|0l!C-XVV0W}937U-LoYe|bRje_H$3 z3mBT&`}1YUlO0!tkN;)=wdU)D_eDKF7iayX)19E~9_jz$o#YT3-tx@7YfHAFH)l*2 zjr_5k#&$n%;C(cA?v;fPzT$i@{~8-hHsb%0#y?Vf@W0-v{#@WPVidiabHT*j%#7FT{d=-DiXYo5&w4Vx;12j*V3G@I?EYsf<(r*IrQD*kKTt@5|Z9ZFV;F}`#2 zjG9w8>*mn4@*R=*aiovIf2|YInvey*`|r_H4#4sQK3M+S=Yp5-N^bNne9NBy7eB>U z@mG8f=YJf>QUI+FsSY#)?D`+C+G`(M`%hl681^%m|5dxnKWIKm?{NKwF{z!46Mc_{ z?Ub#r4B&&LC*q~}tM^T59f97rWqGgo6#n0g?NYJtp_8o$$*tA{spvk{Vb^NNuN_Uh zroO@duICFeV?O@Pe^*pC|KWx8|AYBvt@6Ls-d6r!YkV&CZ|S{+ILi=W~;RA{CS0`k8->jg};}&Bc zK@Q50JScxvyZ{L z)fW68eS?q7bJ$wt;6j;XaH0K#9z(zh~L2yoCC<< zgv$XQQ?tdzH(Gnbw;Qy+Bz*mc+SW54=YEb^+HTCC$>4do`7b*xU2aJ1aSr2-c|J|_ zD|@eRwkZE=@gV-&hezTaHcD}x%3$Tp!hM!xMY5&7K>KNr`)dVs{hcpztT!MWj+9T3 zOoI312ZaG+mv7mJ?rt4W$(MNU>LHFLk*g`P>aQBDr{4`9`v4lt2j~97$NrqQML7UB z2Gm$VF=MY9jYm$3s=su-%>fWgX|1t%9t7dg;~jq}eLMdh&Gw;tP@WIvzxXDaH}coR zJVBem^24t@QwVO^^E2=*Tc?BViD%gOkBL`R+95->-rzO*FBzaMn>#`dG{5cM8M1ga zGN$|FcQOE78-9O&?yK+Ma_93t&etqv|Jl&|&&*KlcMZq%j7H6so9ne0H3|MHh7Yd& zixm5Fi7ko=6&scXY5>iFt|=wkj49FV<3)B1z}ObifW66NdBLm6_f3V2E zPqyX?#RW})L|}hy{#{v6`z?)m{(Zmg^Rc%Y``P(l=&$dS``?bx`p*TcV-t#=2>-eO z2a5f;#1KOq&E6@n&7@JUfNX?FK&apATpg-)peZylw@n7S>dsi^l!tZKbg|z{P zN)O#95Z^WS!Zw#2=+7^%Aomq4zir|>kFPP8BOZ$Px@Ujw>YQvnwET80HVZkjYsz)s z{&=MOWP_0btuK-uivKG5Z|#TL&&}rSukO5@lbz{C9)nn98#wD73d+4ZJ8W}5JfDG{ z?y1#z&RlpW->(=>v7BN$`F_QC;l7_kwzwD|d>*K8i(U^t>c@b;nbgOL0q}pWUAI*n zaw0gXJPbeNUoB1c$BSUUb)BQJ^jCC7=QT&CHMClz6<%Kcm^EOMHR*=*PqYu#8R@^; zkS*!tzyC*bJvQGb-bT7U(lND_0T1wp-~QlZ^)R`Y()~Fuymemn<+bmT+6X^JdzFW> zUgdY+&USv2`a}HJ_XHISdi50ht=!YN>-`VGQRV%@^S-(Hek%a{$Op(rC{N__K;7%N zz2s`I*tc6f-aQ&~du0CW8O0XxUGFXW9UQxy4?d!Wc#|6)bX*|5Nhfu^^qph+exvfW zUlZqs7d=yY`i)%I1`w^K8@aU+PDfoQ{-aB4$)k#Y_Bo7$;lJuoo5;9w18;xfW2kur z&Clz7zSb6TKF=~0j%RRR^r5}p7y0dI{hz*9WygLq{qM*Xf-m-4sztxsRjuLR3GlBQ zARjJYo?G6BQ#p!!fbs(_51?^l$CBlmjHuZDldrHX_Im{SHigz6INjG)en>uG;(Q;+ zRX>H+UOAqMzCn<^bv)NKZT&I#eJ}Iwqp!#%aDRAN`WWB!VGMbn?@QdeKt1zp#|ZKXx=!sL2)EqMhv;_m44)!* zD$n}N-nBpJZ?muOOB4H5=s16AR8;Ko;u|0zzQ1ulr*jnf28|E37BBv~>MMc>a9Kee95>Vs(EK)i47Ki{OecjXT4H#E6#JFsQf z-l;jQ=e+Q4u19Ar&okJHCb`jTf5*iKa40j#U;8!VJ@zF_`@82r=X5`yxaS9SQ$?|X zY?q$(wRTPYRojOm2hx?Uta+!tt<*bmF8fdUYk!?D_FDc*J8MjOiw7TvUz+m^uK5!` z#aH?G0~PszG(a{(w!@AC8e~nK=2c#{(T)Reh5zz7=zKUx2J}rUz3;=8J^p;PzPocT zHcRp#n2V0uc<%HNW<`znj=E z&U?Xm_NRX4!1Li*cfjTR<;(Xs?&EZhA|Ie!u*Lz|xxfllT8yaJZvIkoL3W%W9}v!a zw=X{+`!opN>3fUW1z89$dhf$6OIg=6+yBP*T6m(OwY&0nHlEK9zB?L+_^)pO{P~x^ zzB6C=ulgmM#eppU9jCS<{Kyt)E#YMk`RB6ZqDJgHymH&BPGo-~_D|)`W$a^r?Xw@V z&<&0IPSJZHzcZdH7mj$A4`V4=6qn^nS-*Bc$&lJGczLE1suNPbFkY>lt17crnKZaIb7;Zge@+ z<01aH8OwKiclv(Y+LlADFZ@2$AHrMj_mIv8i}KR?ZoQsov%XNaJ-m+KzI;nd{Ns0l zH6O(NT6?KnY#MszHJ9yQZF&uP@=5p)i`VCgIabv_aZNW z^?;RrGzpLFpZ}5p;g~H4Pk?6-kYUO3v9no&iw#iuWfOk>UXH8JimOD+AT9Fae~AC` z)zV8FucKf2+K%*EaZZc9IVOGM={;=PAIO}_>K_@y+{`t-0ogaK=i z059h51A?|da-i{o1DmtrnEZp@2``;^?Gx<45c=W);{V~`z2qmv|L*7e@w$BnsoKjA z*$UPXYDe#WaCyf2zhz8BpWlS{zwQu6Dahc9ANtQuXq`&6ll^!{w9xnNm7`M8J@Tot zr=q89uYKN!=dz^xb-KUzQFL_NK$zSCP~5K^p2l(VnCnZmSEXc!id1 z^xAGTrIEq?`GBAdxc|x(YQErB@>nWs)-k6&j(#Nq(wREI;o`mc6XMGWm-+4YxrAef zga3iH6#HqMsq)w=+QWXgeuI4G=gdK36V?aDI=bdBCma0#emmbrg;x4jo%rv*8LWAj zG-5!n1^tg~?hg;{xiy+Y6xZ8Xj?03dxYlG+W^S^w7 z`q#^UPFby9w}}0R0r^8@LGN@pX)bZW66Vo~gJ%AKoUHceRP7q?$GJ|tN9RRn(b2|z z7iz87YLhka?KuevB?iG8jrrxP<+HWcBhp$Q4(F*T4s>&Z!F*uX_Wh>cOdPn)+JG0Z z>&WJT_-}cS?b4dHO@H~mcj7(tOSF;CJDfTn$cbA^C7TcQm#-C*5zU?}07f-oE=em%%Hi`*r!B0US!)$89-E zq_JSTjLJ<;@~W=bXy+QS0Tr-i8jCvoa@#6r@z8Rg26oL=ar#geI8wY9FBDthXYNDi zR5H(GU-GAOhZEE;A83viDtPSli#=R`y>ymTuj#? z&psX<9WUM2dJX6IHHUYoexF-&6paNHLk8o3wq5$3f1X!p&2DQ0F4|)%y+=QC>5KR; z|CI^unzz@x|23wy|^`)(eZGd5A7@G zTIO}`Id2!dUxhp^-`uw6#0%g}J3#ZiF6LLhNAY`p6vd7%4sbc)rX1^>+5fHQE&qA< ztkxcB4!Q(79xl6%|8>b*?x5d#=ECa^$o?Nm+po4#{kHY2mx|s2V8_~rTkc%_j5UT$ z^XE3snMd3B_;7mVwy*WQ(RXuCbvw^%+Mn?9lSxU%G~UiMp_xr3e&H8;jw_?Qx8t=>QE9O(KPc~Y% zS~fdBi{b#;6OAV{u25cC_9m-E+v7)Ji?&-kFyc@DJCMXE;WBJ(0DT=t{G+0GOUQ?wtUN#SFV&ZP z-@Ma#=RtqX@re)Oha2z7R*PTxU0hC3IR)978i4#jr_O_)x!?Mu20vRFl^=*?1N2^N z$@;wCeA>V80ez|o$R{5OJ0Sl{>~{rvq};EHzPFUG`G05UbK8dazX$%mkVpQ@?|U}^ zdJhL{`@0T)>Tc-n;(hVK+5P;A`KU5t3HJlFxhgX{zF5zOeLnjLKd{Fe^_M9N|0CrD ztPPmKoH%|=-+e>jd||LcwP z+rNvk@BzmFvZdnx33{&Q+dcJree`ZjOnf)!-W(A9D**D#%GHTKhqE|8p!ia`W#t9y z0j(Nm_8dxH_-D^!E&`isZ9r~*fSC8B_x-sL&5zq09C~?J$KkRsjK8$*@59A=`F|TY z+8o5;;B}-riU0Hr2g4w9)+e<6#Qx)d`F*{62m87ws^-Gw^)d&Kgx>P`qPys?dHVc} z_o;5b#f=BFMkE*uv~AY&&T06kU0&%QO~G6JJVmZ{0KcdAhHk|U{<+OxOKJ5moxY+Y z`L2)RKQdN-IBN@tJ(Pn{dErBj%PvIXRem4C_A3`S|6AsAv3>O!59K!g(_EQi>B8ix zy%=<=(6Y@P2i~GQUmKtSps`-i=jUg7s8R-^w}JX**WWFTTjGG)3R%`t4japZEBM#sKMqId`~i z0JcYK0ky_abHDZ-zR0_q&$F}<@1awfH^ApQK=kugnYw-Ey`P#|PCj3AJ2e2sd(yol z;qz%G*P=0@#+xoLpm?Nt!xnu`NNl3K0ArO(KN_tSi1gg3`mC{!Vj%sW{qL(U$a9pH{u%VEuIf;HZDeI2=b)vXGZ1a-9R$esx8XUB&;2?T zb9j&W@6c5Ypm)I9XGtVyhaz9$xTub@0Qj~$b1&~d{nZ%d!1syypo`XWrOQKxIHV$reScj61{2ShU9WsXyNjnz8?R z0vi{~FV5ndG7EVY0RE`x-7WV0vf`2CKr|Pf55zCo40K<4KE3;A1-xz}{|c@3-hu@i z{rasBP`w8$TaNb*7ug!sL##O*zoM~*%17{CK1cIlk@P+dx_I{aJ@mfnlGTanV@5$g z@m{*5ah~WZ9ZLX?WUNnfc`Cvw5pd%|Cj*(ORWCn}^@-c847B~tBtDG1&k5y-kbUO| zf?LfMD>m#kd#|6?JLYG;%kgf2Xe^L!i^q}VK*!*{^2}eYuxv2bFJYg0t(-l+cP-MQ zRUDTOklr4w45*!oKnN$zDe7Hl+pt|K^7nOL_TQ6`-ADSZ^^+OUA^tw@Wj&pxPtCaUf|e%4>K*O*cIC#VkS82=xn4HZ2%XP=#T#@9jBU5>iHQN4S3&J?-K zmZ<~DKm)E7s7+#f$xNHG@mufkE~L=7V%hKhbGnLgwf-TS_q3@sJc@~JZl}I)^Anpd z|2{Ee+^Nt^v7Y?BZ2mu8??Ev~kqkIHAl%i5T3+F}W@RhX?OvwEoLM%HU4UG6=S?OF znrkgvHf`X0_AM_#?Cj-J=@oEL2 z2G9^_RkP#scX=h(?xNp&lqZTMPh|7O&+p6oAl>YDQQ?=i%AIN+X(zmOMc;DJclB2O z$hukht)lSZ&2`ui>el!o-1k};Al~RV8+%PIQtMOn+=k_`^jdNt9hZIA{|ullx<1zb ze(AamYQ@Jx_-K8%9m`;2gl7x20_J8MlZofbx3P0OeCe zH^qAYRDTa@`zR-LD<-G~G$~oBO;4}( z$L}Ho*n(B${5DzLu+NvjfDG(M4#YE?KZM?P?JRcTnAygRm}|_*KzDqCJ&&B&XHo$>5OLY4u#`&Oi&_(`0dFr4)ke#caS}vWOK%P z*ErvrN_xbPkL+{C2ap5t&OUQ0n*bk_ThsVXd@qF#>wF}hM>;0kt@}>-kY^UZW{t*L z{~1=z7rcsZx#}xp1`@L?Zgg#l@5*6i*T;XYhgFOh{~*^5H(D>qi}^4`<* zJrj^E4BC6qM|2Xs{?|&-AIQGR&S{LOIJa?D|3@x~Z@zdTH2RDABY&OKwY<*}UTFTn zjuqJ2`9$cQP3r(}#b@zB+k@eGurA#v{#zLe$&qBq`gA8>+G1}shIH)+uOOZ!Bp+7+ zp|yH^mwAWRV96rhr8ANKO6O$*WefGbE!oEZ1$$37_FJMkE4wBcmz`65TLF*`)GJ%H ze~+YwFW*tV{eq7@Z|QG#oNx@^wVy=%Kb`phabFI!4$|tITd)1}@wGb7n~hH(Z^RfWjd-~&&$~?6 zZBnuEqPgN*5a$D7Q z^JbTjTw+3_$&r&b#>jf6?C4z5N#X17{25_cTV3PmoQta*$rBb;pb* zx13+9`TH+=HJ1O99UnAj+5d0vvmMn-LdJksyniI)`19UY{Jl1vY9=6hT z@m%8)wILAy)vnFmoD3dy*2D8v0MElz{`RMo#_#^8bmKcFmPv2jk-muU>W})R{;8kN z&;KvQcy#NKiez85Krydup~k&A^DDII*ZoQwI-~O=)-&O z&e~<7@9=piIZ#eXb1M4p?6c&;0{pc0BDBpuE*}n`Wm7Z1Xvu;vq zddr0Lu_yK%`pRwP+AjFaOJC#r2FZff##Um^ycIrT0N+48o9E)M#Bbk&u0G7zjCf7C z7t7n%_v*6b!ybd@;=R71teD;A=dOU?XHt*8soI8mRli+>tM=e|sqePd@44W^s##A= ziz{_}|G2mkis|Lwg|G0I90&O>IafdbEs-gp_$OQrWG@vXX8?+uY8NR|vRRShow^pS za>kJI&7ZlpcDK*p@anHvmz`I(@<8mBOrE6*Jgdp`GSXL#zx(ih^yA^D#$xT7OYgc^Zw|l%v&ljVaptyPrz6_~eb+9iP2Eq0F%3)5^E)T)1!%pI?}W#=nPuKKN9`xPrH zcbxY|@usicSGn1>V-nJucP<=Tsg>GQ`yo7pkMPobhwv1>vh$Ab{Qb8aA_XJ|E>2Xu zthiY=RXSDyP+V0FAcq!(?Tu>SMa4HR99Ocr7uz7Kdc&c8`V78%Y=P>}U0t%-JNFD6 zGw-R+Cx7*Fqkc=?ZFtPr?+Ln`yx@g_XMX-{$;>zJC{$y{mE8y4Ji2o2zFob-HQN-9 zE1OAujcmQPew(XPdumth3lHJr;(3kbgzvw09wOvp(Re{)Wa*T2OFHIcL3$@&D}H1E z;*E0Y@)zP&4FLJDAUo|q`s@B{>#ouDx=;739@UotsD8Dh_8iZHx-R^L=fCCfQ6QSC zolQvKzhpsnLB3Y#yUe&L5 z)Sk2NPS=IkzvakNK>8Mx2iaeN_@kVvcqJVbhhU~KV=0JQ52X{_eU9bBDuCD(n{mx}>b9+pV6PrA*K=1(6@G9&* zuwDCw_U^CNzPESZ?(V%|m%pFg1huPVw=l=XFvOsseek~ zd=~qGU6Cw+jzuVd&c6FlAb_5wKma|9VEF#(V0%y~=l*0fC&&5l{j415^ITHceuW&} zkrWUy2jtfQ__>dKgv(3#ez^P{X#YU+9i|`2Vf*{&Pnf=i>tEIZ^mnq!Nx*RZ z=b;EMP%zOs2!H|1v5)=9K>+r1bXW#8P#xxAU;8&Da6uO5=LGgAv%fm9&u$Pw>p=nt zS^FG72y}8F{+Oi13(iH%E1bt(g0}TBt!rJ literal 82726 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 diff --git a/extras/juce demo/Builds/VisualStudio2008/icon.ico b/extras/juce demo/Builds/VisualStudio2008/icon.ico index f95f8be2b7b6609a268bb3b4d062d5a1d9baab20..ace691c5639b0e519b6d438029447f0655cff212 100644 GIT binary patch literal 82726 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 literal 82726 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 diff --git a/extras/juce demo/Builds/VisualStudio2010/icon.ico b/extras/juce demo/Builds/VisualStudio2010/icon.ico index f95f8be2b7b6609a268bb3b4d062d5a1d9baab20..ace691c5639b0e519b6d438029447f0655cff212 100644 GIT binary patch literal 82726 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 literal 82726 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 diff --git a/extras/juce demo/Builds/iPhone/Icon.icns b/extras/juce demo/Builds/iPhone/Icon.icns index 397a57cec2aa35e38f0ff96cb8c6bec9f5e104ac..2cfedf9235d4935a99b0c487cf20b13035b67840 100644 GIT binary patch literal 81944 zcmeI52Y6J)+Q*j?2uWxG5^5R*2!w=A07H@95d>*cLQ&}m3L@CBU@zCM*K)62KoBda zi2aHU1w|1EMFAB-KtbC1{=YLj&C@8{faziaEFUh21P z*|u$8c>TNN4+p$FhVMm0-~b-r16JS%rX~GUO0T6wWkhBD6sgy8IS`-Qd-)#UrylBz z5K%wv&>rntd7wY^%iB-=`*%4_4p@GAF-H%*c!LjEfn9k~1yQu9qNtLnvZ#uvs;HWu zV)P2d`d@i(KjS{`=X-pgdZ>?jsh@Uek9NKCK);a5Kv~eGzspH-z>B+A&#}w!9Nwd+ z-~l$^1a9CNCrS|25G9IgifW6J{8U%3mXba1xn}R-e!j=|sfYUFMAT0^v`4$NPd}_I z&_AzT@Y)1@^mjP{2ZG^lbsZaw-dW7iQSbm8umZb!GRXBsjlx2F&7w;bZCyXq*K=rt zS`!}_)bobR@3NbJ{i~V<*$ZySpM}n4d3~ucLV6fmBTtd|LORC_byF~zHVOa zA{XA#uS=(1b*rZ*74@Z6DN(ec>Z4xjrybg(UD~G~Rub zU!m0Cu{Fxw^jx!QOFr#f_s4aq2ER>(48EJevb4|HTEpjTPx3iGH}*L@&-OXL_4GM= z&+|F^hWjbQ=j=IG*L#`If6;y1zco(ZFK6o9sJf61(YB3em0R+k<`r*wzFpn(hF1>n z(5hNw<5ES7(l7cKC!)XfoBmthz_=J6{;aUbj$Lp6-xWJ{_+b5eAnw>yd~Li49jhm5 z5mUD0kclzjcfT^U+lrN~s_xqq<8w9&mrOrCTN8ZFuPuddU!QYulFxCj6FnH}IFFZf zoOxv&=anjs^IB!cd0n)$s-Y#-%r&mRRLOCkE9*FqhB?lC#T@5a)iYl8Nj`o}mrSUB zH|gn=$77tHK>@ z7eyOdsMm$M&yu~)EB7G_OGIzz`%9@q?_bdUcNTIEsGZ&Cn09}NH2y@g@a^jQzK34# z+9+dIs|Kx-B0^LA{bwA3azK1gT!b9_f0-`?V$b;D1Mw365_<`sytubJD&U#d^~B3Iu8Y@utM9E6%a@sUXWNuzpLD3R56q=s4!ZVhE1z@tQepm-Y&1Fz z9_T7~pvx{^CxLTr<-y)Z{m26Cxi&)b_Nwf~1I3&JV^R;(!OP%v`HK{ zr%rU+Mpeoo2l$0J5pgW@7{*Vm13v<7fiC?|ltLOsVG%M;{9|>VJRG?d=1?_7*vqbc z606+%a)Xi|t!!Iu#~NY2NwlZ8@SZJ_?RB1vH2jA5;9&LC;*+PZ(tGM#ptxayVhER{ z^KKjd&v=i|u>R$V(vEXSVaJ)Je)n)~)em2n^?m$hdh|Unr_F?m*PWkhpf(H=a6-)^Vs_8BI4#oqFMjy)B4NR&BFd<9`?NmU2<*`%`dOGO*)32 z@e04Q)pNhC#%8;8Dz-r1ov%3JX|)YKW;W>xl3P%oVT&I`dDOq}8!F!ZOS(oZW^H@6y6wjr{RAuUvABWbf|Ha5aOQg-jB=cB zZg-r`iyY^dj~r*`XO8p3tB&*4^^Ws)KiMDo9@`c+0()fph%b5(nU#;yT!OhK^HRz7 z&h>G=XW!{qD@|j^=3)D+EwFKc^#}iLaX}#V$TIexIWRJg-$Uk+{l=nh=?T%xKdS3H zgw8{|+KczMixvs9+~5x1pVj@~fIcqk?Ktmeh=wWl?;`B=IWhsBFZg44i_vkfYLk0k zNpqZ^-gBHodz@^`fnObG?|R2s|CHk_KQF5fwCA-uRt{cN-5MA92aR*TXz{yg71~CJ z7snQmQ;ZkEAN(Txf^YEezeNVT*rW4adr!>E`U-vznQtbVbVHYx8@^8T9R~L;QHtv> z5$~~?=sbKo4j<381+oob1@>=sb(}SKJI<~(!t8g)IsB(+zuy1hIQup`&bRkT4s<_y zovjQAAL@E%pyT|p&A`5OgT8mCyNai+F+oXdMU&OK8!Cluzpf5{S!gKG1q_x0T& z${qOo6if~lYg{ixIfpLRc#HcEDXv|!x}k5}RcAMDDt-_b)DYnpiHW`bz$*j#=r38o z-}-v&7we_iGi&dO?Hh<%itb<3F6q$bXy1`cVgE~0@$3QF?$;GdFY;g<6o186==lqJ z{m%r)+3|_v966YU#UHz6qrZ2YtLv_n7W&%2TX+CdiRr?)NSnjDmD z!4K7ZMePd&T|p75~4W*AJzSyM^x&vHgJb{1@r#n@>B= zRp&a+S*lNSahFo`I$gG5^#{6FH>0C3CHrx)GN4!F>6NCAvww%<96TT&@~pug+#8Ch z$4k_YY*Y|w3{Df#eba=!`f)(Ehw=;dKz@Ok!1X=qw|7j~IOP|2sJ|Pf1DQVG{N+6x zb#Gm{41N)R5GP`Ogbvxb@ULhGEcWyby(iAI*yHP2BWbP=Zh1Dn#uy z^CV(=Xuj;emp}GBb`;zfN_Rh*E*t-);qTT>j`Qzp9cNfg!+-J6fzVU6;Sv~ejsIVL z)O_#f02y%WmhA2N*2vT2SDEi9uN)M6uN>6ZJrHeTCyioii$j^h>HM16#gt7BPBCTtpM`jCm2dgAV;wWx$I)Hp=QfaSU@id>V1? z)N2yUvYv*VJ3FwQk4Gqm7N$AP<``u_0+Cp-pT-TSn`%{$2rc!Va`tRMf_Q}I>|R?TugCdByc|YclQyG=9M?TKB&&i9)k<9*h0nYUtVWoIk>o9`2Ay&<0Sg| zZ1D|-yB8Z|0~x?S{3$&4u2Y^^dg{&#WLtKwG#K5ec?0;JEcUi7`T=2YsHd#x#u17| zHk$f>`Ox^8=XBjWM?fCPW6q0ocK34aW2WL_$w0(kRR)4#kBvf3t<6X8FPxZEdHrhH z;SJ&kYiKUE*!!UQ8(}}cgu!KTlH+WY9i{C1UH<(^$LS|N!Pnf_W{Zh^qPQo>&)quIhJ<=+rZcfrx#BVNaYy%nZFhQnAzu!>?~Yah$9B8=WWC%FfQ`gax0W zlh}Ye$C`S#Ej1W?qxl_y-)T~%*~&M7t#Unuz8mc7duX0$pyH_iB1=r2-PuE@#0TEDo)>N zY_W|iu>Eg z@S7YFYX;1@n0plj{zroG21LEHXpYPpIde-Y)wQO1DhU8Jm zrIAmC|IE1xLIy1M-gzE$ahmITUddT@{h@w*&@}_i zSl2&p^48=uEKhhv2HdqI`HY9c9nF;w%ZI+WtZQ;>@tAxuIU@K@u9*3De&>h49s+yX zvavq%yhIUsy;h>R_jPM}2!Fq|lE(QD&2`w1!C1WGbKeVN;_r{-j}Prtj3*rC4mEZj zJ!S5m9Uo8iI{pJ49Fb~b@*{s596pde$Zy@ZeI^beE?E1yWbg<1MD-;w7PP#=4iGEf zU6g$B?(d5DuD+{ZyL9oHJYfwH{140xSgiC>o)zlE=X>Kl8|#zLCwDotTUw*-Ul&ns z8((*ohRaAeE(%q$jCuyDJ{fr_|9CbqR7q(@B=m;)Z08M zU~hdsz6PJ;jrWN4yOj?s_Th@24US|A`#;BMJg>`kWvBP^^!aP@g9oMe*x|>oHt`X< zk>9*W&&kug?VnpB1OJr&i7SA%?bwjS81dB!RC3a zhY<6zPC|K4wl_)N0h7~>?=63Gdc_Ch1OBDl@!>VBZzC&z;i>RT%^;)_o^*JhsT z>>$7PykgmG^LzRXS^r6S(8H4bhh`bOUy#_-7WiM-So6(Hga0L63KoCt|M0q|?e&lP z@s~|JPG1820datAEBoT4Z|{F}PSbw%izb58q;H%>k;#1m)Czz_mKNMET6xBpW}4V|M{77vHI?P1%Kv%w7qVn!C=B! z1&crN-`wG9TRQN`WPkh@fOU4Vz`j@QHTLf*eEQ`9ZM&2&S(5x9`4{{$II#|A=Y-&R zDutL2zmF`D<3qNHH&aE}ovD}f>UemQ;{A=%rz0~prg!Aig8F>MCfg7G?5$#d#UG0O z*x$)q&x=n%yeHNm4p^x?EQPhY{G4}q$3(l(XKzanlmmLTVfORCU@|})ptDPdrn)v@ z_xBZj(`R&R)kb*W2Wp6zmwD#{;CQk!V09lqf-E6Z$QCk2yx&Rm$>;6kUAzAaII`Cf z$_angzgg2|e-*LUC7p~dKGpR$FJDjQJy;V1zNdBMg2tcu=SA{8lphwKIQ9=F1FWGu zS<2bj){O<8e134J?qS7>;Ro=`u_AJ^-n`JM;E(R(_tE`|qUs`Ktc~dW#?|9?u2al} z?sG=YSrVHA_8!}Y|Ns6mclgdHOS0D63o-^E{vzgl{vCIo({>*@UiK`wdLMMI@9DE0$2{HtT2rmV?=m*v!5PK|!2g1h0qiew z`}ACc|D@LW@BguJw8>n9^1Jq>E{Zd2A7D*Bj6BfO0mL;vv;4Diz}}(fD>%Ql@a-24 zS5NNJw!5$*4@WE*Cn864DmDQ8t?rZS@%sJN`oEXxS?txKKn zIA7o3IGeQB;RpGq%qO&8;bQF@QjGAV?j?R=PmGlX?U_7$nY%{#_M81$4~z;AKamX( zbU7BQ``8R@2m5(!%ukHjQFPVxmi2a$=XG^|fqZ_@9B-iRd;WKAoAMps{KN3#$4!ni zMX^AH#)n--Kl4)#s2lvR9$?y^)idwcnru8`+ak|l-hIL>zYgF`>5 zFPab7V)v2q|NbrF)osRJAOm&}J8^*K+dG>3_OCDQyKHDmqO}1w4j@-&Z9r~(0Qi$P zVD7;8Y@U}~bGoRfK3wrZtN0@u;NLAG_OG2#=fPfjPfo~^UGsW(pgBjeM|R*pubI3U zb?2uou$VCKXJ7F3(mUF-nB~>0ZD+Lfcm0`HEY0JJuLb_u^@Zf#;(mee{aq&+1$JbB1yz-e%9(4O(*x_Z`d(@l9w~E3S)h zVvfdK&E^A$<7^zLw?T`w{lt9{B5X&j2wOs2(M`1A#X+5p5cloEp3O&}J$C&#JK)D1 z?BD7k-*&ss;@p!(E4A*!c`f!rEmH1a(+g&d{9XN#_WtNP@v_A&uU;+woZmR8IQ-$u z^A>;VxBccE$zc@SQ?PYU$j|E;2Cj^NcTQu&HZjNE_^smRAEfi`vT_FOt#~fd`9*bQ z`g~76J-9pZ8TlD(cD%?N2j=7hz#rWYHs@=r>lw{!#IE_gO}x9O%YD`cXY`K4+%FHz z^|4jhcg{}Q;&E~IlC$qeo!`34$im8NOl-`D+c!GSOvw%WK^KxmIq@mCpIQ9L0spCe z2hZG;ck93Ok({Qhvo9STqHAY%%Evz@nddWn9AnB&?t?n94G+vP^?i3=mJLAv6bJ4f z<<12&SEZHhFRZZD*z81+%?F*x2Ot~4;y(8Ck?)y1r*-|E-$@oX)AxUf$VCOipBxWy z>bLir{(|{-#V||$t$5)f#j~1sLtnkG>xzf>{+7k3U0=x#EcBoA@axUH`X7G?5As3| zEdIl5OV-r(%jy%pCb#mF-F?_>^nP%hY@J8u+263>ZnM?}@8U)DA-j5lU1!|PQ?Vt# ztx_I6+03KJxAA-$tquMlxzlsYF6oz+8q5cHa{+?$m||^zwsD{CUNA2`-d*D*@8mo! z{}XJ^5BB)`b&nfN!4|B0>pK3>OYn-irgcBm6H=x@I&Z$0ny<3DUPL`?CsY&3<~V$(Nf&mXumUfMoc>=_R> zu#;%hcdB=<*&|IZjX2OfS6aa#54*|dd-BodFO81W))JB9}C~kKZ|2ezyT65+1CI7!k?=O*F zgDbWxyRmZ}g7;PykQJ_7&`3V!expNya=={rwu{V}4X{KOvTMWg(7tjXKDx8$XZfEW z)|xmS9@~3P^hzDH$y(yj8d}eJ)AVq&Y#8&2cDfGke14+3a`QR-p*`Xu3g;LX*Yf8N zh5wRRolP&o^9~PfEa$s)P=lJCg&V%Rwul@KdpGa_#CYhtE!Os98<_L6b`U2bek6{> zmi$}KEOGa9b6(YXvTQc^%f`Pq#O*bZ#S;7Z}4Z!c|^>~4C`_j1C4?|~`f>Lgku z8;p;q@E%#GePl4F_H$|@r_a!TY}PlQs?Yn(x#FX11F`|yd!h4#M>c40$lD$2^bvM# zMXcFX7m>#&pHGYj-nM{0HUZm!ji@5RX4trYTzYhwRUb8ta$~>4)6_mWzrcAv_`fK7 zgj}v!Y34O~5mUntcnLPx0(d+sMY8{dc%WF=TQXNW&c%{DFre+6Fo@UZ)NOM!#O&CR z?D)?-jnBb;N;~E6-!mFSy6>2|dW|*m8Rxa)1ng$AlJY^C_OJI|`!Q~0rNQ%@8tBByI(0KIh!_~R4s4fqIr1wI4c(O2~N z1B1J}zJI41`;}5VLGb4}8XKO}d`k1_(e?8mfA|X~@C1zbpSk0g?;76lmptoID~ZHv6lOOaJY{ z<^I{VUF$64jZDHn?%{soN}lCKdF2tK|MUx7@eRn+mbJ=59W?asIp+C7#0~|CyXBR| z{|fbsvi(iN_j&3M`cF(I+x%M>_l&?hOWW44xnS}*fq4L3a`7h?C?O&?AV#PqYAWg^ z8YuecwVJL^asC{sc3u>31M_~wew<}JxLY#$t;y*TUl%0)ULGL_$lqwiiJvSr{(!vc zYmb?H0eu61?E3sW3@@<*;EsGy*K@a;>wJ$onB!AtLD_mc9`7soBbV%(RJWWRid_~f z4{Y&A2DCr;_d!1V^@=xZy7+-(uozI6kK%7*fAR#x3alRzI}8zh@lKP9ZtQ<>vf9S? z2j>0A`7MzCzgE&l!(@W2JWL*EOxCY%1fbtXHrir->^UE zH1Qw%D!%*F^pR%(@f;BFzxNWY0q$4aA|G+zRC6wYyNCvQg5EX3Wm-ZS|M{@Ar$ zinD(IPWs-|KL?cV`|;Nto%8qKeA1=v`NEGm9C(6jH4!+Y@04J3zhqr!y`TKiFwvIP zZEKo+zE`Sk&L0HgkNmBeXn4yrudtKw{Y>)7+jg@00*=J5(vft`)JEc02KgqrHb5NX~1NF1|uFr@MBSd_c{YuOY*|SI4y~Fs7 z{>rghxuTAOlmmQfoQVAe6!yz97he#Pg+KoPYUBSuZxNLj_;32MQ#}*^U!k_CKQR91 zJkMs?(Su4#u!sFj;LrRF+-N%^Np^jH7VhwB*)uwGFI|C$=#aJP7s`IJ2Mn9g%6}ah zg3s8He#!^1Ka@Elh5Z7|8Jp-c+Ty-~k^wuXdhQm}mv8U(=l{!O;ZOWO(|umpy3gCj zpDzA;J;Q+JCJ9YJVR2pVc3&O3x zmxaG1TtqeCCadtf{AOAhD*{)cDZAC%AH*~KpY6|(Txc_8KK$^Wi= zGuDmYa*F?Q!r#XKAH3AKqPza%{w5Q0cFg*ZAO9a;HTd5$I{)!U*Wfj{T-s54F_d$( z1x#Li(Cp8_mvgTdNBiF5Kcl;`{p>BnmSl&&{T@Ds`{oYIiV?{lvwkp8u`srRd+-bP zJ9+VnT!Ft``*HXG)$!+k)h@W;mldDuIoodj|F!xhN63EX27mGaHvhvs(dK{n{!9Pr z*VfJd?(VAgpN>+@8IS`&2ATg+7W~8DPk-}b+}=9CCSJr|t!Hmm%;DEV_qRPZo9D>& z)Mw}-yz+iG@V&)f8ZLTtPRHi%S#O?8?mSk?tO3!UrRQ{==Xg?9zH8zu^dN8yr}{tq22ajQ zT_L=-Zg87&|FA~$)LgUXh~FW$%Z>fD_|F+A>=fIx28~KjX-4{eisV`|Nk3>|SHmTkZaTiv#%Ux2u1w>aPFKzprCc@B_ya<^RB+ zyl{-DuE?AJzh`V*>HX`g>dYs8^lr^H0{8#0_iKsP|Bf8ce!A60PIHSx;5fbi!!Pum zYZDcx*>yRW2g=jG{ha3Tr49eFxnPnT?5WS9spX#+wgykpJjJ@?{I+~-xOMr{z&lO@bHfsbbAH4bcG*6a%-g=SY!^!Z@@(+8;c)Nwkzuls_`OYld_w6w_ z;s4%%XOCRQnROo z^WoS7+J+)Lgd8DLoR4E4k|R6CZ=XG-Yv`M``}S4%?;Ghp7wr3w&Z;=RXwjnJ2afFJ z23PO}=Mo|c@xR^wRYvdG|HEEk_KVp4KNG@>7k&G=PN{AVfZwNa_kab)fb-=8UYCD5 zD7?P;EGs_(KZ5bpUPt!v74Qn&dlplE>E4=UwB{%c?WAggXieL z*fjCyrmQ_0rWUgY=Xqh%NAd;k#2|Tr5psu*!bVfr!%tuGqHZf+yi#ABh_)E>dGd|q zsCH}q9$0q&p*+M7hJN+Ok=(OSwuAGuFDiz3PIUxgkL_nq{?ldn&5$FRg?x`((xUEY z;nq*oPSj9TLsU^zN>p5AOJTj?f3CAXG(prr)K=72G)if2LS$BbZ$$3U&sB zeWI|0!F=Z!%79XK?3xmQ;_Mm$|IFcp3f0LWBb9M=YYufZ}RzmTNCS>8CxcT+#hrQ)*{w);zd!SlA=KTi|Jah zHDKnB!$niWLyLXBq;rb<><2dw#P9STlLu5EIER7_Sk_1KEg7Kv`jf`FT-WbZK5n+| zxkqOuHCFc9?cQzfarP>&{+i_cNB{qNc}DgFy8!O^(?DLH?*CwczO(*I!ROFcUddNZ z{bM||)m6mvK`4K06<=m#o#)^=>8$I4ImFr8VAz8{Ye35T?dj{rexEJr+F*h(Blhnu zVlKy=K2~Js{;c`iLJYwFb`HoKfH@$0#+U;TLyi|MzNdRj;{)Ikzs-J39uWLR z@_M@Fg8w#iLNh|MXVt#v_4jp}%RHdxK8=^0d~QBr-o)>HC94hmL{5A>ozE=(A4~2i zcTFfb{OLF2!!ID?=mzCa#ZDhjGBRMFqkvA?_%7J1Yx_0t)AK-i2D9w*Q&)Cuagp$1 z?{;TVVC+ZiPt0!%`13z8A+aGbLM;(7Ah8261hK^3gIhHC`Af-eCU*P=(IT}QtWT~T zkh~%b#DwIAcy1BT16eH}&tAc|&yoBnHpZWAkj}S^YU#(|<6xFjJ%lT%-MMZjjKe1e* zh}e!8kJyix&ld3Ke{T#>UH^MyfRXxtT3BeY)o*r4GCp9i`n*s+DR3>=_RD>h>~b~$ zS+;h}wPpGrdj|I3+@(Ql{{8I=t+9m}|A=nnC69yE1^)PAdtQijt22Q=eM1JYbg|qoCJC$IB7Ao%QHm&DjQ2~uamg-lcZA455&$7Nso_<0X?#roeW?D_)TmI zznRXO7CxmQVlOL8=p1(D`!7sC&LsZyiF^S(AYa5>h}dXxqV%hD&N@ciKg*5#cYU4U zyS#Gw@?(S-^Y#v+#-f@cJMYKGLOIgq~q`z7s_CsNGMZvgP@O~zdiHs4}z^^N^r?Bk%^r5LoJ;(yzZz*pu4 z_@w{5V*2!@=6~=jJ3aE-{=Mh9y1($ovl~w-TDb5CVZ^+zjVM)=Aj0haq@ONwxQh*sa8$Yvf8tk3u}^48nlG~?rpCfH;53R3rJ z3qE%i*=LCqCexoy;qI#((vd?6RMa^2lr>69p-Ufql04llx^) zD$miv2M|La<)h!OGUr#^w|}IY?|=R7PHEF4LPNc_pZQyEY`<=E3pN4UVCMnY3~UEB zggBCTa+qkM=z+n_>h1eZJltACd{o}i%?Bcrf&KLU|FrIP<9+e_qn8Ta?puCaKD+0r zwz%-SYpW6J-(La$VTu8EY}dY&pTyTBGZ*mkk@v#hd025@jBoeXReiU&sTDt2xOi=U zef>*)XV&U$vm9<6;UAL2gmKOhFg?`xkI@z)0Z zKKP4g*SWG{L8`?^l1e1P_wX#GTe zL?*Md0r)XunZ4@`{`}?=KKM-H&vQID?@8gT4|6bUBhJ(-{(s)>N{Jj%KI~cldQX5| zWzKhhF=ty%A8WD;uW#REniLn`%z96IQEuaY-Fi&1HXtw#M3#srm{THSV@220s#fLa zRgH?cGO%}``mMdkL36^`0nRA6_-{1)zM%e@jkn?RgO@4aw%_!JbIY1T7wA01D`V(^ z%>jJ#iRsgO8RD68>0UeflGgdO_Cn0B_1I1SXg}(6PdWkuRirxR6tUh{iDX90fi%iZLq`9%;<1H`yZK)^r$L?$0 z_248o&%f)-YQD!tG^%xp0J}g~;G4{`X65&A_7x;z(L&m#}&2cFVrcAxM|_n#U3(KGVAJn!@SFXfNch~K+JTCe7L zpvXo+VQ$;8@yH_AT!>%Aae=)iq{4Z2V7k?yu`N8Q;NAVu$#SE^poe2 zdi&1WC3An)vsv%vj82;V&#V0$mX{}bwY=up|2wpw?mNYOzl-M-_Hq|=f9Nl9P&<)b zi&`cBSa4;=k2>;`2079g)rVM(91hJh!^9Tit@J zAT#(4Yyf^FPGoHWaljzag`!JE4-ZI9Jfv8}*-9*Ur`E25*#LY1YudkkXZBp)JN3-i z0PO5tlMLqX49Lny-7wR+rixVe%bAIf#ou}XVO7|W3PImvUj*VuC=h)tnB4YlIBK$sc zb+7KDzePm3wf(yFXbH3d!~wA)<^t>|w)ucDdXF8NQ@TXRcgwmYyZc1{7^*R_N9?%0 z;<9Os&*p$RH%07I5OXhN4D9jq-+m#U@7DTNoP3hXi<)uM#liV6pq`@#rQ>7ZLL(h^*g7_fID7 z)9uHUKpTKPVGltK5q74vsHfQSpS1R&n?@N z>4pN%zpgj=Sk?jZn%9B#k#FV<=N@6d^K%oYzMQIQfMP(-j-I3WR({GN@g+1ULC?(b zuRUY)m-Uc;*LClDA2wfeJ$`RP@!qzN<9v5DkF5xw;kUK>ZS|hH8Sz;ak&XFJNB32Y zTaW?l2XzrkloMfJYKxkR+Kc*%GDMR^my70Kl3wqR@3c0QDH$L??YtmgaEu+046y$H z`dL!JZ_IN;9#qW3J{V&2K+N*$f8-0@;Pa?#}i0uBq&MVq~+F%fw&&?FbQkhyU1pV!jv= zHkx=XR7Ct%SOkWrTKFz?P#1NU5@BEBMfF52MO{P#MAi??*83&5wMjj&MtsZ^x$DH( zG;En2qm2b#YoT?HOvC%wUVYzNm%>JirBfymlY#PPb5pwE@(PeJL-pexQlow-d28FibQ-G($AE zeChB{p6S-uJv+WxcEI_Ea=_$>kJ3rg z-z(-gVD_ZqgWNbjy2f3dpsp~ zR`2om+Q-drIBe4Q%Q|d13ce%`wHw z0Ct7A5UhM9}+ zT4gXGAItA@!$0CB_<5=}02u;H*7zy>9;N;5BrA)oPjKyz?b1)pO>b5%fVOjM11#pe z(iYz(-e4~Wd)z47m&*q9@?)eowK}I<4z1=+pX!ijk#>_r{BciO?~0 zt*MB)p7r_Qfq%|RyRYhwDae5J1Na#1O(juvQHsdM0_W*HK8pG2Owp~0F)?4i*15iG z2i)I~xLJI8Q)4B@nXlN;m4E3bzTg$<{YJl?WDWdQG4{U4zgx_?A9mD)pzPH$%*TZ+vE^-LY$P=$tF8Qp1Xtd^$_e!?dQ~ZbeP2u-US;uqF^T_sDS>u&{ zEQxim9lBWS=#j3?U-3+zwznl#s(|h=ry42hFCxxH$Ivx&4&6fs(M4i2bQ6rA{3>1< zz~0zc03TFK)KJt~)Lk@CG)81);HFB&i!8mdS#|de;b!qn&nZ!^Smc!f*A^%qLk^ZS z*Sg$mE*stXI=|^+pS1+f>xir#dS!uYdHqt+4jm@`huEx&X9W=F-Cn&%T=2JYcvF2sHb z*}`9%x^e!&^`(7Fu1~EpH!?gN?6IHNQFN)R$i{o<8u6ZYo}V8+UrhupRtE4jHWpys zi7%=xYAk9a>LEe~tQ}xXa|#vmJv*k|S--E54rL0%A1jHE%4@sp#)0!ga6%3^KeT79 z!GquH{&cB+8?wIfugt5+>Bad8y(DhrmEVu#-1rfFb?Xx0P{MCt{I>Tf=F&y)d$2-I zR*V;>nWkNyF?2w-eBU2gM81e;M^MOT@Ay=GyEN-ulbgd2@G-Q5-P8Km!SN=}6CZwC zoh-hzX)gX0ve?5nut%4$tLThcEC4n~&ZP6oEbVlvp3#V$Q|f zt03Y%HIr?zHUJsG_aFmhM8RZ$F(Ai`iCBhs_Da#*kdTm%A8k_Uz&iQ8Ov%A6t!+B@ z7Sa4yJaTiNRxgDaJS9&9KgrweQ%rqizaQgZFT#EQ&(i-#RhQy=WatIi+dw>W{GWD1 z&D;=N$rTa9amM|ndge3grC)CS=(@fWSSL9TY}-qE)%f@g)%8B#AKym$-o5YaWA^c%@NUY>f;sJaQ!-%2f-aVp#S7_o+#yxi+xfW=dQ1+ z_!ds7Tb1#{2lz2gG(rTQ@b}n!tM~8|?6I@x8vM4{pDFy+1y}Y8>lGPbP7r7Zuvz#m zVwWx=<}kxV7m22dm>XOpnm?{q)RqtH`rJJP(hYZSqn=|eyRZ2n^F;gtHo@{4{v!tv zxf}e0yH{Qqp{wBT+G0O`fjW80|68oH!5dv??+blqUdQjG&(wGnk7`_uZ_9^`!=FCC zN(AG^*Iz7xAMmBG2tL6t_y+%CL|~77wb;XN_<^F3CO|^}pF*bjsKxOW6>(BcotGPyKv2T+iwDIs48x>o==P_SbM>$L29!#?AQQ1N=B! z1b^UD4H0~^vEE-%@729yidP1T=@a^l43rZwUri9z6*UpH7IhWj4~B{^5Mc|@i7P~N zM0dtUgf6)zHD=S>DdGH{k()odf!+Cf8Z1R zf^YDzgb05A74=@-I;L0|D59&(4Vj-ZPmL5+62*yZOkn*1c8|FZx`0kh6)_LOMqVqr zzj68SMN`u2uX!o0(w}Ri{BlrS{8k+8?lYP#SzujZzUGQxqTj)Gb&|Q3*FIPbbNdSZ zZd`$m`|Cy4Xh-KSjwo;O$6%Ac0ryOwZ{L~{zSWCb*IYcce(Ze>%a^48jDzvu=f{c| zC*$oU>L7v-4MgxIR#Z_0zwG=TKElt!BKZ4PFTrFWT%9f>!k6LGtUqX`_iaVi77!PV z7EKT#2gFBK4zLH$^ouI~<#XvZ|NOqPSs%?5-{JkX8fN}@V4P%uc;QjS1jLI=V$EJu z&Lu$BZ(y^75ue+8-;kbj)&`sMnCer#e_o(=w0E5LXm_K*edlM@d>`J|B<9I;V#?oM zIU>}HJL6!^GfKqx`idBD8xiBLCxRc=*TX0Hh3;7F;VJarQfz;b*`gvF7h=!wY1SXq z(R<=tbfCSchp4{@+c-vK<-pp5Il2aaAMa4U#L_G3R9O3J)963eRy(>@?yj4%zQ9`J z&i4Av;sHK~+`4nQh}hwtqWZ1pFv*9A*Fd^kIY-@hN~j8f8?3*^b;{Y#>sdYcakVx1V6mKJ}}OM zpZ|@8ep?y9hvCagim-3dq8JgfUr$6_fFJBA!Zv0n2UqB`YeaLkE`CSF&>|0}M20UK z+oM;cbz@wspUA9Qnb(W6+oa`~`g*6u6sJ;dkkce8MIa}r$Jq&;{m znpgVdpLHV^UerAG!ITQ6Zm$qhgnrN;`h}bZ;?6jFiWpbAh;b&1tj@y+)^XsA)p>LV zzWul2uC5;~RtAdb3igaKT7O_|L7cAP|58QRMC728$SViv5q9)q(R2~>g{wq!MC8zJ z4lh#Z&WfQSkF-guzIa;Gr1$SA?fdwjO{%PUrCX!*ORM{ScsJhn^B3t=cdc#|x@&d) zkX@@9l{kiU?dLDfs<`=`MBn-)iM~|}yEa_$NaHH+-CD-Ccv{QUN7^LDNZvwj4lh)Q z_Gp*(=?DE`os0N|ehw9ZJN*ZD#>2Q6UoBCb$m)D)y@wy@Jp6%A@a%s9dkw=ac09;5 zvdvh-M94g{A0?_PN)TZa;ggjE_=o<$&+|p2L}NvhMAJkwM3;-uzpF&(BG_Cfy53JW z=yk4#Zq)lg@_x?!e3v>P>Z9JPM6^SDv`hQ+gZ|Jj{5y8u>bn9-CN9 zR8&-0WO=2x|5L?|i!mbO$U1U>>=PH16Ge-1l7k-l{9Mss(FoCK5xk!$LjSEe|GWFFZM6$Q#cHC=;m=neLusVH64PSjPzys^IsSr{f7DHnCzrDC4 z-{8(TLq*{JzpnEdVzwo>a$xNN{7exw7PSzy7PS|_`<|jcB5dyf5!eh74HbbEwj#q% z;5RA=ah-d(7vg(-pL)=5>ZN|#p*`BAefmLv=vO^aEm2Om|9`OcVnMD8a!}Y$=tFk) zpo%_=6D5l3iqJ85o+d)?+KAA>j-t*Y@aZlBt6n1X^c)fRLD*|c_8OmaANOO+`9Aef zAN5jy8xif%F74BgIwJZNC!(KGqDWCGk=6IVaThakD9C}8g@qB76n-U?;!|yPV=D@XL1Xt z_&)VeAN5i{?a&_WTFmJW{i1*Llm60g3SV0y11b*3(y~los?^6%;Q7`q=4((Yz z_hL@}=%?+o-u_+khy#|V!DPYO2CzUT&_(cp&`k);tek*hFtYd9@7Ox1k9w)!;%)7F zAm;S%?~?x<2$To(&TAvE6V_IM6+{f46WROhtF41qi?eOV+rB>jyZl8s;Ke2Iy~QrO z*TDM&|Nn~&F;BWNEp5U$pRWyO?Iem8J_;8uS~R3s@#3MOCBnkO!YO(!5gJ;&c(D*Y z2&k~`If)ui;#L|jQZ%G^Xjpj3lBG(QDO)zOoGFoI%a$o!s$@iXSZMK(qDAth3vT1Z z)OM*dk>x8ySFBXIO4VxBVq#)rVyacETBUNOiqRFyN0uq2J`{7ia1tXs@vUlIBQFtN zs%-h_N>yXy5^5yYteuopw{G2JQBqRvnu#?M;$o{-iY{NaRCoz-K}a~&^wQP6s{Y%#G`tz85|NC~VTk`O@4lNrc*Qy>a`eh_lkYq z_JX|M`@!5kY4vKwSB<6zr-y>4^@Q4~tuK5+$1ZYFzI`a8RZ8sydJtAT1a-`%oCVxQ z^ToqTmW`^a*4tgOSO+?CS+>0}qg|?c5LLEhSn*Q@LDnWDG`viO%JH>RTTNSbBE}!v zwSCLRwN0%RSGjx{fglzH3@sP`B6ndW%To%J8<*~Y!i^kns4y>Bduuei1Jqbcma8g2G1g~V-=-8U6onPOT z+Xj!jZ|AdVDK%rF%a%MjMKFR_s(j^yI*q$6KXhERxxcV~aodJT@s-O-5ppkvY98K4 zRZC21Hfh7*+_x6w&O>X)HLX{pY6W4S4&*}Ybc>)5jS%l^H)whPA)TZ;t#V|~T`lVi zgEG19fJPr05m_m|PSY+6PpfJB<@wzkC&g7Po68PJ??OvPR!T^2eoOAmooy!j*Da%) z)Qzu{yAELUA|fkSua`FUI@4Nk?d7UNNG8Ad-ipl&L>B{AK4-$p<&>B^3KibN(O_80GeO2e6`w5+W#}Vub=+)gAcTm35z-K4`J@7?+E{^>4F zld6@AkPaNffWk#fl#WhFZ8bGNG~YXn-P7ANs8LBea0~;4enh!yNok#Qm^h!yligb+ z$5xOP@-m=M(a_Qrt2bzK{?2@EUC&V%+OBcU%4LsXK%v6L!rkHDk#{jib_3aeb@!I_ z;-ZdWfQDa6=(q0maekQ|PjB8HXc=H7P^K>|vTE(79k0rN_Upj}mvwKM99zC*@uLzb zrj>>bB@UyI_o; z8RYKSU7O1UhH0r$@XPkM>U~@OOge%y_0I=-rq@FN)PC_&(bXHY?fZD}JM-u2ffxF; zsh<#CvbZaLl@c4b@4qyES_)q4!FT$%Z-fPq_{sOxYT9YwN5SvRpR0#f4D93zpez1W zlhV2l$=|p?U>JwK7%Uec3qHQ8`h&`-I#LWw6EABz1Q%q1=qSB9G5w~7Z#ZIBg!lE>pdc$CjG%jb$HW=-s$z? z%16*X-lum)L7G43@aBx(3IQraxaKcDrPVnZ1w8(Yb3E;*w(c`B`>*EIh5Nhcl0B zKQGg*C+yqdb%E_?tUlqF^6-X3t8M#!`8y}0VC~;ZD}P7j|ARan-U+KZv|@x`{$2Z1 zFTK}@mrnSlJiOuHvJt%q0IdBxtLN}X3uyA?j^e=l;XSSWBm9#6zb8NQZh@@Z|IeY; z{ud34tX8LaxAU(rNCU9z>LJ|}07kn0w`|qg&AJSpQE<~A{rKVd!Cjbvlpy}n+`mbu zffEWc{$GCK026>~XI*G%&Hmc=zu>9-PW@#G!I4Ks_iNX%M#WOv&Pn{6p!j#xEd}R+ zew&%myLBol2;zU&0rwg{_4BL_=JUJHCJc3RP~nRIng3L)+oIc$@rw%#fTu1R=$`;H z|0_|pa;+vE2V8h}?l*Xx9)I@F68vuX&-}B9e*!deT0yzMRg;F>43ye;vtRYndkmeh z=)mcXE4SZ%a@^pqMBgR@S12S53)E@Ag*O&V47}^|G5tFz2VJIwn}M|Hw>}wD-Z+@s zA)L;A3#W|e-6l05O6do3@HYL}eaN`E1z`eq%o#VNTMH&1{sgEJP-sAh{-dY8UjRvf z*Qbm9Og;_!jRr(%?WNbSi4Wv|{(txFlf`~b{{8F+08CI)TIT^5&N}&hPA4k~pIwRc zd)TiIu=-M?VcR|Q4Iph0{j&Yo8_kSqbpEExHaKdrf}Zz)d$#7~0dMzq8gL z-30)pVEblFc_4pn(5}ZWxnMvig&vWT{-Y~kEPzyqOK#bH@Yv~Zois;J<_mAknmDX? z8|5B7%O9=;N(E~+76T?~n@soV7H+W&#J^m^FE1zmCn^1>h{{vka&Z zTeo@V0b{1l$){A*kyTesyI^3q^pu3-7rDTzbcy_vP_>HzH5X^umz-fr+yg|FT3T- zJQaY?ZkRrPSf6%HlVU0a-F`zi+$}Jbs;9K zy0>z7za6jnmilr~kjz;@x4EOaO;)RCygH5yQ6l1 zSJUWo68$VBFau$wDpXBONo&_*K*qRfv#z;)!P=AM!J*X)?!4ymY2z{m^f)^$rAF2A zrB1N-_m~b83oBKwazfoEt-GE(^n%ILub6Y^l1(R*9XY&d$<1?SPoI3j(7s(-HLjbW z69DchjI2g-dgq=z(H``;+6`NF>^(4J+|r z%LcV$D@N)B#7Ue&@gIG0Paw4IdhU?X6Q<6*^4dF}$<;xSogY4VyIP+*e$bU(`zFJlNwl#GmyNvzkTRmWbY2UlD(_l^e_t;lYYy6uyN58giank(Ga z`}gda-XuA(nmv7TZ1pGp&yPX*%5k+*o3-ks9*iD;@$^|&&AH*`J0Ds6{>N+9|M2rJ zQ-0pOe$|Ti7C&;w%{R=sYS#2A<3YM*X6^x`lRtgq@0-EEJ${v>9(3&4|NK#7 zCrz7i`4v}PGv~VNufJjL+_^VW^m@bf*IhT~nyaq3e8#j%V@D0?*OS)G0jyIwePnu| z4sZymRJrJ?32qO1oI7~L=&=*0OuKZ(%*$uZo_)oYZn@%$*|TQNyllp$)22)uJ9_w_ zzCAjq^(4;$v=ehX_#Lo-!++(XtLX?@)AV*-d-oqaY~+{=$Bv&kY4VgQ7hgPe>eP!b zo-$?f#EIj_UN~mtu)+O%cWsy6gt14LJM9B_cx2lH9fC_~+@f{+u08wo8!&jt&|xDo zGDeP~jLaA@V%X3jg9h~L)3a;))-4*>tL1O~6b^nJ#|TdR8Xj-}GPQA9dYg6~J9q8g zvsdqP`t<4Bw{M?5=k)H?qkGrR9ow}@Pivf7C-06w9+d;P2W6uwRZB=rN=|Lqq*+>v zmg%ipwQfUc-Ktf3%NA+PnlwyJPD)IuRw;_(pLsEM%M4Hm;Q(y8D4o7dsG+mBb(8C* zq@Xc} zKrWf*$A6FZz?{C0C|RnEj$W59U!g*jDHSS|FJCUQY#ANFK6(P%vMvu_{RhB9bog9n z&%?tbB1)PP5y2t!5;}q&l3&Na?J(#=VI4!)A^4DxV*aAHI{L0t-}!j@-FCozRWB%N O&n@P^lXP&V!v6!sJ?Y*6 literal 81944 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 E0G6?2yZ`_I diff --git a/juce.h b/juce.h index 9e67aa89ed..d9cd385d88 100644 --- a/juce.h +++ b/juce.h @@ -33,6 +33,15 @@ */ //============================================================================== +/* This line is here just to help catch syntax errors caused by mistakes in other header + files that are included before juce.h. If you hit an error at this line, it must be some + kind of syntax problem in whatever code immediately precedes this header. + + This also acts as a sanity-check in case you're trying to build with a C or obj-C compiler + rather than a proper C++ one. +*/ +namespace JuceDummyNamespace {} + #define JUCE_PUBLIC_INCLUDES 1 // (this includes things that need defining outside of the JUCE namespace) diff --git a/juce_amalgamated.cpp b/juce_amalgamated.cpp index f5bf722d8c..61d2914b38 100644 --- a/juce_amalgamated.cpp +++ b/juce_amalgamated.cpp @@ -39562,10 +39562,6 @@ public: { } - ~MouseListenerList() - { - } - void addListener (MouseListener* const newListener, const bool wantsEventsForAllNestedChildComponents) { if (! listeners.contains (newListener)) @@ -39595,14 +39591,14 @@ public: } } - static void sendMouseEvent (Component* comp, BailOutChecker& checker, + static void sendMouseEvent (Component& comp, BailOutChecker& checker, void (MouseListener::*eventMethod) (const MouseEvent&), const MouseEvent& e) { if (checker.shouldBailOut()) return; { - MouseListenerList* const list = comp->mouseListeners_; + MouseListenerList* const list = comp.mouseListeners; if (list != 0) { @@ -39618,15 +39614,15 @@ public: } } - Component* p = comp->parentComponent_; + Component* p = comp.parentComponent; while (p != 0) { - MouseListenerList* const list = p->mouseListeners_; + MouseListenerList* const list = p->mouseListeners; if (list != 0 && list->numDeepMouseListeners > 0) { - BailOutChecker checker2 (comp, p); + BailOutChecker2 checker2 (checker, p); for (int i = list->numDeepMouseListeners; --i >= 0;) { @@ -39639,42 +39635,37 @@ public: } } - p = p->parentComponent_; + p = p->parentComponent; } } - static void sendWheelEvent (Component* comp, BailOutChecker& checker, const MouseEvent& e, + static void sendWheelEvent (Component& comp, BailOutChecker& checker, const MouseEvent& e, const float wheelIncrementX, const float wheelIncrementY) { - if (checker.shouldBailOut()) - return; + MouseListenerList* const list = comp.mouseListeners; + if (list != 0) { - MouseListenerList* const list = comp->mouseListeners_; - - if (list != 0) + for (int i = list->listeners.size(); --i >= 0;) { - for (int i = list->listeners.size(); --i >= 0;) - { - list->listeners.getUnchecked(i)->mouseWheelMove (e, wheelIncrementX, wheelIncrementY); + list->listeners.getUnchecked(i)->mouseWheelMove (e, wheelIncrementX, wheelIncrementY); - if (checker.shouldBailOut()) - return; + if (checker.shouldBailOut()) + return; - i = jmin (i, list->listeners.size()); - } + i = jmin (i, list->listeners.size()); } } - Component* p = comp->parentComponent_; + Component* p = comp.parentComponent; while (p != 0) { - MouseListenerList* const list = p->mouseListeners_; + MouseListenerList* const list = p->mouseListeners; if (list != 0 && list->numDeepMouseListeners > 0) { - BailOutChecker checker2 (comp, p); + BailOutChecker2 checker2 (checker, p); for (int i = list->numDeepMouseListeners; --i >= 0;) { @@ -39687,7 +39678,7 @@ public: } } - p = p->parentComponent_; + p = p->parentComponent; } } @@ -39695,6 +39686,26 @@ private: Array listeners; int numDeepMouseListeners; + class BailOutChecker2 + { + public: + BailOutChecker2 (BailOutChecker& checker_, Component* const component) + : checker (checker_), safePointer (component) + { + } + + bool shouldBailOut() const throw() + { + return checker.shouldBailOut() || safePointer == 0; + } + + private: + BailOutChecker& checker; + const WeakReference safePointer; + + JUCE_DECLARE_NON_COPYABLE (BailOutChecker2); + }; + JUCE_DECLARE_NON_COPYABLE (MouseListenerList); }; @@ -39724,34 +39735,34 @@ public: static const Point convertFromParentSpace (const Component& comp, const Point& pointInParentSpace) { - if (comp.affineTransform_ == 0) + if (comp.affineTransform == 0) return pointInParentSpace - comp.getPosition(); - return pointInParentSpace.toFloat().transformedBy (comp.affineTransform_->inverted()).toInt() - comp.getPosition(); + return pointInParentSpace.toFloat().transformedBy (comp.affineTransform->inverted()).toInt() - comp.getPosition(); } static const Rectangle convertFromParentSpace (const Component& comp, const Rectangle& areaInParentSpace) { - if (comp.affineTransform_ == 0) + if (comp.affineTransform == 0) return areaInParentSpace - comp.getPosition(); - return areaInParentSpace.toFloat().transformed (comp.affineTransform_->inverted()).getSmallestIntegerContainer() - comp.getPosition(); + return areaInParentSpace.toFloat().transformed (comp.affineTransform->inverted()).getSmallestIntegerContainer() - comp.getPosition(); } static const Point convertToParentSpace (const Component& comp, const Point& pointInLocalSpace) { - if (comp.affineTransform_ == 0) + if (comp.affineTransform == 0) return pointInLocalSpace + comp.getPosition(); - return (pointInLocalSpace + comp.getPosition()).toFloat().transformedBy (*comp.affineTransform_).toInt(); + return (pointInLocalSpace + comp.getPosition()).toFloat().transformedBy (*comp.affineTransform).toInt(); } static const Rectangle convertToParentSpace (const Component& comp, const Rectangle& areaInLocalSpace) { - if (comp.affineTransform_ == 0) + if (comp.affineTransform == 0) return areaInLocalSpace + comp.getPosition(); - return (areaInLocalSpace + comp.getPosition()).toFloat().transformed (*comp.affineTransform_).getSmallestIntegerContainer(); + return (areaInLocalSpace + comp.getPosition()).toFloat().transformed (*comp.affineTransform).getSmallestIntegerContainer(); } template @@ -39820,13 +39831,13 @@ public: static void clipObscuredRegions (const Component& comp, Graphics& g, const Rectangle& clipRect, const Point& delta) { - for (int i = comp.childComponentList_.size(); --i >= 0;) + for (int i = comp.childComponentList.size(); --i >= 0;) { - const Component& child = *comp.childComponentList_.getUnchecked(i); + const Component& child = *comp.childComponentList.getUnchecked(i); if (child.isVisible() && ! child.isTransformed()) { - const Rectangle newClip (clipRect.getIntersection (child.bounds_)); + const Rectangle newClip (clipRect.getIntersection (child.bounds)); if (! newClip.isEmpty()) { @@ -39849,22 +39860,22 @@ public: const Rectangle& clipRect, const Component* const compToAvoid) { - for (int i = comp.childComponentList_.size(); --i >= 0;) + for (int i = comp.childComponentList.size(); --i >= 0;) { - const Component* const c = comp.childComponentList_.getUnchecked(i); + const Component* const c = comp.childComponentList.getUnchecked(i); if (c != compToAvoid && c->isVisible()) { if (c->isOpaque()) { - Rectangle childBounds (c->bounds_.getIntersection (clipRect)); + Rectangle childBounds (c->bounds.getIntersection (clipRect)); childBounds.translate (delta.getX(), delta.getY()); result.subtract (childBounds); } else { - Rectangle newClip (clipRect.getIntersection (c->bounds_)); + Rectangle newClip (clipRect.getIntersection (c->bounds)); newClip.translate (-c->getX(), -c->getY()); subtractObscuredRegions (*c, result, c->getPosition() + delta, @@ -39882,22 +39893,20 @@ public: }; Component::Component() - : parentComponent_ (0), - lookAndFeel_ (0), - effect_ (0), - bufferedImage_ (0), - componentFlags_ (0), + : parentComponent (0), + lookAndFeel (0), + effect (0), + componentFlags (0), componentTransparency (0) { } Component::Component (const String& name) - : componentName_ (name), - parentComponent_ (0), - lookAndFeel_ (0), - effect_ (0), - bufferedImage_ (0), - componentFlags_ (0), + : componentName (name), + parentComponent (0), + lookAndFeel (0), + effect (0), + componentFlags (0), componentTransparency (0) { } @@ -39905,18 +39914,18 @@ Component::Component (const String& name) Component::~Component() { #if ! JUCE_VC6 // (access to private union not allowed in VC6) - static_jassert (sizeof (flags) <= sizeof (componentFlags_)); + static_jassert (sizeof (flags) <= sizeof (componentFlags)); #endif componentListeners.call (&ComponentListener::componentBeingDeleted, *this); weakReferenceMaster.clear(); - while (childComponentList_.size() > 0) - removeChildComponent (childComponentList_.size() - 1, false, true); + while (childComponentList.size() > 0) + removeChildComponent (childComponentList.size() - 1, false, true); - if (parentComponent_ != 0) - parentComponent_->removeChildComponent (parentComponent_->childComponentList_.indexOf (this), true, false); + if (parentComponent != 0) + parentComponent->removeChildComponent (parentComponent->childComponentList.indexOf (this), true, false); else if (currentlyFocusedComponent == this || isParentOf (currentlyFocusedComponent)) giveAwayFocus (currentlyFocusedComponent != this); @@ -39924,7 +39933,7 @@ Component::~Component() removeFromDesktop(); // Something has added some children to this component during its destructor! Not a smart idea! - jassert (childComponentList_.size() == 0); + jassert (childComponentList.size() == 0); } const WeakReference::SharedRef& Component::getWeakReference() @@ -39938,9 +39947,9 @@ void Component::setName (const String& name) // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. CHECK_MESSAGE_MANAGER_IS_LOCKED - if (componentName_ != name) + if (componentName != name) { - componentName_ = name; + componentName = name; if (flags.hasHeavyweightPeerFlag) { @@ -39981,8 +39990,8 @@ void Component::setVisible (bool shouldBeVisible) { if (currentlyFocusedComponent == this || isParentOf (currentlyFocusedComponent)) { - if (parentComponent_ != 0) - parentComponent_->grabKeyboardFocus(); + if (parentComponent != 0) + parentComponent->grabKeyboardFocus(); else giveAwayFocus (true); } @@ -40025,9 +40034,9 @@ bool Component::isShowing() const { if (flags.visibleFlag) { - if (parentComponent_ != 0) + if (parentComponent != 0) { - return parentComponent_->isShowing(); + return parentComponent->isShowing(); } else { @@ -40101,8 +40110,8 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo) setTopLeftPosition (topLeft.getX(), topLeft.getY()); } - if (parentComponent_ != 0) - parentComponent_->removeChildComponent (this); + if (parentComponent != 0) + parentComponent->removeChildComponent (this); if (safePointer != 0) { @@ -40112,7 +40121,7 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo) Desktop::getInstance().addDesktopComponent (this); - bounds_.setPosition (topLeft); + bounds.setPosition (topLeft); peer->setBounds (topLeft.getX(), topLeft.getY(), getWidth(), getHeight(), false); peer->setVisible (isVisible()); @@ -40208,7 +40217,7 @@ void Component::setBufferedToImage (const bool shouldBeBuffered) { if (shouldBeBuffered != flags.bufferToImageFlag) { - bufferedImage_ = Image::null; + bufferedImage = Image::null; flags.bufferToImageFlag = shouldBeBuffered; } } @@ -40231,9 +40240,9 @@ void Component::toFront (const bool setAsForeground) grabKeyboardFocus(); } } - else if (parentComponent_ != 0) + else if (parentComponent != 0) { - Array& childList = parentComponent_->childComponentList_; + Array& childList = parentComponent->childComponentList; if (childList.getLast() != this) { @@ -40274,11 +40283,11 @@ void Component::toBehind (Component* const other) if (other != 0 && other != this) { // the two components must belong to the same parent.. - jassert (parentComponent_ == other->parentComponent_); + jassert (parentComponent == other->parentComponent); - if (parentComponent_ != 0) + if (parentComponent != 0) { - Array& childList = parentComponent_->childComponentList_; + Array& childList = parentComponent->childComponentList; const int index = childList.indexOf (this); @@ -40317,13 +40326,13 @@ void Component::toBehind (Component* const other) void Component::toBack() { - Array& childList = parentComponent_->childComponentList_; + Array& childList = parentComponent->childComponentList; if (isOnDesktop()) { jassertfalse; //xxx need to add this to native window } - else if (parentComponent_ != 0 && childList.getFirst() != this) + else if (parentComponent != 0 && childList.getFirst() != this) { const int index = childList.indexOf (this); @@ -40389,24 +40398,24 @@ bool Component::isAlwaysOnTop() const throw() int Component::proportionOfWidth (const float proportion) const throw() { - return roundToInt (proportion * bounds_.getWidth()); + return roundToInt (proportion * bounds.getWidth()); } int Component::proportionOfHeight (const float proportion) const throw() { - return roundToInt (proportion * bounds_.getHeight()); + return roundToInt (proportion * bounds.getHeight()); } int Component::getParentWidth() const throw() { - return (parentComponent_ != 0) ? parentComponent_->getWidth() - : getParentMonitorArea().getWidth(); + return (parentComponent != 0) ? parentComponent->getWidth() + : getParentMonitorArea().getWidth(); } int Component::getParentHeight() const throw() { - return (parentComponent_ != 0) ? parentComponent_->getHeight() - : getParentMonitorArea().getHeight(); + return (parentComponent != 0) ? parentComponent->getHeight() + : getParentMonitorArea().getHeight(); } int Component::getScreenX() const { return getScreenPosition().getX(); } @@ -40481,7 +40490,7 @@ void Component::setBounds (const int x, const int y, int w, int h) repaintParent(); } - bounds_.setBounds (x, y, w, h); + bounds.setBounds (x, y, w, h); if (showing) { @@ -40529,19 +40538,19 @@ void Component::sendMovedResizedMessages (const bool wasMoved, const bool wasRes if (checker.shouldBailOut()) return; - for (int i = childComponentList_.size(); --i >= 0;) + for (int i = childComponentList.size(); --i >= 0;) { - childComponentList_.getUnchecked(i)->parentSizeChanged(); + childComponentList.getUnchecked(i)->parentSizeChanged(); if (checker.shouldBailOut()) return; - i = jmin (i, childComponentList_.size()); + i = jmin (i, childComponentList.size()); } } - if (parentComponent_ != 0) - parentComponent_->childBoundsChanged (this); + if (parentComponent != 0) + parentComponent->childBoundsChanged (this); if (! checker.shouldBailOut()) componentListeners.callChecked (checker, &ComponentListener::componentMovedOrResized, @@ -40657,7 +40666,7 @@ void Component::setBoundsToFit (int x, int y, int width, int height, bool Component::isTransformed() const throw() { - return affineTransform_ != 0; + return affineTransform != 0; } void Component::setTransform (const AffineTransform& newTransform) @@ -40668,26 +40677,26 @@ void Component::setTransform (const AffineTransform& newTransform) if (newTransform.isIdentity()) { - if (affineTransform_ != 0) + if (affineTransform != 0) { repaint(); - affineTransform_ = 0; + affineTransform = 0; repaint(); sendMovedResizedMessages (false, false); } } - else if (affineTransform_ == 0) + else if (affineTransform == 0) { repaint(); - affineTransform_ = new AffineTransform (newTransform); + affineTransform = new AffineTransform (newTransform); repaint(); sendMovedResizedMessages (false, false); } - else if (*affineTransform_ != newTransform) + else if (*affineTransform != newTransform) { repaint(); - *affineTransform_ = newTransform; + *affineTransform = newTransform; repaint(); sendMovedResizedMessages (false, false); } @@ -40695,7 +40704,7 @@ void Component::setTransform (const AffineTransform& newTransform) const AffineTransform Component::getTransform() const { - return affineTransform_ != 0 ? *affineTransform_ : AffineTransform::identity; + return affineTransform != 0 ? *affineTransform : AffineTransform::identity; } bool Component::hitTest (int x, int y) @@ -40736,9 +40745,9 @@ bool Component::contains (const Point& point) { if (ComponentHelpers::hitTest (*this, point)) { - if (parentComponent_ != 0) + if (parentComponent != 0) { - return parentComponent_->contains (ComponentHelpers::convertToParentSpace (*this, point)); + return parentComponent->contains (ComponentHelpers::convertToParentSpace (*this, point)); } else if (flags.hasHeavyweightPeerFlag) { @@ -40767,9 +40776,9 @@ Component* Component::getComponentAt (const Point& position) { if (flags.visibleFlag && ComponentHelpers::hitTest (*this, position)) { - for (int i = childComponentList_.size(); --i >= 0;) + for (int i = childComponentList.size(); --i >= 0;) { - Component* child = childComponentList_.getUnchecked(i); + Component* child = childComponentList.getUnchecked(i); child = child->getComponentAt (ComponentHelpers::convertFromParentSpace (*child, position)); if (child != 0) @@ -40793,33 +40802,33 @@ void Component::addChildComponent (Component* const child, int zOrder) // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. CHECK_MESSAGE_MANAGER_IS_LOCKED - if (child != 0 && child->parentComponent_ != this) + if (child != 0 && child->parentComponent != this) { - if (child->parentComponent_ != 0) - child->parentComponent_->removeChildComponent (child); + if (child->parentComponent != 0) + child->parentComponent->removeChildComponent (child); else child->removeFromDesktop(); - child->parentComponent_ = this; + child->parentComponent = this; if (child->isVisible()) child->repaintParent(); if (! child->isAlwaysOnTop()) { - if (zOrder < 0 || zOrder > childComponentList_.size()) - zOrder = childComponentList_.size(); + if (zOrder < 0 || zOrder > childComponentList.size()) + zOrder = childComponentList.size(); while (zOrder > 0) { - if (! childComponentList_.getUnchecked (zOrder - 1)->isAlwaysOnTop()) + if (! childComponentList.getUnchecked (zOrder - 1)->isAlwaysOnTop()) break; --zOrder; } } - childComponentList_.insert (zOrder, child); + childComponentList.insert (zOrder, child); child->internalHierarchyChanged(); internalChildrenChanged(); @@ -40837,7 +40846,7 @@ void Component::addAndMakeVisible (Component* const child, int zOrder) void Component::removeChildComponent (Component* const child) { - removeChildComponent (childComponentList_.indexOf (child), true, true); + removeChildComponent (childComponentList.indexOf (child), true, true); } Component* Component::removeChildComponent (const int index) @@ -40851,7 +40860,7 @@ Component* Component::removeChildComponent (const int index, bool sendParentEven // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. CHECK_MESSAGE_MANAGER_IS_LOCKED - Component* const child = childComponentList_ [index]; + Component* const child = childComponentList [index]; if (child != 0) { @@ -40863,8 +40872,8 @@ Component* Component::removeChildComponent (const int index, bool sendParentEven child->repaintParent(); } - childComponentList_.remove (index); - child->parentComponent_ = 0; + childComponentList.remove (index); + child->parentComponent = 0; // (NB: there are obscure situations where child->isShowing() = false, but it still has the focus) if (currentlyFocusedComponent == child || child->isParentOf (currentlyFocusedComponent)) @@ -40898,37 +40907,37 @@ Component* Component::removeChildComponent (const int index, bool sendParentEven void Component::removeAllChildren() { - while (childComponentList_.size() > 0) - removeChildComponent (childComponentList_.size() - 1); + while (childComponentList.size() > 0) + removeChildComponent (childComponentList.size() - 1); } void Component::deleteAllChildren() { - while (childComponentList_.size() > 0) - delete (removeChildComponent (childComponentList_.size() - 1)); + while (childComponentList.size() > 0) + delete (removeChildComponent (childComponentList.size() - 1)); } int Component::getNumChildComponents() const throw() { - return childComponentList_.size(); + return childComponentList.size(); } Component* Component::getChildComponent (const int index) const throw() { - return childComponentList_ [index]; + return childComponentList [index]; } int Component::getIndexOfChildComponent (const Component* const child) const throw() { - return childComponentList_.indexOf (const_cast (child)); + return childComponentList.indexOf (const_cast (child)); } Component* Component::getTopLevelComponent() const throw() { const Component* comp = this; - while (comp->parentComponent_ != 0) - comp = comp->parentComponent_; + while (comp->parentComponent != 0) + comp = comp->parentComponent; return const_cast (comp); } @@ -40937,7 +40946,7 @@ bool Component::isParentOf (const Component* possibleChild) const throw() { while (possibleChild != 0) { - possibleChild = possibleChild->parentComponent_; + possibleChild = possibleChild->parentComponent; if (possibleChild == this) return true; @@ -40985,9 +40994,9 @@ void Component::internalHierarchyChanged() if (checker.shouldBailOut()) return; - for (int i = childComponentList_.size(); --i >= 0;) + for (int i = childComponentList.size(); --i >= 0;) { - childComponentList_.getUnchecked (i)->internalHierarchyChanged(); + childComponentList.getUnchecked (i)->internalHierarchyChanged(); if (checker.shouldBailOut()) { @@ -40997,7 +41006,7 @@ void Component::internalHierarchyChanged() return; } - i = jmin (i, childComponentList_.size()); + i = jmin (i, childComponentList.size()); } } @@ -41016,7 +41025,7 @@ int Component::runModalLoop() return ModalComponentManager::getInstance()->runEventLoopForCurrentComponent(); } -void Component::enterModalState (const bool takeKeyboardFocus_, ModalComponentManager::Callback* const callback) +void Component::enterModalState (const bool takeKeyboardFocus, ModalComponentManager::Callback* const callback) { // if component methods are being called from threads other than the message // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. @@ -41032,7 +41041,7 @@ void Component::enterModalState (const bool takeKeyboardFocus_, ModalComponentMa flags.currentlyModalFlag = true; setVisible (true); - if (takeKeyboardFocus_) + if (takeKeyboardFocus) grabKeyboardFocus(); } } @@ -41108,11 +41117,11 @@ bool Component::isBroughtToFrontOnMouseClick() const throw() return flags.bringToFrontOnClickFlag; } -void Component::setMouseCursor (const MouseCursor& cursor) +void Component::setMouseCursor (const MouseCursor& newCursor) { - if (cursor_ != cursor) + if (cursor != newCursor) { - cursor_ = cursor; + cursor = newCursor; if (flags.visibleFlag) updateMouseCursor(); @@ -41121,7 +41130,7 @@ void Component::setMouseCursor (const MouseCursor& cursor) const MouseCursor Component::getMouseCursor() { - return cursor_; + return cursor; } void Component::updateMouseCursor() const @@ -41175,7 +41184,7 @@ void Component::repaint() void Component::repaint (const int x, const int y, const int w, const int h) { - bufferedImage_ = Image::null; + bufferedImage = Image::null; if (flags.visibleFlag) internalRepaint (x, y, w, h); @@ -41214,18 +41223,18 @@ void Component::internalRepaint (int x, int y, int w, int h) if (h > 0) { - if (parentComponent_ != 0) + if (parentComponent != 0) { - if (parentComponent_->flags.visibleFlag) + if (parentComponent->flags.visibleFlag) { - if (affineTransform_ == 0) + if (affineTransform == 0) { - parentComponent_->internalRepaint (x + getX(), y + getY(), w, h); + parentComponent->internalRepaint (x + getX(), y + getY(), w, h); } else { const Rectangle r (ComponentHelpers::convertToParentSpace (*this, Rectangle (x, y, w, h))); - parentComponent_->internalRepaint (r.getX(), r.getY(), r.getWidth(), r.getHeight()); + parentComponent->internalRepaint (r.getX(), r.getY(), r.getWidth(), r.getHeight()); } } } @@ -41244,17 +41253,17 @@ void Component::paintComponent (Graphics& g) { if (flags.bufferToImageFlag) { - if (bufferedImage_.isNull()) + if (bufferedImage.isNull()) { - bufferedImage_ = Image (flags.opaqueFlag ? Image::RGB : Image::ARGB, - getWidth(), getHeight(), ! flags.opaqueFlag, Image::NativeImage); + bufferedImage = Image (flags.opaqueFlag ? Image::RGB : Image::ARGB, + getWidth(), getHeight(), ! flags.opaqueFlag, Image::NativeImage); - Graphics imG (bufferedImage_); + Graphics imG (bufferedImage); paint (imG); } g.setColour (Colours::black.withAlpha (getAlpha())); - g.drawImageAt (bufferedImage_, 0, 0); + g.drawImageAt (bufferedImage, 0, 0); } else { @@ -41287,16 +41296,16 @@ void Component::paintComponentAndChildren (Graphics& g) g.restoreState(); } - for (int i = 0; i < childComponentList_.size(); ++i) + for (int i = 0; i < childComponentList.size(); ++i) { - Component& child = *childComponentList_.getUnchecked (i); + Component& child = *childComponentList.getUnchecked (i); if (child.isVisible()) { - if (child.affineTransform_ != 0) + if (child.affineTransform != 0) { g.saveState(); - g.addTransform (*child.affineTransform_); + g.addTransform (*child.affineTransform); if ((child.flags.dontClipGraphicsFlag && ! g.isClipEmpty()) || g.reduceClipRegion (child.getBounds())) child.paintWithinParentContext (g); @@ -41315,11 +41324,11 @@ void Component::paintComponentAndChildren (Graphics& g) { bool nothingClipped = true; - for (int j = i + 1; j < childComponentList_.size(); ++j) + for (int j = i + 1; j < childComponentList.size(); ++j) { - const Component& sibling = *childComponentList_.getUnchecked (j); + const Component& sibling = *childComponentList.getUnchecked (j); - if (sibling.flags.opaqueFlag && sibling.isVisible() && sibling.affineTransform_ == 0) + if (sibling.flags.opaqueFlag && sibling.isVisible() && sibling.affineTransform == 0) { nothingClipped = false; g.excludeClipRegion (sibling.getBounds()); @@ -41348,7 +41357,7 @@ void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel) flags.isInsidePaintCall = true; #endif - if (effect_ != 0) + if (effect != 0) { Image effectImage (flags.opaqueFlag ? Image::RGB : Image::ARGB, getWidth(), getHeight(), ! flags.opaqueFlag, Image::NativeImage); @@ -41357,7 +41366,7 @@ void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel) paintComponentAndChildren (g2); } - effect_->applyEffect (effectImage, g, ignoreAlphaLevel ? 1.0f : getAlpha()); + effect->applyEffect (effectImage, g, ignoreAlphaLevel ? 1.0f : getAlpha()); } else if (componentTransparency > 0 && ! ignoreAlphaLevel) { @@ -41403,11 +41412,11 @@ const Image Component::createComponentSnapshot (const Rectangle& areaToGrab return componentImage; } -void Component::setComponentEffect (ImageEffectFilter* const effect) +void Component::setComponentEffect (ImageEffectFilter* const newEffect) { - if (effect_ != effect) + if (effect != newEffect) { - effect_ = effect; + effect = newEffect; repaint(); } } @@ -41418,10 +41427,10 @@ LookAndFeel& Component::getLookAndFeel() const throw() do { - if (c->lookAndFeel_ != 0) - return *(c->lookAndFeel_); + if (c->lookAndFeel != 0) + return *(c->lookAndFeel); - c = c->parentComponent_; + c = c->parentComponent; } while (c != 0); @@ -41430,9 +41439,9 @@ LookAndFeel& Component::getLookAndFeel() const throw() void Component::setLookAndFeel (LookAndFeel* const newLookAndFeel) { - if (lookAndFeel_ != newLookAndFeel) + if (lookAndFeel != newLookAndFeel) { - lookAndFeel_ = newLookAndFeel; + lookAndFeel = newLookAndFeel; sendLookAndFeelChange(); } @@ -41452,14 +41461,14 @@ void Component::sendLookAndFeelChange() if (safePointer != 0) { - for (int i = childComponentList_.size(); --i >= 0;) + for (int i = childComponentList.size(); --i >= 0;) { - childComponentList_.getUnchecked (i)->sendLookAndFeelChange(); + childComponentList.getUnchecked (i)->sendLookAndFeelChange(); if (safePointer == 0) return; - i = jmin (i, childComponentList_.size()); + i = jmin (i, childComponentList.size()); } } } @@ -41471,8 +41480,8 @@ const Colour Component::findColour (const int colourId, const bool inheritFromPa if (v != 0) return Colour ((int) *v); - if (inheritFromParent && parentComponent_ != 0) - return parentComponent_->findColour (colourId, true); + if (inheritFromParent && parentComponent != 0) + return parentComponent->findColour (colourId, true); return getLookAndFeel().findColour (colourId); } @@ -41522,8 +41531,8 @@ const Rectangle Component::getLocalBounds() const throw() const Rectangle Component::getBoundsInParent() const throw() { - return affineTransform_ == 0 ? bounds_ - : bounds_.toFloat().transformed (*affineTransform_).getSmallestIntegerContainer(); + return affineTransform == 0 ? bounds + : bounds.toFloat().transformed (*affineTransform).getSmallestIntegerContainer(); } void Component::getVisibleArea (RectangleList& result, const bool includeSiblings) const @@ -41587,9 +41596,9 @@ void Component::mouseWheelMove (const MouseEvent& e, float wheelIncrementX, floa { // the base class just passes this event up to its parent.. - if (parentComponent_ != 0) - parentComponent_->mouseWheelMove (e.getEventRelativeTo (parentComponent_), - wheelIncrementX, wheelIncrementY); + if (parentComponent != 0) + parentComponent->mouseWheelMove (e.getEventRelativeTo (parentComponent), + wheelIncrementX, wheelIncrementY); } void Component::resized() @@ -41695,10 +41704,10 @@ void Component::addMouseListener (MouseListener* const newListener, // twice - once via the direct callback that all components get anyway, and then again as a listener! jassert ((newListener != this) || wantsEventsForAllNestedChildComponents); - if (mouseListeners_ == 0) - mouseListeners_ = new MouseListenerList(); + if (mouseListeners == 0) + mouseListeners = new MouseListenerList(); - mouseListeners_->addListener (newListener, wantsEventsForAllNestedChildComponents); + mouseListeners->addListener (newListener, wantsEventsForAllNestedChildComponents); } void Component::removeMouseListener (MouseListener* const listenerToRemove) @@ -41707,8 +41716,8 @@ void Component::removeMouseListener (MouseListener* const listenerToRemove) // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. CHECK_MESSAGE_MANAGER_IS_LOCKED - if (mouseListeners_ != 0) - mouseListeners_->removeListener (listenerToRemove); + if (mouseListeners != 0) + mouseListeners->removeListener (listenerToRemove); } void Component::internalMouseEnter (MouseInputSource& source, const Point& relativePos, const Time& time) @@ -41742,7 +41751,7 @@ void Component::internalMouseEnter (MouseInputSource& source, const Point& desktop.resetTimer(); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseEnter, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseEnter, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseEnter, me); } } @@ -41778,7 +41787,7 @@ void Component::internalMouseExit (MouseInputSource& source, const Point& r desktop.resetTimer(); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseExit, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseExit, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseExit, me); } } @@ -41823,7 +41832,7 @@ void Component::internalMouseDown (MouseInputSource& source, const Point& r return; } - c = c->parentComponent_; + c = c->parentComponent; } } @@ -41852,7 +41861,7 @@ void Component::internalMouseDown (MouseInputSource& source, const Point& r desktop.resetTimer(); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDown, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseDown, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDown, me); } void Component::internalMouseUp (MouseInputSource& source, const Point& relativePos, const Time& time, const ModifierKeys& oldModifiers) @@ -41882,7 +41891,7 @@ void Component::internalMouseUp (MouseInputSource& source, const Point& rel desktop.resetTimer(); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseUp, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseUp, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseUp, me); if (checker.shouldBailOut()) return; @@ -41896,7 +41905,7 @@ void Component::internalMouseUp (MouseInputSource& source, const Point& rel return; desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDoubleClick, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseDoubleClick, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDoubleClick, me); } } } @@ -41925,7 +41934,7 @@ void Component::internalMouseDrag (MouseInputSource& source, const Point& r desktop.resetTimer(); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDrag, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseDrag, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDrag, me); } } @@ -41954,7 +41963,7 @@ void Component::internalMouseMove (MouseInputSource& source, const Point& r desktop.resetTimer(); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseMove, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseMove, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseMove, me); } } @@ -41984,7 +41993,8 @@ void Component::internalMouseWheel (MouseInputSource& source, const Point& desktop.mouseListeners.callChecked (checker, &MouseListener::mouseWheelMove, me, wheelIncrementX, wheelIncrementY); - MouseListenerList::sendWheelEvent (this, checker, me, wheelIncrementX, wheelIncrementY); + if (! checker.shouldBailOut()) + MouseListenerList::sendWheelEvent (*this, checker, me, wheelIncrementX, wheelIncrementY); } } @@ -42081,14 +42091,14 @@ void Component::internalChildFocusChange (FocusChangeType cause, const WeakRefer return; } - if (parentComponent_ != 0) - parentComponent_->internalChildFocusChange (cause, WeakReference (parentComponent_)); + if (parentComponent != 0) + parentComponent->internalChildFocusChange (cause, WeakReference (parentComponent)); } bool Component::isEnabled() const throw() { return (! flags.isDisabledFlag) - && (parentComponent_ == 0 || parentComponent_->isEnabled()); + && (parentComponent == 0 || parentComponent->isEnabled()); } void Component::setEnabled (const bool shouldBeEnabled) @@ -42099,7 +42109,7 @@ void Component::setEnabled (const bool shouldBeEnabled) // if any parent components are disabled, setting our flag won't make a difference, // so no need to send a change message - if (parentComponent_ == 0 || parentComponent_->isEnabled()) + if (parentComponent == 0 || parentComponent->isEnabled()) sendEnablementChangeMessage(); } } @@ -42175,10 +42185,10 @@ void Component::setExplicitFocusOrder (const int newFocusOrderIndex) KeyboardFocusTraverser* Component::createFocusTraverser() { - if (flags.isFocusContainerFlag || parentComponent_ == 0) + if (flags.isFocusContainerFlag || parentComponent == 0) return new KeyboardFocusTraverser(); - return parentComponent_->createFocusTraverser(); + return parentComponent->createFocusTraverser(); } void Component::takeKeyboardFocus (const FocusChangeType cause) @@ -42219,7 +42229,7 @@ void Component::grabFocusInternal (const FocusChangeType cause, const bool canTr { if (isShowing()) { - if (flags.wantsFocusFlag && (isEnabled() || parentComponent_ == 0)) + if (flags.wantsFocusFlag && (isEnabled() || parentComponent == 0)) { takeKeyboardFocus (cause); } @@ -42247,11 +42257,11 @@ void Component::grabFocusInternal (const FocusChangeType cause, const bool canTr } } - if (canTryParent && parentComponent_ != 0) + if (canTryParent && parentComponent != 0) { // if no children want it and we're allowed to try our parent comp, // then pass up to parent, which will try our siblings. - parentComponent_->grabFocusInternal (cause, true); + parentComponent->grabFocusInternal (cause, true); } } } @@ -42273,7 +42283,7 @@ void Component::moveKeyboardFocusToSibling (const bool moveToNext) // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. CHECK_MESSAGE_MANAGER_IS_LOCKED - if (parentComponent_ != 0) + if (parentComponent != 0) { ScopedPointer traverser (createFocusTraverser()); @@ -42299,7 +42309,7 @@ void Component::moveKeyboardFocusToSibling (const bool moveToNext) } } - parentComponent_->moveKeyboardFocusToSibling (moveToNext); + parentComponent->moveKeyboardFocusToSibling (moveToNext); } } @@ -42366,16 +42376,16 @@ const Rectangle Component::getParentMonitorArea() const void Component::addKeyListener (KeyListener* const newListener) { - if (keyListeners_ == 0) - keyListeners_ = new Array (); + if (keyListeners == 0) + keyListeners = new Array (); - keyListeners_->addIfNotAlreadyThere (newListener); + keyListeners->addIfNotAlreadyThere (newListener); } void Component::removeKeyListener (KeyListener* const listenerToRemove) { - if (keyListeners_ != 0) - keyListeners_->removeValue (listenerToRemove); + if (keyListeners != 0) + keyListeners->removeValue (listenerToRemove); } bool Component::keyPressed (const KeyPress&) @@ -42390,8 +42400,8 @@ bool Component::keyStateChanged (const bool /*isKeyDown*/) void Component::modifierKeysChanged (const ModifierKeys& modifiers) { - if (parentComponent_ != 0) - parentComponent_->modifierKeysChanged (modifiers); + if (parentComponent != 0) + parentComponent->modifierKeysChanged (modifiers); } void Component::internalModifierKeysChanged() @@ -42405,27 +42415,21 @@ ComponentPeer* Component::getPeer() const { if (flags.hasHeavyweightPeerFlag) return ComponentPeer::getPeerFor (this); - else if (parentComponent_ == 0) + else if (parentComponent == 0) return 0; - return parentComponent_->getPeer(); + return parentComponent->getPeer(); } Component::BailOutChecker::BailOutChecker (Component* const component) - : safePointer1 (component) + : safePointer (component) { jassert (component != 0); } -Component::BailOutChecker::BailOutChecker (Component* const component1, Component* const component2) - : safePointer1 (component1), safePointer2 (component2) -{ - jassert (component1 != 0); -} - bool Component::BailOutChecker::shouldBailOut() const throw() { - return safePointer1 == 0 || safePointer2.wasObjectDeleted(); + return safePointer == 0; } END_JUCE_NAMESPACE @@ -57826,14 +57830,14 @@ FileBrowserComponent::FileBrowserComponent (int flags_, currentPathBox.setEditableText (true); StringArray rootNames, rootPaths; - const BigInteger separators (getRoots (rootNames, rootPaths)); + getRoots (rootNames, rootPaths); for (int i = 0; i < rootNames.size(); ++i) { - if (separators [i]) + if (rootNames[i].isEmpty()) currentPathBox.addSeparator(); - - currentPathBox.addItem (rootNames[i], i + 1); + else + currentPathBox.addItem (rootNames[i], i + 1); } currentPathBox.addSeparator(); @@ -57933,7 +57937,8 @@ bool FileBrowserComponent::isDirectorySuitable (const File&) const bool FileBrowserComponent::isFileOrDirSuitable (const File& f) const { if (f.isDirectory()) - return (flags & canSelectDirectories) != 0 && (fileFilter == 0 || fileFilter->isDirectorySuitable (f)); + return (flags & canSelectDirectories) != 0 + && (fileFilter == 0 || fileFilter->isDirectorySuitable (f)); return (flags & canSelectFiles) != 0 && f.exists() && (fileFilter == 0 || fileFilter->isFileSuitable (f)); @@ -57999,6 +58004,15 @@ void FileBrowserComponent::refresh() fileList->refresh(); } +void FileBrowserComponent::setFileFilter (const FileFilter* const newFileFilter) +{ + if (fileFilter != newFileFilter) + { + fileFilter = newFileFilter; + refresh(); + } +} + const String FileBrowserComponent::getActionVerb() const { return isSaveMode() ? TRANS("Save") : TRANS("Open"); @@ -58178,10 +58192,8 @@ void FileBrowserComponent::comboBoxChanged (ComboBox*) } } -const BigInteger FileBrowserComponent::getRoots (StringArray& rootNames, StringArray& rootPaths) +void FileBrowserComponent::getRoots (StringArray& rootNames, StringArray& rootPaths) { - BigInteger separators; - #if JUCE_WINDOWS Array roots; File::findFileSystemRoots (roots); @@ -58211,7 +58223,8 @@ const BigInteger FileBrowserComponent::getRoots (StringArray& rootNames, StringA rootNames.add (name); } - separators.setBit (rootPaths.size()); + rootPaths.add (String::empty); + rootNames.add (String::empty); rootPaths.add (File::getSpecialLocation (File::userDocumentsDirectory).getFullPathName()); rootNames.add ("Documents"); @@ -58227,7 +58240,8 @@ const BigInteger FileBrowserComponent::getRoots (StringArray& rootNames, StringA rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName()); rootNames.add ("Desktop"); - separators.setBit (rootPaths.size()); + rootPaths.add (String::empty); + rootNames.add (String::empty); Array volumes; File vol ("/Volumes"); @@ -58253,8 +58267,6 @@ const BigInteger FileBrowserComponent::getRoots (StringArray& rootNames, StringA rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName()); rootNames.add ("Desktop"); #endif - - return separators; } END_JUCE_NAMESPACE @@ -61275,6 +61287,252 @@ END_JUCE_NAMESPACE /*** End of inlined file: juce_ComponentAnimator.cpp ***/ +/*** Start of inlined file: juce_ComponentBuilder.cpp ***/ +BEGIN_JUCE_NAMESPACE + +namespace ComponentBuilderHelpers +{ + const String getStateId (const ValueTree& state) + { + return state [ComponentBuilder::idProperty].toString(); + } + + Component* findComponentWithID (OwnedArray& components, const String& compId) + { + jassert (compId.isNotEmpty()); + + for (int i = components.size(); --i >= 0;) + { + Component* const c = components.getUnchecked (i); + + if (c->getComponentID() == compId) + return components.removeAndReturn (i); + } + + return 0; + } + + Component* findComponentWithID (Component* const c, const String& compId) + { + jassert (compId.isNotEmpty()); + if (c->getComponentID() == compId) + return c; + + for (int i = c->getNumChildComponents(); --i >= 0;) + { + Component* const child = findComponentWithID (c->getChildComponent (i), compId); + + if (child != 0) + return child; + } + + return 0; + } + + Component* createNewComponent (ComponentBuilder::TypeHandler& type, + const ValueTree& state, Component* parent) + { + Component* const c = type.addNewComponentFromState (state, parent); + jassert (c != 0); + c->setComponentID (getStateId (state)); + return c; + } +} + +const Identifier ComponentBuilder::idProperty ("id"); + +ComponentBuilder::ComponentBuilder (const ValueTree& state_) + : state (state_) +{ + state.addListener (this); +} + +ComponentBuilder::~ComponentBuilder() +{ + state.removeListener (this); +} + +Component* ComponentBuilder::getComponent() +{ + if (component == 0) + { + jassert (types.size() > 0); // You need to register all the necessary types before you can load a component! + + TypeHandler* const type = getHandlerForState (state); + jassert (type != 0); // trying to create a component from an unknown type of ValueTree + + if (type != 0) + component = ComponentBuilderHelpers::createNewComponent (*type, state, 0); + } + + return component; +} + +Component* ComponentBuilder::getAndReleaseComponent() +{ + getComponent(); + return component.release(); +} + +void ComponentBuilder::registerTypeHandler (ComponentBuilder::TypeHandler* const type) +{ + jassert (type != 0); + + // Don't try to move your types around! Once a type has been added to a builder, the + // builder owns it, and you should leave it alone! + jassert (type->builder == 0); + + types.add (type); + type->builder = this; +} + +ComponentBuilder::TypeHandler* ComponentBuilder::getHandlerForState (const ValueTree& s) const +{ + const Identifier targetType (s.getType()); + + for (int i = 0; i < types.size(); ++i) + { + TypeHandler* const t = types.getUnchecked(i); + + if (t->getType() == targetType) + return t; + } + + return 0; +} + +int ComponentBuilder::getNumHandlers() const throw() +{ + return types.size(); +} + +ComponentBuilder::TypeHandler* ComponentBuilder::getHandler (const int index) const throw() +{ + return types [index]; +} + +void ComponentBuilder::updateComponent (const ValueTree& state) +{ + using namespace ComponentBuilderHelpers; + + if (component != 0) + { + const String compId (getStateId (state)); + + if (compId.isEmpty() && state.getParent().isValid()) + { + // ..handle the case where a child of the actual state node has changed. + updateComponent (state.getParent()); + } + else + { + TypeHandler* const type = getHandlerForState (state); + + if (type != 0) + { + Component* const changedComp = findComponentWithID (component, compId); + + if (changedComp != 0) + type->updateComponentFromState (changedComp, state); + } + } + } +} + +void ComponentBuilder::setImageProvider (ImageProvider* newImageProvider) throw() +{ + imageProvider = newImageProvider; +} + +ComponentBuilder::ImageProvider* ComponentBuilder::getImageProvider() const throw() +{ + return imageProvider; +} + +void ComponentBuilder::valueTreePropertyChanged (ValueTree& tree, const Identifier&) +{ + updateComponent (tree); +} + +void ComponentBuilder::valueTreeChildrenChanged (ValueTree& tree) +{ + updateComponent (tree); +} + +void ComponentBuilder::valueTreeParentChanged (ValueTree& tree) +{ + updateComponent (tree); +} + +ComponentBuilder::TypeHandler::TypeHandler (const Identifier& valueTreeType_) + : builder (0), valueTreeType (valueTreeType_) +{ +} + +ComponentBuilder::TypeHandler::~TypeHandler() +{ +} + +ComponentBuilder* ComponentBuilder::TypeHandler::getBuilder() const throw() +{ + // A type handler needs to be registered with a ComponentBuilder before using it! + jassert (builder != 0); + return builder; +} + +void ComponentBuilder::updateChildComponents (Component& parent, const ValueTree& children) +{ + using namespace ComponentBuilderHelpers; + + const int numExistingChildComps = parent.getNumChildComponents(); + + Array componentsInOrder; + componentsInOrder.ensureStorageAllocated (numExistingChildComps); + + { + OwnedArray existingComponents; + existingComponents.ensureStorageAllocated (numExistingChildComps); + + int i; + for (i = 0; i < numExistingChildComps; ++i) + existingComponents.add (parent.getChildComponent (i)); + + const int newNumChildren = children.getNumChildren(); + for (i = 0; i < newNumChildren; ++i) + { + const ValueTree childState (children.getChild (i)); + + ComponentBuilder::TypeHandler* const type = getHandlerForState (childState); + jassert (type != 0); + + if (type != 0) + { + Component* c = findComponentWithID (existingComponents, getStateId (childState)); + + if (c == 0) + c = createNewComponent (*type, childState, &parent); + + componentsInOrder.add (c); + } + } + + // (remaining unused items in existingComponents get deleted here as it goes out of scope) + } + + // Make sure the z-order is correct.. + if (componentsInOrder.size() > 0) + { + componentsInOrder.getLast()->toFront (false); + + for (int i = componentsInOrder.size() - 1; --i >= 0;) + componentsInOrder.getUnchecked(i)->toBehind (componentsInOrder.getUnchecked (i + 1)); + } +} + +END_JUCE_NAMESPACE +/*** End of inlined file: juce_ComponentBuilder.cpp ***/ + + /*** Start of inlined file: juce_ComponentBoundsConstrainer.cpp ***/ BEGIN_JUCE_NAMESPACE @@ -66888,14 +67146,14 @@ Button* LookAndFeel::createTabBarExtrasButton() dp.setFill (Colour (0x59000000)); DrawableComposite normalImage; - normalImage.insertDrawable (ellipse); - normalImage.insertDrawable (dp); + normalImage.addAndMakeVisible (ellipse.createCopy()); + normalImage.addAndMakeVisible (dp.createCopy()); dp.setFill (Colour (0xcc000000)); DrawableComposite overImage; - overImage.insertDrawable (ellipse); - overImage.insertDrawable (dp); + overImage.addAndMakeVisible (ellipse.createCopy()); + overImage.addAndMakeVisible (dp.createCopy()); DrawableButton* db = new DrawableButton ("tabs", DrawableButton::ImageFitted); db->setImages (&normalImage, &overImage, 0); @@ -77114,17 +77372,18 @@ bool ComponentPeer::handleKeyPress (const int keyCode, while (target != 0) { const WeakReference deletionChecker (target); + const Array * const keyListeners = target->keyListeners; - if (target->keyListeners_ != 0) + if (keyListeners != 0) { - for (int i = target->keyListeners_->size(); --i >= 0;) + for (int i = keyListeners->size(); --i >= 0;) { - keyWasUsed = target->keyListeners_->getUnchecked(i)->keyPressed (keyInfo, target); + keyWasUsed = keyListeners->getUnchecked(i)->keyPressed (keyInfo, target); if (keyWasUsed || deletionChecker == 0) return keyWasUsed; - i = jmin (i, target->keyListeners_->size()); + i = jmin (i, keyListeners->size()); } } @@ -77141,7 +77400,7 @@ bool ComponentPeer::handleKeyPress (const int keyCode, break; } - target = target->parentComponent_; + target = target->getParentComponent(); } return keyWasUsed; @@ -77174,20 +77433,22 @@ bool ComponentPeer::handleKeyUpOrDown (const bool isKeyDown) if (keyWasUsed || deletionChecker == 0) break; - if (target->keyListeners_ != 0) + const Array * const keyListeners = target->keyListeners; + + if (keyListeners != 0) { - for (int i = target->keyListeners_->size(); --i >= 0;) + for (int i = keyListeners->size(); --i >= 0;) { - keyWasUsed = target->keyListeners_->getUnchecked(i)->keyStateChanged (isKeyDown, target); + keyWasUsed = keyListeners->getUnchecked(i)->keyStateChanged (isKeyDown, target); if (keyWasUsed || deletionChecker == 0) return keyWasUsed; - i = jmin (i, target->keyListeners_->size()); + i = jmin (i, keyListeners->size()); } } - target = target->parentComponent_; + target = target->getParentComponent(); } return keyWasUsed; @@ -77251,7 +77512,7 @@ void ComponentPeer::handleMovedOrResized() if (wasMoved || wasResized) { - component->bounds_ = newBounds; + component->bounds = newBounds; if (wasResized) component->repaint(); @@ -85555,34 +85816,56 @@ Drawable* Drawable::createFromImageFile (const File& file) return fin != 0 ? createFromImageDataStream (*fin) : 0; } -Drawable* Drawable::createFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) +Drawable* Drawable::createFromValueTree (const ValueTree& tree, ComponentBuilder::ImageProvider* imageProvider) { - return createChildFromValueTree (0, tree, imageProvider); + ComponentBuilder builder (tree); + builder.setImageProvider (imageProvider); + registerDrawableTypes (builder); + + Drawable* d = dynamic_cast (builder.getComponent()); + + if (d != 0) + return dynamic_cast (builder.getAndReleaseComponent()); + + return 0; } -Drawable* Drawable::createChildFromValueTree (DrawableComposite* parent, const ValueTree& tree, ImageProvider* imageProvider) +template +class DrawableTypeHandler : public ComponentBuilder::TypeHandler { - const Identifier type (tree.getType()); - - Drawable* d = 0; - if (type == DrawablePath::valueTreeType) d = new DrawablePath(); - else if (type == DrawableComposite::valueTreeType) d = new DrawableComposite(); - else if (type == DrawableRectangle::valueTreeType) d = new DrawableRectangle(); - else if (type == DrawableImage::valueTreeType) d = new DrawableImage(); - else if (type == DrawableText::valueTreeType) d = new DrawableText(); +public: + DrawableTypeHandler() + : ComponentBuilder::TypeHandler (DrawableClass::valueTreeType) + { + } - if (d != 0) + Component* addNewComponentFromState (const ValueTree& state, Component* parent) { + DrawableClass* const d = new DrawableClass(); + if (parent != 0) - parent->insertDrawable (d); + parent->addAndMakeVisible (d); - d->refreshFromValueTree (tree, imageProvider); + updateComponentFromState (d, state); + return d; } - return d; -} + void updateComponentFromState (Component* component, const ValueTree& state) + { + DrawableClass* const d = dynamic_cast (component); + jassert (d != 0); + d->refreshFromValueTree (state, *this->getBuilder()); + } +}; -const Identifier Drawable::ValueTreeWrapperBase::idProperty ("id"); +void Drawable::registerDrawableTypes (ComponentBuilder& builder) +{ + builder.registerTypeHandler (new DrawableTypeHandler ()); + builder.registerTypeHandler (new DrawableTypeHandler ()); + builder.registerTypeHandler (new DrawableTypeHandler ()); + builder.registerTypeHandler (new DrawableTypeHandler ()); + builder.registerTypeHandler (new DrawableTypeHandler ()); +} Drawable::ValueTreeWrapperBase::ValueTreeWrapperBase (const ValueTree& state_) : state (state_) @@ -85595,15 +85878,15 @@ Drawable::ValueTreeWrapperBase::~ValueTreeWrapperBase() const String Drawable::ValueTreeWrapperBase::getID() const { - return state [idProperty]; + return state [ComponentBuilder::idProperty]; } -void Drawable::ValueTreeWrapperBase::setID (const String& newID, UndoManager* const undoManager) +void Drawable::ValueTreeWrapperBase::setID (const String& newID) { if (newID.isEmpty()) - state.removeProperty (idProperty, undoManager); + state.removeProperty (ComponentBuilder::idProperty, 0); else - state.setProperty (idProperty, newID, undoManager); + state.setProperty (ComponentBuilder::idProperty, newID, 0); } END_JUCE_NAMESPACE @@ -85659,7 +85942,7 @@ bool DrawableShape::isStrokeVisible() const throw() bool DrawableShape::refreshFillTypes (const FillAndStrokeState& newState, Expression::EvaluationContext* /*nameFinder*/, - ImageProvider* imageProvider) + ComponentBuilder::ImageProvider* imageProvider) { bool hasChanged = false; @@ -85686,7 +85969,7 @@ bool DrawableShape::refreshFillTypes (const FillAndStrokeState& newState, return hasChanged; } -void DrawableShape::writeTo (FillAndStrokeState& state, ImageProvider* imageProvider, UndoManager* undoManager) const +void DrawableShape::writeTo (FillAndStrokeState& state, ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager) const { state.setMainFill (mainFill, 0, 0, 0, imageProvider, undoManager); state.setStrokeFill (strokeFill, 0, 0, 0, imageProvider, undoManager); @@ -85761,7 +86044,7 @@ DrawableShape::FillAndStrokeState::FillAndStrokeState (const ValueTree& state_) } const FillType DrawableShape::FillAndStrokeState::getMainFill (Expression::EvaluationContext* nameFinder, - ImageProvider* imageProvider) const + ComponentBuilder::ImageProvider* imageProvider) const { return readFillType (state.getChildWithName (fill), 0, 0, 0, nameFinder, imageProvider); } @@ -85777,14 +86060,14 @@ ValueTree DrawableShape::FillAndStrokeState::getMainFillState() } void DrawableShape::FillAndStrokeState::setMainFill (const FillType& newFill, const RelativePoint* gp1, const RelativePoint* gp2, - const RelativePoint* gp3, ImageProvider* imageProvider, UndoManager* undoManager) + const RelativePoint* gp3, ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager) { ValueTree v (state.getOrCreateChildWithName (fill, undoManager)); writeFillType (v, newFill, gp1, gp2, gp3, imageProvider, undoManager); } const FillType DrawableShape::FillAndStrokeState::getStrokeFill (Expression::EvaluationContext* nameFinder, - ImageProvider* imageProvider) const + ComponentBuilder::ImageProvider* imageProvider) const { return readFillType (state.getChildWithName (stroke), 0, 0, 0, nameFinder, imageProvider); } @@ -85800,7 +86083,7 @@ ValueTree DrawableShape::FillAndStrokeState::getStrokeFillState() } void DrawableShape::FillAndStrokeState::setStrokeFill (const FillType& newFill, const RelativePoint* gp1, const RelativePoint* gp2, - const RelativePoint* gp3, ImageProvider* imageProvider, UndoManager* undoManager) + const RelativePoint* gp3, ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager) { ValueTree v (state.getOrCreateChildWithName (stroke, undoManager)); writeFillType (v, newFill, gp1, gp2, gp3, imageProvider, undoManager); @@ -85830,7 +86113,7 @@ void DrawableShape::FillAndStrokeState::setStrokeType (const PathStrokeType& new } const FillType DrawableShape::FillAndStrokeState::readFillType (const ValueTree& v, RelativePoint* const gp1, RelativePoint* const gp2, RelativePoint* const gp3, - Expression::EvaluationContext* const nameFinder, ImageProvider* imageProvider) + Expression::EvaluationContext* const nameFinder, ComponentBuilder::ImageProvider* imageProvider) { const String newType (v[type].toString()); @@ -85905,7 +86188,7 @@ namespace DrawableShapeHelpers void DrawableShape::FillAndStrokeState::writeFillType (ValueTree& v, const FillType& fillType, const RelativePoint* const gp1, const RelativePoint* const gp2, const RelativePoint* gp3, - ImageProvider* imageProvider, UndoManager* const undoManager) + ComponentBuilder::ImageProvider* imageProvider, UndoManager* const undoManager) { if (fillType.isColour()) { @@ -85967,8 +86250,13 @@ DrawableComposite::DrawableComposite (const DrawableComposite& other) : bounds (other.bounds), updateBoundsReentrant (false) { - for (int i = 0; i < other.getNumDrawables(); ++i) - insertDrawable (other.getDrawable(i)->createCopy()); + for (int i = 0; i < other.getNumChildComponents(); ++i) + { + const Drawable* const d = dynamic_cast (getChildComponent(i)); + + if (d != 0) + addAndMakeVisible (d->createCopy()); + } markersX.addCopiesOf (other.markersX); markersY.addCopiesOf (other.markersY); @@ -85979,68 +86267,17 @@ DrawableComposite::~DrawableComposite() deleteAllChildren(); } -int DrawableComposite::getNumDrawables() const throw() -{ - return getNumChildComponents(); -} - -Drawable* DrawableComposite::getDrawable (int index) const -{ - return dynamic_cast (getChildComponent (index)); -} - -void DrawableComposite::insertDrawable (Drawable* drawable, const int index) -{ - if (drawable != 0) - addAndMakeVisible (drawable, index); -} - -void DrawableComposite::insertDrawable (const Drawable& drawable, const int index) -{ - insertDrawable (drawable.createCopy(), index); -} - -void DrawableComposite::removeDrawable (const int index, const bool deleteDrawable) -{ - Drawable* const d = getDrawable (index); - - if (deleteDrawable) - delete d; - else - removeChildComponent (d); -} - -Drawable* DrawableComposite::getDrawableWithName (const String& name) const throw() -{ - for (int i = getNumChildComponents(); --i >= 0;) - if (getChildComponent(i)->getName() == name) - return getDrawable (i); - - return 0; -} - -void DrawableComposite::bringToFront (const int index) -{ - Drawable* d = getDrawable (index); - if (d != 0) - d->toFront (false); -} - const Rectangle DrawableComposite::getDrawableBounds() const { Rectangle r; - for (int i = getNumDrawables(); --i >= 0;) + for (int i = getNumChildComponents(); --i >= 0;) { - Drawable* const d = getDrawable(i); + const Drawable* const d = dynamic_cast (getChildComponent(i)); if (d != 0) - { - if (d->isTransformed()) - r = r.getUnion (d->getDrawableBounds().transformed (d->getTransform())); - else - r = r.getUnion (d->getDrawableBounds()); - } + r = r.getUnion (d->isTransformed() ? d->getDrawableBounds().transformed (d->getTransform()) + : d->getDrawableBounds()); } return r; @@ -86048,9 +86285,9 @@ const Rectangle DrawableComposite::getDrawableBounds() const void DrawableComposite::markerHasMoved() { - for (int i = getNumDrawables(); --i >= 0;) + for (int i = getNumChildComponents(); --i >= 0;) { - Drawable* const d = getDrawable(i); + Drawable* const d = dynamic_cast (getChildComponent(i)); if (d != 0) d->markerHasMoved(); @@ -86296,69 +86533,6 @@ ValueTree DrawableComposite::ValueTreeWrapper::getChildListCreating (UndoManager return state.getOrCreateChildWithName (childGroupTag, undoManager); } -int DrawableComposite::ValueTreeWrapper::getNumDrawables() const -{ - return getChildList().getNumChildren(); -} - -ValueTree DrawableComposite::ValueTreeWrapper::getDrawableState (int index) const -{ - return getChildList().getChild (index); -} - -ValueTree DrawableComposite::ValueTreeWrapper::getDrawableWithId (const String& objectId, bool recursive) const -{ - if (getID() == objectId) - return state; - - if (! recursive) - { - return getChildList().getChildWithProperty (idProperty, objectId); - } - else - { - const ValueTree childList (getChildList()); - - for (int i = getNumDrawables(); --i >= 0;) - { - const ValueTree& child = childList.getChild (i); - - if (child [Drawable::ValueTreeWrapperBase::idProperty] == objectId) - return child; - - if (child.hasType (DrawableComposite::valueTreeType)) - { - ValueTree v (DrawableComposite::ValueTreeWrapper (child).getDrawableWithId (objectId, true)); - - if (v.isValid()) - return v; - } - } - - return ValueTree::invalid; - } -} - -int DrawableComposite::ValueTreeWrapper::indexOfDrawable (const ValueTree& item) const -{ - return getChildList().indexOf (item); -} - -void DrawableComposite::ValueTreeWrapper::addDrawable (const ValueTree& newDrawableState, int index, UndoManager* undoManager) -{ - getChildListCreating (undoManager).addChild (newDrawableState, index, undoManager); -} - -void DrawableComposite::ValueTreeWrapper::moveDrawableOrder (int currentIndex, int newIndex, UndoManager* undoManager) -{ - getChildListCreating (undoManager).moveChild (currentIndex, newIndex, undoManager); -} - -void DrawableComposite::ValueTreeWrapper::removeDrawable (const ValueTree& child, UndoManager* undoManager) -{ - getChildList().removeChild (child, undoManager); -} - const RelativeParallelogram DrawableComposite::ValueTreeWrapper::getBoundingBox() const { return RelativeParallelogram (state.getProperty (topLeft, "0, 0"), @@ -86463,10 +86637,10 @@ void DrawableComposite::ValueTreeWrapper::removeMarker (bool xAxis, const ValueT getMarkerList (xAxis).removeChild (state, undoManager); } -void DrawableComposite::refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) +void DrawableComposite::refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder) { const ValueTreeWrapper wrapper (tree); - setName (wrapper.getID()); + setComponentID (wrapper.getID()); const RelativeParallelogram newBounds (wrapper.getBoundingBox()); if (bounds != newBounds) @@ -86506,50 +86680,27 @@ void DrawableComposite::refreshFromValueTree (const ValueTree& tree, ImageProvid *m = newMarker; } - // Remove deleted drawables.. - for (i = getNumDrawables(); --i >= wrapper.getNumDrawables();) - delete getDrawable(i); - - // Update drawables and add new ones.. - for (i = 0; i < wrapper.getNumDrawables(); ++i) - { - const ValueTree newDrawable (wrapper.getDrawableState (i)); - Drawable* d = getDrawable(i); - - if (d != 0) - { - if (newDrawable.hasType (d->getValueTreeType())) - { - d->refreshFromValueTree (newDrawable, imageProvider); - } - else - { - delete d; - d = 0; - } - } - - if (d == 0) - { - d = createChildFromValueTree (this, newDrawable, imageProvider); - addAndMakeVisible (d, i); - } - } + builder.updateChildComponents (*this, wrapper.getChildList()); refreshTransformFromBounds(); } -const ValueTree DrawableComposite::createValueTree (ImageProvider* imageProvider) const +const ValueTree DrawableComposite::createValueTree (ComponentBuilder::ImageProvider* imageProvider) const { ValueTree tree (valueTreeType); ValueTreeWrapper v (tree); - v.setID (getName(), 0); + v.setID (getComponentID()); v.setBoundingBox (bounds, 0); + ValueTree childList (v.getChildListCreating (0)); + int i; - for (i = 0; i < getNumDrawables(); ++i) - v.addDrawable (getDrawable(i)->createValueTree (imageProvider), -1, 0); + for (i = getNumChildComponents(); --i >= 0;) + { + const Drawable* const d = dynamic_cast (getChildComponent(i)); + childList.addChild (d->createValueTree (imageProvider), -1, 0); + } for (i = 0; i < markersX.size(); ++i) v.setMarker (true, *markersX.getUnchecked(i), 0); @@ -86753,10 +86904,10 @@ void DrawableImage::ValueTreeWrapper::setBoundingBox (const RelativeParallelogra state.setProperty (bottomLeft, newBounds.bottomLeft.toString(), undoManager); } -void DrawableImage::refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) +void DrawableImage::refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder) { const ValueTreeWrapper controller (tree); - setName (controller.getID()); + setComponentID (controller.getID()); const float newOpacity = controller.getOpacity(); const Colour newOverlayColour (controller.getOverlayColour()); @@ -86764,10 +86915,10 @@ void DrawableImage::refreshFromValueTree (const ValueTree& tree, ImageProvider* Image newImage; const var imageIdentifier (controller.getImageIdentifier()); - jassert (imageProvider != 0 || imageIdentifier.isVoid()); // if you're using images, you need to provide something that can load and save them! + jassert (builder.getImageProvider() != 0 || imageIdentifier.isVoid()); // if you're using images, you need to provide something that can load and save them! - if (imageProvider != 0) - newImage = imageProvider->getImageForIdentifier (imageIdentifier); + if (builder.getImageProvider() != 0) + newImage = builder.getImageProvider()->getImageForIdentifier (imageIdentifier); const RelativeParallelogram newBounds (controller.getBoundingBox()); @@ -86786,12 +86937,12 @@ void DrawableImage::refreshFromValueTree (const ValueTree& tree, ImageProvider* } } -const ValueTree DrawableImage::createValueTree (ImageProvider* imageProvider) const +const ValueTree DrawableImage::createValueTree (ComponentBuilder::ImageProvider* imageProvider) const { ValueTree tree (valueTreeType); ValueTreeWrapper v (tree); - v.setID (getName(), 0); + v.setID (getComponentID()); v.setOpacity (opacity, 0); v.setOverlayColour (overlayColour, 0); v.setBoundingBox (bounds, 0); @@ -87217,12 +87368,12 @@ void DrawablePath::ValueTreeWrapper::Element::removePoint (UndoManager* undoMana state.getParent().removeChild (state, undoManager); } -void DrawablePath::refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) +void DrawablePath::refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder) { ValueTreeWrapper v (tree); - setName (v.getID()); + setComponentID (v.getID()); - if (refreshFillTypes (v, getParent(), imageProvider)) + if (refreshFillTypes (v, getParent(), builder.getImageProvider())) repaint(); ScopedPointer newRelativePath (new RelativePointPath (tree)); @@ -87244,12 +87395,12 @@ void DrawablePath::refreshFromValueTree (const ValueTree& tree, ImageProvider* i relativePath = newRelativePath; } -const ValueTree DrawablePath::createValueTree (ImageProvider* imageProvider) const +const ValueTree DrawablePath::createValueTree (ComponentBuilder::ImageProvider* imageProvider) const { ValueTree tree (valueTreeType); ValueTreeWrapper v (tree); - v.setID (getName(), 0); + v.setID (getComponentID()); writeTo (v, imageProvider, 0); if (relativePath != 0) @@ -87379,12 +87530,12 @@ Value DrawableRectangle::ValueTreeWrapper::getCornerSizeValue (UndoManager* undo return state.getPropertyAsValue (cornerSize, undoManager); } -void DrawableRectangle::refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) +void DrawableRectangle::refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder) { ValueTreeWrapper v (tree); - setName (v.getID()); + setComponentID (v.getID()); - if (refreshFillTypes (v, getParent(), imageProvider)) + if (refreshFillTypes (v, getParent(), builder.getImageProvider())) repaint(); RelativeParallelogram newBounds (v.getRectangle()); @@ -87402,12 +87553,12 @@ void DrawableRectangle::refreshFromValueTree (const ValueTree& tree, ImageProvid } } -const ValueTree DrawableRectangle::createValueTree (ImageProvider* imageProvider) const +const ValueTree DrawableRectangle::createValueTree (ComponentBuilder::ImageProvider* imageProvider) const { ValueTree tree (valueTreeType); ValueTreeWrapper v (tree); - v.setID (getName(), 0); + v.setID (getComponentID()); writeTo (v, imageProvider, 0); v.setRectangle (bounds, 0); v.setCornerSize (cornerSize, 0); @@ -87624,10 +87775,10 @@ void DrawableText::ValueTreeWrapper::setFontSizeControlPoint (const RelativePoin state.setProperty (fontSizeAnchor, p.toString(), undoManager); } -void DrawableText::refreshFromValueTree (const ValueTree& tree, ImageProvider*) +void DrawableText::refreshFromValueTree (const ValueTree& tree, ComponentBuilder&) { ValueTreeWrapper v (tree); - setName (v.getID()); + setComponentID (v.getID()); const RelativeParallelogram newBounds (v.getBoundingBox()); const RelativePoint newFontPoint (v.getFontSizeControlPoint()); @@ -87649,12 +87800,12 @@ void DrawableText::refreshFromValueTree (const ValueTree& tree, ImageProvider*) } } -const ValueTree DrawableText::createValueTree (ImageProvider*) const +const ValueTree DrawableText::createValueTree (ComponentBuilder::ImageProvider*) const { ValueTree tree (valueTreeType); ValueTreeWrapper v (tree); - v.setID (getName(), 0); + v.setID (getComponentID()); v.setText (text, 0); v.setFont (font, 0); v.setJustification (justification, 0); @@ -87798,7 +87949,7 @@ private: else if (e->hasTagName ("switch")) d = parseSwitch (*e); else if (e->hasTagName ("style")) parseCSSStyle (*e); - parentDrawable->insertDrawable (d); + parentDrawable->addAndMakeVisible (d); } } @@ -241142,8 +241293,6 @@ extern bool juce_IsRunningInWine(); #define AC_SRC_ALPHA 0x01 #endif -static HPALETTE palette = 0; -static bool createPaletteIfNeeded = true; static bool shouldDeactivateTitleBar = true; #define WM_TRAYNOTIFY WM_USER + 100 @@ -241332,25 +241481,6 @@ public: hdd = DrawDibOpen(); } - if (createPaletteIfNeeded) - { - HDC dc = GetDC (0); - const int n = GetDeviceCaps (dc, BITSPIXEL); - ReleaseDC (0, dc); - - if (n <= 8) - palette = CreateHalftonePalette (dc); - - createPaletteIfNeeded = false; - } - - if (palette != 0) - { - SelectPalette (dc, palette, FALSE); - RealizePalette (dc); - SetStretchBltMode (dc, HALFTONE); - } - SetMapMode (dc, MM_TEXT); if (transparent) @@ -243257,13 +243387,8 @@ private: case WM_SYNCPAINT: return 0; - case WM_PALETTECHANGED: - InvalidateRect (h, 0, 0); - break; - case WM_DISPLAYCHANGE: InvalidateRect (h, 0, 0); - createPaletteIfNeeded = true; // intentional fall-through... case WM_SETTINGCHANGE: // note the fall-through in the previous case! doSettingChange(); diff --git a/juce_amalgamated.h b/juce_amalgamated.h index 0d2757f485..b3db2466bd 100644 --- a/juce_amalgamated.h +++ b/juce_amalgamated.h @@ -50,6 +50,15 @@ */ +/* This line is here just to help catch syntax errors caused by mistakes in other header + files that are included before juce.h. If you hit an error at this line, it must be some + kind of syntax problem in whatever code immediately precedes this header. + + This also acts as a sanity-check in case you're trying to build with a C or obj-C compiler + rather than a proper C++ one. +*/ +namespace JuceDummyNamespace {} + #define JUCE_PUBLIC_INCLUDES 1 // (this includes things that need defining outside of the JUCE namespace) @@ -64,7 +73,7 @@ */ #define JUCE_MAJOR_VERSION 1 #define JUCE_MINOR_VERSION 53 -#define JUCE_BUILDNUMBER 1 +#define JUCE_BUILDNUMBER 2 /** Current Juce version number. @@ -623,15 +632,17 @@ #endif #ifndef DOXYGEN + BEGIN_JUCE_NAMESPACE template struct JuceStaticAssert; template <> struct JuceStaticAssert { static void dummy() {} }; + END_JUCE_NAMESPACE #endif /** A compile-time assertion macro. If the expression parameter is false, the macro will cause a compile error. */ -#define static_jassert(expression) JuceStaticAssert::dummy(); +#define static_jassert(expression) JUCE_NAMESPACE::JuceStaticAssert::dummy(); /** This is a shorthand macro for declaring stubs for a class's copy constructor and operator=. @@ -26910,7 +26921,7 @@ public: @see setName */ - const String& getName() const throw() { return componentName_; } + const String& getName() const throw() { return componentName; } /** Sets the name of this component. @@ -27086,7 +27097,7 @@ public: bounds will no longer be a direct reflection of the position at which it appears within its parent, as the transform will be applied to its bounding box. */ - inline int getX() const throw() { return bounds_.getX(); } + inline int getX() const throw() { return bounds.getX(); } /** Returns the y coordinate of the top of this component. This is a distance in pixels from the top edge of the component's parent. @@ -27095,13 +27106,13 @@ public: bounds will no longer be a direct reflection of the position at which it appears within its parent, as the transform will be applied to its bounding box. */ - inline int getY() const throw() { return bounds_.getY(); } + inline int getY() const throw() { return bounds.getY(); } /** Returns the component's width in pixels. */ - inline int getWidth() const throw() { return bounds_.getWidth(); } + inline int getWidth() const throw() { return bounds.getWidth(); } /** Returns the component's height in pixels. */ - inline int getHeight() const throw() { return bounds_.getHeight(); } + inline int getHeight() const throw() { return bounds.getHeight(); } /** Returns the x coordinate of the component's right-hand edge. This is a distance in pixels from the left edge of the component's parent. @@ -27110,10 +27121,10 @@ public: bounds will no longer be a direct reflection of the position at which it appears within its parent, as the transform will be applied to its bounding box. */ - int getRight() const throw() { return bounds_.getRight(); } + int getRight() const throw() { return bounds.getRight(); } /** Returns the component's top-left position as a Point. */ - const Point getPosition() const throw() { return bounds_.getPosition(); } + const Point getPosition() const throw() { return bounds.getPosition(); } /** Returns the y coordinate of the bottom edge of this component. This is a distance in pixels from the top edge of the component's parent. @@ -27122,7 +27133,7 @@ public: bounds will no longer be a direct reflection of the position at which it appears within its parent, as the transform will be applied to its bounding box. */ - int getBottom() const throw() { return bounds_.getBottom(); } + int getBottom() const throw() { return bounds.getBottom(); } /** Returns this component's bounding box. The rectangle returned is relative to the top-left of the component's parent. @@ -27131,7 +27142,7 @@ public: bounds will no longer be a direct reflection of the position at which it appears within its parent, as the transform will be applied to its bounding box. */ - const Rectangle& getBounds() const throw() { return bounds_; } + const Rectangle& getBounds() const throw() { return bounds; } /** Returns the component's bounds, relative to its own origin. This is like getBounds(), but returns the rectangle in local coordinates, In practice, it'll @@ -27510,7 +27521,7 @@ public: If this is the highest-level component or hasn't yet been added to a parent, this will return null. */ - Component* getParentComponent() const throw() { return parentComponent_; } + Component* getParentComponent() const throw() { return parentComponent; } /** Searches the parent components for a component of a specified class. @@ -27524,14 +27535,14 @@ public: TargetClass* findParentComponentOfClass (TargetClass* const dummyParameter = 0) const { (void) dummyParameter; - Component* p = parentComponent_; + Component* p = parentComponent; while (p != 0) { TargetClass* target = dynamic_cast (p); if (target != 0) return target; - p = p->parentComponent_; + p = p->parentComponent; } return 0; @@ -27820,7 +27831,7 @@ public: @see setComponentEffect */ - ImageEffectFilter* getComponentEffect() const throw() { return effect_; } + ImageEffectFilter* getComponentEffect() const throw() { return effect; } /** Finds the appropriate look-and-feel to use for this component. @@ -28851,7 +28862,7 @@ public: WeakReference weakRef; }; - /** A class to keep an eye on one or two components and check for them being deleted. + /** A class to keep an eye on a component and check for it being deleted. This is designed for use with the ListenerList::callChecked() methods, to allow the list iterator to stop cleanly if the component is deleted by a listener callback @@ -28861,16 +28872,13 @@ public: { public: /** Creates a checker that watches one component. */ - BailOutChecker (Component* component1); - - /** Creates a checker that watches two components. */ - BailOutChecker (Component* component1, Component* component2); + BailOutChecker (Component* component); /** Returns true if either of the two components have been deleted since this object was created. */ bool shouldBailOut() const throw(); private: - const WeakReference safePointer1, safePointer2; + const WeakReference safePointer; JUCE_DECLARE_NON_COPYABLE (BailOutChecker); }; @@ -28890,28 +28898,27 @@ public: private: friend class ComponentPeer; - friend class InternalDragRepeater; friend class MouseInputSource; friend class MouseInputSourceInternal; #ifndef DOXYGEN static Component* currentlyFocusedComponent; - String componentName_, componentID; - Component* parentComponent_; - Rectangle bounds_; - ScopedPointer affineTransform_; - Array childComponentList_; - LookAndFeel* lookAndFeel_; - MouseCursor cursor_; - ImageEffectFilter* effect_; - Image bufferedImage_; + String componentName, componentID; + Component* parentComponent; + Rectangle bounds; + ScopedPointer affineTransform; + Array childComponentList; + LookAndFeel* lookAndFeel; + MouseCursor cursor; + ImageEffectFilter* effect; + Image bufferedImage; class MouseListenerList; friend class MouseListenerList; friend class ScopedPointer ; - ScopedPointer mouseListeners_; - ScopedPointer > keyListeners_; + ScopedPointer mouseListeners; + ScopedPointer > keyListeners; ListenerList componentListeners; NamedValueSet properties; @@ -28947,7 +28954,7 @@ private: union { - uint32 componentFlags_; + uint32 componentFlags; ComponentFlags flags; }; @@ -45674,6 +45681,165 @@ public: #endif // __JUCE_RELATIVECOORDINATE_JUCEHEADER__ /*** End of inlined file: juce_RelativeCoordinate.h ***/ + +/*** Start of inlined file: juce_ComponentBuilder.h ***/ +#ifndef __JUCE_COMPONENTBUILDER_JUCEHEADER__ +#define __JUCE_COMPONENTBUILDER_JUCEHEADER__ + +/** + Loads and maintains a tree of Components from a ValueTree that represents them. + + To allow the state of a tree of components to be saved as a ValueTree and re-loaded, + this class lets you register a set of type-handlers for the different components that + are involved, and then uses these types to re-create a set of components from its + stored state. + + Essentially, to use this, you need to create a ComponentBuilder with your ValueTree, + then use registerTypeHandler() to give it a set of type handlers that can cope with + all the items in your tree. Then you can call getComponent() to build the component. + Once you've got the component you can either take it and delete the ComponentBuilder + object, or if you keep the ComponentBuilder around, it'll monitor any changes in the + ValueTree and automatically update the component to reflect these changes. +*/ +class JUCE_API ComponentBuilder : public ValueTree::Listener +{ +public: + /** + */ + explicit ComponentBuilder (const ValueTree& state); + + /** Destructor. */ + ~ComponentBuilder(); + + /** + */ + ValueTree& getState() throw() { return state; } + + /** + */ + const ValueTree& getState() const throw() { return state; } + + /** + */ + Component* getComponent(); + + /** + */ + Component* getAndReleaseComponent(); + + /** + */ + class JUCE_API TypeHandler + { + public: + /** + */ + explicit TypeHandler (const Identifier& valueTreeType); + + /** Destructor. */ + virtual ~TypeHandler(); + + /** + */ + const Identifier& getType() const throw() { return valueTreeType; } + + /** + */ + virtual Component* addNewComponentFromState (const ValueTree& state, Component* parent) = 0; + + /** + */ + virtual void updateComponentFromState (Component* component, const ValueTree& state) = 0; + + /** + */ + ComponentBuilder* getBuilder() const throw(); + + private: + friend class ComponentBuilder; + ComponentBuilder* builder; + const Identifier valueTreeType; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TypeHandler); + }; + + /** + */ + void registerTypeHandler (TypeHandler* type); + + /** + */ + TypeHandler* getHandlerForState (const ValueTree& state) const; + + /** + */ + int getNumHandlers() const throw(); + + /** + */ + TypeHandler* getHandler (int index) const throw(); + + /** This class is used when loading Drawables that contain images, and retrieves + the image for a stored identifier. + @see Drawable::createFromValueTree + */ + class JUCE_API ImageProvider + { + public: + ImageProvider() {} + virtual ~ImageProvider() {} + + /** Retrieves the image associated with this identifier, which could be any + kind of string, number, filename, etc. + + The image that is returned will be owned by the caller, but it may come + from the ImageCache. + */ + virtual const Image getImageForIdentifier (const var& imageIdentifier) = 0; + + /** Returns an identifier to be used to refer to a given image. + This is used when converting a drawable into a ValueTree, so if you're + only loading drawables, you can just return a var::null here. + */ + virtual const var getIdentifierForImage (const Image& image) = 0; + }; + + /** */ + void setImageProvider (ImageProvider* newImageProvider) throw(); + + /** */ + ImageProvider* getImageProvider() const throw(); + + /** @internal */ + void valueTreePropertyChanged (ValueTree& treeWhosePropertyHasChanged, const Identifier& property); + /** @internal */ + void valueTreeChildrenChanged (ValueTree& treeWhoseChildHasChanged); + /** @internal */ + void valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged); + + /** + */ + void updateChildComponents (Component& parent, const ValueTree& children); + + /** + */ + static const Identifier idProperty; + +private: + + ValueTree state; + OwnedArray types; + ScopedPointer component; + ImageProvider* imageProvider; + + void updateComponent (const ValueTree& state); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComponentBuilder); +}; + +#endif // __JUCE_COMPONENTBUILDER_JUCEHEADER__ +/*** End of inlined file: juce_ComponentBuilder.h ***/ + class DrawableComposite; /** @@ -45793,54 +45959,20 @@ public: */ static Drawable* createFromSVG (const XmlElement& svgDocument); - /** This class is used when loading Drawables that contain images, and retrieves - the image for a stored identifier. - @see Drawable::createFromValueTree - */ - class JUCE_API ImageProvider - { - public: - ImageProvider() {} - virtual ~ImageProvider() {} - - /** Retrieves the image associated with this identifier, which could be any - kind of string, number, filename, etc. - - The image that is returned will be owned by the caller, but it may come - from the ImageCache. - */ - virtual const Image getImageForIdentifier (const var& imageIdentifier) = 0; - - /** Returns an identifier to be used to refer to a given image. - This is used when converting a drawable into a ValueTree, so if you're - only loading drawables, you can just return a var::null here. - */ - virtual const var getIdentifierForImage (const Image& image) = 0; - }; - /** Tries to create a Drawable from a previously-saved ValueTree. The ValueTree must have been created by the createValueTree() method. If there are any images used within the drawable, you'll need to provide a valid ImageProvider object that can be used to retrieve these images from whatever type of identifier is used to represent them. */ - static Drawable* createFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); - - /** Tries to refresh a Drawable from the same ValueTree that was used to create it. - @returns the damage rectangle that will need repainting due to any changes that were made. - */ - virtual void refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) = 0; + static Drawable* createFromValueTree (const ValueTree& tree, ComponentBuilder::ImageProvider* imageProvider); /** Creates a ValueTree to represent this Drawable. - The VarTree that is returned can be turned back into a Drawable with - createFromValueTree(). - If there are any images used in this drawable, you'll need to provide a valid - ImageProvider object that can be used to create storable representations of them. + The ValueTree that is returned can be turned back into a Drawable with createFromValueTree(). + If there are any images used in this drawable, you'll need to provide a valid ImageProvider + object that can be used to create storable representations of them. */ - virtual const ValueTree createValueTree (ImageProvider* imageProvider) const = 0; - - /** Returns the tag ID that is used for a ValueTree that stores this type of drawable. */ - virtual const Identifier getValueTreeType() const = 0; + virtual const ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const = 0; /** Returns the area that this drawble covers. The result is expressed in this drawable's own coordinate space, and does not take @@ -45858,19 +45990,18 @@ public: ValueTree& getState() throw() { return state; } const String getID() const; - void setID (const String& newID, UndoManager* undoManager); - static const Identifier idProperty; + void setID (const String& newID); ValueTree state; }; + static void registerDrawableTypes (ComponentBuilder& componentBuilder); + protected: friend class DrawableComposite; friend class DrawableShape; - /** @internal */ - static Drawable* createChildFromValueTree (DrawableComposite* parent, const ValueTree& tree, ImageProvider* imageProvider); /** @internal */ void transformContextToCorrectOrigin (Graphics& g); /** @internal */ @@ -51035,6 +51166,9 @@ public: /** Refreshes the directory that's currently being listed. */ void refresh(); + /** Changes the filter that's being used to sift the files. */ + void setFileFilter (const FileFilter* newFileFilter); + /** Returns a verb to describe what should happen when the file is accepted. E.g. if browsing in "load file" mode, this will be "Open", if in "save file" @@ -51089,7 +51223,10 @@ public: FilePreviewComponent* getPreviewComponent() const throw(); protected: - virtual const BigInteger getRoots (StringArray& rootNames, StringArray& rootPaths); + /** Returns a list of names and paths for the default places the user might want to look. + Use an empty string to indicate a section break. + */ + virtual void getRoots (StringArray& rootNames, StringArray& rootPaths); private: @@ -51593,6 +51730,15 @@ public: int minimumWhenOffTheBottom, int minimumWhenOffTheRight) throw(); + /** Returns the minimum distance the bounds can be off-screen. @see setMinimumOnscreenAmounts */ + int getMinimumWhenOffTheTop() const throw() { return minOffTop; } + /** Returns the minimum distance the bounds can be off-screen. @see setMinimumOnscreenAmounts */ + int getMinimumWhenOffTheLeft() const throw() { return minOffLeft; } + /** Returns the minimum distance the bounds can be off-screen. @see setMinimumOnscreenAmounts */ + int getMinimumWhenOffTheBottom() const throw() { return minOffBottom; } + /** Returns the minimum distance the bounds can be off-screen. @see setMinimumOnscreenAmounts */ + int getMinimumWhenOffTheRight() const throw() { return minOffRight; } + /** Specifies a width-to-height ratio that the resizer should always maintain. If the value is 0, no aspect ratio is enforced. If it's non-zero, the width @@ -52204,6 +52350,16 @@ public: */ void setContentComponentSize (int width, int height); + /** Returns the width of the frame to use around the window. + @see getContentComponentBorder + */ + virtual const BorderSize getBorderThickness(); + + /** Returns the insets to use when positioning the content component. + @see getBorderThickness + */ + virtual const BorderSize getContentComponentBorder(); + /** A set of colour IDs to use to change the colour of various aspects of the window. These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() @@ -52241,18 +52397,6 @@ protected: /** @internal */ int getDesktopWindowStyleFlags() const; - /** Returns the width of the border to use around the window. - - @see getContentComponentBorder - */ - virtual const BorderSize getBorderThickness(); - - /** Returns the insets to use when positioning the content component. - - @see getBorderThickness - */ - virtual const BorderSize getContentComponentBorder(); - #if JUCE_DEBUG /** Overridden to warn people about adding components directly to this component instead of using setContentComponent(). @@ -53604,6 +53748,9 @@ private: #endif #ifndef __JUCE_COMPONENTBOUNDSCONSTRAINER_JUCEHEADER__ +#endif +#ifndef __JUCE_COMPONENTBUILDER_JUCEHEADER__ + #endif #ifndef __JUCE_COMPONENTMOVEMENTWATCHER_JUCEHEADER__ @@ -61217,74 +61364,6 @@ public: /** Destructor. */ ~DrawableComposite(); - /** Adds a new sub-drawable to this one. - - This passes in a Drawable pointer for this object to look after. To add a copy - of a drawable, use the form of this method that takes a Drawable reference instead. - - @param drawable the object to add - this will be deleted automatically - when no longer needed, so the caller mustn't keep any - pointers to it. - @param index where to insert it in the list of drawables. 0 is the back, - -1 is the front, or any value from 0 and getNumDrawables() - can be used - @see removeDrawable - */ - void insertDrawable (Drawable* drawable, int index = -1); - - /** Adds a new sub-drawable to this one. - - This takes a copy of a Drawable and adds it to this object. To pass in a Drawable - for this object to look after, use the form of this method that takes a Drawable - pointer instead. - - @param drawable the object to add - an internal copy will be made of this object - @param index where to insert it in the list of drawables. 0 is the back, - -1 is the front, or any value from 0 and getNumDrawables() - can be used - @see removeDrawable - */ - void insertDrawable (const Drawable& drawable, int index = -1); - - /** Deletes one of the Drawable objects. - - @param index the index of the drawable to delete, between 0 - and (getNumDrawables() - 1). - @param deleteDrawable if this is true, the drawable that is removed will also - be deleted. If false, it'll just be removed. - @see insertDrawable, getNumDrawables - */ - void removeDrawable (int index, bool deleteDrawable = true); - - /** Returns the number of drawables contained inside this one. - - @see getDrawable - */ - int getNumDrawables() const throw(); - - /** Returns one of the drawables that are contained in this one. - - Each drawable also has a transform associated with it - you can use getDrawableTransform() - to find it. - - The pointer returned is managed by this object and will be deleted when no longer - needed, so be careful what you do with it. - - @see getNumDrawables - */ - Drawable* getDrawable (int index) const; - - /** Looks for a child drawable with the specified name. */ - Drawable* getDrawableWithName (const String& name) const throw(); - - /** Brings one of the Drawables to the front. - - @param index the index of the drawable to move, between 0 - and (getNumDrawables() - 1). - @see insertDrawable, getNumDrawables - */ - void bringToFront (int index); - /** Sets the parallelogram that defines the target position of the content rectangle when the drawable is rendered. @see setContentArea */ @@ -61349,14 +61428,12 @@ public: /** @internal */ Drawable* createCopy() const; /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); + void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); /** @internal */ - const ValueTree createValueTree (ImageProvider* imageProvider) const; + const ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; /** @internal */ static const Identifier valueTreeType; /** @internal */ - const Identifier getValueTreeType() const { return valueTreeType; } - /** @internal */ const Expression getSymbolValue (const String& symbol, const String& member) const; /** @internal */ const Rectangle getDrawableBounds() const; @@ -61375,13 +61452,8 @@ public: public: ValueTreeWrapper (const ValueTree& state); - int getNumDrawables() const; - ValueTree getDrawableState (int index) const; - ValueTree getDrawableWithId (const String& objectId, bool recursive) const; - int indexOfDrawable (const ValueTree& item) const; - void addDrawable (const ValueTree& newDrawableState, int index, UndoManager* undoManager); - void moveDrawableOrder (int currentIndex, int newIndex, UndoManager* undoManager); - void removeDrawable (const ValueTree& child, UndoManager* undoManager); + ValueTree getChildList() const; + ValueTree getChildListCreating (UndoManager* undoManager); const RelativeParallelogram getBoundingBox() const; void setBoundingBox (const RelativeParallelogram& newBounds, UndoManager* undoManager); @@ -61403,8 +61475,6 @@ public: private: static const Identifier childGroupTag, markerGroupTagX, markerGroupTagY, markerTag; - ValueTree getChildList() const; - ValueTree getChildListCreating (UndoManager* undoManager); ValueTree getMarkerList (bool xAxis) const; ValueTree getMarkerListCreating (bool xAxis, UndoManager* undoManager); }; @@ -61492,13 +61562,11 @@ public: /** @internal */ const Rectangle getDrawableBounds() const; /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); + void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); /** @internal */ - const ValueTree createValueTree (ImageProvider* imageProvider) const; + const ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; /** @internal */ static const Identifier valueTreeType; - /** @internal */ - const Identifier getValueTreeType() const { return valueTreeType; } /** Internally-used class for wrapping a DrawableImage's state into a ValueTree. */ class ValueTreeWrapper : public Drawable::ValueTreeWrapperBase @@ -61615,18 +61683,18 @@ public: FillAndStrokeState (const ValueTree& state); const FillType getMainFill (Expression::EvaluationContext* nameFinder, - ImageProvider* imageProvider) const; + ComponentBuilder::ImageProvider* imageProvider) const; ValueTree getMainFillState(); void setMainFill (const FillType& newFill, const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, const RelativePoint* gradientPoint3, - ImageProvider* imageProvider, UndoManager* undoManager); + ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager); const FillType getStrokeFill (Expression::EvaluationContext* nameFinder, - ImageProvider* imageProvider) const; + ComponentBuilder::ImageProvider* imageProvider) const; ValueTree getStrokeFillState(); void setStrokeFill (const FillType& newFill, const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, const RelativePoint* gradientPoint3, - ImageProvider* imageProvider, UndoManager* undoManager); + ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager); const PathStrokeType getStrokeType() const; void setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager); @@ -61634,11 +61702,11 @@ public: static const FillType readFillType (const ValueTree& v, RelativePoint* gradientPoint1, RelativePoint* gradientPoint2, RelativePoint* gradientPoint3, Expression::EvaluationContext* nameFinder, - ImageProvider* imageProvider); + ComponentBuilder::ImageProvider* imageProvider); static void writeFillType (ValueTree& v, const FillType& fillType, const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, - const RelativePoint* gradientPoint3, ImageProvider* imageProvider, + const RelativePoint* gradientPoint3, ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager); static const Identifier type, colour, colours, fill, stroke, path, jointStyle, capStyle, strokeWidth, @@ -61668,10 +61736,10 @@ protected: /** Updates the details from a FillAndStrokeState object, returning true if something changed. */ bool refreshFillTypes (const FillAndStrokeState& newState, Expression::EvaluationContext* nameFinder, - ImageProvider* imageProvider); + ComponentBuilder::ImageProvider* imageProvider); /** Writes the stroke and fill details to a FillAndStrokeState object. */ - void writeTo (FillAndStrokeState& state, ImageProvider* imageProvider, UndoManager* undoManager) const; + void writeTo (FillAndStrokeState& state, ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager) const; PathStrokeType strokeType; Path path, strokePath; @@ -61717,13 +61785,11 @@ public: /** @internal */ Drawable* createCopy() const; /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); + void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); /** @internal */ - const ValueTree createValueTree (ImageProvider* imageProvider) const; + const ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; /** @internal */ static const Identifier valueTreeType; - /** @internal */ - const Identifier getValueTreeType() const { return valueTreeType; } /** Internally-used class for wrapping a DrawablePath's state into a ValueTree. */ class ValueTreeWrapper : public DrawableShape::FillAndStrokeState @@ -61831,13 +61897,11 @@ public: /** @internal */ Drawable* createCopy() const; /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); + void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); /** @internal */ - const ValueTree createValueTree (ImageProvider* imageProvider) const; + const ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; /** @internal */ static const Identifier valueTreeType; - /** @internal */ - const Identifier getValueTreeType() const { return valueTreeType; } /** Internally-used class for wrapping a DrawableRectangle's state into a ValueTree. */ class ValueTreeWrapper : public DrawableShape::FillAndStrokeState @@ -61940,14 +62004,12 @@ public: /** @internal */ Drawable* createCopy() const; /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); + void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); /** @internal */ - const ValueTree createValueTree (ImageProvider* imageProvider) const; + const ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; /** @internal */ static const Identifier valueTreeType; /** @internal */ - const Identifier getValueTreeType() const { return valueTreeType; } - /** @internal */ const Rectangle getDrawableBounds() const; /** Internally-used class for wrapping a DrawableText's state into a ValueTree. */ diff --git a/src/core/juce_PlatformDefs.h b/src/core/juce_PlatformDefs.h index 51892a6370..f65da86719 100644 --- a/src/core/juce_PlatformDefs.h +++ b/src/core/juce_PlatformDefs.h @@ -145,15 +145,17 @@ //============================================================================== #ifndef DOXYGEN + BEGIN_JUCE_NAMESPACE template struct JuceStaticAssert; template <> struct JuceStaticAssert { static void dummy() {} }; + END_JUCE_NAMESPACE #endif /** A compile-time assertion macro. If the expression parameter is false, the macro will cause a compile error. */ -#define static_jassert(expression) JuceStaticAssert::dummy(); +#define static_jassert(expression) JUCE_NAMESPACE::JuceStaticAssert::dummy(); /** This is a shorthand macro for declaring stubs for a class's copy constructor and operator=. diff --git a/src/core/juce_StandardHeader.h b/src/core/juce_StandardHeader.h index 9bae282d74..6653845508 100644 --- a/src/core/juce_StandardHeader.h +++ b/src/core/juce_StandardHeader.h @@ -33,7 +33,7 @@ */ #define JUCE_MAJOR_VERSION 1 #define JUCE_MINOR_VERSION 53 -#define JUCE_BUILDNUMBER 1 +#define JUCE_BUILDNUMBER 2 /** Current Juce version number. diff --git a/src/gui/components/filebrowser/juce_FileBrowserComponent.cpp b/src/gui/components/filebrowser/juce_FileBrowserComponent.cpp index 0a7f5f859b..79cce2f019 100644 --- a/src/gui/components/filebrowser/juce_FileBrowserComponent.cpp +++ b/src/gui/components/filebrowser/juce_FileBrowserComponent.cpp @@ -103,14 +103,14 @@ FileBrowserComponent::FileBrowserComponent (int flags_, currentPathBox.setEditableText (true); StringArray rootNames, rootPaths; - const BigInteger separators (getRoots (rootNames, rootPaths)); + getRoots (rootNames, rootPaths); for (int i = 0; i < rootNames.size(); ++i) { - if (separators [i]) + if (rootNames[i].isEmpty()) currentPathBox.addSeparator(); - - currentPathBox.addItem (rootNames[i], i + 1); + else + currentPathBox.addItem (rootNames[i], i + 1); } currentPathBox.addSeparator(); @@ -213,7 +213,8 @@ bool FileBrowserComponent::isDirectorySuitable (const File&) const bool FileBrowserComponent::isFileOrDirSuitable (const File& f) const { if (f.isDirectory()) - return (flags & canSelectDirectories) != 0 && (fileFilter == 0 || fileFilter->isDirectorySuitable (f)); + return (flags & canSelectDirectories) != 0 + && (fileFilter == 0 || fileFilter->isDirectorySuitable (f)); return (flags & canSelectFiles) != 0 && f.exists() && (fileFilter == 0 || fileFilter->isFileSuitable (f)); @@ -280,6 +281,15 @@ void FileBrowserComponent::refresh() fileList->refresh(); } +void FileBrowserComponent::setFileFilter (const FileFilter* const newFileFilter) +{ + if (fileFilter != newFileFilter) + { + fileFilter = newFileFilter; + refresh(); + } +} + const String FileBrowserComponent::getActionVerb() const { return isSaveMode() ? TRANS("Save") : TRANS("Open"); @@ -427,7 +437,6 @@ void FileBrowserComponent::buttonClicked (Button*) goUp(); } - void FileBrowserComponent::comboBoxChanged (ComboBox*) { const String newText (currentPathBox.getText().trim().unquoted()); @@ -464,10 +473,8 @@ void FileBrowserComponent::comboBoxChanged (ComboBox*) } } -const BigInteger FileBrowserComponent::getRoots (StringArray& rootNames, StringArray& rootPaths) +void FileBrowserComponent::getRoots (StringArray& rootNames, StringArray& rootPaths) { - BigInteger separators; - #if JUCE_WINDOWS Array roots; File::findFileSystemRoots (roots); @@ -497,7 +504,8 @@ const BigInteger FileBrowserComponent::getRoots (StringArray& rootNames, StringA rootNames.add (name); } - separators.setBit (rootPaths.size()); + rootPaths.add (String::empty); + rootNames.add (String::empty); rootPaths.add (File::getSpecialLocation (File::userDocumentsDirectory).getFullPathName()); rootNames.add ("Documents"); @@ -513,7 +521,8 @@ const BigInteger FileBrowserComponent::getRoots (StringArray& rootNames, StringA rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName()); rootNames.add ("Desktop"); - separators.setBit (rootPaths.size()); + rootPaths.add (String::empty); + rootNames.add (String::empty); Array volumes; File vol ("/Volumes"); @@ -539,8 +548,6 @@ const BigInteger FileBrowserComponent::getRoots (StringArray& rootNames, StringA rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName()); rootNames.add ("Desktop"); #endif - - return separators; } diff --git a/src/gui/components/filebrowser/juce_FileBrowserComponent.h b/src/gui/components/filebrowser/juce_FileBrowserComponent.h index c7896efb70..af029614a3 100644 --- a/src/gui/components/filebrowser/juce_FileBrowserComponent.h +++ b/src/gui/components/filebrowser/juce_FileBrowserComponent.h @@ -29,7 +29,6 @@ #include "juce_DirectoryContentsDisplayComponent.h" #include "juce_FilePreviewComponent.h" #include "../../../io/files/juce_File.h" -#include "../../../maths/juce_BigInteger.h" #include "../controls/juce_TextEditor.h" #include "../controls/juce_ComboBox.h" #include "../buttons/juce_DrawableButton.h" @@ -148,6 +147,9 @@ public: /** Refreshes the directory that's currently being listed. */ void refresh(); + /** Changes the filter that's being used to sift the files. */ + void setFileFilter (const FileFilter* newFileFilter); + /** Returns a verb to describe what should happen when the file is accepted. E.g. if browsing in "load file" mode, this will be "Open", if in "save file" @@ -205,7 +207,10 @@ public: FilePreviewComponent* getPreviewComponent() const throw(); protected: - virtual const BigInteger getRoots (StringArray& rootNames, StringArray& rootPaths); + /** Returns a list of names and paths for the default places the user might want to look. + Use an empty string to indicate a section break. + */ + virtual void getRoots (StringArray& rootNames, StringArray& rootPaths); private: //============================================================================== diff --git a/src/gui/components/juce_Component.cpp b/src/gui/components/juce_Component.cpp index 11a89157ef..a6b2a74685 100644 --- a/src/gui/components/juce_Component.cpp +++ b/src/gui/components/juce_Component.cpp @@ -58,10 +58,6 @@ public: { } - ~MouseListenerList() - { - } - void addListener (MouseListener* const newListener, const bool wantsEventsForAllNestedChildComponents) { if (! listeners.contains (newListener)) @@ -91,14 +87,14 @@ public: } } - static void sendMouseEvent (Component* comp, BailOutChecker& checker, + static void sendMouseEvent (Component& comp, BailOutChecker& checker, void (MouseListener::*eventMethod) (const MouseEvent&), const MouseEvent& e) { if (checker.shouldBailOut()) return; { - MouseListenerList* const list = comp->mouseListeners_; + MouseListenerList* const list = comp.mouseListeners; if (list != 0) { @@ -114,15 +110,15 @@ public: } } - Component* p = comp->parentComponent_; + Component* p = comp.parentComponent; while (p != 0) { - MouseListenerList* const list = p->mouseListeners_; + MouseListenerList* const list = p->mouseListeners; if (list != 0 && list->numDeepMouseListeners > 0) { - BailOutChecker checker2 (comp, p); + BailOutChecker2 checker2 (checker, p); for (int i = list->numDeepMouseListeners; --i >= 0;) { @@ -135,42 +131,37 @@ public: } } - p = p->parentComponent_; + p = p->parentComponent; } } - static void sendWheelEvent (Component* comp, BailOutChecker& checker, const MouseEvent& e, + static void sendWheelEvent (Component& comp, BailOutChecker& checker, const MouseEvent& e, const float wheelIncrementX, const float wheelIncrementY) { - if (checker.shouldBailOut()) - return; + MouseListenerList* const list = comp.mouseListeners; + if (list != 0) { - MouseListenerList* const list = comp->mouseListeners_; - - if (list != 0) + for (int i = list->listeners.size(); --i >= 0;) { - for (int i = list->listeners.size(); --i >= 0;) - { - list->listeners.getUnchecked(i)->mouseWheelMove (e, wheelIncrementX, wheelIncrementY); + list->listeners.getUnchecked(i)->mouseWheelMove (e, wheelIncrementX, wheelIncrementY); - if (checker.shouldBailOut()) - return; + if (checker.shouldBailOut()) + return; - i = jmin (i, list->listeners.size()); - } + i = jmin (i, list->listeners.size()); } } - Component* p = comp->parentComponent_; + Component* p = comp.parentComponent; while (p != 0) { - MouseListenerList* const list = p->mouseListeners_; + MouseListenerList* const list = p->mouseListeners; if (list != 0 && list->numDeepMouseListeners > 0) { - BailOutChecker checker2 (comp, p); + BailOutChecker2 checker2 (checker, p); for (int i = list->numDeepMouseListeners; --i >= 0;) { @@ -183,7 +174,7 @@ public: } } - p = p->parentComponent_; + p = p->parentComponent; } } @@ -191,6 +182,26 @@ private: Array listeners; int numDeepMouseListeners; + class BailOutChecker2 + { + public: + BailOutChecker2 (BailOutChecker& checker_, Component* const component) + : checker (checker_), safePointer (component) + { + } + + bool shouldBailOut() const throw() + { + return checker.shouldBailOut() || safePointer == 0; + } + + private: + BailOutChecker& checker; + const WeakReference safePointer; + + JUCE_DECLARE_NON_COPYABLE (BailOutChecker2); + }; + JUCE_DECLARE_NON_COPYABLE (MouseListenerList); }; @@ -223,34 +234,34 @@ public: static const Point convertFromParentSpace (const Component& comp, const Point& pointInParentSpace) { - if (comp.affineTransform_ == 0) + if (comp.affineTransform == 0) return pointInParentSpace - comp.getPosition(); - return pointInParentSpace.toFloat().transformedBy (comp.affineTransform_->inverted()).toInt() - comp.getPosition(); + return pointInParentSpace.toFloat().transformedBy (comp.affineTransform->inverted()).toInt() - comp.getPosition(); } static const Rectangle convertFromParentSpace (const Component& comp, const Rectangle& areaInParentSpace) { - if (comp.affineTransform_ == 0) + if (comp.affineTransform == 0) return areaInParentSpace - comp.getPosition(); - return areaInParentSpace.toFloat().transformed (comp.affineTransform_->inverted()).getSmallestIntegerContainer() - comp.getPosition(); + return areaInParentSpace.toFloat().transformed (comp.affineTransform->inverted()).getSmallestIntegerContainer() - comp.getPosition(); } static const Point convertToParentSpace (const Component& comp, const Point& pointInLocalSpace) { - if (comp.affineTransform_ == 0) + if (comp.affineTransform == 0) return pointInLocalSpace + comp.getPosition(); - return (pointInLocalSpace + comp.getPosition()).toFloat().transformedBy (*comp.affineTransform_).toInt(); + return (pointInLocalSpace + comp.getPosition()).toFloat().transformedBy (*comp.affineTransform).toInt(); } static const Rectangle convertToParentSpace (const Component& comp, const Rectangle& areaInLocalSpace) { - if (comp.affineTransform_ == 0) + if (comp.affineTransform == 0) return areaInLocalSpace + comp.getPosition(); - return (areaInLocalSpace + comp.getPosition()).toFloat().transformed (*comp.affineTransform_).getSmallestIntegerContainer(); + return (areaInLocalSpace + comp.getPosition()).toFloat().transformed (*comp.affineTransform).getSmallestIntegerContainer(); } template @@ -319,13 +330,13 @@ public: static void clipObscuredRegions (const Component& comp, Graphics& g, const Rectangle& clipRect, const Point& delta) { - for (int i = comp.childComponentList_.size(); --i >= 0;) + for (int i = comp.childComponentList.size(); --i >= 0;) { - const Component& child = *comp.childComponentList_.getUnchecked(i); + const Component& child = *comp.childComponentList.getUnchecked(i); if (child.isVisible() && ! child.isTransformed()) { - const Rectangle newClip (clipRect.getIntersection (child.bounds_)); + const Rectangle newClip (clipRect.getIntersection (child.bounds)); if (! newClip.isEmpty()) { @@ -348,22 +359,22 @@ public: const Rectangle& clipRect, const Component* const compToAvoid) { - for (int i = comp.childComponentList_.size(); --i >= 0;) + for (int i = comp.childComponentList.size(); --i >= 0;) { - const Component* const c = comp.childComponentList_.getUnchecked(i); + const Component* const c = comp.childComponentList.getUnchecked(i); if (c != compToAvoid && c->isVisible()) { if (c->isOpaque()) { - Rectangle childBounds (c->bounds_.getIntersection (clipRect)); + Rectangle childBounds (c->bounds.getIntersection (clipRect)); childBounds.translate (delta.getX(), delta.getY()); result.subtract (childBounds); } else { - Rectangle newClip (clipRect.getIntersection (c->bounds_)); + Rectangle newClip (clipRect.getIntersection (c->bounds)); newClip.translate (-c->getX(), -c->getY()); subtractObscuredRegions (*c, result, c->getPosition() + delta, @@ -383,22 +394,20 @@ public: //============================================================================== Component::Component() - : parentComponent_ (0), - lookAndFeel_ (0), - effect_ (0), - bufferedImage_ (0), - componentFlags_ (0), + : parentComponent (0), + lookAndFeel (0), + effect (0), + componentFlags (0), componentTransparency (0) { } Component::Component (const String& name) - : componentName_ (name), - parentComponent_ (0), - lookAndFeel_ (0), - effect_ (0), - bufferedImage_ (0), - componentFlags_ (0), + : componentName (name), + parentComponent (0), + lookAndFeel (0), + effect (0), + componentFlags (0), componentTransparency (0) { } @@ -406,18 +415,18 @@ Component::Component (const String& name) Component::~Component() { #if ! JUCE_VC6 // (access to private union not allowed in VC6) - static_jassert (sizeof (flags) <= sizeof (componentFlags_)); + static_jassert (sizeof (flags) <= sizeof (componentFlags)); #endif componentListeners.call (&ComponentListener::componentBeingDeleted, *this); weakReferenceMaster.clear(); - while (childComponentList_.size() > 0) - removeChildComponent (childComponentList_.size() - 1, false, true); + while (childComponentList.size() > 0) + removeChildComponent (childComponentList.size() - 1, false, true); - if (parentComponent_ != 0) - parentComponent_->removeChildComponent (parentComponent_->childComponentList_.indexOf (this), true, false); + if (parentComponent != 0) + parentComponent->removeChildComponent (parentComponent->childComponentList.indexOf (this), true, false); else if (currentlyFocusedComponent == this || isParentOf (currentlyFocusedComponent)) giveAwayFocus (currentlyFocusedComponent != this); @@ -425,7 +434,7 @@ Component::~Component() removeFromDesktop(); // Something has added some children to this component during its destructor! Not a smart idea! - jassert (childComponentList_.size() == 0); + jassert (childComponentList.size() == 0); } const WeakReference::SharedRef& Component::getWeakReference() @@ -440,9 +449,9 @@ void Component::setName (const String& name) // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. CHECK_MESSAGE_MANAGER_IS_LOCKED - if (componentName_ != name) + if (componentName != name) { - componentName_ = name; + componentName = name; if (flags.hasHeavyweightPeerFlag) { @@ -483,8 +492,8 @@ void Component::setVisible (bool shouldBeVisible) { if (currentlyFocusedComponent == this || isParentOf (currentlyFocusedComponent)) { - if (parentComponent_ != 0) - parentComponent_->grabKeyboardFocus(); + if (parentComponent != 0) + parentComponent->grabKeyboardFocus(); else giveAwayFocus (true); } @@ -527,9 +536,9 @@ bool Component::isShowing() const { if (flags.visibleFlag) { - if (parentComponent_ != 0) + if (parentComponent != 0) { - return parentComponent_->isShowing(); + return parentComponent->isShowing(); } else { @@ -606,8 +615,8 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo) setTopLeftPosition (topLeft.getX(), topLeft.getY()); } - if (parentComponent_ != 0) - parentComponent_->removeChildComponent (this); + if (parentComponent != 0) + parentComponent->removeChildComponent (this); if (safePointer != 0) { @@ -617,7 +626,7 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo) Desktop::getInstance().addDesktopComponent (this); - bounds_.setPosition (topLeft); + bounds.setPosition (topLeft); peer->setBounds (topLeft.getX(), topLeft.getY(), getWidth(), getHeight(), false); peer->setVisible (isVisible()); @@ -715,7 +724,7 @@ void Component::setBufferedToImage (const bool shouldBeBuffered) { if (shouldBeBuffered != flags.bufferToImageFlag) { - bufferedImage_ = Image::null; + bufferedImage = Image::null; flags.bufferToImageFlag = shouldBeBuffered; } } @@ -739,9 +748,9 @@ void Component::toFront (const bool setAsForeground) grabKeyboardFocus(); } } - else if (parentComponent_ != 0) + else if (parentComponent != 0) { - Array& childList = parentComponent_->childComponentList_; + Array& childList = parentComponent->childComponentList; if (childList.getLast() != this) { @@ -782,11 +791,11 @@ void Component::toBehind (Component* const other) if (other != 0 && other != this) { // the two components must belong to the same parent.. - jassert (parentComponent_ == other->parentComponent_); + jassert (parentComponent == other->parentComponent); - if (parentComponent_ != 0) + if (parentComponent != 0) { - Array& childList = parentComponent_->childComponentList_; + Array& childList = parentComponent->childComponentList; const int index = childList.indexOf (this); @@ -825,13 +834,13 @@ void Component::toBehind (Component* const other) void Component::toBack() { - Array& childList = parentComponent_->childComponentList_; + Array& childList = parentComponent->childComponentList; if (isOnDesktop()) { jassertfalse; //xxx need to add this to native window } - else if (parentComponent_ != 0 && childList.getFirst() != this) + else if (parentComponent != 0 && childList.getFirst() != this) { const int index = childList.indexOf (this); @@ -898,24 +907,24 @@ bool Component::isAlwaysOnTop() const throw() //============================================================================== int Component::proportionOfWidth (const float proportion) const throw() { - return roundToInt (proportion * bounds_.getWidth()); + return roundToInt (proportion * bounds.getWidth()); } int Component::proportionOfHeight (const float proportion) const throw() { - return roundToInt (proportion * bounds_.getHeight()); + return roundToInt (proportion * bounds.getHeight()); } int Component::getParentWidth() const throw() { - return (parentComponent_ != 0) ? parentComponent_->getWidth() - : getParentMonitorArea().getWidth(); + return (parentComponent != 0) ? parentComponent->getWidth() + : getParentMonitorArea().getWidth(); } int Component::getParentHeight() const throw() { - return (parentComponent_ != 0) ? parentComponent_->getHeight() - : getParentMonitorArea().getHeight(); + return (parentComponent != 0) ? parentComponent->getHeight() + : getParentMonitorArea().getHeight(); } int Component::getScreenX() const { return getScreenPosition().getX(); } @@ -992,7 +1001,7 @@ void Component::setBounds (const int x, const int y, int w, int h) repaintParent(); } - bounds_.setBounds (x, y, w, h); + bounds.setBounds (x, y, w, h); if (showing) { @@ -1040,19 +1049,19 @@ void Component::sendMovedResizedMessages (const bool wasMoved, const bool wasRes if (checker.shouldBailOut()) return; - for (int i = childComponentList_.size(); --i >= 0;) + for (int i = childComponentList.size(); --i >= 0;) { - childComponentList_.getUnchecked(i)->parentSizeChanged(); + childComponentList.getUnchecked(i)->parentSizeChanged(); if (checker.shouldBailOut()) return; - i = jmin (i, childComponentList_.size()); + i = jmin (i, childComponentList.size()); } } - if (parentComponent_ != 0) - parentComponent_->childBoundsChanged (this); + if (parentComponent != 0) + parentComponent->childBoundsChanged (this); if (! checker.shouldBailOut()) componentListeners.callChecked (checker, &ComponentListener::componentMovedOrResized, @@ -1169,7 +1178,7 @@ void Component::setBoundsToFit (int x, int y, int width, int height, //============================================================================== bool Component::isTransformed() const throw() { - return affineTransform_ != 0; + return affineTransform != 0; } void Component::setTransform (const AffineTransform& newTransform) @@ -1180,26 +1189,26 @@ void Component::setTransform (const AffineTransform& newTransform) if (newTransform.isIdentity()) { - if (affineTransform_ != 0) + if (affineTransform != 0) { repaint(); - affineTransform_ = 0; + affineTransform = 0; repaint(); sendMovedResizedMessages (false, false); } } - else if (affineTransform_ == 0) + else if (affineTransform == 0) { repaint(); - affineTransform_ = new AffineTransform (newTransform); + affineTransform = new AffineTransform (newTransform); repaint(); sendMovedResizedMessages (false, false); } - else if (*affineTransform_ != newTransform) + else if (*affineTransform != newTransform) { repaint(); - *affineTransform_ = newTransform; + *affineTransform = newTransform; repaint(); sendMovedResizedMessages (false, false); } @@ -1207,7 +1216,7 @@ void Component::setTransform (const AffineTransform& newTransform) const AffineTransform Component::getTransform() const { - return affineTransform_ != 0 ? *affineTransform_ : AffineTransform::identity; + return affineTransform != 0 ? *affineTransform : AffineTransform::identity; } //============================================================================== @@ -1249,9 +1258,9 @@ bool Component::contains (const Point& point) { if (ComponentHelpers::hitTest (*this, point)) { - if (parentComponent_ != 0) + if (parentComponent != 0) { - return parentComponent_->contains (ComponentHelpers::convertToParentSpace (*this, point)); + return parentComponent->contains (ComponentHelpers::convertToParentSpace (*this, point)); } else if (flags.hasHeavyweightPeerFlag) { @@ -1280,9 +1289,9 @@ Component* Component::getComponentAt (const Point& position) { if (flags.visibleFlag && ComponentHelpers::hitTest (*this, position)) { - for (int i = childComponentList_.size(); --i >= 0;) + for (int i = childComponentList.size(); --i >= 0;) { - Component* child = childComponentList_.getUnchecked(i); + Component* child = childComponentList.getUnchecked(i); child = child->getComponentAt (ComponentHelpers::convertFromParentSpace (*child, position)); if (child != 0) @@ -1307,33 +1316,33 @@ void Component::addChildComponent (Component* const child, int zOrder) // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. CHECK_MESSAGE_MANAGER_IS_LOCKED - if (child != 0 && child->parentComponent_ != this) + if (child != 0 && child->parentComponent != this) { - if (child->parentComponent_ != 0) - child->parentComponent_->removeChildComponent (child); + if (child->parentComponent != 0) + child->parentComponent->removeChildComponent (child); else child->removeFromDesktop(); - child->parentComponent_ = this; + child->parentComponent = this; if (child->isVisible()) child->repaintParent(); if (! child->isAlwaysOnTop()) { - if (zOrder < 0 || zOrder > childComponentList_.size()) - zOrder = childComponentList_.size(); + if (zOrder < 0 || zOrder > childComponentList.size()) + zOrder = childComponentList.size(); while (zOrder > 0) { - if (! childComponentList_.getUnchecked (zOrder - 1)->isAlwaysOnTop()) + if (! childComponentList.getUnchecked (zOrder - 1)->isAlwaysOnTop()) break; --zOrder; } } - childComponentList_.insert (zOrder, child); + childComponentList.insert (zOrder, child); child->internalHierarchyChanged(); internalChildrenChanged(); @@ -1351,7 +1360,7 @@ void Component::addAndMakeVisible (Component* const child, int zOrder) void Component::removeChildComponent (Component* const child) { - removeChildComponent (childComponentList_.indexOf (child), true, true); + removeChildComponent (childComponentList.indexOf (child), true, true); } Component* Component::removeChildComponent (const int index) @@ -1365,7 +1374,7 @@ Component* Component::removeChildComponent (const int index, bool sendParentEven // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. CHECK_MESSAGE_MANAGER_IS_LOCKED - Component* const child = childComponentList_ [index]; + Component* const child = childComponentList [index]; if (child != 0) { @@ -1377,8 +1386,8 @@ Component* Component::removeChildComponent (const int index, bool sendParentEven child->repaintParent(); } - childComponentList_.remove (index); - child->parentComponent_ = 0; + childComponentList.remove (index); + child->parentComponent = 0; // (NB: there are obscure situations where child->isShowing() = false, but it still has the focus) if (currentlyFocusedComponent == child || child->isParentOf (currentlyFocusedComponent)) @@ -1413,38 +1422,38 @@ Component* Component::removeChildComponent (const int index, bool sendParentEven //============================================================================== void Component::removeAllChildren() { - while (childComponentList_.size() > 0) - removeChildComponent (childComponentList_.size() - 1); + while (childComponentList.size() > 0) + removeChildComponent (childComponentList.size() - 1); } void Component::deleteAllChildren() { - while (childComponentList_.size() > 0) - delete (removeChildComponent (childComponentList_.size() - 1)); + while (childComponentList.size() > 0) + delete (removeChildComponent (childComponentList.size() - 1)); } //============================================================================== int Component::getNumChildComponents() const throw() { - return childComponentList_.size(); + return childComponentList.size(); } Component* Component::getChildComponent (const int index) const throw() { - return childComponentList_ [index]; + return childComponentList [index]; } int Component::getIndexOfChildComponent (const Component* const child) const throw() { - return childComponentList_.indexOf (const_cast (child)); + return childComponentList.indexOf (const_cast (child)); } Component* Component::getTopLevelComponent() const throw() { const Component* comp = this; - while (comp->parentComponent_ != 0) - comp = comp->parentComponent_; + while (comp->parentComponent != 0) + comp = comp->parentComponent; return const_cast (comp); } @@ -1453,7 +1462,7 @@ bool Component::isParentOf (const Component* possibleChild) const throw() { while (possibleChild != 0) { - possibleChild = possibleChild->parentComponent_; + possibleChild = possibleChild->parentComponent; if (possibleChild == this) return true; @@ -1502,9 +1511,9 @@ void Component::internalHierarchyChanged() if (checker.shouldBailOut()) return; - for (int i = childComponentList_.size(); --i >= 0;) + for (int i = childComponentList.size(); --i >= 0;) { - childComponentList_.getUnchecked (i)->internalHierarchyChanged(); + childComponentList.getUnchecked (i)->internalHierarchyChanged(); if (checker.shouldBailOut()) { @@ -1514,7 +1523,7 @@ void Component::internalHierarchyChanged() return; } - i = jmin (i, childComponentList_.size()); + i = jmin (i, childComponentList.size()); } } @@ -1534,7 +1543,7 @@ int Component::runModalLoop() return ModalComponentManager::getInstance()->runEventLoopForCurrentComponent(); } -void Component::enterModalState (const bool takeKeyboardFocus_, ModalComponentManager::Callback* const callback) +void Component::enterModalState (const bool takeKeyboardFocus, ModalComponentManager::Callback* const callback) { // if component methods are being called from threads other than the message // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. @@ -1550,7 +1559,7 @@ void Component::enterModalState (const bool takeKeyboardFocus_, ModalComponentMa flags.currentlyModalFlag = true; setVisible (true); - if (takeKeyboardFocus_) + if (takeKeyboardFocus) grabKeyboardFocus(); } } @@ -1628,11 +1637,11 @@ bool Component::isBroughtToFrontOnMouseClick() const throw() } //============================================================================== -void Component::setMouseCursor (const MouseCursor& cursor) +void Component::setMouseCursor (const MouseCursor& newCursor) { - if (cursor_ != cursor) + if (cursor != newCursor) { - cursor_ = cursor; + cursor = newCursor; if (flags.visibleFlag) updateMouseCursor(); @@ -1641,7 +1650,7 @@ void Component::setMouseCursor (const MouseCursor& cursor) const MouseCursor Component::getMouseCursor() { - return cursor_; + return cursor; } void Component::updateMouseCursor() const @@ -1697,7 +1706,7 @@ void Component::repaint() void Component::repaint (const int x, const int y, const int w, const int h) { - bufferedImage_ = Image::null; + bufferedImage = Image::null; if (flags.visibleFlag) internalRepaint (x, y, w, h); @@ -1736,18 +1745,18 @@ void Component::internalRepaint (int x, int y, int w, int h) if (h > 0) { - if (parentComponent_ != 0) + if (parentComponent != 0) { - if (parentComponent_->flags.visibleFlag) + if (parentComponent->flags.visibleFlag) { - if (affineTransform_ == 0) + if (affineTransform == 0) { - parentComponent_->internalRepaint (x + getX(), y + getY(), w, h); + parentComponent->internalRepaint (x + getX(), y + getY(), w, h); } else { const Rectangle r (ComponentHelpers::convertToParentSpace (*this, Rectangle (x, y, w, h))); - parentComponent_->internalRepaint (r.getX(), r.getY(), r.getWidth(), r.getHeight()); + parentComponent->internalRepaint (r.getX(), r.getY(), r.getWidth(), r.getHeight()); } } } @@ -1767,17 +1776,17 @@ void Component::paintComponent (Graphics& g) { if (flags.bufferToImageFlag) { - if (bufferedImage_.isNull()) + if (bufferedImage.isNull()) { - bufferedImage_ = Image (flags.opaqueFlag ? Image::RGB : Image::ARGB, - getWidth(), getHeight(), ! flags.opaqueFlag, Image::NativeImage); + bufferedImage = Image (flags.opaqueFlag ? Image::RGB : Image::ARGB, + getWidth(), getHeight(), ! flags.opaqueFlag, Image::NativeImage); - Graphics imG (bufferedImage_); + Graphics imG (bufferedImage); paint (imG); } g.setColour (Colours::black.withAlpha (getAlpha())); - g.drawImageAt (bufferedImage_, 0, 0); + g.drawImageAt (bufferedImage, 0, 0); } else { @@ -1810,16 +1819,16 @@ void Component::paintComponentAndChildren (Graphics& g) g.restoreState(); } - for (int i = 0; i < childComponentList_.size(); ++i) + for (int i = 0; i < childComponentList.size(); ++i) { - Component& child = *childComponentList_.getUnchecked (i); + Component& child = *childComponentList.getUnchecked (i); if (child.isVisible()) { - if (child.affineTransform_ != 0) + if (child.affineTransform != 0) { g.saveState(); - g.addTransform (*child.affineTransform_); + g.addTransform (*child.affineTransform); if ((child.flags.dontClipGraphicsFlag && ! g.isClipEmpty()) || g.reduceClipRegion (child.getBounds())) child.paintWithinParentContext (g); @@ -1838,11 +1847,11 @@ void Component::paintComponentAndChildren (Graphics& g) { bool nothingClipped = true; - for (int j = i + 1; j < childComponentList_.size(); ++j) + for (int j = i + 1; j < childComponentList.size(); ++j) { - const Component& sibling = *childComponentList_.getUnchecked (j); + const Component& sibling = *childComponentList.getUnchecked (j); - if (sibling.flags.opaqueFlag && sibling.isVisible() && sibling.affineTransform_ == 0) + if (sibling.flags.opaqueFlag && sibling.isVisible() && sibling.affineTransform == 0) { nothingClipped = false; g.excludeClipRegion (sibling.getBounds()); @@ -1871,7 +1880,7 @@ void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel) flags.isInsidePaintCall = true; #endif - if (effect_ != 0) + if (effect != 0) { Image effectImage (flags.opaqueFlag ? Image::RGB : Image::ARGB, getWidth(), getHeight(), ! flags.opaqueFlag, Image::NativeImage); @@ -1880,7 +1889,7 @@ void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel) paintComponentAndChildren (g2); } - effect_->applyEffect (effectImage, g, ignoreAlphaLevel ? 1.0f : getAlpha()); + effect->applyEffect (effectImage, g, ignoreAlphaLevel ? 1.0f : getAlpha()); } else if (componentTransparency > 0 && ! ignoreAlphaLevel) { @@ -1927,11 +1936,11 @@ const Image Component::createComponentSnapshot (const Rectangle& areaToGrab return componentImage; } -void Component::setComponentEffect (ImageEffectFilter* const effect) +void Component::setComponentEffect (ImageEffectFilter* const newEffect) { - if (effect_ != effect) + if (effect != newEffect) { - effect_ = effect; + effect = newEffect; repaint(); } } @@ -1943,10 +1952,10 @@ LookAndFeel& Component::getLookAndFeel() const throw() do { - if (c->lookAndFeel_ != 0) - return *(c->lookAndFeel_); + if (c->lookAndFeel != 0) + return *(c->lookAndFeel); - c = c->parentComponent_; + c = c->parentComponent; } while (c != 0); @@ -1955,9 +1964,9 @@ LookAndFeel& Component::getLookAndFeel() const throw() void Component::setLookAndFeel (LookAndFeel* const newLookAndFeel) { - if (lookAndFeel_ != newLookAndFeel) + if (lookAndFeel != newLookAndFeel) { - lookAndFeel_ = newLookAndFeel; + lookAndFeel = newLookAndFeel; sendLookAndFeelChange(); } @@ -1977,14 +1986,14 @@ void Component::sendLookAndFeelChange() if (safePointer != 0) { - for (int i = childComponentList_.size(); --i >= 0;) + for (int i = childComponentList.size(); --i >= 0;) { - childComponentList_.getUnchecked (i)->sendLookAndFeelChange(); + childComponentList.getUnchecked (i)->sendLookAndFeelChange(); if (safePointer == 0) return; - i = jmin (i, childComponentList_.size()); + i = jmin (i, childComponentList.size()); } } } @@ -1996,8 +2005,8 @@ const Colour Component::findColour (const int colourId, const bool inheritFromPa if (v != 0) return Colour ((int) *v); - if (inheritFromParent && parentComponent_ != 0) - return parentComponent_->findColour (colourId, true); + if (inheritFromParent && parentComponent != 0) + return parentComponent->findColour (colourId, true); return getLookAndFeel().findColour (colourId); } @@ -2048,8 +2057,8 @@ const Rectangle Component::getLocalBounds() const throw() const Rectangle Component::getBoundsInParent() const throw() { - return affineTransform_ == 0 ? bounds_ - : bounds_.toFloat().transformed (*affineTransform_).getSmallestIntegerContainer(); + return affineTransform == 0 ? bounds + : bounds.toFloat().transformed (*affineTransform).getSmallestIntegerContainer(); } void Component::getVisibleArea (RectangleList& result, const bool includeSiblings) const @@ -2114,9 +2123,9 @@ void Component::mouseWheelMove (const MouseEvent& e, float wheelIncrementX, floa { // the base class just passes this event up to its parent.. - if (parentComponent_ != 0) - parentComponent_->mouseWheelMove (e.getEventRelativeTo (parentComponent_), - wheelIncrementX, wheelIncrementY); + if (parentComponent != 0) + parentComponent->mouseWheelMove (e.getEventRelativeTo (parentComponent), + wheelIncrementX, wheelIncrementY); } @@ -2229,10 +2238,10 @@ void Component::addMouseListener (MouseListener* const newListener, // twice - once via the direct callback that all components get anyway, and then again as a listener! jassert ((newListener != this) || wantsEventsForAllNestedChildComponents); - if (mouseListeners_ == 0) - mouseListeners_ = new MouseListenerList(); + if (mouseListeners == 0) + mouseListeners = new MouseListenerList(); - mouseListeners_->addListener (newListener, wantsEventsForAllNestedChildComponents); + mouseListeners->addListener (newListener, wantsEventsForAllNestedChildComponents); } void Component::removeMouseListener (MouseListener* const listenerToRemove) @@ -2241,8 +2250,8 @@ void Component::removeMouseListener (MouseListener* const listenerToRemove) // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. CHECK_MESSAGE_MANAGER_IS_LOCKED - if (mouseListeners_ != 0) - mouseListeners_->removeListener (listenerToRemove); + if (mouseListeners != 0) + mouseListeners->removeListener (listenerToRemove); } //============================================================================== @@ -2277,7 +2286,7 @@ void Component::internalMouseEnter (MouseInputSource& source, const Point& desktop.resetTimer(); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseEnter, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseEnter, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseEnter, me); } } @@ -2313,7 +2322,7 @@ void Component::internalMouseExit (MouseInputSource& source, const Point& r desktop.resetTimer(); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseExit, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseExit, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseExit, me); } } @@ -2359,7 +2368,7 @@ void Component::internalMouseDown (MouseInputSource& source, const Point& r return; } - c = c->parentComponent_; + c = c->parentComponent; } } @@ -2388,7 +2397,7 @@ void Component::internalMouseDown (MouseInputSource& source, const Point& r desktop.resetTimer(); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDown, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseDown, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDown, me); } //============================================================================== @@ -2419,7 +2428,7 @@ void Component::internalMouseUp (MouseInputSource& source, const Point& rel desktop.resetTimer(); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseUp, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseUp, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseUp, me); if (checker.shouldBailOut()) return; @@ -2433,7 +2442,7 @@ void Component::internalMouseUp (MouseInputSource& source, const Point& rel return; desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDoubleClick, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseDoubleClick, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDoubleClick, me); } } } @@ -2462,7 +2471,7 @@ void Component::internalMouseDrag (MouseInputSource& source, const Point& r desktop.resetTimer(); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDrag, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseDrag, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDrag, me); } } @@ -2491,7 +2500,7 @@ void Component::internalMouseMove (MouseInputSource& source, const Point& r desktop.resetTimer(); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseMove, me); - MouseListenerList::sendMouseEvent (this, checker, &MouseListener::mouseMove, me); + MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseMove, me); } } @@ -2521,7 +2530,8 @@ void Component::internalMouseWheel (MouseInputSource& source, const Point& desktop.mouseListeners.callChecked (checker, &MouseListener::mouseWheelMove, me, wheelIncrementX, wheelIncrementY); - MouseListenerList::sendWheelEvent (this, checker, me, wheelIncrementX, wheelIncrementY); + if (! checker.shouldBailOut()) + MouseListenerList::sendWheelEvent (*this, checker, me, wheelIncrementX, wheelIncrementY); } } @@ -2618,15 +2628,15 @@ void Component::internalChildFocusChange (FocusChangeType cause, const WeakRefer return; } - if (parentComponent_ != 0) - parentComponent_->internalChildFocusChange (cause, WeakReference (parentComponent_)); + if (parentComponent != 0) + parentComponent->internalChildFocusChange (cause, WeakReference (parentComponent)); } //============================================================================== bool Component::isEnabled() const throw() { return (! flags.isDisabledFlag) - && (parentComponent_ == 0 || parentComponent_->isEnabled()); + && (parentComponent == 0 || parentComponent->isEnabled()); } void Component::setEnabled (const bool shouldBeEnabled) @@ -2637,7 +2647,7 @@ void Component::setEnabled (const bool shouldBeEnabled) // if any parent components are disabled, setting our flag won't make a difference, // so no need to send a change message - if (parentComponent_ == 0 || parentComponent_->isEnabled()) + if (parentComponent == 0 || parentComponent->isEnabled()) sendEnablementChangeMessage(); } } @@ -2714,10 +2724,10 @@ void Component::setExplicitFocusOrder (const int newFocusOrderIndex) KeyboardFocusTraverser* Component::createFocusTraverser() { - if (flags.isFocusContainerFlag || parentComponent_ == 0) + if (flags.isFocusContainerFlag || parentComponent == 0) return new KeyboardFocusTraverser(); - return parentComponent_->createFocusTraverser(); + return parentComponent->createFocusTraverser(); } void Component::takeKeyboardFocus (const FocusChangeType cause) @@ -2758,7 +2768,7 @@ void Component::grabFocusInternal (const FocusChangeType cause, const bool canTr { if (isShowing()) { - if (flags.wantsFocusFlag && (isEnabled() || parentComponent_ == 0)) + if (flags.wantsFocusFlag && (isEnabled() || parentComponent == 0)) { takeKeyboardFocus (cause); } @@ -2786,11 +2796,11 @@ void Component::grabFocusInternal (const FocusChangeType cause, const bool canTr } } - if (canTryParent && parentComponent_ != 0) + if (canTryParent && parentComponent != 0) { // if no children want it and we're allowed to try our parent comp, // then pass up to parent, which will try our siblings. - parentComponent_->grabFocusInternal (cause, true); + parentComponent->grabFocusInternal (cause, true); } } } @@ -2812,7 +2822,7 @@ void Component::moveKeyboardFocusToSibling (const bool moveToNext) // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. CHECK_MESSAGE_MANAGER_IS_LOCKED - if (parentComponent_ != 0) + if (parentComponent != 0) { ScopedPointer traverser (createFocusTraverser()); @@ -2838,7 +2848,7 @@ void Component::moveKeyboardFocusToSibling (const bool moveToNext) } } - parentComponent_->moveKeyboardFocusToSibling (moveToNext); + parentComponent->moveKeyboardFocusToSibling (moveToNext); } } @@ -2908,16 +2918,16 @@ const Rectangle Component::getParentMonitorArea() const //============================================================================== void Component::addKeyListener (KeyListener* const newListener) { - if (keyListeners_ == 0) - keyListeners_ = new Array (); + if (keyListeners == 0) + keyListeners = new Array (); - keyListeners_->addIfNotAlreadyThere (newListener); + keyListeners->addIfNotAlreadyThere (newListener); } void Component::removeKeyListener (KeyListener* const listenerToRemove) { - if (keyListeners_ != 0) - keyListeners_->removeValue (listenerToRemove); + if (keyListeners != 0) + keyListeners->removeValue (listenerToRemove); } bool Component::keyPressed (const KeyPress&) @@ -2932,8 +2942,8 @@ bool Component::keyStateChanged (const bool /*isKeyDown*/) void Component::modifierKeysChanged (const ModifierKeys& modifiers) { - if (parentComponent_ != 0) - parentComponent_->modifierKeysChanged (modifiers); + if (parentComponent != 0) + parentComponent->modifierKeysChanged (modifiers); } void Component::internalModifierKeysChanged() @@ -2948,28 +2958,22 @@ ComponentPeer* Component::getPeer() const { if (flags.hasHeavyweightPeerFlag) return ComponentPeer::getPeerFor (this); - else if (parentComponent_ == 0) + else if (parentComponent == 0) return 0; - return parentComponent_->getPeer(); + return parentComponent->getPeer(); } //============================================================================== Component::BailOutChecker::BailOutChecker (Component* const component) - : safePointer1 (component) + : safePointer (component) { jassert (component != 0); } -Component::BailOutChecker::BailOutChecker (Component* const component1, Component* const component2) - : safePointer1 (component1), safePointer2 (component2) -{ - jassert (component1 != 0); -} - bool Component::BailOutChecker::shouldBailOut() const throw() { - return safePointer1 == 0 || safePointer2.wasObjectDeleted(); + return safePointer == 0; } diff --git a/src/gui/components/juce_Component.h b/src/gui/components/juce_Component.h index 0f3ef50b7e..686a165560 100644 --- a/src/gui/components/juce_Component.h +++ b/src/gui/components/juce_Component.h @@ -97,7 +97,7 @@ public: @see setName */ - const String& getName() const throw() { return componentName_; } + const String& getName() const throw() { return componentName; } /** Sets the name of this component. @@ -277,7 +277,7 @@ public: bounds will no longer be a direct reflection of the position at which it appears within its parent, as the transform will be applied to its bounding box. */ - inline int getX() const throw() { return bounds_.getX(); } + inline int getX() const throw() { return bounds.getX(); } /** Returns the y coordinate of the top of this component. This is a distance in pixels from the top edge of the component's parent. @@ -286,13 +286,13 @@ public: bounds will no longer be a direct reflection of the position at which it appears within its parent, as the transform will be applied to its bounding box. */ - inline int getY() const throw() { return bounds_.getY(); } + inline int getY() const throw() { return bounds.getY(); } /** Returns the component's width in pixels. */ - inline int getWidth() const throw() { return bounds_.getWidth(); } + inline int getWidth() const throw() { return bounds.getWidth(); } /** Returns the component's height in pixels. */ - inline int getHeight() const throw() { return bounds_.getHeight(); } + inline int getHeight() const throw() { return bounds.getHeight(); } /** Returns the x coordinate of the component's right-hand edge. This is a distance in pixels from the left edge of the component's parent. @@ -301,10 +301,10 @@ public: bounds will no longer be a direct reflection of the position at which it appears within its parent, as the transform will be applied to its bounding box. */ - int getRight() const throw() { return bounds_.getRight(); } + int getRight() const throw() { return bounds.getRight(); } /** Returns the component's top-left position as a Point. */ - const Point getPosition() const throw() { return bounds_.getPosition(); } + const Point getPosition() const throw() { return bounds.getPosition(); } /** Returns the y coordinate of the bottom edge of this component. This is a distance in pixels from the top edge of the component's parent. @@ -313,7 +313,7 @@ public: bounds will no longer be a direct reflection of the position at which it appears within its parent, as the transform will be applied to its bounding box. */ - int getBottom() const throw() { return bounds_.getBottom(); } + int getBottom() const throw() { return bounds.getBottom(); } /** Returns this component's bounding box. The rectangle returned is relative to the top-left of the component's parent. @@ -322,7 +322,7 @@ public: bounds will no longer be a direct reflection of the position at which it appears within its parent, as the transform will be applied to its bounding box. */ - const Rectangle& getBounds() const throw() { return bounds_; } + const Rectangle& getBounds() const throw() { return bounds; } /** Returns the component's bounds, relative to its own origin. This is like getBounds(), but returns the rectangle in local coordinates, In practice, it'll @@ -706,7 +706,7 @@ public: If this is the highest-level component or hasn't yet been added to a parent, this will return null. */ - Component* getParentComponent() const throw() { return parentComponent_; } + Component* getParentComponent() const throw() { return parentComponent; } /** Searches the parent components for a component of a specified class. @@ -720,14 +720,14 @@ public: TargetClass* findParentComponentOfClass (TargetClass* const dummyParameter = 0) const { (void) dummyParameter; - Component* p = parentComponent_; + Component* p = parentComponent; while (p != 0) { TargetClass* target = dynamic_cast (p); if (target != 0) return target; - p = p->parentComponent_; + p = p->parentComponent; } return 0; @@ -1022,7 +1022,7 @@ public: @see setComponentEffect */ - ImageEffectFilter* getComponentEffect() const throw() { return effect_; } + ImageEffectFilter* getComponentEffect() const throw() { return effect; } //============================================================================== /** Finds the appropriate look-and-feel to use for this component. @@ -2078,7 +2078,7 @@ public: }; //============================================================================== - /** A class to keep an eye on one or two components and check for them being deleted. + /** A class to keep an eye on a component and check for it being deleted. This is designed for use with the ListenerList::callChecked() methods, to allow the list iterator to stop cleanly if the component is deleted by a listener callback @@ -2088,16 +2088,13 @@ public: { public: /** Creates a checker that watches one component. */ - BailOutChecker (Component* component1); - - /** Creates a checker that watches two components. */ - BailOutChecker (Component* component1, Component* component2); + BailOutChecker (Component* component); /** Returns true if either of the two components have been deleted since this object was created. */ bool shouldBailOut() const throw(); private: - const WeakReference safePointer1, safePointer2; + const WeakReference safePointer; JUCE_DECLARE_NON_COPYABLE (BailOutChecker); }; @@ -2118,7 +2115,6 @@ public: private: //============================================================================== friend class ComponentPeer; - friend class InternalDragRepeater; friend class MouseInputSource; friend class MouseInputSourceInternal; @@ -2126,21 +2122,21 @@ private: static Component* currentlyFocusedComponent; //============================================================================== - String componentName_, componentID; - Component* parentComponent_; - Rectangle bounds_; - ScopedPointer affineTransform_; - Array childComponentList_; - LookAndFeel* lookAndFeel_; - MouseCursor cursor_; - ImageEffectFilter* effect_; - Image bufferedImage_; + String componentName, componentID; + Component* parentComponent; + Rectangle bounds; + ScopedPointer affineTransform; + Array childComponentList; + LookAndFeel* lookAndFeel; + MouseCursor cursor; + ImageEffectFilter* effect; + Image bufferedImage; class MouseListenerList; friend class MouseListenerList; friend class ScopedPointer ; - ScopedPointer mouseListeners_; - ScopedPointer > keyListeners_; + ScopedPointer mouseListeners; + ScopedPointer > keyListeners; ListenerList componentListeners; NamedValueSet properties; @@ -2176,7 +2172,7 @@ private: union { - uint32 componentFlags_; + uint32 componentFlags; ComponentFlags flags; }; diff --git a/src/gui/components/layout/juce_ComponentBoundsConstrainer.h b/src/gui/components/layout/juce_ComponentBoundsConstrainer.h index 6170be5f3b..9f359c89ec 100644 --- a/src/gui/components/layout/juce_ComponentBoundsConstrainer.h +++ b/src/gui/components/layout/juce_ComponentBoundsConstrainer.h @@ -112,6 +112,16 @@ public: int minimumWhenOffTheBottom, int minimumWhenOffTheRight) throw(); + + /** Returns the minimum distance the bounds can be off-screen. @see setMinimumOnscreenAmounts */ + int getMinimumWhenOffTheTop() const throw() { return minOffTop; } + /** Returns the minimum distance the bounds can be off-screen. @see setMinimumOnscreenAmounts */ + int getMinimumWhenOffTheLeft() const throw() { return minOffLeft; } + /** Returns the minimum distance the bounds can be off-screen. @see setMinimumOnscreenAmounts */ + int getMinimumWhenOffTheBottom() const throw() { return minOffBottom; } + /** Returns the minimum distance the bounds can be off-screen. @see setMinimumOnscreenAmounts */ + int getMinimumWhenOffTheRight() const throw() { return minOffRight; } + //============================================================================== /** Specifies a width-to-height ratio that the resizer should always maintain. diff --git a/src/gui/components/layout/juce_ComponentBuilder.cpp b/src/gui/components/layout/juce_ComponentBuilder.cpp new file mode 100644 index 0000000000..8b0b200620 --- /dev/null +++ b/src/gui/components/layout/juce_ComponentBuilder.cpp @@ -0,0 +1,276 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 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. + + ============================================================================== +*/ + +#include "../../../core/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "juce_ComponentBuilder.h" + + +//============================================================================= +namespace ComponentBuilderHelpers +{ + const String getStateId (const ValueTree& state) + { + return state [ComponentBuilder::idProperty].toString(); + } + + Component* findComponentWithID (OwnedArray& components, const String& compId) + { + jassert (compId.isNotEmpty()); + + for (int i = components.size(); --i >= 0;) + { + Component* const c = components.getUnchecked (i); + + if (c->getComponentID() == compId) + return components.removeAndReturn (i); + } + + return 0; + } + + Component* findComponentWithID (Component* const c, const String& compId) + { + jassert (compId.isNotEmpty()); + if (c->getComponentID() == compId) + return c; + + for (int i = c->getNumChildComponents(); --i >= 0;) + { + Component* const child = findComponentWithID (c->getChildComponent (i), compId); + + if (child != 0) + return child; + } + + return 0; + } + + Component* createNewComponent (ComponentBuilder::TypeHandler& type, + const ValueTree& state, Component* parent) + { + Component* const c = type.addNewComponentFromState (state, parent); + jassert (c != 0); + c->setComponentID (getStateId (state)); + return c; + } +} + +//============================================================================= +const Identifier ComponentBuilder::idProperty ("id"); + +ComponentBuilder::ComponentBuilder (const ValueTree& state_) + : state (state_) +{ + state.addListener (this); +} + +ComponentBuilder::~ComponentBuilder() +{ + state.removeListener (this); +} + +Component* ComponentBuilder::getComponent() +{ + if (component == 0) + { + jassert (types.size() > 0); // You need to register all the necessary types before you can load a component! + + TypeHandler* const type = getHandlerForState (state); + jassert (type != 0); // trying to create a component from an unknown type of ValueTree + + if (type != 0) + component = ComponentBuilderHelpers::createNewComponent (*type, state, 0); + } + + return component; +} + +Component* ComponentBuilder::getAndReleaseComponent() +{ + getComponent(); + return component.release(); +} + +void ComponentBuilder::registerTypeHandler (ComponentBuilder::TypeHandler* const type) +{ + jassert (type != 0); + + // Don't try to move your types around! Once a type has been added to a builder, the + // builder owns it, and you should leave it alone! + jassert (type->builder == 0); + + types.add (type); + type->builder = this; +} + +ComponentBuilder::TypeHandler* ComponentBuilder::getHandlerForState (const ValueTree& s) const +{ + const Identifier targetType (s.getType()); + + for (int i = 0; i < types.size(); ++i) + { + TypeHandler* const t = types.getUnchecked(i); + + if (t->getType() == targetType) + return t; + } + + return 0; +} + +int ComponentBuilder::getNumHandlers() const throw() +{ + return types.size(); +} + +ComponentBuilder::TypeHandler* ComponentBuilder::getHandler (const int index) const throw() +{ + return types [index]; +} + +void ComponentBuilder::updateComponent (const ValueTree& state) +{ + using namespace ComponentBuilderHelpers; + + if (component != 0) + { + const String compId (getStateId (state)); + + if (compId.isEmpty() && state.getParent().isValid()) + { + // ..handle the case where a child of the actual state node has changed. + updateComponent (state.getParent()); + } + else + { + TypeHandler* const type = getHandlerForState (state); + + if (type != 0) + { + Component* const changedComp = findComponentWithID (component, compId); + + if (changedComp != 0) + type->updateComponentFromState (changedComp, state); + } + } + } +} + +void ComponentBuilder::setImageProvider (ImageProvider* newImageProvider) throw() +{ + imageProvider = newImageProvider; +} + +ComponentBuilder::ImageProvider* ComponentBuilder::getImageProvider() const throw() +{ + return imageProvider; +} + +void ComponentBuilder::valueTreePropertyChanged (ValueTree& tree, const Identifier&) +{ + updateComponent (tree); +} + +void ComponentBuilder::valueTreeChildrenChanged (ValueTree& tree) +{ + updateComponent (tree); +} + +void ComponentBuilder::valueTreeParentChanged (ValueTree& tree) +{ + updateComponent (tree); +} + +//============================================================================== +ComponentBuilder::TypeHandler::TypeHandler (const Identifier& valueTreeType_) + : builder (0), valueTreeType (valueTreeType_) +{ +} + +ComponentBuilder::TypeHandler::~TypeHandler() +{ +} + +ComponentBuilder* ComponentBuilder::TypeHandler::getBuilder() const throw() +{ + // A type handler needs to be registered with a ComponentBuilder before using it! + jassert (builder != 0); + return builder; +} + +void ComponentBuilder::updateChildComponents (Component& parent, const ValueTree& children) +{ + using namespace ComponentBuilderHelpers; + + const int numExistingChildComps = parent.getNumChildComponents(); + + Array componentsInOrder; + componentsInOrder.ensureStorageAllocated (numExistingChildComps); + + { + OwnedArray existingComponents; + existingComponents.ensureStorageAllocated (numExistingChildComps); + + int i; + for (i = 0; i < numExistingChildComps; ++i) + existingComponents.add (parent.getChildComponent (i)); + + const int newNumChildren = children.getNumChildren(); + for (i = 0; i < newNumChildren; ++i) + { + const ValueTree childState (children.getChild (i)); + + ComponentBuilder::TypeHandler* const type = getHandlerForState (childState); + jassert (type != 0); + + if (type != 0) + { + Component* c = findComponentWithID (existingComponents, getStateId (childState)); + + if (c == 0) + c = createNewComponent (*type, childState, &parent); + + componentsInOrder.add (c); + } + } + + // (remaining unused items in existingComponents get deleted here as it goes out of scope) + } + + // Make sure the z-order is correct.. + if (componentsInOrder.size() > 0) + { + componentsInOrder.getLast()->toFront (false); + + for (int i = componentsInOrder.size() - 1; --i >= 0;) + componentsInOrder.getUnchecked(i)->toBehind (componentsInOrder.getUnchecked (i + 1)); + } +} + + +END_JUCE_NAMESPACE diff --git a/src/gui/components/layout/juce_ComponentBuilder.h b/src/gui/components/layout/juce_ComponentBuilder.h new file mode 100644 index 0000000000..c776129bc7 --- /dev/null +++ b/src/gui/components/layout/juce_ComponentBuilder.h @@ -0,0 +1,190 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-10 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_COMPONENTBUILDER_JUCEHEADER__ +#define __JUCE_COMPONENTBUILDER_JUCEHEADER__ + +#include "../../../containers/juce_ValueTree.h" +#include "../juce_Component.h" + + +//============================================================================== +/** + Loads and maintains a tree of Components from a ValueTree that represents them. + + To allow the state of a tree of components to be saved as a ValueTree and re-loaded, + this class lets you register a set of type-handlers for the different components that + are involved, and then uses these types to re-create a set of components from its + stored state. + + Essentially, to use this, you need to create a ComponentBuilder with your ValueTree, + then use registerTypeHandler() to give it a set of type handlers that can cope with + all the items in your tree. Then you can call getComponent() to build the component. + Once you've got the component you can either take it and delete the ComponentBuilder + object, or if you keep the ComponentBuilder around, it'll monitor any changes in the + ValueTree and automatically update the component to reflect these changes. +*/ +class JUCE_API ComponentBuilder : public ValueTree::Listener +{ +public: + /** + */ + explicit ComponentBuilder (const ValueTree& state); + + /** Destructor. */ + ~ComponentBuilder(); + + //============================================================================== + /** + */ + ValueTree& getState() throw() { return state; } + + /** + */ + const ValueTree& getState() const throw() { return state; } + + /** + */ + Component* getComponent(); + + /** + */ + Component* getAndReleaseComponent(); + + //============================================================================== + /** + */ + class JUCE_API TypeHandler + { + public: + /** + */ + explicit TypeHandler (const Identifier& valueTreeType); + + /** Destructor. */ + virtual ~TypeHandler(); + + /** + */ + const Identifier& getType() const throw() { return valueTreeType; } + + /** + */ + virtual Component* addNewComponentFromState (const ValueTree& state, Component* parent) = 0; + + /** + */ + virtual void updateComponentFromState (Component* component, const ValueTree& state) = 0; + + /** + */ + ComponentBuilder* getBuilder() const throw(); + + private: + friend class ComponentBuilder; + ComponentBuilder* builder; + const Identifier valueTreeType; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TypeHandler); + }; + + /** + */ + void registerTypeHandler (TypeHandler* type); + + /** + */ + TypeHandler* getHandlerForState (const ValueTree& state) const; + + /** + */ + int getNumHandlers() const throw(); + + /** + */ + TypeHandler* getHandler (int index) const throw(); + + //============================================================================= + /** This class is used when loading Drawables that contain images, and retrieves + the image for a stored identifier. + @see Drawable::createFromValueTree + */ + class JUCE_API ImageProvider + { + public: + ImageProvider() {} + virtual ~ImageProvider() {} + + /** Retrieves the image associated with this identifier, which could be any + kind of string, number, filename, etc. + + The image that is returned will be owned by the caller, but it may come + from the ImageCache. + */ + virtual const Image getImageForIdentifier (const var& imageIdentifier) = 0; + + /** Returns an identifier to be used to refer to a given image. + This is used when converting a drawable into a ValueTree, so if you're + only loading drawables, you can just return a var::null here. + */ + virtual const var getIdentifierForImage (const Image& image) = 0; + }; + + /** */ + void setImageProvider (ImageProvider* newImageProvider) throw(); + + /** */ + ImageProvider* getImageProvider() const throw(); + + //============================================================================= + /** @internal */ + void valueTreePropertyChanged (ValueTree& treeWhosePropertyHasChanged, const Identifier& property); + /** @internal */ + void valueTreeChildrenChanged (ValueTree& treeWhoseChildHasChanged); + /** @internal */ + void valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged); + + /** + */ + void updateChildComponents (Component& parent, const ValueTree& children); + + /** + */ + static const Identifier idProperty; + +private: + //============================================================================= + ValueTree state; + OwnedArray types; + ScopedPointer component; + ImageProvider* imageProvider; + + void updateComponent (const ValueTree& state); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComponentBuilder); +}; + + +#endif // __JUCE_COMPONENTBUILDER_JUCEHEADER__ diff --git a/src/gui/components/lookandfeel/juce_LookAndFeel.cpp b/src/gui/components/lookandfeel/juce_LookAndFeel.cpp index dbc9a72515..e22868cbff 100644 --- a/src/gui/components/lookandfeel/juce_LookAndFeel.cpp +++ b/src/gui/components/lookandfeel/juce_LookAndFeel.cpp @@ -2446,14 +2446,14 @@ Button* LookAndFeel::createTabBarExtrasButton() dp.setFill (Colour (0x59000000)); DrawableComposite normalImage; - normalImage.insertDrawable (ellipse); - normalImage.insertDrawable (dp); + normalImage.addAndMakeVisible (ellipse.createCopy()); + normalImage.addAndMakeVisible (dp.createCopy()); dp.setFill (Colour (0xcc000000)); DrawableComposite overImage; - overImage.insertDrawable (ellipse); - overImage.insertDrawable (dp); + overImage.addAndMakeVisible (ellipse.createCopy()); + overImage.addAndMakeVisible (dp.createCopy()); DrawableButton* db = new DrawableButton ("tabs", DrawableButton::ImageFitted); db->setImages (&normalImage, &overImage, 0); diff --git a/src/gui/components/windows/juce_ComponentPeer.cpp b/src/gui/components/windows/juce_ComponentPeer.cpp index 69827c099a..cf680f36f7 100644 --- a/src/gui/components/windows/juce_ComponentPeer.cpp +++ b/src/gui/components/windows/juce_ComponentPeer.cpp @@ -175,17 +175,18 @@ bool ComponentPeer::handleKeyPress (const int keyCode, while (target != 0) { const WeakReference deletionChecker (target); + const Array * const keyListeners = target->keyListeners; - if (target->keyListeners_ != 0) + if (keyListeners != 0) { - for (int i = target->keyListeners_->size(); --i >= 0;) + for (int i = keyListeners->size(); --i >= 0;) { - keyWasUsed = target->keyListeners_->getUnchecked(i)->keyPressed (keyInfo, target); + keyWasUsed = keyListeners->getUnchecked(i)->keyPressed (keyInfo, target); if (keyWasUsed || deletionChecker == 0) return keyWasUsed; - i = jmin (i, target->keyListeners_->size()); + i = jmin (i, keyListeners->size()); } } @@ -202,7 +203,7 @@ bool ComponentPeer::handleKeyPress (const int keyCode, break; } - target = target->parentComponent_; + target = target->getParentComponent(); } return keyWasUsed; @@ -235,20 +236,22 @@ bool ComponentPeer::handleKeyUpOrDown (const bool isKeyDown) if (keyWasUsed || deletionChecker == 0) break; - if (target->keyListeners_ != 0) + const Array * const keyListeners = target->keyListeners; + + if (keyListeners != 0) { - for (int i = target->keyListeners_->size(); --i >= 0;) + for (int i = keyListeners->size(); --i >= 0;) { - keyWasUsed = target->keyListeners_->getUnchecked(i)->keyStateChanged (isKeyDown, target); + keyWasUsed = keyListeners->getUnchecked(i)->keyStateChanged (isKeyDown, target); if (keyWasUsed || deletionChecker == 0) return keyWasUsed; - i = jmin (i, target->keyListeners_->size()); + i = jmin (i, keyListeners->size()); } } - target = target->parentComponent_; + target = target->getParentComponent(); } return keyWasUsed; @@ -313,7 +316,7 @@ void ComponentPeer::handleMovedOrResized() if (wasMoved || wasResized) { - component->bounds_ = newBounds; + component->bounds = newBounds; if (wasResized) component->repaint(); diff --git a/src/gui/components/windows/juce_ResizableWindow.h b/src/gui/components/windows/juce_ResizableWindow.h index 107403eff5..f5035915f6 100644 --- a/src/gui/components/windows/juce_ResizableWindow.h +++ b/src/gui/components/windows/juce_ResizableWindow.h @@ -268,6 +268,16 @@ public: */ void setContentComponentSize (int width, int height); + /** Returns the width of the frame to use around the window. + @see getContentComponentBorder + */ + virtual const BorderSize getBorderThickness(); + + /** Returns the insets to use when positioning the content component. + @see getBorderThickness + */ + virtual const BorderSize getContentComponentBorder(); + //============================================================================== /** A set of colour IDs to use to change the colour of various aspects of the window. @@ -306,18 +316,6 @@ protected: /** @internal */ int getDesktopWindowStyleFlags() const; - /** Returns the width of the border to use around the window. - - @see getContentComponentBorder - */ - virtual const BorderSize getBorderThickness(); - - /** Returns the insets to use when positioning the content component. - - @see getBorderThickness - */ - virtual const BorderSize getContentComponentBorder(); - #if JUCE_DEBUG /** Overridden to warn people about adding components directly to this component instead of using setContentComponent(). diff --git a/src/gui/graphics/drawables/juce_Drawable.cpp b/src/gui/graphics/drawables/juce_Drawable.cpp index 5b0e1fc602..c5b5f8fbbb 100644 --- a/src/gui/graphics/drawables/juce_Drawable.cpp +++ b/src/gui/graphics/drawables/juce_Drawable.cpp @@ -176,37 +176,59 @@ Drawable* Drawable::createFromImageFile (const File& file) } //============================================================================== -Drawable* Drawable::createFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) +Drawable* Drawable::createFromValueTree (const ValueTree& tree, ComponentBuilder::ImageProvider* imageProvider) { - return createChildFromValueTree (0, tree, imageProvider); + ComponentBuilder builder (tree); + builder.setImageProvider (imageProvider); + registerDrawableTypes (builder); + + Drawable* d = dynamic_cast (builder.getComponent()); + + if (d != 0) + return dynamic_cast (builder.getAndReleaseComponent()); + + return 0; } -Drawable* Drawable::createChildFromValueTree (DrawableComposite* parent, const ValueTree& tree, ImageProvider* imageProvider) +//============================================================================== +template +class DrawableTypeHandler : public ComponentBuilder::TypeHandler { - const Identifier type (tree.getType()); - - Drawable* d = 0; - if (type == DrawablePath::valueTreeType) d = new DrawablePath(); - else if (type == DrawableComposite::valueTreeType) d = new DrawableComposite(); - else if (type == DrawableRectangle::valueTreeType) d = new DrawableRectangle(); - else if (type == DrawableImage::valueTreeType) d = new DrawableImage(); - else if (type == DrawableText::valueTreeType) d = new DrawableText(); +public: + DrawableTypeHandler() + : ComponentBuilder::TypeHandler (DrawableClass::valueTreeType) + { + } - if (d != 0) + Component* addNewComponentFromState (const ValueTree& state, Component* parent) { + DrawableClass* const d = new DrawableClass(); + if (parent != 0) - parent->insertDrawable (d); + parent->addAndMakeVisible (d); - d->refreshFromValueTree (tree, imageProvider); + updateComponentFromState (d, state); + return d; } - return d; -} + void updateComponentFromState (Component* component, const ValueTree& state) + { + DrawableClass* const d = dynamic_cast (component); + jassert (d != 0); + d->refreshFromValueTree (state, *this->getBuilder()); + } +}; +void Drawable::registerDrawableTypes (ComponentBuilder& builder) +{ + builder.registerTypeHandler (new DrawableTypeHandler ()); + builder.registerTypeHandler (new DrawableTypeHandler ()); + builder.registerTypeHandler (new DrawableTypeHandler ()); + builder.registerTypeHandler (new DrawableTypeHandler ()); + builder.registerTypeHandler (new DrawableTypeHandler ()); +} //============================================================================== -const Identifier Drawable::ValueTreeWrapperBase::idProperty ("id"); - Drawable::ValueTreeWrapperBase::ValueTreeWrapperBase (const ValueTree& state_) : state (state_) { @@ -218,15 +240,15 @@ Drawable::ValueTreeWrapperBase::~ValueTreeWrapperBase() const String Drawable::ValueTreeWrapperBase::getID() const { - return state [idProperty]; + return state [ComponentBuilder::idProperty]; } -void Drawable::ValueTreeWrapperBase::setID (const String& newID, UndoManager* const undoManager) +void Drawable::ValueTreeWrapperBase::setID (const String& newID) { if (newID.isEmpty()) - state.removeProperty (idProperty, undoManager); + state.removeProperty (ComponentBuilder::idProperty, 0); else - state.setProperty (idProperty, newID, undoManager); + state.setProperty (ComponentBuilder::idProperty, newID, 0); } diff --git a/src/gui/graphics/drawables/juce_Drawable.h b/src/gui/graphics/drawables/juce_Drawable.h index 5efb4bd697..fb816fd03a 100644 --- a/src/gui/graphics/drawables/juce_Drawable.h +++ b/src/gui/graphics/drawables/juce_Drawable.h @@ -30,6 +30,7 @@ #include "../geometry/juce_RelativeCoordinate.h" #include "../../../text/juce_XmlElement.h" #include "../../../containers/juce_ValueTree.h" +#include "../../components/layout/juce_ComponentBuilder.h" class DrawableComposite; @@ -157,54 +158,20 @@ public: static Drawable* createFromSVG (const XmlElement& svgDocument); //============================================================================== - /** This class is used when loading Drawables that contain images, and retrieves - the image for a stored identifier. - @see Drawable::createFromValueTree - */ - class JUCE_API ImageProvider - { - public: - ImageProvider() {} - virtual ~ImageProvider() {} - - /** Retrieves the image associated with this identifier, which could be any - kind of string, number, filename, etc. - - The image that is returned will be owned by the caller, but it may come - from the ImageCache. - */ - virtual const Image getImageForIdentifier (const var& imageIdentifier) = 0; - - /** Returns an identifier to be used to refer to a given image. - This is used when converting a drawable into a ValueTree, so if you're - only loading drawables, you can just return a var::null here. - */ - virtual const var getIdentifierForImage (const Image& image) = 0; - }; - /** Tries to create a Drawable from a previously-saved ValueTree. The ValueTree must have been created by the createValueTree() method. If there are any images used within the drawable, you'll need to provide a valid ImageProvider object that can be used to retrieve these images from whatever type of identifier is used to represent them. */ - static Drawable* createFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); - - /** Tries to refresh a Drawable from the same ValueTree that was used to create it. - @returns the damage rectangle that will need repainting due to any changes that were made. - */ - virtual void refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) = 0; + static Drawable* createFromValueTree (const ValueTree& tree, ComponentBuilder::ImageProvider* imageProvider); /** Creates a ValueTree to represent this Drawable. - The VarTree that is returned can be turned back into a Drawable with - createFromValueTree(). - If there are any images used in this drawable, you'll need to provide a valid - ImageProvider object that can be used to create storable representations of them. + The ValueTree that is returned can be turned back into a Drawable with createFromValueTree(). + If there are any images used in this drawable, you'll need to provide a valid ImageProvider + object that can be used to create storable representations of them. */ - virtual const ValueTree createValueTree (ImageProvider* imageProvider) const = 0; - - /** Returns the tag ID that is used for a ValueTree that stores this type of drawable. */ - virtual const Identifier getValueTreeType() const = 0; + virtual const ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const = 0; /** Returns the area that this drawble covers. The result is expressed in this drawable's own coordinate space, and does not take @@ -223,19 +190,18 @@ public: ValueTree& getState() throw() { return state; } const String getID() const; - void setID (const String& newID, UndoManager* undoManager); - static const Identifier idProperty; + void setID (const String& newID); ValueTree state; }; + static void registerDrawableTypes (ComponentBuilder& componentBuilder); + protected: //============================================================================== friend class DrawableComposite; friend class DrawableShape; - /** @internal */ - static Drawable* createChildFromValueTree (DrawableComposite* parent, const ValueTree& tree, ImageProvider* imageProvider); /** @internal */ void transformContextToCorrectOrigin (Graphics& g); /** @internal */ diff --git a/src/gui/graphics/drawables/juce_DrawableComposite.cpp b/src/gui/graphics/drawables/juce_DrawableComposite.cpp index 125570d39e..eccd7978cf 100644 --- a/src/gui/graphics/drawables/juce_DrawableComposite.cpp +++ b/src/gui/graphics/drawables/juce_DrawableComposite.cpp @@ -28,10 +28,6 @@ BEGIN_JUCE_NAMESPACE #include "juce_DrawableComposite.h" -#include "juce_DrawablePath.h" -#include "juce_DrawableImage.h" -#include "juce_DrawableText.h" -#include "../imaging/juce_Image.h" //============================================================================== @@ -49,8 +45,13 @@ DrawableComposite::DrawableComposite (const DrawableComposite& other) : bounds (other.bounds), updateBoundsReentrant (false) { - for (int i = 0; i < other.getNumDrawables(); ++i) - insertDrawable (other.getDrawable(i)->createCopy()); + for (int i = 0; i < other.getNumChildComponents(); ++i) + { + const Drawable* const d = dynamic_cast (getChildComponent(i)); + + if (d != 0) + addAndMakeVisible (d->createCopy()); + } markersX.addCopiesOf (other.markersX); markersY.addCopiesOf (other.markersY); @@ -62,68 +63,17 @@ DrawableComposite::~DrawableComposite() } //============================================================================== -int DrawableComposite::getNumDrawables() const throw() -{ - return getNumChildComponents(); -} - -Drawable* DrawableComposite::getDrawable (int index) const -{ - return dynamic_cast (getChildComponent (index)); -} - -void DrawableComposite::insertDrawable (Drawable* drawable, const int index) -{ - if (drawable != 0) - addAndMakeVisible (drawable, index); -} - -void DrawableComposite::insertDrawable (const Drawable& drawable, const int index) -{ - insertDrawable (drawable.createCopy(), index); -} - -void DrawableComposite::removeDrawable (const int index, const bool deleteDrawable) -{ - Drawable* const d = getDrawable (index); - - if (deleteDrawable) - delete d; - else - removeChildComponent (d); -} - -Drawable* DrawableComposite::getDrawableWithName (const String& name) const throw() -{ - for (int i = getNumChildComponents(); --i >= 0;) - if (getChildComponent(i)->getName() == name) - return getDrawable (i); - - return 0; -} - -void DrawableComposite::bringToFront (const int index) -{ - Drawable* d = getDrawable (index); - if (d != 0) - d->toFront (false); -} - const Rectangle DrawableComposite::getDrawableBounds() const { Rectangle r; - for (int i = getNumDrawables(); --i >= 0;) + for (int i = getNumChildComponents(); --i >= 0;) { - Drawable* const d = getDrawable(i); + const Drawable* const d = dynamic_cast (getChildComponent(i)); if (d != 0) - { - if (d->isTransformed()) - r = r.getUnion (d->getDrawableBounds().transformed (d->getTransform())); - else - r = r.getUnion (d->getDrawableBounds()); - } + r = r.getUnion (d->isTransformed() ? d->getDrawableBounds().transformed (d->getTransform()) + : d->getDrawableBounds()); } return r; @@ -131,9 +81,9 @@ const Rectangle DrawableComposite::getDrawableBounds() const void DrawableComposite::markerHasMoved() { - for (int i = getNumDrawables(); --i >= 0;) + for (int i = getNumChildComponents(); --i >= 0;) { - Drawable* const d = getDrawable(i); + Drawable* const d = dynamic_cast (getChildComponent(i)); if (d != 0) d->markerHasMoved(); @@ -383,69 +333,6 @@ ValueTree DrawableComposite::ValueTreeWrapper::getChildListCreating (UndoManager return state.getOrCreateChildWithName (childGroupTag, undoManager); } -int DrawableComposite::ValueTreeWrapper::getNumDrawables() const -{ - return getChildList().getNumChildren(); -} - -ValueTree DrawableComposite::ValueTreeWrapper::getDrawableState (int index) const -{ - return getChildList().getChild (index); -} - -ValueTree DrawableComposite::ValueTreeWrapper::getDrawableWithId (const String& objectId, bool recursive) const -{ - if (getID() == objectId) - return state; - - if (! recursive) - { - return getChildList().getChildWithProperty (idProperty, objectId); - } - else - { - const ValueTree childList (getChildList()); - - for (int i = getNumDrawables(); --i >= 0;) - { - const ValueTree& child = childList.getChild (i); - - if (child [Drawable::ValueTreeWrapperBase::idProperty] == objectId) - return child; - - if (child.hasType (DrawableComposite::valueTreeType)) - { - ValueTree v (DrawableComposite::ValueTreeWrapper (child).getDrawableWithId (objectId, true)); - - if (v.isValid()) - return v; - } - } - - return ValueTree::invalid; - } -} - -int DrawableComposite::ValueTreeWrapper::indexOfDrawable (const ValueTree& item) const -{ - return getChildList().indexOf (item); -} - -void DrawableComposite::ValueTreeWrapper::addDrawable (const ValueTree& newDrawableState, int index, UndoManager* undoManager) -{ - getChildListCreating (undoManager).addChild (newDrawableState, index, undoManager); -} - -void DrawableComposite::ValueTreeWrapper::moveDrawableOrder (int currentIndex, int newIndex, UndoManager* undoManager) -{ - getChildListCreating (undoManager).moveChild (currentIndex, newIndex, undoManager); -} - -void DrawableComposite::ValueTreeWrapper::removeDrawable (const ValueTree& child, UndoManager* undoManager) -{ - getChildList().removeChild (child, undoManager); -} - const RelativeParallelogram DrawableComposite::ValueTreeWrapper::getBoundingBox() const { return RelativeParallelogram (state.getProperty (topLeft, "0, 0"), @@ -551,10 +438,10 @@ void DrawableComposite::ValueTreeWrapper::removeMarker (bool xAxis, const ValueT } //============================================================================== -void DrawableComposite::refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) +void DrawableComposite::refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder) { const ValueTreeWrapper wrapper (tree); - setName (wrapper.getID()); + setComponentID (wrapper.getID()); const RelativeParallelogram newBounds (wrapper.getBoundingBox()); if (bounds != newBounds) @@ -594,50 +481,27 @@ void DrawableComposite::refreshFromValueTree (const ValueTree& tree, ImageProvid *m = newMarker; } - // Remove deleted drawables.. - for (i = getNumDrawables(); --i >= wrapper.getNumDrawables();) - delete getDrawable(i); - - // Update drawables and add new ones.. - for (i = 0; i < wrapper.getNumDrawables(); ++i) - { - const ValueTree newDrawable (wrapper.getDrawableState (i)); - Drawable* d = getDrawable(i); - - if (d != 0) - { - if (newDrawable.hasType (d->getValueTreeType())) - { - d->refreshFromValueTree (newDrawable, imageProvider); - } - else - { - delete d; - d = 0; - } - } - - if (d == 0) - { - d = createChildFromValueTree (this, newDrawable, imageProvider); - addAndMakeVisible (d, i); - } - } + builder.updateChildComponents (*this, wrapper.getChildList()); refreshTransformFromBounds(); } -const ValueTree DrawableComposite::createValueTree (ImageProvider* imageProvider) const +const ValueTree DrawableComposite::createValueTree (ComponentBuilder::ImageProvider* imageProvider) const { ValueTree tree (valueTreeType); ValueTreeWrapper v (tree); - v.setID (getName(), 0); + v.setID (getComponentID()); v.setBoundingBox (bounds, 0); + ValueTree childList (v.getChildListCreating (0)); + int i; - for (i = 0; i < getNumDrawables(); ++i) - v.addDrawable (getDrawable(i)->createValueTree (imageProvider), -1, 0); + for (i = getNumChildComponents(); --i >= 0;) + { + const Drawable* const d = dynamic_cast (getChildComponent(i)); + childList.addChild (d->createValueTree (imageProvider), -1, 0); + } for (i = 0; i < markersX.size(); ++i) v.setMarker (true, *markersX.getUnchecked(i), 0); diff --git a/src/gui/graphics/drawables/juce_DrawableComposite.h b/src/gui/graphics/drawables/juce_DrawableComposite.h index 71d98cbcca..62dcccbfae 100644 --- a/src/gui/graphics/drawables/juce_DrawableComposite.h +++ b/src/gui/graphics/drawables/juce_DrawableComposite.h @@ -49,75 +49,6 @@ public: /** Destructor. */ ~DrawableComposite(); - //============================================================================== - /** Adds a new sub-drawable to this one. - - This passes in a Drawable pointer for this object to look after. To add a copy - of a drawable, use the form of this method that takes a Drawable reference instead. - - @param drawable the object to add - this will be deleted automatically - when no longer needed, so the caller mustn't keep any - pointers to it. - @param index where to insert it in the list of drawables. 0 is the back, - -1 is the front, or any value from 0 and getNumDrawables() - can be used - @see removeDrawable - */ - void insertDrawable (Drawable* drawable, int index = -1); - - /** Adds a new sub-drawable to this one. - - This takes a copy of a Drawable and adds it to this object. To pass in a Drawable - for this object to look after, use the form of this method that takes a Drawable - pointer instead. - - @param drawable the object to add - an internal copy will be made of this object - @param index where to insert it in the list of drawables. 0 is the back, - -1 is the front, or any value from 0 and getNumDrawables() - can be used - @see removeDrawable - */ - void insertDrawable (const Drawable& drawable, int index = -1); - - /** Deletes one of the Drawable objects. - - @param index the index of the drawable to delete, between 0 - and (getNumDrawables() - 1). - @param deleteDrawable if this is true, the drawable that is removed will also - be deleted. If false, it'll just be removed. - @see insertDrawable, getNumDrawables - */ - void removeDrawable (int index, bool deleteDrawable = true); - - /** Returns the number of drawables contained inside this one. - - @see getDrawable - */ - int getNumDrawables() const throw(); - - /** Returns one of the drawables that are contained in this one. - - Each drawable also has a transform associated with it - you can use getDrawableTransform() - to find it. - - The pointer returned is managed by this object and will be deleted when no longer - needed, so be careful what you do with it. - - @see getNumDrawables - */ - Drawable* getDrawable (int index) const; - - /** Looks for a child drawable with the specified name. */ - Drawable* getDrawableWithName (const String& name) const throw(); - - /** Brings one of the Drawables to the front. - - @param index the index of the drawable to move, between 0 - and (getNumDrawables() - 1). - @see insertDrawable, getNumDrawables - */ - void bringToFront (int index); - //============================================================================== /** Sets the parallelogram that defines the target position of the content rectangle when the drawable is rendered. @see setContentArea @@ -185,14 +116,12 @@ public: /** @internal */ Drawable* createCopy() const; /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); + void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); /** @internal */ - const ValueTree createValueTree (ImageProvider* imageProvider) const; + const ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; /** @internal */ static const Identifier valueTreeType; /** @internal */ - const Identifier getValueTreeType() const { return valueTreeType; } - /** @internal */ const Expression getSymbolValue (const String& symbol, const String& member) const; /** @internal */ const Rectangle getDrawableBounds() const; @@ -212,13 +141,8 @@ public: public: ValueTreeWrapper (const ValueTree& state); - int getNumDrawables() const; - ValueTree getDrawableState (int index) const; - ValueTree getDrawableWithId (const String& objectId, bool recursive) const; - int indexOfDrawable (const ValueTree& item) const; - void addDrawable (const ValueTree& newDrawableState, int index, UndoManager* undoManager); - void moveDrawableOrder (int currentIndex, int newIndex, UndoManager* undoManager); - void removeDrawable (const ValueTree& child, UndoManager* undoManager); + ValueTree getChildList() const; + ValueTree getChildListCreating (UndoManager* undoManager); const RelativeParallelogram getBoundingBox() const; void setBoundingBox (const RelativeParallelogram& newBounds, UndoManager* undoManager); @@ -240,8 +164,6 @@ public: private: static const Identifier childGroupTag, markerGroupTagX, markerGroupTagY, markerTag; - ValueTree getChildList() const; - ValueTree getChildListCreating (UndoManager* undoManager); ValueTree getMarkerList (bool xAxis) const; ValueTree getMarkerListCreating (bool xAxis, UndoManager* undoManager); }; diff --git a/src/gui/graphics/drawables/juce_DrawableImage.cpp b/src/gui/graphics/drawables/juce_DrawableImage.cpp index b8303e7fc9..43ae0d6d8b 100644 --- a/src/gui/graphics/drawables/juce_DrawableImage.cpp +++ b/src/gui/graphics/drawables/juce_DrawableImage.cpp @@ -226,10 +226,10 @@ void DrawableImage::ValueTreeWrapper::setBoundingBox (const RelativeParallelogra //============================================================================== -void DrawableImage::refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) +void DrawableImage::refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder) { const ValueTreeWrapper controller (tree); - setName (controller.getID()); + setComponentID (controller.getID()); const float newOpacity = controller.getOpacity(); const Colour newOverlayColour (controller.getOverlayColour()); @@ -237,10 +237,11 @@ void DrawableImage::refreshFromValueTree (const ValueTree& tree, ImageProvider* Image newImage; const var imageIdentifier (controller.getImageIdentifier()); - jassert (imageProvider != 0 || imageIdentifier.isVoid()); // if you're using images, you need to provide something that can load and save them! - if (imageProvider != 0) - newImage = imageProvider->getImageForIdentifier (imageIdentifier); + jassert (builder.getImageProvider() != 0 || imageIdentifier.isVoid()); // if you're using images, you need to provide something that can load and save them! + + if (builder.getImageProvider() != 0) + newImage = builder.getImageProvider()->getImageForIdentifier (imageIdentifier); const RelativeParallelogram newBounds (controller.getBoundingBox()); @@ -259,12 +260,12 @@ void DrawableImage::refreshFromValueTree (const ValueTree& tree, ImageProvider* } } -const ValueTree DrawableImage::createValueTree (ImageProvider* imageProvider) const +const ValueTree DrawableImage::createValueTree (ComponentBuilder::ImageProvider* imageProvider) const { ValueTree tree (valueTreeType); ValueTreeWrapper v (tree); - v.setID (getName(), 0); + v.setID (getComponentID()); v.setOpacity (opacity, 0); v.setOverlayColour (overlayColour, 0); v.setBoundingBox (bounds, 0); diff --git a/src/gui/graphics/drawables/juce_DrawableImage.h b/src/gui/graphics/drawables/juce_DrawableImage.h index 8c318b7856..aa0f5b3047 100644 --- a/src/gui/graphics/drawables/juce_DrawableImage.h +++ b/src/gui/graphics/drawables/juce_DrawableImage.h @@ -92,13 +92,11 @@ public: /** @internal */ const Rectangle getDrawableBounds() const; /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); + void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); /** @internal */ - const ValueTree createValueTree (ImageProvider* imageProvider) const; + const ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; /** @internal */ static const Identifier valueTreeType; - /** @internal */ - const Identifier getValueTreeType() const { return valueTreeType; } //============================================================================== /** Internally-used class for wrapping a DrawableImage's state into a ValueTree. */ diff --git a/src/gui/graphics/drawables/juce_DrawablePath.cpp b/src/gui/graphics/drawables/juce_DrawablePath.cpp index 582574a840..f6c2a005db 100644 --- a/src/gui/graphics/drawables/juce_DrawablePath.cpp +++ b/src/gui/graphics/drawables/juce_DrawablePath.cpp @@ -440,12 +440,12 @@ void DrawablePath::ValueTreeWrapper::Element::removePoint (UndoManager* undoMana } //============================================================================== -void DrawablePath::refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) +void DrawablePath::refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder) { ValueTreeWrapper v (tree); - setName (v.getID()); + setComponentID (v.getID()); - if (refreshFillTypes (v, getParent(), imageProvider)) + if (refreshFillTypes (v, getParent(), builder.getImageProvider())) repaint(); ScopedPointer newRelativePath (new RelativePointPath (tree)); @@ -467,12 +467,12 @@ void DrawablePath::refreshFromValueTree (const ValueTree& tree, ImageProvider* i relativePath = newRelativePath; } -const ValueTree DrawablePath::createValueTree (ImageProvider* imageProvider) const +const ValueTree DrawablePath::createValueTree (ComponentBuilder::ImageProvider* imageProvider) const { ValueTree tree (valueTreeType); ValueTreeWrapper v (tree); - v.setID (getName(), 0); + v.setID (getComponentID()); writeTo (v, imageProvider, 0); if (relativePath != 0) diff --git a/src/gui/graphics/drawables/juce_DrawablePath.h b/src/gui/graphics/drawables/juce_DrawablePath.h index 766fca16fd..84c65bdf45 100644 --- a/src/gui/graphics/drawables/juce_DrawablePath.h +++ b/src/gui/graphics/drawables/juce_DrawablePath.h @@ -64,13 +64,11 @@ public: /** @internal */ Drawable* createCopy() const; /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); + void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); /** @internal */ - const ValueTree createValueTree (ImageProvider* imageProvider) const; + const ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; /** @internal */ static const Identifier valueTreeType; - /** @internal */ - const Identifier getValueTreeType() const { return valueTreeType; } //============================================================================== /** Internally-used class for wrapping a DrawablePath's state into a ValueTree. */ diff --git a/src/gui/graphics/drawables/juce_DrawableRectangle.cpp b/src/gui/graphics/drawables/juce_DrawableRectangle.cpp index fb252bf6d3..855bd8938b 100644 --- a/src/gui/graphics/drawables/juce_DrawableRectangle.cpp +++ b/src/gui/graphics/drawables/juce_DrawableRectangle.cpp @@ -143,12 +143,12 @@ Value DrawableRectangle::ValueTreeWrapper::getCornerSizeValue (UndoManager* undo } //============================================================================== -void DrawableRectangle::refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) +void DrawableRectangle::refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder) { ValueTreeWrapper v (tree); - setName (v.getID()); + setComponentID (v.getID()); - if (refreshFillTypes (v, getParent(), imageProvider)) + if (refreshFillTypes (v, getParent(), builder.getImageProvider())) repaint(); RelativeParallelogram newBounds (v.getRectangle()); @@ -166,12 +166,12 @@ void DrawableRectangle::refreshFromValueTree (const ValueTree& tree, ImageProvid } } -const ValueTree DrawableRectangle::createValueTree (ImageProvider* imageProvider) const +const ValueTree DrawableRectangle::createValueTree (ComponentBuilder::ImageProvider* imageProvider) const { ValueTree tree (valueTreeType); ValueTreeWrapper v (tree); - v.setID (getName(), 0); + v.setID (getComponentID()); writeTo (v, imageProvider, 0); v.setRectangle (bounds, 0); v.setCornerSize (cornerSize, 0); diff --git a/src/gui/graphics/drawables/juce_DrawableRectangle.h b/src/gui/graphics/drawables/juce_DrawableRectangle.h index 432b95f1dd..28a019bf6d 100644 --- a/src/gui/graphics/drawables/juce_DrawableRectangle.h +++ b/src/gui/graphics/drawables/juce_DrawableRectangle.h @@ -64,13 +64,11 @@ public: /** @internal */ Drawable* createCopy() const; /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); + void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); /** @internal */ - const ValueTree createValueTree (ImageProvider* imageProvider) const; + const ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; /** @internal */ static const Identifier valueTreeType; - /** @internal */ - const Identifier getValueTreeType() const { return valueTreeType; } //============================================================================== /** Internally-used class for wrapping a DrawableRectangle's state into a ValueTree. */ diff --git a/src/gui/graphics/drawables/juce_DrawableShape.cpp b/src/gui/graphics/drawables/juce_DrawableShape.cpp index 8534071112..6ff8e267da 100644 --- a/src/gui/graphics/drawables/juce_DrawableShape.cpp +++ b/src/gui/graphics/drawables/juce_DrawableShape.cpp @@ -78,7 +78,7 @@ bool DrawableShape::isStrokeVisible() const throw() bool DrawableShape::refreshFillTypes (const FillAndStrokeState& newState, Expression::EvaluationContext* /*nameFinder*/, - ImageProvider* imageProvider) + ComponentBuilder::ImageProvider* imageProvider) { bool hasChanged = false; @@ -105,7 +105,7 @@ bool DrawableShape::refreshFillTypes (const FillAndStrokeState& newState, return hasChanged; } -void DrawableShape::writeTo (FillAndStrokeState& state, ImageProvider* imageProvider, UndoManager* undoManager) const +void DrawableShape::writeTo (FillAndStrokeState& state, ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager) const { state.setMainFill (mainFill, 0, 0, 0, imageProvider, undoManager); state.setStrokeFill (strokeFill, 0, 0, 0, imageProvider, undoManager); @@ -182,7 +182,7 @@ DrawableShape::FillAndStrokeState::FillAndStrokeState (const ValueTree& state_) } const FillType DrawableShape::FillAndStrokeState::getMainFill (Expression::EvaluationContext* nameFinder, - ImageProvider* imageProvider) const + ComponentBuilder::ImageProvider* imageProvider) const { return readFillType (state.getChildWithName (fill), 0, 0, 0, nameFinder, imageProvider); } @@ -198,14 +198,14 @@ ValueTree DrawableShape::FillAndStrokeState::getMainFillState() } void DrawableShape::FillAndStrokeState::setMainFill (const FillType& newFill, const RelativePoint* gp1, const RelativePoint* gp2, - const RelativePoint* gp3, ImageProvider* imageProvider, UndoManager* undoManager) + const RelativePoint* gp3, ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager) { ValueTree v (state.getOrCreateChildWithName (fill, undoManager)); writeFillType (v, newFill, gp1, gp2, gp3, imageProvider, undoManager); } const FillType DrawableShape::FillAndStrokeState::getStrokeFill (Expression::EvaluationContext* nameFinder, - ImageProvider* imageProvider) const + ComponentBuilder::ImageProvider* imageProvider) const { return readFillType (state.getChildWithName (stroke), 0, 0, 0, nameFinder, imageProvider); } @@ -221,7 +221,7 @@ ValueTree DrawableShape::FillAndStrokeState::getStrokeFillState() } void DrawableShape::FillAndStrokeState::setStrokeFill (const FillType& newFill, const RelativePoint* gp1, const RelativePoint* gp2, - const RelativePoint* gp3, ImageProvider* imageProvider, UndoManager* undoManager) + const RelativePoint* gp3, ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager) { ValueTree v (state.getOrCreateChildWithName (stroke, undoManager)); writeFillType (v, newFill, gp1, gp2, gp3, imageProvider, undoManager); @@ -251,7 +251,7 @@ void DrawableShape::FillAndStrokeState::setStrokeType (const PathStrokeType& new } const FillType DrawableShape::FillAndStrokeState::readFillType (const ValueTree& v, RelativePoint* const gp1, RelativePoint* const gp2, RelativePoint* const gp3, - Expression::EvaluationContext* const nameFinder, ImageProvider* imageProvider) + Expression::EvaluationContext* const nameFinder, ComponentBuilder::ImageProvider* imageProvider) { const String newType (v[type].toString()); @@ -326,7 +326,7 @@ namespace DrawableShapeHelpers void DrawableShape::FillAndStrokeState::writeFillType (ValueTree& v, const FillType& fillType, const RelativePoint* const gp1, const RelativePoint* const gp2, const RelativePoint* gp3, - ImageProvider* imageProvider, UndoManager* const undoManager) + ComponentBuilder::ImageProvider* imageProvider, UndoManager* const undoManager) { if (fillType.isColour()) { diff --git a/src/gui/graphics/drawables/juce_DrawableShape.h b/src/gui/graphics/drawables/juce_DrawableShape.h index 20eccebe76..8a4baefcad 100644 --- a/src/gui/graphics/drawables/juce_DrawableShape.h +++ b/src/gui/graphics/drawables/juce_DrawableShape.h @@ -96,18 +96,18 @@ public: FillAndStrokeState (const ValueTree& state); const FillType getMainFill (Expression::EvaluationContext* nameFinder, - ImageProvider* imageProvider) const; + ComponentBuilder::ImageProvider* imageProvider) const; ValueTree getMainFillState(); void setMainFill (const FillType& newFill, const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, const RelativePoint* gradientPoint3, - ImageProvider* imageProvider, UndoManager* undoManager); + ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager); const FillType getStrokeFill (Expression::EvaluationContext* nameFinder, - ImageProvider* imageProvider) const; + ComponentBuilder::ImageProvider* imageProvider) const; ValueTree getStrokeFillState(); void setStrokeFill (const FillType& newFill, const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, const RelativePoint* gradientPoint3, - ImageProvider* imageProvider, UndoManager* undoManager); + ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager); const PathStrokeType getStrokeType() const; void setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager); @@ -115,11 +115,11 @@ public: static const FillType readFillType (const ValueTree& v, RelativePoint* gradientPoint1, RelativePoint* gradientPoint2, RelativePoint* gradientPoint3, Expression::EvaluationContext* nameFinder, - ImageProvider* imageProvider); + ComponentBuilder::ImageProvider* imageProvider); static void writeFillType (ValueTree& v, const FillType& fillType, const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, - const RelativePoint* gradientPoint3, ImageProvider* imageProvider, + const RelativePoint* gradientPoint3, ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager); static const Identifier type, colour, colours, fill, stroke, path, jointStyle, capStyle, strokeWidth, @@ -149,10 +149,10 @@ protected: /** Updates the details from a FillAndStrokeState object, returning true if something changed. */ bool refreshFillTypes (const FillAndStrokeState& newState, Expression::EvaluationContext* nameFinder, - ImageProvider* imageProvider); + ComponentBuilder::ImageProvider* imageProvider); /** Writes the stroke and fill details to a FillAndStrokeState object. */ - void writeTo (FillAndStrokeState& state, ImageProvider* imageProvider, UndoManager* undoManager) const; + void writeTo (FillAndStrokeState& state, ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager) const; //============================================================================== diff --git a/src/gui/graphics/drawables/juce_DrawableText.cpp b/src/gui/graphics/drawables/juce_DrawableText.cpp index 68d78fd93c..658d5048dc 100644 --- a/src/gui/graphics/drawables/juce_DrawableText.cpp +++ b/src/gui/graphics/drawables/juce_DrawableText.cpp @@ -239,10 +239,10 @@ void DrawableText::ValueTreeWrapper::setFontSizeControlPoint (const RelativePoin } //============================================================================== -void DrawableText::refreshFromValueTree (const ValueTree& tree, ImageProvider*) +void DrawableText::refreshFromValueTree (const ValueTree& tree, ComponentBuilder&) { ValueTreeWrapper v (tree); - setName (v.getID()); + setComponentID (v.getID()); const RelativeParallelogram newBounds (v.getBoundingBox()); const RelativePoint newFontPoint (v.getFontSizeControlPoint()); @@ -264,12 +264,12 @@ void DrawableText::refreshFromValueTree (const ValueTree& tree, ImageProvider*) } } -const ValueTree DrawableText::createValueTree (ImageProvider*) const +const ValueTree DrawableText::createValueTree (ComponentBuilder::ImageProvider*) const { ValueTree tree (valueTreeType); ValueTreeWrapper v (tree); - v.setID (getName(), 0); + v.setID (getComponentID()); v.setText (text, 0); v.setFont (font, 0); v.setJustification (justification, 0); diff --git a/src/gui/graphics/drawables/juce_DrawableText.h b/src/gui/graphics/drawables/juce_DrawableText.h index 2d79c80a5c..6288262dd9 100644 --- a/src/gui/graphics/drawables/juce_DrawableText.h +++ b/src/gui/graphics/drawables/juce_DrawableText.h @@ -91,14 +91,12 @@ public: /** @internal */ Drawable* createCopy() const; /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); + void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); /** @internal */ - const ValueTree createValueTree (ImageProvider* imageProvider) const; + const ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; /** @internal */ static const Identifier valueTreeType; /** @internal */ - const Identifier getValueTreeType() const { return valueTreeType; } - /** @internal */ const Rectangle getDrawableBounds() const; //============================================================================== diff --git a/src/gui/graphics/drawables/juce_SVGParser.cpp b/src/gui/graphics/drawables/juce_SVGParser.cpp index 6ef65bb68a..8c68c87e3a 100644 --- a/src/gui/graphics/drawables/juce_SVGParser.cpp +++ b/src/gui/graphics/drawables/juce_SVGParser.cpp @@ -161,7 +161,7 @@ private: else if (e->hasTagName ("switch")) d = parseSwitch (*e); else if (e->hasTagName ("style")) parseCSSStyle (*e); - parentDrawable->insertDrawable (d); + parentDrawable->addAndMakeVisible (d); } } diff --git a/src/juce_app_includes.h b/src/juce_app_includes.h index 7f3eb7db63..5381a0caa8 100644 --- a/src/juce_app_includes.h +++ b/src/juce_app_includes.h @@ -428,6 +428,9 @@ #ifndef __JUCE_COMPONENTBOUNDSCONSTRAINER_JUCEHEADER__ #include "gui/components/layout/juce_ComponentBoundsConstrainer.h" #endif +#ifndef __JUCE_COMPONENTBUILDER_JUCEHEADER__ + #include "gui/components/layout/juce_ComponentBuilder.h" +#endif #ifndef __JUCE_COMPONENTMOVEMENTWATCHER_JUCEHEADER__ #include "gui/components/layout/juce_ComponentMovementWatcher.h" #endif diff --git a/src/native/windows/juce_win32_Windowing.cpp b/src/native/windows/juce_win32_Windowing.cpp index df12b6d9e2..3f743e9331 100644 --- a/src/native/windows/juce_win32_Windowing.cpp +++ b/src/native/windows/juce_win32_Windowing.cpp @@ -54,8 +54,6 @@ extern bool juce_IsRunningInWine(); #define AC_SRC_ALPHA 0x01 #endif -static HPALETTE palette = 0; -static bool createPaletteIfNeeded = true; static bool shouldDeactivateTitleBar = true; #define WM_TRAYNOTIFY WM_USER + 100 @@ -249,25 +247,6 @@ public: hdd = DrawDibOpen(); } - if (createPaletteIfNeeded) - { - HDC dc = GetDC (0); - const int n = GetDeviceCaps (dc, BITSPIXEL); - ReleaseDC (0, dc); - - if (n <= 8) - palette = CreateHalftonePalette (dc); - - createPaletteIfNeeded = false; - } - - if (palette != 0) - { - SelectPalette (dc, palette, FALSE); - RealizePalette (dc); - SetStretchBltMode (dc, HALFTONE); - } - SetMapMode (dc, MM_TEXT); if (transparent) @@ -2201,13 +2180,8 @@ private: case WM_SYNCPAINT: return 0; - case WM_PALETTECHANGED: - InvalidateRect (h, 0, 0); - break; - case WM_DISPLAYCHANGE: InvalidateRect (h, 0, 0); - createPaletteIfNeeded = true; // intentional fall-through... case WM_SETTINGCHANGE: // note the fall-through in the previous case! doSettingChange();