From f5d5e297c656fb1304cccd72e9ac347c0bddbd09 Mon Sep 17 00:00:00 2001 From: Juan Prieto Date: Mon, 5 Oct 2009 22:44:40 +0000 Subject: [PATCH] Works with visual studio 2009 --- kernel/CMakeLists.txt | 1 + .../bbRegeneratePackageDoc.cpp | 12 +- kernel/cmake/BBTKBuildHtmlDocFromLatex.cmake | 3 + kernel/cmake/BBTKBuildLatexDoc.cmake | 5 +- kernel/doc/bbtkUsersGuide/bbCommand.png | Bin 1295413 -> 5 bytes kernel/doc/bbtkUsersGuide/bbFile0.png | Bin 16029 -> 5 bytes kernel/doc/bbtkUsersGuide/bbFiles.png | Bin 2603680 -> 5 bytes .../doc/bbtkUsersGuide/bbPackageBrowser.png | Bin 5288862 -> 5 bytes kernel/doc/bbtkWebSite/home.html | 29 +- kernel/src/CMakeLists.txt | 2 +- .../wx/treemultictrl/mac_collapse.xpm | 50 +- .../wx/treemultictrl/mac_expand.xpm | 50 +- .../ThirdParty/wx/treemultictrl/tmcimages.h | 84 +- .../wx/treemultictrl/win_checked_icon.xpm | 546 +-- .../wx/treemultictrl/win_tristate_icon.xpm | 546 +-- .../wx/treemultictrl/win_unchecked_icon.xpm | 546 +-- .../wx/treemultictrl/wxTreeMultiCtrl.cpp | 3970 ++++++++--------- .../wx/treemultictrl/wxTreeMultiCtrl.h | 658 +-- kernel/src/bbtkBlackBox.h | 9 +- kernel/src/bbtkComplexBlackBox.cxx | 21 +- kernel/src/bbtkComplexBlackBox.h | 5 +- kernel/src/bbtkFactory.cxx | 297 +- kernel/src/bbtkInterpreter.cxx | 99 +- kernel/src/bbtkUtilities.cxx | 46 +- .../toolsbbtk/bbs/appli/GUICreatePackage.bbs | 1 - packages/wx/src/bbwxSlider.cxx | 6 +- 26 files changed, 3506 insertions(+), 3480 deletions(-) diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index eeae142..3068544 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -30,3 +30,4 @@ SUBDIRS(install) #----------------------------------------------------------------------------- SUBDIRS(data) #----------------------------------------------------------------------------- +SUBDIRS(bin) \ No newline at end of file diff --git a/kernel/appli/bbRegeneratePackageDoc/bbRegeneratePackageDoc.cpp b/kernel/appli/bbRegeneratePackageDoc/bbRegeneratePackageDoc.cpp index cfae87e..b6a492f 100644 --- a/kernel/appli/bbRegeneratePackageDoc/bbRegeneratePackageDoc.cpp +++ b/kernel/appli/bbRegeneratePackageDoc/bbRegeneratePackageDoc.cpp @@ -45,7 +45,6 @@ void Usage() //========================================================================== int main(int argc, char **argv) { - std::string pack("-a"); if (argc==2) { @@ -68,34 +67,37 @@ int main(int argc, char **argv) Usage(); return 0; } - + try { std::string doc_path = bbtk::ConfigurationFile::GetInstance().Get_doc_path(); doc_path += bbtk::ConfigurationFile::GetInstance().Get_file_separator(); doc_path += "bbdoc"; doc_path += bbtk::ConfigurationFile::GetInstance().Get_file_separator(); - bbtk::Interpreter::Pointer I = bbtk::Interpreter::New(); I->SetCommandLine(true); I->SetThrow(false); +//std::cout<<"JCP bbRegeneratePackageDoc.cpp I->InterpretLine( exec freeze_no_error);"<InterpretLine( "exec freeze_no_error"); if (pack != "-a") { + I->InterpretLine( "include "+pack); I->InterpretLine( "include "+pack+"-appli"); bbtk::Package::Pointer p = I->GetExecuter()->GetFactory()->GetPackage(pack); - +//std::cout<<"JCP bbRegeneratePackageDoc.cpp RegenerateDoc(I->GetExecuter()->GetFactory()->GetPackage(pack),doc_path);"<GetExecuter()->GetFactory()->GetPackage(pack),doc_path); } else { -I->InterpretLine( "include *"); +std::cout<<"JCP bbRegeneratePackageDoc.cpp I->InterpretLine( include );"<InterpretLine( "include *"); bbtk::Factory::PackageMapType::const_iterator i; for (i = I->GetExecuter()->GetFactory()->GetPackageMap().begin(); i != I->GetExecuter()->GetFactory()->GetPackageMap().end(); ++i) { +std::cout<<" if (i->second->GetName()==user) continue;"<second->GetName()=="user") continue; RegenerateDoc(i->second,doc_path); } diff --git a/kernel/cmake/BBTKBuildHtmlDocFromLatex.cmake b/kernel/cmake/BBTKBuildHtmlDocFromLatex.cmake index cbbf5f2..d96acb1 100644 --- a/kernel/cmake/BBTKBuildHtmlDocFromLatex.cmake +++ b/kernel/cmake/BBTKBuildHtmlDocFromLatex.cmake @@ -7,6 +7,9 @@ MACRO(BBTK_BUILD_HTML_DOC_FROM_LATEX TEX_FILE OUTPUT_REL_PATH) SET(BUILD_PATH ${BBTK_DOC_BUILD_PATH}/${OUTPUT_REL_PATH}) #------------------------------------------------------------------------- + IF(WIN32) + SET(TTH_EXECUTABLE "${TTH_EXECUTABLE}/tth.exe") + ENDIF(WIN32) ADD_CUSTOM_COMMAND( OUTPUT ${BUILD_PATH}/${TEX_FILE}.html diff --git a/kernel/cmake/BBTKBuildLatexDoc.cmake b/kernel/cmake/BBTKBuildLatexDoc.cmake index bd07c4f..e62d358 100644 --- a/kernel/cmake/BBTKBuildLatexDoc.cmake +++ b/kernel/cmake/BBTKBuildLatexDoc.cmake @@ -1,6 +1,8 @@ MACRO(BBTK_BUILD_LATEX_DOC TEX_FILE OUTPUT_REL_PATH) + + # Need LaTeX SET(USE_LATEX ON CACHE BOOL "" FORCE) # Construct absolute build path @@ -12,6 +14,7 @@ MACRO(BBTK_BUILD_LATEX_DOC TEX_FILE OUTPUT_REL_PATH) ${BUILD_PATH}/${TEX_FILE}.tex COPYONLY ) + CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/../config.tex ${BUILD_PATH}/config.tex @@ -24,7 +27,7 @@ MACRO(BBTK_BUILD_LATEX_DOC TEX_FILE OUTPUT_REL_PATH) ) #--------------------------------------------------------------------------- FILE(TO_NATIVE_PATH ${BUILD_PATH} THE_BUILD_PATH) - +#message("BBTKBUILLATEXDOC;CMAKE LATEX COMPILER + ${LATEX_COMPILER}") # Have to run latex twice to get references, toc, etc. ADD_CUSTOM_COMMAND( OUTPUT ${BUILD_PATH}/${TEX_FILE}.aux diff --git a/kernel/doc/bbtkUsersGuide/bbCommand.png b/kernel/doc/bbtkUsersGuide/bbCommand.png index 63bbb6426bd5f0a3062c1f766f5eb04aed4fdf79..f1ad7558e4917c38d1dafc49f7bccac10219adee 100644 GIT binary patch literal 5 McmeAS@N?$^00ndbc>n+a literal 1295413 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 z%t>0ST;0002sHgrC2lNA5}008gtLG{f3mv z6aZJ+GW^j4&YTM{C1b%7004m7KnDc?0000qs-OPnZfDK~05FEm z3IG5A006iRbWi{Q0002MZJ>h!0FE}Vb(_+d3jhEB0ELFm3IG5A006iRT@K+l9RUCU z0HBzw_l?hMmT zvRf1z0Bq6u>TrPy000000JsMXsQ>@~004m7KnDdpM*9sVMi${*000000B|v#4%58= z00000z)fH@1poj5z-g|hzng`*000Gr&I$kk0002E4V^E3-4Or)0002ogf1W;&`q)e zP;9-tR0001QpnITWXKyG60Jxh~)uTQx>bU>_ z007`sbaUs;_NoE_00000falWv{M%;F%{>4B004mF-2D5-UziKvMszwKA2-Sl00000 z02F6B9e#cu000000NjMm*VorgvH}3$8CuLuc@%R20001-PnVLC;`~$q0000005s6u zOunrl7ytkO004Ndpp-rzx@0cEl$^NMJMt000000NjQ>qbUFY0G_8}{UZsO3jhG%k#ruJYXATM008hx z=%4@q0001h+dv0J=yW`6qwD4ZOv#z-HVpy*0002Mt)RyO000000B!>v6aWAK&(omq zpH*Eq7XSdDh@i6q000000B!>v6aWAK003|sy6nshx5*4R*3$!5tifCW00000@Kn0w zYv(;R?*IS*007`+bUs;WURERk008h@Z+-FQHOvJ700Uii7N&jy00000fP2uTrC~G$ z000000NjI4=j-PlIRVhlr}-;OT|5_HO3q~M`2_#~0Dywh1qMeHbXx!b00000hth>a zR&Z#900000VC<{a9gewpE&zZ>(&_Y={{;X50002)0Y5(v000000B!>v6aaTIH!)!r z<^li!001a-l%qTc000000B|XcrT_o{06;-akNE5w<^q7zptAx10002+|LxrilvQQf z0N{5v!>9#;axn!>G(|3ockYs=re>1Y@=|$8O1pRmL~%yJyLrjV)WRF3rA47x{c9B_ zin=U+MG!<2HA^(*7cox$O|JVK(jk}+@_D^p%$Q~P~Gf(1pwAF84CaakQ+%wZbAV7fE@V6xTkyPp%#F2 zf{H0B002NfBo$#i1polZ2lG(?*2*Ir79Lj%007M?3FTe@06Lv=K*Fo_c0E z)dDE}0ssJVLxKVT0OW=Q1%Q=pe)a1Ea#IUXQ>b1!Isn=l84CaakQ*MD0ssKy#+pBJ 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 gdjtT@n+a literal 16029 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 diff --git a/kernel/doc/bbtkUsersGuide/bbFiles.png b/kernel/doc/bbtkUsersGuide/bbFiles.png index 392947ab68dd89d7c3e252d573dd2e82db1e8cab..f1ad7558e4917c38d1dafc49f7bccac10219adee 100644 GIT binary patch literal 5 McmeAS@N?$^00ndbc>n+a literal 2603680 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 LF0QxXx++c|T%$_j diff --git a/kernel/doc/bbtkUsersGuide/bbPackageBrowser.png b/kernel/doc/bbtkUsersGuide/bbPackageBrowser.png index da99e5552d8fb0e1e3e540a6a987ed7892cbfb38..f1ad7558e4917c38d1dafc49f7bccac10219adee 100644 GIT binary patch literal 5 McmeAS@N?$^00ndbc>n+a literal 5288862 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

FlzzgUlg|p@BC@5> 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 z6C$+$0000gh#LowFCZ5H005*P*THB3004k=QM2};Qg#1+$*WwsM3sV02LJ#7(ur$e zcK(8e=~PGf^uOmWIfh&S00000001DfxCUv};fFWKtd;-(002ma8I^y33%LLQ000T_ z(@#IUmf{(t&B@7eT>t<80000008lobf!W;L3i9l*HeXl!4Y>gDR^$|VzX<>U0001h z3hKm@PLJ90MGHQNIgdr8761SMNUR?gjoU~r0000$2I$i5)R?tgyl_s5d32e`X>R<^ zr=kRD8Rq~10000006_LxvS_YnqdK2>isZV)M(s3xKYaPfzwLancm`&3ay-U4*m&Xm z-sA!R000000077W8d#0SEl#S_I{m7LSxlGz_@nuy{#I_wy73IsR+zzP0RRAy7LI+i z`h(;G0000W)js*xhn}nKctUsAIH|@?bvb=s*?_GIFVAm`HA;|{Ar1fl000000A#e6 zUwZG;sJQ^Kh9q!%-%k7Nu00000$QsL6J<_&9n2K&mT?XM00000003kk4X#GxHcWw?w(`r5ODr1sx1BE* z0h%JvM>=H%qq@&Et;00000 zL^0*=rhUl;s5rh}@oC(REpiIom-UR)`pw4$0000000004LtqvF07Tbo{;=)j0ssI2 z06@|Zqy+!~0000$%DsJX_y}?VfM0k9X=~J|Ngn|K0000006-GtCZS9K03e(0>v0sh z000000D#yC(gFYg0001FipB4~z_X001gDg0uht000000J6%^kN$N| zCglPUqy+!~00000fD|Jz3jhF+aUMM3?XNN^7Xaz1$SF+MssR81R6Im#0RR91004jr zZqOgTZa^+T`5{OP000000000fMqm~I08{{Ld+zQ+E&u=k0D$yFkQM*{00000h{w&_ zzL-ER01|*8EdT%j00000q!@u&007|S`B68lCKmt+QsfjSs3ZUY03a(7sRaN40000$ zY8*H5jXC530HqM51poj50001h6eBPT06^kgRqdxM$prua00004LXZ{!00000Ag%pl zJgI8juTsL@II$6ImPp0000aACX!B00000 zkYz6ERed_S001%vL0SL+0000007x+cvjC8R`uA)8Gr0f&00000WCwz@0000006_hC z)}D{a1pt6@K#&#y00000002^qz$}1@!XZ)%00000 zKzwf8d+gQZ0ssKYj36xl00000005*Ifms0F9{6L|X5<0@0000003;PbS^xk506

%gp?(+IBP+jO_ zWcl;+qeEo_0001}fbO}c_ao#2004jtQ05@5^~hsS$m5R;m)W!aPjYi|<<{Hov~PtB zzT=Pbhg)uvMGNQ1?YI3w3Wq%)<6oT+dOw=>?c2$VqyKDXSupn>vh1@Z^3s^+WbL|j z(*K%)((}wSWd59)vUt%vd2+-f(zHpFXvF~l0000006@9POVpZ&+;gX#(7BT-?uLQa z%8kGOgY4VCU#e8D99qSlw+)iB&+29VzVhxC>sH5vCLC73o)i}s%Z?p8B>&JuL(@+>saxp( zs>ey)<=N*(%kJH~OH2=a&k)#ncz51iTQJ)E${MPadFAz-DsNa-`<)apMLhaEL^xq7Jal>o*MP6T-@(M zGv2}RU3Qbv#Ei-x3#!aCy43;flVP`ceRjOqE zjSTpz4#%}Ouj{WHAaA}kQEs~VRvCVOiMzCyZTe?Exc~qF0000008%0+H%AU{+*~&O z{GBv8vbEdDgZ@WW-(=FRf{lxfneX%iFt1poj5lIw#}qb?;E00000E*wWHSFIwuc5aud z)oZxS@Qc#p68wjbJDXRjvK%ZvU?-K?qYph`g0LrcJ5?Te>jW_s#U7U z^M4*Ci~qGmx}9{I8K3s{!GlVyv-wd+%B_F6S%wzgFRj{klq;{kPU_UDEg$}Kkz97g z)za~VZu0BC7nvuBz4gYcQHN9j00000004kw&@pIrG=NIEzl;pvCdc{Dcmao9^O#7^ zFEftm-B=nQc8D3b^`p;E`;*ND*uHh6TN#1Oo-*niQ@ps_>lv z000000Dvs^_41`A;5zxeNpkI!?|*5jb5Pcgy~F(9Gldoa002miU!7E=xy=Pg&Kdv! z0Dw$FkQM*{00000K;~Qghii|{&|Cn|Cx#``X{Vkd8-H4x$RYs%0000003c%p3e3)U z?=KnKPyhgc40pxJ$Ir;nTmS$70HES2IPVhQjSdu~RY3{|00000005BAe${v40dfHn zEpW2ycSVg014n9A@xcR$t~>w$000000A!@xO2NadJS7YO0A#B<)&BSRm)G01}HJEdT%j00000q!@u&002-zBGq^fzyk3jkCQ1Ze>P0000003gK(%mM()N8yxDUL+R)000000D`mt z00000AbWJIIr}bh0gz%vPGO4Ii0ni`)08)TREdT%j00000q!@u&01H>tF5LDqxc~qF00000 zsPOXQ>4DrzaV-V_000061e~X0000006_L2NDBY}0O07`?|+(H0F=DmE&u=k00000fOM7hL0SL+03Zo+rv3eOasdDU0FV#_X#oHL00000 zAjRARvzPzlyQbs<000000000$(zyp|0RRAiB*?4weqC|_kOqpJ!ZfG_002NZBDDYj z0000005a77jV?Ht`MCfDX#oHL00000AjJsG0ssJ{u{+McP%=Lk00000Kr{qt0RR91 z004lBrQ^ZA)5rx#BLryy00000001Dx2+RTifb8@5Wo>qm3xIS{e0001h zL?BWN00000NRpieH(f?9000275TpeF000000Du%DFbkByb@$(OfLs6o000000F(tm zS^xk507x%i)sZ>m0ssI|fe@qx00000004j#BQT59dueXR!Q=uUofSES>0CVk00000 zkcEiU0ssI2$aEk7cxWGT0RR9%#v(`y000000000fMqoA*JoD!Zt|J!!000000078J z1Ze>P0DuZ=j#+Z`Ym0BNttDNOr10ssI2 z001D_vN%!;0000a*2LcVuaOG?004kQBS;GX00000001c#7MOKjY1)%q0000000000 zNTskKEdT%jkOWs3Z@h$D00000z!O1Q000000000Pr*V}_8)i!`072R;H@UEPQI|me_muj;qK800000ka-Bw0ssI200019_B>iVj$8mF+c`z=7ZRxj z00000004j#BQOg9K!w%4uyZwX0RR910HC}Pqy+!~0000$;tYOdL}PLRfItY+0ssI2 z0000$iV>Iv03evEZ$Ebuxc~qF004l5AxH}V00000Q11TcqnlqO7XX>2$SKUUDyK6d zwEzGB00000kYWU80RYK%Wb^y(Bo_bx000004+Loe00000Kn6PS_lpY11pts82+{%o z0000006>Znm<50|b^LAr_#L?b000000AxRcv;Y7A002}RRl2TjKrR3>Qjt@bk@W_A zBT@?h00000001eL7ti`O{k$%o#Q-3wrc79R2e|+M00000Akzd6($0AAFPYXx00000 z0OHlS?fz}#0ssJ#$}>otBRS$Y#U)l=aNZ>){ssU5000000F>m2W8$mPc#b_=wR#QN zxqYihPENGt0c5(#C)K=|TmS$70001hq}a1-mx;BC<9L?u8KliWtdXqw=1bYLYp03! z0ssI20N~fncYf4>TmWRQBBwBOD-R%@Xd3OVo!e#o58ujR4V%fq;)9;m^Bm`(dW}Qm zu)~|l<_$l}?p@o(i4yJw00000004lBPREX|QoXt~Xnd69*Ka7hckT4-63@V_s#c?> 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 TPHwxv>8GAK@yG9-{?-2gx4}WI diff --git a/kernel/doc/bbtkWebSite/home.html b/kernel/doc/bbtkWebSite/home.html index 15b1f54..c4c90d2 100644 --- a/kernel/doc/bbtkWebSite/home.html +++ b/kernel/doc/bbtkWebSite/home.html @@ -8,32 +8,19 @@
-The Black Box Toolkit Documentation
-bbtk @BBTK_VERSION@ (@BBTK_VERSION_DATE@)
+User Documentation
+@PROJECT_VERSION@ (@PROJECT_VERSION_DATE@)

Follow this link if you need to build bbtk from -sources.
+ href="./install.html">this link if you need to build this application from sources.

-Read the users' guide if you -want to learn how to use bbtk development environnement (bbStudio) and -how to write black box scripts.
+Read the users' guide To find out more about this application.

-Read the package -developers' guide to learn how to create your own black boxes and -packages.
-
-Developers might also be interested in doxygen documentation of the -source code of bbtk library.
-
-The boxes lists contain the boxes of bbtk core packages (std,wx,vtk...) -for current version.
-
-All this documentation is also available from bbStudio.
+The futures developers in this project might be also interested in the doxygen documentation of the +source code.
+

diff --git a/kernel/src/CMakeLists.txt b/kernel/src/CMakeLists.txt index 1978b2d..96ce672 100644 --- a/kernel/src/CMakeLists.txt +++ b/kernel/src/CMakeLists.txt @@ -162,7 +162,7 @@ ENDIF(BBTK_USE_QT) # lib definition ADD_LIBRARY(bbtk SHARED ${SOURCES} ${SOURCES_H}) #----------------------------------------------------------------------------- -TARGET_LINK_LIBRARIES(bbtk ${BBTK_LINK_LIBRARIES} ${BOOST_LIBRARIES}) +TARGET_LINK_LIBRARIES(bbtk ${BBTK_LINK_LIBRARIES} ${BOOST_LIBRARIES} ${crea_LIBRARIES}) #----------------------------------------------------------------------------- IF(UNIX) SET_TARGET_PROPERTIES(bbtk PROPERTIES COMPILE_FLAGS -Wall) diff --git a/kernel/src/ThirdParty/wx/treemultictrl/mac_collapse.xpm b/kernel/src/ThirdParty/wx/treemultictrl/mac_collapse.xpm index d100ef6..8089da7 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/mac_collapse.xpm +++ b/kernel/src/ThirdParty/wx/treemultictrl/mac_collapse.xpm @@ -1,25 +1,25 @@ -/* XPM */ -static char *collapse_xpm[] = -{ -/* width height ncolors chars_per_pixel */ -"11 11 6 1", -/* colors */ -"A c None", -"B c #CCCCCCCCCCCC", -"C c #EEEEEEEEEEEE", -"D c #DDDDDDDDDDDD", -"E c #BBBBBBBBBBBB", -"F c #AAAAAAAAAAAA", -/* pixels */ -"ACAAAAAAAAA", -"ABEAAAAAAAA", -"AFEEBAAAAAA", -"AEEFEEDAAAA", -"AEFEFEFBCAA", -"AFEFEFEFEBA", -"AEEEFEFBCAA", -"AEFFEEDAAAA", -"AFEEDAAAAAA", -"ABBCAAAAAAA", -"ACAAAAAAAAA", -}; +/* XPM */ +static char *collapse_xpm[] = +{ +/* width height ncolors chars_per_pixel */ +"11 11 6 1", +/* colors */ +"A c None", +"B c #CCCCCCCCCCCC", +"C c #EEEEEEEEEEEE", +"D c #DDDDDDDDDDDD", +"E c #BBBBBBBBBBBB", +"F c #AAAAAAAAAAAA", +/* pixels */ +"ACAAAAAAAAA", +"ABEAAAAAAAA", +"AFEEBAAAAAA", +"AEEFEEDAAAA", +"AEFEFEFBCAA", +"AFEFEFEFEBA", +"AEEEFEFBCAA", +"AEFFEEDAAAA", +"AFEEDAAAAAA", +"ABBCAAAAAAA", +"ACAAAAAAAAA", +}; diff --git a/kernel/src/ThirdParty/wx/treemultictrl/mac_expand.xpm b/kernel/src/ThirdParty/wx/treemultictrl/mac_expand.xpm index d2a09e8..507cd8c 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/mac_expand.xpm +++ b/kernel/src/ThirdParty/wx/treemultictrl/mac_expand.xpm @@ -1,25 +1,25 @@ -/* XPM */ -static char *expand_xpm[] = -{ -/* width height ncolors chars_per_pixel */ -"11 11 6 1", -/* colors */ -"A c None", -"B c #CCCCCCCCCCCC", -"C c #EEEEEEEEEEEE", -"D c #DDDDDDDDDDDD", -"E c #BBBBBBBBBBBB", -"F c #AAAAAAAAAAAA", -/* pixels */ -"AAAAAAAAAAA", -"CBFEEFEEFBC", -"ABEFEEFEEEA", -"ACEFEFEFEAA", -"AADEFEFEBAA", -"AAAEEFEEAAA", -"AAADFEFDAAA", -"AAAABFBAAAA", -"AAAACECAAAA", -"AAAAABAAAAA", -"AAAAAAAAAAA", -}; +/* XPM */ +static char *expand_xpm[] = +{ +/* width height ncolors chars_per_pixel */ +"11 11 6 1", +/* colors */ +"A c None", +"B c #CCCCCCCCCCCC", +"C c #EEEEEEEEEEEE", +"D c #DDDDDDDDDDDD", +"E c #BBBBBBBBBBBB", +"F c #AAAAAAAAAAAA", +/* pixels */ +"AAAAAAAAAAA", +"CBFEEFEEFBC", +"ABEFEEFEEEA", +"ACEFEFEFEAA", +"AADEFEFEBAA", +"AAAEEFEEAAA", +"AAADFEFDAAA", +"AAAABFBAAAA", +"AAAACECAAAA", +"AAAAABAAAAA", +"AAAAAAAAAAA", +}; diff --git a/kernel/src/ThirdParty/wx/treemultictrl/tmcimages.h b/kernel/src/ThirdParty/wx/treemultictrl/tmcimages.h index ed94b73..23a4e78 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/tmcimages.h +++ b/kernel/src/ThirdParty/wx/treemultictrl/tmcimages.h @@ -1,42 +1,42 @@ -//--------------------------------------------------------------------------- -// $RCSfile: tmcimages.h,v $ -// $Source: /cvs/creatis/bbtk/kernel/src/ThirdParty/wx/treemultictrl/tmcimages.h,v $ -// $Revision: 1.1 $ -// $Date: 2008/03/28 13:42:19 $ -//--------------------------------------------------------------------------- -// Author: Jorgen Bodde -// Copyright: (c) Jorgen Bodde -// License: wxWidgets License -//--------------------------------------------------------------------------- - -#ifndef _TMCIMAGES_H_ -#define _TMCIMAGES_H_ - -// pics for the expand / collapse buttons -#ifdef __APPLE__ - #include "mac_collapse.xpm" - #include "mac_expand.xpm" -#else - #ifdef LINUX - #include "linux_collapse.xpm" - #include "linux_expand.xpm" - #else - #include "default_collapse.xpm" - #include "default_expand.xpm" - #endif -#endif - -#if(CHECKBOXVIEW) - // icons for checkbox states - #ifdef WINDOWS - #include "win_unchecked_icon.xpm" - #include "win_checked_icon.xpm" - #include "win_tristate_icon.xpm" - #else - #include "default_unchecked_icon.xpm" - #include "default_checked_icon.xpm" - #include "default_tristate_icon.xpm" - #endif // WINDOWS -#endif // #if(CHECKBOXVIEW) - -#endif // _TMCIMAGES_H_ +//--------------------------------------------------------------------------- +// $RCSfile: tmcimages.h,v $ +// $Source: /cvs/creatis/bbtk/kernel/src/ThirdParty/wx/treemultictrl/tmcimages.h,v $ +// $Revision: 1.2 $ +// $Date: 2009/10/05 22:44:50 $ +//--------------------------------------------------------------------------- +// Author: Jorgen Bodde +// Copyright: (c) Jorgen Bodde +// License: wxWidgets License +//--------------------------------------------------------------------------- + +#ifndef _TMCIMAGES_H_ +#define _TMCIMAGES_H_ + +// pics for the expand / collapse buttons +#ifdef __APPLE__ + #include "mac_collapse.xpm" + #include "mac_expand.xpm" +#else + #ifdef LINUX + #include "linux_collapse.xpm" + #include "linux_expand.xpm" + #else + #include "default_collapse.xpm" + #include "default_expand.xpm" + #endif +#endif + +#if(CHECKBOXVIEW) + // icons for checkbox states + #ifdef WINDOWS + #include "win_unchecked_icon.xpm" + #include "win_checked_icon.xpm" + #include "win_tristate_icon.xpm" + #else + #include "default_unchecked_icon.xpm" + #include "default_checked_icon.xpm" + #include "default_tristate_icon.xpm" + #endif // WINDOWS +#endif // #if(CHECKBOXVIEW) + +#endif // _TMCIMAGES_H_ diff --git a/kernel/src/ThirdParty/wx/treemultictrl/win_checked_icon.xpm b/kernel/src/ThirdParty/wx/treemultictrl/win_checked_icon.xpm index f1d550f..87dd66c 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/win_checked_icon.xpm +++ b/kernel/src/ThirdParty/wx/treemultictrl/win_checked_icon.xpm @@ -1,273 +1,273 @@ -/* XPM */ -static char *checked_icon[] = { -"13 13 256 3", -"000 c #1C5180", -"001 c #21A121", -"002 c #E2E2DD", -"003 c #E3E3DF", -"004 c #E5E5E1", -"005 c #E7E7E3", -"006 c #EAEAE6", -"007 c #ECECE9", -"008 c #EFEFEC", -"009 c #F1F1EF", -"010 c #F3F3F1", -"011 c #F5F5F3", -"012 c #F7F7F6", -"013 c #F9F9F8", -"014 c #FAFAF9", -"015 c #FCFCFB", -"016 c #FDFDFD", -"017 c #FEFEFE", -"018 c gray100", -"019 c black", -"020 c black", -"021 c black", -"022 c black", -"023 c black", -"024 c black", -"025 c black", -"026 c black", -"027 c black", -"028 c black", -"029 c black", -"030 c black", -"031 c black", -"032 c black", -"033 c black", -"034 c black", -"035 c black", -"036 c black", -"037 c black", -"038 c black", -"039 c black", -"040 c black", -"041 c black", -"042 c black", -"043 c black", -"044 c black", -"045 c black", -"046 c black", -"047 c black", -"048 c black", -"049 c black", -"050 c black", -"051 c black", -"052 c black", -"053 c black", -"054 c black", -"055 c black", -"056 c black", -"057 c black", -"058 c black", -"059 c black", -"060 c black", -"061 c black", -"062 c black", -"063 c black", -"064 c black", -"065 c black", -"066 c black", -"067 c black", -"068 c black", -"069 c black", -"070 c black", -"071 c black", -"072 c black", -"073 c black", -"074 c black", -"075 c black", -"076 c black", -"077 c black", -"078 c black", -"079 c black", -"080 c black", -"081 c black", -"082 c black", -"083 c black", -"084 c black", -"085 c black", -"086 c black", -"087 c black", -"088 c black", -"089 c black", -"090 c black", -"091 c black", -"092 c black", -"093 c black", -"094 c black", -"095 c black", -"096 c black", -"097 c black", -"098 c black", -"099 c black", -"100 c black", -"101 c black", -"102 c black", -"103 c black", -"104 c black", -"105 c black", -"106 c black", -"107 c black", -"108 c black", -"109 c black", -"110 c black", -"111 c black", -"112 c black", -"113 c black", -"114 c black", -"115 c black", -"116 c black", -"117 c black", -"118 c black", -"119 c black", -"120 c black", -"121 c black", -"122 c black", -"123 c black", -"124 c black", -"125 c black", -"126 c black", -"127 c black", -"128 c black", -"129 c black", -"130 c black", -"131 c black", -"132 c black", -"133 c black", -"134 c black", -"135 c black", -"136 c black", -"137 c black", -"138 c black", -"139 c black", -"140 c black", -"141 c black", -"142 c black", -"143 c black", -"144 c black", -"145 c black", -"146 c black", -"147 c black", -"148 c black", -"149 c black", -"150 c black", -"151 c black", -"152 c black", -"153 c black", -"154 c black", -"155 c black", -"156 c black", -"157 c black", -"158 c black", -"159 c black", -"160 c black", -"161 c black", -"162 c black", -"163 c black", -"164 c black", -"165 c black", -"166 c black", -"167 c black", -"168 c black", -"169 c black", -"170 c black", -"171 c black", -"172 c black", -"173 c black", -"174 c black", -"175 c black", -"176 c black", -"177 c black", -"178 c black", -"179 c black", -"180 c black", -"181 c black", -"182 c black", -"183 c black", -"184 c black", -"185 c black", -"186 c black", -"187 c black", -"188 c black", -"189 c black", -"190 c black", -"191 c black", -"192 c black", -"193 c black", -"194 c black", -"195 c black", -"196 c black", -"197 c black", -"198 c black", -"199 c black", -"200 c black", -"201 c black", -"202 c black", -"203 c black", -"204 c black", -"205 c black", -"206 c black", -"207 c black", -"208 c black", -"209 c black", -"210 c black", -"211 c black", -"212 c black", -"213 c black", -"214 c black", -"215 c black", -"216 c black", -"217 c black", -"218 c black", -"219 c black", -"220 c black", -"221 c black", -"222 c black", -"223 c black", -"224 c black", -"225 c black", -"226 c black", -"227 c black", -"228 c black", -"229 c black", -"230 c black", -"231 c black", -"232 c black", -"233 c black", -"234 c black", -"235 c black", -"236 c black", -"237 c black", -"238 c black", -"239 c black", -"240 c black", -"241 c black", -"242 c black", -"243 c black", -"244 c black", -"245 c black", -"246 c black", -"247 c black", -"248 c black", -"249 c black", -"250 c black", -"251 c black", -"252 c black", -"253 c black", -"254 c black", -"255 c black", -"000000000000000000000000000000000000000", -"000002002002003004005006007008009010000", -"000002002003004005006007008009010011000", -"000002003004005006007008009001011012000", -"000003004005006007008009001001012013000", -"000004005001007008009001001001013014000", -"000005006001001009001001001013014015000", -"000006007001001001001001013014015016000", -"000007008009001001001013014015016017000", -"000008009010011001013014015016017018000", -"000009010011012013014015016017018018000", -"000010011012013014015016017018018018000", -"000000000000000000000000000000000000000" -}; +/* XPM */ +static char *checked_icon[] = { +"13 13 256 3", +"000 c #1C5180", +"001 c #21A121", +"002 c #E2E2DD", +"003 c #E3E3DF", +"004 c #E5E5E1", +"005 c #E7E7E3", +"006 c #EAEAE6", +"007 c #ECECE9", +"008 c #EFEFEC", +"009 c #F1F1EF", +"010 c #F3F3F1", +"011 c #F5F5F3", +"012 c #F7F7F6", +"013 c #F9F9F8", +"014 c #FAFAF9", +"015 c #FCFCFB", +"016 c #FDFDFD", +"017 c #FEFEFE", +"018 c gray100", +"019 c black", +"020 c black", +"021 c black", +"022 c black", +"023 c black", +"024 c black", +"025 c black", +"026 c black", +"027 c black", +"028 c black", +"029 c black", +"030 c black", +"031 c black", +"032 c black", +"033 c black", +"034 c black", +"035 c black", +"036 c black", +"037 c black", +"038 c black", +"039 c black", +"040 c black", +"041 c black", +"042 c black", +"043 c black", +"044 c black", +"045 c black", +"046 c black", +"047 c black", +"048 c black", +"049 c black", +"050 c black", +"051 c black", +"052 c black", +"053 c black", +"054 c black", +"055 c black", +"056 c black", +"057 c black", +"058 c black", +"059 c black", +"060 c black", +"061 c black", +"062 c black", +"063 c black", +"064 c black", +"065 c black", +"066 c black", +"067 c black", +"068 c black", +"069 c black", +"070 c black", +"071 c black", +"072 c black", +"073 c black", +"074 c black", +"075 c black", +"076 c black", +"077 c black", +"078 c black", +"079 c black", +"080 c black", +"081 c black", +"082 c black", +"083 c black", +"084 c black", +"085 c black", +"086 c black", +"087 c black", +"088 c black", +"089 c black", +"090 c black", +"091 c black", +"092 c black", +"093 c black", +"094 c black", +"095 c black", +"096 c black", +"097 c black", +"098 c black", +"099 c black", +"100 c black", +"101 c black", +"102 c black", +"103 c black", +"104 c black", +"105 c black", +"106 c black", +"107 c black", +"108 c black", +"109 c black", +"110 c black", +"111 c black", +"112 c black", +"113 c black", +"114 c black", +"115 c black", +"116 c black", +"117 c black", +"118 c black", +"119 c black", +"120 c black", +"121 c black", +"122 c black", +"123 c black", +"124 c black", +"125 c black", +"126 c black", +"127 c black", +"128 c black", +"129 c black", +"130 c black", +"131 c black", +"132 c black", +"133 c black", +"134 c black", +"135 c black", +"136 c black", +"137 c black", +"138 c black", +"139 c black", +"140 c black", +"141 c black", +"142 c black", +"143 c black", +"144 c black", +"145 c black", +"146 c black", +"147 c black", +"148 c black", +"149 c black", +"150 c black", +"151 c black", +"152 c black", +"153 c black", +"154 c black", +"155 c black", +"156 c black", +"157 c black", +"158 c black", +"159 c black", +"160 c black", +"161 c black", +"162 c black", +"163 c black", +"164 c black", +"165 c black", +"166 c black", +"167 c black", +"168 c black", +"169 c black", +"170 c black", +"171 c black", +"172 c black", +"173 c black", +"174 c black", +"175 c black", +"176 c black", +"177 c black", +"178 c black", +"179 c black", +"180 c black", +"181 c black", +"182 c black", +"183 c black", +"184 c black", +"185 c black", +"186 c black", +"187 c black", +"188 c black", +"189 c black", +"190 c black", +"191 c black", +"192 c black", +"193 c black", +"194 c black", +"195 c black", +"196 c black", +"197 c black", +"198 c black", +"199 c black", +"200 c black", +"201 c black", +"202 c black", +"203 c black", +"204 c black", +"205 c black", +"206 c black", +"207 c black", +"208 c black", +"209 c black", +"210 c black", +"211 c black", +"212 c black", +"213 c black", +"214 c black", +"215 c black", +"216 c black", +"217 c black", +"218 c black", +"219 c black", +"220 c black", +"221 c black", +"222 c black", +"223 c black", +"224 c black", +"225 c black", +"226 c black", +"227 c black", +"228 c black", +"229 c black", +"230 c black", +"231 c black", +"232 c black", +"233 c black", +"234 c black", +"235 c black", +"236 c black", +"237 c black", +"238 c black", +"239 c black", +"240 c black", +"241 c black", +"242 c black", +"243 c black", +"244 c black", +"245 c black", +"246 c black", +"247 c black", +"248 c black", +"249 c black", +"250 c black", +"251 c black", +"252 c black", +"253 c black", +"254 c black", +"255 c black", +"000000000000000000000000000000000000000", +"000002002002003004005006007008009010000", +"000002002003004005006007008009010011000", +"000002003004005006007008009001011012000", +"000003004005006007008009001001012013000", +"000004005001007008009001001001013014000", +"000005006001001009001001001013014015000", +"000006007001001001001001013014015016000", +"000007008009001001001013014015016017000", +"000008009010011001013014015016017018000", +"000009010011012013014015016017018018000", +"000010011012013014015016017018018018000", +"000000000000000000000000000000000000000" +}; diff --git a/kernel/src/ThirdParty/wx/treemultictrl/win_tristate_icon.xpm b/kernel/src/ThirdParty/wx/treemultictrl/win_tristate_icon.xpm index 1731cb9..4ed4500 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/win_tristate_icon.xpm +++ b/kernel/src/ThirdParty/wx/treemultictrl/win_tristate_icon.xpm @@ -1,273 +1,273 @@ -/* XPM */ -static char *tristate_icon[] = { -"13 13 256 3", -"000 c #1C5180", -"001 c #6DBB6C", -"002 c #6EBC6C", -"003 c #6FBD6D", -"004 c #70BE6F", -"005 c #71BF70", -"006 c #72C071", -"007 c #73C172", -"008 c #73C273", -"009 c #74C274", -"010 c #75C374", -"011 c #75C475", -"012 c #76C476", -"013 c #76C576", -"014 c #E2E2DD", -"015 c #E3E3DF", -"016 c #E5E5E1", -"017 c #E7E7E3", -"018 c #EAEAE6", -"019 c #ECECE9", -"020 c #EFEFEC", -"021 c #F1F1EF", -"022 c #F3F3F1", -"023 c #F5F5F3", -"024 c #F7F7F6", -"025 c #F9F9F8", -"026 c #FAFAF9", -"027 c #FCFCFB", -"028 c #FDFDFD", -"029 c #FEFEFE", -"030 c gray100", -"031 c black", -"032 c black", -"033 c black", -"034 c black", -"035 c black", -"036 c black", -"037 c black", -"038 c black", -"039 c black", -"040 c black", -"041 c black", -"042 c black", -"043 c black", -"044 c black", -"045 c black", -"046 c black", -"047 c black", -"048 c black", -"049 c black", -"050 c black", -"051 c black", -"052 c black", -"053 c black", -"054 c black", -"055 c black", -"056 c black", -"057 c black", -"058 c black", -"059 c black", -"060 c black", -"061 c black", -"062 c black", -"063 c black", -"064 c black", -"065 c black", -"066 c black", -"067 c black", -"068 c black", -"069 c black", -"070 c black", -"071 c black", -"072 c black", -"073 c black", -"074 c black", -"075 c black", -"076 c black", -"077 c black", -"078 c black", -"079 c black", -"080 c black", -"081 c black", -"082 c black", -"083 c black", -"084 c black", -"085 c black", -"086 c black", -"087 c black", -"088 c black", -"089 c black", -"090 c black", -"091 c black", -"092 c black", -"093 c black", -"094 c black", -"095 c black", -"096 c black", -"097 c black", -"098 c black", -"099 c black", -"100 c black", -"101 c black", -"102 c black", -"103 c black", -"104 c black", -"105 c black", -"106 c black", -"107 c black", -"108 c black", -"109 c black", -"110 c black", -"111 c black", -"112 c black", -"113 c black", -"114 c black", -"115 c black", -"116 c black", -"117 c black", -"118 c black", -"119 c black", -"120 c black", -"121 c black", -"122 c black", -"123 c black", -"124 c black", -"125 c black", -"126 c black", -"127 c black", -"128 c black", -"129 c black", -"130 c black", -"131 c black", -"132 c black", -"133 c black", -"134 c black", -"135 c black", -"136 c black", -"137 c black", -"138 c black", -"139 c black", -"140 c black", -"141 c black", -"142 c black", -"143 c black", -"144 c black", -"145 c black", -"146 c black", -"147 c black", -"148 c black", -"149 c black", -"150 c black", -"151 c black", -"152 c black", -"153 c black", -"154 c black", -"155 c black", -"156 c black", -"157 c black", -"158 c black", -"159 c black", -"160 c black", -"161 c black", -"162 c black", -"163 c black", -"164 c black", -"165 c black", -"166 c black", -"167 c black", -"168 c black", -"169 c black", -"170 c black", -"171 c black", -"172 c black", -"173 c black", -"174 c black", -"175 c black", -"176 c black", -"177 c black", -"178 c black", -"179 c black", -"180 c black", -"181 c black", -"182 c black", -"183 c black", -"184 c black", -"185 c black", -"186 c black", -"187 c black", -"188 c black", -"189 c black", -"190 c black", -"191 c black", -"192 c black", -"193 c black", -"194 c black", -"195 c black", -"196 c black", -"197 c black", -"198 c black", -"199 c black", -"200 c black", -"201 c black", -"202 c black", -"203 c black", -"204 c black", -"205 c black", -"206 c black", -"207 c black", -"208 c black", -"209 c black", -"210 c black", -"211 c black", -"212 c black", -"213 c black", -"214 c black", -"215 c black", -"216 c black", -"217 c black", -"218 c black", -"219 c black", -"220 c black", -"221 c black", -"222 c black", -"223 c black", -"224 c black", -"225 c black", -"226 c black", -"227 c black", -"228 c black", -"229 c black", -"230 c black", -"231 c black", -"232 c black", -"233 c black", -"234 c black", -"235 c black", -"236 c black", -"237 c black", -"238 c black", -"239 c black", -"240 c black", -"241 c black", -"242 c black", -"243 c black", -"244 c black", -"245 c black", -"246 c black", -"247 c black", -"248 c black", -"249 c black", -"250 c black", -"251 c black", -"252 c black", -"253 c black", -"254 c black", -"255 c black", -"000000000000000000000000000000000000000", -"000014014014015016017018019020021022000", -"000014014015016017018019020021022023000", -"000014015001002003004005006007023024000", -"000015016002003004005006007008024025000", -"000016017003004005006007008009025026000", -"000017018004005006007008009010026027000", -"000018019005006007008009010011027028000", -"000019020006007008009010011012028029000", -"000020021007008009010011012013029030000", -"000021022023024025026027028029030030000", -"000022023024025026027028029030030030000", -"000000000000000000000000000000000000000" -}; +/* XPM */ +static char *tristate_icon[] = { +"13 13 256 3", +"000 c #1C5180", +"001 c #6DBB6C", +"002 c #6EBC6C", +"003 c #6FBD6D", +"004 c #70BE6F", +"005 c #71BF70", +"006 c #72C071", +"007 c #73C172", +"008 c #73C273", +"009 c #74C274", +"010 c #75C374", +"011 c #75C475", +"012 c #76C476", +"013 c #76C576", +"014 c #E2E2DD", +"015 c #E3E3DF", +"016 c #E5E5E1", +"017 c #E7E7E3", +"018 c #EAEAE6", +"019 c #ECECE9", +"020 c #EFEFEC", +"021 c #F1F1EF", +"022 c #F3F3F1", +"023 c #F5F5F3", +"024 c #F7F7F6", +"025 c #F9F9F8", +"026 c #FAFAF9", +"027 c #FCFCFB", +"028 c #FDFDFD", +"029 c #FEFEFE", +"030 c gray100", +"031 c black", +"032 c black", +"033 c black", +"034 c black", +"035 c black", +"036 c black", +"037 c black", +"038 c black", +"039 c black", +"040 c black", +"041 c black", +"042 c black", +"043 c black", +"044 c black", +"045 c black", +"046 c black", +"047 c black", +"048 c black", +"049 c black", +"050 c black", +"051 c black", +"052 c black", +"053 c black", +"054 c black", +"055 c black", +"056 c black", +"057 c black", +"058 c black", +"059 c black", +"060 c black", +"061 c black", +"062 c black", +"063 c black", +"064 c black", +"065 c black", +"066 c black", +"067 c black", +"068 c black", +"069 c black", +"070 c black", +"071 c black", +"072 c black", +"073 c black", +"074 c black", +"075 c black", +"076 c black", +"077 c black", +"078 c black", +"079 c black", +"080 c black", +"081 c black", +"082 c black", +"083 c black", +"084 c black", +"085 c black", +"086 c black", +"087 c black", +"088 c black", +"089 c black", +"090 c black", +"091 c black", +"092 c black", +"093 c black", +"094 c black", +"095 c black", +"096 c black", +"097 c black", +"098 c black", +"099 c black", +"100 c black", +"101 c black", +"102 c black", +"103 c black", +"104 c black", +"105 c black", +"106 c black", +"107 c black", +"108 c black", +"109 c black", +"110 c black", +"111 c black", +"112 c black", +"113 c black", +"114 c black", +"115 c black", +"116 c black", +"117 c black", +"118 c black", +"119 c black", +"120 c black", +"121 c black", +"122 c black", +"123 c black", +"124 c black", +"125 c black", +"126 c black", +"127 c black", +"128 c black", +"129 c black", +"130 c black", +"131 c black", +"132 c black", +"133 c black", +"134 c black", +"135 c black", +"136 c black", +"137 c black", +"138 c black", +"139 c black", +"140 c black", +"141 c black", +"142 c black", +"143 c black", +"144 c black", +"145 c black", +"146 c black", +"147 c black", +"148 c black", +"149 c black", +"150 c black", +"151 c black", +"152 c black", +"153 c black", +"154 c black", +"155 c black", +"156 c black", +"157 c black", +"158 c black", +"159 c black", +"160 c black", +"161 c black", +"162 c black", +"163 c black", +"164 c black", +"165 c black", +"166 c black", +"167 c black", +"168 c black", +"169 c black", +"170 c black", +"171 c black", +"172 c black", +"173 c black", +"174 c black", +"175 c black", +"176 c black", +"177 c black", +"178 c black", +"179 c black", +"180 c black", +"181 c black", +"182 c black", +"183 c black", +"184 c black", +"185 c black", +"186 c black", +"187 c black", +"188 c black", +"189 c black", +"190 c black", +"191 c black", +"192 c black", +"193 c black", +"194 c black", +"195 c black", +"196 c black", +"197 c black", +"198 c black", +"199 c black", +"200 c black", +"201 c black", +"202 c black", +"203 c black", +"204 c black", +"205 c black", +"206 c black", +"207 c black", +"208 c black", +"209 c black", +"210 c black", +"211 c black", +"212 c black", +"213 c black", +"214 c black", +"215 c black", +"216 c black", +"217 c black", +"218 c black", +"219 c black", +"220 c black", +"221 c black", +"222 c black", +"223 c black", +"224 c black", +"225 c black", +"226 c black", +"227 c black", +"228 c black", +"229 c black", +"230 c black", +"231 c black", +"232 c black", +"233 c black", +"234 c black", +"235 c black", +"236 c black", +"237 c black", +"238 c black", +"239 c black", +"240 c black", +"241 c black", +"242 c black", +"243 c black", +"244 c black", +"245 c black", +"246 c black", +"247 c black", +"248 c black", +"249 c black", +"250 c black", +"251 c black", +"252 c black", +"253 c black", +"254 c black", +"255 c black", +"000000000000000000000000000000000000000", +"000014014014015016017018019020021022000", +"000014014015016017018019020021022023000", +"000014015001002003004005006007023024000", +"000015016002003004005006007008024025000", +"000016017003004005006007008009025026000", +"000017018004005006007008009010026027000", +"000018019005006007008009010011027028000", +"000019020006007008009010011012028029000", +"000020021007008009010011012013029030000", +"000021022023024025026027028029030030000", +"000022023024025026027028029030030030000", +"000000000000000000000000000000000000000" +}; diff --git a/kernel/src/ThirdParty/wx/treemultictrl/win_unchecked_icon.xpm b/kernel/src/ThirdParty/wx/treemultictrl/win_unchecked_icon.xpm index 4a61e61..5cf3539 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/win_unchecked_icon.xpm +++ b/kernel/src/ThirdParty/wx/treemultictrl/win_unchecked_icon.xpm @@ -1,273 +1,273 @@ -/* XPM */ -static char *unchecked_icon[] = { -"13 13 256 3", -"000 c #1C5180", -"001 c #DCDCD7", -"002 c #DEDED9", -"003 c #E0E0DB", -"004 c #E2E2DE", -"005 c #E5E5E2", -"006 c #E8E8E5", -"007 c #ECECE9", -"008 c #EFEFEC", -"009 c #F1F1EF", -"010 c #F3F3F1", -"011 c #F5F5F4", -"012 c #F7F7F6", -"013 c #F9F9F8", -"014 c #FBFBFA", -"015 c #FDFDFC", -"016 c #FEFEFE", -"017 c gray100", -"018 c black", -"019 c black", -"020 c black", -"021 c black", -"022 c black", -"023 c black", -"024 c black", -"025 c black", -"026 c black", -"027 c black", -"028 c black", -"029 c black", -"030 c black", -"031 c black", -"032 c black", -"033 c black", -"034 c black", -"035 c black", -"036 c black", -"037 c black", -"038 c black", -"039 c black", -"040 c black", -"041 c black", -"042 c black", -"043 c black", -"044 c black", -"045 c black", -"046 c black", -"047 c black", -"048 c black", -"049 c black", -"050 c black", -"051 c black", -"052 c black", -"053 c black", -"054 c black", -"055 c black", -"056 c black", -"057 c black", -"058 c black", -"059 c black", -"060 c black", -"061 c black", -"062 c black", -"063 c black", -"064 c black", -"065 c black", -"066 c black", -"067 c black", -"068 c black", -"069 c black", -"070 c black", -"071 c black", -"072 c black", -"073 c black", -"074 c black", -"075 c black", -"076 c black", -"077 c black", -"078 c black", -"079 c black", -"080 c black", -"081 c black", -"082 c black", -"083 c black", -"084 c black", -"085 c black", -"086 c black", -"087 c black", -"088 c black", -"089 c black", -"090 c black", -"091 c black", -"092 c black", -"093 c black", -"094 c black", -"095 c black", -"096 c black", -"097 c black", -"098 c black", -"099 c black", -"100 c black", -"101 c black", -"102 c black", -"103 c black", -"104 c black", -"105 c black", -"106 c black", -"107 c black", -"108 c black", -"109 c black", -"110 c black", -"111 c black", -"112 c black", -"113 c black", -"114 c black", -"115 c black", -"116 c black", -"117 c black", -"118 c black", -"119 c black", -"120 c black", -"121 c black", -"122 c black", -"123 c black", -"124 c black", -"125 c black", -"126 c black", -"127 c black", -"128 c black", -"129 c black", -"130 c black", -"131 c black", -"132 c black", -"133 c black", -"134 c black", -"135 c black", -"136 c black", -"137 c black", -"138 c black", -"139 c black", -"140 c black", -"141 c black", -"142 c black", -"143 c black", -"144 c black", -"145 c black", -"146 c black", -"147 c black", -"148 c black", -"149 c black", -"150 c black", -"151 c black", -"152 c black", -"153 c black", -"154 c black", -"155 c black", -"156 c black", -"157 c black", -"158 c black", -"159 c black", -"160 c black", -"161 c black", -"162 c black", -"163 c black", -"164 c black", -"165 c black", -"166 c black", -"167 c black", -"168 c black", -"169 c black", -"170 c black", -"171 c black", -"172 c black", -"173 c black", -"174 c black", -"175 c black", -"176 c black", -"177 c black", -"178 c black", -"179 c black", -"180 c black", -"181 c black", -"182 c black", -"183 c black", -"184 c black", -"185 c black", -"186 c black", -"187 c black", -"188 c black", -"189 c black", -"190 c black", -"191 c black", -"192 c black", -"193 c black", -"194 c black", -"195 c black", -"196 c black", -"197 c black", -"198 c black", -"199 c black", -"200 c black", -"201 c black", -"202 c black", -"203 c black", -"204 c black", -"205 c black", -"206 c black", -"207 c black", -"208 c black", -"209 c black", -"210 c black", -"211 c black", -"212 c black", -"213 c black", -"214 c black", -"215 c black", -"216 c black", -"217 c black", -"218 c black", -"219 c black", -"220 c black", -"221 c black", -"222 c black", -"223 c black", -"224 c black", -"225 c black", -"226 c black", -"227 c black", -"228 c black", -"229 c black", -"230 c black", -"231 c black", -"232 c black", -"233 c black", -"234 c black", -"235 c black", -"236 c black", -"237 c black", -"238 c black", -"239 c black", -"240 c black", -"241 c black", -"242 c black", -"243 c black", -"244 c black", -"245 c black", -"246 c black", -"247 c black", -"248 c black", -"249 c black", -"250 c black", -"251 c black", -"252 c black", -"253 c black", -"254 c black", -"255 c black", -"000000000000000000000000000000000000000", -"000001001001002003004005006007008009000", -"000001001002003004005006007008009010000", -"000001002003004005006007008009010011000", -"000002003004005006007008009010011012000", -"000003004005006007008009010011012013000", -"000004005006007008009010011012013014000", -"000005006007008009010011012013014015000", -"000006007008009010011012013014015016000", -"000007008009010011012013014015016017000", -"000008009010011012013014015016017017000", -"000009010011012013014015016017017017000", -"000000000000000000000000000000000000000" -}; +/* XPM */ +static char *unchecked_icon[] = { +"13 13 256 3", +"000 c #1C5180", +"001 c #DCDCD7", +"002 c #DEDED9", +"003 c #E0E0DB", +"004 c #E2E2DE", +"005 c #E5E5E2", +"006 c #E8E8E5", +"007 c #ECECE9", +"008 c #EFEFEC", +"009 c #F1F1EF", +"010 c #F3F3F1", +"011 c #F5F5F4", +"012 c #F7F7F6", +"013 c #F9F9F8", +"014 c #FBFBFA", +"015 c #FDFDFC", +"016 c #FEFEFE", +"017 c gray100", +"018 c black", +"019 c black", +"020 c black", +"021 c black", +"022 c black", +"023 c black", +"024 c black", +"025 c black", +"026 c black", +"027 c black", +"028 c black", +"029 c black", +"030 c black", +"031 c black", +"032 c black", +"033 c black", +"034 c black", +"035 c black", +"036 c black", +"037 c black", +"038 c black", +"039 c black", +"040 c black", +"041 c black", +"042 c black", +"043 c black", +"044 c black", +"045 c black", +"046 c black", +"047 c black", +"048 c black", +"049 c black", +"050 c black", +"051 c black", +"052 c black", +"053 c black", +"054 c black", +"055 c black", +"056 c black", +"057 c black", +"058 c black", +"059 c black", +"060 c black", +"061 c black", +"062 c black", +"063 c black", +"064 c black", +"065 c black", +"066 c black", +"067 c black", +"068 c black", +"069 c black", +"070 c black", +"071 c black", +"072 c black", +"073 c black", +"074 c black", +"075 c black", +"076 c black", +"077 c black", +"078 c black", +"079 c black", +"080 c black", +"081 c black", +"082 c black", +"083 c black", +"084 c black", +"085 c black", +"086 c black", +"087 c black", +"088 c black", +"089 c black", +"090 c black", +"091 c black", +"092 c black", +"093 c black", +"094 c black", +"095 c black", +"096 c black", +"097 c black", +"098 c black", +"099 c black", +"100 c black", +"101 c black", +"102 c black", +"103 c black", +"104 c black", +"105 c black", +"106 c black", +"107 c black", +"108 c black", +"109 c black", +"110 c black", +"111 c black", +"112 c black", +"113 c black", +"114 c black", +"115 c black", +"116 c black", +"117 c black", +"118 c black", +"119 c black", +"120 c black", +"121 c black", +"122 c black", +"123 c black", +"124 c black", +"125 c black", +"126 c black", +"127 c black", +"128 c black", +"129 c black", +"130 c black", +"131 c black", +"132 c black", +"133 c black", +"134 c black", +"135 c black", +"136 c black", +"137 c black", +"138 c black", +"139 c black", +"140 c black", +"141 c black", +"142 c black", +"143 c black", +"144 c black", +"145 c black", +"146 c black", +"147 c black", +"148 c black", +"149 c black", +"150 c black", +"151 c black", +"152 c black", +"153 c black", +"154 c black", +"155 c black", +"156 c black", +"157 c black", +"158 c black", +"159 c black", +"160 c black", +"161 c black", +"162 c black", +"163 c black", +"164 c black", +"165 c black", +"166 c black", +"167 c black", +"168 c black", +"169 c black", +"170 c black", +"171 c black", +"172 c black", +"173 c black", +"174 c black", +"175 c black", +"176 c black", +"177 c black", +"178 c black", +"179 c black", +"180 c black", +"181 c black", +"182 c black", +"183 c black", +"184 c black", +"185 c black", +"186 c black", +"187 c black", +"188 c black", +"189 c black", +"190 c black", +"191 c black", +"192 c black", +"193 c black", +"194 c black", +"195 c black", +"196 c black", +"197 c black", +"198 c black", +"199 c black", +"200 c black", +"201 c black", +"202 c black", +"203 c black", +"204 c black", +"205 c black", +"206 c black", +"207 c black", +"208 c black", +"209 c black", +"210 c black", +"211 c black", +"212 c black", +"213 c black", +"214 c black", +"215 c black", +"216 c black", +"217 c black", +"218 c black", +"219 c black", +"220 c black", +"221 c black", +"222 c black", +"223 c black", +"224 c black", +"225 c black", +"226 c black", +"227 c black", +"228 c black", +"229 c black", +"230 c black", +"231 c black", +"232 c black", +"233 c black", +"234 c black", +"235 c black", +"236 c black", +"237 c black", +"238 c black", +"239 c black", +"240 c black", +"241 c black", +"242 c black", +"243 c black", +"244 c black", +"245 c black", +"246 c black", +"247 c black", +"248 c black", +"249 c black", +"250 c black", +"251 c black", +"252 c black", +"253 c black", +"254 c black", +"255 c black", +"000000000000000000000000000000000000000", +"000001001001002003004005006007008009000", +"000001001002003004005006007008009010000", +"000001002003004005006007008009010011000", +"000002003004005006007008009010011012000", +"000003004005006007008009010011012013000", +"000004005006007008009010011012013014000", +"000005006007008009010011012013014015000", +"000006007008009010011012013014015016000", +"000007008009010011012013014015016017000", +"000008009010011012013014015016017017000", +"000009010011012013014015016017017017000", +"000000000000000000000000000000000000000" +}; diff --git a/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.cpp b/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.cpp index 00cb190..6a5c157 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.cpp +++ b/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.cpp @@ -1,1985 +1,1985 @@ -//--------------------------------------------------------------------------- -// $RCSfile: wxTreeMultiCtrl.cpp,v $ -// $Source: /cvs/creatis/bbtk/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.cpp,v $ -// $Revision: 1.1 $ -// $Date: 2008/03/28 13:42:19 $ -//--------------------------------------------------------------------------- -// Author: Jorgen Bodde -// Copyright: (c) Jorgen Bodde -// License: wxWidgets License -//--------------------------------------------------------------------------- - -#ifdef __GNUG__ - #pragma implementation "wxTreeMultiCtrl.h" -#endif - -// For compilers that support precompilation, includes "wx/wx.h". -#include "wx/wxprec.h" -#include "wx/treebase.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -#include "wx/arrimpl.cpp" - -#include "wx/treemultictrl/wxTreeMultiCtrl.h" -#include "wx/treemultictrl/wxTreeMultiEvent.h" -#include "tmcimages.h" - - - -//---------------------------------------------------------------------------- -// wxTreeMultiItem -//---------------------------------------------------------------------------- - -WX_DEFINE_OBJARRAY(wxArrayTreeMultiItem); - -//---------------------------------------------------------------------------- -// wxTreeMultiCtrl -//---------------------------------------------------------------------------- - -IMPLEMENT_DYNAMIC_CLASS(wxTreeMultiCtrl, wxScrolledWindow) - -// WDR: event table for wxTreeMultiCtrl -BEGIN_EVENT_TABLE(wxTreeMultiCtrl, wxScrolledWindow) - EVT_LEFT_DOWN (wxTreeMultiCtrl::OnMouseClick) - EVT_LEFT_DCLICK(wxTreeMultiCtrl::OnMouseClick) - EVT_RIGHT_DOWN (wxTreeMultiCtrl::OnRightMouseClick) - EVT_PAINT(wxTreeMultiCtrl::OnPaint) - EVT_SIZE(wxTreeMultiCtrl::OnSize) -// EVT_KEY_UP(wxTreeMultiCtrl::OnKey) -END_EVENT_TABLE() - -bool wxTreeMultiCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, - const wxSize& size, long style, const wxValidator & WXUNUSED(validator), - const wxString& name ) -{ - wxScrolledWindow::Create( parent, id, pos, size, style | wxTAB_TRAVERSAL, name); - - _create_called = true; - - // do the init - Init(); - - return TRUE; -} - -void wxTreeMultiCtrl::Init() -{ - _root.Clear(); - - _expandBmp = 0; - _collBmp = 0; - -#if(CHECKBOXVIEW) - _checkBmp = 0; - _uncheckBmp = 0; - _tristateBmp = 0; - - _checkHeight = 11; - _checkWidth = 11; - - _checkboxView = false; -#endif - - _gutterWidth = WXTMC_GUTTER_DEFAULT; - _iconWidth = 11; - _iconHeight = 11; - _maxHeight = 1;; - _iconDeltaY = 2; - _spacingY = WXTMC_YSPACING_DEFAULT; - _captionHeight = 13; - - // create two bitmap nodes for drawing - - _expandBmp = new wxBitmap(expand_xpm); - _collBmp = new wxBitmap(collapse_xpm); - - // calculate average font height for bitmap centering - - _iconWidth = _expandBmp->GetWidth(); - _iconHeight = _expandBmp->GetHeight(); - -#if(CHECKBOXVIEW) - // create bitmaps for checkboxes - _checkBmp = new wxBitmap(checked_icon); - _uncheckBmp = new wxBitmap(unchecked_icon); - _tristateBmp = new wxBitmap(tristate_icon); - - // adjust the height if the checkboxes are higher - // so that everything is alligned properly - _checkHeight = _checkBmp->GetHeight(); - _checkWidth = _checkBmp->GetWidth(); -#endif - - // remember the highest of the two bitmaps so there is - // always enough room - _maxHeight = _iconHeight; - -#if(CHECKBOXVIEW) - if(_maxHeight < _checkHeight) - _maxHeight = _checkHeight; -#endif - - // set standard highlighting brush - this->m_HilightBrush = new wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT),wxSOLID); - - // set standard DC font - _captionFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); - - // adjust bitmap icon y position so they are centered - AdjustIconsDeltaY(); - - // set virtual size to this window size - if (_create_called) { - wxSize wndsize = GetSize(); - SetVirtualSize(wndsize.GetWidth(), wndsize.GetWidth()); - } -} - -void wxTreeMultiCtrl::SetCaptionFont(const wxFont &font) -{ - _captionFont = font; - - // adjust the icons so that they are in the middle - AdjustIconsDeltaY(); - - RedrawFromNode(0); -}; - -void wxTreeMultiCtrl::AdjustIconsDeltaY() -{ - int x = 0, y = 0; - - if(_captionFont.Ok()) - GetTextExtent(wxT("jG"), &x, &y, 0, 0, &_captionFont); - _captionHeight = y; - - if(_maxHeight < _captionHeight) - _maxHeight = _captionHeight; - - // determine the center pos for the [+] - _iconDeltaY = abs(_maxHeight - _iconHeight) / 2 + 1; - if(_iconDeltaY < 1) - _iconDeltaY = 1; - -#if(CHECKBOXVIEW) - // determine the center pos for the checkbox - _checkDeltaY = abs(_maxHeight - _checkHeight) / 2 + 1; - if(_checkDeltaY < 1) - _checkDeltaY = 1; -#endif -} - -wxTreeMultiCtrl::~wxTreeMultiCtrl() -{ - // delete the bitmap resources - delete _expandBmp; - delete _collBmp; - -#if(CHECKBOXVIEW) - delete _checkBmp; - delete _uncheckBmp; - delete _tristateBmp; -#endif -} - -wxTreeMultiItem wxTreeMultiCtrl::AddRoot(const wxString &caption, const wxString &name) -{ - wxTreeMultiItem result((TreeMultiItemBase *)&_root); - result = AppendNode(result, caption, name); - - return result; -} - -wxTreeMultiItem wxTreeMultiCtrl::AppendWindow(const wxTreeMultiItem &ParentItem, wxWindow *window, const wxString &name, const wxTreeMultiWindowInfo &info, int flags) -{ - // add window only if the parent item is valid and... - wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); - - TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes - - // ... is a node - wxCHECK(parent != NULL, wxTreeMultiItem(0)); - - // now, append node to the tree control: - wxTreeMultiItem NewWindowItem(this->InsertWindow(parent,wx_static_cast(size_t,parent->GetNodeCount()),window,name,info,flags)); - // redraw the stucture: - this->RedrawFromNode(parent); - // return the new window - return NewWindowItem; -} - -wxTreeMultiItem wxTreeMultiCtrl::InsertWindow(wxTreeMultiItem const& ParentItem, size_t Position, wxWindow *window, wxString const& name, wxTreeMultiWindowInfo const& info, int flags) -{ - // add window only if the parent item is valid and... - wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); - - TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes - - // ... is a node - wxCHECK(parent != NULL, wxTreeMultiItem(0)); - - // now, append node to the tree control: - wxTreeMultiItem NewWindowItem(this->InsertWindow(parent,Position,window,name,info,flags)); - // redraw the stucture: - this->RedrawFromNode(parent); - // return the new window - return NewWindowItem; -} /* wxTreeMultiCtrl::InsertWindow(wxTreeMultiItem const&, size_t, wxWindow*, wxString const&, wxTreeMultiWindowInfo const&, int) */ - -wxTreeMultiItem wxTreeMultiCtrl::PrependWindow(wxTreeMultiItem const& ParentItem, wxWindow *window, const wxString &name, wxTreeMultiWindowInfo const& info, int flags) -{ - // add window only if the parent item is valid and... - wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); - - TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes - - // ... is a node - wxCHECK(parent != NULL, wxTreeMultiItem(0)); - - // now, append node to the tree control: - wxTreeMultiItem NewWindowItem(this->InsertWindow(parent,0,window,name,info,flags)); - // redraw the stucture: - this->RedrawFromNode(parent); - // return the new window - return NewWindowItem; -} /* wxTreeMultiCtrl::PrependWindow(wxTreeMultiItem const&, wxWindow*, const wxString &, wxTreeMultiWindowInfo const&, int) */ - -wxTreeMultiItem wxTreeMultiCtrl::AppendNode(wxTreeMultiItem const& ParentItem, const wxString &caption, const wxString &name) -{ - // add window only if the parent item is valid and... - wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); - - TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes - - // ... is a node - wxCHECK(parent != NULL, wxTreeMultiItem(0)); - - // now, append node to the tree control: - wxTreeMultiItem NewNodeItem(this->InsertNode(parent,wx_static_cast(size_t,parent->GetNodeCount()),caption,name)); - // redraw the structure: - this->RedrawFromNode(parent); - // return the new node: - return NewNodeItem; -} /* wxTreeMultiCtrl::AppendNode(wxTreeMultiItem const&, const wxString &, const wxString&) */ - -wxTreeMultiItem wxTreeMultiCtrl::InsertNode(wxTreeMultiItem const& ParentItem, size_t Position, wxString const& caption, wxString const& name) -{ - // add window only if the parent item is valid and... - wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); - - TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes - - // ... is a node - wxCHECK(parent != NULL, wxTreeMultiItem(0)); - - // now, append node to the tree control: - wxTreeMultiItem NewNodeItem(this->InsertNode(parent,Position,caption,name)); - // redraw the structure: - this->RedrawFromNode(parent); - // return the new node: - return NewNodeItem; -} /* wxTreeMultiCtrl::InsertNode(wxTreeMultiItem const&, size_t, wxString const&, wxString const&) */ - -wxTreeMultiItem wxTreeMultiCtrl::PrependNode(wxTreeMultiItem const& ParentItem, wxString const& caption, wxString const& name) -{ - // add window only if the parent item is valid and... - wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); - - TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes - - // ... is a node - wxCHECK(parent != NULL, wxTreeMultiItem(0)); - - // now, append node to the tree control: - wxTreeMultiItem NewNodeItem(this->InsertNode(parent,0,caption,name)); - // redraw the structure: - this->RedrawFromNode(parent); - // return the new node: - return NewNodeItem; -} /* wxTreeMultiCtrl::PrependNode(wxTreeMultiItem const&, wxString const&, wxString const&) */ - -bool wxTreeMultiCtrl::Delete(wxTreeMultiItem &item) -{ - bool redraw = true; - wxCHECK(item.IsOk(), false); - - wxTreeMultiItem nullItem(0); - - - // if item has been selected, remove it from the selected list: - size_t ItemIndex(this->GetSelectedItemIndex(item)); - - if (ItemIndex != this->GetSelectedItemCount()) - this->m_SelectedItems.RemoveAt(ItemIndex); - - // get parent, to delete item from - TreeMultiItemNode *p = item.GetItem()->GetParent(); - - // first check if it was visible, if so from the parent off - // it needs redrawing - redraw = item.GetItem()->IsVisible(); - if(p) - p->DeleteNode(item.GetItem()); - else - _root.DeleteNode(item.GetItem()); - - item = nullItem; - - // do redraw when node was visible - if(redraw) - RedrawFromNode(p); - - return true; -} - -void wxTreeMultiCtrl::DeleteChildren(const wxTreeMultiItem &item) -{ - if(item.IsNodeItem()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); - - // remove all children from the selected item list: - if (n->GetNodeCount() > 0) - { - // variable definitions and initializations: - int Cookie; - wxTreeMultiItem FirstItemIterator(this->GetFirstChild(item,Cookie)), LastItemIterator(this->GetLastChild(item)); - - for (;;) - { - size_t ItemIndex(this->GetSelectedItemIndex(item)); // variable definition and initialization - - if (ItemIndex != this->GetSelectedItemCount()) - this->m_SelectedItems.RemoveAt(ItemIndex); - if (FirstItemIterator == LastItemIterator) - break; // all children checked - else - FirstItemIterator = this->GetNext(FirstItemIterator); - } /* for */ - } /* if */ - // delete children: - n->Clear(); - // redraw: - RedrawFromNode(n); - } -} - -void wxTreeMultiCtrl::Expand(const wxTreeMultiItem &item, bool recursive) -{ - if(item.IsOk()) - { - TreeMultiItemNode *n = item.GetItem()->IsTreeMultiItemNode(); - if(!n) - n = item.GetItem()->GetParent(); - DoFold(n, true, recursive); - RedrawFromNode(item.GetItem()->IsTreeMultiItemNode()); - } -} - -void wxTreeMultiCtrl::Collapse(const wxTreeMultiItem &item, bool recursive) -{ - if(item.IsOk()) - { - TreeMultiItemNode *n = item.GetItem()->IsTreeMultiItemNode(); - if(!n) - n = item.GetItem()->GetParent(); - DoFold(n, false, recursive); - RedrawFromNode(item.GetItem()->IsTreeMultiItemNode()); - } -} - - -void wxTreeMultiCtrl::ExpandNodes(bool recursive) -{ - // go through all children and call DoFold recursively - for(int i = 0; i < _root.GetNodeCount(); i++) - DoFold(_root.GetNode(i), true, recursive); - RedrawFromNode(0); -} - -void wxTreeMultiCtrl::CollapseNodes(bool recursive) -{ - // go through all children and call DoFold recursively - for(int i = 0; i < _root.GetNodeCount(); i++) - DoFold(_root.GetNode(i), false, recursive); - RedrawFromNode(0); -} - -void wxTreeMultiCtrl::CollapseAndReset(const wxTreeMultiItem &item) -{ - if(item.IsNodeItem()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); - - // delete all kids - n->Clear(); - Collapse(item, false); - } -} - -// Selection manipulation -wxTreeMultiItem wxTreeMultiCtrl::GetFirstSelectedItem(void) const -{ - if (this->GetSelectedItemCount() > 0) - return this->m_SelectedItems[0]; - else - return wxTreeMultiItem(); -} /* wxTreeMultiCtrl::GetFirstSelectedItem(void) const */ - -wxTreeMultiItem wxTreeMultiCtrl::GetLastSelectedItem(void) const -{ - if (this->GetSelectedItemCount() > 0) - return this->m_SelectedItems[this->GetSelectedItemCount()-1]; - else - return wxTreeMultiItem(); -} /* wxTreeMultiCtrl::GetLastSelectedItem(void) const */ - -wxTreeMultiItem wxTreeMultiCtrl::GetSelectedItem(size_t Index) const -{ - if (Index < this->GetSelectedItemCount()) - return this->m_SelectedItems[Index]; - else - return wxTreeMultiItem(); -} /* wxTreeMultiCtrl::GetSelectedItem(size_t Index) const */ - -size_t wxTreeMultiCtrl::GetSelectedItemIndex(wxTreeMultiItem const& Item) const -{ - // attention: the function wxArray::Index() can NOT be used in a save manner as it only checks the address of an item - // element but it is not guaranteed that Item may not be a copy of the originally inserted item - const size_t NoOfSelectedItems = this->GetSelectedItemCount(); - - size_t Index(0); - - - while ((Index < NoOfSelectedItems) && (this->m_SelectedItems[Index] != Item)) - ++Index; - return Index; -} /* wxTreeMultiCtrl::GetSelectedItemIndex(wxTreeMultiItem const&) const */ - -void wxTreeMultiCtrl::SelectItem(wxTreeMultiItem const& Item, bool UnselectOthers, bool ExpandSelection) -{ - TreeMultiItemNode* NodePtr(Item.GetItem()->IsTreeMultiItemNode()); - - - // only nodes can be selected and they can only be selected if they are not already selected: - if ((NodePtr == NULL) || NodePtr->IsSelected()) - return; - - // inform that we are about to change: - wxTreeMultiEvent Event(wxEVT_COMMAND_TREE_MULTI_SEL_CHANGING,Item); // variable definition and initialization - - if (this->m_SelectedItems.GetCount() > 0) // the last item in the array is always the latest inserted item - Event.SetOldItem(this->m_SelectedItems.Last()); - Event.SetEventObject(this); - if (this->GetEventHandler()->ProcessEvent(Event) && !(Event.IsAllowed())) - return; // vetoed - - // make sure that the to be selected item can be seen: - this->Include(Item); - - // variable definition and initialization: - wxTreeMultiItem ExcludedParent(this->GetExcludedParent(Item)); - - while (ExcludedParent.IsOk()) - { - this->Include(ExcludedParent); - ExcludedParent = this->GetExcludedParent(Item); - } /* while */ - - // unselect items if necessary: - if (UnselectOthers) - this->UnselectAll(); - // expand selection if necessary: - if (ExpandSelection) - { - // variable definition: - wxTreeMultiItem FirstItemIterator, LastItemIterator; - wxTreeMultiItem LastSelectedItem; - - // determine the last selected item or the first item in case nothing has been selected before: - if (this->m_SelectedItems.GetCount() > 0) - LastSelectedItem = this->m_SelectedItems.Last(); - else - LastSelectedItem = this->GetFirstRoot(); - // determine the item from which to start and the one with which to end the selection: - if (Item.GetItem()->GetY() > LastSelectedItem.GetItem()->GetY()) - { - FirstItemIterator = LastSelectedItem; - LastItemIterator = Item; - } /* if */ - else - { - FirstItemIterator = Item; - LastItemIterator = LastSelectedItem; - } /* if */ - // select all items that are a node and are placed between the two limiting iterators (included the limits): - for (;;) - { - if (!(FirstItemIterator.IsSelected()) && FirstItemIterator.IsNodeItem()) - { - FirstItemIterator.GetItem()->Select(); - this->m_SelectedItems.Add(FirstItemIterator); - this->RefreshRect(wxRect(FirstItemIterator.GetItem()->GetX(), FirstItemIterator.GetItem()->GetY(), - FirstItemIterator.GetItem()->GetWidth(),FirstItemIterator.GetItem()->GetHeight())); - } /* if */ - if (FirstItemIterator == LastItemIterator) - break; // done - // continue iterating: - FirstItemIterator = this->GetNext(FirstItemIterator); - } /* for */ - } /* if */ - else // select passed item only - { - NodePtr->Select(); - this->m_SelectedItems.Add(NodePtr); - this->RefreshRect(wxRect(NodePtr->GetX(),NodePtr->GetY(),NodePtr->GetWidth(),NodePtr->GetHeight())); - } /* if */ - - // inform that we have selected the item: - Event.SetEventType(wxEVT_COMMAND_TREE_MULTI_SEL_CHANGED); - this->GetEventHandler()->ProcessEvent(Event); -} /* wxTreeMultiCtrl::SelectItem(wxTreeMultiItem const&, bool, bool) */ - -void wxTreeMultiCtrl::UnselectAll(void) -{ - const size_t NoOfSelectedItems = this->m_SelectedItems.GetCount(); - - - for (size_t i=0; iRefreshRect(wxRect(this->m_SelectedItems[i].GetItem()->GetX(), this->m_SelectedItems[i].GetItem()->GetY(), - this->m_SelectedItems[i].GetItem()->GetWidth(),this->m_SelectedItems[i].GetItem()->GetHeight())); - this->m_SelectedItems[i].GetItem()->Unselect(); - } /* for */ - this->m_SelectedItems.Clear(); -} /* wxTreeMultiCtrl::UnselectAll(void) */ - -void wxTreeMultiCtrl::Unselect(wxTreeMultiItem const& Item) -{ - size_t ItemIndex(this->GetSelectedItemIndex(Item)); - - - if (ItemIndex != this->GetSelectedItemCount()) - { - Item.GetItem()->Unselect(); - this->m_SelectedItems.RemoveAt(ItemIndex); - this->RefreshRect(wxRect(Item.GetItem()->GetX(),Item.GetItem()->GetY(),Item.GetItem()->GetWidth(),Item.GetItem()->GetHeight())); - } /* if */ -} /* wxTreeMultiCtrl::Unselect(wxTreeMultiItem const&) */ - -void wxTreeMultiCtrl::DoFold(TreeMultiItemBase *item, bool expand, bool recursive) -{ - - // go through all node objects on this level, and expand or - // collapse them - - if(item == 0) - return; - - // if this is a node, use it to go through all the subnodes (if needed) - // if not, then just exit. - - TreeMultiItemNode *node = item->IsTreeMultiItemNode(); - if(node) - { - node->Fold(expand); - - // go recursive - if(recursive) - { - TreeMultiItemNode *p; - for(int i = 0; i < node->GetNodeCount(); i++) - { - // get node, and if a real node, then call fold - p = node->GetNode(i)->IsTreeMultiItemNode(); - if(p) - p->Fold(expand); - - // go recursive for every node - DoFold(p, expand, recursive); - } - } - } -} - -void wxTreeMultiCtrl::Exclude(const wxTreeMultiItem &item) -{ - wxCHECK2(item.IsOk(), return); - - // exclude the item, and refresh - // if already excluded, skip - - if(!item.GetItem()->IsExcluded()) - { - item.GetItem()->SetExcluded(true); - RedrawFromParentNode(item.GetItem()); - } -} - -void wxTreeMultiCtrl::Include(const wxTreeMultiItem &item) -{ - wxCHECK2(item.IsOk(), return); - - // include the item, and refresh. If not - // excluded, do nothing - - if(item.GetItem()->IsExcluded()) - { - item.GetItem()->SetExcluded(false); - RedrawFromParentNode(item.GetItem()); - } -} - -wxTreeMultiItem wxTreeMultiCtrl::GetExcludedParent(const wxTreeMultiItem &item) -{ - wxCHECK(item.IsOk(), wxTreeMultiItem(0)); - - // go find the parent (including this one) that - // can be the excluded one - - TreeMultiItemNode *n = item.GetItem()->IsTreeMultiItemNode(); - if(n && n->IsExcluded()) - return wxTreeMultiItem(n); - - n = item.GetItem()->GetParent(); - while(n) - { - if(n->IsExcluded()) - return wxTreeMultiItem(n); - else - n = n->GetParent(); - } - - return wxTreeMultiItem(0); -} - -void wxTreeMultiCtrl::OnSize(wxSizeEvent &WXUNUSED(event)) -{ - RecalculateSpanSizes(); -} - -void wxTreeMultiCtrl::OnPaint(wxPaintEvent& WXUNUSED(event) ) -{ - wxPaintDC dc(this); - - PrepareDC(dc); - - // go recursive and draw the whole visible tree. - dc.SetFont(_captionFont); - for(int i = 0; i < _root.GetNodeCount(); i++) - DrawNode(_root.GetNode(i), dc); -} - -void wxTreeMultiCtrl::DrawNode(TreeMultiItemBase *b, wxDC &dc) -{ - // go through this item .. if it is a node, draw - // the caption, else reposition the window. - - if(!b) - return; - - // forget it if this node is not visible - if(b->IsVisible()) - { - int bmpOffsetX = b->GetX() - (_gutterWidth + _iconWidth); - -#if(CHECKBOXVIEW) - // now draw the checkbox if there is any, in the proper state - if(b->GetCheckbox()) - { - DrawCheckbox(b, dc); - - // adjust the bmpOffset because we also have a checkbox - bmpOffsetX -= _checkWidth; - } -#endif - - if(b->IsTreeMultiItemNode()) - { - // draw the node icon and the caption - TreeMultiItemNode *n = (TreeMultiItemNode *)b; - - // set background of caption item - if (n->IsSelected()) - { - dc.SetBrush(*(this->m_HilightBrush)); - dc.SetPen(wxPen(this->m_HilightBrush->GetColour(),1,wxSOLID)); - } /* if */ - else - { - dc.SetBrush(wxBrush(*wxWHITE,wxSOLID)); - dc.SetPen(wxPen(*wxWHITE,1,wxSOLID)); - } /* if */ - dc.DrawRectangle(n->GetX(),n->GetY(),n->GetWidth(),n->GetHeight()); - // draw caption - dc.DrawText(n->GetCaption(), n->GetX(), n->GetY()); - - // draw the bitmap for the state - if(n->IsExpanded()) - dc.DrawBitmap(*_expandBmp, bmpOffsetX, n->GetY() + _iconDeltaY, true); - else - dc.DrawBitmap(*_collBmp, bmpOffsetX, n->GetY() + _iconDeltaY, true); - - // now go through all the subnodes - for(int i = 0; i < n->GetNodeCount(); i++) - DrawNode(n->GetNode(i), dc); - - } - } -} - -#if(CHECKBOXVIEW) - -void wxTreeMultiCtrl::DrawCheckbox(TreeMultiItemBase *b, wxDC &dc, bool convertScrolled) -{ - wxCHECK2(b, return); - - wxBitmap *bmp; - int bmpOffsetX = b->GetX() - (_gutterWidth + _iconWidth); - - switch(b->GetCheckboxState()) - { - case 0: - bmp = _uncheckBmp; - break; - case 1: - bmp = _checkBmp; - break; - default: - bmp = _tristateBmp; - break; - } - - int x, xx, y, yy; - - if(b->IsTreeMultiItemWindow()) - { - xx = x = bmpOffsetX - ((TreeMultiItemWindow *)b)->GetFrontSpacing() + _checkWidth; - yy = y = b->GetY() + _checkDeltaY; - } - else - { - xx = x = bmpOffsetX; - yy = y = b->GetY() + _checkDeltaY; - } - - if(convertScrolled) - CalcScrolledPosition(x, y, &xx, &yy); - - dc.DrawBitmap(*bmp, xx, yy, true); -} - -#endif // #if(CHECKBOXVIEW) - -void wxTreeMultiCtrl::OnKey(wxKeyEvent &event) -{ - // check if we need to traverse to upper or lower - // control in the list - if(event.GetKeyCode() == WXK_TAB) - { - wxTreeMultiItem item = GetFocus(); - if(item.IsOk()) - { - // traverse down direction - if(!event.ShiftDown()) - item = FindNextVisibleWindowItem(item.GetItem()); - //else // traverse in up direction - // item = FindPreviousVisibleWindowItem(item); - - if(item.IsOk()) - { - TreeMultiItemWindow *w = item.GetItem()->IsTreeMultiItemWindow(); - if(w) - { - wxWindow *wnd = w->GetWindow(); - wnd->SetFocus(); - } - } - } - } - else - event.Skip(); -} - -void wxTreeMultiCtrl::OnMouseClick( wxMouseEvent &event ) -{ - // react on double click and left mouse down - if(event.LeftDown() || event.LeftDClick()) - { - // get translation point - wxPoint pt( event.GetPosition() ); - - int x = 0, y = 0; - CalcUnscrolledPosition( pt.x, pt.y, &x, &y ); - - // go check if we clicked a treenode - int flags; - wxPoint p(x,y); - wxTreeMultiItem id = HitTest(p, flags); - -#if(CHECKBOXVIEW) - if(flags == wxTMC_HITTEST_CHECKBOX) - { - // toggle the checkbox, and redraw - if(id.IsOk()) - { - TreeMultiItemBase *b = id.GetItem(); - b->SetCheckboxState((b->GetCheckboxState()+1) & 0x1); - - TreeMultiItemWindow *w = b->IsTreeMultiItemWindow(); - if(w) - { - // try to force a focus on the window. This could - // be extended by searching for the first edit control - // class but for now, just a focus is tried. - w->GetWindow()->Enable(b->GetCheckboxState() == 1); - w->GetWindow()->SetFocus(); - - // draw the checkbox in the state needed - wxClientDC dc(this); - DrawCheckbox(b, dc, true); - - // TODO: determine if the upper parents should be - // tristated or not - - ScanTristateCheckstates(b); - - } - else if(b->IsTreeMultiItemNode()) - { - // descend to all the children and set the state of the parent - SetRecursiveCheckState((TreeMultiItemNode *)b, b->GetCheckboxState() == 1); - RedrawFromNode((TreeMultiItemNode *)b); - } - } - } - else -#endif // #if(CHECKBOXVIEW) - { - // react on left mouse button, to fold and on - // right for caption doubleclick - int area = -1; - -// adjust behaviour for Linux (single click = always fold) -#ifndef LINUX - if(event.LeftDClick()) - area = wxTMC_HITTEST_CAPTION; - else - area = wxTMC_HITTEST_GUTTER; -#else - area = flags; -#endif - -// Linux (single or double click -> always fold - if (id.IsOk()) - { -#ifdef LINUX - // we have a valid item, if it is a node, then fold - TreeMultiItemNode *n = id.GetItem()->IsTreeMultiItemNode(); - if(n) - { - this->SelectItem(id); - Fold(n, !n->IsExpanded()); - } /* if */ -#else - if (event.LeftDown()) - if (flags == wxTMC_HITTEST_GUTTER) - { - TreeMultiItemNode *n = id.GetItem()->IsTreeMultiItemNode(); // for some reasons also windows may have set the flag - - if (n != NULL) - Fold(n, !n->IsExpanded()); - } /* if */ - else if (flags == wxTMC_HITTEST_CAPTION) - { - TreeMultiItemNode *n = id.GetItem()->IsTreeMultiItemNode(); // for some reasons also windows may have set the flag - - if (n != NULL) - { - this->SelectItem(id); - this->RedrawFromNode(n); - } /* if */ - } /* if */ -#endif - } /* if */ - else - this->UnselectAll(); - } - } -} - -void wxTreeMultiCtrl::OnRightMouseClick(wxMouseEvent& Event) -{ - if (Event.RightDown()) - if (Event.Dragging()) - this->UnselectAll(); - else - { - // variable definitions: - int Flags; - wxPoint Point; - - // translate mouse coordinates: - CalcUnscrolledPosition(Event.GetPosition().x,Event.GetPosition().y,&(Point.x),&(Point.y)); - // check if the mouse is above the caption of an item: - wxTreeMultiItem Item(this->HitTest(Point,Flags)); // variable definition and initialization - - if (Item.IsOk() && (Flags == wxTMC_HITTEST_CAPTION)) - { - this->SelectItem(Item); - this->RedrawFromNode(Item.GetItem()->IsTreeMultiItemNode()); - Event.Skip(); // window will convert right mouse click to a context menu event or proceed with - // a right mouse click event if the context menu event cannot be processed - } /* if */ - else - this->UnselectAll(); - } /* if */ - else - this->UnselectAll(); -} /* wxTreeMultiCtrl::OnRightMouseClick(wxMouseEvent&) */ - -wxTreeMultiItem wxTreeMultiCtrl::HitTest(wxPoint const& pt, int &flags) -{ - // scan all nodes to see which one matches - TreeMultiItemBase *b = 0; - for(int i = 0; i < _root.GetNodeCount() && !b; i++) - b = FindNodeByPoint(_root.GetNode(i), pt, flags); - - if(!b) - { - // none found, reset - flags = 0; - return wxTreeMultiItem(0); - } - - // return an item - return wxTreeMultiItem(b); -} - -TreeMultiItemBase *wxTreeMultiCtrl::FindNodeByPoint(TreeMultiItemBase *b, wxPoint const& pt, int &area) -{ - wxCHECK(b, 0); - - // if this layer is not visible, return with nothing. - if(!b->IsVisible()) - return 0; - - area = 0; - - // now see if our y is matching the mouse - if(pt.y >= b->GetY() && pt.y < (b->GetY() + b->GetHeight())) - { -#if(CHECKBOXVIEW) - // if we are checkboxed, calculate the checkbox position - if(b->GetCheckbox()) - { - int extraSpacing = 0, extraWidth = 0; - - // now for a windows item, this is minus the gutter. For a normal node it is X minus checkbox - if(b->IsTreeMultiItemWindow()) - { - extraWidth = _checkWidth; - extraSpacing = ((TreeMultiItemWindow *)b)->GetFrontSpacing(); - } - else - extraSpacing = 4; - - if(pt.x > (b->GetX() - extraSpacing - _checkWidth) && pt.x < (b->GetX() - extraSpacing + extraWidth)) - { - area = wxTMC_HITTEST_CHECKBOX; - return b; - } - } -#endif - - // allrighty we have something, now where and what is it (look with x) - if(pt.x < b->GetX()) - area = wxTMC_HITTEST_GUTTER; - - /** \todo Match only the real part of the caption, window (we assume x > GetX() which is the rest) - HOWEVER the window probably doesn't propagate the click event back to the parent, so we might - leave it like this so the use can click behind a window so it will be selected. - */ - else - { - // inside area, return proper flag - if(b->IsTreeMultiItemNode()) - area = wxTMC_HITTEST_CAPTION; - else - area = wxTMC_HITTEST_WINDOW; - } - - return b; - } - else - { - // not found, let's try our children if we have some - TreeMultiItemNode *n = b->IsTreeMultiItemNode(); - if(n) - { - TreeMultiItemBase *bb = 0; - for(int i = 0; i < n->GetNodeCount() && !bb; i++) - bb = FindNodeByPoint(n->GetNode(i), pt, area); - - // keep returning result to caller - return bb; - } - } - - return 0; -} - -wxTreeMultiItem wxTreeMultiCtrl::GetFocus() -{ - wxWindow *wnd = wxWindow::FindFocus(); - - // now find window that holds this item. if not - // visible it cannot have focus (should not have) - - wxTreeMultiItem item = FindWindowNode(wnd); - if(item.IsOk() && item.GetItem()->IsVisible()) - return item; - - return wxTreeMultiItem(0); -} - -#if(CHECKBOXVIEW) - -void wxTreeMultiCtrl::SetRecursiveCheckState(TreeMultiItemNode *n, bool check) -{ - int state = 0; - if(check) - state++; - - // go check all kids on this level - for(int i = 0; i < n->GetNodeCount(); i++) - { - // check all the nodes, and go deeper - n->GetNode(i)->SetCheckboxState(state); - if(n->GetNode(i)->IsTreeMultiItemNode()) - SetRecursiveCheckState((TreeMultiItemNode *)n->GetNode(i), check); - } -} - -void wxTreeMultiCtrl::ScanTristateCheckstates(TreeMultiItemBase *b) -{ - // check from the parent on, all node entries and see if they are - // checked or cleared or scattered - TreeMultiItemNode *p = b->GetParent(); - - if(p && p->GetCheckbox()) - { - bool foundcheck = false, foundclear = false; - for(size_t i = 0; i < (size_t)p->GetNodeCount(); ++i) - { - // only evaluate when checkboxed - if(p->GetNode(i)->IsTreeMultiItemWindow() && p->GetNode(i)->GetCheckbox()) - { - // record instance of a cleared checkbox - if(!p->GetNode(i)->GetCheckboxState()) - foundclear = true; - // record instance of checked checkbox - if(p->GetNode(i)->GetCheckboxState() == 1) - foundcheck = true; - } - } - - // if we have both check and clear, go tristate - // if all clear, clear parent and if all set, then set parent - if(foundclear && !foundcheck) - p->SetCheckboxState(0); - else if(!foundclear && foundcheck) - p->SetCheckboxState(1); - else if(foundclear && foundcheck) - p->SetCheckboxState(2); - - //wxClientDC dc; - //DrawCheckbox(p, dc, false); - RedrawFromNode(p); - } -} - -#endif // #if(CHECKBOXVIEW) - -wxTreeMultiItem wxTreeMultiCtrl::InsertNode(TreeMultiItemNode* ParentPtr, size_t Position, wxString const& Caption, wxString const& Name) -{ - int extX, extY; - - TreeMultiItemNode* NodePtr(new TreeMultiItemNode(ParentPtr,Caption,Name)); // generate new node pointer - - - // continue with initializing the new node: -#if(CHECKBOXVIEW) - // if checkbox view is desired, tag this item as a checkbox - // and set the state as 'false' - NodePtr->SetCheckbox(_checkboxView); - NodePtr->SetCheckboxState(0); -#endif - // calculate the height and width - this->GetTextExtent(Caption,&extX,&extY,0,0,&(this->_captionFont)); - NodePtr->SetHeight(extY); - NodePtr->SetWidth(extX); - // finally, insert node: - if (Position < (size_t)ParentPtr->GetNodeCount()) - ParentPtr->InsertNode(NodePtr,Position); - else - ParentPtr->AddNode(NodePtr); - // return the newly created node: - return wxTreeMultiItem(NodePtr); -} /* wxTreeMultiCtrl::InsertNode(TreeMultiItemNode*, size_t, wxString const&, wxString const&) */ - -wxTreeMultiItem wxTreeMultiCtrl::InsertWindow(TreeMultiItemNode* ParentPtr, size_t Position, wxWindow* WindowPtr, wxString const& Name, wxTreeMultiWindowInfo const& Info, int Flags) -{ - int WindowFlags; - - TreeMultiItemWindow* NewWindowPtr = new TreeMultiItemWindow(ParentPtr,Name); // generate new window pointer - - - // get flags from passed variable "Flags"; in case this variable does not contain any flags use the window's information flags: - if (Flags != 0) - WindowFlags = Flags; - else - WindowFlags = Info.GetFlags(); - - // continue with initializing the new window: -#if(CHECKBOXVIEW) - // if checkbox view is desired, tag this item as a checkbox - // and set the state as 'false' - NewWindowPtr->SetCheckbox(_checkboxView); -#endif - // if style wants us to change background, set it to our background - if (WindowFlags & wxTMC_BG_ADJUST_ALL) - { - // go through all children of this window, and set the - // background of it (recursively) - this->SetWindowBackgroundColour(WindowPtr,this->GetBackgroundColour(),WindowFlags); - } /* if */ - - // set the spacing: - NewWindowPtr->SetTopSpacing(Info.GetTopSpacing()); -#if(CHECKBOXVIEW) - // make sure that the checkboxes are at least indented enough - if (this->_checkboxView) - NewWindowPtr->SetFrontSpacing(Info.GetFrontSpacing() + this->_checkWidth); - else -#endif - NewWindowPtr->SetFrontSpacing(Info.GetFrontSpacing()); - // assign finally the window: - NewWindowPtr->AssignWindow(WindowPtr); - -#if(CHECKBOXVIEW) - // set the checkbox state after the window is assigned - NewWindowPtr->SetCheckboxState(Info.GetDefaultCheckState()); -#endif - - // if the window is not visible, set hide flag - this->ShowTreeMultiWindow(NewWindowPtr,NewWindowPtr->IsVisible()); - - // finally, insert the newly constructed window: - if (Position < (size_t)ParentPtr->GetNodeCount()) - ParentPtr->InsertNode(NewWindowPtr,Position); - else - ParentPtr->AddNode(NewWindowPtr); - // return the newly created window: - return wxTreeMultiItem(NewWindowPtr); -} /* wxTreeMultiCtrl::InsertWindow(TreeMultiItemNode*, size_t, wxWindow*, wxString const&, wxTreeMultiWindowInfo const&, int) */ - -void wxTreeMultiCtrl::RedrawFromParentNode(TreeMultiItemBase *n) -{ - TreeMultiItemNode *p = 0; - if(n) - p = n->GetParent(); - - RedrawFromNode(p); -} - -void wxTreeMultiCtrl::RedrawFromNode(TreeMultiItemNode *n) -{ - static int recalcMutex = 0; - bool visible = true; - - if(recalcMutex > 0) - return; - - recalcMutex ++; - - // when node is not visible or excluded - // then don't redraw. - - if(n) - visible = n->IsVisible(); - - if(visible) - { - int h, h1,w, w1; - GetVirtualSize(&w, &h); - - UpdateAllWindowVisibility(); - RecalculateNodePositions(); - RecalculateVirtualSize(); - - // why is this needed? Because folding or collapsing can change - // the state. When the virtual area gets smaller, we need to keep - // the largest one and the other way atound. And since we do not - // know here we are folding or collapsing, we remember the biggest - GetVirtualSize(&w1, &h1); - - if(h1 > h) - h = h1; - - // only refresh the part from x,y down - if(n) - { - int x, y; - CalcScrolledPosition(n->GetX(), n->GetY(), &x, &y); - if(h - y > 0) - { - wxRect rect(0, y, w, h - y); - RefreshRect(rect); - } - else - Refresh(); - } - else - Refresh(); // do a full refresh - } - - recalcMutex --; -} - -void wxTreeMultiCtrl::RecalculateNodePositions() -{ - int currentY = _spacingY; - // go recursive on every node, and store the information in the node - - for(int i = 0; i < _root.GetNodeCount(); i++) - currentY += CalculateNodeDimensions(_root.GetNode(i), currentY, 0); -} - -int wxTreeMultiCtrl::CalculateNodeDimensions(TreeMultiItemBase *b, int currentY, int level) -{ - int gutter = (_gutterWidth * 2) + _iconWidth; - int y = 0, topSpacing = 0; - - // return same if no proper object - wxCHECK(b, 0); - -#if(CHECKBOXVIEW) - if(b->GetCheckbox()) - gutter += _checkWidth; -#endif - - // if we are not visible, skip recalculation and descending - if(b->IsVisible()) - { - b->SetY(currentY); - - // if level is 0, calculate with front gutter, else without - y = currentY + b->GetHeight(); - if(b->IsTreeMultiItemNode()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)b; - - if(level == 0) - b->SetX(gutter); - else - b->SetX(gutter + (level * (_gutterWidth + _iconWidth))); - - // now do children of this node - - for(int i = 0; i < n->GetNodeCount(); i++) - y += CalculateNodeDimensions(n->GetNode(i), y + _spacingY, level+1); - } - else if(b->IsTreeMultiItemWindow()) - { - TreeMultiItemWindow *w = (TreeMultiItemWindow *)b; - - if(level == 0) - b->SetX(gutter + w->GetFrontSpacing()); - else - b->SetX(_gutterWidth + (level * (_gutterWidth + _iconWidth)) + w->GetFrontSpacing()); - - topSpacing = w->GetTopSpacing(); - - // reposition the window - - wxWindow *wnd = w->GetWindow(); - if(wnd) - { - int x = 0, y = 0; - CalcScrolledPosition(w->GetX(), w->GetY(), &x, &y); - wnd->SetSize(x, y, w->GetWidth(), w->GetHeight()); - } - } - - if(y > 0) - return (y - currentY) + _spacingY + topSpacing; // return delta - else - return 0; - } - - return 0; // not visible, thus we skip calculations -} - -void wxTreeMultiCtrl::RecalculateSpanSizes() -{ - for(int i = 0; i < _root.GetNodeCount(); i++) - CalculateNodeSpanning(_root.GetNode(i)); -} - -void wxTreeMultiCtrl::CalculateNodeSpanning(TreeMultiItemBase *b) -{ - // return same if no proper object - wxCHECK2(b, return); - - if(b->IsTreeMultiItemNode()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)b; - - // now do children of this node - - for(int i = 0; i < n->GetNodeCount(); i++) - CalculateNodeSpanning(n->GetNode(i)); - } - else if(b->IsTreeMultiItemWindow()) - { - TreeMultiItemWindow *w = (TreeMultiItemWindow *)b; - wxWindow *wnd = w->GetWindow(); - if(wnd) - { - // if the window is spanning, we adjust the width to the max width of the control - if(w->GetHorizontalSpan()) - { - wxSize tmcsize = GetClientSize(); - int maxwidth = tmcsize.GetWidth() - w->GetX() - 8; // extract 3 for border - - wxSizer *sz = wnd->GetSizer(); - if(sz) - { - if(maxwidth < sz->GetMinSize().GetWidth()) - maxwidth = sz->GetMinSize().GetWidth(); - } - - // prevent a size of 0 - if(maxwidth < 1) - maxwidth = 1; - - // set the size - w->SetWidth(maxwidth); - wnd->SetSize(w->GetWidth(), w->GetHeight()); - - // layout by sizer (not sure if this is needed) - if(wnd->GetSizer()) - wnd->GetSizer()->Layout(); - } - } - } -} - -void wxTreeMultiCtrl::RecalculateVirtualSize() -{ - // go through all the nodes, and store the largest x and largest y - - int x = 0, y = 0; - RecalculateVirtualSizeFromNode(&_root, x, y); - - // now adjust virtual size - SetVirtualSize(x, y); - AdjustScrollbars(x, y); -} - -void wxTreeMultiCtrl::AdjustScrollbars(int x, int y) -{ - // adjust scrollbars - // courtesy of treectrlg.cpp - - y += WXTMC_PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels - x += WXTMC_PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels - int x_pos = GetScrollPos( wxHORIZONTAL ); - int y_pos = GetScrollPos( wxVERTICAL ); - SetScrollbars( WXTMC_PIXELS_PER_UNIT, WXTMC_PIXELS_PER_UNIT, x/WXTMC_PIXELS_PER_UNIT, - y/WXTMC_PIXELS_PER_UNIT, x_pos, y_pos, true ); -} - -void wxTreeMultiCtrl::RecalculateVirtualSizeFromNode(const TreeMultiItemNode *node, int &x, int &y) -{ - if(node->IsExcluded()) - return; - - // if calulate this node's dimensions - if(x < (node->GetWidth() + node->GetX())) - x = node->GetWidth() + node->GetX(); - - y = node->GetY() + node->GetHeight(); - - // if this node is collapsed, no subnodes are visible, else - // go through all subnodes as well, node needs to be included as well - if(node->IsExpanded()) - { - TreeMultiItemBase *b; - for(int i = 0; i < node->GetNodeCount(); i++) - { - b = node->GetNode(i); - - // calculate x and y - if(x < (b->GetWidth() + b->GetX())) - x = b->GetWidth() + b->GetX(); - - y = b->GetY() + b->GetHeight(); - - if(b->IsTreeMultiItemNode()) - RecalculateVirtualSizeFromNode((TreeMultiItemNode *)b, x, y); - } - } -} - -void wxTreeMultiCtrl::SetWindowBackgroundColour(wxWindow *wnd, const wxColour &col, int flags) -{ - if(wnd) - { - // if we cannot change a button, make sure all button - // classes are not changed - - wxButton *btn = wxDynamicCast(wnd, wxButton); - if(!btn || ((flags & wxTMC_BG_ADJUST_BTN) != 0)) - wnd->SetBackgroundColour(col); - - // get every window, and make the background equal to the given one - wxWindowListNode *node = wnd->GetChildren().GetFirst(); - while (node) - { - SetWindowBackgroundColour(node->GetData(), col, flags); - node = node->GetNext(); - } - } -} - -void wxTreeMultiCtrl::ShowTreeMultiWindow(TreeMultiItemWindow *window, bool show) -{ - // show or hide window - if(window && window->GetWindow()) - window->GetWindow()->Show(show); -} - -void wxTreeMultiCtrl::UpdateAllWindowVisibility() -{ - // all roots are visible, but what lies beneath ... who knows - for(int i = 0; i < _root.GetNodeCount(); i++) - UpdateTreeMultiWindowVisibility(_root.GetNode(i), true); -} - -void wxTreeMultiCtrl::UpdateTreeMultiWindowVisibility(TreeMultiItemBase *b, bool show) -{ - if(b) - { - // this is done for performance issues. IsVisible can go all - // the way up the tree to check. However if show is already - // false, there is no need to check (some higher one is collapsed) - bool showMe = show; - - if(showMe) - showMe = b->IsVisible(); - - if(b->IsTreeMultiItemWindow()) - { - // if this level must be hidden, hide - ShowTreeMultiWindow((TreeMultiItemWindow*)b, showMe); - } - else if(b->IsTreeMultiItemNode()) - { - TreeMultiItemNode *node = (TreeMultiItemNode *)b; - - // if hidden, descend and hide all windows - for(int i = 0; i < node->GetNodeCount(); i++) - UpdateTreeMultiWindowVisibility(node->GetNode(i), showMe); - } - } -} - -wxTreeMultiItem wxTreeMultiCtrl::FindItem(const wxTreeMultiItem &item, const wxString &name, bool ignoreCase, bool skipFirst) -{ - if(item.IsOk()) - { - TreeMultiItemBase *b = item.GetItem(); - - // check this item first (or not) - - if(!skipFirst) - { - if(b->GetName().IsSameAs(name, !ignoreCase)) - return wxTreeMultiItem(b); - } - - if(b->IsTreeMultiItemNode()) - { - // now check whether we are a node, then go check children - - TreeMultiItemNode *n = (TreeMultiItemNode *)b; - wxTreeMultiItem result(0); - for(int i = 0; i < n->GetNodeCount() && !result.IsOk(); i++) - result = FindItem(wxTreeMultiItem(n->GetNode(i)), name, ignoreCase, false); - - return result; - } - } - - return wxTreeMultiItem(0); -} - -wxTreeMultiItem wxTreeMultiCtrl::FindWindowNode(wxWindow *wnd, TreeMultiItemNode *n) -{ - wxCHECK(wnd, wxTreeMultiItem(0)); - - // take root node if not assigned one - - if(!n) - n = (TreeMultiItemNode *)&_root; - - // check on this level for the wxWindow pointer - - TreeMultiItemWindow *w; - wxTreeMultiItem result(0); - for(int i = 0; i < n->GetNodeCount() && !result.IsOk(); i++) - { - // if window node - w = n->GetNode(i)->IsTreeMultiItemWindow(); - if(w && w->GetWindow() == wnd) - return wxTreeMultiItem(n); - - // if node, go deeper - if(n->GetNode(i)->IsTreeMultiItemNode()) - result = FindWindowNode(wnd, (TreeMultiItemNode*)n->GetNode(i)); - } - - return result; -} - -TreeMultiItemWindow *wxTreeMultiCtrl::FindNextVisibleWindowItem(TreeMultiItemBase *b, int index) -{ - wxCHECK(b, 0); - - // check on this level, go deeper with every node we got. When a node is not - // visible anymore, skip the node. - - TreeMultiItemWindow *value = 0; - if(b->IsVisible()) - { - // if we are already searching on a node with an index - - TreeMultiItemBase *bn = 0; - TreeMultiItemNode *n = b->IsTreeMultiItemNode(); - if(n) - { - for(int i = index + 1; i < n->GetNodeCount() && !value; i++) - { - bn = n->GetNode(i); - value = bn->IsTreeMultiItemWindow(); - - // assume a node, root when not a a window - if(!value) - value = FindNextVisibleWindowItem(bn, -1); - } - - } - else - { - if(b->IsTreeMultiItemWindow()) - { - // get parent first, and locate child as ptr - TreeMultiItemNode *p = b->GetParent(); - wxCHECK(p, 0); - - // go scan the parent from the given index, if - // the index is valid else there is no child with that index - - int idx = p->Index(b); - wxCHECK(idx >= 0, 0); - - value = FindNextVisibleWindowItem(p, idx); - } - } - } - - return value; - -} - -bool wxTreeMultiCtrl::GetBooleanValue(int wndId) -{ - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK(wnd, false); - - // try a radio button - wxRadioButton *b = wxDynamicCast(wnd, wxRadioButton); - if(b) - return b->GetValue(); - - // try a check box - wxCheckBox *c = wxDynamicCast(wnd, wxCheckBox); - if(c) - return c->GetValue(); - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert or just return with false - wxCHECK(0, false); -} - -void wxTreeMultiCtrl::SetBooleanValue(int wndId, bool value) -{ - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK2(wnd, return); - - // try a radio button - wxRadioButton *b = wxDynamicCast(wnd, wxRadioButton); - if(b) - { - b->SetValue(value); - return; - } - - // try a check box - wxCheckBox *c = wxDynamicCast(wnd, wxCheckBox); - if(c) - { - c->SetValue(value); - return; - } - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert - wxCHECK2(0, return); -} - -void wxTreeMultiCtrl::SetTextValue(int wndId, const wxString &value) -{ - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK2(wnd, return); - - // try a radio button - wxTextCtrl *t = wxDynamicCast(wnd, wxTextCtrl); - if(t) - { - t->SetValue(value); - return; - } - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert - wxCHECK2(0, return); -} - -wxString wxTreeMultiCtrl::GetTextValue(int wndId) -{ - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK(wnd, wxEmptyString); - - // try a radio button - wxTextCtrl *t = wxDynamicCast(wnd, wxTextCtrl); - if(t) - return t->GetValue(); - - // try a choice box - wxChoice *c1 = wxDynamicCast(wnd, wxChoice); - if(c1) - return c1->GetStringSelection(); - - // try a combo box - wxComboBox *c2 = wxDynamicCast(wnd, wxComboBox); - if(c2) - return c2->GetStringSelection(); - - // try a listbox - wxListBox *l = wxDynamicCast(wnd, wxListBox); - if(l) - return l->GetStringSelection(); - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert or just return with string - wxCHECK(0, wxEmptyString); -} - -int wxTreeMultiCtrl::GetSelectionValue(int wndId) -{ - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK(wnd, -1); - - // try a choice box - wxChoice *c1 = wxDynamicCast(wnd, wxChoice); - if(c1) - return c1->GetSelection(); - - // try a combo box - wxComboBox *c2 = wxDynamicCast(wnd, wxComboBox); - if(c2) - return c2->GetSelection(); - - // try a listbox - wxListBox *l = wxDynamicCast(wnd, wxListBox); - if(l) - return l->GetSelection(); - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert or just return with string - wxCHECK(0, -1); -} - -void wxTreeMultiCtrl::GetSelectionValues(int wndId, wxArrayInt &sels) -{ - sels.Clear(); - - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK2(wnd, return); - - // try a listbox - wxListBox *l = wxDynamicCast(wnd, wxListBox); - if(l) - { - l->GetSelections(sels); - return; - } - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert or just return with string - wxCHECK2(0, return); -} - -void wxTreeMultiCtrl::SetSelectionValue(int wndId, int sel) -{ - wxWindow *wnd = wxWindow::FindWindow(wndId); - wxCHECK2(wnd, return); - - // try a choice box - wxChoice *c1 = wxDynamicCast(wnd, wxChoice); - if(c1) - { - c1->SetSelection(sel); - return; - } - - // try a combo box - wxComboBox *c2 = wxDynamicCast(wnd, wxComboBox); - if(c2) - { - c2->SetSelection(sel); - return; - } - - // try a listbox - wxListBox *l = wxDynamicCast(wnd, wxListBox); - if(l) - { - l->SetSelection(sel); - return; - } - - /** \todo For custom controls we should put something in wxMultiTreeItemData class - which can be overridden to retrieve the boolean value. It will also be passed - the pointer to the window, so the derived class can figure out how to get a boolean - value. - */ - - // generate assert or just return with string - wxCHECK2(0, return); -} - - -wxTreeMultiItem wxTreeMultiCtrl::GetParent(wxTreeMultiItem const& item) const -{ - // check if valid or root item has been passed, both do not have parents: - if (!(item.IsOk()) || item.GetItem()->IsTreeMultiItemRoot()) - return wxTreeMultiItem(); - else - return wxTreeMultiItem(item.GetItem()->GetParent()); // GetParent() returns a valid pointer in case of a root item!! - // therefore, the check if the passed item is a root item is necessary -} /* wxTreeMultiCtrl::GetParent(wxTreeMultiItem const& item) const */ - -wxTreeMultiItem wxTreeMultiCtrl::GetFirstChild(const wxTreeMultiItem &item, int &cookie) const -{ - if(item.IsNodeItem()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); - - if(n->GetNodeCount() > 0) - { - cookie = 0; - return wxTreeMultiItem(n->GetNode(0)); - } - } - - // no children or no valid node - cookie = -1; - return wxTreeMultiItem(0); -} - -wxTreeMultiItem wxTreeMultiCtrl::GetNextChild(const wxTreeMultiItem &item, int &cookie) const -{ - if(item.IsNodeItem()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); - - if(cookie >= 0 && cookie < (n->GetNodeCount()-1)) - { - // increment cookie, return node - cookie ++; - return wxTreeMultiItem(n->GetNode(cookie)); - } - } - - // end of query, or no valid node - cookie = -1; - return wxTreeMultiItem(0); -} - -wxTreeMultiItem wxTreeMultiCtrl::GetLastChild(const wxTreeMultiItem &item) const -{ - if(item.IsNodeItem()) - { - TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); - - if(n->GetNodeCount() > 0) - return wxTreeMultiItem(n->GetNode(n->GetNodeCount()-1)); - } - - return wxTreeMultiItem(0); -} - -wxTreeMultiItem wxTreeMultiCtrl::GetNextSibling(wxTreeMultiItem const& item) const -{ - // check if a valid item has been passed: - if (!(item.IsOk())) - return wxTreeMultiItem(); - - TreeMultiItemNode* ParentPtr(item.GetItem()->GetParent()); - - - if (ParentPtr != NULL) // the parent pointer is only null if the passed item is the root - { - // find the current item in the parent's list; the next sibling has an index that is one higher than the one of the current item: - int NextItemIndex(ParentPtr->Index(item.GetItem())+1); // variable definition and initialization - - if (NextItemIndex < ParentPtr->GetNodeCount()) - return ParentPtr->GetNode(NextItemIndex); - else - return wxTreeMultiItem(); - } /* if */ - else - return wxTreeMultiItem(); -} /* wxTreeMultiCtrl::GetNextSibling(wxTreeMultiItem const&) const */ - -wxTreeMultiItem wxTreeMultiCtrl::GetPrevSibling(wxTreeMultiItem const& item) const -{ - // check if a valid item has been passed: - if (!(item.IsOk())) - return wxTreeMultiItem(); - - TreeMultiItemNode* ParentPtr(item.GetItem()->GetParent()); - - - if (ParentPtr != NULL) - { - // find the current item in the parent's list; the next sibling has an index that is one higher than the one of the current item: - int PrevItemIndex(ParentPtr->Index(item.GetItem())-1); // variable definition and initialization - - if (PrevItemIndex >= 0) - return ParentPtr->GetNode(PrevItemIndex); - else - return wxTreeMultiItem(); - } /* if */ - else - return wxTreeMultiItem(); -} /* wxTreeMultiCtrl::GetPrevSibling(wxTreeMultiItem const&) const */ - -wxTreeMultiItem wxTreeMultiCtrl::GetNext(wxTreeMultiItem const& item) const -{ - // check if a valid item has been passed: - if (!(item.IsOk())) - return wxTreeMultiItem(); - - TreeMultiItemNode* NodePtr(item.GetItem()->IsTreeMultiItemNode()); // variable definition and initialization - - if ((NodePtr != NULL) && (NodePtr->GetNodeCount() > 0)) - return wxTreeMultiItem(NodePtr->First()); - else - { - // variable definitions and initializations: - wxTreeMultiItem Parent(item); - wxTreeMultiItem Sibling; - - do - { - Sibling = this->GetNextSibling(Parent); // try to find next sibling - Parent = this->GetParent(Parent); // get next ancestor - } while (!(Sibling.IsOk()) && Parent.IsOk()); - // in case the loop ended with Sibling.IsOk() "Sibling" contains a valid sibling otherwise an invalid - return Sibling; - } /* if */ -} /* wxTreeMultiCtrl::GetNextSibling(wxTreeMultiItem const&) const */ - -wxTreeMultiItem wxTreeMultiCtrl::GetPrevious(wxTreeMultiItem const& item) const -{ - // check if a valid item has been passed: - if (!(item.IsOk())) - return wxTreeMultiItem(); - - TreeMultiItemNode* NodePtr(item.GetItem()->IsTreeMultiItemNode()); // variable definition and initialization - - if ((NodePtr != NULL) && (NodePtr->GetNodeCount() > 0)) - return wxTreeMultiItem(NodePtr->Last()); - else - { - // variable definitions and initializations: - wxTreeMultiItem Parent(item); - wxTreeMultiItem Sibling; - - do - { - Sibling = this->GetPrevSibling(Parent); // try to find next sibling - Parent = this->GetParent(Parent); // get next ancestor - } while (!(Sibling.IsOk()) && Parent.IsOk()); - // in case the loop ended with Sibling.IsOk() "Sibling" contains a valid sibling otherwise an invalid - return Sibling; - } /* if */ -} /* wxTreeMultiCtrl::GetPrevious(wxTreeMultiItem const&) const */ - -// WDR: handler implementations for wxTreeMultiCtrl - -void wxTreeMultiCtrl::OnDraw(wxDC& dc) -{ - // go recursive and draw the whole visible tree. - dc.SetFont(_captionFont); - for(int i = 0; i < _root.GetNodeCount(); i++) - DrawNode(_root.GetNode(i), dc); -} /* */ +//--------------------------------------------------------------------------- +// $RCSfile: wxTreeMultiCtrl.cpp,v $ +// $Source: /cvs/creatis/bbtk/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.cpp,v $ +// $Revision: 1.2 $ +// $Date: 2009/10/05 22:44:50 $ +//--------------------------------------------------------------------------- +// Author: Jorgen Bodde +// Copyright: (c) Jorgen Bodde +// License: wxWidgets License +//--------------------------------------------------------------------------- + +#ifdef __GNUG__ + #pragma implementation "wxTreeMultiCtrl.h" +#endif + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" +#include "wx/treebase.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/arrimpl.cpp" + +#include "wx/treemultictrl/wxTreeMultiCtrl.h" +#include "wx/treemultictrl/wxTreeMultiEvent.h" +#include "tmcimages.h" + + + +//---------------------------------------------------------------------------- +// wxTreeMultiItem +//---------------------------------------------------------------------------- + +WX_DEFINE_OBJARRAY(wxArrayTreeMultiItem); + +//---------------------------------------------------------------------------- +// wxTreeMultiCtrl +//---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxTreeMultiCtrl, wxScrolledWindow) + +// WDR: event table for wxTreeMultiCtrl +BEGIN_EVENT_TABLE(wxTreeMultiCtrl, wxScrolledWindow) + EVT_LEFT_DOWN (wxTreeMultiCtrl::OnMouseClick) + EVT_LEFT_DCLICK(wxTreeMultiCtrl::OnMouseClick) + EVT_RIGHT_DOWN (wxTreeMultiCtrl::OnRightMouseClick) + EVT_PAINT(wxTreeMultiCtrl::OnPaint) + EVT_SIZE(wxTreeMultiCtrl::OnSize) +// EVT_KEY_UP(wxTreeMultiCtrl::OnKey) +END_EVENT_TABLE() + +bool wxTreeMultiCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, + const wxSize& size, long style, const wxValidator & WXUNUSED(validator), + const wxString& name ) +{ + wxScrolledWindow::Create( parent, id, pos, size, style | wxTAB_TRAVERSAL, name); + + _create_called = true; + + // do the init + Init(); + + return TRUE; +} + +void wxTreeMultiCtrl::Init() +{ + _root.Clear(); + + _expandBmp = 0; + _collBmp = 0; + +#if(CHECKBOXVIEW) + _checkBmp = 0; + _uncheckBmp = 0; + _tristateBmp = 0; + + _checkHeight = 11; + _checkWidth = 11; + + _checkboxView = false; +#endif + + _gutterWidth = WXTMC_GUTTER_DEFAULT; + _iconWidth = 11; + _iconHeight = 11; + _maxHeight = 1;; + _iconDeltaY = 2; + _spacingY = WXTMC_YSPACING_DEFAULT; + _captionHeight = 13; + + // create two bitmap nodes for drawing + + _expandBmp = new wxBitmap(expand_xpm); + _collBmp = new wxBitmap(collapse_xpm); + + // calculate average font height for bitmap centering + + _iconWidth = _expandBmp->GetWidth(); + _iconHeight = _expandBmp->GetHeight(); + +#if(CHECKBOXVIEW) + // create bitmaps for checkboxes + _checkBmp = new wxBitmap(checked_icon); + _uncheckBmp = new wxBitmap(unchecked_icon); + _tristateBmp = new wxBitmap(tristate_icon); + + // adjust the height if the checkboxes are higher + // so that everything is alligned properly + _checkHeight = _checkBmp->GetHeight(); + _checkWidth = _checkBmp->GetWidth(); +#endif + + // remember the highest of the two bitmaps so there is + // always enough room + _maxHeight = _iconHeight; + +#if(CHECKBOXVIEW) + if(_maxHeight < _checkHeight) + _maxHeight = _checkHeight; +#endif + + // set standard highlighting brush + this->m_HilightBrush = new wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT),wxSOLID); + + // set standard DC font + _captionFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + + // adjust bitmap icon y position so they are centered + AdjustIconsDeltaY(); + + // set virtual size to this window size + if (_create_called) { + wxSize wndsize = GetSize(); + SetVirtualSize(wndsize.GetWidth(), wndsize.GetWidth()); + } +} + +void wxTreeMultiCtrl::SetCaptionFont(const wxFont &font) +{ + _captionFont = font; + + // adjust the icons so that they are in the middle + AdjustIconsDeltaY(); + + RedrawFromNode(0); +}; + +void wxTreeMultiCtrl::AdjustIconsDeltaY() +{ + int x = 0, y = 0; + + if(_captionFont.Ok()) + GetTextExtent(wxT("jG"), &x, &y, 0, 0, &_captionFont); + _captionHeight = y; + + if(_maxHeight < _captionHeight) + _maxHeight = _captionHeight; + + // determine the center pos for the [+] + _iconDeltaY = abs(_maxHeight - _iconHeight) / 2 + 1; + if(_iconDeltaY < 1) + _iconDeltaY = 1; + +#if(CHECKBOXVIEW) + // determine the center pos for the checkbox + _checkDeltaY = abs(_maxHeight - _checkHeight) / 2 + 1; + if(_checkDeltaY < 1) + _checkDeltaY = 1; +#endif +} + +wxTreeMultiCtrl::~wxTreeMultiCtrl() +{ + // delete the bitmap resources + delete _expandBmp; + delete _collBmp; + +#if(CHECKBOXVIEW) + delete _checkBmp; + delete _uncheckBmp; + delete _tristateBmp; +#endif +} + +wxTreeMultiItem wxTreeMultiCtrl::AddRoot(const wxString &caption, const wxString &name) +{ + wxTreeMultiItem result((TreeMultiItemBase *)&_root); + result = AppendNode(result, caption, name); + + return result; +} + +wxTreeMultiItem wxTreeMultiCtrl::AppendWindow(const wxTreeMultiItem &ParentItem, wxWindow *window, const wxString &name, const wxTreeMultiWindowInfo &info, int flags) +{ + // add window only if the parent item is valid and... + wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); + + TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes + + // ... is a node + wxCHECK(parent != NULL, wxTreeMultiItem(0)); + + // now, append node to the tree control: + wxTreeMultiItem NewWindowItem(this->InsertWindow(parent,wx_static_cast(size_t,parent->GetNodeCount()),window,name,info,flags)); + // redraw the stucture: + this->RedrawFromNode(parent); + // return the new window + return NewWindowItem; +} + +wxTreeMultiItem wxTreeMultiCtrl::InsertWindow(wxTreeMultiItem const& ParentItem, size_t Position, wxWindow *window, wxString const& name, wxTreeMultiWindowInfo const& info, int flags) +{ + // add window only if the parent item is valid and... + wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); + + TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes + + // ... is a node + wxCHECK(parent != NULL, wxTreeMultiItem(0)); + + // now, append node to the tree control: + wxTreeMultiItem NewWindowItem(this->InsertWindow(parent,Position,window,name,info,flags)); + // redraw the stucture: + this->RedrawFromNode(parent); + // return the new window + return NewWindowItem; +} /* wxTreeMultiCtrl::InsertWindow(wxTreeMultiItem const&, size_t, wxWindow*, wxString const&, wxTreeMultiWindowInfo const&, int) */ + +wxTreeMultiItem wxTreeMultiCtrl::PrependWindow(wxTreeMultiItem const& ParentItem, wxWindow *window, const wxString &name, wxTreeMultiWindowInfo const& info, int flags) +{ + // add window only if the parent item is valid and... + wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); + + TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes + + // ... is a node + wxCHECK(parent != NULL, wxTreeMultiItem(0)); + + // now, append node to the tree control: + wxTreeMultiItem NewWindowItem(this->InsertWindow(parent,0,window,name,info,flags)); + // redraw the stucture: + this->RedrawFromNode(parent); + // return the new window + return NewWindowItem; +} /* wxTreeMultiCtrl::PrependWindow(wxTreeMultiItem const&, wxWindow*, const wxString &, wxTreeMultiWindowInfo const&, int) */ + +wxTreeMultiItem wxTreeMultiCtrl::AppendNode(wxTreeMultiItem const& ParentItem, const wxString &caption, const wxString &name) +{ + // add window only if the parent item is valid and... + wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); + + TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes + + // ... is a node + wxCHECK(parent != NULL, wxTreeMultiItem(0)); + + // now, append node to the tree control: + wxTreeMultiItem NewNodeItem(this->InsertNode(parent,wx_static_cast(size_t,parent->GetNodeCount()),caption,name)); + // redraw the structure: + this->RedrawFromNode(parent); + // return the new node: + return NewNodeItem; +} /* wxTreeMultiCtrl::AppendNode(wxTreeMultiItem const&, const wxString &, const wxString&) */ + +wxTreeMultiItem wxTreeMultiCtrl::InsertNode(wxTreeMultiItem const& ParentItem, size_t Position, wxString const& caption, wxString const& name) +{ + // add window only if the parent item is valid and... + wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); + + TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes + + // ... is a node + wxCHECK(parent != NULL, wxTreeMultiItem(0)); + + // now, append node to the tree control: + wxTreeMultiItem NewNodeItem(this->InsertNode(parent,Position,caption,name)); + // redraw the structure: + this->RedrawFromNode(parent); + // return the new node: + return NewNodeItem; +} /* wxTreeMultiCtrl::InsertNode(wxTreeMultiItem const&, size_t, wxString const&, wxString const&) */ + +wxTreeMultiItem wxTreeMultiCtrl::PrependNode(wxTreeMultiItem const& ParentItem, wxString const& caption, wxString const& name) +{ + // add window only if the parent item is valid and... + wxCHECK(ParentItem.IsOk(), wxTreeMultiItem(0)); + + TreeMultiItemNode* parent = ParentItem.GetItem()->IsTreeMultiItemNode(); // also roots are nodes + + // ... is a node + wxCHECK(parent != NULL, wxTreeMultiItem(0)); + + // now, append node to the tree control: + wxTreeMultiItem NewNodeItem(this->InsertNode(parent,0,caption,name)); + // redraw the structure: + this->RedrawFromNode(parent); + // return the new node: + return NewNodeItem; +} /* wxTreeMultiCtrl::PrependNode(wxTreeMultiItem const&, wxString const&, wxString const&) */ + +bool wxTreeMultiCtrl::Delete(wxTreeMultiItem &item) +{ + bool redraw = true; + wxCHECK(item.IsOk(), false); + + wxTreeMultiItem nullItem(0); + + + // if item has been selected, remove it from the selected list: + size_t ItemIndex(this->GetSelectedItemIndex(item)); + + if (ItemIndex != this->GetSelectedItemCount()) + this->m_SelectedItems.RemoveAt(ItemIndex); + + // get parent, to delete item from + TreeMultiItemNode *p = item.GetItem()->GetParent(); + + // first check if it was visible, if so from the parent off + // it needs redrawing + redraw = item.GetItem()->IsVisible(); + if(p) + p->DeleteNode(item.GetItem()); + else + _root.DeleteNode(item.GetItem()); + + item = nullItem; + + // do redraw when node was visible + if(redraw) + RedrawFromNode(p); + + return true; +} + +void wxTreeMultiCtrl::DeleteChildren(const wxTreeMultiItem &item) +{ + if(item.IsNodeItem()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); + + // remove all children from the selected item list: + if (n->GetNodeCount() > 0) + { + // variable definitions and initializations: + int Cookie; + wxTreeMultiItem FirstItemIterator(this->GetFirstChild(item,Cookie)), LastItemIterator(this->GetLastChild(item)); + + for (;;) + { + size_t ItemIndex(this->GetSelectedItemIndex(item)); // variable definition and initialization + + if (ItemIndex != this->GetSelectedItemCount()) + this->m_SelectedItems.RemoveAt(ItemIndex); + if (FirstItemIterator == LastItemIterator) + break; // all children checked + else + FirstItemIterator = this->GetNext(FirstItemIterator); + } /* for */ + } /* if */ + // delete children: + n->Clear(); + // redraw: + RedrawFromNode(n); + } +} + +void wxTreeMultiCtrl::Expand(const wxTreeMultiItem &item, bool recursive) +{ + if(item.IsOk()) + { + TreeMultiItemNode *n = item.GetItem()->IsTreeMultiItemNode(); + if(!n) + n = item.GetItem()->GetParent(); + DoFold(n, true, recursive); + RedrawFromNode(item.GetItem()->IsTreeMultiItemNode()); + } +} + +void wxTreeMultiCtrl::Collapse(const wxTreeMultiItem &item, bool recursive) +{ + if(item.IsOk()) + { + TreeMultiItemNode *n = item.GetItem()->IsTreeMultiItemNode(); + if(!n) + n = item.GetItem()->GetParent(); + DoFold(n, false, recursive); + RedrawFromNode(item.GetItem()->IsTreeMultiItemNode()); + } +} + + +void wxTreeMultiCtrl::ExpandNodes(bool recursive) +{ + // go through all children and call DoFold recursively + for(int i = 0; i < _root.GetNodeCount(); i++) + DoFold(_root.GetNode(i), true, recursive); + RedrawFromNode(0); +} + +void wxTreeMultiCtrl::CollapseNodes(bool recursive) +{ + // go through all children and call DoFold recursively + for(int i = 0; i < _root.GetNodeCount(); i++) + DoFold(_root.GetNode(i), false, recursive); + RedrawFromNode(0); +} + +void wxTreeMultiCtrl::CollapseAndReset(const wxTreeMultiItem &item) +{ + if(item.IsNodeItem()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); + + // delete all kids + n->Clear(); + Collapse(item, false); + } +} + +// Selection manipulation +wxTreeMultiItem wxTreeMultiCtrl::GetFirstSelectedItem(void) const +{ + if (this->GetSelectedItemCount() > 0) + return this->m_SelectedItems[0]; + else + return wxTreeMultiItem(); +} /* wxTreeMultiCtrl::GetFirstSelectedItem(void) const */ + +wxTreeMultiItem wxTreeMultiCtrl::GetLastSelectedItem(void) const +{ + if (this->GetSelectedItemCount() > 0) + return this->m_SelectedItems[this->GetSelectedItemCount()-1]; + else + return wxTreeMultiItem(); +} /* wxTreeMultiCtrl::GetLastSelectedItem(void) const */ + +wxTreeMultiItem wxTreeMultiCtrl::GetSelectedItem(size_t Index) const +{ + if (Index < this->GetSelectedItemCount()) + return this->m_SelectedItems[Index]; + else + return wxTreeMultiItem(); +} /* wxTreeMultiCtrl::GetSelectedItem(size_t Index) const */ + +size_t wxTreeMultiCtrl::GetSelectedItemIndex(wxTreeMultiItem const& Item) const +{ + // attention: the function wxArray::Index() can NOT be used in a save manner as it only checks the address of an item + // element but it is not guaranteed that Item may not be a copy of the originally inserted item + const size_t NoOfSelectedItems = this->GetSelectedItemCount(); + + size_t Index(0); + + + while ((Index < NoOfSelectedItems) && (this->m_SelectedItems[Index] != Item)) + ++Index; + return Index; +} /* wxTreeMultiCtrl::GetSelectedItemIndex(wxTreeMultiItem const&) const */ + +void wxTreeMultiCtrl::SelectItem(wxTreeMultiItem const& Item, bool UnselectOthers, bool ExpandSelection) +{ + TreeMultiItemNode* NodePtr(Item.GetItem()->IsTreeMultiItemNode()); + + + // only nodes can be selected and they can only be selected if they are not already selected: + if ((NodePtr == NULL) || NodePtr->IsSelected()) + return; + + // inform that we are about to change: + wxTreeMultiEvent Event(wxEVT_COMMAND_TREE_MULTI_SEL_CHANGING,Item); // variable definition and initialization + + if (this->m_SelectedItems.GetCount() > 0) // the last item in the array is always the latest inserted item + Event.SetOldItem(this->m_SelectedItems.Last()); + Event.SetEventObject(this); + if (this->GetEventHandler()->ProcessEvent(Event) && !(Event.IsAllowed())) + return; // vetoed + + // make sure that the to be selected item can be seen: + this->Include(Item); + + // variable definition and initialization: + wxTreeMultiItem ExcludedParent(this->GetExcludedParent(Item)); + + while (ExcludedParent.IsOk()) + { + this->Include(ExcludedParent); + ExcludedParent = this->GetExcludedParent(Item); + } /* while */ + + // unselect items if necessary: + if (UnselectOthers) + this->UnselectAll(); + // expand selection if necessary: + if (ExpandSelection) + { + // variable definition: + wxTreeMultiItem FirstItemIterator, LastItemIterator; + wxTreeMultiItem LastSelectedItem; + + // determine the last selected item or the first item in case nothing has been selected before: + if (this->m_SelectedItems.GetCount() > 0) + LastSelectedItem = this->m_SelectedItems.Last(); + else + LastSelectedItem = this->GetFirstRoot(); + // determine the item from which to start and the one with which to end the selection: + if (Item.GetItem()->GetY() > LastSelectedItem.GetItem()->GetY()) + { + FirstItemIterator = LastSelectedItem; + LastItemIterator = Item; + } /* if */ + else + { + FirstItemIterator = Item; + LastItemIterator = LastSelectedItem; + } /* if */ + // select all items that are a node and are placed between the two limiting iterators (included the limits): + for (;;) + { + if (!(FirstItemIterator.IsSelected()) && FirstItemIterator.IsNodeItem()) + { + FirstItemIterator.GetItem()->Select(); + this->m_SelectedItems.Add(FirstItemIterator); + this->RefreshRect(wxRect(FirstItemIterator.GetItem()->GetX(), FirstItemIterator.GetItem()->GetY(), + FirstItemIterator.GetItem()->GetWidth(),FirstItemIterator.GetItem()->GetHeight())); + } /* if */ + if (FirstItemIterator == LastItemIterator) + break; // done + // continue iterating: + FirstItemIterator = this->GetNext(FirstItemIterator); + } /* for */ + } /* if */ + else // select passed item only + { + NodePtr->Select(); + this->m_SelectedItems.Add(NodePtr); + this->RefreshRect(wxRect(NodePtr->GetX(),NodePtr->GetY(),NodePtr->GetWidth(),NodePtr->GetHeight())); + } /* if */ + + // inform that we have selected the item: + Event.SetEventType(wxEVT_COMMAND_TREE_MULTI_SEL_CHANGED); + this->GetEventHandler()->ProcessEvent(Event); +} /* wxTreeMultiCtrl::SelectItem(wxTreeMultiItem const&, bool, bool) */ + +void wxTreeMultiCtrl::UnselectAll(void) +{ + const size_t NoOfSelectedItems = this->m_SelectedItems.GetCount(); + + + for (size_t i=0; iRefreshRect(wxRect(this->m_SelectedItems[i].GetItem()->GetX(), this->m_SelectedItems[i].GetItem()->GetY(), + this->m_SelectedItems[i].GetItem()->GetWidth(),this->m_SelectedItems[i].GetItem()->GetHeight())); + this->m_SelectedItems[i].GetItem()->Unselect(); + } /* for */ + this->m_SelectedItems.Clear(); +} /* wxTreeMultiCtrl::UnselectAll(void) */ + +void wxTreeMultiCtrl::Unselect(wxTreeMultiItem const& Item) +{ + size_t ItemIndex(this->GetSelectedItemIndex(Item)); + + + if (ItemIndex != this->GetSelectedItemCount()) + { + Item.GetItem()->Unselect(); + this->m_SelectedItems.RemoveAt(ItemIndex); + this->RefreshRect(wxRect(Item.GetItem()->GetX(),Item.GetItem()->GetY(),Item.GetItem()->GetWidth(),Item.GetItem()->GetHeight())); + } /* if */ +} /* wxTreeMultiCtrl::Unselect(wxTreeMultiItem const&) */ + +void wxTreeMultiCtrl::DoFold(TreeMultiItemBase *item, bool expand, bool recursive) +{ + + // go through all node objects on this level, and expand or + // collapse them + + if(item == 0) + return; + + // if this is a node, use it to go through all the subnodes (if needed) + // if not, then just exit. + + TreeMultiItemNode *node = item->IsTreeMultiItemNode(); + if(node) + { + node->Fold(expand); + + // go recursive + if(recursive) + { + TreeMultiItemNode *p; + for(int i = 0; i < node->GetNodeCount(); i++) + { + // get node, and if a real node, then call fold + p = node->GetNode(i)->IsTreeMultiItemNode(); + if(p) + p->Fold(expand); + + // go recursive for every node + DoFold(p, expand, recursive); + } + } + } +} + +void wxTreeMultiCtrl::Exclude(const wxTreeMultiItem &item) +{ + wxCHECK2(item.IsOk(), return); + + // exclude the item, and refresh + // if already excluded, skip + + if(!item.GetItem()->IsExcluded()) + { + item.GetItem()->SetExcluded(true); + RedrawFromParentNode(item.GetItem()); + } +} + +void wxTreeMultiCtrl::Include(const wxTreeMultiItem &item) +{ + wxCHECK2(item.IsOk(), return); + + // include the item, and refresh. If not + // excluded, do nothing + + if(item.GetItem()->IsExcluded()) + { + item.GetItem()->SetExcluded(false); + RedrawFromParentNode(item.GetItem()); + } +} + +wxTreeMultiItem wxTreeMultiCtrl::GetExcludedParent(const wxTreeMultiItem &item) +{ + wxCHECK(item.IsOk(), wxTreeMultiItem(0)); + + // go find the parent (including this one) that + // can be the excluded one + + TreeMultiItemNode *n = item.GetItem()->IsTreeMultiItemNode(); + if(n && n->IsExcluded()) + return wxTreeMultiItem(n); + + n = item.GetItem()->GetParent(); + while(n) + { + if(n->IsExcluded()) + return wxTreeMultiItem(n); + else + n = n->GetParent(); + } + + return wxTreeMultiItem(0); +} + +void wxTreeMultiCtrl::OnSize(wxSizeEvent &WXUNUSED(event)) +{ + RecalculateSpanSizes(); +} + +void wxTreeMultiCtrl::OnPaint(wxPaintEvent& WXUNUSED(event) ) +{ + wxPaintDC dc(this); + + PrepareDC(dc); + + // go recursive and draw the whole visible tree. + dc.SetFont(_captionFont); + for(int i = 0; i < _root.GetNodeCount(); i++) + DrawNode(_root.GetNode(i), dc); +} + +void wxTreeMultiCtrl::DrawNode(TreeMultiItemBase *b, wxDC &dc) +{ + // go through this item .. if it is a node, draw + // the caption, else reposition the window. + + if(!b) + return; + + // forget it if this node is not visible + if(b->IsVisible()) + { + int bmpOffsetX = b->GetX() - (_gutterWidth + _iconWidth); + +#if(CHECKBOXVIEW) + // now draw the checkbox if there is any, in the proper state + if(b->GetCheckbox()) + { + DrawCheckbox(b, dc); + + // adjust the bmpOffset because we also have a checkbox + bmpOffsetX -= _checkWidth; + } +#endif + + if(b->IsTreeMultiItemNode()) + { + // draw the node icon and the caption + TreeMultiItemNode *n = (TreeMultiItemNode *)b; + + // set background of caption item + if (n->IsSelected()) + { + dc.SetBrush(*(this->m_HilightBrush)); + dc.SetPen(wxPen(this->m_HilightBrush->GetColour(),1,wxSOLID)); + } /* if */ + else + { + dc.SetBrush(wxBrush(*wxWHITE,wxSOLID)); + dc.SetPen(wxPen(*wxWHITE,1,wxSOLID)); + } /* if */ + dc.DrawRectangle(n->GetX(),n->GetY(),n->GetWidth(),n->GetHeight()); + // draw caption + dc.DrawText(n->GetCaption(), n->GetX(), n->GetY()); + + // draw the bitmap for the state + if(n->IsExpanded()) + dc.DrawBitmap(*_expandBmp, bmpOffsetX, n->GetY() + _iconDeltaY, true); + else + dc.DrawBitmap(*_collBmp, bmpOffsetX, n->GetY() + _iconDeltaY, true); + + // now go through all the subnodes + for(int i = 0; i < n->GetNodeCount(); i++) + DrawNode(n->GetNode(i), dc); + + } + } +} + +#if(CHECKBOXVIEW) + +void wxTreeMultiCtrl::DrawCheckbox(TreeMultiItemBase *b, wxDC &dc, bool convertScrolled) +{ + wxCHECK2(b, return); + + wxBitmap *bmp; + int bmpOffsetX = b->GetX() - (_gutterWidth + _iconWidth); + + switch(b->GetCheckboxState()) + { + case 0: + bmp = _uncheckBmp; + break; + case 1: + bmp = _checkBmp; + break; + default: + bmp = _tristateBmp; + break; + } + + int x, xx, y, yy; + + if(b->IsTreeMultiItemWindow()) + { + xx = x = bmpOffsetX - ((TreeMultiItemWindow *)b)->GetFrontSpacing() + _checkWidth; + yy = y = b->GetY() + _checkDeltaY; + } + else + { + xx = x = bmpOffsetX; + yy = y = b->GetY() + _checkDeltaY; + } + + if(convertScrolled) + CalcScrolledPosition(x, y, &xx, &yy); + + dc.DrawBitmap(*bmp, xx, yy, true); +} + +#endif // #if(CHECKBOXVIEW) + +void wxTreeMultiCtrl::OnKey(wxKeyEvent &event) +{ + // check if we need to traverse to upper or lower + // control in the list + if(event.GetKeyCode() == WXK_TAB) + { + wxTreeMultiItem item = GetFocus(); + if(item.IsOk()) + { + // traverse down direction + if(!event.ShiftDown()) + item = FindNextVisibleWindowItem(item.GetItem()); + //else // traverse in up direction + // item = FindPreviousVisibleWindowItem(item); + + if(item.IsOk()) + { + TreeMultiItemWindow *w = item.GetItem()->IsTreeMultiItemWindow(); + if(w) + { + wxWindow *wnd = w->GetWindow(); + wnd->SetFocus(); + } + } + } + } + else + event.Skip(); +} + +void wxTreeMultiCtrl::OnMouseClick( wxMouseEvent &event ) +{ + // react on double click and left mouse down + if(event.LeftDown() || event.LeftDClick()) + { + // get translation point + wxPoint pt( event.GetPosition() ); + + int x = 0, y = 0; + CalcUnscrolledPosition( pt.x, pt.y, &x, &y ); + + // go check if we clicked a treenode + int flags; + wxPoint p(x,y); + wxTreeMultiItem id = HitTest(p, flags); + +#if(CHECKBOXVIEW) + if(flags == wxTMC_HITTEST_CHECKBOX) + { + // toggle the checkbox, and redraw + if(id.IsOk()) + { + TreeMultiItemBase *b = id.GetItem(); + b->SetCheckboxState((b->GetCheckboxState()+1) & 0x1); + + TreeMultiItemWindow *w = b->IsTreeMultiItemWindow(); + if(w) + { + // try to force a focus on the window. This could + // be extended by searching for the first edit control + // class but for now, just a focus is tried. + w->GetWindow()->Enable(b->GetCheckboxState() == 1); + w->GetWindow()->SetFocus(); + + // draw the checkbox in the state needed + wxClientDC dc(this); + DrawCheckbox(b, dc, true); + + // TODO: determine if the upper parents should be + // tristated or not + + ScanTristateCheckstates(b); + + } + else if(b->IsTreeMultiItemNode()) + { + // descend to all the children and set the state of the parent + SetRecursiveCheckState((TreeMultiItemNode *)b, b->GetCheckboxState() == 1); + RedrawFromNode((TreeMultiItemNode *)b); + } + } + } + else +#endif // #if(CHECKBOXVIEW) + { + // react on left mouse button, to fold and on + // right for caption doubleclick + int area = -1; + +// adjust behaviour for Linux (single click = always fold) +#ifndef LINUX + if(event.LeftDClick()) + area = wxTMC_HITTEST_CAPTION; + else + area = wxTMC_HITTEST_GUTTER; +#else + area = flags; +#endif + +// Linux (single or double click -> always fold + if (id.IsOk()) + { +#ifdef LINUX + // we have a valid item, if it is a node, then fold + TreeMultiItemNode *n = id.GetItem()->IsTreeMultiItemNode(); + if(n) + { + this->SelectItem(id); + Fold(n, !n->IsExpanded()); + } /* if */ +#else + if (event.LeftDown()) + if (flags == wxTMC_HITTEST_GUTTER) + { + TreeMultiItemNode *n = id.GetItem()->IsTreeMultiItemNode(); // for some reasons also windows may have set the flag + + if (n != NULL) + Fold(n, !n->IsExpanded()); + } /* if */ + else if (flags == wxTMC_HITTEST_CAPTION) + { + TreeMultiItemNode *n = id.GetItem()->IsTreeMultiItemNode(); // for some reasons also windows may have set the flag + + if (n != NULL) + { + this->SelectItem(id); + this->RedrawFromNode(n); + } /* if */ + } /* if */ +#endif + } /* if */ + else + this->UnselectAll(); + } + } +} + +void wxTreeMultiCtrl::OnRightMouseClick(wxMouseEvent& Event) +{ + if (Event.RightDown()) + if (Event.Dragging()) + this->UnselectAll(); + else + { + // variable definitions: + int Flags; + wxPoint Point; + + // translate mouse coordinates: + CalcUnscrolledPosition(Event.GetPosition().x,Event.GetPosition().y,&(Point.x),&(Point.y)); + // check if the mouse is above the caption of an item: + wxTreeMultiItem Item(this->HitTest(Point,Flags)); // variable definition and initialization + + if (Item.IsOk() && (Flags == wxTMC_HITTEST_CAPTION)) + { + this->SelectItem(Item); + this->RedrawFromNode(Item.GetItem()->IsTreeMultiItemNode()); + Event.Skip(); // window will convert right mouse click to a context menu event or proceed with + // a right mouse click event if the context menu event cannot be processed + } /* if */ + else + this->UnselectAll(); + } /* if */ + else + this->UnselectAll(); +} /* wxTreeMultiCtrl::OnRightMouseClick(wxMouseEvent&) */ + +wxTreeMultiItem wxTreeMultiCtrl::HitTest(wxPoint const& pt, int &flags) +{ + // scan all nodes to see which one matches + TreeMultiItemBase *b = 0; + for(int i = 0; i < _root.GetNodeCount() && !b; i++) + b = FindNodeByPoint(_root.GetNode(i), pt, flags); + + if(!b) + { + // none found, reset + flags = 0; + return wxTreeMultiItem(0); + } + + // return an item + return wxTreeMultiItem(b); +} + +TreeMultiItemBase *wxTreeMultiCtrl::FindNodeByPoint(TreeMultiItemBase *b, wxPoint const& pt, int &area) +{ + wxCHECK(b, 0); + + // if this layer is not visible, return with nothing. + if(!b->IsVisible()) + return 0; + + area = 0; + + // now see if our y is matching the mouse + if(pt.y >= b->GetY() && pt.y < (b->GetY() + b->GetHeight())) + { +#if(CHECKBOXVIEW) + // if we are checkboxed, calculate the checkbox position + if(b->GetCheckbox()) + { + int extraSpacing = 0, extraWidth = 0; + + // now for a windows item, this is minus the gutter. For a normal node it is X minus checkbox + if(b->IsTreeMultiItemWindow()) + { + extraWidth = _checkWidth; + extraSpacing = ((TreeMultiItemWindow *)b)->GetFrontSpacing(); + } + else + extraSpacing = 4; + + if(pt.x > (b->GetX() - extraSpacing - _checkWidth) && pt.x < (b->GetX() - extraSpacing + extraWidth)) + { + area = wxTMC_HITTEST_CHECKBOX; + return b; + } + } +#endif + + // allrighty we have something, now where and what is it (look with x) + if(pt.x < b->GetX()) + area = wxTMC_HITTEST_GUTTER; + + /** \todo Match only the real part of the caption, window (we assume x > GetX() which is the rest) + HOWEVER the window probably doesn't propagate the click event back to the parent, so we might + leave it like this so the use can click behind a window so it will be selected. + */ + else + { + // inside area, return proper flag + if(b->IsTreeMultiItemNode()) + area = wxTMC_HITTEST_CAPTION; + else + area = wxTMC_HITTEST_WINDOW; + } + + return b; + } + else + { + // not found, let's try our children if we have some + TreeMultiItemNode *n = b->IsTreeMultiItemNode(); + if(n) + { + TreeMultiItemBase *bb = 0; + for(int i = 0; i < n->GetNodeCount() && !bb; i++) + bb = FindNodeByPoint(n->GetNode(i), pt, area); + + // keep returning result to caller + return bb; + } + } + + return 0; +} + +wxTreeMultiItem wxTreeMultiCtrl::GetFocus() +{ + wxWindow *wnd = wxWindow::FindFocus(); + + // now find window that holds this item. if not + // visible it cannot have focus (should not have) + + wxTreeMultiItem item = FindWindowNode(wnd); + if(item.IsOk() && item.GetItem()->IsVisible()) + return item; + + return wxTreeMultiItem(0); +} + +#if(CHECKBOXVIEW) + +void wxTreeMultiCtrl::SetRecursiveCheckState(TreeMultiItemNode *n, bool check) +{ + int state = 0; + if(check) + state++; + + // go check all kids on this level + for(int i = 0; i < n->GetNodeCount(); i++) + { + // check all the nodes, and go deeper + n->GetNode(i)->SetCheckboxState(state); + if(n->GetNode(i)->IsTreeMultiItemNode()) + SetRecursiveCheckState((TreeMultiItemNode *)n->GetNode(i), check); + } +} + +void wxTreeMultiCtrl::ScanTristateCheckstates(TreeMultiItemBase *b) +{ + // check from the parent on, all node entries and see if they are + // checked or cleared or scattered + TreeMultiItemNode *p = b->GetParent(); + + if(p && p->GetCheckbox()) + { + bool foundcheck = false, foundclear = false; + for(size_t i = 0; i < (size_t)p->GetNodeCount(); ++i) + { + // only evaluate when checkboxed + if(p->GetNode(i)->IsTreeMultiItemWindow() && p->GetNode(i)->GetCheckbox()) + { + // record instance of a cleared checkbox + if(!p->GetNode(i)->GetCheckboxState()) + foundclear = true; + // record instance of checked checkbox + if(p->GetNode(i)->GetCheckboxState() == 1) + foundcheck = true; + } + } + + // if we have both check and clear, go tristate + // if all clear, clear parent and if all set, then set parent + if(foundclear && !foundcheck) + p->SetCheckboxState(0); + else if(!foundclear && foundcheck) + p->SetCheckboxState(1); + else if(foundclear && foundcheck) + p->SetCheckboxState(2); + + //wxClientDC dc; + //DrawCheckbox(p, dc, false); + RedrawFromNode(p); + } +} + +#endif // #if(CHECKBOXVIEW) + +wxTreeMultiItem wxTreeMultiCtrl::InsertNode(TreeMultiItemNode* ParentPtr, size_t Position, wxString const& Caption, wxString const& Name) +{ + int extX, extY; + + TreeMultiItemNode* NodePtr(new TreeMultiItemNode(ParentPtr,Caption,Name)); // generate new node pointer + + + // continue with initializing the new node: +#if(CHECKBOXVIEW) + // if checkbox view is desired, tag this item as a checkbox + // and set the state as 'false' + NodePtr->SetCheckbox(_checkboxView); + NodePtr->SetCheckboxState(0); +#endif + // calculate the height and width + this->GetTextExtent(Caption,&extX,&extY,0,0,&(this->_captionFont)); + NodePtr->SetHeight(extY); + NodePtr->SetWidth(extX); + // finally, insert node: + if (Position < (size_t)ParentPtr->GetNodeCount()) + ParentPtr->InsertNode(NodePtr,Position); + else + ParentPtr->AddNode(NodePtr); + // return the newly created node: + return wxTreeMultiItem(NodePtr); +} /* wxTreeMultiCtrl::InsertNode(TreeMultiItemNode*, size_t, wxString const&, wxString const&) */ + +wxTreeMultiItem wxTreeMultiCtrl::InsertWindow(TreeMultiItemNode* ParentPtr, size_t Position, wxWindow* WindowPtr, wxString const& Name, wxTreeMultiWindowInfo const& Info, int Flags) +{ + int WindowFlags; + + TreeMultiItemWindow* NewWindowPtr = new TreeMultiItemWindow(ParentPtr,Name); // generate new window pointer + + + // get flags from passed variable "Flags"; in case this variable does not contain any flags use the window's information flags: + if (Flags != 0) + WindowFlags = Flags; + else + WindowFlags = Info.GetFlags(); + + // continue with initializing the new window: +#if(CHECKBOXVIEW) + // if checkbox view is desired, tag this item as a checkbox + // and set the state as 'false' + NewWindowPtr->SetCheckbox(_checkboxView); +#endif + // if style wants us to change background, set it to our background + if (WindowFlags & wxTMC_BG_ADJUST_ALL) + { + // go through all children of this window, and set the + // background of it (recursively) + this->SetWindowBackgroundColour(WindowPtr,this->GetBackgroundColour(),WindowFlags); + } /* if */ + + // set the spacing: + NewWindowPtr->SetTopSpacing(Info.GetTopSpacing()); +#if(CHECKBOXVIEW) + // make sure that the checkboxes are at least indented enough + if (this->_checkboxView) + NewWindowPtr->SetFrontSpacing(Info.GetFrontSpacing() + this->_checkWidth); + else +#endif + NewWindowPtr->SetFrontSpacing(Info.GetFrontSpacing()); + // assign finally the window: + NewWindowPtr->AssignWindow(WindowPtr); + +#if(CHECKBOXVIEW) + // set the checkbox state after the window is assigned + NewWindowPtr->SetCheckboxState(Info.GetDefaultCheckState()); +#endif + + // if the window is not visible, set hide flag + this->ShowTreeMultiWindow(NewWindowPtr,NewWindowPtr->IsVisible()); + + // finally, insert the newly constructed window: + if (Position < (size_t)ParentPtr->GetNodeCount()) + ParentPtr->InsertNode(NewWindowPtr,Position); + else + ParentPtr->AddNode(NewWindowPtr); + // return the newly created window: + return wxTreeMultiItem(NewWindowPtr); +} /* wxTreeMultiCtrl::InsertWindow(TreeMultiItemNode*, size_t, wxWindow*, wxString const&, wxTreeMultiWindowInfo const&, int) */ + +void wxTreeMultiCtrl::RedrawFromParentNode(TreeMultiItemBase *n) +{ + TreeMultiItemNode *p = 0; + if(n) + p = n->GetParent(); + + RedrawFromNode(p); +} + +void wxTreeMultiCtrl::RedrawFromNode(TreeMultiItemNode *n) +{ + static int recalcMutex = 0; + bool visible = true; + + if(recalcMutex > 0) + return; + + recalcMutex ++; + + // when node is not visible or excluded + // then don't redraw. + + if(n) + visible = n->IsVisible(); + + if(visible) + { + int h, h1,w, w1; + GetVirtualSize(&w, &h); + + UpdateAllWindowVisibility(); + RecalculateNodePositions(); + RecalculateVirtualSize(); + + // why is this needed? Because folding or collapsing can change + // the state. When the virtual area gets smaller, we need to keep + // the largest one and the other way atound. And since we do not + // know here we are folding or collapsing, we remember the biggest + GetVirtualSize(&w1, &h1); + + if(h1 > h) + h = h1; + + // only refresh the part from x,y down + if(n) + { + int x, y; + CalcScrolledPosition(n->GetX(), n->GetY(), &x, &y); + if(h - y > 0) + { + wxRect rect(0, y, w, h - y); + RefreshRect(rect); + } + else + Refresh(); + } + else + Refresh(); // do a full refresh + } + + recalcMutex --; +} + +void wxTreeMultiCtrl::RecalculateNodePositions() +{ + int currentY = _spacingY; + // go recursive on every node, and store the information in the node + + for(int i = 0; i < _root.GetNodeCount(); i++) + currentY += CalculateNodeDimensions(_root.GetNode(i), currentY, 0); +} + +int wxTreeMultiCtrl::CalculateNodeDimensions(TreeMultiItemBase *b, int currentY, int level) +{ + int gutter = (_gutterWidth * 2) + _iconWidth; + int y = 0, topSpacing = 0; + + // return same if no proper object + wxCHECK(b, 0); + +#if(CHECKBOXVIEW) + if(b->GetCheckbox()) + gutter += _checkWidth; +#endif + + // if we are not visible, skip recalculation and descending + if(b->IsVisible()) + { + b->SetY(currentY); + + // if level is 0, calculate with front gutter, else without + y = currentY + b->GetHeight(); + if(b->IsTreeMultiItemNode()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)b; + + if(level == 0) + b->SetX(gutter); + else + b->SetX(gutter + (level * (_gutterWidth + _iconWidth))); + + // now do children of this node + + for(int i = 0; i < n->GetNodeCount(); i++) + y += CalculateNodeDimensions(n->GetNode(i), y + _spacingY, level+1); + } + else if(b->IsTreeMultiItemWindow()) + { + TreeMultiItemWindow *w = (TreeMultiItemWindow *)b; + + if(level == 0) + b->SetX(gutter + w->GetFrontSpacing()); + else + b->SetX(_gutterWidth + (level * (_gutterWidth + _iconWidth)) + w->GetFrontSpacing()); + + topSpacing = w->GetTopSpacing(); + + // reposition the window + + wxWindow *wnd = w->GetWindow(); + if(wnd) + { + int x = 0, y = 0; + CalcScrolledPosition(w->GetX(), w->GetY(), &x, &y); + wnd->SetSize(x, y, w->GetWidth(), w->GetHeight()); + } + } + + if(y > 0) + return (y - currentY) + _spacingY + topSpacing; // return delta + else + return 0; + } + + return 0; // not visible, thus we skip calculations +} + +void wxTreeMultiCtrl::RecalculateSpanSizes() +{ + for(int i = 0; i < _root.GetNodeCount(); i++) + CalculateNodeSpanning(_root.GetNode(i)); +} + +void wxTreeMultiCtrl::CalculateNodeSpanning(TreeMultiItemBase *b) +{ + // return same if no proper object + wxCHECK2(b, return); + + if(b->IsTreeMultiItemNode()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)b; + + // now do children of this node + + for(int i = 0; i < n->GetNodeCount(); i++) + CalculateNodeSpanning(n->GetNode(i)); + } + else if(b->IsTreeMultiItemWindow()) + { + TreeMultiItemWindow *w = (TreeMultiItemWindow *)b; + wxWindow *wnd = w->GetWindow(); + if(wnd) + { + // if the window is spanning, we adjust the width to the max width of the control + if(w->GetHorizontalSpan()) + { + wxSize tmcsize = GetClientSize(); + int maxwidth = tmcsize.GetWidth() - w->GetX() - 8; // extract 3 for border + + wxSizer *sz = wnd->GetSizer(); + if(sz) + { + if(maxwidth < sz->GetMinSize().GetWidth()) + maxwidth = sz->GetMinSize().GetWidth(); + } + + // prevent a size of 0 + if(maxwidth < 1) + maxwidth = 1; + + // set the size + w->SetWidth(maxwidth); + wnd->SetSize(w->GetWidth(), w->GetHeight()); + + // layout by sizer (not sure if this is needed) + if(wnd->GetSizer()) + wnd->GetSizer()->Layout(); + } + } + } +} + +void wxTreeMultiCtrl::RecalculateVirtualSize() +{ + // go through all the nodes, and store the largest x and largest y + + int x = 0, y = 0; + RecalculateVirtualSizeFromNode(&_root, x, y); + + // now adjust virtual size + SetVirtualSize(x, y); + AdjustScrollbars(x, y); +} + +void wxTreeMultiCtrl::AdjustScrollbars(int x, int y) +{ + // adjust scrollbars + // courtesy of treectrlg.cpp + + y += WXTMC_PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + x += WXTMC_PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels + int x_pos = GetScrollPos( wxHORIZONTAL ); + int y_pos = GetScrollPos( wxVERTICAL ); + SetScrollbars( WXTMC_PIXELS_PER_UNIT, WXTMC_PIXELS_PER_UNIT, x/WXTMC_PIXELS_PER_UNIT, + y/WXTMC_PIXELS_PER_UNIT, x_pos, y_pos, true ); +} + +void wxTreeMultiCtrl::RecalculateVirtualSizeFromNode(const TreeMultiItemNode *node, int &x, int &y) +{ + if(node->IsExcluded()) + return; + + // if calulate this node's dimensions + if(x < (node->GetWidth() + node->GetX())) + x = node->GetWidth() + node->GetX(); + + y = node->GetY() + node->GetHeight(); + + // if this node is collapsed, no subnodes are visible, else + // go through all subnodes as well, node needs to be included as well + if(node->IsExpanded()) + { + TreeMultiItemBase *b; + for(int i = 0; i < node->GetNodeCount(); i++) + { + b = node->GetNode(i); + + // calculate x and y + if(x < (b->GetWidth() + b->GetX())) + x = b->GetWidth() + b->GetX(); + + y = b->GetY() + b->GetHeight(); + + if(b->IsTreeMultiItemNode()) + RecalculateVirtualSizeFromNode((TreeMultiItemNode *)b, x, y); + } + } +} + +void wxTreeMultiCtrl::SetWindowBackgroundColour(wxWindow *wnd, const wxColour &col, int flags) +{ + if(wnd) + { + // if we cannot change a button, make sure all button + // classes are not changed + + wxButton *btn = wxDynamicCast(wnd, wxButton); + if(!btn || ((flags & wxTMC_BG_ADJUST_BTN) != 0)) + wnd->SetBackgroundColour(col); + + // get every window, and make the background equal to the given one + wxWindowListNode *node = wnd->GetChildren().GetFirst(); + while (node) + { + SetWindowBackgroundColour(node->GetData(), col, flags); + node = node->GetNext(); + } + } +} + +void wxTreeMultiCtrl::ShowTreeMultiWindow(TreeMultiItemWindow *window, bool show) +{ + // show or hide window + if(window && window->GetWindow()) + window->GetWindow()->Show(show); +} + +void wxTreeMultiCtrl::UpdateAllWindowVisibility() +{ + // all roots are visible, but what lies beneath ... who knows + for(int i = 0; i < _root.GetNodeCount(); i++) + UpdateTreeMultiWindowVisibility(_root.GetNode(i), true); +} + +void wxTreeMultiCtrl::UpdateTreeMultiWindowVisibility(TreeMultiItemBase *b, bool show) +{ + if(b) + { + // this is done for performance issues. IsVisible can go all + // the way up the tree to check. However if show is already + // false, there is no need to check (some higher one is collapsed) + bool showMe = show; + + if(showMe) + showMe = b->IsVisible(); + + if(b->IsTreeMultiItemWindow()) + { + // if this level must be hidden, hide + ShowTreeMultiWindow((TreeMultiItemWindow*)b, showMe); + } + else if(b->IsTreeMultiItemNode()) + { + TreeMultiItemNode *node = (TreeMultiItemNode *)b; + + // if hidden, descend and hide all windows + for(int i = 0; i < node->GetNodeCount(); i++) + UpdateTreeMultiWindowVisibility(node->GetNode(i), showMe); + } + } +} + +wxTreeMultiItem wxTreeMultiCtrl::FindItem(const wxTreeMultiItem &item, const wxString &name, bool ignoreCase, bool skipFirst) +{ + if(item.IsOk()) + { + TreeMultiItemBase *b = item.GetItem(); + + // check this item first (or not) + + if(!skipFirst) + { + if(b->GetName().IsSameAs(name, !ignoreCase)) + return wxTreeMultiItem(b); + } + + if(b->IsTreeMultiItemNode()) + { + // now check whether we are a node, then go check children + + TreeMultiItemNode *n = (TreeMultiItemNode *)b; + wxTreeMultiItem result(0); + for(int i = 0; i < n->GetNodeCount() && !result.IsOk(); i++) + result = FindItem(wxTreeMultiItem(n->GetNode(i)), name, ignoreCase, false); + + return result; + } + } + + return wxTreeMultiItem(0); +} + +wxTreeMultiItem wxTreeMultiCtrl::FindWindowNode(wxWindow *wnd, TreeMultiItemNode *n) +{ + wxCHECK(wnd, wxTreeMultiItem(0)); + + // take root node if not assigned one + + if(!n) + n = (TreeMultiItemNode *)&_root; + + // check on this level for the wxWindow pointer + + TreeMultiItemWindow *w; + wxTreeMultiItem result(0); + for(int i = 0; i < n->GetNodeCount() && !result.IsOk(); i++) + { + // if window node + w = n->GetNode(i)->IsTreeMultiItemWindow(); + if(w && w->GetWindow() == wnd) + return wxTreeMultiItem(n); + + // if node, go deeper + if(n->GetNode(i)->IsTreeMultiItemNode()) + result = FindWindowNode(wnd, (TreeMultiItemNode*)n->GetNode(i)); + } + + return result; +} + +TreeMultiItemWindow *wxTreeMultiCtrl::FindNextVisibleWindowItem(TreeMultiItemBase *b, int index) +{ + wxCHECK(b, 0); + + // check on this level, go deeper with every node we got. When a node is not + // visible anymore, skip the node. + + TreeMultiItemWindow *value = 0; + if(b->IsVisible()) + { + // if we are already searching on a node with an index + + TreeMultiItemBase *bn = 0; + TreeMultiItemNode *n = b->IsTreeMultiItemNode(); + if(n) + { + for(int i = index + 1; i < n->GetNodeCount() && !value; i++) + { + bn = n->GetNode(i); + value = bn->IsTreeMultiItemWindow(); + + // assume a node, root when not a a window + if(!value) + value = FindNextVisibleWindowItem(bn, -1); + } + + } + else + { + if(b->IsTreeMultiItemWindow()) + { + // get parent first, and locate child as ptr + TreeMultiItemNode *p = b->GetParent(); + wxCHECK(p, 0); + + // go scan the parent from the given index, if + // the index is valid else there is no child with that index + + int idx = p->Index(b); + wxCHECK(idx >= 0, 0); + + value = FindNextVisibleWindowItem(p, idx); + } + } + } + + return value; + +} + +bool wxTreeMultiCtrl::GetBooleanValue(int wndId) +{ + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK(wnd, false); + + // try a radio button + wxRadioButton *b = wxDynamicCast(wnd, wxRadioButton); + if(b) + return b->GetValue(); + + // try a check box + wxCheckBox *c = wxDynamicCast(wnd, wxCheckBox); + if(c) + return c->GetValue(); + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert or just return with false + wxCHECK(0, false); +} + +void wxTreeMultiCtrl::SetBooleanValue(int wndId, bool value) +{ + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK2(wnd, return); + + // try a radio button + wxRadioButton *b = wxDynamicCast(wnd, wxRadioButton); + if(b) + { + b->SetValue(value); + return; + } + + // try a check box + wxCheckBox *c = wxDynamicCast(wnd, wxCheckBox); + if(c) + { + c->SetValue(value); + return; + } + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert + wxCHECK2(0, return); +} + +void wxTreeMultiCtrl::SetTextValue(int wndId, const wxString &value) +{ + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK2(wnd, return); + + // try a radio button + wxTextCtrl *t = wxDynamicCast(wnd, wxTextCtrl); + if(t) + { + t->SetValue(value); + return; + } + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert + wxCHECK2(0, return); +} + +wxString wxTreeMultiCtrl::GetTextValue(int wndId) +{ + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK(wnd, wxEmptyString); + + // try a radio button + wxTextCtrl *t = wxDynamicCast(wnd, wxTextCtrl); + if(t) + return t->GetValue(); + + // try a choice box + wxChoice *c1 = wxDynamicCast(wnd, wxChoice); + if(c1) + return c1->GetStringSelection(); + + // try a combo box + wxComboBox *c2 = wxDynamicCast(wnd, wxComboBox); + if(c2) + return c2->GetStringSelection(); + + // try a listbox + wxListBox *l = wxDynamicCast(wnd, wxListBox); + if(l) + return l->GetStringSelection(); + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert or just return with string + wxCHECK(0, wxEmptyString); +} + +int wxTreeMultiCtrl::GetSelectionValue(int wndId) +{ + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK(wnd, -1); + + // try a choice box + wxChoice *c1 = wxDynamicCast(wnd, wxChoice); + if(c1) + return c1->GetSelection(); + + // try a combo box + wxComboBox *c2 = wxDynamicCast(wnd, wxComboBox); + if(c2) + return c2->GetSelection(); + + // try a listbox + wxListBox *l = wxDynamicCast(wnd, wxListBox); + if(l) + return l->GetSelection(); + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert or just return with string + wxCHECK(0, -1); +} + +void wxTreeMultiCtrl::GetSelectionValues(int wndId, wxArrayInt &sels) +{ + sels.Clear(); + + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK2(wnd, return); + + // try a listbox + wxListBox *l = wxDynamicCast(wnd, wxListBox); + if(l) + { + l->GetSelections(sels); + return; + } + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert or just return with string + wxCHECK2(0, return); +} + +void wxTreeMultiCtrl::SetSelectionValue(int wndId, int sel) +{ + wxWindow *wnd = wxWindow::FindWindow(wndId); + wxCHECK2(wnd, return); + + // try a choice box + wxChoice *c1 = wxDynamicCast(wnd, wxChoice); + if(c1) + { + c1->SetSelection(sel); + return; + } + + // try a combo box + wxComboBox *c2 = wxDynamicCast(wnd, wxComboBox); + if(c2) + { + c2->SetSelection(sel); + return; + } + + // try a listbox + wxListBox *l = wxDynamicCast(wnd, wxListBox); + if(l) + { + l->SetSelection(sel); + return; + } + + /** \todo For custom controls we should put something in wxMultiTreeItemData class + which can be overridden to retrieve the boolean value. It will also be passed + the pointer to the window, so the derived class can figure out how to get a boolean + value. + */ + + // generate assert or just return with string + wxCHECK2(0, return); +} + + +wxTreeMultiItem wxTreeMultiCtrl::GetParent(wxTreeMultiItem const& item) const +{ + // check if valid or root item has been passed, both do not have parents: + if (!(item.IsOk()) || item.GetItem()->IsTreeMultiItemRoot()) + return wxTreeMultiItem(); + else + return wxTreeMultiItem(item.GetItem()->GetParent()); // GetParent() returns a valid pointer in case of a root item!! + // therefore, the check if the passed item is a root item is necessary +} /* wxTreeMultiCtrl::GetParent(wxTreeMultiItem const& item) const */ + +wxTreeMultiItem wxTreeMultiCtrl::GetFirstChild(const wxTreeMultiItem &item, int &cookie) const +{ + if(item.IsNodeItem()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); + + if(n->GetNodeCount() > 0) + { + cookie = 0; + return wxTreeMultiItem(n->GetNode(0)); + } + } + + // no children or no valid node + cookie = -1; + return wxTreeMultiItem(0); +} + +wxTreeMultiItem wxTreeMultiCtrl::GetNextChild(const wxTreeMultiItem &item, int &cookie) const +{ + if(item.IsNodeItem()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); + + if(cookie >= 0 && cookie < (n->GetNodeCount()-1)) + { + // increment cookie, return node + cookie ++; + return wxTreeMultiItem(n->GetNode(cookie)); + } + } + + // end of query, or no valid node + cookie = -1; + return wxTreeMultiItem(0); +} + +wxTreeMultiItem wxTreeMultiCtrl::GetLastChild(const wxTreeMultiItem &item) const +{ + if(item.IsNodeItem()) + { + TreeMultiItemNode *n = (TreeMultiItemNode *)item.GetItem(); + + if(n->GetNodeCount() > 0) + return wxTreeMultiItem(n->GetNode(n->GetNodeCount()-1)); + } + + return wxTreeMultiItem(0); +} + +wxTreeMultiItem wxTreeMultiCtrl::GetNextSibling(wxTreeMultiItem const& item) const +{ + // check if a valid item has been passed: + if (!(item.IsOk())) + return wxTreeMultiItem(); + + TreeMultiItemNode* ParentPtr(item.GetItem()->GetParent()); + + + if (ParentPtr != NULL) // the parent pointer is only null if the passed item is the root + { + // find the current item in the parent's list; the next sibling has an index that is one higher than the one of the current item: + int NextItemIndex(ParentPtr->Index(item.GetItem())+1); // variable definition and initialization + + if (NextItemIndex < ParentPtr->GetNodeCount()) + return ParentPtr->GetNode(NextItemIndex); + else + return wxTreeMultiItem(); + } /* if */ + else + return wxTreeMultiItem(); +} /* wxTreeMultiCtrl::GetNextSibling(wxTreeMultiItem const&) const */ + +wxTreeMultiItem wxTreeMultiCtrl::GetPrevSibling(wxTreeMultiItem const& item) const +{ + // check if a valid item has been passed: + if (!(item.IsOk())) + return wxTreeMultiItem(); + + TreeMultiItemNode* ParentPtr(item.GetItem()->GetParent()); + + + if (ParentPtr != NULL) + { + // find the current item in the parent's list; the next sibling has an index that is one higher than the one of the current item: + int PrevItemIndex(ParentPtr->Index(item.GetItem())-1); // variable definition and initialization + + if (PrevItemIndex >= 0) + return ParentPtr->GetNode(PrevItemIndex); + else + return wxTreeMultiItem(); + } /* if */ + else + return wxTreeMultiItem(); +} /* wxTreeMultiCtrl::GetPrevSibling(wxTreeMultiItem const&) const */ + +wxTreeMultiItem wxTreeMultiCtrl::GetNext(wxTreeMultiItem const& item) const +{ + // check if a valid item has been passed: + if (!(item.IsOk())) + return wxTreeMultiItem(); + + TreeMultiItemNode* NodePtr(item.GetItem()->IsTreeMultiItemNode()); // variable definition and initialization + + if ((NodePtr != NULL) && (NodePtr->GetNodeCount() > 0)) + return wxTreeMultiItem(NodePtr->First()); + else + { + // variable definitions and initializations: + wxTreeMultiItem Parent(item); + wxTreeMultiItem Sibling; + + do + { + Sibling = this->GetNextSibling(Parent); // try to find next sibling + Parent = this->GetParent(Parent); // get next ancestor + } while (!(Sibling.IsOk()) && Parent.IsOk()); + // in case the loop ended with Sibling.IsOk() "Sibling" contains a valid sibling otherwise an invalid + return Sibling; + } /* if */ +} /* wxTreeMultiCtrl::GetNextSibling(wxTreeMultiItem const&) const */ + +wxTreeMultiItem wxTreeMultiCtrl::GetPrevious(wxTreeMultiItem const& item) const +{ + // check if a valid item has been passed: + if (!(item.IsOk())) + return wxTreeMultiItem(); + + TreeMultiItemNode* NodePtr(item.GetItem()->IsTreeMultiItemNode()); // variable definition and initialization + + if ((NodePtr != NULL) && (NodePtr->GetNodeCount() > 0)) + return wxTreeMultiItem(NodePtr->Last()); + else + { + // variable definitions and initializations: + wxTreeMultiItem Parent(item); + wxTreeMultiItem Sibling; + + do + { + Sibling = this->GetPrevSibling(Parent); // try to find next sibling + Parent = this->GetParent(Parent); // get next ancestor + } while (!(Sibling.IsOk()) && Parent.IsOk()); + // in case the loop ended with Sibling.IsOk() "Sibling" contains a valid sibling otherwise an invalid + return Sibling; + } /* if */ +} /* wxTreeMultiCtrl::GetPrevious(wxTreeMultiItem const&) const */ + +// WDR: handler implementations for wxTreeMultiCtrl + +void wxTreeMultiCtrl::OnDraw(wxDC& dc) +{ + // go recursive and draw the whole visible tree. + dc.SetFont(_captionFont); + for(int i = 0; i < _root.GetNodeCount(); i++) + DrawNode(_root.GetNode(i), dc); +} /* */ diff --git a/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h b/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h index d997e3e..e2c2123 100644 --- a/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h +++ b/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h @@ -1,11 +1,11 @@ -//--------------------------------------------------------------------------- -// $RCSfile: wxTreeMultiCtrl.h,v $ -// $Source: /cvs/creatis/bbtk/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h,v $ -// $Revision: 1.1 $ -// $Date: 2008/03/28 13:42:19 $ -//--------------------------------------------------------------------------- -// Author: Jorgen Bodde -// Copyright: (c) Jorgen Bodde +//--------------------------------------------------------------------------- +// $RCSfile: wxTreeMultiCtrl.h,v $ +// $Source: /cvs/creatis/bbtk/kernel/src/ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h,v $ +// $Revision: 1.2 $ +// $Date: 2009/10/05 22:44:50 $ +//--------------------------------------------------------------------------- +// Author: Jorgen Bodde +// Copyright: (c) Jorgen Bodde // License: wxWidgets License //--------------------------------------------------------------------------- @@ -184,13 +184,13 @@ public: wxTreeMultiItem(TreeMultiItemBase *ptr) { _item = ptr; - }; - - // Returns the TreeMultiItemBase class. This shoult *NOT* be - // used if you don't know what you are doing! This means never use it. */ - TreeMultiItemBase *GetItem() const { - return _item; - }; + }; + + // Returns the TreeMultiItemBase class. This shoult *NOT* be + // used if you don't know what you are doing! This means never use it. */ + TreeMultiItemBase *GetItem() const { + return _item; + }; #endif // _NO_DOXYGEN_ @@ -198,21 +198,21 @@ public: classes from the wxTreeMultiCtrl. */ void operator=(const wxTreeMultiItem &item) { - _item = item._item; - }; - - /** Equality operator. It returns true if the items are identical or if both items are invalid. */ - bool operator==(wxTreeMultiItem const& item) const {return (this->GetItem() == item.GetItem());} - - /** Inequality operator. It returns true if the items are different or one of them is invalid. */ - bool operator!=(wxTreeMultiItem const& item) const {return (this->GetItem() != item.GetItem());} - - /** Returns the parent of the current wxTreeMultiItem. This means the wxTreeMultiNode is returned. It can - be useful to check or clear the checkbox at this level. */ - wxTreeMultiItem GetParent() const{ - wxCHECK(IsOk(), wxTreeMultiItem(0)); - return wxTreeMultiItem(_item->GetParent()); - }; + _item = item._item; + }; + + /** Equality operator. It returns true if the items are identical or if both items are invalid. */ + bool operator==(wxTreeMultiItem const& item) const {return (this->GetItem() == item.GetItem());} + + /** Inequality operator. It returns true if the items are different or one of them is invalid. */ + bool operator!=(wxTreeMultiItem const& item) const {return (this->GetItem() != item.GetItem());} + + /** Returns the parent of the current wxTreeMultiItem. This means the wxTreeMultiNode is returned. It can + be useful to check or clear the checkbox at this level. */ + wxTreeMultiItem GetParent() const{ + wxCHECK(IsOk(), wxTreeMultiItem(0)); + return wxTreeMultiItem(_item->GetParent()); + }; /** Validates if the wxTreeMultiItem is a valid instance to use in the wxTreeMultiCtrl. Returns TRUE when there is a member value is associated with it, or FALSE when not. This value can also be checked when this class is returned from a wxTreeMultiCtrl operation. For example: @@ -288,32 +288,32 @@ public: Use wxTreeMultiCtrl::GetExcludedParent() to get the node that hides this one. */ bool IsExcluded() { wxCHECK(_item, false); - return _item->IsExcluded(); - } - - /** Returns true if the item is selected. - Please note that currently only nodes can be selected. - */ - bool IsSelected(void) const - { - wxCHECK(this->GetItem(),false); - return this->GetItem()->IsSelected(); - } - /** Returns true if this node is visible. Please note that when this node is a child node of a collapsed - node, it is not visible. Also if this node is a child node of an excluded node, it is also not visible. - It does NOT return false when it's drawn somewhere outside of the visible area. */ + return _item->IsExcluded(); + } + + /** Returns true if the item is selected. + Please note that currently only nodes can be selected. + */ + bool IsSelected(void) const + { + wxCHECK(this->GetItem(),false); + return this->GetItem()->IsSelected(); + } + /** Returns true if this node is visible. Please note that when this node is a child node of a collapsed + node, it is not visible. Also if this node is a child node of an excluded node, it is also not visible. + It does NOT return false when it's drawn somewhere outside of the visible area. */ bool IsVisible() { wxCHECK(_item, false); return _item->IsVisible(); } - -}; - -WX_DECLARE_OBJARRAY(wxTreeMultiItem,wxArrayTreeMultiItem); - -/** \class wxTreeMultiWindowInfo - \ingroup classes - \brief This class contains information for every Window node to be added. + +}; + +WX_DECLARE_OBJARRAY(wxTreeMultiItem,wxArrayTreeMultiItem); + +/** \class wxTreeMultiWindowInfo + \ingroup classes + \brief This class contains information for every Window node to be added. This class can be used to modify the behaviour of the Window node to be added, and can be reused to pass along upon every wxTreeMultiCtrl::AppendWindow call. For example: @@ -362,25 +362,25 @@ private: #if(CHECKBOXVIEW) /** Checkstate for checkboxed property sheets */ bool _checkState; -#endif - -public: -#if(CHECKBOXVIEW) - wxTreeMultiWindowInfo(int flags, int frontSpacing, int topSpacing, bool checkState = false) - : _flags(flags) - , _frontSpacing(frontSpacing) - , _frontSpacingOrg(frontSpacing) - , _topSpacing(topSpacing) - , _checkState(checkState) -#else - wxTreeMultiWindowInfo(int flags, int frontSpacing, int topSpacing) - : _flags(flags) - , _frontSpacing(frontSpacing) - , _frontSpacingOrg(frontSpacing) - , _topSpacing(topSpacing) -#endif - { - // constructor +#endif + +public: +#if(CHECKBOXVIEW) + wxTreeMultiWindowInfo(int flags, int frontSpacing, int topSpacing, bool checkState = false) + : _flags(flags) + , _frontSpacing(frontSpacing) + , _frontSpacingOrg(frontSpacing) + , _topSpacing(topSpacing) + , _checkState(checkState) +#else + wxTreeMultiWindowInfo(int flags, int frontSpacing, int topSpacing) + : _flags(flags) + , _frontSpacing(frontSpacing) + , _frontSpacingOrg(frontSpacing) + , _topSpacing(topSpacing) +#endif + { + // constructor } /** Adds indent to original front spacing and increments it with that value (quick extra indent). The original value of FrontSpacing (see SetFrontSpacing() gets indented by multiplying @@ -574,22 +574,22 @@ private: bool _checkboxView; /** Height and weight for checkbox */ - int _checkHeight, _checkWidth; -#endif - - /** brush for highlighting nodes */ - wxBrush* m_HilightBrush; - - /** This captionFont is made equal to the font of the wxScrolledWindow. As extra the bold face - is set on it when this is wanted by the user (see flags) */ - wxFont _captionFont; - - /** list of selected items */ - wxArrayTreeMultiItem m_SelectedItems; - - /** Does the actual collapsing / expanding. So that Expand and Collapse aren't using the same code twice */ - void DoFold(TreeMultiItemBase *item, bool expand, bool recursive); - + int _checkHeight, _checkWidth; +#endif + + /** brush for highlighting nodes */ + wxBrush* m_HilightBrush; + + /** This captionFont is made equal to the font of the wxScrolledWindow. As extra the bold face + is set on it when this is wanted by the user (see flags) */ + wxFont _captionFont; + + /** list of selected items */ + wxArrayTreeMultiItem m_SelectedItems; + + /** Does the actual collapsing / expanding. So that Expand and Collapse aren't using the same code twice */ + void DoFold(TreeMultiItemBase *item, bool expand, bool recursive); + /** Redraws and recalculates the nodes from the current node. It will also clear all 'dirty' flags when they are recalculated */ void RedrawFromNode(TreeMultiItemNode *n); @@ -632,31 +632,31 @@ private: /** Recalculates totally needed virtual size of the wxTreeMultiCtrl. It will scan for the largest window, with the biggest size, and report that back */ - void RecalculateVirtualSize(); - - /** Adjusts scrollbars in window, usually done after virtual size (x,y) is recalculated */ - using wxScrolledWindow::AdjustScrollbars; - virtual void AdjustScrollbars(int x, int y); - - /** Recalculates and accumulates largest x and y */ + void RecalculateVirtualSize(); + + /** Adjusts scrollbars in window, usually done after virtual size (x,y) is recalculated */ + using wxScrolledWindow::AdjustScrollbars; + virtual void AdjustScrollbars(int x, int y); + + /** Recalculates and accumulates largest x and y */ void RecalculateVirtualSizeFromNode(const TreeMultiItemNode *node, int &x, int &y); - - /** Scans for TreeMultiItemBase node that contains x,y and in area returns a hittest constant to - indicate what matched */ - TreeMultiItemBase *FindNodeByPoint(TreeMultiItemBase *b, wxPoint const& pt, int &area); - - /** Scans for TreeMultiItemWindow that holds the wxWindow pointer. Does not scan in panels or does - a deep search. Reason, this function is used to advance to next TreeMultiItemWindow for focus + + /** Scans for TreeMultiItemBase node that contains x,y and in area returns a hittest constant to + indicate what matched */ + TreeMultiItemBase *FindNodeByPoint(TreeMultiItemBase *b, wxPoint const& pt, int &area); + + /** Scans for TreeMultiItemWindow that holds the wxWindow pointer. Does not scan in panels or does + a deep search. Reason, this function is used to advance to next TreeMultiItemWindow for focus on this wxScrolledWindow. If a sub window is found, it will skip other windows on that same level */ wxTreeMultiItem FindWindowNode(wxWindow *wnd, TreeMultiItemNode *n = 0); /** Finds next visible window item in chain. If not found use FindFirstVisibleItem to start from the - beginning */ - TreeMultiItemWindow *FindNextVisibleWindowItem(TreeMultiItemBase *b, int index = -1); - - /** Adjust the centering of the bitmap icons (collapse / expand) when the caption font changes. They need to - be centered in the middle of the font, so a bit of deltaY adjustment is needed */ - void AdjustIconsDeltaY(); + beginning */ + TreeMultiItemWindow *FindNextVisibleWindowItem(TreeMultiItemBase *b, int index = -1); + + /** Adjust the centering of the bitmap icons (collapse / expand) when the caption font changes. They need to + be centered in the middle of the font, so a bit of deltaY adjustment is needed */ + void AdjustIconsDeltaY(); /** Calculate the spanning of the individual nodes */ void CalculateNodeSpanning(TreeMultiItemBase *b); @@ -669,47 +669,47 @@ private: will get tristate if the checked items are scattered (some are some aren't). If all nodes in this node are checked, the parent node gets checked all the way up to the last one that matches criteria. If all are cleared, parent node gets cleared */ - void ScanTristateCheckstates(TreeMultiItemBase *b); -#endif - - /** \name Private add and delete methods - @{ - */ - - /** Inserts a node into the parent's node at the specified position. - As this is a private method error checking is limited. Therefore, it has to be guaranteed that this method - is only called with a valid parent node pointer. - The position is zero based. In case the position is equal or larger than the current number of - parent's elements the new node is appended. - The newly inserted node is being returned. - */ - wxTreeMultiItem InsertNode(TreeMultiItemNode* ParentPtr, size_t Position, wxString const& Caption, wxString const& Name); - - /** Inserts a window into the parent's node at the specified position. - As this is a private method error checking is limited. Therefore, it has to be guaranteed that this method - is only called with a valid parent node and window pointer. - The position is zero based. In case the position is equal or larger than the current number of - parent's elements the new node is appended. - The newly inserted window is being returned. - */ - wxTreeMultiItem InsertWindow(TreeMultiItemNode* ParentPtr, size_t Position, wxWindow* WindowPtr, wxString const& Name, - wxTreeMultiWindowInfo const& Info, int Flags); - - /** @} - */ -private: - void Init(); - + void ScanTristateCheckstates(TreeMultiItemBase *b); +#endif + + /** \name Private add and delete methods + @{ + */ + + /** Inserts a node into the parent's node at the specified position. + As this is a private method error checking is limited. Therefore, it has to be guaranteed that this method + is only called with a valid parent node pointer. + The position is zero based. In case the position is equal or larger than the current number of + parent's elements the new node is appended. + The newly inserted node is being returned. + */ + wxTreeMultiItem InsertNode(TreeMultiItemNode* ParentPtr, size_t Position, wxString const& Caption, wxString const& Name); + + /** Inserts a window into the parent's node at the specified position. + As this is a private method error checking is limited. Therefore, it has to be guaranteed that this method + is only called with a valid parent node and window pointer. + The position is zero based. In case the position is equal or larger than the current number of + parent's elements the new node is appended. + The newly inserted window is being returned. + */ + wxTreeMultiItem InsertWindow(TreeMultiItemNode* ParentPtr, size_t Position, wxWindow* WindowPtr, wxString const& Name, + wxTreeMultiWindowInfo const& Info, int Flags); + + /** @} + */ +private: + void Init(); + // handlers //--------- - //virtual void OnDraw(wxDC& dc); - void OnPaint(wxPaintEvent &event); - void OnMouseClick (wxMouseEvent& event); - void OnRightMouseClick(wxMouseEvent& Event); - void OnKey(wxKeyEvent &event); - void OnSize(wxSizeEvent &event); - + //virtual void OnDraw(wxDC& dc); + void OnPaint(wxPaintEvent &event); + void OnMouseClick (wxMouseEvent& event); + void OnRightMouseClick(wxMouseEvent& Event); + void OnKey(wxKeyEvent &event); + void OnSize(wxSizeEvent &event); + /** Recalculates the spanning controls */ void RecalculateSpanSizes(); @@ -765,66 +765,66 @@ public: */ /** Adds a root node to the wxTreeMultiItem. There can be many root nodes. Use this wxTreeMultiNode pointer to add - more subnodes to it. */ - wxTreeMultiItem AddRoot(const wxString &caption, const wxString &name = wxEmptyString); - - /** Adds a window to the tree control. Use this wxTreeMultiItem method to add a window class to the - current wxTreeMultiItem. The wxTreeMultiItem must point to a Node class. If this is not the case - an empty wxTreeMultiItem is returned. The mask is used to override the mask settings of the - wxTreeMultiWindowInfo class. This can be handy to set or clear extra flags only needed for certain - situations */ - wxTreeMultiItem AppendWindow(const wxTreeMultiItem &ParentItem, wxWindow *window = NULL, const wxString &name = wxEmptyString, - wxTreeMultiWindowInfo const& info = wxTreeMultiWindowInfoDefault, int flags = 0); - - /** Adds a window to the tree control. Use this method to add a window class at the specified position - of the parent's wxTreeMultiItem. In case the position is smaller than the current number of children all elements - are shifted upwards, otherwise the new window is appended to the parent's wxTreeMultiItem. - The parent wxTreeMultiItem must point to a Node class. If this is not the case an - empty wxTreeMultiItem is returned. - */ - wxTreeMultiItem InsertWindow(wxTreeMultiItem const& ParentItem, size_t Position, wxWindow *window = NULL, wxString const& Name = wxEmptyString, - wxTreeMultiWindowInfo const& info = wxTreeMultiWindowInfoDefault, int flags = 0); - - /** Adds a window to the tree control. Use this method to add a window class as the first element - of the parent's wxTreeMultiItem. The parent wxTreeMultiItem must point to a Node class. If this is not the case an - empty wxTreeMultiItem is returned. - */ - wxTreeMultiItem PrependWindow(wxTreeMultiItem const& ParentItem, wxWindow *window = NULL, const wxString &name = wxEmptyString, - wxTreeMultiWindowInfo const& info = wxTreeMultiWindowInfoDefault, int flags = 0); - - /** Adds a node to the tree control. Use this wxTreeMultiItem method to add a recursive subnode class as the last element - of the parent's wxTreeMultiItem. The parent wxTreeMultiItem must point to a Node class. If this is not the case - an empty wxTreeMultiItem is returned. A node can contain multiple nodes or window classes */ - wxTreeMultiItem AppendNode(wxTreeMultiItem const& ParentItem, const wxString &caption = wxEmptyString, - const wxString &name = wxEmptyString); - - /** Adds a node to the tree control. Use this method to add a recursive subnode class at the specified position - of the parent's wxTreeMultiItem. In case the position is smaller than the current number of nodes all elements - are shifted upwards, otherwise the new node is appended to the parent's wxTreeMultiItem. - The parent wxTreeMultiItem must point to a Node class. If this is not the case an - empty wxTreeMultiItem is returned. A node can contain multiple nodes or window classes. - */ - wxTreeMultiItem InsertNode(wxTreeMultiItem const& ParentItem, size_t Position, wxString const& caption, wxString const& name); - - /** Adds a node to the tree control. Use this method to add a recursive subnode class as the first element - of the parent's wxTreeMultiItem. The parent wxTreeMultiItem must point to a Node class. If this is not the case an - empty wxTreeMultiItem is returned. A node can contain multiple nodes or window classes. - */ - wxTreeMultiItem PrependNode(wxTreeMultiItem const& ParentItem, wxString const& caption = wxEmptyString, - wxString const& name = wxEmptyString); - - /** Delete item from the tree control. Whenever it is present, delete it. If not, return false. After - deletion the wxTreeMultiItem is 0, thus IsOk will return false */ - bool Delete(wxTreeMultiItem &item); - - /** Deletes all the items from the wxTreeMultiCtrl. */ - void DeleteAllItems(void) - { - this->_root.Clear(); - this->m_SelectedItems.Clear(); - Refresh(); - }; - + more subnodes to it. */ + wxTreeMultiItem AddRoot(const wxString &caption, const wxString &name = wxEmptyString); + + /** Adds a window to the tree control. Use this wxTreeMultiItem method to add a window class to the + current wxTreeMultiItem. The wxTreeMultiItem must point to a Node class. If this is not the case + an empty wxTreeMultiItem is returned. The mask is used to override the mask settings of the + wxTreeMultiWindowInfo class. This can be handy to set or clear extra flags only needed for certain + situations */ + wxTreeMultiItem AppendWindow(const wxTreeMultiItem &ParentItem, wxWindow *window = NULL, const wxString &name = wxEmptyString, + wxTreeMultiWindowInfo const& info = wxTreeMultiWindowInfoDefault, int flags = 0); + + /** Adds a window to the tree control. Use this method to add a window class at the specified position + of the parent's wxTreeMultiItem. In case the position is smaller than the current number of children all elements + are shifted upwards, otherwise the new window is appended to the parent's wxTreeMultiItem. + The parent wxTreeMultiItem must point to a Node class. If this is not the case an + empty wxTreeMultiItem is returned. + */ + wxTreeMultiItem InsertWindow(wxTreeMultiItem const& ParentItem, size_t Position, wxWindow *window = NULL, wxString const& Name = wxEmptyString, + wxTreeMultiWindowInfo const& info = wxTreeMultiWindowInfoDefault, int flags = 0); + + /** Adds a window to the tree control. Use this method to add a window class as the first element + of the parent's wxTreeMultiItem. The parent wxTreeMultiItem must point to a Node class. If this is not the case an + empty wxTreeMultiItem is returned. + */ + wxTreeMultiItem PrependWindow(wxTreeMultiItem const& ParentItem, wxWindow *window = NULL, const wxString &name = wxEmptyString, + wxTreeMultiWindowInfo const& info = wxTreeMultiWindowInfoDefault, int flags = 0); + + /** Adds a node to the tree control. Use this wxTreeMultiItem method to add a recursive subnode class as the last element + of the parent's wxTreeMultiItem. The parent wxTreeMultiItem must point to a Node class. If this is not the case + an empty wxTreeMultiItem is returned. A node can contain multiple nodes or window classes */ + wxTreeMultiItem AppendNode(wxTreeMultiItem const& ParentItem, const wxString &caption = wxEmptyString, + const wxString &name = wxEmptyString); + + /** Adds a node to the tree control. Use this method to add a recursive subnode class at the specified position + of the parent's wxTreeMultiItem. In case the position is smaller than the current number of nodes all elements + are shifted upwards, otherwise the new node is appended to the parent's wxTreeMultiItem. + The parent wxTreeMultiItem must point to a Node class. If this is not the case an + empty wxTreeMultiItem is returned. A node can contain multiple nodes or window classes. + */ + wxTreeMultiItem InsertNode(wxTreeMultiItem const& ParentItem, size_t Position, wxString const& caption, wxString const& name); + + /** Adds a node to the tree control. Use this method to add a recursive subnode class as the first element + of the parent's wxTreeMultiItem. The parent wxTreeMultiItem must point to a Node class. If this is not the case an + empty wxTreeMultiItem is returned. A node can contain multiple nodes or window classes. + */ + wxTreeMultiItem PrependNode(wxTreeMultiItem const& ParentItem, wxString const& caption = wxEmptyString, + wxString const& name = wxEmptyString); + + /** Delete item from the tree control. Whenever it is present, delete it. If not, return false. After + deletion the wxTreeMultiItem is 0, thus IsOk will return false */ + bool Delete(wxTreeMultiItem &item); + + /** Deletes all the items from the wxTreeMultiCtrl. */ + void DeleteAllItems(void) + { + this->_root.Clear(); + this->m_SelectedItems.Clear(); + Refresh(); + }; + /** Deletes all children of the current node. The wxTreeMultiItem needs to be of type Node to do this. Call GetParentNode to get the parent wxTreeMultiItem which is always a node. */ void DeleteChildren(const wxTreeMultiItem &item); @@ -863,61 +863,61 @@ public: Collapse(item, false); }; - /** @} - */ - - /** @name Selection manipulation - These methods allow you to select, unselect or test wxTreeMultiItems on selection. - Currently only items of type Node can be manipulated. - @{ - */ - - /** Returns the number of selected items. */ - size_t GetSelectedItemCount(void) const {return this->m_SelectedItems.GetCount();} - - /** Returns the first selected item. - If there is no selected item an invalid tree multi item is returned. - */ - wxTreeMultiItem GetFirstSelectedItem(void) const; - - /** Returns the last selected item. - If there is no selected item an invalid tree multi item is returned. - */ - wxTreeMultiItem GetLastSelectedItem(void) const; - - /** Returns a selected item with the specified index. - If there is no selected item with the passed index an invalide tree multi item is returned. - */ - wxTreeMultiItem GetSelectedItem(size_t Index) const; - - /** Returns the index of the selected item. - In case the item is not selected "GetSelectedItemCount()" - which is an invalid index - is returned. - */ - size_t GetSelectedItemIndex(wxTreeMultiItem const& Item) const; - - /** Selects the specified item AND in case - - UnselectOthers is set all other selected items are going to be unselected; - - ExpandSelection is set all items between the last selected item and the passed item - are selected, too (in case there this is the first selection all items between the first root - and the passed item are selected). - If the passed item is already selected the other parameters are ignored. - Please not that currently only nodes can be selected, therefore, if any other item is passed nothing will happen. - */ - void SelectItem(wxTreeMultiItem const& Item, bool UnselectOthers=true, bool ExpandSelection=false); - - /** Unselect all selected items. */ - void UnselectAll(void); - - /** Unselect specified item */ - void Unselect(wxTreeMultiItem const& Item); - - /** @} - */ - - - /** \name Visibility manipulation - These methods allow you to manipulate a certain wxTreeMultiItem to temporarily exclude or to include - the node from drawing. Whenever it is excluded, all operations can still be performed, however + /** @} + */ + + /** @name Selection manipulation + These methods allow you to select, unselect or test wxTreeMultiItems on selection. + Currently only items of type Node can be manipulated. + @{ + */ + + /** Returns the number of selected items. */ + size_t GetSelectedItemCount(void) const {return this->m_SelectedItems.GetCount();} + + /** Returns the first selected item. + If there is no selected item an invalid tree multi item is returned. + */ + wxTreeMultiItem GetFirstSelectedItem(void) const; + + /** Returns the last selected item. + If there is no selected item an invalid tree multi item is returned. + */ + wxTreeMultiItem GetLastSelectedItem(void) const; + + /** Returns a selected item with the specified index. + If there is no selected item with the passed index an invalide tree multi item is returned. + */ + wxTreeMultiItem GetSelectedItem(size_t Index) const; + + /** Returns the index of the selected item. + In case the item is not selected "GetSelectedItemCount()" - which is an invalid index - is returned. + */ + size_t GetSelectedItemIndex(wxTreeMultiItem const& Item) const; + + /** Selects the specified item AND in case + - UnselectOthers is set all other selected items are going to be unselected; + - ExpandSelection is set all items between the last selected item and the passed item + are selected, too (in case there this is the first selection all items between the first root + and the passed item are selected). + If the passed item is already selected the other parameters are ignored. + Please not that currently only nodes can be selected, therefore, if any other item is passed nothing will happen. + */ + void SelectItem(wxTreeMultiItem const& Item, bool UnselectOthers=true, bool ExpandSelection=false); + + /** Unselect all selected items. */ + void UnselectAll(void); + + /** Unselect specified item */ + void Unselect(wxTreeMultiItem const& Item); + + /** @} + */ + + + /** \name Visibility manipulation + These methods allow you to manipulate a certain wxTreeMultiItem to temporarily exclude or to include + the node from drawing. Whenever it is excluded, all operations can still be performed, however the node may not be visible. @{ */ @@ -943,13 +943,13 @@ public: \li wxTMC_HITTEST_GUTTER If the front part of the item is clicked (where the node is) \li wxTMC_HITTEST_WINDOW If located in the window area \li wxTMC_HITTEST_CAPTION If located on the caption of the MultiTreeItemNode - - Returned is the item which is located under the mouse, or none (IsOk = false) if - no item under the mouse */ - wxTreeMultiItem HitTest(wxPoint const& pt, int &flags); - - /** @name Find methods - These methods are used for finding a node in the wxTreeMultiCtrl. + + Returned is the item which is located under the mouse, or none (IsOk = false) if + no item under the mouse */ + wxTreeMultiItem HitTest(wxPoint const& pt, int &flags); + + /** @name Find methods + These methods are used for finding a node in the wxTreeMultiCtrl. @{ */ @@ -1065,13 +1065,13 @@ public: #if(CHECKBOXVIEW) /** Gets the checkbox state of the wxTreeMultiItem pointed out by "item". If the item does not have a checkbox - associated (or the item is not ok), it will return -1. If the checkbox is checked it will return 1, - unchecked is 0, and tri-state (usually only for caption nodes) it will return 2. This needs USE_CHECKBOXVIEW - set to YES, or CHECKBOXVIEW=1 during compile*/ - int GetCheckboxState(const wxTreeMultiItem &item, bool WXUNUSED(recursive)) { - wxCHECK(item.IsOk(), -1); - - // return the checkbox state + associated (or the item is not ok), it will return -1. If the checkbox is checked it will return 1, + unchecked is 0, and tri-state (usually only for caption nodes) it will return 2. This needs USE_CHECKBOXVIEW + set to YES, or CHECKBOXVIEW=1 during compile*/ + int GetCheckboxState(const wxTreeMultiItem &item, bool WXUNUSED(recursive)) { + wxCHECK(item.IsOk(), -1); + + // return the checkbox state TreeMultiItemBase *b = item.GetItem(); if(b->GetCheckbox()) return b->GetCheckboxState(); @@ -1135,26 +1135,26 @@ public: #endif /** @} - */ - - /** @name Iteration methods - Allows the user to iterate through a wxTreeMultiCtrl node, and get all the children or siblings. - To start an iteration from the lowest level the functions GetFirstRoot and GetLastRoot are provided. - @{ - */ - - /** Returns the first root. */ - wxTreeMultiItem GetFirstRoot(void) const {return wxTreeMultiItem(this->_root.First());} - - /** Returns the last root. */ - wxTreeMultiItem GetLastRoot(void) const {return wxTreeMultiItem(this->_root.Last());} - - /** Returns the items parent. */ - wxTreeMultiItem GetParent(wxTreeMultiItem const& item) const; - - /** Returns the first child of this node. The type of wxTreeMultiItem needs to be of Node. Whenever not succesful, - the item returned is not ok (IsOk = false). Upon success, a valid child is returned. The cookie variable doesn't - need to be initialized */ + */ + + /** @name Iteration methods + Allows the user to iterate through a wxTreeMultiCtrl node, and get all the children or siblings. + To start an iteration from the lowest level the functions GetFirstRoot and GetLastRoot are provided. + @{ + */ + + /** Returns the first root. */ + wxTreeMultiItem GetFirstRoot(void) const {return wxTreeMultiItem(this->_root.First());} + + /** Returns the last root. */ + wxTreeMultiItem GetLastRoot(void) const {return wxTreeMultiItem(this->_root.Last());} + + /** Returns the items parent. */ + wxTreeMultiItem GetParent(wxTreeMultiItem const& item) const; + + /** Returns the first child of this node. The type of wxTreeMultiItem needs to be of Node. Whenever not succesful, + the item returned is not ok (IsOk = false). Upon success, a valid child is returned. The cookie variable doesn't + need to be initialized */ wxTreeMultiItem GetFirstChild(const wxTreeMultiItem &item, int &cookie) const; /** Returns the next child in the iteration on the level of 'item'. Make sure you called GetFirstChild first @@ -1162,33 +1162,33 @@ public: wxTreeMultiItem GetNextChild(const wxTreeMultiItem &item, int &cookie) const; /** Returns the last child of this node. The type of 'item' needs to be of Node. Whenever not succesful, - the item returned is not ok (IsOk = false). Upon success, a valid last child is returned. */ - wxTreeMultiItem GetLastChild(const wxTreeMultiItem &item) const; - - /** Returns the next sibling of the passed item. */ - wxTreeMultiItem GetNextSibling(wxTreeMultiItem const& item) const; - - /** Returns the previous sibling of the passed item. */ - wxTreeMultiItem GetPrevSibling(wxTreeMultiItem const& item) const; - - /** Returns the next item. "Next" is defined by the following order: - - in case the current item has a child it is the first child of the current item; - - in case the current item has a next sibling as the next sibling; - - as the parent's (or one of its ancestor's) next sibling. - */ - wxTreeMultiItem GetNext(wxTreeMultiItem const& item) const; - - /** Returns the previous item. "Previous" is defined by the following order: - - in case the current item has a child it is the last child of the current item; - - in case the current item has a previous sibling it is the previous sibling; - - as the parent's (or one of its ancestor's) previous sibling. - */ - wxTreeMultiItem GetPrevious(wxTreeMultiItem const& item) const; - - - /** @} - */ - + the item returned is not ok (IsOk = false). Upon success, a valid last child is returned. */ + wxTreeMultiItem GetLastChild(const wxTreeMultiItem &item) const; + + /** Returns the next sibling of the passed item. */ + wxTreeMultiItem GetNextSibling(wxTreeMultiItem const& item) const; + + /** Returns the previous sibling of the passed item. */ + wxTreeMultiItem GetPrevSibling(wxTreeMultiItem const& item) const; + + /** Returns the next item. "Next" is defined by the following order: + - in case the current item has a child it is the first child of the current item; + - in case the current item has a next sibling as the next sibling; + - as the parent's (or one of its ancestor's) next sibling. + */ + wxTreeMultiItem GetNext(wxTreeMultiItem const& item) const; + + /** Returns the previous item. "Previous" is defined by the following order: + - in case the current item has a child it is the last child of the current item; + - in case the current item has a previous sibling it is the previous sibling; + - as the parent's (or one of its ancestor's) previous sibling. + */ + wxTreeMultiItem GetPrevious(wxTreeMultiItem const& item) const; + + + /** @} + */ + /** @name Get and set methods These methods allow you to set or get certain properties of the wxTreeMultiCtrl. @{ @@ -1206,13 +1206,13 @@ public: beginning. */ void SetCaptionFont(const wxFont &font); - /** @} - */ - - void OnDraw(wxDC& dc); - -private: - DECLARE_EVENT_TABLE() -}; + /** @} + */ + + void OnDraw(wxDC& dc); + +private: + DECLARE_EVENT_TABLE() +}; #endif diff --git a/kernel/src/bbtkBlackBox.h b/kernel/src/bbtkBlackBox.h index 83c27b3..7969728 100644 --- a/kernel/src/bbtkBlackBox.h +++ b/kernel/src/bbtkBlackBox.h @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkBlackBox.h,v $ Language: C++ - Date: $Date: 2009/06/11 09:51:42 $ - Version: $Revision: 1.28 $ + Date: $Date: 2009/10/05 22:44:48 $ + Version: $Revision: 1.29 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -639,7 +639,10 @@ namespace bbtk /// The default implementation is to issue 'delete this' /// but it can be redefined in inherited classes to handle special deletion mechanisms (e.g. ref counting, private destructors, such as vtk objects deletion with method Delete, etc.). /// \return The number of remaining references on the object after the call (if meaningfull...): used by bbtk to warn a user if another smart pointing system is still holding the object... - virtual int bbDelete() { delete this; return 0; } + +//JCP 21-09-20 09 delete this throws and exception change due to compiler version changing and boost version + virtual int bbDelete() {// delete this; + return 0; } //================================================================== diff --git a/kernel/src/bbtkComplexBlackBox.cxx b/kernel/src/bbtkComplexBlackBox.cxx index 05d6923..0c65247 100644 --- a/kernel/src/bbtkComplexBlackBox.cxx +++ b/kernel/src/bbtkComplexBlackBox.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkComplexBlackBox.cxx,v $ Language: C++ - Date: $Date: 2009/07/30 15:01:05 $ - Version: $Revision: 1.28 $ + Date: $Date: 2009/10/05 22:44:48 $ + Version: $Revision: 1.29 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -692,16 +692,25 @@ namespace bbtk #ifdef WIN32 - std::string command1 ("dot -Tpng -o " + + std::string currentexecpath( crea::System::GetDllAppPath("bbtk") +"\\dot_embedded\\"); + std::string command1 (currentexecpath + "dot -Tpng -o " + filename_png2 + " " + filename_dot2 ); + + std::string command1a(currentexecpath + "dot -T cmap -o " + + filename_cmap2 + " " + filename_dot2 ); + #else std::string command1 ("dot -Tpng:quartz -o " + filename_png2 + " " + filename_dot2 ); -#endif - - std::string command1a("dot -T cmap -o " + std::string command1a("dot -T cmap -o " + filename_cmap2 + " " + filename_dot2 ); +#endif + + + + // 1. Generating .dot file FILE *ff; ff = fopen(filename_dot.c_str(),"w"); diff --git a/kernel/src/bbtkComplexBlackBox.h b/kernel/src/bbtkComplexBlackBox.h index 7236a60..d70f8a0 100644 --- a/kernel/src/bbtkComplexBlackBox.h +++ b/kernel/src/bbtkComplexBlackBox.h @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkComplexBlackBox.h,v $ Language: C++ - Date: $Date: 2008/12/11 09:50:35 $ - Version: $Revision: 1.7 $ + Date: $Date: 2009/10/05 22:44:48 $ + Version: $Revision: 1.8 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -47,6 +47,7 @@ #include "bbtkComplexBlackBoxDescriptor.h" //#include "bbtkComplexBlackBoxInputDescriptor.h" //#include "bbtkComplexBlackBoxOutputDescriptor.h" +#include "creaSystem.h" #include namespace bbtk diff --git a/kernel/src/bbtkFactory.cxx b/kernel/src/bbtkFactory.cxx index 37563de..627bc80 100644 --- a/kernel/src/bbtkFactory.cxx +++ b/kernel/src/bbtkFactory.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbtkFactory.cxx,v $ Language: C++ - Date: $Date: 2009/06/08 14:50:03 $ - Version: $Revision: 1.45 $ + Date: $Date: 2009/10/05 22:44:48 $ + Version: $Revision: 1.46 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -148,153 +148,158 @@ namespace bbtk // same for Windows, with c:, d: ... // // lastname : string before the last / (if any), or user supplied name + + if(name != ""){ + bbtkDebugMessageInc("kernel",7,"Factory::LoadPackage(\""< package_paths; + std::string libname; // full path library name + std::string pkgname; // e.g. libbb.so + + std::string upath; + pkgname = Utilities::ExtractPackageName(name,upath); + bbtkMessage("debug",1,"Package name ["<0) // ------------------------------------- check user supplied location + { + if (name[0] != '.' && name[0] != '/' && name[1]!= ':') + { + bbtkError("Use absolute or relative path name! ["<::iterator i; + for (i=package_paths.begin();i!=package_paths.end();++i) + { + foundFile = false; + path = *i; +//std::cout<<"JCP bbtkFactory.cxx void Factory::LoadPackage = path "< Trying to load [" << libname << "]" < package_paths; - std::string libname; // full path library name - std::string pkgname; // e.g. libbb.so - - std::string upath; - pkgname = Utilities::ExtractPackageName(name,upath); - - bbtkMessage("debug",1,"Package name ["<0) // ------------------------------------- check user supplied location - { - if (name[0] != '.' && name[0] != '/' && name[1]!= ':') - { - bbtkError("Use absolute or relative path name! ["<::iterator i; - for (i=package_paths.begin();i!=package_paths.end();++i) - { - foundFile = false; - path = *i; - - // we *really* want '.' to be the current working directory - if (path == ".") - { - char buf[2048]; // for getcwd - char * currentDir = getcwd(buf, 2048); - std::string cwd(currentDir); - path = currentDir; - } - - libname = Utilities::MakeLibnameFromPath(path, pkgname); - - bbtkMessage("debug",2,"-> Trying to load [" << libname << "]" <getline(buf,500); std::string str(buf); - + //size 0 JCP 21-09-2009 int size=str.length(); - if ( str[ size-1 ]==13 ) + if(size != 0){ + if ( str[ size-1 ]==13 ) { str.erase(size-1,1); } - try - { - DoInterpretLine(str); - } - CATCH_MACRO; + try + { + DoInterpretLine(str); + } + CATCH_MACRO; + } + } CloseCurrentFile(); } @@ -718,6 +721,7 @@ namespace bbtk { mStatus = Interpreter_OK; mInsideComment = false; +//std::cout<<"JCP bbtkInterpreter.cxx Interpreter::InterpretLine("< Interpreter::DoInterpretLine(\"" < words; SplitLine(line,words); @@ -786,7 +789,7 @@ namespace bbtk // Command CommandInfoType command; InterpretCommand(words,command); - +//std::cout<<"JCP bbtkInterpreter command.keyword ="<(mFile.back()); @@ -844,7 +848,7 @@ namespace bbtk } return; } - +//std::cout<<" mVirtualExecuter->Create(words[1],words[2]); "<=4 + if(tfullPathScriptName.size()>=4){ + if (tfullPathScriptName.substr(tfullPathScriptName.size()-4, 3)==".bb") { - // The following is *NOT* a debug time message : - // It's a user intended message. - // Please don't remove it. - bbtkMessage("interpreter",2, - " [" <& words,"<second; bbtkDebugMessage("interpreter",9,"<== Interpreter::InterpretCommand(...)"<0){ + char c = path[path.size()-1]; #if defined(__GNUC__) if (c != '/') libname += "/libbb"; @@ -286,6 +287,8 @@ namespace bbtk libname += pkgname; libname += ".dll"; #endif + } + return libname; } @@ -294,23 +297,26 @@ namespace bbtk std::string Utilities::MakePkgnameFromPath(std::string path, std::string pkgname, bool addExt) { std::string libname = path; - char c = path[path.size()-1]; - if (c != '/' && c != '\\') - { - libname += ConfigurationFile::GetInstance().Get_file_separator (); - } - libname += pkgname; - if (addExt) - { - int l = libname.size(); - if (l>4) - { - if (libname.substr(l-4, 4) != ".bbs") - { - libname = libname + ".bbs"; - } - } - } + if(path.size()>0){ + char c = path[path.size()-1]; + if (c != '/' && c != '\\') + { + libname += ConfigurationFile::GetInstance().Get_file_separator (); + } + libname += pkgname; + if (addExt) + { + int l = libname.size(); + if (l>4) + { + if (libname.substr(l-4, 4) != ".bbs") + { + libname = libname + ".bbs"; + } + } + } + } + return libname; } // ======================================================================= diff --git a/packages/toolsbbtk/bbs/appli/GUICreatePackage.bbs b/packages/toolsbbtk/bbs/appli/GUICreatePackage.bbs index 9253935..7acc43d 100644 --- a/packages/toolsbbtk/bbs/appli/GUICreatePackage.bbs +++ b/packages/toolsbbtk/bbs/appli/GUICreatePackage.bbs @@ -114,7 +114,6 @@ new ConcatStrings concatStr connect descriptionStr.Out concatStr.In6 connect dquote.Out concatStr.In7 - new ExecSystemCommand command connect concatStr.Out command.In diff --git a/packages/wx/src/bbwxSlider.cxx b/packages/wx/src/bbwxSlider.cxx index 1b3db85..0b4e7b3 100644 --- a/packages/wx/src/bbwxSlider.cxx +++ b/packages/wx/src/bbwxSlider.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbwxSlider.cxx,v $ Language: C++ - Date: $Date: 2009/05/15 14:58:03 $ - Version: $Revision: 1.24 $ + Date: $Date: 2009/10/05 22:44:52 $ + Version: $Revision: 1.25 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -303,7 +303,7 @@ namespace bbwx void SliderWidget::OnResolutionOfSlider(wxScrollEvent& event) { int value = mwxSlider->GetValue(); - int delta = (int) (pow( 4 , mResolutionOfSlider->GetValue() )); + int delta = (int) (pow((double) 4 ,(double) mResolutionOfSlider->GetValue() )); int minTmp = value - delta/2; int maxTmp = value + delta/2; if (minTmp