-------------------------------------------------------------------------\r
- How to build the sources from SVN\r
-------------------------------------------------------------------------\r
-\r
-Please use the install.txt files in docs/gtk, docs/msw, docs/motif, docs/mac\r
-etc. alongside these instructions.\r
-\r
-I) Windows using plain makefiles\r
-----------------------------------------\r
-\r
-a) If using Microsoft Visual C++ 5.0 or 6.0\r
-\r
-Ensure that the command-line compiler and tools (including\r
-nmake) are installed and ready to run. Depending on your\r
-installation there may be a batch file (commonly named VCVARS32.BAT)\r
-that needs to be run to set correct environment variables and PATH entries.\r
-\r
-Continue with item c) below.\r
-\r
-\r
-b) If using the MinGW or Cygwin compilers\r
-\r
-You can get MinGW from http://www.mingw.org/\r
-\r
-Cygwin is available at http://www.cygwin.com/\r
-\r
-If you are using Cygwin or MinGW together with the MSYS environment, you\r
-can build the library using configure (see "Unix ports" and\r
-"Windows using configure" below). You can also\r
-build wxWidgets without configure using native makefile, but only with\r
-MinGW. Using Cygwin together with Windows makefile is no longer supported.\r
-\r
-If building with MinGW without configure:\r
-\r
--> Set your path so that it includes the directory\r
- where your compiler and tools reside\r
-\r
--> Make sure you have GNU Make installed. It must be Windows native version.\r
- Download it from http://www.mingw.org, the executable will be called\r
- mingw32-make.exe.\r
-\r
--> Modern version of MinGW is required; preferably MinGW 2.0 (with gcc3),\r
- but MinGW with gcc-2.95.3 will suffice. If you are using 2.95, you will\r
- have to change variable GCC_VERSION in config.gcc (see msw/install.txt\r
- for details).\r
-\r
-If using configure, Unix instructions apply.\r
-\r
-\r
-c) Build instructions\r
-\r
-Assuming that you installed the wxWidgets sources into c:\wxWidgets:\r
-\r
--> Copy c:\wxWidgets\include\wx\msw\setup0.h\r
- to c:\wxWidgets\include\wx\msw\setup.h\r
--> Edit c:\wxWidgets\include\wx\msw\setup.h to choose\r
- the features you would like to compile wxWidgets with[out].\r
-\r
- and std iostreams are disabled with\r
- #define wxUSE_STD_IOSTREAM 0\r
-\r
--> type: cd c:\wxWidgets\build\msw\r
--> type: make -f makefile.gcc (if using GNU tools)\r
-or type: nmake -f makefile.vc (if using MS VC++)\r
-etc.\r
-\r
- See also docs/msw/install.txt for additional compilation options.\r
-\r
-d) Borland (including free command line tools)\r
- Download tools from http://www.borland.com/downloads/\r
-\r
- See docs/msw/install.txt for details; in brief:\r
-\r
--> type cd c:\wxWidgets\build\msw\r
--> type make -f makefile.bcc\r
-\r
-You can customize many things in the build process, detailed description is\r
-in docs/msw/install.txt.\r
-\r
-\r
-II) Unix ports\r
---------------\r
-\r
-Building wxGTK or wxMotif completely without configure\r
-won't ever work, but there is now a new makefile system\r
-that works without libtool and automake, using only\r
-configure to create what is needed.\r
-\r
-In order to create configure, you need to have the\r
-GNU autoconf package (version > 2.54) installed\r
-on your system and type run "autoconf" in the base\r
-directory (or run the autogen.sh script in the same\r
-directory, which just calls autoconf). Note that you usually don't\r
-need to do this because configure is included in SVN.\r
-\r
-Set WXWIN environment variable to the base directory such\r
-as ~/wxWidgets (this is actually not really needed).\r
-\r
--> type: export WXWIN=~/wxWidgets\r
--> type: md mybuild\r
--> type: cd mybuild\r
--> type: ../configure --with-motif\r
-or type: ../configure --with-gtk\r
--> type: make\r
--> type: su <type root password>\r
--> type: make install\r
--> type: ldconfig\r
--> type: exit\r
-\r
-Call configure with --disable-shared to create a static\r
-library. Calling "make uninstall" will remove the installed\r
-library and "make dist" will create a distribution (not\r
-yet complete).\r
-\r
-III) Windows using configure\r
-----------------------------------------\r
-\r
-wxWidgets can be built on Windows using MSYS (see\r
-http://www.mingw.org/), which is a POSIX build environment\r
-for Windows. With MSYS you can just ./configure && make (see also VII,\r
-Unix->Windows cross-compiling using configure).\r
-\r
-Of course, you can also build the library using plain makefiles (see\r
-section I).\r
-\r
-V) MacOS X using configure and the Developer Tools\r
-----------------------------------------\r
-\r
-You need to have the Developer Tools installed. If this is not the case,\r
-you will need to register at the Apple Developer web site (this is a free\r
-registration) in order to download the Developer Tools installer.\r
-\r
-In order to create configure, you need to have the\r
-GNU autoconf package (version >= 2.54) installed\r
-on your system and type run "autoconf" in the base\r
-directory (or run the autogen.sh script in the same\r
-directory, which just calls autoconf).\r
-\r
--> type: mkdir macbuild\r
--> type: cd macbuild\r
--> type: ../configure --with-mac\r
-or type: ../configure\r
--> type: make\r
-\r
-VI) OS/2\r
-----------------------------------------\r
-No notes.\r
-\r
-VII) Unix->Windows cross-compiling using configure\r
---------------------------------------------------\r
-\r
-First you'll need a cross-compiler; linux glibc binaries of MinGW and\r
-Cygwin (both based on egcs) can be found at\r
-ftp://ftp.objsw.com/pub/crossgcc/linux-x-win32. Alternative binaries,\r
-based on the latest MinGW release can be found at\r
-http://members.telering.at/jessich/mingw/mingwcross/mingw_cross.html\r
-Otherwise you can compile one yourself.\r
-\r
-[ A Note about Cygwin and MinGW: the main difference is that Cygwin\r
-binaries are always linked against cygwin.dll. This dll encapsulates most\r
-standard Unix C extensions, which is very handy if you're porting unix\r
-software to windows. However, wxMSW doesn't need this, so MinGW is\r
-preferable if you write portable C(++). ]\r
-\r
-You might want to build both Unix and Windows binaries in the same source\r
-tree; to do this make subdirs for each e.g. unix and win32. If you've\r
-already build wxWidgets in the main dir, do a 'make distclean' there,\r
-otherwise configure will get confused. (In any case, read the section 'Unix\r
-using configure' and make sure you're able to build a native wxWidgets\r
-library; cross-compiling errors can be pretty obscure and you'll want to be\r
-sure that your configure setup is basically sound.)\r
-\r
-To cross compile the windows library, do\r
--> cd win32\r
-(or whatever you called it)\r
-Now run configure. There are two ways to do this\r
--> ../configure --host=i586-mingw32 --build=i586-linux --with-mingw\r
-where --build= should read whatever platform you're building on. Configure\r
-will notice that build and host platforms differ, and automatically prepend\r
-i586-mingw32- to gcc, ar, ld, etc (make sure they're in the PATH!).\r
-The other way to run configure is by specifying the names of the binaries\r
-yourself:\r
--> CC=i586-mingw32-gcc CXX=i586-mingw32-g++ RANLIB=i586-mingw32-ranlib \\r
- DLLTOOL=i586-mingw32-dlltool LD=i586-mingw32-ld NM=i586-mingw32-nm \\r
- ../configure --host=i586-mingw32 --with-mingw\r
-\r
-(all assuming you're using MinGW)\r
-By default this will compile a DLL, if you want a static library,\r
-specify --disable-shared.\r
-\r
-Type\r
--> make\r
-and wait, wait, wait. Don't leave the room, because the minute you do there\r
-will be a compile error :-)\r
-\r
-NB: if you are using a very old compiler you risk to get quite a few warnings\r
- about "ANSI C++ forbids implicit conversion from 'void *'" in all places\r
- where va_arg macro is used. This is due to a bug in (some versions of)\r
- MinGW headers which may be corrected by upgrading your compier,\r
- otherwise you might edit the file\r
-\r
- ${install_prefix}/lib/gcc-lib/i586-mingw32/egcs-2.91.57/include/stdarg.h\r
-\r
- (instead of egcs-2.91.57 you may have something different), searching for\r
- the lines\r
-\r
-/* Define __gnuc_va_list. */\r
-\r
-#ifndef __GNUC_VA_LIST\r
-#define __GNUC_VA_LIST\r
-#if defined(__svr4__) || defined(_AIX) || defined(_M_UNIX) || defined(__NetBSD__)\r
-typedef char *__gnuc_va_list;\r
-#else\r
-typedef void *__gnuc_va_list;\r
-#endif\r
-#endif\r
-\r
- and adding "|| defined(_WIN32)" to the list of platforms on which\r
- __gnuc_va_list is char *.\r
-\r
-If this is successful, you end up with a wx23_2.dll/libwx23_2.a in win32/lib\r
-(or just libwx_msw.a if you opted for a static build).\r
-Now try building the minimal sample:\r
-\r
--> cd samples/minimal\r
--> make\r
-\r
-and run it with wine, for example (or copy to a Windows box)\r
--> wine minimal.exe\r
-\r
-If all is well, do an install; from win32\r
--> make install\r
-\r
-Native and cross-compiled installations can co-exist peacefully\r
-(as long as their widget sets differ), except for wx-config. You might\r
-want to rename the cross-compiled one to i586-mingw32-wx-config, or something.\r
-\r
-Cross-compiling TODO:\r
----------------------\r
-- resource compiling must be done manually for now (should/can we link the\r
-default wx resources into libwx_msw.a?) [ No we can't; the linker won't\r
-link it in... you have to supply an object file ]\r
-- static executables are HUGE -- there must be room for improvement.\r
-\r
+------------------------------------------------------------------------
+ How to build the sources from SVN
+------------------------------------------------------------------------
+
+Please use the install.txt files in docs/gtk, docs/msw, docs/motif, docs/mac
+etc. alongside these instructions.
+
+I) Windows using plain makefiles
+----------------------------------------
+
+a) If using Microsoft Visual C++ 5.0 or 6.0
+
+Ensure that the command-line compiler and tools (including
+nmake) are installed and ready to run. Depending on your
+installation there may be a batch file (commonly named VCVARS32.BAT)
+that needs to be run to set correct environment variables and PATH entries.
+
+Continue with item c) below.
+
+
+b) If using the MinGW or Cygwin compilers
+
+You can get MinGW from http://www.mingw.org/
+
+Cygwin is available at http://www.cygwin.com/
+
+If you are using Cygwin or MinGW together with the MSYS environment, you
+can build the library using configure (see "Unix ports" and
+"Windows using configure" below). You can also
+build wxWidgets without configure using native makefile, but only with
+MinGW. Using Cygwin together with Windows makefile is no longer supported.
+
+If building with MinGW without configure:
+
+-> Set your path so that it includes the directory
+ where your compiler and tools reside
+
+-> Make sure you have GNU Make installed. It must be Windows native version.
+ Download it from http://www.mingw.org, the executable will be called
+ mingw32-make.exe.
+
+-> Modern version of MinGW is required; preferably MinGW 2.0 (with gcc3),
+ but MinGW with gcc-2.95.3 will suffice. If you are using 2.95, you will
+ have to change variable GCC_VERSION in config.gcc (see msw/install.txt
+ for details).
+
+If using configure, Unix instructions apply.
+
+
+c) Build instructions
+
+Assuming that you installed the wxWidgets sources into c:\wxWidgets:
+
+-> Copy c:\wxWidgets\include\wx\msw\setup0.h
+ to c:\wxWidgets\include\wx\msw\setup.h
+-> Edit c:\wxWidgets\include\wx\msw\setup.h to choose
+ the features you would like to compile wxWidgets with[out].
+
+ and std iostreams are disabled with
+ #define wxUSE_STD_IOSTREAM 0
+
+-> type: cd c:\wxWidgets\build\msw
+-> type: make -f makefile.gcc (if using GNU tools)
+or type: nmake -f makefile.vc (if using MS VC++)
+etc.
+
+ See also docs/msw/install.txt for additional compilation options.
+
+d) Borland (including free command line tools)
+ Download tools from http://www.borland.com/downloads/
+
+ See docs/msw/install.txt for details; in brief:
+
+-> type cd c:\wxWidgets\build\msw
+-> type make -f makefile.bcc
+
+You can customize many things in the build process, detailed description is
+in docs/msw/install.txt.
+
+
+II) Unix ports
+--------------
+
+Building wxGTK or wxMotif completely without configure
+won't ever work, but there is now a new makefile system
+that works without libtool and automake, using only
+configure to create what is needed.
+
+In order to create configure, you need to have the
+GNU autoconf package (version > 2.54) installed
+on your system and type run "autoconf" in the base
+directory (or run the autogen.sh script in the same
+directory, which just calls autoconf). Note that you usually don't
+need to do this because configure is included in SVN.
+
+Set WXWIN environment variable to the base directory such
+as ~/wxWidgets (this is actually not really needed).
+
+-> type: export WXWIN=~/wxWidgets
+-> type: md mybuild
+-> type: cd mybuild
+-> type: ../configure --with-motif
+or type: ../configure --with-gtk
+-> type: make
+-> type: su <type root password>
+-> type: make install
+-> type: ldconfig
+-> type: exit
+
+Call configure with --disable-shared to create a static
+library. Calling "make uninstall" will remove the installed
+library and "make dist" will create a distribution (not
+yet complete).
+
+III) Windows using configure
+----------------------------------------
+
+wxWidgets can be built on Windows using MSYS (see
+http://www.mingw.org/), which is a POSIX build environment
+for Windows. With MSYS you can just ./configure && make (see also VII,
+Unix->Windows cross-compiling using configure).
+
+Of course, you can also build the library using plain makefiles (see
+section I).
+
+V) MacOS X using configure and the Developer Tools
+----------------------------------------
+
+You need to have the Developer Tools installed. If this is not the case,
+you will need to register at the Apple Developer web site (this is a free
+registration) in order to download the Developer Tools installer.
+
+In order to create configure, you need to have the
+GNU autoconf package (version >= 2.54) installed
+on your system and type run "autoconf" in the base
+directory (or run the autogen.sh script in the same
+directory, which just calls autoconf).
+
+-> type: mkdir macbuild
+-> type: cd macbuild
+-> type: ../configure --with-mac
+or type: ../configure
+-> type: make
+
+VI) OS/2
+----------------------------------------
+No notes.
+
+VII) Unix->Windows cross-compiling using configure
+--------------------------------------------------
+
+First you'll need a cross-compiler; linux glibc binaries of MinGW and
+Cygwin (both based on egcs) can be found at
+ftp://ftp.objsw.com/pub/crossgcc/linux-x-win32. Alternative binaries,
+based on the latest MinGW release can be found at
+http://members.telering.at/jessich/mingw/mingwcross/mingw_cross.html
+Otherwise you can compile one yourself.
+
+[ A Note about Cygwin and MinGW: the main difference is that Cygwin
+binaries are always linked against cygwin.dll. This dll encapsulates most
+standard Unix C extensions, which is very handy if you're porting unix
+software to windows. However, wxMSW doesn't need this, so MinGW is
+preferable if you write portable C(++). ]
+
+You might want to build both Unix and Windows binaries in the same source
+tree; to do this make subdirs for each e.g. unix and win32. If you've
+already build wxWidgets in the main dir, do a 'make distclean' there,
+otherwise configure will get confused. (In any case, read the section 'Unix
+using configure' and make sure you're able to build a native wxWidgets
+library; cross-compiling errors can be pretty obscure and you'll want to be
+sure that your configure setup is basically sound.)
+
+To cross compile the windows library, do
+-> cd win32
+(or whatever you called it)
+Now run configure. There are two ways to do this
+-> ../configure --host=i586-mingw32 --build=i586-linux --with-mingw
+where --build= should read whatever platform you're building on. Configure
+will notice that build and host platforms differ, and automatically prepend
+i586-mingw32- to gcc, ar, ld, etc (make sure they're in the PATH!).
+The other way to run configure is by specifying the names of the binaries
+yourself:
+-> CC=i586-mingw32-gcc CXX=i586-mingw32-g++ RANLIB=i586-mingw32-ranlib \
+ DLLTOOL=i586-mingw32-dlltool LD=i586-mingw32-ld NM=i586-mingw32-nm \
+ ../configure --host=i586-mingw32 --with-mingw
+
+(all assuming you're using MinGW)
+By default this will compile a DLL, if you want a static library,
+specify --disable-shared.
+
+Type
+-> make
+and wait, wait, wait. Don't leave the room, because the minute you do there
+will be a compile error :-)
+
+NB: if you are using a very old compiler you risk to get quite a few warnings
+ about "ANSI C++ forbids implicit conversion from 'void *'" in all places
+ where va_arg macro is used. This is due to a bug in (some versions of)
+ MinGW headers which may be corrected by upgrading your compier,
+ otherwise you might edit the file
+
+ ${install_prefix}/lib/gcc-lib/i586-mingw32/egcs-2.91.57/include/stdarg.h
+
+ (instead of egcs-2.91.57 you may have something different), searching for
+ the lines
+
+/* Define __gnuc_va_list. */
+
+#ifndef __GNUC_VA_LIST
+#define __GNUC_VA_LIST
+#if defined(__svr4__) || defined(_AIX) || defined(_M_UNIX) || defined(__NetBSD__)
+typedef char *__gnuc_va_list;
+#else
+typedef void *__gnuc_va_list;
+#endif
+#endif
+
+ and adding "|| defined(_WIN32)" to the list of platforms on which
+ __gnuc_va_list is char *.
+
+If this is successful, you end up with a wx23_2.dll/libwx23_2.a in win32/lib
+(or just libwx_msw.a if you opted for a static build).
+Now try building the minimal sample:
+
+-> cd samples/minimal
+-> make
+
+and run it with wine, for example (or copy to a Windows box)
+-> wine minimal.exe
+
+If all is well, do an install; from win32
+-> make install
+
+Native and cross-compiled installations can co-exist peacefully
+(as long as their widget sets differ), except for wx-config. You might
+want to rename the cross-compiled one to i586-mingw32-wx-config, or something.
+
+Cross-compiling TODO:
+---------------------
+- resource compiling must be done manually for now (should/can we link the
+default wx resources into libwx_msw.a?) [ No we can't; the linker won't
+link it in... you have to supply an object file ]
+- static executables are HUGE -- there must be room for improvement.
+
-/*****************************************************************************\r
- ** Name: wxwidgets.js\r
+/*****************************************************************************
+ ** Name: wxwidgets.js
** Purpose: The wxWidgets documentation javascript
** Author: Doxygen team
** RCS-ID: $Id$
*****************************************************************************/
// from w3schools
-function getCookie(c_name)\r
-{\r
- if (document.cookie.length>0)\r
- {\r
- c_start=document.cookie.indexOf(c_name + "=");\r
- if (c_start!=-1)\r
- {\r
- c_start=c_start + c_name.length+1;\r
- c_end=document.cookie.indexOf(";",c_start);\r
- if (c_end==-1) c_end=document.cookie.length;\r
- return unescape(document.cookie.substring(c_start,c_end));\r
- }\r
- }\r
- return "";\r
-}\r
-// from w3schools\r
-function setCookie(c_name,value,expiredays)\r
-{\r
- var exdate=new Date();\r
- exdate.setDate(exdate.getDate()+expiredays);\r
- document.cookie=c_name+ '=' +escape(value)+\r
- ((expiredays==null) ? '' : ';expires='+exdate.toGMTString());\r
-}\r
-\r
-// Reimplementation of changeDisplayState\r
-function mychangeDisplayState( e )\r
-{\r
- var num=this.id.replace(/[^[0-9]/g,'');\r
- var button=this.firstChild;\r
- var sectionDiv=document.getElementById('dynsection'+num);\r
- if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){\r
- sectionDiv.style.display='block';\r
- button.src='open.gif';\r
- }else{\r
- sectionDiv.style.display='none';\r
- button.src='closed.gif';\r
- }\r
-\r
- setCookie( 'sectionDiv.style.display', sectionDiv.style.display );\r
-\r
-}\r
-\r
-window.onload = function myinitDynSections()\r
-{\r
- var divs=document.getElementsByTagName('div');\r
- var sectionCounter=1;\r
- for(var i=0;i<divs.length-1;i++){\r
- if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){\r
- var header=divs[i];\r
- var section=divs[i+1];\r
- var button=header.firstChild;\r
- if (button!='IMG'){\r
- divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);\r
- button=document.createElement('img');\r
- divs[i].insertBefore(button,divs[i].firstChild);\r
- }\r
- header.style.cursor='pointer';\r
- header.onclick=mychangeDisplayState;\r
- header.id='dynheader'+sectionCounter;\r
- section.id='dynsection'+sectionCounter;\r
-\r
- var display = getCookie( 'sectionDiv.style.display' );\r
- if ( display == '' || display == 'block' ){\r
- section.style.display='block'; // default\r
- button.src='open.gif';\r
- }else{\r
- section.style.display='none';\r
- button.src='closed.gif';\r
- }\r
- setCookie( 'sectionDiv.style.display', section.style.display );\r
-\r
- section.style.marginLeft='14px';\r
- sectionCounter++;\r
- }\r
- }\r
-}\r
+function getCookie(c_name)
+{
+ if (document.cookie.length>0)
+ {
+ c_start=document.cookie.indexOf(c_name + "=");
+ if (c_start!=-1)
+ {
+ c_start=c_start + c_name.length+1;
+ c_end=document.cookie.indexOf(";",c_start);
+ if (c_end==-1) c_end=document.cookie.length;
+ return unescape(document.cookie.substring(c_start,c_end));
+ }
+ }
+ return "";
+}
+// from w3schools
+function setCookie(c_name,value,expiredays)
+{
+ var exdate=new Date();
+ exdate.setDate(exdate.getDate()+expiredays);
+ document.cookie=c_name+ '=' +escape(value)+
+ ((expiredays==null) ? '' : ';expires='+exdate.toGMTString());
+}
+
+// Reimplementation of changeDisplayState
+function mychangeDisplayState( e )
+{
+ var num=this.id.replace(/[^[0-9]/g,'');
+ var button=this.firstChild;
+ var sectionDiv=document.getElementById('dynsection'+num);
+ if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
+ sectionDiv.style.display='block';
+ button.src='open.gif';
+ }else{
+ sectionDiv.style.display='none';
+ button.src='closed.gif';
+ }
+
+ setCookie( 'sectionDiv.style.display', sectionDiv.style.display );
+
+}
+
+window.onload = function myinitDynSections()
+{
+ var divs=document.getElementsByTagName('div');
+ var sectionCounter=1;
+ for(var i=0;i<divs.length-1;i++){
+ if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
+ var header=divs[i];
+ var section=divs[i+1];
+ var button=header.firstChild;
+ if (button!='IMG'){
+ divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
+ button=document.createElement('img');
+ divs[i].insertBefore(button,divs[i].firstChild);
+ }
+ header.style.cursor='pointer';
+ header.onclick=mychangeDisplayState;
+ header.id='dynheader'+sectionCounter;
+ section.id='dynsection'+sectionCounter;
+
+ var display = getCookie( 'sectionDiv.style.display' );
+ if ( display == '' || display == 'block' ){
+ section.style.display='block'; // default
+ button.src='open.gif';
+ }else{
+ section.style.display='none';
+ button.src='closed.gif';
+ }
+ setCookie( 'sectionDiv.style.display', section.style.display );
+
+ section.style.marginLeft='14px';
+ sectionCounter++;
+ }
+ }
+}
- How to add a new XRC handler\r
- ============================\r
-\r
-0. Purpose\r
-----------\r
-\r
-This note describes what needs to be done to add a new XRC handler, i.e. add\r
-support for loading the objects of some class wxFoo from XRC.\r
-\r
-\r
-1. Implement the handler\r
-------------------------\r
-\r
-By convention, the XRC handler for a class wxFoo declared in wx/foo.h is called\r
-wxFooXmlHandler and is declared in the file wx/xrc/xh_foo.h (this last rule\r
-wasn't always respected in the past, however it's not a reason to not respect\r
-it in the future). The steps for adding a new handler are:\r
-\r
-a) Add handler declaration in include/wx/xrc/xh_foo.h, it will usually be the\r
- same as in the other files so you can get inspiration for your brand new\r
- handler from e.g. wx/xrc/xh_srchctrl.h. Notice the use of wxUSE_FOO if wxFoo\r
- is guarded by this symbol.\r
-\r
-b) Add implementation in src/xrc/xh_foo.cpp: again, it will be almost always\r
- very similar to the existing controls. You will need to add support for\r
- the control-specific styles.\r
-\r
-\r
-2. Update the other files\r
--------------------------\r
-\r
-There are a few other files to update to make wxWidgets aware of the new\r
-handler:\r
-\r
-a) Add the new files created above to build/bakefiles/files.bkl: search for\r
- "xh_srchctrl" to see where you need to add them\r
-\r
-b) Add #include "wx/xrc/xh_foo.h" to wx/xrc/xh_all.h.\r
-\r
-c) Register the new handler in wxXmlResource::InitAllHandlers() in\r
- src/xrc/xmlrsall.cpp\r
-\r
-\r
-3. Update the sample\r
---------------------\r
-\r
-Demonstrate that the new handler works by adding a control using it to\r
-samples/xrc/rc/controls.xrc.\r
-\r
-\r
-=== EOF ===\r
-\r
-Author: VZ\r
-Version: $Id: tn0021.txt 47865 2007-08-03 20:00:32Z VZ $\r
-\r
+ How to add a new XRC handler
+ ============================
+
+0. Purpose
+----------
+
+This note describes what needs to be done to add a new XRC handler, i.e. add
+support for loading the objects of some class wxFoo from XRC.
+
+
+1. Implement the handler
+------------------------
+
+By convention, the XRC handler for a class wxFoo declared in wx/foo.h is called
+wxFooXmlHandler and is declared in the file wx/xrc/xh_foo.h (this last rule
+wasn't always respected in the past, however it's not a reason to not respect
+it in the future). The steps for adding a new handler are:
+
+a) Add handler declaration in include/wx/xrc/xh_foo.h, it will usually be the
+ same as in the other files so you can get inspiration for your brand new
+ handler from e.g. wx/xrc/xh_srchctrl.h. Notice the use of wxUSE_FOO if wxFoo
+ is guarded by this symbol.
+
+b) Add implementation in src/xrc/xh_foo.cpp: again, it will be almost always
+ very similar to the existing controls. You will need to add support for
+ the control-specific styles.
+
+
+2. Update the other files
+-------------------------
+
+There are a few other files to update to make wxWidgets aware of the new
+handler:
+
+a) Add the new files created above to build/bakefiles/files.bkl: search for
+ "xh_srchctrl" to see where you need to add them
+
+b) Add #include "wx/xrc/xh_foo.h" to wx/xrc/xh_all.h.
+
+c) Register the new handler in wxXmlResource::InitAllHandlers() in
+ src/xrc/xmlrsall.cpp
+
+
+3. Update the sample
+--------------------
+
+Demonstrate that the new handler works by adding a control using it to
+samples/xrc/rc/controls.xrc.
+
+
+=== EOF ===
+
+Author: VZ
+Version: $Id: tn0021.txt 47865 2007-08-03 20:00:32Z VZ $
+
WXUNUSED+
-WXDLLEXPORT\r
-WXDLLIMPEXP_ADV\r
-WXDLLIMPEXP_DATA_ADV+\r
-WXDLLIMPEXP_FWD_ADV\r
-WXDLLIMPEXP_AUI\r
-WXDLLIMPEXP_DATA_AUI+\r
-WXDLLIMPEXP_FWD_AUI\r
-WXDLLIMPEXP_BASE\r
-WXDLLIMPEXP_DATA_BASE+\r
-WXDLLIMPEXP_FWD_BASE\r
-WXDLLIMPEXP_CORE\r
-WXDLLIMPEXP_DATA_CORE+\r
-WXDLLIMPEXP_FWD_CORE\r
-WXDLLIMPEXP_NET\r
-WXDLLIMPEXP_MEDIA\r
-WXDLLIMPEXP_DATA_MEDIA+\r
-WXDLLIMPEXP_FWD_MEDIA\r
-WXDLLIMPEXP_DATA_NET+\r
-WXDLLIMPEXP_FWD_NET\r
-WXDLLIMPEXP_HTML\r
-WXDLLIMPEXP_DATA_HTML+\r
-WXDLLIMPEXP_FWD_HTML\r
-WXDLLIMPEXP_GL\r
-WXDLLIMPEXP_DATA_GL+\r
-WXDLLIMPEXP_FWD_GL\r
-WXDLLIMPEXP_QA\r
-WXDLLIMPEXP_DATA_QA+\r
-WXDLLIMPEXP_FWD_QA\r
-WXDLLIMPEXP_XML\r
-WXDLLIMPEXP_DATA_XML+\r
-WXDLLIMPEXP_FWD_XML\r
-WXDLLIMPEXP_XRC\r
-WXDLLIMPEXP_DATA_XRC+\r
-WXDLLIMPEXP_FWD_XRC\r
-WXDLLIMPEXP_PROPGRID\r
-WXDLLIMPEXP_DATA_PROPGRID+\r
-WXDLLIMPEXP_FWD_PROPGRID\r
-WXDLLIMPEXP_RICHTEXT\r
-WXDLLIMPEXP_DATA_RICHTEXT+\r
-WXDLLIMPEXP_FWD_RICHTEXT\r
+WXDLLEXPORT
+WXDLLIMPEXP_ADV
+WXDLLIMPEXP_DATA_ADV+
+WXDLLIMPEXP_FWD_ADV
+WXDLLIMPEXP_AUI
+WXDLLIMPEXP_DATA_AUI+
+WXDLLIMPEXP_FWD_AUI
+WXDLLIMPEXP_BASE
+WXDLLIMPEXP_DATA_BASE+
+WXDLLIMPEXP_FWD_BASE
+WXDLLIMPEXP_CORE
+WXDLLIMPEXP_DATA_CORE+
+WXDLLIMPEXP_FWD_CORE
+WXDLLIMPEXP_NET
+WXDLLIMPEXP_MEDIA
+WXDLLIMPEXP_DATA_MEDIA+
+WXDLLIMPEXP_FWD_MEDIA
+WXDLLIMPEXP_DATA_NET+
+WXDLLIMPEXP_FWD_NET
+WXDLLIMPEXP_HTML
+WXDLLIMPEXP_DATA_HTML+
+WXDLLIMPEXP_FWD_HTML
+WXDLLIMPEXP_GL
+WXDLLIMPEXP_DATA_GL+
+WXDLLIMPEXP_FWD_GL
+WXDLLIMPEXP_QA
+WXDLLIMPEXP_DATA_QA+
+WXDLLIMPEXP_FWD_QA
+WXDLLIMPEXP_XML
+WXDLLIMPEXP_DATA_XML+
+WXDLLIMPEXP_FWD_XML
+WXDLLIMPEXP_XRC
+WXDLLIMPEXP_DATA_XRC+
+WXDLLIMPEXP_FWD_XRC
+WXDLLIMPEXP_PROPGRID
+WXDLLIMPEXP_DATA_PROPGRID+
+WXDLLIMPEXP_FWD_PROPGRID
+WXDLLIMPEXP_RICHTEXT
+WXDLLIMPEXP_DATA_RICHTEXT+
+WXDLLIMPEXP_FWD_RICHTEXT
-<?xml version="1.0" ?>\r
-<makefile>\r
-\r
- <include file="../../build/bakefiles/common_samples.bkl"/>\r
-\r
- <exe id="wrapsizer" template="wx_sample" template_append="wx_append">\r
- <sources>wrapsizer.cpp</sources>\r
- <wx-lib>core</wx-lib>\r
- <wx-lib>base</wx-lib>\r
- </exe>\r
-\r
-</makefile>\r
+<?xml version="1.0" ?>
+<makefile>
+
+ <include file="../../build/bakefiles/common_samples.bkl"/>
+
+ <exe id="wrapsizer" template="wx_sample" template_append="wx_append">
+ <sources>wrapsizer.cpp</sources>
+ <wx-lib>core</wx-lib>
+ <wx-lib>base</wx-lib>
+ </exe>
+
+</makefile>
-///////////////////////////////////////////////////////////////////////////////\r
-// Name: os2/snglinst.cpp\r
-// Purpose: implements wxSingleInstanceChecker class for OS/2 using\r
-// named mutexes\r
-// Author: Vadim Zeitlin\r
-// Modified by: Lauri Nurmi (modified for OS/2)\r
+///////////////////////////////////////////////////////////////////////////////
+// Name: os2/snglinst.cpp
+// Purpose: implements wxSingleInstanceChecker class for OS/2 using
+// named mutexes
+// Author: Vadim Zeitlin
+// Modified by: Lauri Nurmi (modified for OS/2)
// Created: 08.02.2009
// RCS-ID: $Id$
// Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
-// declarations\r
-// ============================================================================\r
-\r
-// ----------------------------------------------------------------------------\r
-// headers\r
-// ----------------------------------------------------------------------------\r
-\r
-// For compilers that support precompilation, includes "wx.h".\r
-#include "wx/wxprec.h"\r
-\r
-#ifdef __BORLANDC__\r
- #pragma hdrstop\r
-#endif\r
-\r
-#if wxUSE_SNGLINST_CHECKER\r
-\r
-#ifndef WX_PRECOMP\r
- #include "wx/string.h"\r
- #include "wx/log.h"\r
-#endif //WX_PRECOMP\r
-\r
-#include "wx/snglinst.h"\r
-\r
-#define INCL_DOSSEMAPHORES\r
-#define INCL_DOSERRORS\r
-#include <os2.h>\r
-\r
-#include "wx/os2/private.h"\r
-\r
-// ----------------------------------------------------------------------------\r
-// wxSingleInstanceCheckerImpl: the real implementation class\r
-// ----------------------------------------------------------------------------\r
-\r
-class WXDLLEXPORT wxSingleInstanceCheckerImpl\r
-{\r
-public:\r
- wxSingleInstanceCheckerImpl()\r
- {\r
- m_hMutex = NULL;\r
- m_anotherRunning = false;\r
- }\r
-\r
- bool Create(const wxString& name)\r
- {\r
- wxString semName;\r
- semName.Printf(wxT("\\SEM32\\%s"), name.c_str());\r
- int rc = DosCreateMutexSem(semName.c_str(), &m_hMutex, DC_SEM_SHARED, 1);\r
-\r
- if ( rc == NO_ERROR ) {\r
- m_anotherRunning = false;\r
- return true;\r
- } else if ( rc == ERROR_DUPLICATE_NAME ) {\r
- m_anotherRunning = true;\r
- return true;\r
- } else {\r
- m_anotherRunning = false; // we don't know for sure in this case\r
- wxLogLastError(wxT("DosCreateMutexSem"));\r
- return false;\r
- }\r
- }\r
-\r
- bool IsAnotherRunning() const\r
- {\r
- return m_anotherRunning;\r
- }\r
-\r
- ~wxSingleInstanceCheckerImpl()\r
- {\r
- if ( m_hMutex )\r
- {\r
- if ( !::DosCloseMutexSem(m_hMutex) )\r
- {\r
- wxLogLastError(wxT("DosCloseMutexSem"));\r
- }\r
- }\r
- }\r
-\r
-private:\r
- // if true, creating the mutex either succeeded\r
- // or we know it failed because another app is running.\r
- bool m_anotherRunning;\r
-\r
- // the mutex handle, may be NULL\r
- HMTX m_hMutex;\r
-\r
- DECLARE_NO_COPY_CLASS(wxSingleInstanceCheckerImpl)\r
-};\r
-\r
-// ============================================================================\r
-// wxSingleInstanceChecker implementation\r
-// ============================================================================\r
-\r
-bool wxSingleInstanceChecker::Create(const wxString& name,\r
- const wxString& WXUNUSED(path))\r
-{\r
- wxASSERT_MSG( !m_impl,\r
- wxT("calling wxSingleInstanceChecker::Create() twice?") );\r
-\r
- // creating unnamed mutex doesn't have the same semantics!\r
- wxASSERT_MSG( !name.empty(), wxT("mutex name can't be empty") );\r
-\r
- m_impl = new wxSingleInstanceCheckerImpl;\r
-\r
- return m_impl->Create(name);\r
-}\r
-\r
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#if wxUSE_SNGLINST_CHECKER
+
+#ifndef WX_PRECOMP
+ #include "wx/string.h"
+ #include "wx/log.h"
+#endif //WX_PRECOMP
+
+#include "wx/snglinst.h"
+
+#define INCL_DOSSEMAPHORES
+#define INCL_DOSERRORS
+#include <os2.h>
+
+#include "wx/os2/private.h"
+
+// ----------------------------------------------------------------------------
+// wxSingleInstanceCheckerImpl: the real implementation class
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxSingleInstanceCheckerImpl
+{
+public:
+ wxSingleInstanceCheckerImpl()
+ {
+ m_hMutex = NULL;
+ m_anotherRunning = false;
+ }
+
+ bool Create(const wxString& name)
+ {
+ wxString semName;
+ semName.Printf(wxT("\\SEM32\\%s"), name.c_str());
+ int rc = DosCreateMutexSem(semName.c_str(), &m_hMutex, DC_SEM_SHARED, 1);
+
+ if ( rc == NO_ERROR ) {
+ m_anotherRunning = false;
+ return true;
+ } else if ( rc == ERROR_DUPLICATE_NAME ) {
+ m_anotherRunning = true;
+ return true;
+ } else {
+ m_anotherRunning = false; // we don't know for sure in this case
+ wxLogLastError(wxT("DosCreateMutexSem"));
+ return false;
+ }
+ }
+
+ bool IsAnotherRunning() const
+ {
+ return m_anotherRunning;
+ }
+
+ ~wxSingleInstanceCheckerImpl()
+ {
+ if ( m_hMutex )
+ {
+ if ( !::DosCloseMutexSem(m_hMutex) )
+ {
+ wxLogLastError(wxT("DosCloseMutexSem"));
+ }
+ }
+ }
+
+private:
+ // if true, creating the mutex either succeeded
+ // or we know it failed because another app is running.
+ bool m_anotherRunning;
+
+ // the mutex handle, may be NULL
+ HMTX m_hMutex;
+
+ DECLARE_NO_COPY_CLASS(wxSingleInstanceCheckerImpl)
+};
+
+// ============================================================================
+// wxSingleInstanceChecker implementation
+// ============================================================================
+
+bool wxSingleInstanceChecker::Create(const wxString& name,
+ const wxString& WXUNUSED(path))
+{
+ wxASSERT_MSG( !m_impl,
+ wxT("calling wxSingleInstanceChecker::Create() twice?") );
+
+ // creating unnamed mutex doesn't have the same semantics!
+ wxASSERT_MSG( !name.empty(), wxT("mutex name can't be empty") );
+
+ m_impl = new wxSingleInstanceCheckerImpl;
+
+ return m_impl->Create(name);
+}
+
bool wxSingleInstanceChecker::DoIsAnotherRunning() const
-{\r
- wxCHECK_MSG( m_impl, false, wxT("must call Create() first") );\r
-\r
- return m_impl->IsAnotherRunning();\r
-}\r
-\r
-wxSingleInstanceChecker::~wxSingleInstanceChecker()\r
-{\r
- delete m_impl;\r
-}\r
-\r
-#endif // wxUSE_SNGLINST_CHECKER\r
+{
+ wxCHECK_MSG( m_impl, false, wxT("must call Create() first") );
+
+ return m_impl->IsAnotherRunning();
+}
+
+wxSingleInstanceChecker::~wxSingleInstanceChecker()
+{
+ delete m_impl;
+}
+
+#endif // wxUSE_SNGLINST_CHECKER
-///////////////////////////////////////////////////////////////////////////////\r
-// Name: tests/controls/label.cpp\r
-// Purpose: wxControl and wxStaticText label tests\r
-// Author: Francesco Montorsi\r
-// Created: 2010-3-21\r
-// RCS-ID: $Id$\r
-// Copyright: (c) 2010 Francesco Montorsi\r
-///////////////////////////////////////////////////////////////////////////////\r
-\r
-// ----------------------------------------------------------------------------\r
-// headers\r
-// ----------------------------------------------------------------------------\r
-\r
-#include "testprec.h"\r
-\r
-#ifdef __BORLANDC__\r
- #pragma hdrstop\r
-#endif\r
-\r
-#ifndef WX_PRECOMP\r
- #include "wx/app.h"\r
-#endif // WX_PRECOMP\r
-\r
-#include "wx/control.h"\r
-#include "wx/stattext.h"\r
-#include "wx/checkbox.h"\r
-\r
-// ----------------------------------------------------------------------------\r
-// test class\r
-// ----------------------------------------------------------------------------\r
-\r
-class LabelTestCase : public CppUnit::TestCase\r
-{\r
-public:\r
- LabelTestCase() { }\r
-\r
- virtual void setUp();\r
- virtual void tearDown();\r
-\r
-private:\r
- CPPUNIT_TEST_SUITE( LabelTestCase );\r
- CPPUNIT_TEST( GetLabel );\r
- CPPUNIT_TEST( GetLabelText );\r
- CPPUNIT_TEST( Statics );\r
- CPPUNIT_TEST_SUITE_END();\r
-\r
- void GetLabel();\r
- void GetLabelText();\r
- void Statics();\r
-\r
- wxStaticText *m_st, *m_stWithMarkup;\r
-\r
- // we cannot test wxControl directly (it's abstract) so we rather test wxCheckBox\r
- wxCheckBox *m_cb;\r
-\r
- DECLARE_NO_COPY_CLASS(LabelTestCase)\r
-};\r
-\r
-// register in the unnamed registry so that these tests are run by default\r
-CPPUNIT_TEST_SUITE_REGISTRATION( LabelTestCase );\r
-\r
-// also include in it's own registry so that these tests can be run alone\r
-CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( LabelTestCase, "LabelTestCase" );\r
-\r
-// ----------------------------------------------------------------------------\r
-// test initialization\r
-// ----------------------------------------------------------------------------\r
-\r
-#define ORIGINAL_LABEL "original label"\r
-\r
-void LabelTestCase::setUp()\r
-{\r
- m_st = new wxStaticText(wxTheApp->GetTopWindow(), wxID_ANY, ORIGINAL_LABEL);\r
- m_stWithMarkup = new wxStaticText(wxTheApp->GetTopWindow(), wxID_ANY, ORIGINAL_LABEL,\r
- wxDefaultPosition, wxDefaultSize, wxST_MARKUP);\r
-\r
- m_cb = new wxCheckBox(wxTheApp->GetTopWindow(), wxID_ANY, ORIGINAL_LABEL);\r
-\r
- CPPUNIT_ASSERT_EQUAL( ORIGINAL_LABEL, m_st->GetLabel() );\r
- CPPUNIT_ASSERT_EQUAL( ORIGINAL_LABEL, m_stWithMarkup->GetLabel() );\r
- CPPUNIT_ASSERT_EQUAL( ORIGINAL_LABEL, m_cb->GetLabel() );\r
-}\r
-\r
-void LabelTestCase::tearDown()\r
-{\r
- wxDELETE(m_st);\r
- wxDELETE(m_stWithMarkup);\r
- wxDELETE(m_cb);\r
-}\r
-\r
-// ----------------------------------------------------------------------------\r
-// the tests themselves\r
-// ----------------------------------------------------------------------------\r
-\r
-#define SET_LABEL(str) \\r
- m_st->SetLabel(str); \\r
- m_stWithMarkup->SetLabel(str); \\r
- m_cb->SetLabel(str);\r
-\r
-#define SET_LABEL_TEXT(str) \\r
- m_st->SetLabelText(str); \\r
- m_stWithMarkup->SetLabelText(str); \\r
- m_cb->SetLabelText(str);\r
-\r
-void LabelTestCase::GetLabel()\r
-{\r
- const wxString testLabelArray[] = {\r
- "label without mnemonics and markup",\r
- "label with &mnemonic",\r
- "label with <span foreground='blue'>some</span> <b>markup</b>",\r
- "label with <span foreground='blue'>some</span> <b>markup</b> and &mnemonic",\r
- };\r
-\r
- // test calls to SetLabel() and then to GetLabel()\r
-\r
- for ( unsigned int s = 0; s < WXSIZEOF(testLabelArray); s++ )\r
- {\r
- SET_LABEL(testLabelArray[s]);\r
-\r
- // GetLabel() should always return the string passed to SetLabel()\r
- CPPUNIT_ASSERT_EQUAL( testLabelArray[s], m_st->GetLabel() );\r
- CPPUNIT_ASSERT_EQUAL( testLabelArray[s], m_stWithMarkup->GetLabel() );\r
- CPPUNIT_ASSERT_EQUAL( testLabelArray[s], m_cb->GetLabel() );\r
- }\r
-\r
-\r
- // test calls to SetLabelText() and then to GetLabel()\r
-\r
- const wxString& testLabel = "label without mnemonics and markup";\r
- SET_LABEL_TEXT(testLabel);\r
- CPPUNIT_ASSERT_EQUAL( testLabel, m_st->GetLabel() );\r
- CPPUNIT_ASSERT_EQUAL( testLabel, m_stWithMarkup->GetLabel() );\r
- CPPUNIT_ASSERT_EQUAL( testLabel, m_cb->GetLabel() );\r
-\r
- const wxString& testLabel2 = "label with &mnemonic";\r
- const wxString& testLabelText2 = "label with &&mnemonic";\r
- SET_LABEL_TEXT(testLabel2);\r
- CPPUNIT_ASSERT_EQUAL( testLabelText2, m_st->GetLabel() );\r
- CPPUNIT_ASSERT_EQUAL( "label with &mnemonic", m_stWithMarkup->GetLabel() );\r
- CPPUNIT_ASSERT_EQUAL( testLabelText2, m_cb->GetLabel() );\r
-\r
- const wxString& testLabel3 = "label with <span foreground='blue'>some</span> <b>markup</b>";\r
- SET_LABEL_TEXT(testLabel3);\r
- CPPUNIT_ASSERT_EQUAL( testLabel3, m_st->GetLabel() );\r
- CPPUNIT_ASSERT_EQUAL( "label with <span foreground='blue'>some</span> <b>markup</b>", m_stWithMarkup->GetLabel() );\r
- CPPUNIT_ASSERT_EQUAL( testLabel3, m_cb->GetLabel() );\r
-\r
- const wxString& testLabel4 = "label with <span foreground='blue'>some</span> <b>markup</b> and &mnemonic";\r
- const wxString& testLabelText4 = "label with <span foreground='blue'>some</span> <b>markup</b> and &&mnemonic";\r
- SET_LABEL_TEXT(testLabel4);\r
- CPPUNIT_ASSERT_EQUAL( testLabelText4, m_st->GetLabel() );\r
- CPPUNIT_ASSERT_EQUAL( "label with <span foreground='blue'>some</span> <b>markup</b> and &mnemonic", m_stWithMarkup->GetLabel() );\r
- CPPUNIT_ASSERT_EQUAL( testLabelText4, m_cb->GetLabel() );\r
-}\r
-\r
-void LabelTestCase::GetLabelText()\r
-{\r
- // test calls to SetLabel() and then to GetLabelText()\r
-\r
- const wxString& testLabel = "label without mnemonics and markup";\r
- SET_LABEL(testLabel);\r
- CPPUNIT_ASSERT_EQUAL( testLabel, m_st->GetLabelText() );\r
- CPPUNIT_ASSERT_EQUAL( testLabel, m_stWithMarkup->GetLabelText() );\r
- CPPUNIT_ASSERT_EQUAL( testLabel, m_cb->GetLabelText() );\r
-\r
- const wxString& testLabel2 = "label with &mnemonic";\r
- const wxString& testLabelText2 = "label with mnemonic";\r
- SET_LABEL(testLabel2);\r
- CPPUNIT_ASSERT_EQUAL( testLabelText2, m_st->GetLabelText() );\r
- CPPUNIT_ASSERT_EQUAL( testLabelText2, m_stWithMarkup->GetLabelText() );\r
- CPPUNIT_ASSERT_EQUAL( testLabelText2, m_cb->GetLabelText() );\r
-\r
- const wxString& testLabel3 = "label with <span foreground='blue'>some</span> <b>markup</b>";\r
- SET_LABEL(testLabel3);\r
- CPPUNIT_ASSERT_EQUAL( testLabel3, m_st->GetLabelText() );\r
- CPPUNIT_ASSERT_EQUAL( "label with some markup", m_stWithMarkup->GetLabelText() );\r
- CPPUNIT_ASSERT_EQUAL( testLabel3, m_cb->GetLabelText() );\r
-\r
- const wxString& testLabel4 = "label with <span foreground='blue'>some</span> <b>markup</b> and &mnemonic";\r
- const wxString& testLabelText4 = "label with <span foreground='blue'>some</span> <b>markup</b> and mnemonic";\r
- SET_LABEL(testLabel4);\r
- CPPUNIT_ASSERT_EQUAL( testLabelText4, m_st->GetLabelText() );\r
- CPPUNIT_ASSERT_EQUAL( "label with some markup and mnemonic", m_stWithMarkup->GetLabelText() );\r
- CPPUNIT_ASSERT_EQUAL( testLabelText4, m_cb->GetLabelText() );\r
-\r
-\r
- const wxString testLabelArray[] = {\r
- "label without mnemonics and markup",\r
- "label with &mnemonic",\r
- "label with <span foreground='blue'>some</span> <b>markup</b>",\r
- "label with <span foreground='blue'>some</span> <b>markup</b> and &mnemonic",\r
- };\r
-\r
- // test calls to SetLabelText() and then to GetLabelText()\r
-\r
- for ( unsigned int s = 0; s < WXSIZEOF(testLabelArray); s++ )\r
- {\r
- SET_LABEL_TEXT(testLabelArray[s]);\r
-\r
- // GetLabelText() should always return the string passed to SetLabelText()\r
- CPPUNIT_ASSERT_EQUAL( testLabelArray[s], m_st->GetLabelText() );\r
- CPPUNIT_ASSERT_EQUAL( testLabelArray[s], m_stWithMarkup->GetLabelText() );\r
- CPPUNIT_ASSERT_EQUAL( testLabelArray[s], m_cb->GetLabelText() );\r
- }\r
-}\r
-\r
-void LabelTestCase::Statics()\r
-{\r
- CPPUNIT_ASSERT_EQUAL( "mnemonic", wxControl::RemoveMnemonics("&mnemonic") );\r
- CPPUNIT_ASSERT_EQUAL( "&mnemonic", wxControl::RemoveMnemonics("&&mnemonic") );\r
- CPPUNIT_ASSERT_EQUAL( "&mnemonic", wxControl::RemoveMnemonics("&&&mnemonic") );\r
- CPPUNIT_ASSERT_EQUAL( "", wxStaticText::RemoveMarkup("<b></b>") );\r
-}\r
+///////////////////////////////////////////////////////////////////////////////
+// Name: tests/controls/label.cpp
+// Purpose: wxControl and wxStaticText label tests
+// Author: Francesco Montorsi
+// Created: 2010-3-21
+// RCS-ID: $Id$
+// Copyright: (c) 2010 Francesco Montorsi
+///////////////////////////////////////////////////////////////////////////////
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+#include "testprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+ #include "wx/app.h"
+#endif // WX_PRECOMP
+
+#include "wx/control.h"
+#include "wx/stattext.h"
+#include "wx/checkbox.h"
+
+// ----------------------------------------------------------------------------
+// test class
+// ----------------------------------------------------------------------------
+
+class LabelTestCase : public CppUnit::TestCase
+{
+public:
+ LabelTestCase() { }
+
+ virtual void setUp();
+ virtual void tearDown();
+
+private:
+ CPPUNIT_TEST_SUITE( LabelTestCase );
+ CPPUNIT_TEST( GetLabel );
+ CPPUNIT_TEST( GetLabelText );
+ CPPUNIT_TEST( Statics );
+ CPPUNIT_TEST_SUITE_END();
+
+ void GetLabel();
+ void GetLabelText();
+ void Statics();
+
+ wxStaticText *m_st, *m_stWithMarkup;
+
+ // we cannot test wxControl directly (it's abstract) so we rather test wxCheckBox
+ wxCheckBox *m_cb;
+
+ DECLARE_NO_COPY_CLASS(LabelTestCase)
+};
+
+// register in the unnamed registry so that these tests are run by default
+CPPUNIT_TEST_SUITE_REGISTRATION( LabelTestCase );
+
+// also include in it's own registry so that these tests can be run alone
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( LabelTestCase, "LabelTestCase" );
+
+// ----------------------------------------------------------------------------
+// test initialization
+// ----------------------------------------------------------------------------
+
+#define ORIGINAL_LABEL "original label"
+
+void LabelTestCase::setUp()
+{
+ m_st = new wxStaticText(wxTheApp->GetTopWindow(), wxID_ANY, ORIGINAL_LABEL);
+ m_stWithMarkup = new wxStaticText(wxTheApp->GetTopWindow(), wxID_ANY, ORIGINAL_LABEL,
+ wxDefaultPosition, wxDefaultSize, wxST_MARKUP);
+
+ m_cb = new wxCheckBox(wxTheApp->GetTopWindow(), wxID_ANY, ORIGINAL_LABEL);
+
+ CPPUNIT_ASSERT_EQUAL( ORIGINAL_LABEL, m_st->GetLabel() );
+ CPPUNIT_ASSERT_EQUAL( ORIGINAL_LABEL, m_stWithMarkup->GetLabel() );
+ CPPUNIT_ASSERT_EQUAL( ORIGINAL_LABEL, m_cb->GetLabel() );
+}
+
+void LabelTestCase::tearDown()
+{
+ wxDELETE(m_st);
+ wxDELETE(m_stWithMarkup);
+ wxDELETE(m_cb);
+}
+
+// ----------------------------------------------------------------------------
+// the tests themselves
+// ----------------------------------------------------------------------------
+
+#define SET_LABEL(str) \
+ m_st->SetLabel(str); \
+ m_stWithMarkup->SetLabel(str); \
+ m_cb->SetLabel(str);
+
+#define SET_LABEL_TEXT(str) \
+ m_st->SetLabelText(str); \
+ m_stWithMarkup->SetLabelText(str); \
+ m_cb->SetLabelText(str);
+
+void LabelTestCase::GetLabel()
+{
+ const wxString testLabelArray[] = {
+ "label without mnemonics and markup",
+ "label with &mnemonic",
+ "label with <span foreground='blue'>some</span> <b>markup</b>",
+ "label with <span foreground='blue'>some</span> <b>markup</b> and &mnemonic",
+ };
+
+ // test calls to SetLabel() and then to GetLabel()
+
+ for ( unsigned int s = 0; s < WXSIZEOF(testLabelArray); s++ )
+ {
+ SET_LABEL(testLabelArray[s]);
+
+ // GetLabel() should always return the string passed to SetLabel()
+ CPPUNIT_ASSERT_EQUAL( testLabelArray[s], m_st->GetLabel() );
+ CPPUNIT_ASSERT_EQUAL( testLabelArray[s], m_stWithMarkup->GetLabel() );
+ CPPUNIT_ASSERT_EQUAL( testLabelArray[s], m_cb->GetLabel() );
+ }
+
+
+ // test calls to SetLabelText() and then to GetLabel()
+
+ const wxString& testLabel = "label without mnemonics and markup";
+ SET_LABEL_TEXT(testLabel);
+ CPPUNIT_ASSERT_EQUAL( testLabel, m_st->GetLabel() );
+ CPPUNIT_ASSERT_EQUAL( testLabel, m_stWithMarkup->GetLabel() );
+ CPPUNIT_ASSERT_EQUAL( testLabel, m_cb->GetLabel() );
+
+ const wxString& testLabel2 = "label with &mnemonic";
+ const wxString& testLabelText2 = "label with &&mnemonic";
+ SET_LABEL_TEXT(testLabel2);
+ CPPUNIT_ASSERT_EQUAL( testLabelText2, m_st->GetLabel() );
+ CPPUNIT_ASSERT_EQUAL( "label with &mnemonic", m_stWithMarkup->GetLabel() );
+ CPPUNIT_ASSERT_EQUAL( testLabelText2, m_cb->GetLabel() );
+
+ const wxString& testLabel3 = "label with <span foreground='blue'>some</span> <b>markup</b>";
+ SET_LABEL_TEXT(testLabel3);
+ CPPUNIT_ASSERT_EQUAL( testLabel3, m_st->GetLabel() );
+ CPPUNIT_ASSERT_EQUAL( "label with <span foreground='blue'>some</span> <b>markup</b>", m_stWithMarkup->GetLabel() );
+ CPPUNIT_ASSERT_EQUAL( testLabel3, m_cb->GetLabel() );
+
+ const wxString& testLabel4 = "label with <span foreground='blue'>some</span> <b>markup</b> and &mnemonic";
+ const wxString& testLabelText4 = "label with <span foreground='blue'>some</span> <b>markup</b> and &&mnemonic";
+ SET_LABEL_TEXT(testLabel4);
+ CPPUNIT_ASSERT_EQUAL( testLabelText4, m_st->GetLabel() );
+ CPPUNIT_ASSERT_EQUAL( "label with <span foreground='blue'>some</span> <b>markup</b> and &mnemonic", m_stWithMarkup->GetLabel() );
+ CPPUNIT_ASSERT_EQUAL( testLabelText4, m_cb->GetLabel() );
+}
+
+void LabelTestCase::GetLabelText()
+{
+ // test calls to SetLabel() and then to GetLabelText()
+
+ const wxString& testLabel = "label without mnemonics and markup";
+ SET_LABEL(testLabel);
+ CPPUNIT_ASSERT_EQUAL( testLabel, m_st->GetLabelText() );
+ CPPUNIT_ASSERT_EQUAL( testLabel, m_stWithMarkup->GetLabelText() );
+ CPPUNIT_ASSERT_EQUAL( testLabel, m_cb->GetLabelText() );
+
+ const wxString& testLabel2 = "label with &mnemonic";
+ const wxString& testLabelText2 = "label with mnemonic";
+ SET_LABEL(testLabel2);
+ CPPUNIT_ASSERT_EQUAL( testLabelText2, m_st->GetLabelText() );
+ CPPUNIT_ASSERT_EQUAL( testLabelText2, m_stWithMarkup->GetLabelText() );
+ CPPUNIT_ASSERT_EQUAL( testLabelText2, m_cb->GetLabelText() );
+
+ const wxString& testLabel3 = "label with <span foreground='blue'>some</span> <b>markup</b>";
+ SET_LABEL(testLabel3);
+ CPPUNIT_ASSERT_EQUAL( testLabel3, m_st->GetLabelText() );
+ CPPUNIT_ASSERT_EQUAL( "label with some markup", m_stWithMarkup->GetLabelText() );
+ CPPUNIT_ASSERT_EQUAL( testLabel3, m_cb->GetLabelText() );
+
+ const wxString& testLabel4 = "label with <span foreground='blue'>some</span> <b>markup</b> and &mnemonic";
+ const wxString& testLabelText4 = "label with <span foreground='blue'>some</span> <b>markup</b> and mnemonic";
+ SET_LABEL(testLabel4);
+ CPPUNIT_ASSERT_EQUAL( testLabelText4, m_st->GetLabelText() );
+ CPPUNIT_ASSERT_EQUAL( "label with some markup and mnemonic", m_stWithMarkup->GetLabelText() );
+ CPPUNIT_ASSERT_EQUAL( testLabelText4, m_cb->GetLabelText() );
+
+
+ const wxString testLabelArray[] = {
+ "label without mnemonics and markup",
+ "label with &mnemonic",
+ "label with <span foreground='blue'>some</span> <b>markup</b>",
+ "label with <span foreground='blue'>some</span> <b>markup</b> and &mnemonic",
+ };
+
+ // test calls to SetLabelText() and then to GetLabelText()
+
+ for ( unsigned int s = 0; s < WXSIZEOF(testLabelArray); s++ )
+ {
+ SET_LABEL_TEXT(testLabelArray[s]);
+
+ // GetLabelText() should always return the string passed to SetLabelText()
+ CPPUNIT_ASSERT_EQUAL( testLabelArray[s], m_st->GetLabelText() );
+ CPPUNIT_ASSERT_EQUAL( testLabelArray[s], m_stWithMarkup->GetLabelText() );
+ CPPUNIT_ASSERT_EQUAL( testLabelArray[s], m_cb->GetLabelText() );
+ }
+}
+
+void LabelTestCase::Statics()
+{
+ CPPUNIT_ASSERT_EQUAL( "mnemonic", wxControl::RemoveMnemonics("&mnemonic") );
+ CPPUNIT_ASSERT_EQUAL( "&mnemonic", wxControl::RemoveMnemonics("&&mnemonic") );
+ CPPUNIT_ASSERT_EQUAL( "&mnemonic", wxControl::RemoveMnemonics("&&&mnemonic") );
+ CPPUNIT_ASSERT_EQUAL( "", wxStaticText::RemoveMarkup("<b></b>") );
+}