Added OS/2 patches to wxGTK.
Updated docs. Added wxMask code. Added Sylvain's newest tree ctrl code and sample. Corrected wxDC background colour (now as wrong as wxMSW). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2767 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -55,6 +55,7 @@
|
|||||||
#undef __VMS__
|
#undef __VMS__
|
||||||
#undef __ULTRIX__
|
#undef __ULTRIX__
|
||||||
#undef __DATA_GENERAL__
|
#undef __DATA_GENERAL__
|
||||||
|
#undef __EMX__
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
/* compiler options */
|
/* compiler options */
|
||||||
|
@@ -179,6 +179,9 @@ case "${host}" in
|
|||||||
AC_DEFINE(__SVR4__)
|
AC_DEFINE(__SVR4__)
|
||||||
DEFAULT_DEFAULT_wxUSE_MOTIF=1
|
DEFAULT_DEFAULT_wxUSE_MOTIF=1
|
||||||
;;
|
;;
|
||||||
|
*-pc-os2_emx )
|
||||||
|
AC_DEFINE(__EMX__)
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
AC_MSG_ERROR(unknown system type $(host).)
|
AC_MSG_ERROR(unknown system type $(host).)
|
||||||
esac
|
esac
|
||||||
|
@@ -37,6 +37,7 @@ echo Docs..
|
|||||||
cd docs/gtk
|
cd docs/gtk
|
||||||
cp COPYING.LIB ~/wxgtk_dist/wxGTK
|
cp COPYING.LIB ~/wxgtk_dist/wxGTK
|
||||||
cp install.txt ~/wxgtk_dist/wxGTK/INSTALL.txt
|
cp install.txt ~/wxgtk_dist/wxGTK/INSTALL.txt
|
||||||
|
cp changes.txt ~/wxgtk_dist/wxGTK/CHANGES.txt
|
||||||
cp licence.txt ~/wxgtk_dist/wxGTK/LICENCE.txt
|
cp licence.txt ~/wxgtk_dist/wxGTK/LICENCE.txt
|
||||||
cp readme.txt ~/wxgtk_dist/wxGTK/README.txt
|
cp readme.txt ~/wxgtk_dist/wxGTK/README.txt
|
||||||
cp todo.txt ~/wxgtk_dist/wxGTK/TODO.txt
|
cp todo.txt ~/wxgtk_dist/wxGTK/TODO.txt
|
||||||
|
@@ -1,14 +1,13 @@
|
|||||||
|
|
||||||
!!! When sending bug reports tell us what version of
|
!!! When sending bug reports tell us what version of wxWindows you are
|
||||||
wxWindows you are using (including the beta) and
|
using (including the beta) and what compiler on what system. One
|
||||||
what compiler on what system. One example:
|
example: wxGTK 2.1 beta 6, egcs 1.1.1, Redhat 5.0 !!!
|
||||||
wxGTK 2.1 beta 6, egcs 1.1.1, Redhat 5.0 !!!
|
|
||||||
|
|
||||||
* The most simple case
|
* The most simple case
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
If you compile wxWindows on Unix for the first time and don't
|
If you compile wxWindows on Unix for the first time and don't like to read
|
||||||
like to read install instructions just do (in the base dir):
|
install instructions just do (in the base dir):
|
||||||
|
|
||||||
./configure
|
./configure
|
||||||
make
|
make
|
||||||
@@ -27,17 +26,15 @@ exit
|
|||||||
* The expert case
|
* The expert case
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
If you want to do some more serious cross-platform programming
|
If you want to do some more serious cross-platform programming with wxWindows,
|
||||||
with wxWindows, such as for GTK and Motif, you can now build
|
such as for GTK and Motif, you can now build two complete libraries and use
|
||||||
two complete libraries and use them concurretly. For this end,
|
them concurretly. For this end, you have to create a directory for each build
|
||||||
you have to create a directory for each build of wxWindows -
|
of wxWindows - you may also want to create different versions of wxWindows
|
||||||
you may also want to create different versions of wxWindows
|
and test them concurrently. Most typically, this would be a version configured
|
||||||
and test them concurrently. Most typically, this would be a
|
with --enable-debug_flag and one without. Note, that only one build can currently
|
||||||
version configured with --enable-debug_flag and one without.
|
be installed, so you'd have to use local version of the library for that purpose.
|
||||||
Note, that only one build can currenty be installed, so you'd
|
For building three version, one GTK, one Motif and a debug version of the GTK
|
||||||
have to use local version of the library for that purpose.
|
source, you'd do this:
|
||||||
For building three version, one GTK, one Motif and a debug
|
|
||||||
version of the GTK source, you'd do this:
|
|
||||||
|
|
||||||
md buildmotif
|
md buildmotif
|
||||||
cd buildmotif
|
cd buildmotif
|
||||||
@@ -60,84 +57,70 @@ cd ..
|
|||||||
* The most simple errors
|
* The most simple errors
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
configure reports, that you don't have GTK 1.X installed
|
configure reports, that you don't have GTK 1.X installed although you are
|
||||||
although you are certainly sure you have. Well, you have
|
certainly sure you have. Well, you have installed it, but you also have another
|
||||||
installed it, but you also have another version of the
|
version of the GTK installed, which you may need to removed including other
|
||||||
GTK installed, which you may need to removed including
|
versions of glib (and its headers). Also, look for the PATH variable and check
|
||||||
other versions of glib (and its headers). Also, look
|
if it includes the path to the correct gtk-config! The check your LDPATH if it
|
||||||
for the PATH variable and check if it includes the path
|
points to the correct library. There is no way to compile wxGTK if configure
|
||||||
to the correct gtk-config! The check your LDPATH if
|
doesn't pass this test as all this test does is compile and link a GTK program.
|
||||||
it points to the correct library. There is no way to
|
|
||||||
compile wxGTK if configure doesn't pass this test as
|
|
||||||
all this test does is compile and link a GTK program.
|
|
||||||
|
|
||||||
You get errors during compilation: The reason is that you
|
You get errors during compilation: The reason is that you probably have a broken
|
||||||
probably have a broken compiler, which includes almost
|
compiler, which includes almost everything that is called gcc. If you use gcc 2.8
|
||||||
everything that is called gcc. If you use gcc 2.8 you
|
you have to disable optimsation as the compiler will give up with an internal
|
||||||
have to disable optimsation as the compiler will give
|
compiler error.
|
||||||
up with an internal compiler error.
|
|
||||||
|
|
||||||
If there is just any way for you to use egcs, use egcs.
|
If there is just any way for you to use egcs, use egcs. We cannot fix gcc.
|
||||||
We are sorry, but we cannot fix gcc.
|
|
||||||
|
|
||||||
You get immediate segfault when starting any sample
|
You get immediate segfault when starting any sample or application: This is either
|
||||||
or application: This is either due to having compiled
|
due to having compiled the library with different flags or options than your program -
|
||||||
the library with different flags or options than your
|
typically you might have the __WXDEBUG__ option set for the library but not for your
|
||||||
program - typically you might have the __WXDEBUG__ option
|
program - or due to using a broken compiler (and its optimisation) such as GCC 2.8.
|
||||||
set for the library but not for your program - or due
|
|
||||||
to using a broken compiler (and its optimisation) such
|
|
||||||
as GCC 2.8.
|
|
||||||
|
|
||||||
* The most simple program
|
* The most simple program
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
Now create your super-application myfoo.app and compile anywhere
|
Now create your super-application myfoo.app and compile anywhere with
|
||||||
with
|
|
||||||
|
|
||||||
g++ myfoo.cpp `wx-config --libs --cflags` -o myfoo
|
g++ myfoo.cpp `wx-config --libs --cflags` -o myfoo
|
||||||
|
|
||||||
* General
|
* General
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
The Unix variants of wxWindows use GNU configure. If you have
|
The Unix variants of wxWindows use GNU configure. If you have problems with your
|
||||||
problems with your make use GNU make instead.
|
make use GNU make instead.
|
||||||
|
|
||||||
If you have general problems with installation, read my
|
If you have general problems with installation, read my homepage at
|
||||||
homepage at
|
|
||||||
|
|
||||||
http://wesley.informatik.uni-freiburg.de/~wxxt
|
http://wesley.informatik.uni-freiburg.de/~wxxt
|
||||||
|
|
||||||
for newest information. If you still don't have any success,
|
for newest information. If you still don't have any success, please send a bug
|
||||||
please send a bug report to one of our mailing lists (see
|
report to one of our mailing lists (see my homepage) INCLUDING A DESCRIPTION OF
|
||||||
my homepage) INCLUDING A DESCRIPTION OF YOUR SYSTEM AND
|
YOUR SYSTEM AND YOUR PROBLEM, SUCH AS YOUR VERSION OF GTK, WXGTK, WHAT DISTRIBUTION
|
||||||
YOUR PROBLEM, SUCH AS YOUR VERSION OF GTK, WXGTK, WHAT
|
YOU USE AND WHAT ERROR WAS REPORTED. I know this has no effect, but I tried...
|
||||||
DISTRIBUTION YOU USE AND WHAT ERROR WAS REPORTED. I know
|
|
||||||
this has no effect, but I tried...
|
|
||||||
|
|
||||||
* GUI libraries
|
* GUI libraries
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
wxWindows/GTK requires the GTK+ library to be installed on your system.
|
wxWindows/GTK requires the GTK+ library to be installed on your system. It has to
|
||||||
It has to be a stable version, preferebly version 1.2.3. You can use
|
be a stable version, preferebly version 1.2.3. You can use GTK 1.0 in connection
|
||||||
GTK 1.0 in connection with wxWindows, but only without Drag'n'Drop.
|
with wxWindows, but only without Drag'n'Drop. wxWindows does work with the 1.1.X
|
||||||
wxWindows does work with the 1.1.X versions of the GTK+ library.
|
versions of the GTK+ library.
|
||||||
|
|
||||||
|
You can get the newest version of the GTK+ from the GTK homepage at:
|
||||||
|
|
||||||
You can get the newest version of the GTK+ from the GTK homepage
|
|
||||||
at
|
|
||||||
http://www.gtk.org
|
http://www.gtk.org
|
||||||
|
|
||||||
We also mirror GTK+ 1.2.1 at my ftp site soon. You'll find information
|
We also mirror GTK+ 1.2.1 at my ftp site soon. You'll find information about downloading
|
||||||
about downloading at my homepage.
|
at my homepage.
|
||||||
|
|
||||||
* Additional libraries
|
* Additional libraries
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
wxWindows/Gtk requires a thread library and X libraries
|
wxWindows/Gtk requires a thread library and X libraries known to work with threads.
|
||||||
known to work with threads. This is the case on all
|
This is the case on all commercial Unix-Variants and all Linux-Versions that are
|
||||||
commercial Unix-Variants and all Linux-Versions that
|
based on glibc 2 except RedHat 5.0 which is broken in many aspects. As of writing
|
||||||
are based on glibc 2 except RedHat 5.0 which is broken
|
this, these Linux distributions have correct glibc 2 support:
|
||||||
in many aspects. As of writing this, these Linux
|
|
||||||
distributions have correct glibc 2 support:
|
|
||||||
|
|
||||||
- RedHat 5.1
|
- RedHat 5.1
|
||||||
- Debian 2.0
|
- Debian 2.0
|
||||||
@@ -154,22 +137,33 @@ make install
|
|||||||
ldconfig
|
ldconfig
|
||||||
exit
|
exit
|
||||||
|
|
||||||
NB: DO NOT COMPILE WXGTK WITH GCC AND THREADS, SINCE
|
NB: DO NOT COMPILE WXGTK WITH GCC AND THREADS, SINCE ALL PROGRAMS WILL CRASH UPON
|
||||||
ALL PROGRAMS WILL CRASH UPON START-UP! Just always
|
START-UP! Just always use egcs and be happy.
|
||||||
use egcs and be happy.
|
|
||||||
|
|
||||||
* Create your configuration
|
* Building wxGTK on OS/2
|
||||||
-----------------------------
|
--------------------------
|
||||||
|
|
||||||
Usage:
|
Please send comments and question about the OS/2 installation
|
||||||
./configure options
|
to Andrea Venturoli <a.ventu@flashnet.it> and patches to
|
||||||
|
make the installation work (better) to me (Robert Roebling).
|
||||||
|
|
||||||
If you want to use system's C and C++ compiler,
|
You'll need OS/2 Warp (4.00FP#6), X-Free86/2 (3.3.3),
|
||||||
set environment variables CC and CCC as
|
gtk+ (?), emx (0.9d fix 1), flex (2.5.4), yacc (1.8),
|
||||||
|
korn shell (5.2.13), Autoconf (?), GNU file utilities (3.6),
|
||||||
|
GNU text utilities (1.3), GNU shell utilites (1.12), m4 (1.4),
|
||||||
|
sed (2.05), grep (2.0), Awk (3.0.3), GNU Make (3.76.1).
|
||||||
|
|
||||||
% setenv CC cc
|
Open an OS/2 prompt and switch to the directory above.
|
||||||
% setenv CCC CC
|
First set some global environment variables we need:
|
||||||
% ./configure options
|
|
||||||
|
SET CXXFLAGS=-Zmtd -D__ST_MT_ERRNO__
|
||||||
|
SET OSTYPE=OS2X
|
||||||
|
SET COMSPEC=sh
|
||||||
|
|
||||||
|
Notice you can choose whatever you want, if you don't like OS2X.
|
||||||
|
|
||||||
|
* Building wxGTK on SGI
|
||||||
|
--------------------------
|
||||||
|
|
||||||
Using the SGI native compilers, it is recommended that you
|
Using the SGI native compilers, it is recommended that you
|
||||||
also set CFLAGS and CXXFLAGS before running configure. These
|
also set CFLAGS and CXXFLAGS before running configure. These
|
||||||
@@ -186,6 +180,19 @@ untested).
|
|||||||
|
|
||||||
The SGI native compiler support has only been tested on Irix 6.5.
|
The SGI native compiler support has only been tested on Irix 6.5.
|
||||||
|
|
||||||
|
* Create your configuration
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
./configure options
|
||||||
|
|
||||||
|
If you want to use system's C and C++ compiler,
|
||||||
|
set environment variables CC and CCC as
|
||||||
|
|
||||||
|
% setenv CC cc
|
||||||
|
% setenv CCC CC
|
||||||
|
% ./configure options
|
||||||
|
|
||||||
to see all the options please use:
|
to see all the options please use:
|
||||||
|
|
||||||
./configure --help
|
./configure --help
|
||||||
@@ -331,8 +338,6 @@ in the various directories will do the work for you.
|
|||||||
* Creating a new Project
|
* Creating a new Project
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
There are two ways to create your own project:
|
|
||||||
|
|
||||||
1) The first way uses the installed libraries and header files
|
1) The first way uses the installed libraries and header files
|
||||||
automatically using wx-config
|
automatically using wx-config
|
||||||
|
|
||||||
@@ -371,163 +376,10 @@ GNU cc
|
|||||||
and if you have all this then you probably know enough to
|
and if you have all this then you probably know enough to
|
||||||
go ahead yourself :-)
|
go ahead yourself :-)
|
||||||
|
|
||||||
** Something about Makefiles
|
----------------------
|
||||||
------------------------------
|
|
||||||
|
|
||||||
On general principle it should only contain ONE line, which is as follows:
|
|
||||||
|
|
||||||
include ../../setup/general/makeapp
|
|
||||||
|
|
||||||
this will include all the necessary definitions for creating the applications
|
|
||||||
|
|
||||||
the only case where you might want to add another line is the following:
|
|
||||||
this version of configure also supports creation of source archives of the
|
|
||||||
application for easy distribution and updates to newer version of wxWindows.
|
|
||||||
For this purpose all files in the application-directory will be put into
|
|
||||||
a gziped tar-file in the full notation user/<your application>/*
|
|
||||||
if you want to include some other files that you want "more visible", like
|
|
||||||
a README.<yourApp> or a shell script for easy
|
|
||||||
compilation/installation/distribution, then you have to add a variable
|
|
||||||
|
|
||||||
DISTRIBUTE_ADDITIONAL=<your files>
|
|
||||||
|
|
||||||
to the Makefile.
|
|
||||||
So it would look like this:
|
|
||||||
|
|
||||||
DISTRIBUTE_ADDITIONAL=README.TheApp
|
|
||||||
include ../../setup/general/makeapp
|
|
||||||
|
|
||||||
As we have already talked about distribution the command to create a
|
|
||||||
distribution is:
|
|
||||||
|
|
||||||
make distrib
|
|
||||||
|
|
||||||
NOTE: If you are in the base directory of wxWindows it will create
|
|
||||||
distribution packages for wxWindows as well as for all packages in the
|
|
||||||
user directory.
|
|
||||||
So if you want to create only packages for the files in user,
|
|
||||||
then go to the directory other and type:
|
|
||||||
|
|
||||||
make distrib
|
|
||||||
|
|
||||||
or if you only want one application to be created then
|
|
||||||
enter the specific directory and type there:
|
|
||||||
make distrib
|
|
||||||
|
|
||||||
All the distribution files will be put in the directory
|
|
||||||
distrib at the base of the wxWindows-tree (where also configure
|
|
||||||
and template.mak can be found).
|
|
||||||
|
|
||||||
** Something about Makefile.in
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
As you have already seen with Makefile, configure makes a lot of use
|
|
||||||
if the include statement in make to keep the Makefiles as simple as
|
|
||||||
possible.
|
|
||||||
|
|
||||||
So basically there are only variables to define and then a include command.
|
|
||||||
Exception to this rule is if you have special rules for some stuff...
|
|
||||||
These rules should go AFTER the include statement!!!
|
|
||||||
|
|
||||||
so the general header looks like this:
|
|
||||||
|
|
||||||
# wxWindows base directory
|
|
||||||
WXBASEDIR=@WXBASEDIR@
|
|
||||||
# set the OS type for compilation
|
|
||||||
OS=@OS@
|
|
||||||
# compile a library only
|
|
||||||
RULE=bin
|
|
||||||
|
|
||||||
and the general footer will look like this:
|
|
||||||
|
|
||||||
# include the definitions now
|
|
||||||
include ../../../template.mak
|
|
||||||
|
|
||||||
the key variable is RULE, which defines what make should create
|
|
||||||
in this directory.
|
|
||||||
|
|
||||||
here are some examples:
|
|
||||||
|
|
||||||
RULE description
|
|
||||||
===========================================================================
|
|
||||||
bin creates a local binary (for a global binary prefix bin with g)
|
|
||||||
additional variables needed:
|
|
||||||
BIN_TARGET this gives the name of your application
|
|
||||||
BIN_OBJ this gives the object files needed to
|
|
||||||
link the application
|
|
||||||
optional variables are:
|
|
||||||
BIN_SRC this gives the list of c/c++ files for
|
|
||||||
which dependencies will be checked.
|
|
||||||
(This can be achieved with: make depend)
|
|
||||||
BIN_LINK this gives commands for additional
|
|
||||||
libraries needed to link the application
|
|
||||||
---------------------------------------------------------------------------
|
|
||||||
bin2 creates two local binaries (for global binaries prefix bin2 with g)
|
|
||||||
in addition to the variables specified above you MUST also
|
|
||||||
provide the same variables with BIN2_ instead of BIN_
|
|
||||||
---------------------------------------------------------------------------
|
|
||||||
lib creates a local library (for a global binary prefix bin with g)
|
|
||||||
additional variables needed:
|
|
||||||
LIB_TARGET this gives the name of your library
|
|
||||||
LIB_OBJ this gives the object files needed for
|
|
||||||
the library to be build.
|
|
||||||
optional variables are:
|
|
||||||
LIB_SRC this gives the list of c/c++ files for
|
|
||||||
which dependencies will be checked.
|
|
||||||
libbin and libgbin are also possible and will need in addition
|
|
||||||
the variables from bin
|
|
||||||
---------------------------------------------------------------------------
|
|
||||||
gslib is similar to lib, but it creates a shared library if the system
|
|
||||||
supports it.
|
|
||||||
additional variables needed:
|
|
||||||
LIB_MAJOR major number of the shared library
|
|
||||||
LIB_MINOR minor number of the shared library
|
|
||||||
---------------------------------------------------------------------------
|
|
||||||
other additional variables:
|
|
||||||
|
|
||||||
ADD_COMPILE define additional includes/defines that
|
|
||||||
are needed to compile the object files
|
|
||||||
(if you need to reference some directory
|
|
||||||
utils - like wxGrid -, then please
|
|
||||||
reference them with the variables defined
|
|
||||||
in template.mak - e.g.: $(SRCDIR),$(UTILS),
|
|
||||||
$(SAMPLES),$(OTHERS))
|
|
||||||
|
|
||||||
NEEDED_DEFINES lists all the defines that HAVE to be set in
|
|
||||||
/include/wx/setup.h to compile correctly.
|
|
||||||
|
|
||||||
SRC_DIR lists all directories that are needed to
|
|
||||||
compile. (i.e: lists all the directories,
|
|
||||||
where there are source-files.) But it is
|
|
||||||
also needed to clean an object and for
|
|
||||||
machines, for which make does not support
|
|
||||||
VPATH
|
|
||||||
|
|
||||||
currently there are the following compiling rules provided:
|
|
||||||
object files are created for the following file extensions:
|
|
||||||
.c .cc .cpp
|
|
||||||
|
|
||||||
Please have a closer look at the Makefiles in this distribution.
|
|
||||||
|
|
||||||
* Platforms configure is working with
|
|
||||||
---------------------------------------
|
|
||||||
|
|
||||||
Please report build succes on any machine. Especially non-
|
|
||||||
Linux operating systems (which I don't have).
|
|
||||||
|
|
||||||
Original author of the autoconf system for wxxt-1.66 and for this INSTALL
|
|
||||||
file:
|
|
||||||
|
|
||||||
Martin Sperl sperl@dsn.ast.univie.ac.at
|
|
||||||
|
|
||||||
Ported to wxGTK 0.1:
|
|
||||||
|
|
||||||
Wolfram Gloger wmglo@dent.med.uni-muenchen.de
|
|
||||||
|
|
||||||
Thanks alot to both of them.
|
|
||||||
|
|
||||||
In the hope that it will be useful,
|
In the hope that it will be useful,
|
||||||
|
|
||||||
Robert Roebling roebling@sun2.ruf.uni-freiburg.de
|
Robert Roebling <roebling@sun2.ruf.uni-freiburg.de>
|
||||||
|
|
||||||
|
|
||||||
|
@@ -8,13 +8,14 @@
|
|||||||
wxWindows is a C++ framework providing GUI (Graphical User
|
wxWindows is a C++ framework providing GUI (Graphical User
|
||||||
Interface) and other facilities on more than one platform. Version 2.0 currently
|
Interface) and other facilities on more than one platform. Version 2.0 currently
|
||||||
supports MS Windows (16-bit, Windows 95 and Windows NT), Unix with GTK+, and Unix with Motif.
|
supports MS Windows (16-bit, Windows 95 and Windows NT), Unix with GTK+, and Unix with Motif.
|
||||||
A Mac port is in an advanced state.
|
A Mac port is in an advanced state, an OS/2 port and a port to the MGL graphics library
|
||||||
|
have been started.
|
||||||
|
|
||||||
wxWindows was originally developed at the Artificial Intelligence
|
wxWindows was originally developed at the Artificial Intelligence
|
||||||
Applications Institute, University of Edinburgh, for internal use.
|
Applications Institute, University of Edinburgh, for internal use.
|
||||||
wxWindows has been released into the public domain in the hope
|
wxWindows has been released into the public domain in the hope
|
||||||
that others will also find it useful. Version 2.0 is written and
|
that others will also find it useful. Version 2.0 is written and
|
||||||
maintained by Julian Smart, Robert Roebling and others.
|
maintained by Julian Smart, Robert Roebling, Vadim Zeitlin and others.
|
||||||
|
|
||||||
This manual discusses wxWindows in the context of multi-platform
|
This manual discusses wxWindows in the context of multi-platform
|
||||||
development.\helpignore{For more detail on the wxWindows version 2.0 API
|
development.\helpignore{For more detail on the wxWindows version 2.0 API
|
||||||
@@ -182,8 +183,8 @@ Metrowerks CodeWarrior.
|
|||||||
(b) Unix:
|
(b) Unix:
|
||||||
|
|
||||||
\begin{enumerate}\itemsep=0pt
|
\begin{enumerate}\itemsep=0pt
|
||||||
\item Almost any C++ compiler, including GNU C++.
|
\item Almost any C++ compiler, including GNU C++ (EGCS 1.1.1 or above).
|
||||||
\item Almost any Unix workstation, and one of: GTK+ 1.0, Motif 1.2 or higher, Lesstif.
|
\item Almost any Unix workstation, and one of: GTK+ 1.0, GTK+ 1.2, Motif 1.2 or higher, Lesstif.
|
||||||
\item At least 60 MB of disk space.
|
\item At least 60 MB of disk space.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
|
|
||||||
@@ -356,7 +357,7 @@ STACKSIZE 8192
|
|||||||
The only lines which will usually have to be changed per application are
|
The only lines which will usually have to be changed per application are
|
||||||
NAME and DESCRIPTION.
|
NAME and DESCRIPTION.
|
||||||
|
|
||||||
\subsection{Allocating and deleting wxWindows objects}
|
\section{Allocating and deleting wxWindows objects}
|
||||||
|
|
||||||
In general, classes derived from wxWindow must dynamically allocated
|
In general, classes derived from wxWindow must dynamically allocated
|
||||||
with {\it new} and deleted with {\it delete}. If you delete a window,
|
with {\it new} and deleted with {\it delete}. If you delete a window,
|
||||||
@@ -386,6 +387,26 @@ make calls like wxDC::SetPen(wxNullPen) or wxDC::SelectObject(wxNullBitmap) befo
|
|||||||
a drawing object that may be in use. Code that doesn't do this will probably work
|
a drawing object that may be in use. Code that doesn't do this will probably work
|
||||||
fine on some platforms, and then fail under Windows.
|
fine on some platforms, and then fail under Windows.
|
||||||
|
|
||||||
|
\section{Architecture dependency}
|
||||||
|
|
||||||
|
A problem which sometimes arises from writing multi-platform programs is that
|
||||||
|
the basic C types are not defiend the same on all platforms. This holds true
|
||||||
|
for both the length in bits of the standard types (such as int and long) as
|
||||||
|
well as their byte order, which might be little endian (typically
|
||||||
|
on Intel computers) or big endian (typically on some Unix workstations). wxWindows
|
||||||
|
defines types and macros that make it easy to write architecture independent
|
||||||
|
code. The types are:
|
||||||
|
|
||||||
|
wxInt32, wxInt16, wxInt8, wxUint32, wxUint16 = wxWord, wxUint8 = wxByte
|
||||||
|
|
||||||
|
where wxInt32 stands for a 32-bit signed integer type etc. You can also check
|
||||||
|
which architecture the program is compiled on using the wxBYTE\_ORDER define
|
||||||
|
which is either wxBIG\_ENDIAN or wxLITTLE\_ENDIAN (in the future maybe wxPDP\_ENDIAN
|
||||||
|
as well).
|
||||||
|
|
||||||
|
The macros handling bit-swapping with respect to the applications endianness
|
||||||
|
are described in the \helpref{Macros}{macros} section.
|
||||||
|
|
||||||
\section{Conditional compilation}
|
\section{Conditional compilation}
|
||||||
|
|
||||||
One of the purposes of wxWindows is to reduce the need for conditional
|
One of the purposes of wxWindows is to reduce the need for conditional
|
||||||
|
@@ -25,12 +25,12 @@
|
|||||||
%\special{!/@scaleunit 1 def}
|
%\special{!/@scaleunit 1 def}
|
||||||
\parskip=10pt
|
\parskip=10pt
|
||||||
\parindent=0pt
|
\parindent=0pt
|
||||||
\title{User Manual for wxWindows 2.0: a portable C++ GUI toolkit}
|
\title{User Manual for wxWindows 2.1: a portable C++ GUI toolkit}
|
||||||
\winhelponly{\author{by Julian Smart et al
|
\winhelponly{\author{by Julian Smart et al
|
||||||
%\winhelponly{\\$$\image{1cm;0cm}{wxwin.wmf}$$}
|
%\winhelponly{\\$$\image{1cm;0cm}{wxwin.wmf}$$}
|
||||||
}}
|
}}
|
||||||
\winhelpignore{\author{Julian Smart et al}
|
\winhelpignore{\author{Julian Smart, Robert Roebling, Vadim Zeitlin et al}
|
||||||
\date{February 28th 1999}
|
\date{June 12th 1999}
|
||||||
}
|
}
|
||||||
\makeindex
|
\makeindex
|
||||||
\begin{document}
|
\begin{document}
|
||||||
|
@@ -35,11 +35,13 @@ Constructs a mask from a monochrome bitmap.
|
|||||||
|
|
||||||
\func{}{wxMask}{\param{const wxBitmap\& }{bitmap}, \param{const wxColour\& }{colour}}
|
\func{}{wxMask}{\param{const wxBitmap\& }{bitmap}, \param{const wxColour\& }{colour}}
|
||||||
|
|
||||||
Constructs a mask from a bitmap and a colour that indicates the background.
|
Constructs a mask from a bitmap and a colour that indicates the background. Not
|
||||||
|
yet implemented for GTK.
|
||||||
|
|
||||||
\func{}{wxMask}{\param{const wxBitmap\& }{bitmap}, \param{int}{ index}}
|
\func{}{wxMask}{\param{const wxBitmap\& }{bitmap}, \param{int}{ index}}
|
||||||
|
|
||||||
Constructs a mask from a bitmap and a palette index that indicates the background.
|
Constructs a mask from a bitmap and a palette index that indicates the background. Not
|
||||||
|
yet implemented for GTK.
|
||||||
|
|
||||||
\wxheading{Parameters}
|
\wxheading{Parameters}
|
||||||
|
|
||||||
@@ -63,11 +65,13 @@ Constructs a mask from a monochrome bitmap.
|
|||||||
|
|
||||||
\func{bool}{Create}{\param{const wxBitmap\& }{bitmap}, \param{const wxColour\& }{colour}}
|
\func{bool}{Create}{\param{const wxBitmap\& }{bitmap}, \param{const wxColour\& }{colour}}
|
||||||
|
|
||||||
Constructs a mask from a bitmap and a colour that indicates the background.
|
Constructs a mask from a bitmap and a colour that indicates the background. Not
|
||||||
|
yet implemented for GTK.
|
||||||
|
|
||||||
\func{bool}{Create}{\param{const wxBitmap\& }{bitmap}, \param{int}{ index}}
|
\func{bool}{Create}{\param{const wxBitmap\& }{bitmap}, \param{int}{ index}}
|
||||||
|
|
||||||
Constructs a mask from a bitmap and a palette index that indicates the background.
|
Constructs a mask from a bitmap and a palette index that indicates the background. Not
|
||||||
|
yet implemented for GTK.
|
||||||
|
|
||||||
\wxheading{Parameters}
|
\wxheading{Parameters}
|
||||||
|
|
||||||
|
@@ -246,7 +246,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
static bool IsImmutable(const wxString& key)
|
static bool IsImmutable(const wxString& key)
|
||||||
#ifndef __WXMAC__
|
#if !defined(__WXMAC__) && !defined(__EMX__)
|
||||||
{ return !key.IsEmpty() && key[0u] == wxCONFIG_IMMUTABLE_PREFIX; }
|
{ return !key.IsEmpty() && key[0u] == wxCONFIG_IMMUTABLE_PREFIX; }
|
||||||
#else
|
#else
|
||||||
{ return !key.IsEmpty() && key[0ul] == wxCONFIG_IMMUTABLE_PREFIX; }
|
{ return !key.IsEmpty() && key[0ul] == wxCONFIG_IMMUTABLE_PREFIX; }
|
||||||
|
@@ -28,7 +28,8 @@
|
|||||||
// OS
|
// OS
|
||||||
#if defined(__unix) || defined(__unix__) || defined(____SVR4____) || \
|
#if defined(__unix) || defined(__unix__) || defined(____SVR4____) || \
|
||||||
defined(__LINUX__) || defined(__sgi ) || \
|
defined(__LINUX__) || defined(__sgi ) || \
|
||||||
defined(__hpux) || defined(sun) || defined(__SUN__) || defined(_AIX)
|
defined(__hpux) || defined(sun) || defined(__SUN__) || defined(_AIX) || \
|
||||||
|
defined(__EMX__)
|
||||||
|
|
||||||
#ifndef __UNIX__
|
#ifndef __UNIX__
|
||||||
#define __UNIX__
|
#define __UNIX__
|
||||||
|
@@ -29,6 +29,14 @@ WXDLLEXPORT_DATA(extern const char*) wxTreeCtrlNameStr;
|
|||||||
#include "wx/scrolwin.h"
|
#include "wx/scrolwin.h"
|
||||||
#include "wx/textctrl.h"
|
#include "wx/textctrl.h"
|
||||||
#include "wx/pen.h"
|
#include "wx/pen.h"
|
||||||
|
#include "wx/dynarray.h"
|
||||||
|
|
||||||
|
#ifndef wxTR_SINGLE
|
||||||
|
#define wxTR_SINGLE 0x0000
|
||||||
|
#define wxTR_MULTIPLE 0x0020
|
||||||
|
#define wxTR_EXTENDED 0x0040
|
||||||
|
#define wxTR_HAS_VARIABLE_ROW_HIGHT 0x0080
|
||||||
|
#endif
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// constants
|
// constants
|
||||||
@@ -36,11 +44,31 @@ WXDLLEXPORT_DATA(extern const char*) wxTreeCtrlNameStr;
|
|||||||
|
|
||||||
// values for the `flags' parameter of wxTreeCtrl::HitTest() which determine
|
// values for the `flags' parameter of wxTreeCtrl::HitTest() which determine
|
||||||
// where exactly the specified point is situated:
|
// where exactly the specified point is situated:
|
||||||
|
|
||||||
|
static const int wxTREE_HITTEST_ABOVE = 0x0001;
|
||||||
|
static const int wxTREE_HITTEST_BELOW = 0x0002;
|
||||||
static const int wxTREE_HITTEST_NOWHERE = 0x0004;
|
static const int wxTREE_HITTEST_NOWHERE = 0x0004;
|
||||||
|
// on the button associated with an item.
|
||||||
|
static const int wxTREE_HITTEST_ONITEMBUTTON = 0x0008;
|
||||||
// on the bitmap associated with an item.
|
// on the bitmap associated with an item.
|
||||||
static const int wxTREE_HITTEST_ONITEMICON = 0x0020;
|
static const int wxTREE_HITTEST_ONITEMICON = 0x0010;
|
||||||
|
// on the ident associated with an item.
|
||||||
|
static const int wxTREE_HITTEST_ONITEMIDENT = 0x0020;
|
||||||
// on the label (string) associated with an item.
|
// on the label (string) associated with an item.
|
||||||
static const int wxTREE_HITTEST_ONITEMLABEL = 0x0080;
|
static const int wxTREE_HITTEST_ONITEMLABEL = 0x0040;
|
||||||
|
// on the right of the label associated with an item.
|
||||||
|
static const int wxTREE_HITTEST_ONITEMRIGHT = 0x0080;
|
||||||
|
// on the label (string) associated with an item.
|
||||||
|
//static const int wxTREE_HITTEST_ONITEMSTATEICON = 0x0100;
|
||||||
|
// on the left of the wxTreeCtrl.
|
||||||
|
static const int wxTREE_HITTEST_TOLEFT = 0x0200;
|
||||||
|
// on the right of the wxTreeCtrl.
|
||||||
|
static const int wxTREE_HITTEST_TORIGHT = 0x0400;
|
||||||
|
// on the upper part (first half) of the item.
|
||||||
|
static const int wxTREE_HITTEST_ONITEMUPPERPART = 0x0800;
|
||||||
|
// on the lower part (second half) of the item.
|
||||||
|
static const int wxTREE_HITTEST_ONITEMLOWERPART = 0x1000;
|
||||||
|
|
||||||
// anywhere on the item
|
// anywhere on the item
|
||||||
static const int wxTREE_HITTEST_ONITEM = wxTREE_HITTEST_ONITEMICON |
|
static const int wxTREE_HITTEST_ONITEM = wxTREE_HITTEST_ONITEMICON |
|
||||||
wxTREE_HITTEST_ONITEMLABEL;
|
wxTREE_HITTEST_ONITEMLABEL;
|
||||||
@@ -84,6 +112,8 @@ public:
|
|||||||
wxGenericTreeItem *m_pItem;
|
wxGenericTreeItem *m_pItem;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
WX_DECLARE_OBJARRAY(wxTreeItemId, wxArrayTreeItemIds);
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxTreeItemData is some (arbitrary) user class associated with some item.
|
// wxTreeItemData is some (arbitrary) user class associated with some item.
|
||||||
//
|
//
|
||||||
@@ -324,7 +354,7 @@ public:
|
|||||||
wxTreeItemId GetSelection() const { return m_current; }
|
wxTreeItemId GetSelection() const { return m_current; }
|
||||||
|
|
||||||
// get the items currently selected, return the number of such item
|
// get the items currently selected, return the number of such item
|
||||||
//size_t GetSelections(wxArrayTreeItems*) const;
|
size_t GetSelections(wxArrayTreeItemIds&) const;
|
||||||
|
|
||||||
// get the parent of this item (may return NULL if root)
|
// get the parent of this item (may return NULL if root)
|
||||||
wxTreeItemId GetParent(const wxTreeItemId& item) const;
|
wxTreeItemId GetParent(const wxTreeItemId& item) const;
|
||||||
@@ -405,7 +435,7 @@ public:
|
|||||||
void Unselect();
|
void Unselect();
|
||||||
void UnselectAll();
|
void UnselectAll();
|
||||||
// select this item
|
// select this item
|
||||||
void SelectItem(const wxTreeItemId& item, bool unselect_others=TRUE, bool extended_select=FALSE);
|
void SelectItem(const wxTreeItemId& item, bool unselect_others=true, bool extended_select=false);
|
||||||
// make sure this item is visible (expanding the parent item and/or
|
// make sure this item is visible (expanding the parent item and/or
|
||||||
// scrolling to this item if necessary)
|
// scrolling to this item if necessary)
|
||||||
void EnsureVisible(const wxTreeItemId& item);
|
void EnsureVisible(const wxTreeItemId& item);
|
||||||
@@ -454,9 +484,15 @@ public:
|
|||||||
// implementation
|
// implementation
|
||||||
void SendDeleteEvent(wxGenericTreeItem *itemBeingDeleted);
|
void SendDeleteEvent(wxGenericTreeItem *itemBeingDeleted);
|
||||||
|
|
||||||
|
// Draw Special Information
|
||||||
|
void DrawBorder(wxTreeItemId& item);
|
||||||
|
void DrawLine(wxTreeItemId& item, bool below);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
friend class wxGenericTreeItem;
|
||||||
|
|
||||||
wxGenericTreeItem *m_anchor;
|
wxGenericTreeItem *m_anchor;
|
||||||
wxGenericTreeItem *m_current;
|
wxGenericTreeItem *m_current, *m_key_current;
|
||||||
bool m_hasFocus;
|
bool m_hasFocus;
|
||||||
bool m_dirty;
|
bool m_dirty;
|
||||||
int m_xScroll,m_yScroll;
|
int m_xScroll,m_yScroll;
|
||||||
@@ -480,15 +516,18 @@ protected:
|
|||||||
wxTreeItemData *data);
|
wxTreeItemData *data);
|
||||||
|
|
||||||
void AdjustMyScrollbars();
|
void AdjustMyScrollbars();
|
||||||
|
int GetLineHeight(wxGenericTreeItem *item) const;
|
||||||
void PaintLevel( wxGenericTreeItem *item, wxDC& dc, int level, int &y );
|
void PaintLevel( wxGenericTreeItem *item, wxDC& dc, int level, int &y );
|
||||||
void PaintItem( wxGenericTreeItem *item, wxDC& dc);
|
void PaintItem( wxGenericTreeItem *item, wxDC& dc);
|
||||||
|
|
||||||
void CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y );
|
void CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y );
|
||||||
void CalculatePositions();
|
void CalculatePositions();
|
||||||
|
void CalculateSize( wxGenericTreeItem *item, wxDC &dc );
|
||||||
|
|
||||||
void RefreshSubtree( wxGenericTreeItem *item );
|
void RefreshSubtree( wxGenericTreeItem *item );
|
||||||
void RefreshLine( wxGenericTreeItem *item );
|
void RefreshLine( wxGenericTreeItem *item );
|
||||||
|
|
||||||
|
void FillArray(wxGenericTreeItem*, wxArrayTreeItemIds&) const;
|
||||||
void SelectItemRange( wxGenericTreeItem *item1, wxGenericTreeItem *item2 );
|
void SelectItemRange( wxGenericTreeItem *item1, wxGenericTreeItem *item2 );
|
||||||
bool TagAllChildrenUntilLast(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select);
|
bool TagAllChildrenUntilLast(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select);
|
||||||
bool TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select);
|
bool TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select);
|
||||||
|
@@ -42,6 +42,10 @@ public:
|
|||||||
wxMask( const wxBitmap& bitmap );
|
wxMask( const wxBitmap& bitmap );
|
||||||
~wxMask();
|
~wxMask();
|
||||||
|
|
||||||
|
bool Create( const wxBitmap& bitmap, const wxColour& colour );
|
||||||
|
bool Create( const wxBitmap& bitmap, int paletteIndex );
|
||||||
|
bool Create( const wxBitmap& bitmap );
|
||||||
|
|
||||||
// implementation
|
// implementation
|
||||||
|
|
||||||
GdkBitmap *m_bitmap;
|
GdkBitmap *m_bitmap;
|
||||||
|
@@ -42,6 +42,10 @@ public:
|
|||||||
wxMask( const wxBitmap& bitmap );
|
wxMask( const wxBitmap& bitmap );
|
||||||
~wxMask();
|
~wxMask();
|
||||||
|
|
||||||
|
bool Create( const wxBitmap& bitmap, const wxColour& colour );
|
||||||
|
bool Create( const wxBitmap& bitmap, int paletteIndex );
|
||||||
|
bool Create( const wxBitmap& bitmap );
|
||||||
|
|
||||||
// implementation
|
// implementation
|
||||||
|
|
||||||
GdkBitmap *m_bitmap;
|
GdkBitmap *m_bitmap;
|
||||||
|
@@ -20,6 +20,10 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __EMX__
|
||||||
|
#include <std.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
@@ -99,6 +103,8 @@ inline int WXDLLEXPORT Stricmp(const char *psz1, const char *psz2)
|
|||||||
return stricmp(psz1, psz2);
|
return stricmp(psz1, psz2);
|
||||||
#elif defined(__WATCOMC__)
|
#elif defined(__WATCOMC__)
|
||||||
return stricmp(psz1, psz2);
|
return stricmp(psz1, psz2);
|
||||||
|
#elif defined(__EMX__)
|
||||||
|
return stricmp(psz1, psz2);
|
||||||
#elif defined(__UNIX__) || defined(__GNUWIN32__)
|
#elif defined(__UNIX__) || defined(__GNUWIN32__)
|
||||||
return strcasecmp(psz1, psz2);
|
return strcasecmp(psz1, psz2);
|
||||||
#elif defined(__MWERKS__) && !defined(__INTEL__)
|
#elif defined(__MWERKS__) && !defined(__INTEL__)
|
||||||
|
@@ -200,6 +200,7 @@ void MyCanvas::CreateAntiAliasedBitmap()
|
|||||||
dc.DrawText( "And a Rectangle.", 20, 60 );
|
dc.DrawText( "And a Rectangle.", 20, 60 );
|
||||||
|
|
||||||
dc.SetBrush( *wxRED_BRUSH );
|
dc.SetBrush( *wxRED_BRUSH );
|
||||||
|
dc.SetPen( *wxTRANSPARENT_PEN );
|
||||||
dc.DrawRoundedRectangle( 20, 100, 200, 180, 20 );
|
dc.DrawRoundedRectangle( 20, 100, 200, 180, 20 );
|
||||||
|
|
||||||
wxImage original( bitmap );
|
wxImage original( bitmap );
|
||||||
|
@@ -25,15 +25,9 @@
|
|||||||
#include "wx/wx.h"
|
#include "wx/wx.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// under Windows the icons are in the .rc file
|
|
||||||
#ifndef __WXMSW__
|
|
||||||
#include "icon1.xpm"
|
|
||||||
#include "icon2.xpm"
|
|
||||||
#include "mondrian.xpm"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "wx/log.h"
|
#include "wx/log.h"
|
||||||
|
|
||||||
|
#include "wx/image.h"
|
||||||
#include "wx/imaglist.h"
|
#include "wx/imaglist.h"
|
||||||
#include "wx/treectrl.h"
|
#include "wx/treectrl.h"
|
||||||
|
|
||||||
@@ -41,6 +35,18 @@
|
|||||||
|
|
||||||
#include "treetest.h"
|
#include "treetest.h"
|
||||||
|
|
||||||
|
#define USE_TR_HAS_VARIABLE_ROW_HIGHT 1
|
||||||
|
|
||||||
|
// under Windows the icons are in the .rc file
|
||||||
|
#ifndef __WXMSW__
|
||||||
|
#if !USE_TR_HAS_VARIABLE_ROW_HIGHT
|
||||||
|
#include "icon1.xpm"
|
||||||
|
#endif
|
||||||
|
#include "icon2.xpm"
|
||||||
|
#include "mondrian.xpm"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// verify that the item is ok and insult the user if it is not
|
// verify that the item is ok and insult the user if it is not
|
||||||
#define CHECK_ITEM( item ) if ( !item.IsOk() ) { \
|
#define CHECK_ITEM( item ) if ( !item.IsOk() ) { \
|
||||||
wxMessageBox("Please select some item first!", \
|
wxMessageBox("Please select some item first!", \
|
||||||
@@ -54,6 +60,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
|||||||
EVT_MENU(TreeTest_Quit, MyFrame::OnQuit)
|
EVT_MENU(TreeTest_Quit, MyFrame::OnQuit)
|
||||||
EVT_MENU(TreeTest_About, MyFrame::OnAbout)
|
EVT_MENU(TreeTest_About, MyFrame::OnAbout)
|
||||||
EVT_MENU(TreeTest_Dump, MyFrame::OnDump)
|
EVT_MENU(TreeTest_Dump, MyFrame::OnDump)
|
||||||
|
EVT_MENU(TreeTest_Dump_Selected, MyFrame::OnDumpSelected)
|
||||||
EVT_MENU(TreeTest_Rename, MyFrame::OnRename)
|
EVT_MENU(TreeTest_Rename, MyFrame::OnRename)
|
||||||
EVT_MENU(TreeTest_Sort, MyFrame::OnSort)
|
EVT_MENU(TreeTest_Sort, MyFrame::OnSort)
|
||||||
EVT_MENU(TreeTest_SortRev, MyFrame::OnSortRev)
|
EVT_MENU(TreeTest_SortRev, MyFrame::OnSortRev)
|
||||||
@@ -146,9 +153,11 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h)
|
|||||||
tree_menu->Append(TreeTest_IncSpacing, "Add 5 points to spacing\tCtrl-I");
|
tree_menu->Append(TreeTest_IncSpacing, "Add 5 points to spacing\tCtrl-I");
|
||||||
tree_menu->Append(TreeTest_DecSpacing, "Reduce spacing by 5 points\tCtrl-R");
|
tree_menu->Append(TreeTest_DecSpacing, "Reduce spacing by 5 points\tCtrl-R");
|
||||||
|
|
||||||
item_menu->Append(TreeTest_Dump, "&Dump item children");
|
|
||||||
item_menu->AppendSeparator();
|
item_menu->AppendSeparator();
|
||||||
|
item_menu->Append(TreeTest_Dump, "&Dump item children");
|
||||||
|
item_menu->Append(TreeTest_Dump_Selected, "Dump selected items\tAlt-S");
|
||||||
item_menu->Append(TreeTest_Rename, "&Rename item...");
|
item_menu->Append(TreeTest_Rename, "&Rename item...");
|
||||||
|
|
||||||
item_menu->AppendSeparator();
|
item_menu->AppendSeparator();
|
||||||
item_menu->Append(TreeTest_Bold, "Make item &bold");
|
item_menu->Append(TreeTest_Bold, "Make item &bold");
|
||||||
item_menu->Append(TreeTest_UnBold, "Make item ¬ bold");
|
item_menu->Append(TreeTest_UnBold, "Make item ¬ bold");
|
||||||
@@ -161,9 +170,12 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h)
|
|||||||
|
|
||||||
m_treeCtrl = new MyTreeCtrl(this, TreeTest_Ctrl,
|
m_treeCtrl = new MyTreeCtrl(this, TreeTest_Ctrl,
|
||||||
wxDefaultPosition, wxDefaultSize,
|
wxDefaultPosition, wxDefaultSize,
|
||||||
wxTR_HAS_BUTTONS | wxSUNKEN_BORDER
|
wxTR_HAS_BUTTONS |
|
||||||
| wxTR_MULTIPLE
|
wxTR_MULTIPLE |
|
||||||
);
|
#if USE_TR_HAS_VARIABLE_ROW_HIGHT
|
||||||
|
wxTR_HAS_VARIABLE_ROW_HIGHT |
|
||||||
|
#endif
|
||||||
|
wxSUNKEN_BORDER);
|
||||||
wxTextCtrl *textCtrl = new wxTextCtrl(this, -1, "",
|
wxTextCtrl *textCtrl = new wxTextCtrl(this, -1, "",
|
||||||
wxDefaultPosition, wxDefaultSize,
|
wxDefaultPosition, wxDefaultSize,
|
||||||
wxTE_MULTILINE | wxSUNKEN_BORDER);
|
wxTE_MULTILINE | wxSUNKEN_BORDER);
|
||||||
@@ -250,6 +262,18 @@ void MyFrame::OnDump(wxCommandEvent& WXUNUSED(event))
|
|||||||
m_treeCtrl->GetItemsRecursively(root, -1);
|
m_treeCtrl->GetItemsRecursively(root, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MyFrame::OnDumpSelected(wxCommandEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
wxArrayTreeItemIds array;
|
||||||
|
|
||||||
|
m_treeCtrl->GetSelections(array);
|
||||||
|
size_t nos=array.Count();
|
||||||
|
wxLogMessage(wxString("items selected : ")<< (int)nos);
|
||||||
|
|
||||||
|
for (size_t n=0; n<nos; ++n)
|
||||||
|
wxLogMessage(m_treeCtrl->GetItemText(array.Item(n)));
|
||||||
|
}
|
||||||
|
|
||||||
void MyFrame::DoSetBold(bool bold)
|
void MyFrame::DoSetBold(bool bold)
|
||||||
{
|
{
|
||||||
wxTreeItemId item = m_treeCtrl->GetSelection();
|
wxTreeItemId item = m_treeCtrl->GetSelection();
|
||||||
@@ -346,6 +370,13 @@ MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id,
|
|||||||
long style)
|
long style)
|
||||||
: wxTreeCtrl(parent, id, pos, size, style)
|
: wxTreeCtrl(parent, id, pos, size, style)
|
||||||
{
|
{
|
||||||
|
#if USE_TR_HAS_VARIABLE_ROW_HIGHT
|
||||||
|
wxImage::AddHandler(new wxJPEGHandler);
|
||||||
|
wxImage image;
|
||||||
|
|
||||||
|
image.LoadFile(wxString("horse.jpg"), wxBITMAP_TYPE_JPEG );
|
||||||
|
#endif
|
||||||
|
|
||||||
m_reverseSort = FALSE;
|
m_reverseSort = FALSE;
|
||||||
|
|
||||||
// Make an image list containing small icons
|
// Make an image list containing small icons
|
||||||
@@ -355,10 +386,18 @@ MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id,
|
|||||||
#if defined(__WXMSW__) && defined(__WIN16__)
|
#if defined(__WXMSW__) && defined(__WIN16__)
|
||||||
// This is required in 16-bit Windows mode only because we can't load a specific (16x16)
|
// This is required in 16-bit Windows mode only because we can't load a specific (16x16)
|
||||||
// icon image, so it comes out stretched
|
// icon image, so it comes out stretched
|
||||||
|
# if USE_TR_HAS_VARIABLE_ROW_HIGHT
|
||||||
|
m_imageListNormal->Add(image.ConvertToBitmap());
|
||||||
|
# else
|
||||||
m_imageListNormal->Add(wxBitmap("bitmap1", wxBITMAP_TYPE_BMP_RESOURCE));
|
m_imageListNormal->Add(wxBitmap("bitmap1", wxBITMAP_TYPE_BMP_RESOURCE));
|
||||||
|
# endif
|
||||||
m_imageListNormal->Add(wxBitmap("bitmap2", wxBITMAP_TYPE_BMP_RESOURCE));
|
m_imageListNormal->Add(wxBitmap("bitmap2", wxBITMAP_TYPE_BMP_RESOURCE));
|
||||||
|
#else
|
||||||
|
# if USE_TR_HAS_VARIABLE_ROW_HIGHT
|
||||||
|
m_imageListNormal->Add(image.ConvertToBitmap());
|
||||||
# else
|
# else
|
||||||
m_imageListNormal->Add(wxICON(icon1));
|
m_imageListNormal->Add(wxICON(icon1));
|
||||||
|
# endif
|
||||||
m_imageListNormal->Add(wxICON(icon2));
|
m_imageListNormal->Add(wxICON(icon2));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -102,6 +102,7 @@ public:
|
|||||||
void OnAbout(wxCommandEvent& event);
|
void OnAbout(wxCommandEvent& event);
|
||||||
|
|
||||||
void OnDump(wxCommandEvent& event);
|
void OnDump(wxCommandEvent& event);
|
||||||
|
void OnDumpSelected(wxCommandEvent& event);
|
||||||
void OnDelete(wxCommandEvent& event);
|
void OnDelete(wxCommandEvent& event);
|
||||||
void OnDeleteChildren(wxCommandEvent& event);
|
void OnDeleteChildren(wxCommandEvent& event);
|
||||||
void OnDeleteAll(wxCommandEvent& event);
|
void OnDeleteAll(wxCommandEvent& event);
|
||||||
@@ -141,6 +142,7 @@ enum
|
|||||||
TreeTest_Quit,
|
TreeTest_Quit,
|
||||||
TreeTest_About,
|
TreeTest_About,
|
||||||
TreeTest_Dump,
|
TreeTest_Dump,
|
||||||
|
TreeTest_Dump_Selected,
|
||||||
TreeTest_Sort,
|
TreeTest_Sort,
|
||||||
TreeTest_SortRev,
|
TreeTest_SortRev,
|
||||||
TreeTest_Bold,
|
TreeTest_Bold,
|
||||||
|
@@ -130,7 +130,7 @@ bool wxHTTP::ParseHeaders()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
tokenzr.SetString(line, " :\t\n\r");
|
tokenzr.SetString(line, " :\t\n\r");
|
||||||
if (!tokenzr.HasMoreToken())
|
if (!tokenzr.HasMoreTokens())
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
wxString left_str = tokenzr.GetNextToken();
|
wxString left_str = tokenzr.GetNextToken();
|
||||||
|
@@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
#if defined(__linux__) || defined(__SVR4__) || defined(__SYSV__) || defined(__SGI__) || \
|
#if defined(__linux__) || defined(__SVR4__) || defined(__SYSV__) || defined(__SGI__) || \
|
||||||
defined(__ALPHA__) || defined(__GNUWIN32__) || defined(__FreeBSD__) || defined(__NetBSD__) || \
|
defined(__ALPHA__) || defined(__GNUWIN32__) || defined(__FreeBSD__) || defined(__NetBSD__) || \
|
||||||
defined(__SALFORDC__)
|
defined(__SALFORDC__) || defined(__EMX__)
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -73,15 +73,17 @@ extern "C" int gettimeofday(struct timeval *tp, void *);
|
|||||||
long wxStartTime = 0;
|
long wxStartTime = 0;
|
||||||
void wxStartTimer(void)
|
void wxStartTimer(void)
|
||||||
{
|
{
|
||||||
#if defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__)
|
#if defined(__EMX__) || defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || \
|
||||||
|
(defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__)
|
||||||
struct timeval tp;
|
struct timeval tp;
|
||||||
#if defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__))
|
#if defined(__EMX__) || defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__))
|
||||||
gettimeofday(&tp, (struct timezone *)NULL);
|
gettimeofday(&tp, (struct timezone *)NULL);
|
||||||
#else
|
#else
|
||||||
gettimeofday(&tp);
|
gettimeofday(&tp);
|
||||||
#endif
|
#endif
|
||||||
wxStartTime = 1000*tp.tv_sec + tp.tv_usec/1000;
|
wxStartTime = 1000*tp.tv_sec + tp.tv_usec/1000;
|
||||||
#elif (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__) || defined(__MINGW32__) || defined(__MWERKS__) || defined(__FreeBSD__) )
|
#elif (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__) || \
|
||||||
|
defined(__MINGW32__) || defined(__MWERKS__) || defined(__FreeBSD__) )
|
||||||
time_t t0;
|
time_t t0;
|
||||||
struct tm *tp;
|
struct tm *tp;
|
||||||
time(&t0);
|
time(&t0);
|
||||||
@@ -97,7 +99,8 @@ void wxStartTimer(void)
|
|||||||
// Returns elapsed time in milliseconds
|
// Returns elapsed time in milliseconds
|
||||||
long wxGetElapsedTime(bool resetTimer)
|
long wxGetElapsedTime(bool resetTimer)
|
||||||
{
|
{
|
||||||
#if defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__)
|
#if defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || \
|
||||||
|
(defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__)
|
||||||
struct timeval tp;
|
struct timeval tp;
|
||||||
#if defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__))
|
#if defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__))
|
||||||
gettimeofday(&tp, (struct timezone *)NULL);
|
gettimeofday(&tp, (struct timezone *)NULL);
|
||||||
@@ -108,7 +111,8 @@ long wxGetElapsedTime(bool resetTimer)
|
|||||||
long newTime = 1000*tp.tv_sec + tp.tv_usec / 1000;
|
long newTime = 1000*tp.tv_sec + tp.tv_usec / 1000;
|
||||||
if (resetTimer)
|
if (resetTimer)
|
||||||
wxStartTime = newTime;
|
wxStartTime = newTime;
|
||||||
#elif (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__) || defined(__MINGW32__)|| defined(__MWERKS__) || defined(__FreeBSD__))
|
#elif (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__) || \
|
||||||
|
defined(__MINGW32__)|| defined(__MWERKS__) || defined(__FreeBSD__))
|
||||||
time_t t0;
|
time_t t0;
|
||||||
struct tm *tp;
|
struct tm *tp;
|
||||||
time(&t0);
|
time(&t0);
|
||||||
|
@@ -168,6 +168,12 @@ int strncasecmp(const char *str_1, const char *str_2, size_t maxchar)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
#ifdef __EMX__
|
||||||
|
#define strcasecmp stricmp
|
||||||
|
#define strncasecmp strnicmp
|
||||||
|
#endif
|
||||||
|
|
||||||
// This declaration is missing in SunOS!
|
// This declaration is missing in SunOS!
|
||||||
// (Yes, I know it is NOT ANSI-C but its in BSD libc)
|
// (Yes, I know it is NOT ANSI-C but its in BSD libc)
|
||||||
#if defined(__xlC) || defined(__AIX__) || defined(__GNUG__)
|
#if defined(__xlC) || defined(__AIX__) || defined(__GNUG__)
|
||||||
|
@@ -34,6 +34,7 @@
|
|||||||
#include "wx/log.h"
|
#include "wx/log.h"
|
||||||
#include "wx/intl.h"
|
#include "wx/intl.h"
|
||||||
#include "wx/dynarray.h"
|
#include "wx/dynarray.h"
|
||||||
|
#include "wx/arrimpl.cpp"
|
||||||
#include "wx/dcclient.h"
|
#include "wx/dcclient.h"
|
||||||
#include "wx/msgdlg.h"
|
#include "wx/msgdlg.h"
|
||||||
|
|
||||||
@@ -43,7 +44,8 @@
|
|||||||
|
|
||||||
class WXDLLEXPORT wxGenericTreeItem;
|
class WXDLLEXPORT wxGenericTreeItem;
|
||||||
|
|
||||||
WX_DEFINE_ARRAY(wxGenericTreeItem *, wxArrayTreeItems);
|
WX_DEFINE_ARRAY(wxGenericTreeItem *, wxArrayGenericTreeItems);
|
||||||
|
WX_DEFINE_OBJARRAY(wxArrayTreeItemIds);
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// private classes
|
// private classes
|
||||||
@@ -64,14 +66,14 @@ public:
|
|||||||
~wxGenericTreeItem();
|
~wxGenericTreeItem();
|
||||||
|
|
||||||
// trivial accessors
|
// trivial accessors
|
||||||
wxArrayTreeItems& GetChildren() { return m_children; }
|
wxArrayGenericTreeItems& GetChildren() { return m_children; }
|
||||||
|
|
||||||
const wxString& GetText() const { return m_text; }
|
const wxString& GetText() const { return m_text; }
|
||||||
int GetImage() const { return m_image; }
|
int GetImage() const { return m_image; }
|
||||||
int GetSelectedImage() const { return m_selImage; }
|
int GetSelectedImage() const { return m_selImage; }
|
||||||
wxTreeItemData *GetData() const { return m_data; }
|
wxTreeItemData *GetData() const { return m_data; }
|
||||||
|
|
||||||
void SetText( const wxString &text, wxDC& dc );
|
void SetText( const wxString &text );
|
||||||
void SetImage(int image) { m_image = image; }
|
void SetImage(int image) { m_image = image; }
|
||||||
void SetSelectedImage(int image) { m_selImage = image; }
|
void SetSelectedImage(int image) { m_selImage = image; }
|
||||||
void SetData(wxTreeItemData *data) { m_data = data; }
|
void SetData(wxTreeItemData *data) { m_data = data; }
|
||||||
@@ -83,11 +85,16 @@ public:
|
|||||||
int GetX() const { return m_x; }
|
int GetX() const { return m_x; }
|
||||||
int GetY() const { return m_y; }
|
int GetY() const { return m_y; }
|
||||||
|
|
||||||
void SetHeight(int h) { m_text_height = h; }
|
|
||||||
|
|
||||||
void SetX(int x) { m_x = x; }
|
void SetX(int x) { m_x = x; }
|
||||||
void SetY(int y) { m_y = y; }
|
void SetY(int y) { m_y = y; }
|
||||||
|
|
||||||
|
int GetHeight() const { return m_height; }
|
||||||
|
int GetWidth() const { return m_width; }
|
||||||
|
|
||||||
|
void SetHeight(int h) { m_height = h; }
|
||||||
|
void SetWidth(int w) { m_width = w; }
|
||||||
|
|
||||||
|
|
||||||
wxGenericTreeItem *GetParent() const { return m_parent; }
|
wxGenericTreeItem *GetParent() const { return m_parent; }
|
||||||
|
|
||||||
// operations
|
// operations
|
||||||
@@ -104,12 +111,12 @@ public:
|
|||||||
{ m_children.Insert(child, index); }
|
{ m_children.Insert(child, index); }
|
||||||
|
|
||||||
void SetCross( int x, int y );
|
void SetCross( int x, int y );
|
||||||
void GetSize( int &x, int &y );
|
void GetSize( int &x, int &y, const wxTreeCtrl* );
|
||||||
|
|
||||||
// return the item at given position (or NULL if no item), onButton is TRUE
|
// return the item at given position (or NULL if no item), onButton is TRUE
|
||||||
// if the point belongs to the item's button, otherwise it lies on the
|
// if the point belongs to the item's button, otherwise it lies on the
|
||||||
// button's label
|
// button's label
|
||||||
wxGenericTreeItem *HitTest( const wxPoint& point, bool &onButton );
|
wxGenericTreeItem *HitTest( const wxPoint& point, const wxTreeCtrl *, int &flags);
|
||||||
|
|
||||||
void Expand() { m_isCollapsed = FALSE; }
|
void Expand() { m_isCollapsed = FALSE; }
|
||||||
void Collapse() { m_isCollapsed = TRUE; }
|
void Collapse() { m_isCollapsed = TRUE; }
|
||||||
@@ -139,10 +146,10 @@ private:
|
|||||||
int m_isBold :1; // render the label in bold font
|
int m_isBold :1; // render the label in bold font
|
||||||
|
|
||||||
int m_x, m_y;
|
int m_x, m_y;
|
||||||
long m_text_height, m_text_width;
|
long m_height, m_width;
|
||||||
int m_xCross, m_yCross;
|
int m_xCross, m_yCross;
|
||||||
int m_level;
|
int m_level;
|
||||||
wxArrayTreeItems m_children;
|
wxArrayGenericTreeItems m_children;
|
||||||
wxGenericTreeItem *m_parent;
|
wxGenericTreeItem *m_parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -150,6 +157,7 @@ private:
|
|||||||
// implementation
|
// implementation
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
|
|
||||||
|
#define PIXELS_PER_UNIT 10
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// wxTreeEvent
|
// wxTreeEvent
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@@ -189,7 +197,11 @@ wxGenericTreeItem::wxGenericTreeItem(wxGenericTreeItem *parent,
|
|||||||
|
|
||||||
m_parent = parent;
|
m_parent = parent;
|
||||||
|
|
||||||
dc.GetTextExtent( m_text, &m_text_width, &m_text_height );
|
dc.GetTextExtent( m_text, &m_width, &m_height );
|
||||||
|
// TODO : Add the width of the image
|
||||||
|
// PB : We don't know which image is shown (image, selImage)
|
||||||
|
// We don't even know imageList from the treectrl this item belongs to !!!
|
||||||
|
// At this point m_width doesn't mean much, this can be remove !
|
||||||
}
|
}
|
||||||
|
|
||||||
wxGenericTreeItem::~wxGenericTreeItem()
|
wxGenericTreeItem::~wxGenericTreeItem()
|
||||||
@@ -218,11 +230,9 @@ void wxGenericTreeItem::DeleteChildren(wxTreeCtrl *tree)
|
|||||||
m_children.Empty();
|
m_children.Empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxGenericTreeItem::SetText( const wxString &text, wxDC& dc )
|
void wxGenericTreeItem::SetText( const wxString &text )
|
||||||
{
|
{
|
||||||
m_text = text;
|
m_text = text;
|
||||||
|
|
||||||
dc.GetTextExtent( m_text, &m_text_width, &m_text_height );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxGenericTreeItem::Reset()
|
void wxGenericTreeItem::Reset()
|
||||||
@@ -232,7 +242,7 @@ void wxGenericTreeItem::Reset()
|
|||||||
m_selImage = -1;
|
m_selImage = -1;
|
||||||
m_data = NULL;
|
m_data = NULL;
|
||||||
m_x = m_y =
|
m_x = m_y =
|
||||||
m_text_height = m_text_width = 0;
|
m_height = m_width = 0;
|
||||||
m_xCross =
|
m_xCross =
|
||||||
m_yCross = 0;
|
m_yCross = 0;
|
||||||
|
|
||||||
@@ -251,7 +261,7 @@ size_t wxGenericTreeItem::GetChildrenCount(bool recursively) const
|
|||||||
return count;
|
return count;
|
||||||
|
|
||||||
size_t total = count;
|
size_t total = count;
|
||||||
for ( size_t n = 0; n < count; n++ )
|
for ( size_t n = 0; n < count; ++n )
|
||||||
{
|
{
|
||||||
total += m_children[n]->GetChildrenCount();
|
total += m_children[n]->GetChildrenCount();
|
||||||
}
|
}
|
||||||
@@ -265,47 +275,60 @@ void wxGenericTreeItem::SetCross( int x, int y )
|
|||||||
m_yCross = y;
|
m_yCross = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxGenericTreeItem::GetSize( int &x, int &y )
|
void wxGenericTreeItem::GetSize( int &x, int &y, const wxTreeCtrl *theTree )
|
||||||
{
|
{
|
||||||
if ( y < m_y ) y = m_y;
|
int bottomY=m_y+theTree->GetLineHeight(this);
|
||||||
int width = m_x + m_text_width;
|
if ( y < bottomY ) y = bottomY;
|
||||||
if (width > x) x = width;
|
int width = m_x + m_width;
|
||||||
|
if ( x < width ) x = width;
|
||||||
|
|
||||||
if (IsExpanded())
|
if (IsExpanded())
|
||||||
{
|
{
|
||||||
size_t count = m_children.Count();
|
size_t count = m_children.Count();
|
||||||
for ( size_t n = 0; n < count; n++ )
|
for ( size_t n = 0; n < count; ++n )
|
||||||
{
|
{
|
||||||
m_children[n]->GetSize( x, y );
|
m_children[n]->GetSize( x, y, theTree );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wxGenericTreeItem *wxGenericTreeItem::HitTest( const wxPoint& point,
|
wxGenericTreeItem *wxGenericTreeItem::HitTest( const wxPoint& point,
|
||||||
bool &onButton )
|
const wxTreeCtrl *theTree,
|
||||||
|
int &flags)
|
||||||
{
|
{
|
||||||
if ((point.y > m_y) && (point.y < m_y + m_text_height))
|
if ((point.y > m_y) && (point.y < m_y + theTree->GetLineHeight(this)))
|
||||||
{
|
{
|
||||||
|
if (point.y<m_y+theTree->GetLineHeight(this)/2) flags|=wxTREE_HITTEST_ONITEMUPPERPART;
|
||||||
|
else flags|=wxTREE_HITTEST_ONITEMLOWERPART;
|
||||||
|
|
||||||
// FIXME why +5?
|
// FIXME why +5?
|
||||||
// Because that is the size of the plus sign, RR
|
// Because that is the size of the plus sign, RR
|
||||||
if ((point.x > m_xCross-5) && (point.x < m_xCross+5) &&
|
if ((point.x > m_xCross-5) && (point.x < m_xCross+5) &&
|
||||||
(point.y > m_yCross-5) && (point.y < m_yCross+5) &&
|
(point.y > m_yCross-5) && (point.y < m_yCross+5) &&
|
||||||
(IsExpanded() || HasPlus()))
|
(IsExpanded() || HasPlus()))
|
||||||
{
|
{
|
||||||
onButton = TRUE;
|
flags|=wxTREE_HITTEST_ONITEMBUTTON;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: we should do a query here like
|
if ((point.x >= m_x) && (point.x <= m_x+m_width))
|
||||||
m_imageListNormal->GetSize( item->GetImage(), image_w, image_h ); */
|
|
||||||
int w = m_text_width;
|
|
||||||
if (m_image != -1) w += 24;
|
|
||||||
|
|
||||||
if ((point.x > m_x) && (point.x < m_x+w))
|
|
||||||
{
|
{
|
||||||
onButton = FALSE;
|
int image_w,image_h;
|
||||||
|
|
||||||
|
// assuming every image (normal and selected ) has the same size !
|
||||||
|
theTree->m_imageListNormal->GetSize(m_image, image_w, image_h);
|
||||||
|
if (point.x<=m_x+image_w+1)
|
||||||
|
flags|=wxTREE_HITTEST_ONITEMICON;
|
||||||
|
else
|
||||||
|
flags|=wxTREE_HITTEST_ONITEMLABEL;
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (point.x < m_x) flags|=wxTREE_HITTEST_ONITEMIDENT;
|
||||||
|
if (point.x > m_x+m_width) flags|=wxTREE_HITTEST_ONITEMRIGHT;
|
||||||
|
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -314,13 +337,14 @@ wxGenericTreeItem *wxGenericTreeItem::HitTest( const wxPoint& point,
|
|||||||
size_t count = m_children.Count();
|
size_t count = m_children.Count();
|
||||||
for ( size_t n = 0; n < count; n++ )
|
for ( size_t n = 0; n < count; n++ )
|
||||||
{
|
{
|
||||||
wxGenericTreeItem *res = m_children[n]->HitTest( point, onButton );
|
wxGenericTreeItem *res = m_children[n]->HitTest( point, theTree, flags );
|
||||||
if ( res != NULL )
|
if ( res != NULL )
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flags|=wxTREE_HITTEST_NOWHERE;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -342,9 +366,11 @@ END_EVENT_TABLE()
|
|||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// construction/destruction
|
// construction/destruction
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
void wxTreeCtrl::Init()
|
void wxTreeCtrl::Init()
|
||||||
{
|
{
|
||||||
m_current =
|
m_current =
|
||||||
|
m_key_current =
|
||||||
m_anchor = (wxGenericTreeItem *) NULL;
|
m_anchor = (wxGenericTreeItem *) NULL;
|
||||||
m_hasFocus = FALSE;
|
m_hasFocus = FALSE;
|
||||||
m_dirty = FALSE;
|
m_dirty = FALSE;
|
||||||
@@ -460,7 +486,8 @@ void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text)
|
|||||||
|
|
||||||
wxClientDC dc(this);
|
wxClientDC dc(this);
|
||||||
wxGenericTreeItem *pItem = item.m_pItem;
|
wxGenericTreeItem *pItem = item.m_pItem;
|
||||||
pItem->SetText(text, dc);
|
pItem->SetText(text);
|
||||||
|
CalculateSize(pItem, dc);
|
||||||
RefreshLine(pItem);
|
RefreshLine(pItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -468,8 +495,10 @@ void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image)
|
|||||||
{
|
{
|
||||||
wxCHECK_RET( item.IsOk(), _T("invalid tree item") );
|
wxCHECK_RET( item.IsOk(), _T("invalid tree item") );
|
||||||
|
|
||||||
|
wxClientDC dc(this);
|
||||||
wxGenericTreeItem *pItem = item.m_pItem;
|
wxGenericTreeItem *pItem = item.m_pItem;
|
||||||
pItem->SetImage(image);
|
pItem->SetImage(image);
|
||||||
|
CalculateSize(pItem, dc);
|
||||||
RefreshLine(pItem);
|
RefreshLine(pItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -477,8 +506,10 @@ void wxTreeCtrl::SetItemSelectedImage(const wxTreeItemId& item, int image)
|
|||||||
{
|
{
|
||||||
wxCHECK_RET( item.IsOk(), _T("invalid tree item") );
|
wxCHECK_RET( item.IsOk(), _T("invalid tree item") );
|
||||||
|
|
||||||
|
wxClientDC dc(this);
|
||||||
wxGenericTreeItem *pItem = item.m_pItem;
|
wxGenericTreeItem *pItem = item.m_pItem;
|
||||||
pItem->SetSelectedImage(image);
|
pItem->SetSelectedImage(image);
|
||||||
|
CalculateSize(pItem, dc);
|
||||||
RefreshLine(pItem);
|
RefreshLine(pItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -573,7 +604,7 @@ wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& item, long& cookie) co
|
|||||||
{
|
{
|
||||||
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), _T("invalid tree item") );
|
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), _T("invalid tree item") );
|
||||||
|
|
||||||
wxArrayTreeItems& children = item.m_pItem->GetChildren();
|
wxArrayGenericTreeItems& children = item.m_pItem->GetChildren();
|
||||||
if ( (size_t)cookie < children.Count() )
|
if ( (size_t)cookie < children.Count() )
|
||||||
{
|
{
|
||||||
return children.Item(cookie++);
|
return children.Item(cookie++);
|
||||||
@@ -589,7 +620,7 @@ wxTreeItemId wxTreeCtrl::GetLastChild(const wxTreeItemId& item) const
|
|||||||
{
|
{
|
||||||
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), _T("invalid tree item") );
|
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), _T("invalid tree item") );
|
||||||
|
|
||||||
wxArrayTreeItems& children = item.m_pItem->GetChildren();
|
wxArrayGenericTreeItems& children = item.m_pItem->GetChildren();
|
||||||
return (children.IsEmpty() ? wxTreeItemId() : wxTreeItemId(children.Last()));
|
return (children.IsEmpty() ? wxTreeItemId() : wxTreeItemId(children.Last()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -605,7 +636,7 @@ wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const
|
|||||||
return wxTreeItemId();
|
return wxTreeItemId();
|
||||||
}
|
}
|
||||||
|
|
||||||
wxArrayTreeItems& siblings = parent->GetChildren();
|
wxArrayGenericTreeItems& siblings = parent->GetChildren();
|
||||||
int index = siblings.Index(i);
|
int index = siblings.Index(i);
|
||||||
wxASSERT( index != wxNOT_FOUND ); // I'm not a child of my parent?
|
wxASSERT( index != wxNOT_FOUND ); // I'm not a child of my parent?
|
||||||
|
|
||||||
@@ -625,7 +656,7 @@ wxTreeItemId wxTreeCtrl::GetPrevSibling(const wxTreeItemId& item) const
|
|||||||
return wxTreeItemId();
|
return wxTreeItemId();
|
||||||
}
|
}
|
||||||
|
|
||||||
wxArrayTreeItems& siblings = parent->GetChildren();
|
wxArrayGenericTreeItems& siblings = parent->GetChildren();
|
||||||
int index = siblings.Index(i);
|
int index = siblings.Index(i);
|
||||||
wxASSERT( index != wxNOT_FOUND ); // I'm not a child of my parent?
|
wxASSERT( index != wxNOT_FOUND ); // I'm not a child of my parent?
|
||||||
|
|
||||||
@@ -707,8 +738,8 @@ wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text,
|
|||||||
data->m_pItem = m_anchor;
|
data->m_pItem = m_anchor;
|
||||||
}
|
}
|
||||||
|
|
||||||
AdjustMyScrollbars();
|
|
||||||
Refresh();
|
Refresh();
|
||||||
|
AdjustMyScrollbars();
|
||||||
|
|
||||||
return m_anchor;
|
return m_anchor;
|
||||||
}
|
}
|
||||||
@@ -737,7 +768,7 @@ wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parentId,
|
|||||||
int index = parent->GetChildren().Index(idPrevious.m_pItem);
|
int index = parent->GetChildren().Index(idPrevious.m_pItem);
|
||||||
wxASSERT_MSG( index != wxNOT_FOUND,
|
wxASSERT_MSG( index != wxNOT_FOUND,
|
||||||
_T("previous item in wxTreeCtrl::InsertItem() is not a sibling") );
|
_T("previous item in wxTreeCtrl::InsertItem() is not a sibling") );
|
||||||
return DoInsertItem(parentId, (size_t)index, text, image, selImage, data);
|
return DoInsertItem(parentId, (size_t)++index, text, image, selImage, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parentId,
|
wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parentId,
|
||||||
@@ -848,7 +879,7 @@ void wxTreeCtrl::Collapse(const wxTreeItemId& itemId)
|
|||||||
|
|
||||||
item->Collapse();
|
item->Collapse();
|
||||||
|
|
||||||
wxArrayTreeItems& children = item->GetChildren();
|
wxArrayGenericTreeItems& children = item->GetChildren();
|
||||||
size_t count = children.Count();
|
size_t count = children.Count();
|
||||||
for ( size_t n = 0; n < count; n++ )
|
for ( size_t n = 0; n < count; n++ )
|
||||||
{
|
{
|
||||||
@@ -895,7 +926,7 @@ void wxTreeCtrl::UnselectAllChildren(wxGenericTreeItem *item)
|
|||||||
|
|
||||||
if (item->HasChildren())
|
if (item->HasChildren())
|
||||||
{
|
{
|
||||||
wxArrayTreeItems& children = item->GetChildren();
|
wxArrayGenericTreeItems& children = item->GetChildren();
|
||||||
size_t count = children.Count();
|
size_t count = children.Count();
|
||||||
for ( size_t n = 0; n < count; ++n )
|
for ( size_t n = 0; n < count; ++n )
|
||||||
UnselectAllChildren(children[n]);
|
UnselectAllChildren(children[n]);
|
||||||
@@ -909,10 +940,10 @@ void wxTreeCtrl::UnselectAll()
|
|||||||
|
|
||||||
// Recursive function !
|
// Recursive function !
|
||||||
// To stop we must have crt_item<last_item
|
// To stop we must have crt_item<last_item
|
||||||
// Algorithm =
|
// Algorithm :
|
||||||
// Tag all next children, when no more children,
|
// Tag all next children, when no more children,
|
||||||
// Move to parent (not to tag)
|
// Move to parent (not to tag)
|
||||||
// Keep going, if we found last_item, we stop
|
// Keep going... if we found last_item, we stop.
|
||||||
bool wxTreeCtrl::TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select)
|
bool wxTreeCtrl::TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select)
|
||||||
{
|
{
|
||||||
wxGenericTreeItem *parent = crt_item->GetParent();
|
wxGenericTreeItem *parent = crt_item->GetParent();
|
||||||
@@ -920,13 +951,13 @@ bool wxTreeCtrl::TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem
|
|||||||
if ( parent == NULL ) // This is root item
|
if ( parent == NULL ) // This is root item
|
||||||
return TagAllChildrenUntilLast(crt_item, last_item, select);
|
return TagAllChildrenUntilLast(crt_item, last_item, select);
|
||||||
|
|
||||||
wxArrayTreeItems& children = parent->GetChildren();
|
wxArrayGenericTreeItems& children = parent->GetChildren();
|
||||||
int index = children.Index(crt_item);
|
int index = children.Index(crt_item);
|
||||||
wxASSERT( index != wxNOT_FOUND ); // I'm not a child of my parent?
|
wxASSERT( index != wxNOT_FOUND ); // I'm not a child of my parent?
|
||||||
|
|
||||||
size_t count = children.Count();
|
size_t count = children.Count();
|
||||||
for (size_t n=(size_t)(index+1); n<count; ++n)
|
for (size_t n=(size_t)(index+1); n<count; ++n)
|
||||||
if (TagAllChildrenUntilLast(children[n], last_item, select)) return TRUE;
|
if (TagAllChildrenUntilLast(children[n], last_item, select)) return true;
|
||||||
|
|
||||||
return TagNextChildren(parent, last_item, select);
|
return TagNextChildren(parent, last_item, select);
|
||||||
}
|
}
|
||||||
@@ -936,17 +967,17 @@ bool wxTreeCtrl::TagAllChildrenUntilLast(wxGenericTreeItem *crt_item, wxGenericT
|
|||||||
crt_item->SetHilight(select);
|
crt_item->SetHilight(select);
|
||||||
RefreshLine(crt_item);
|
RefreshLine(crt_item);
|
||||||
|
|
||||||
if (crt_item==last_item) return TRUE;
|
if (crt_item==last_item) return true;
|
||||||
|
|
||||||
if (crt_item->HasChildren())
|
if (crt_item->HasChildren())
|
||||||
{
|
{
|
||||||
wxArrayTreeItems& children = crt_item->GetChildren();
|
wxArrayGenericTreeItems& children = crt_item->GetChildren();
|
||||||
size_t count = children.Count();
|
size_t count = children.Count();
|
||||||
for ( size_t n = 0; n < count; ++n )
|
for ( size_t n = 0; n < count; ++n )
|
||||||
if (TagAllChildrenUntilLast(children[n], last_item, select)) return TRUE;
|
if (TagAllChildrenUntilLast(children[n], last_item, select)) return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxTreeCtrl::SelectItemRange(wxGenericTreeItem *item1, wxGenericTreeItem *item2)
|
void wxTreeCtrl::SelectItemRange(wxGenericTreeItem *item1, wxGenericTreeItem *item2)
|
||||||
@@ -970,9 +1001,6 @@ void wxTreeCtrl::SelectItemRange(wxGenericTreeItem *item1, wxGenericTreeItem *it
|
|||||||
|
|
||||||
if (TagAllChildrenUntilLast(first,last,select)) return;
|
if (TagAllChildrenUntilLast(first,last,select)) return;
|
||||||
|
|
||||||
/*
|
|
||||||
cout << first->GetText() << " " << last->GetText() << " " << (int) select << endl;
|
|
||||||
*/
|
|
||||||
TagNextChildren(first,last,select);
|
TagNextChildren(first,last,select);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -988,8 +1016,8 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& itemId,
|
|||||||
// to keep going anyhow !!!
|
// to keep going anyhow !!!
|
||||||
if (is_single)
|
if (is_single)
|
||||||
{
|
{
|
||||||
unselect_others=TRUE;
|
unselect_others=true;
|
||||||
extended_select=FALSE;
|
extended_select=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxGenericTreeItem *item = itemId.m_pItem;
|
wxGenericTreeItem *item = itemId.m_pItem;
|
||||||
@@ -998,21 +1026,11 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& itemId,
|
|||||||
event.m_item = item;
|
event.m_item = item;
|
||||||
event.m_itemOld = m_current;
|
event.m_itemOld = m_current;
|
||||||
event.SetEventObject( this );
|
event.SetEventObject( this );
|
||||||
// Here we don't send any selection mode yet ! TO SEE
|
// TODO : Here we don't send any selection mode yet !
|
||||||
|
|
||||||
/*
|
|
||||||
if (m_current)
|
|
||||||
cout << m_current->GetText() << " " << (int)m_current->HasHilight() << endl;
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( GetEventHandler()->ProcessEvent( event ) && event.WasVetoed() )
|
if ( GetEventHandler()->ProcessEvent( event ) && event.WasVetoed() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
|
||||||
if (m_current)
|
|
||||||
cout << m_current->GetText() << " " << (int)m_current->HasHilight() << endl;
|
|
||||||
*/
|
|
||||||
|
|
||||||
// ctrl press
|
// ctrl press
|
||||||
if (unselect_others)
|
if (unselect_others)
|
||||||
{
|
{
|
||||||
@@ -1023,19 +1041,19 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& itemId,
|
|||||||
// shift press
|
// shift press
|
||||||
if (extended_select)
|
if (extended_select)
|
||||||
{
|
{
|
||||||
if (m_current == NULL) m_current=GetRootItem().m_pItem;
|
if (m_current == NULL) m_current=m_key_current=GetRootItem().m_pItem;
|
||||||
// don't change the mark (m_current)
|
// don't change the mark (m_current)
|
||||||
SelectItemRange(m_current, item);
|
SelectItemRange(m_current, item);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool select=TRUE; // the default
|
bool select=true; // the default
|
||||||
|
|
||||||
// Check if we need to toggle hilight (ctrl mode)
|
// Check if we need to toggle hilight (ctrl mode)
|
||||||
if (!unselect_others)
|
if (!unselect_others)
|
||||||
select=!item->HasHilight();
|
select=!item->HasHilight();
|
||||||
|
|
||||||
m_current = item;
|
m_current = m_key_current = item;
|
||||||
m_current->SetHilight(select);
|
m_current->SetHilight(select);
|
||||||
RefreshLine( m_current );
|
RefreshLine( m_current );
|
||||||
}
|
}
|
||||||
@@ -1044,8 +1062,31 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& itemId,
|
|||||||
GetEventHandler()->ProcessEvent( event );
|
GetEventHandler()->ProcessEvent( event );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxTreeCtrl::FillArray(wxGenericTreeItem *item, wxArrayTreeItemIds &array) const
|
||||||
|
{
|
||||||
|
if (item->HasHilight()) array.Add(wxTreeItemId(item));
|
||||||
|
|
||||||
|
if (item->HasChildren())
|
||||||
|
{
|
||||||
|
wxArrayGenericTreeItems& children = item->GetChildren();
|
||||||
|
size_t count = children.Count();
|
||||||
|
for ( size_t n = 0; n < count; ++n )
|
||||||
|
FillArray(children[n],array);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t wxTreeCtrl::GetSelections(wxArrayTreeItemIds &array) const
|
||||||
|
{
|
||||||
|
array.Empty();
|
||||||
|
FillArray(GetRootItem().m_pItem, array);
|
||||||
|
|
||||||
|
return array.Count();
|
||||||
|
}
|
||||||
|
|
||||||
void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
|
void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
|
||||||
{
|
{
|
||||||
|
if (!item.IsOk()) return;
|
||||||
|
|
||||||
wxGenericTreeItem *gitem = item.m_pItem;
|
wxGenericTreeItem *gitem = item.m_pItem;
|
||||||
|
|
||||||
// first expand all parent branches
|
// first expand all parent branches
|
||||||
@@ -1057,13 +1098,24 @@ void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
|
|||||||
parent = parent->GetParent();
|
parent = parent->GetParent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (parent) CalculatePositions();
|
||||||
|
|
||||||
|
ScrollTo(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxTreeCtrl::ScrollTo(const wxTreeItemId &item)
|
||||||
|
{
|
||||||
|
if (!item.IsOk()) return;
|
||||||
|
|
||||||
|
wxGenericTreeItem *gitem = item.m_pItem;
|
||||||
|
|
||||||
// now scroll to the item
|
// now scroll to the item
|
||||||
int item_y = gitem->GetY();
|
int item_y = gitem->GetY();
|
||||||
|
|
||||||
int start_x = 0;
|
int start_x = 0;
|
||||||
int start_y = 0;
|
int start_y = 0;
|
||||||
ViewStart( &start_x, &start_y );
|
ViewStart( &start_x, &start_y );
|
||||||
start_y *= 10;
|
start_y *= PIXELS_PER_UNIT;
|
||||||
|
|
||||||
int client_h = 0;
|
int client_h = 0;
|
||||||
int client_w = 0;
|
int client_w = 0;
|
||||||
@@ -1071,29 +1123,29 @@ void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
|
|||||||
|
|
||||||
if (item_y < start_y+3)
|
if (item_y < start_y+3)
|
||||||
{
|
{
|
||||||
|
// going down
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int y = 0;
|
int y = 0;
|
||||||
m_anchor->GetSize( x, y );
|
m_anchor->GetSize( x, y, this );
|
||||||
y += 2*m_lineHeight;
|
y += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels
|
||||||
int x_pos = GetScrollPos( wxHORIZONTAL );
|
int x_pos = GetScrollPos( wxHORIZONTAL );
|
||||||
SetScrollbars( 10, 10, x/10, y/10, x_pos, (item_y-client_h/2)/10 );
|
// Item should appear at top
|
||||||
|
SetScrollbars( PIXELS_PER_UNIT, PIXELS_PER_UNIT, x/PIXELS_PER_UNIT, y/PIXELS_PER_UNIT, x_pos, item_y/PIXELS_PER_UNIT );
|
||||||
}
|
}
|
||||||
else if (item_y > start_y+client_h-16)
|
else if (item_y+GetLineHeight(gitem) > start_y+client_h)
|
||||||
{
|
{
|
||||||
|
// going up
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int y = 0;
|
int y = 0;
|
||||||
m_anchor->GetSize( x, y );
|
m_anchor->GetSize( x, y, this );
|
||||||
y += 2*m_lineHeight;
|
y += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels
|
||||||
|
item_y += PIXELS_PER_UNIT+2;
|
||||||
int x_pos = GetScrollPos( wxHORIZONTAL );
|
int x_pos = GetScrollPos( wxHORIZONTAL );
|
||||||
SetScrollbars( 10, 10, x/10, y/10, x_pos, (item_y-client_h/2)/10 );
|
// Item should appear at bottom
|
||||||
|
SetScrollbars( PIXELS_PER_UNIT, PIXELS_PER_UNIT, x/PIXELS_PER_UNIT, y/PIXELS_PER_UNIT, x_pos, (item_y+GetLineHeight(gitem)-client_h)/PIXELS_PER_UNIT );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxTreeCtrl::ScrollTo(const wxTreeItemId& WXUNUSED(item))
|
|
||||||
{
|
|
||||||
wxFAIL_MSG(_T("not implemented"));
|
|
||||||
}
|
|
||||||
|
|
||||||
wxTextCtrl *wxTreeCtrl::EditLabel( const wxTreeItemId& WXUNUSED(item),
|
wxTextCtrl *wxTreeCtrl::EditLabel( const wxTreeItemId& WXUNUSED(item),
|
||||||
wxClassInfo* WXUNUSED(textCtrlClass) )
|
wxClassInfo* WXUNUSED(textCtrlClass) )
|
||||||
{
|
{
|
||||||
@@ -1140,7 +1192,7 @@ void wxTreeCtrl::SortChildren(const wxTreeItemId& itemId)
|
|||||||
wxCHECK_RET( !s_treeBeingSorted,
|
wxCHECK_RET( !s_treeBeingSorted,
|
||||||
_T("wxTreeCtrl::SortChildren is not reentrant") );
|
_T("wxTreeCtrl::SortChildren is not reentrant") );
|
||||||
|
|
||||||
wxArrayTreeItems& children = item->GetChildren();
|
wxArrayGenericTreeItems& children = item->GetChildren();
|
||||||
if ( children.Count() > 1 )
|
if ( children.Count() > 1 )
|
||||||
{
|
{
|
||||||
s_treeBeingSorted = this;
|
s_treeBeingSorted = this;
|
||||||
@@ -1165,9 +1217,12 @@ wxImageList *wxTreeCtrl::GetStateImageList() const
|
|||||||
void wxTreeCtrl::SetImageList(wxImageList *imageList)
|
void wxTreeCtrl::SetImageList(wxImageList *imageList)
|
||||||
{
|
{
|
||||||
m_imageListNormal = imageList;
|
m_imageListNormal = imageList;
|
||||||
// calculate a m_lineHeight value from the image sizes
|
|
||||||
|
// Calculate a m_lineHeight value from the image sizes.
|
||||||
|
// May be toggle off. Then wxTreeCtrl will spread when
|
||||||
|
// necessary (which might look ugly).
|
||||||
|
#if 1
|
||||||
wxPaintDC dc(this);
|
wxPaintDC dc(this);
|
||||||
PrepareDC( dc );
|
|
||||||
m_lineHeight = (int)(dc.GetCharHeight() + 4);
|
m_lineHeight = (int)(dc.GetCharHeight() + 4);
|
||||||
int
|
int
|
||||||
width = 0,
|
width = 0,
|
||||||
@@ -1176,9 +1231,13 @@ void wxTreeCtrl::SetImageList(wxImageList *imageList)
|
|||||||
for(int i = 0; i < n ; i++)
|
for(int i = 0; i < n ; i++)
|
||||||
{
|
{
|
||||||
m_imageListNormal->GetSize(i, width, height);
|
m_imageListNormal->GetSize(i, width, height);
|
||||||
height += height/5; //20% extra spacing
|
|
||||||
if(height > m_lineHeight) m_lineHeight = height;
|
if(height > m_lineHeight) m_lineHeight = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_lineHeight<40) m_lineHeight+=4; // at least 4 pixels (odd such that a line can be drawn in between)
|
||||||
|
else m_lineHeight+=m_lineHeight/10; // otherwise 10% extra spacing
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxTreeCtrl::SetStateImageList(wxImageList *imageList)
|
void wxTreeCtrl::SetStateImageList(wxImageList *imageList)
|
||||||
@@ -1196,11 +1255,12 @@ void wxTreeCtrl::AdjustMyScrollbars()
|
|||||||
{
|
{
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int y = 0;
|
int y = 0;
|
||||||
m_anchor->GetSize( x, y );
|
m_anchor->GetSize( x, y, this );
|
||||||
y += 2*m_lineHeight;
|
//y += GetLineHeight(m_anchor);
|
||||||
|
y += PIXELS_PER_UNIT+2; // one more scrollbar unit + 2 pixels
|
||||||
int x_pos = GetScrollPos( wxHORIZONTAL );
|
int x_pos = GetScrollPos( wxHORIZONTAL );
|
||||||
int y_pos = GetScrollPos( wxVERTICAL );
|
int y_pos = GetScrollPos( wxVERTICAL );
|
||||||
SetScrollbars( 10, 10, x/10, y/10, x_pos, y_pos );
|
SetScrollbars( PIXELS_PER_UNIT, PIXELS_PER_UNIT, x/PIXELS_PER_UNIT, y/PIXELS_PER_UNIT, x_pos, y_pos );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1208,6 +1268,14 @@ void wxTreeCtrl::AdjustMyScrollbars()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int wxTreeCtrl::GetLineHeight(wxGenericTreeItem *item) const
|
||||||
|
{
|
||||||
|
if (GetWindowStyleFlag() & wxTR_HAS_VARIABLE_ROW_HIGHT)
|
||||||
|
return item->GetHeight();
|
||||||
|
else
|
||||||
|
return m_lineHeight;
|
||||||
|
}
|
||||||
|
|
||||||
void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
|
void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
|
||||||
{
|
{
|
||||||
// render bold items in bold
|
// render bold items in bold
|
||||||
@@ -1250,10 +1318,9 @@ void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
|
|||||||
image_w += 4;
|
image_w += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
int total_h = (image_h > text_h) ? image_h : text_h;
|
int total_h = GetLineHeight(item);
|
||||||
if(m_lineHeight > total_h) total_h = m_lineHeight;
|
|
||||||
|
|
||||||
dc.DrawRectangle( item->GetX()-2, item->GetY(), image_w+text_w+4, total_h );
|
dc.DrawRectangle( item->GetX()-2, item->GetY(), item->GetWidth()+2, total_h );
|
||||||
|
|
||||||
if ((item->IsExpanded()) && (item->GetSelectedImage() != -1))
|
if ((item->IsExpanded()) && (item->GetSelectedImage() != -1))
|
||||||
{
|
{
|
||||||
@@ -1285,22 +1352,23 @@ void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Now y stands for the top of the item, whereas it used to stand for middle !
|
||||||
void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y )
|
void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y )
|
||||||
{
|
{
|
||||||
int horizX = level*m_indent;
|
int horizX = level*m_indent;
|
||||||
|
|
||||||
item->SetX( horizX+m_indent+m_spacing );
|
item->SetX( horizX+m_indent+m_spacing );
|
||||||
item->SetY( y-m_lineHeight/2 );
|
item->SetY( y );
|
||||||
item->SetHeight( m_lineHeight );
|
|
||||||
|
|
||||||
item->SetCross( horizX+m_indent, y );
|
|
||||||
|
|
||||||
int oldY = y;
|
int oldY = y;
|
||||||
|
y+=GetLineHeight(item)/2;
|
||||||
|
|
||||||
|
item->SetCross( horizX+m_indent, y );
|
||||||
|
|
||||||
int exposed_x = dc.LogicalToDeviceX( 0 );
|
int exposed_x = dc.LogicalToDeviceX( 0 );
|
||||||
int exposed_y = dc.LogicalToDeviceY( item->GetY()-2 );
|
int exposed_y = dc.LogicalToDeviceY( item->GetY()-2 );
|
||||||
|
|
||||||
if (IsExposed( exposed_x, exposed_y, 10000, m_lineHeight+4 )) // 10000 = very much
|
if (IsExposed( exposed_x, exposed_y, 10000, GetLineHeight(item)+4 )) // 10000 = very much
|
||||||
{
|
{
|
||||||
int startX = horizX;
|
int startX = horizX;
|
||||||
int endX = horizX + (m_indent-5);
|
int endX = horizX + (m_indent-5);
|
||||||
@@ -1353,15 +1421,17 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
y = oldY+GetLineHeight(item);
|
||||||
|
|
||||||
if (item->IsExpanded())
|
if (item->IsExpanded())
|
||||||
{
|
{
|
||||||
int semiOldY = y;
|
oldY+=GetLineHeight(item)/2;
|
||||||
|
int semiOldY=y; // (=y) for stupid compilator
|
||||||
|
|
||||||
wxArrayTreeItems& children = item->GetChildren();
|
wxArrayGenericTreeItems& children = item->GetChildren();
|
||||||
size_t count = children.Count();
|
size_t n, count = children.Count();
|
||||||
for ( size_t n = 0; n < count; n++ )
|
for ( n = 0; n < count; ++n )
|
||||||
{
|
{
|
||||||
y += m_lineHeight;
|
|
||||||
semiOldY=y;
|
semiOldY=y;
|
||||||
PaintLevel( children[n], dc, level+1, y );
|
PaintLevel( children[n], dc, level+1, y );
|
||||||
}
|
}
|
||||||
@@ -1370,9 +1440,50 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &
|
|||||||
// delete all its children for example) - don't draw the vertical line
|
// delete all its children for example) - don't draw the vertical line
|
||||||
// in this case
|
// in this case
|
||||||
if (count > 0)
|
if (count > 0)
|
||||||
|
{
|
||||||
|
semiOldY+=GetLineHeight(children[--n])/2;
|
||||||
dc.DrawLine( horizX+m_indent, oldY+5, horizX+m_indent, semiOldY );
|
dc.DrawLine( horizX+m_indent, oldY+5, horizX+m_indent, semiOldY );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxTreeCtrl::DrawBorder(wxTreeItemId &item)
|
||||||
|
{
|
||||||
|
if (!item) return;
|
||||||
|
|
||||||
|
wxGenericTreeItem *i=item.m_pItem;
|
||||||
|
|
||||||
|
wxPaintDC dc(this);
|
||||||
|
PrepareDC( dc );
|
||||||
|
dc.SetLogicalFunction(wxINVERT);
|
||||||
|
|
||||||
|
int w,h,x;
|
||||||
|
ViewStart(&x,&h); // we only need x
|
||||||
|
GetClientSize(&w,&h); // we only need w
|
||||||
|
|
||||||
|
h=GetLineHeight(i)+1;
|
||||||
|
// 2 white column at border
|
||||||
|
dc.DrawRectangle( PIXELS_PER_UNIT*x+2, i->GetY()-1, w-6, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxTreeCtrl::DrawLine(wxTreeItemId &item, bool below)
|
||||||
|
{
|
||||||
|
if (!item) return;
|
||||||
|
|
||||||
|
wxGenericTreeItem *i=item.m_pItem;
|
||||||
|
|
||||||
|
wxPaintDC dc(this);
|
||||||
|
PrepareDC( dc );
|
||||||
|
dc.SetLogicalFunction(wxINVERT);
|
||||||
|
|
||||||
|
int w,h,y;
|
||||||
|
GetSize(&w,&h);
|
||||||
|
|
||||||
|
if (below) y=i->GetY()+GetLineHeight(i)-1;
|
||||||
|
else y=i->GetY();
|
||||||
|
|
||||||
|
dc.DrawLine( 0, y, w, y);
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// wxWindows callbacks
|
// wxWindows callbacks
|
||||||
@@ -1389,10 +1500,10 @@ void wxTreeCtrl::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
|||||||
dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT ) );
|
dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT ) );
|
||||||
|
|
||||||
dc.SetPen( m_dottedPen );
|
dc.SetPen( m_dottedPen );
|
||||||
if(GetImageList() == NULL)
|
//if(GetImageList() == NULL)
|
||||||
m_lineHeight = (int)(dc.GetCharHeight() + 4);
|
// m_lineHeight = (int)(dc.GetCharHeight() + 4);
|
||||||
|
|
||||||
int y = m_lineHeight / 2 + 2;
|
int y = 2;
|
||||||
PaintLevel( m_anchor, dc, 0, y );
|
PaintLevel( m_anchor, dc, 0, y );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1417,7 +1528,7 @@ void wxTreeCtrl::OnChar( wxKeyEvent &event )
|
|||||||
te.SetEventObject( this );
|
te.SetEventObject( this );
|
||||||
GetEventHandler()->ProcessEvent( te );
|
GetEventHandler()->ProcessEvent( te );
|
||||||
|
|
||||||
if (m_current == 0)
|
if ( (m_current == 0) || (m_key_current == 0) )
|
||||||
{
|
{
|
||||||
event.Skip();
|
event.Skip();
|
||||||
return;
|
return;
|
||||||
@@ -1465,18 +1576,19 @@ void wxTreeCtrl::OnChar( wxKeyEvent &event )
|
|||||||
// it's expanded
|
// it's expanded
|
||||||
case WXK_UP:
|
case WXK_UP:
|
||||||
{
|
{
|
||||||
wxTreeItemId prev = GetPrevSibling( m_current );
|
wxTreeItemId prev = GetPrevSibling( m_key_current );
|
||||||
if (!prev)
|
if (!prev)
|
||||||
{
|
{
|
||||||
prev = GetParent( m_current );
|
prev = GetParent( m_key_current );
|
||||||
if (prev)
|
if (prev)
|
||||||
{
|
{
|
||||||
long cockie = 0;
|
long cockie = 0;
|
||||||
wxTreeItemId current = m_current;
|
wxTreeItemId current = m_key_current;
|
||||||
if (current == GetFirstChild( prev, cockie ))
|
if (current == GetFirstChild( prev, cockie ))
|
||||||
{
|
{
|
||||||
// otherwise we return to where we came from
|
// otherwise we return to where we came from
|
||||||
SelectItem( prev, unselect_others, extended_select );
|
SelectItem( prev, unselect_others, extended_select );
|
||||||
|
m_key_current=prev.m_pItem;
|
||||||
EnsureVisible( prev );
|
EnsureVisible( prev );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1494,6 +1606,7 @@ void wxTreeCtrl::OnChar( wxKeyEvent &event )
|
|||||||
}
|
}
|
||||||
|
|
||||||
SelectItem( prev, unselect_others, extended_select );
|
SelectItem( prev, unselect_others, extended_select );
|
||||||
|
m_key_current=prev.m_pItem;
|
||||||
EnsureVisible( prev );
|
EnsureVisible( prev );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1519,19 +1632,20 @@ void wxTreeCtrl::OnChar( wxKeyEvent &event )
|
|||||||
|
|
||||||
case WXK_DOWN:
|
case WXK_DOWN:
|
||||||
{
|
{
|
||||||
if (IsExpanded(m_current) && HasChildren(m_current))
|
if (IsExpanded(m_key_current) && HasChildren(m_key_current))
|
||||||
{
|
{
|
||||||
long cookie = 0;
|
long cookie = 0;
|
||||||
wxTreeItemId child = GetFirstChild( m_current, cookie );
|
wxTreeItemId child = GetFirstChild( m_key_current, cookie );
|
||||||
SelectItem( child, unselect_others, extended_select );
|
SelectItem( child, unselect_others, extended_select );
|
||||||
|
m_key_current=child.m_pItem;
|
||||||
EnsureVisible( child );
|
EnsureVisible( child );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wxTreeItemId next = GetNextSibling( m_current );
|
wxTreeItemId next = GetNextSibling( m_key_current );
|
||||||
if (next == 0)
|
if (next == 0)
|
||||||
{
|
{
|
||||||
wxTreeItemId current = m_current;
|
wxTreeItemId current = m_key_current;
|
||||||
while (current && !next)
|
while (current && !next)
|
||||||
{
|
{
|
||||||
current = GetParent( current );
|
current = GetParent( current );
|
||||||
@@ -1541,6 +1655,7 @@ void wxTreeCtrl::OnChar( wxKeyEvent &event )
|
|||||||
if (next != 0)
|
if (next != 0)
|
||||||
{
|
{
|
||||||
SelectItem( next, unselect_others, extended_select );
|
SelectItem( next, unselect_others, extended_select );
|
||||||
|
m_key_current=next.m_pItem;
|
||||||
EnsureVisible( next );
|
EnsureVisible( next );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1590,22 +1705,29 @@ void wxTreeCtrl::OnChar( wxKeyEvent &event )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wxTreeItemId wxTreeCtrl::HitTest(const wxPoint& point, int& WXUNUSED(flags))
|
wxTreeItemId wxTreeCtrl::HitTest(const wxPoint& point, int& flags)
|
||||||
{
|
{
|
||||||
wxClientDC dc(this);
|
wxClientDC dc(this);
|
||||||
PrepareDC(dc);
|
PrepareDC(dc);
|
||||||
long x = dc.DeviceToLogicalX( (long)point.x );
|
long x = dc.DeviceToLogicalX( (long)point.x );
|
||||||
long y = dc.DeviceToLogicalY( (long)point.y );
|
long y = dc.DeviceToLogicalY( (long)point.y );
|
||||||
|
int w, h;
|
||||||
|
GetSize(&w, &h);
|
||||||
|
|
||||||
bool onButton = FALSE;
|
flags=0;
|
||||||
return m_anchor->HitTest( wxPoint(x, y), onButton );
|
if (point.x<0) flags|=wxTREE_HITTEST_TOLEFT;
|
||||||
|
if (point.x>w) flags|=wxTREE_HITTEST_TORIGHT;
|
||||||
|
if (point.y<0) flags|=wxTREE_HITTEST_ABOVE;
|
||||||
|
if (point.y>h) flags|=wxTREE_HITTEST_BELOW;
|
||||||
|
|
||||||
|
return m_anchor->HitTest( wxPoint(x, y), this, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxTreeCtrl::OnMouse( wxMouseEvent &event )
|
void wxTreeCtrl::OnMouse( wxMouseEvent &event )
|
||||||
{
|
{
|
||||||
if (!event.LeftIsDown()) m_dragCount = 0;
|
if (!event.LeftIsDown()) m_dragCount = 0;
|
||||||
|
|
||||||
if ( !(event.LeftDown() || event.LeftDClick() || event.Dragging()) ) return;
|
if ( !(event.LeftUp() || event.LeftDClick() || event.Dragging()) ) return;
|
||||||
|
|
||||||
if ( !m_anchor ) return;
|
if ( !m_anchor ) return;
|
||||||
|
|
||||||
@@ -1614,8 +1736,9 @@ void wxTreeCtrl::OnMouse( wxMouseEvent &event )
|
|||||||
long x = dc.DeviceToLogicalX( (long)event.GetX() );
|
long x = dc.DeviceToLogicalX( (long)event.GetX() );
|
||||||
long y = dc.DeviceToLogicalY( (long)event.GetY() );
|
long y = dc.DeviceToLogicalY( (long)event.GetY() );
|
||||||
|
|
||||||
bool onButton = FALSE;
|
int flags=0;
|
||||||
wxGenericTreeItem *item = m_anchor->HitTest( wxPoint(x,y), onButton );
|
wxGenericTreeItem *item = m_anchor->HitTest( wxPoint(x,y), this, flags);
|
||||||
|
bool onButton = flags & wxTREE_HITTEST_ONITEMBUTTON;
|
||||||
|
|
||||||
if (item == NULL) return; /* we hit the blank area */
|
if (item == NULL) return; /* we hit the blank area */
|
||||||
|
|
||||||
@@ -1641,6 +1764,12 @@ void wxTreeCtrl::OnMouse( wxMouseEvent &event )
|
|||||||
bool extended_select=(event.ShiftDown() && is_multiple);
|
bool extended_select=(event.ShiftDown() && is_multiple);
|
||||||
bool unselect_others=!(extended_select || (event.ControlDown() && is_multiple));
|
bool unselect_others=!(extended_select || (event.ControlDown() && is_multiple));
|
||||||
|
|
||||||
|
if (onButton)
|
||||||
|
{
|
||||||
|
Toggle( item );
|
||||||
|
if (is_multiple) return;
|
||||||
|
}
|
||||||
|
|
||||||
SelectItem(item, unselect_others, extended_select);
|
SelectItem(item, unselect_others, extended_select);
|
||||||
|
|
||||||
if (event.LeftDClick())
|
if (event.LeftDClick())
|
||||||
@@ -1651,11 +1780,6 @@ void wxTreeCtrl::OnMouse( wxMouseEvent &event )
|
|||||||
event.SetEventObject( this );
|
event.SetEventObject( this );
|
||||||
GetEventHandler()->ProcessEvent( event );
|
GetEventHandler()->ProcessEvent( event );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (onButton)
|
|
||||||
{
|
|
||||||
Toggle( item );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxTreeCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) )
|
void wxTreeCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) )
|
||||||
@@ -1669,19 +1793,57 @@ void wxTreeCtrl::OnIdle( wxIdleEvent &WXUNUSED(event) )
|
|||||||
m_dirty = FALSE;
|
m_dirty = FALSE;
|
||||||
|
|
||||||
CalculatePositions();
|
CalculatePositions();
|
||||||
|
Refresh();
|
||||||
AdjustMyScrollbars();
|
AdjustMyScrollbars();
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
void wxTreeCtrl::CalculateSize( wxGenericTreeItem *item, wxDC &dc )
|
||||||
|
{
|
||||||
|
long text_w = 0;
|
||||||
|
long text_h = 0;
|
||||||
|
// TODO : check for boldness. Here with suppose that font normal and bold
|
||||||
|
// have the same height !
|
||||||
|
// TODO : bug here, text_w is sometime not the correct answer !!!
|
||||||
|
dc.GetTextExtent( item->GetText(), &text_w, &text_h );
|
||||||
|
text_h+=4;
|
||||||
|
|
||||||
|
int image_h = 0;
|
||||||
|
int image_w = 0;
|
||||||
|
if ((item->IsExpanded()) && (item->GetSelectedImage() != -1))
|
||||||
|
{
|
||||||
|
m_imageListNormal->GetSize( item->GetSelectedImage(), image_w, image_h );
|
||||||
|
image_w += 4;
|
||||||
|
}
|
||||||
|
else if (item->GetImage() != -1)
|
||||||
|
{
|
||||||
|
m_imageListNormal->GetSize( item->GetImage(), image_w, image_h );
|
||||||
|
image_w += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
int total_h = (image_h > text_h) ? image_h : text_h;
|
||||||
|
|
||||||
|
if (total_h<40) total_h+=4; // at least 4 pixels
|
||||||
|
else total_h+=total_h/10; // otherwise 10% extra spacing
|
||||||
|
|
||||||
|
item->SetHeight(total_h);
|
||||||
|
if (total_h>m_lineHeight) m_lineHeight=total_h;
|
||||||
|
|
||||||
|
item->SetWidth(image_w+text_w+2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// for developper : y is now the top of the level
|
||||||
|
// not the middle of it !
|
||||||
void wxTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y )
|
void wxTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &y )
|
||||||
{
|
{
|
||||||
int horizX = level*m_indent;
|
int horizX = level*m_indent;
|
||||||
|
|
||||||
|
CalculateSize( item, dc );
|
||||||
|
|
||||||
|
// set its position
|
||||||
item->SetX( horizX+m_indent+m_spacing );
|
item->SetX( horizX+m_indent+m_spacing );
|
||||||
item->SetY( y-m_lineHeight/2 );
|
item->SetY( y );
|
||||||
item->SetHeight( m_lineHeight );
|
y+=GetLineHeight(item);
|
||||||
|
|
||||||
if ( !item->IsExpanded() )
|
if ( !item->IsExpanded() )
|
||||||
{
|
{
|
||||||
@@ -1689,14 +1851,11 @@ void wxTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, i
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxArrayTreeItems& children = item->GetChildren();
|
wxArrayGenericTreeItems& children = item->GetChildren();
|
||||||
size_t count = children.Count();
|
size_t n, count = children.Count();
|
||||||
for ( size_t n = 0; n < count; n++ )
|
for (n = 0; n < count; ++n )
|
||||||
{
|
|
||||||
y += m_lineHeight;
|
|
||||||
CalculateLevel( children[n], dc, level+1, y ); // recurse
|
CalculateLevel( children[n], dc, level+1, y ); // recurse
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void wxTreeCtrl::CalculatePositions()
|
void wxTreeCtrl::CalculatePositions()
|
||||||
{
|
{
|
||||||
@@ -1708,10 +1867,10 @@ void wxTreeCtrl::CalculatePositions()
|
|||||||
dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT ) );
|
dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT ) );
|
||||||
|
|
||||||
dc.SetPen( m_dottedPen );
|
dc.SetPen( m_dottedPen );
|
||||||
if(GetImageList() == NULL)
|
//if(GetImageList() == NULL)
|
||||||
m_lineHeight = (int)(dc.GetCharHeight() + 4);
|
// m_lineHeight = (int)(dc.GetCharHeight() + 4);
|
||||||
|
|
||||||
int y = m_lineHeight / 2 + 2;
|
int y = 2; //GetLineHeight(m_anchor) / 2 + 2;
|
||||||
CalculateLevel( m_anchor, dc, 0, y ); // start recursion
|
CalculateLevel( m_anchor, dc, 0, y ); // start recursion
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1742,9 +1901,9 @@ void wxTreeCtrl::RefreshLine( wxGenericTreeItem *item )
|
|||||||
|
|
||||||
wxRect rect;
|
wxRect rect;
|
||||||
rect.x = dc.LogicalToDeviceX( item->GetX() - 2 );
|
rect.x = dc.LogicalToDeviceX( item->GetX() - 2 );
|
||||||
rect.y = dc.LogicalToDeviceY( item->GetY() - 2 );
|
rect.y = dc.LogicalToDeviceY( item->GetY());
|
||||||
rect.width = 1000;
|
rect.width = 1000;
|
||||||
rect.height = dc.GetCharHeight() + 6;
|
rect.height = GetLineHeight(item); //dc.GetCharHeight() + 6;
|
||||||
|
|
||||||
Refresh( TRUE, &rect );
|
Refresh( TRUE, &rect );
|
||||||
}
|
}
|
||||||
|
@@ -28,13 +28,15 @@
|
|||||||
#include "wx/module.h"
|
#include "wx/module.h"
|
||||||
#include "wx/image.h"
|
#include "wx/image.h"
|
||||||
|
|
||||||
|
#if wxUSE_THREADS
|
||||||
#include "wx/thread.h"
|
#include "wx/thread.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "unistd.h"
|
#include "unistd.h"
|
||||||
|
|
||||||
#include <glib.h>
|
#include "glib.h"
|
||||||
#include <gdk/gdk.h>
|
#include "gdk/gdk.h"
|
||||||
#include <gtk/gtk.h>
|
#include "gtk/gtk.h"
|
||||||
|
|
||||||
#include "wx/gtk/win_gtk.h"
|
#include "wx/gtk/win_gtk.h"
|
||||||
|
|
||||||
|
@@ -31,16 +31,19 @@ wxMask::wxMask()
|
|||||||
m_bitmap = (GdkBitmap *) NULL;
|
m_bitmap = (GdkBitmap *) NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMask::wxMask( const wxBitmap& WXUNUSED(bitmap), const wxColour& WXUNUSED(colour) )
|
wxMask::wxMask( const wxBitmap& bitmap, const wxColour& colour )
|
||||||
{
|
{
|
||||||
|
Create( bitmap, colour );
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMask::wxMask( const wxBitmap& WXUNUSED(bitmap), int WXUNUSED(paletteIndex) )
|
wxMask::wxMask( const wxBitmap& bitmap, int paletteIndex )
|
||||||
{
|
{
|
||||||
|
Create( bitmap, paletteIndex );
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMask::wxMask( const wxBitmap& WXUNUSED(bitmap) )
|
wxMask::wxMask( const wxBitmap& bitmap )
|
||||||
{
|
{
|
||||||
|
Create( bitmap );
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMask::~wxMask()
|
wxMask::~wxMask()
|
||||||
@@ -48,7 +51,58 @@ wxMask::~wxMask()
|
|||||||
if (m_bitmap) gdk_bitmap_unref( m_bitmap );
|
if (m_bitmap) gdk_bitmap_unref( m_bitmap );
|
||||||
}
|
}
|
||||||
|
|
||||||
GdkBitmap *wxMask::GetBitmap(void) const
|
bool wxMask::Create( const wxBitmap& bitmap, const wxColour& colour )
|
||||||
|
{
|
||||||
|
if (m_bitmap)
|
||||||
|
{
|
||||||
|
gdk_bitmap_unref( m_bitmap );
|
||||||
|
m_bitmap = (GdkBitmap*) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFAIL_MSG( "TODO" );
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMask::Create( const wxBitmap& WXUNUSED(bitmap), int WXUNUSED(paletteIndex) )
|
||||||
|
{
|
||||||
|
if (m_bitmap)
|
||||||
|
{
|
||||||
|
gdk_bitmap_unref( m_bitmap );
|
||||||
|
m_bitmap = (GdkBitmap*) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFAIL_MSG( "not implemented" );
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMask::Create( const wxBitmap& bitmap )
|
||||||
|
{
|
||||||
|
if (m_bitmap)
|
||||||
|
{
|
||||||
|
gdk_bitmap_unref( m_bitmap );
|
||||||
|
m_bitmap = (GdkBitmap*) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!bitmap.Ok()) return FALSE;
|
||||||
|
|
||||||
|
wxCHECK_MSG( bitmap.GetBitmap(), FALSE, "Cannot create mask from colour bitmap" );
|
||||||
|
|
||||||
|
m_bitmap = gdk_pixmap_new( (GdkWindow*) &gdk_root_parent, bitmap.GetWidth(), bitmap.GetHeight(), 1 );
|
||||||
|
|
||||||
|
if (!m_bitmap) return FALSE;
|
||||||
|
|
||||||
|
GdkGC *gc = gdk_gc_new( m_bitmap );
|
||||||
|
|
||||||
|
gdk_draw_bitmap( m_bitmap, gc, bitmap.GetBitmap(), 0, 0, 0, 0, bitmap.GetWidth(), bitmap.GetHeight() );
|
||||||
|
|
||||||
|
gdk_gc_unref( gc );
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GdkBitmap *wxMask::GetBitmap() const
|
||||||
{
|
{
|
||||||
return m_bitmap;
|
return m_bitmap;
|
||||||
}
|
}
|
||||||
@@ -60,8 +114,8 @@ GdkBitmap *wxMask::GetBitmap(void) const
|
|||||||
class wxBitmapRefData: public wxObjectRefData
|
class wxBitmapRefData: public wxObjectRefData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxBitmapRefData(void);
|
wxBitmapRefData();
|
||||||
~wxBitmapRefData(void);
|
~wxBitmapRefData();
|
||||||
|
|
||||||
GdkPixmap *m_pixmap;
|
GdkPixmap *m_pixmap;
|
||||||
GdkBitmap *m_bitmap;
|
GdkBitmap *m_bitmap;
|
||||||
@@ -230,33 +284,33 @@ bool wxBitmap::operator != ( const wxBitmap& bmp )
|
|||||||
return m_refData != bmp.m_refData;
|
return m_refData != bmp.m_refData;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxBitmap::Ok(void) const
|
bool wxBitmap::Ok() const
|
||||||
{
|
{
|
||||||
return (m_refData != NULL);
|
return (m_refData != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxBitmap::GetHeight(void) const
|
int wxBitmap::GetHeight() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), -1, _T("invalid bitmap") );
|
wxCHECK_MSG( Ok(), -1, _T("invalid bitmap") );
|
||||||
|
|
||||||
return M_BMPDATA->m_height;
|
return M_BMPDATA->m_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxBitmap::GetWidth(void) const
|
int wxBitmap::GetWidth() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), -1, _T("invalid bitmap") );
|
wxCHECK_MSG( Ok(), -1, _T("invalid bitmap") );
|
||||||
|
|
||||||
return M_BMPDATA->m_width;
|
return M_BMPDATA->m_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxBitmap::GetDepth(void) const
|
int wxBitmap::GetDepth() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), -1, _T("invalid bitmap") );
|
wxCHECK_MSG( Ok(), -1, _T("invalid bitmap") );
|
||||||
|
|
||||||
return M_BMPDATA->m_bpp;
|
return M_BMPDATA->m_bpp;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMask *wxBitmap::GetMask(void) const
|
wxMask *wxBitmap::GetMask() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), (wxMask *) NULL, _T("invalid bitmap") );
|
wxCHECK_MSG( Ok(), (wxMask *) NULL, _T("invalid bitmap") );
|
||||||
|
|
||||||
@@ -327,7 +381,7 @@ bool wxBitmap::LoadFile( const wxString &name, int type )
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxPalette *wxBitmap::GetPalette(void) const
|
wxPalette *wxBitmap::GetPalette() const
|
||||||
{
|
{
|
||||||
if (!Ok()) return (wxPalette *) NULL;
|
if (!Ok()) return (wxPalette *) NULL;
|
||||||
|
|
||||||
@@ -362,14 +416,14 @@ void wxBitmap::SetPixmap( GdkPixmap *pixmap )
|
|||||||
M_BMPDATA->m_pixmap = pixmap;
|
M_BMPDATA->m_pixmap = pixmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
GdkPixmap *wxBitmap::GetPixmap(void) const
|
GdkPixmap *wxBitmap::GetPixmap() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), (GdkPixmap *) NULL, _T("invalid bitmap") );
|
wxCHECK_MSG( Ok(), (GdkPixmap *) NULL, _T("invalid bitmap") );
|
||||||
|
|
||||||
return M_BMPDATA->m_pixmap;
|
return M_BMPDATA->m_pixmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
GdkBitmap *wxBitmap::GetBitmap(void) const
|
GdkBitmap *wxBitmap::GetBitmap() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), (GdkBitmap *) NULL, _T("invalid bitmap") );
|
wxCHECK_MSG( Ok(), (GdkBitmap *) NULL, _T("invalid bitmap") );
|
||||||
|
|
||||||
|
@@ -1172,9 +1172,15 @@ void wxWindowDC::SetUpDC()
|
|||||||
m_brush = wxNullBrush;
|
m_brush = wxNullBrush;
|
||||||
SetBrush( tmp_brush );
|
SetBrush( tmp_brush );
|
||||||
|
|
||||||
|
/*
|
||||||
tmp_brush = m_backgroundBrush;
|
tmp_brush = m_backgroundBrush;
|
||||||
m_backgroundBrush = wxNullBrush;
|
m_backgroundBrush = wxNullBrush;
|
||||||
SetBackground( tmp_brush );
|
SetBackground( tmp_brush );
|
||||||
|
*/
|
||||||
|
tmp_brush = m_backgroundBrush;
|
||||||
|
m_backgroundBrush = wxNullBrush;
|
||||||
|
SetBackground( *wxWHITE_BRUSH );
|
||||||
|
m_backgroundBrush = tmp_brush;
|
||||||
|
|
||||||
if (!hatch_bitmap)
|
if (!hatch_bitmap)
|
||||||
{
|
{
|
||||||
|
@@ -18,23 +18,16 @@
|
|||||||
#include "wx/unix/execute.h"
|
#include "wx/unix/execute.h"
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <dirent.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <fcntl.h> // for O_WRONLY and friends
|
|
||||||
|
|
||||||
#include <glib.h>
|
#include "glib.h"
|
||||||
#include <gdk/gdk.h>
|
#include "gdk/gdk.h"
|
||||||
#include <gtk/gtk.h>
|
#include "gtk/gtk.h"
|
||||||
#include <gtk/gtkfeatures.h>
|
#include "gtk/gtkfeatures.h"
|
||||||
#include <gdk/gdkx.h>
|
#include "gdk/gdkx.h"
|
||||||
|
|
||||||
#ifdef HAVE_X11_XKBLIB_H
|
#ifdef HAVE_X11_XKBLIB_H
|
||||||
#ifdef __HPUX__
|
#ifdef __HPUX__
|
||||||
|
@@ -28,13 +28,15 @@
|
|||||||
#include "wx/module.h"
|
#include "wx/module.h"
|
||||||
#include "wx/image.h"
|
#include "wx/image.h"
|
||||||
|
|
||||||
|
#if wxUSE_THREADS
|
||||||
#include "wx/thread.h"
|
#include "wx/thread.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "unistd.h"
|
#include "unistd.h"
|
||||||
|
|
||||||
#include <glib.h>
|
#include "glib.h"
|
||||||
#include <gdk/gdk.h>
|
#include "gdk/gdk.h"
|
||||||
#include <gtk/gtk.h>
|
#include "gtk/gtk.h"
|
||||||
|
|
||||||
#include "wx/gtk/win_gtk.h"
|
#include "wx/gtk/win_gtk.h"
|
||||||
|
|
||||||
|
@@ -31,16 +31,19 @@ wxMask::wxMask()
|
|||||||
m_bitmap = (GdkBitmap *) NULL;
|
m_bitmap = (GdkBitmap *) NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMask::wxMask( const wxBitmap& WXUNUSED(bitmap), const wxColour& WXUNUSED(colour) )
|
wxMask::wxMask( const wxBitmap& bitmap, const wxColour& colour )
|
||||||
{
|
{
|
||||||
|
Create( bitmap, colour );
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMask::wxMask( const wxBitmap& WXUNUSED(bitmap), int WXUNUSED(paletteIndex) )
|
wxMask::wxMask( const wxBitmap& bitmap, int paletteIndex )
|
||||||
{
|
{
|
||||||
|
Create( bitmap, paletteIndex );
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMask::wxMask( const wxBitmap& WXUNUSED(bitmap) )
|
wxMask::wxMask( const wxBitmap& bitmap )
|
||||||
{
|
{
|
||||||
|
Create( bitmap );
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMask::~wxMask()
|
wxMask::~wxMask()
|
||||||
@@ -48,7 +51,58 @@ wxMask::~wxMask()
|
|||||||
if (m_bitmap) gdk_bitmap_unref( m_bitmap );
|
if (m_bitmap) gdk_bitmap_unref( m_bitmap );
|
||||||
}
|
}
|
||||||
|
|
||||||
GdkBitmap *wxMask::GetBitmap(void) const
|
bool wxMask::Create( const wxBitmap& bitmap, const wxColour& colour )
|
||||||
|
{
|
||||||
|
if (m_bitmap)
|
||||||
|
{
|
||||||
|
gdk_bitmap_unref( m_bitmap );
|
||||||
|
m_bitmap = (GdkBitmap*) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFAIL_MSG( "TODO" );
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMask::Create( const wxBitmap& WXUNUSED(bitmap), int WXUNUSED(paletteIndex) )
|
||||||
|
{
|
||||||
|
if (m_bitmap)
|
||||||
|
{
|
||||||
|
gdk_bitmap_unref( m_bitmap );
|
||||||
|
m_bitmap = (GdkBitmap*) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxFAIL_MSG( "not implemented" );
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxMask::Create( const wxBitmap& bitmap )
|
||||||
|
{
|
||||||
|
if (m_bitmap)
|
||||||
|
{
|
||||||
|
gdk_bitmap_unref( m_bitmap );
|
||||||
|
m_bitmap = (GdkBitmap*) NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!bitmap.Ok()) return FALSE;
|
||||||
|
|
||||||
|
wxCHECK_MSG( bitmap.GetBitmap(), FALSE, "Cannot create mask from colour bitmap" );
|
||||||
|
|
||||||
|
m_bitmap = gdk_pixmap_new( (GdkWindow*) &gdk_root_parent, bitmap.GetWidth(), bitmap.GetHeight(), 1 );
|
||||||
|
|
||||||
|
if (!m_bitmap) return FALSE;
|
||||||
|
|
||||||
|
GdkGC *gc = gdk_gc_new( m_bitmap );
|
||||||
|
|
||||||
|
gdk_draw_bitmap( m_bitmap, gc, bitmap.GetBitmap(), 0, 0, 0, 0, bitmap.GetWidth(), bitmap.GetHeight() );
|
||||||
|
|
||||||
|
gdk_gc_unref( gc );
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GdkBitmap *wxMask::GetBitmap() const
|
||||||
{
|
{
|
||||||
return m_bitmap;
|
return m_bitmap;
|
||||||
}
|
}
|
||||||
@@ -60,8 +114,8 @@ GdkBitmap *wxMask::GetBitmap(void) const
|
|||||||
class wxBitmapRefData: public wxObjectRefData
|
class wxBitmapRefData: public wxObjectRefData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxBitmapRefData(void);
|
wxBitmapRefData();
|
||||||
~wxBitmapRefData(void);
|
~wxBitmapRefData();
|
||||||
|
|
||||||
GdkPixmap *m_pixmap;
|
GdkPixmap *m_pixmap;
|
||||||
GdkBitmap *m_bitmap;
|
GdkBitmap *m_bitmap;
|
||||||
@@ -230,33 +284,33 @@ bool wxBitmap::operator != ( const wxBitmap& bmp )
|
|||||||
return m_refData != bmp.m_refData;
|
return m_refData != bmp.m_refData;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxBitmap::Ok(void) const
|
bool wxBitmap::Ok() const
|
||||||
{
|
{
|
||||||
return (m_refData != NULL);
|
return (m_refData != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxBitmap::GetHeight(void) const
|
int wxBitmap::GetHeight() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), -1, _T("invalid bitmap") );
|
wxCHECK_MSG( Ok(), -1, _T("invalid bitmap") );
|
||||||
|
|
||||||
return M_BMPDATA->m_height;
|
return M_BMPDATA->m_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxBitmap::GetWidth(void) const
|
int wxBitmap::GetWidth() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), -1, _T("invalid bitmap") );
|
wxCHECK_MSG( Ok(), -1, _T("invalid bitmap") );
|
||||||
|
|
||||||
return M_BMPDATA->m_width;
|
return M_BMPDATA->m_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxBitmap::GetDepth(void) const
|
int wxBitmap::GetDepth() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), -1, _T("invalid bitmap") );
|
wxCHECK_MSG( Ok(), -1, _T("invalid bitmap") );
|
||||||
|
|
||||||
return M_BMPDATA->m_bpp;
|
return M_BMPDATA->m_bpp;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxMask *wxBitmap::GetMask(void) const
|
wxMask *wxBitmap::GetMask() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), (wxMask *) NULL, _T("invalid bitmap") );
|
wxCHECK_MSG( Ok(), (wxMask *) NULL, _T("invalid bitmap") );
|
||||||
|
|
||||||
@@ -327,7 +381,7 @@ bool wxBitmap::LoadFile( const wxString &name, int type )
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxPalette *wxBitmap::GetPalette(void) const
|
wxPalette *wxBitmap::GetPalette() const
|
||||||
{
|
{
|
||||||
if (!Ok()) return (wxPalette *) NULL;
|
if (!Ok()) return (wxPalette *) NULL;
|
||||||
|
|
||||||
@@ -362,14 +416,14 @@ void wxBitmap::SetPixmap( GdkPixmap *pixmap )
|
|||||||
M_BMPDATA->m_pixmap = pixmap;
|
M_BMPDATA->m_pixmap = pixmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
GdkPixmap *wxBitmap::GetPixmap(void) const
|
GdkPixmap *wxBitmap::GetPixmap() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), (GdkPixmap *) NULL, _T("invalid bitmap") );
|
wxCHECK_MSG( Ok(), (GdkPixmap *) NULL, _T("invalid bitmap") );
|
||||||
|
|
||||||
return M_BMPDATA->m_pixmap;
|
return M_BMPDATA->m_pixmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
GdkBitmap *wxBitmap::GetBitmap(void) const
|
GdkBitmap *wxBitmap::GetBitmap() const
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( Ok(), (GdkBitmap *) NULL, _T("invalid bitmap") );
|
wxCHECK_MSG( Ok(), (GdkBitmap *) NULL, _T("invalid bitmap") );
|
||||||
|
|
||||||
|
@@ -1172,9 +1172,15 @@ void wxWindowDC::SetUpDC()
|
|||||||
m_brush = wxNullBrush;
|
m_brush = wxNullBrush;
|
||||||
SetBrush( tmp_brush );
|
SetBrush( tmp_brush );
|
||||||
|
|
||||||
|
/*
|
||||||
tmp_brush = m_backgroundBrush;
|
tmp_brush = m_backgroundBrush;
|
||||||
m_backgroundBrush = wxNullBrush;
|
m_backgroundBrush = wxNullBrush;
|
||||||
SetBackground( tmp_brush );
|
SetBackground( tmp_brush );
|
||||||
|
*/
|
||||||
|
tmp_brush = m_backgroundBrush;
|
||||||
|
m_backgroundBrush = wxNullBrush;
|
||||||
|
SetBackground( *wxWHITE_BRUSH );
|
||||||
|
m_backgroundBrush = tmp_brush;
|
||||||
|
|
||||||
if (!hatch_bitmap)
|
if (!hatch_bitmap)
|
||||||
{
|
{
|
||||||
|
@@ -18,23 +18,16 @@
|
|||||||
#include "wx/unix/execute.h"
|
#include "wx/unix/execute.h"
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <dirent.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <fcntl.h> // for O_WRONLY and friends
|
|
||||||
|
|
||||||
#include <glib.h>
|
#include "glib.h"
|
||||||
#include <gdk/gdk.h>
|
#include "gdk/gdk.h"
|
||||||
#include <gtk/gtk.h>
|
#include "gtk/gtk.h"
|
||||||
#include <gtk/gtkfeatures.h>
|
#include "gtk/gtkfeatures.h"
|
||||||
#include <gdk/gdkx.h>
|
#include "gdk/gdkx.h"
|
||||||
|
|
||||||
#ifdef HAVE_X11_XKBLIB_H
|
#ifdef HAVE_X11_XKBLIB_H
|
||||||
#ifdef __HPUX__
|
#ifdef __HPUX__
|
||||||
|
@@ -69,6 +69,17 @@
|
|||||||
};
|
};
|
||||||
#endif // Unices without usleep()
|
#endif // Unices without usleep()
|
||||||
|
|
||||||
|
#ifdef __EMX__
|
||||||
|
/* I copied this from the XFree86 diffs. AV. */
|
||||||
|
extern void DosSleep(unsigned long);
|
||||||
|
#define INCL_DOSPROCESS
|
||||||
|
#include <os2.h>
|
||||||
|
void usleep(unsigned long delay)
|
||||||
|
{
|
||||||
|
DosSleep(delay ? (delay/1000l) : 1l);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// implementation
|
// implementation
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
Reference in New Issue
Block a user