From: Juan Prieto Date: Mon, 5 Oct 2009 22:44:40 +0000 (+0000) Subject: Works with visual studio 2009 X-Git-Tag: CREATOOLS.2-0-3~130 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=f5d5e297c656fb1304cccd72e9ac347c0bddbd09;p=bbtk.git Works with visual studio 2009 --- 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 63bbb64..f1ad755 100644 Binary files a/kernel/doc/bbtkUsersGuide/bbCommand.png and b/kernel/doc/bbtkUsersGuide/bbCommand.png differ diff --git a/kernel/doc/bbtkUsersGuide/bbFile0.png b/kernel/doc/bbtkUsersGuide/bbFile0.png index 3a67bee..f1ad755 100644 Binary files a/kernel/doc/bbtkUsersGuide/bbFile0.png and b/kernel/doc/bbtkUsersGuide/bbFile0.png differ diff --git a/kernel/doc/bbtkUsersGuide/bbFiles.png b/kernel/doc/bbtkUsersGuide/bbFiles.png index 392947a..f1ad755 100644 Binary files a/kernel/doc/bbtkUsersGuide/bbFiles.png and b/kernel/doc/bbtkUsersGuide/bbFiles.png differ diff --git a/kernel/doc/bbtkUsersGuide/bbPackageBrowser.png b/kernel/doc/bbtkUsersGuide/bbPackageBrowser.png index da99e55..f1ad755 100644 Binary files a/kernel/doc/bbtkUsersGuide/bbPackageBrowser.png and b/kernel/doc/bbtkUsersGuide/bbPackageBrowser.png differ 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