Pratt 1.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.exrc +61 -0
- data/.gitignore +4 -0
- data/History.txt +6 -0
- data/Manifest.txt +46 -0
- data/Pratt.gemspec +351 -0
- data/README.txt +66 -0
- data/Rakefile +85 -0
- data/TODO +54 -0
- data/VERSION +1 -0
- data/bin/pratt.rb +13 -0
- data/config.rb +34 -0
- data/lib/pratt.rb +527 -0
- data/lib/pratt/array.rb +11 -0
- data/lib/pratt/string.rb +18 -0
- data/models/app.rb +40 -0
- data/models/customer.rb +24 -0
- data/models/payment.rb +22 -0
- data/models/pratt.rb +19 -0
- data/models/project.rb +82 -0
- data/models/whence.rb +70 -0
- data/pkgs/tile-0.8.2.tar.gz +0 -0
- data/pkgs/tile-0.8.2/ANNOUNCE.txt +95 -0
- data/pkgs/tile-0.8.2/ChangeLog +4651 -0
- data/pkgs/tile-0.8.2/Makefile +250 -0
- data/pkgs/tile-0.8.2/Makefile.in +250 -0
- data/pkgs/tile-0.8.2/README.txt +86 -0
- data/pkgs/tile-0.8.2/aclocal.m4 +2 -0
- data/pkgs/tile-0.8.2/altTheme.o +0 -0
- data/pkgs/tile-0.8.2/blink.o +0 -0
- data/pkgs/tile-0.8.2/button.o +0 -0
- data/pkgs/tile-0.8.2/cache.o +0 -0
- data/pkgs/tile-0.8.2/clamTheme.o +0 -0
- data/pkgs/tile-0.8.2/classicTheme.o +0 -0
- data/pkgs/tile-0.8.2/config.log +1330 -0
- data/pkgs/tile-0.8.2/config.status +795 -0
- data/pkgs/tile-0.8.2/configure +15248 -0
- data/pkgs/tile-0.8.2/configure.in +89 -0
- data/pkgs/tile-0.8.2/demos/autocomplete.tcl +59 -0
- data/pkgs/tile-0.8.2/demos/demo.tcl +870 -0
- data/pkgs/tile-0.8.2/demos/dirbrowser.tcl +167 -0
- data/pkgs/tile-0.8.2/demos/dlgtest.tcl +97 -0
- data/pkgs/tile-0.8.2/demos/iconlib.tcl +110 -0
- data/pkgs/tile-0.8.2/demos/repeater.tcl +117 -0
- data/pkgs/tile-0.8.2/demos/toolbutton.tcl +101 -0
- data/pkgs/tile-0.8.2/doc/Geometry.3 +230 -0
- data/pkgs/tile-0.8.2/doc/INDEX.MAP +153 -0
- data/pkgs/tile-0.8.2/doc/Makefile +36 -0
- data/pkgs/tile-0.8.2/doc/TILE.XML +45 -0
- data/pkgs/tile-0.8.2/doc/Theme.3 +34 -0
- data/pkgs/tile-0.8.2/doc/button.n +75 -0
- data/pkgs/tile-0.8.2/doc/checkbutton.n +61 -0
- data/pkgs/tile-0.8.2/doc/combobox.n +98 -0
- data/pkgs/tile-0.8.2/doc/converting.txt +97 -0
- data/pkgs/tile-0.8.2/doc/dialog.n +122 -0
- data/pkgs/tile-0.8.2/doc/entry.n +438 -0
- data/pkgs/tile-0.8.2/doc/frame.n +43 -0
- data/pkgs/tile-0.8.2/doc/html/Geometry.html +304 -0
- data/pkgs/tile-0.8.2/doc/html/Theme.html +48 -0
- data/pkgs/tile-0.8.2/doc/html/button.html +120 -0
- data/pkgs/tile-0.8.2/doc/html/category-index.html +18 -0
- data/pkgs/tile-0.8.2/doc/html/checkbutton.html +94 -0
- data/pkgs/tile-0.8.2/doc/html/combobox.html +164 -0
- data/pkgs/tile-0.8.2/doc/html/converting.txt +97 -0
- data/pkgs/tile-0.8.2/doc/html/dialog.html +159 -0
- data/pkgs/tile-0.8.2/doc/html/entry.html +613 -0
- data/pkgs/tile-0.8.2/doc/html/frame.html +76 -0
- data/pkgs/tile-0.8.2/doc/html/image.html +100 -0
- data/pkgs/tile-0.8.2/doc/html/index.html +25 -0
- data/pkgs/tile-0.8.2/doc/html/keyword-index.html +228 -0
- data/pkgs/tile-0.8.2/doc/html/label.html +133 -0
- data/pkgs/tile-0.8.2/doc/html/labelframe.html +91 -0
- data/pkgs/tile-0.8.2/doc/html/manpage.css +212 -0
- data/pkgs/tile-0.8.2/doc/html/menubutton.html +63 -0
- data/pkgs/tile-0.8.2/doc/html/notebook.html +280 -0
- data/pkgs/tile-0.8.2/doc/html/paned.html +149 -0
- data/pkgs/tile-0.8.2/doc/html/progressbar.html +138 -0
- data/pkgs/tile-0.8.2/doc/html/radiobutton.html +89 -0
- data/pkgs/tile-0.8.2/doc/html/scrollbar.html +221 -0
- data/pkgs/tile-0.8.2/doc/html/separator.html +48 -0
- data/pkgs/tile-0.8.2/doc/html/sizegrip.html +62 -0
- data/pkgs/tile-0.8.2/doc/html/style.html +172 -0
- data/pkgs/tile-0.8.2/doc/html/tile-intro.html +164 -0
- data/pkgs/tile-0.8.2/doc/html/treeview.html +634 -0
- data/pkgs/tile-0.8.2/doc/html/widget.html +342 -0
- data/pkgs/tile-0.8.2/doc/image.n +81 -0
- data/pkgs/tile-0.8.2/doc/internals.txt +409 -0
- data/pkgs/tile-0.8.2/doc/label.n +75 -0
- data/pkgs/tile-0.8.2/doc/labelframe.n +64 -0
- data/pkgs/tile-0.8.2/doc/man.macros +239 -0
- data/pkgs/tile-0.8.2/doc/menubutton.n +41 -0
- data/pkgs/tile-0.8.2/doc/notebook.n +188 -0
- data/pkgs/tile-0.8.2/doc/paned.n +95 -0
- data/pkgs/tile-0.8.2/doc/progressbar.n +79 -0
- data/pkgs/tile-0.8.2/doc/radiobutton.n +57 -0
- data/pkgs/tile-0.8.2/doc/scrollbar.n +160 -0
- data/pkgs/tile-0.8.2/doc/separator.n +30 -0
- data/pkgs/tile-0.8.2/doc/sizegrip.n +53 -0
- data/pkgs/tile-0.8.2/doc/style.n +119 -0
- data/pkgs/tile-0.8.2/doc/tile-intro.n +165 -0
- data/pkgs/tile-0.8.2/doc/tmml.options +4 -0
- data/pkgs/tile-0.8.2/doc/treeview.n +415 -0
- data/pkgs/tile-0.8.2/doc/widget.n +227 -0
- data/pkgs/tile-0.8.2/doc/xml/Geometry.tmml +379 -0
- data/pkgs/tile-0.8.2/doc/xml/INDEX.MAP +153 -0
- data/pkgs/tile-0.8.2/doc/xml/Theme.tmml +63 -0
- data/pkgs/tile-0.8.2/doc/xml/button.tmml +134 -0
- data/pkgs/tile-0.8.2/doc/xml/checkbutton.tmml +119 -0
- data/pkgs/tile-0.8.2/doc/xml/combobox.tmml +184 -0
- data/pkgs/tile-0.8.2/doc/xml/dialog.tmml +195 -0
- data/pkgs/tile-0.8.2/doc/xml/entry.tmml +630 -0
- data/pkgs/tile-0.8.2/doc/xml/frame.tmml +98 -0
- data/pkgs/tile-0.8.2/doc/xml/image.tmml +101 -0
- data/pkgs/tile-0.8.2/doc/xml/label.tmml +154 -0
- data/pkgs/tile-0.8.2/doc/xml/labelframe.tmml +116 -0
- data/pkgs/tile-0.8.2/doc/xml/menubutton.tmml +80 -0
- data/pkgs/tile-0.8.2/doc/xml/notebook.tmml +306 -0
- data/pkgs/tile-0.8.2/doc/xml/paned.tmml +154 -0
- data/pkgs/tile-0.8.2/doc/xml/progressbar.tmml +151 -0
- data/pkgs/tile-0.8.2/doc/xml/radiobutton.tmml +109 -0
- data/pkgs/tile-0.8.2/doc/xml/scrollbar.tmml +233 -0
- data/pkgs/tile-0.8.2/doc/xml/separator.tmml +59 -0
- data/pkgs/tile-0.8.2/doc/xml/sizegrip.tmml +82 -0
- data/pkgs/tile-0.8.2/doc/xml/style.tmml +171 -0
- data/pkgs/tile-0.8.2/doc/xml/tile-intro.tmml +192 -0
- data/pkgs/tile-0.8.2/doc/xml/treeview.tmml +604 -0
- data/pkgs/tile-0.8.2/doc/xml/widget.tmml +372 -0
- data/pkgs/tile-0.8.2/entry.o +0 -0
- data/pkgs/tile-0.8.2/frame.o +0 -0
- data/pkgs/tile-0.8.2/generic/Makefile.in +221 -0
- data/pkgs/tile-0.8.2/generic/TODO +493 -0
- data/pkgs/tile-0.8.2/generic/altTheme.c +1172 -0
- data/pkgs/tile-0.8.2/generic/blink.c +168 -0
- data/pkgs/tile-0.8.2/generic/button.c +858 -0
- data/pkgs/tile-0.8.2/generic/cache.c +354 -0
- data/pkgs/tile-0.8.2/generic/clamTheme.c +974 -0
- data/pkgs/tile-0.8.2/generic/classicTheme.c +518 -0
- data/pkgs/tile-0.8.2/generic/configure +10334 -0
- data/pkgs/tile-0.8.2/generic/configure.in +100 -0
- data/pkgs/tile-0.8.2/generic/entry.c +1922 -0
- data/pkgs/tile-0.8.2/generic/frame.c +648 -0
- data/pkgs/tile-0.8.2/generic/gunk.h +44 -0
- data/pkgs/tile-0.8.2/generic/image.c +416 -0
- data/pkgs/tile-0.8.2/generic/label.c +663 -0
- data/pkgs/tile-0.8.2/generic/layout.c +1215 -0
- data/pkgs/tile-0.8.2/generic/manager.c +554 -0
- data/pkgs/tile-0.8.2/generic/manager.h +91 -0
- data/pkgs/tile-0.8.2/generic/notebook.c +1380 -0
- data/pkgs/tile-0.8.2/generic/paned.c +958 -0
- data/pkgs/tile-0.8.2/generic/pkgIndex.tcl.in +7 -0
- data/pkgs/tile-0.8.2/generic/progress.c +549 -0
- data/pkgs/tile-0.8.2/generic/scale.c +526 -0
- data/pkgs/tile-0.8.2/generic/scroll.c +253 -0
- data/pkgs/tile-0.8.2/generic/scrollbar.c +346 -0
- data/pkgs/tile-0.8.2/generic/separator.c +132 -0
- data/pkgs/tile-0.8.2/generic/square.c +306 -0
- data/pkgs/tile-0.8.2/generic/tagset.c +147 -0
- data/pkgs/tile-0.8.2/generic/tile.c +296 -0
- data/pkgs/tile-0.8.2/generic/tkElements.c +1280 -0
- data/pkgs/tile-0.8.2/generic/tkTheme.c +1708 -0
- data/pkgs/tile-0.8.2/generic/tkTheme.h +419 -0
- data/pkgs/tile-0.8.2/generic/tkThemeInt.h +45 -0
- data/pkgs/tile-0.8.2/generic/tkstate.c +268 -0
- data/pkgs/tile-0.8.2/generic/trace.c +145 -0
- data/pkgs/tile-0.8.2/generic/track.c +174 -0
- data/pkgs/tile-0.8.2/generic/treeview.c +3211 -0
- data/pkgs/tile-0.8.2/generic/ttk.decls +154 -0
- data/pkgs/tile-0.8.2/generic/ttkDecls.h +340 -0
- data/pkgs/tile-0.8.2/generic/ttkStubInit.c +61 -0
- data/pkgs/tile-0.8.2/generic/ttkStubLib.c +70 -0
- data/pkgs/tile-0.8.2/generic/widget.c +785 -0
- data/pkgs/tile-0.8.2/generic/widget.h +263 -0
- data/pkgs/tile-0.8.2/image.o +0 -0
- data/pkgs/tile-0.8.2/label.o +0 -0
- data/pkgs/tile-0.8.2/layout.o +0 -0
- data/pkgs/tile-0.8.2/library/altTheme.tcl +101 -0
- data/pkgs/tile-0.8.2/library/aquaTheme.tcl +62 -0
- data/pkgs/tile-0.8.2/library/button.tcl +85 -0
- data/pkgs/tile-0.8.2/library/clamTheme.tcl +139 -0
- data/pkgs/tile-0.8.2/library/classicTheme.tcl +108 -0
- data/pkgs/tile-0.8.2/library/combobox.tcl +439 -0
- data/pkgs/tile-0.8.2/library/cursors.tcl +36 -0
- data/pkgs/tile-0.8.2/library/defaults.tcl +118 -0
- data/pkgs/tile-0.8.2/library/dialog.tcl +274 -0
- data/pkgs/tile-0.8.2/library/entry.tcl +580 -0
- data/pkgs/tile-0.8.2/library/fonts.tcl +153 -0
- data/pkgs/tile-0.8.2/library/icons.tcl +105 -0
- data/pkgs/tile-0.8.2/library/keynav.tcl +192 -0
- data/pkgs/tile-0.8.2/library/menubutton.tcl +171 -0
- data/pkgs/tile-0.8.2/library/notebook.tcl +193 -0
- data/pkgs/tile-0.8.2/library/paned.tcl +87 -0
- data/pkgs/tile-0.8.2/library/progress.tcl +51 -0
- data/pkgs/tile-0.8.2/library/scale.tcl +54 -0
- data/pkgs/tile-0.8.2/library/scrollbar.tcl +125 -0
- data/pkgs/tile-0.8.2/library/sizegrip.tcl +77 -0
- data/pkgs/tile-0.8.2/library/tile.tcl +211 -0
- data/pkgs/tile-0.8.2/library/treeview.tcl +382 -0
- data/pkgs/tile-0.8.2/library/utils.tcl +254 -0
- data/pkgs/tile-0.8.2/library/winTheme.tcl +77 -0
- data/pkgs/tile-0.8.2/library/xpTheme.tcl +63 -0
- data/pkgs/tile-0.8.2/libtile0.8.2.so +0 -0
- data/pkgs/tile-0.8.2/libttkstub.a +0 -0
- data/pkgs/tile-0.8.2/license.terms +24 -0
- data/pkgs/tile-0.8.2/macosx/aquaTheme.c +1076 -0
- data/pkgs/tile-0.8.2/manager.o +0 -0
- data/pkgs/tile-0.8.2/notebook.o +0 -0
- data/pkgs/tile-0.8.2/paned.o +0 -0
- data/pkgs/tile-0.8.2/pkgIndex.tcl +3 -0
- data/pkgs/tile-0.8.2/progress.o +0 -0
- data/pkgs/tile-0.8.2/scale.o +0 -0
- data/pkgs/tile-0.8.2/scroll.o +0 -0
- data/pkgs/tile-0.8.2/scrollbar.o +0 -0
- data/pkgs/tile-0.8.2/separator.o +0 -0
- data/pkgs/tile-0.8.2/tagset.o +0 -0
- data/pkgs/tile-0.8.2/tclconfig/install-sh +119 -0
- data/pkgs/tile-0.8.2/tclconfig/tcl.m4 +4069 -0
- data/pkgs/tile-0.8.2/tclconfig/teax.m4 +109 -0
- data/pkgs/tile-0.8.2/tests/all.tcl +18 -0
- data/pkgs/tile-0.8.2/tests/bwidget.test +103 -0
- data/pkgs/tile-0.8.2/tests/cbtest.tcl +125 -0
- data/pkgs/tile-0.8.2/tests/combobox.test +51 -0
- data/pkgs/tile-0.8.2/tests/compound.tcl +92 -0
- data/pkgs/tile-0.8.2/tests/entry.test +285 -0
- data/pkgs/tile-0.8.2/tests/entrytest.tcl +78 -0
- data/pkgs/tile-0.8.2/tests/image.test +94 -0
- data/pkgs/tile-0.8.2/tests/labelframe.tcl +41 -0
- data/pkgs/tile-0.8.2/tests/labelframe.test +137 -0
- data/pkgs/tile-0.8.2/tests/layout.test +33 -0
- data/pkgs/tile-0.8.2/tests/misc.test +35 -0
- data/pkgs/tile-0.8.2/tests/nbtest.tcl +66 -0
- data/pkgs/tile-0.8.2/tests/notebook.test +500 -0
- data/pkgs/tile-0.8.2/tests/paned.test +298 -0
- data/pkgs/tile-0.8.2/tests/progress.test +92 -0
- data/pkgs/tile-0.8.2/tests/pwtest.tcl +90 -0
- data/pkgs/tile-0.8.2/tests/sbtest.tcl +79 -0
- data/pkgs/tile-0.8.2/tests/scrollbar.test +77 -0
- data/pkgs/tile-0.8.2/tests/sgtest.tcl +52 -0
- data/pkgs/tile-0.8.2/tests/testutils.tcl +20 -0
- data/pkgs/tile-0.8.2/tests/tile.test +674 -0
- data/pkgs/tile-0.8.2/tests/treetags.test +78 -0
- data/pkgs/tile-0.8.2/tests/treeview.test +563 -0
- data/pkgs/tile-0.8.2/tests/tvtest.tcl +332 -0
- data/pkgs/tile-0.8.2/tests/validate.test +278 -0
- data/pkgs/tile-0.8.2/tile.o +0 -0
- data/pkgs/tile-0.8.2/tkElements.o +0 -0
- data/pkgs/tile-0.8.2/tkTheme.o +0 -0
- data/pkgs/tile-0.8.2/tkstate.o +0 -0
- data/pkgs/tile-0.8.2/tools/genStubs.tcl +861 -0
- data/pkgs/tile-0.8.2/trace.o +0 -0
- data/pkgs/tile-0.8.2/track.o +0 -0
- data/pkgs/tile-0.8.2/treeview.o +0 -0
- data/pkgs/tile-0.8.2/ttkStubInit.o +0 -0
- data/pkgs/tile-0.8.2/ttkStubLib.o +0 -0
- data/pkgs/tile-0.8.2/widget.o +0 -0
- data/pkgs/tile-0.8.2/win/Tile.dsp +261 -0
- data/pkgs/tile-0.8.2/win/makefile.vc +527 -0
- data/pkgs/tile-0.8.2/win/monitor.c +164 -0
- data/pkgs/tile-0.8.2/win/nmakehlp.c +483 -0
- data/pkgs/tile-0.8.2/win/rules.vc +512 -0
- data/pkgs/tile-0.8.2/win/tile.rc +40 -0
- data/pkgs/tile-0.8.2/win/winTheme.c +734 -0
- data/pkgs/tile-0.8.2/win/xpTheme.c +1029 -0
- data/spec/app_spec.rb +48 -0
- data/spec/customer_spec.rb +31 -0
- data/spec/fixtures/graph.expectation +18 -0
- data/spec/payment_spec.rb +19 -0
- data/spec/pratt_spec.rb +148 -0
- data/spec/project_spec.rb +163 -0
- data/spec/rcov.opts +0 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +21 -0
- data/spec/whence_spec.rb +54 -0
- data/tasks/pratt.rb +84 -0
- data/templates/model.eruby +12 -0
- data/templates/spec.eruby +8 -0
- data/views/env.rb +22 -0
- data/views/graph.eruby +20 -0
- data/views/invoice.eruby +148 -0
- data/views/main.rb +92 -0
- data/views/pid.eruby +3 -0
- data/views/pop.rb +94 -0
- data/views/pop2.rb +75 -0
- data/views/raw.eruby +11 -0
- metadata +390 -0
|
@@ -0,0 +1,1029 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* xpTheme.c,v 1.94 2007/12/02 04:34:31 jenglish Exp
|
|
3
|
+
*
|
|
4
|
+
* Tk theme engine which uses the Windows XP "Visual Styles" API
|
|
5
|
+
* Adapted from Georgios Petasis' XP theme patch.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2003 by Georgios Petasis, petasis@iit.demokritos.gr.
|
|
8
|
+
* Copyright (c) 2003 by Joe English
|
|
9
|
+
* Copyright (c) 2003 by Pat Thoyts
|
|
10
|
+
*
|
|
11
|
+
* See the file "license.terms" for information on usage and redistribution
|
|
12
|
+
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
13
|
+
*
|
|
14
|
+
* See also:
|
|
15
|
+
*
|
|
16
|
+
* <URL: http://msdn.microsoft.com/library/en-us/
|
|
17
|
+
* shellcc/platform/commctls/userex/refentry.asp >
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
#ifndef HAVE_UXTHEME_H
|
|
21
|
+
/* Stub for platforms that lack the XP theme API headers: */
|
|
22
|
+
#include <windows.h>
|
|
23
|
+
#include <tcl.h>
|
|
24
|
+
int XPTheme_Init(Tcl_Interp *interp, HWND hwnd) { return TCL_OK; }
|
|
25
|
+
#else
|
|
26
|
+
|
|
27
|
+
#define WINVER 0x0501 /* Requires Windows XP APIs */
|
|
28
|
+
|
|
29
|
+
#include <windows.h>
|
|
30
|
+
#include <uxtheme.h>
|
|
31
|
+
#include <tmschema.h>
|
|
32
|
+
|
|
33
|
+
#ifdef NO_PRIVATE_HEADERS
|
|
34
|
+
#include <tk.h>
|
|
35
|
+
#include "gunk.h"
|
|
36
|
+
#else
|
|
37
|
+
#include <tkWinInt.h>
|
|
38
|
+
#endif
|
|
39
|
+
|
|
40
|
+
#include "tkTheme.h"
|
|
41
|
+
|
|
42
|
+
typedef HTHEME (STDAPICALLTYPE OpenThemeDataProc)(HWND hwnd,
|
|
43
|
+
LPCWSTR pszClassList);
|
|
44
|
+
typedef HRESULT (STDAPICALLTYPE CloseThemeDataProc)(HTHEME hTheme);
|
|
45
|
+
typedef HRESULT (STDAPICALLTYPE DrawThemeBackgroundProc)(HTHEME hTheme,
|
|
46
|
+
HDC hdc, int iPartId, int iStateId, const RECT *pRect,
|
|
47
|
+
OPTIONAL const RECT *pClipRect);
|
|
48
|
+
typedef HRESULT (STDAPICALLTYPE GetThemePartSizeProc)(HTHEME,HDC,
|
|
49
|
+
int iPartId, int iStateId,
|
|
50
|
+
RECT *prc, enum THEMESIZE eSize, SIZE *psz);
|
|
51
|
+
typedef int (STDAPICALLTYPE GetThemeSysSizeProc)(HTHEME,int);
|
|
52
|
+
/* GetThemeTextExtent and DrawThemeText only used with BROKEN_TEXT_ELEMENT */
|
|
53
|
+
typedef HRESULT (STDAPICALLTYPE GetThemeTextExtentProc)(HTHEME hTheme, HDC hdc,
|
|
54
|
+
int iPartId, int iStateId, LPCWSTR pszText, int iCharCount,
|
|
55
|
+
DWORD dwTextFlags, const RECT *pBoundingRect, RECT *pExtent);
|
|
56
|
+
typedef HRESULT (STDAPICALLTYPE DrawThemeTextProc)(HTHEME hTheme, HDC hdc,
|
|
57
|
+
int iPartId, int iStateId, LPCWSTR pszText, int iCharCount,
|
|
58
|
+
DWORD dwTextFlags, DWORD dwTextFlags2, const RECT *pRect);
|
|
59
|
+
typedef BOOL (STDAPICALLTYPE IsThemeActiveProc)(VOID);
|
|
60
|
+
typedef BOOL (STDAPICALLTYPE IsAppThemedProc)(VOID);
|
|
61
|
+
|
|
62
|
+
typedef struct
|
|
63
|
+
{
|
|
64
|
+
OpenThemeDataProc *OpenThemeData;
|
|
65
|
+
CloseThemeDataProc *CloseThemeData;
|
|
66
|
+
GetThemePartSizeProc *GetThemePartSize;
|
|
67
|
+
GetThemeSysSizeProc *GetThemeSysSize;
|
|
68
|
+
DrawThemeBackgroundProc *DrawThemeBackground;
|
|
69
|
+
DrawThemeTextProc *DrawThemeText;
|
|
70
|
+
GetThemeTextExtentProc *GetThemeTextExtent;
|
|
71
|
+
IsThemeActiveProc *IsThemeActive;
|
|
72
|
+
IsAppThemedProc *IsAppThemed;
|
|
73
|
+
|
|
74
|
+
HWND stubWindow;
|
|
75
|
+
} XPThemeProcs;
|
|
76
|
+
|
|
77
|
+
typedef struct
|
|
78
|
+
{
|
|
79
|
+
HINSTANCE hlibrary;
|
|
80
|
+
XPThemeProcs *procs;
|
|
81
|
+
} XPThemeData;
|
|
82
|
+
|
|
83
|
+
/*
|
|
84
|
+
*----------------------------------------------------------------------
|
|
85
|
+
*
|
|
86
|
+
* LoadXPThemeProcs --
|
|
87
|
+
* Initialize XP theming support.
|
|
88
|
+
*
|
|
89
|
+
* XP theme support is included in UXTHEME.DLL
|
|
90
|
+
* We dynamically load this DLL at runtime instead of linking
|
|
91
|
+
* to it at build-time.
|
|
92
|
+
*
|
|
93
|
+
* Returns:
|
|
94
|
+
* A pointer to an XPThemeProcs table if successful, NULL otherwise.
|
|
95
|
+
*/
|
|
96
|
+
|
|
97
|
+
static XPThemeProcs *
|
|
98
|
+
LoadXPThemeProcs(HINSTANCE *phlib)
|
|
99
|
+
{
|
|
100
|
+
/*
|
|
101
|
+
* Load the library "uxtheme.dll", where the native widget
|
|
102
|
+
* drawing routines are implemented. This will only succeed
|
|
103
|
+
* if we are running at least on Windows XP.
|
|
104
|
+
*/
|
|
105
|
+
HINSTANCE handle;
|
|
106
|
+
*phlib = handle = LoadLibrary("uxtheme.dll");
|
|
107
|
+
if (handle != 0)
|
|
108
|
+
{
|
|
109
|
+
/*
|
|
110
|
+
* We have successfully loaded the library. Proceed in storing the
|
|
111
|
+
* addresses of the functions we want to use.
|
|
112
|
+
*/
|
|
113
|
+
XPThemeProcs *procs = (XPThemeProcs*)ckalloc(sizeof(XPThemeProcs));
|
|
114
|
+
#define LOADPROC(name) \
|
|
115
|
+
(0 != (procs->name = (name ## Proc *)GetProcAddress(handle, #name) ))
|
|
116
|
+
|
|
117
|
+
if ( LOADPROC(OpenThemeData)
|
|
118
|
+
&& LOADPROC(CloseThemeData)
|
|
119
|
+
&& LOADPROC(GetThemePartSize)
|
|
120
|
+
&& LOADPROC(GetThemeSysSize)
|
|
121
|
+
&& LOADPROC(DrawThemeBackground)
|
|
122
|
+
&& LOADPROC(GetThemeTextExtent)
|
|
123
|
+
&& LOADPROC(DrawThemeText)
|
|
124
|
+
&& LOADPROC(IsThemeActive)
|
|
125
|
+
&& LOADPROC(IsAppThemed)
|
|
126
|
+
)
|
|
127
|
+
{
|
|
128
|
+
return procs;
|
|
129
|
+
}
|
|
130
|
+
#undef LOADPROC
|
|
131
|
+
ckfree((char*)procs);
|
|
132
|
+
}
|
|
133
|
+
return 0;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/*
|
|
137
|
+
* XPThemeDeleteProc --
|
|
138
|
+
*
|
|
139
|
+
* Release any theme allocated resources.
|
|
140
|
+
*/
|
|
141
|
+
|
|
142
|
+
static void
|
|
143
|
+
XPThemeDeleteProc(void *clientData)
|
|
144
|
+
{
|
|
145
|
+
XPThemeData *themeData = clientData;
|
|
146
|
+
FreeLibrary(themeData->hlibrary);
|
|
147
|
+
ckfree(clientData);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
static int
|
|
151
|
+
XPThemeEnabled(Ttk_Theme theme, void *clientData)
|
|
152
|
+
{
|
|
153
|
+
XPThemeData *themeData = clientData;
|
|
154
|
+
int active = themeData->procs->IsThemeActive();
|
|
155
|
+
int themed = themeData->procs->IsAppThemed();
|
|
156
|
+
return (active && themed);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/*
|
|
160
|
+
* BoxToRect --
|
|
161
|
+
* Helper routine. Returns a RECT data structure.
|
|
162
|
+
*/
|
|
163
|
+
static RECT
|
|
164
|
+
BoxToRect(Ttk_Box b)
|
|
165
|
+
{
|
|
166
|
+
RECT rc;
|
|
167
|
+
rc.top = b.y;
|
|
168
|
+
rc.left = b.x;
|
|
169
|
+
rc.bottom = b.y + b.height;
|
|
170
|
+
rc.right = b.x + b.width;
|
|
171
|
+
return rc;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/*
|
|
175
|
+
* Map Tk state bitmaps to XP style enumerated values.
|
|
176
|
+
*/
|
|
177
|
+
static Ttk_StateTable null_statemap[] = { {0,0,0} };
|
|
178
|
+
|
|
179
|
+
/*
|
|
180
|
+
* Pushbuttons (Tk: "Button")
|
|
181
|
+
*/
|
|
182
|
+
static Ttk_StateTable pushbutton_statemap[] =
|
|
183
|
+
{
|
|
184
|
+
{ PBS_DISABLED, TTK_STATE_DISABLED, 0 },
|
|
185
|
+
{ PBS_PRESSED, TTK_STATE_PRESSED, 0 },
|
|
186
|
+
{ PBS_HOT, TTK_STATE_ACTIVE, 0 },
|
|
187
|
+
{ PBS_DEFAULTED, TTK_STATE_ALTERNATE, 0 },
|
|
188
|
+
{ PBS_NORMAL, 0, 0 }
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
/*
|
|
192
|
+
* Checkboxes (Tk: "Checkbutton")
|
|
193
|
+
*/
|
|
194
|
+
static Ttk_StateTable checkbox_statemap[] =
|
|
195
|
+
{
|
|
196
|
+
{CBS_MIXEDDISABLED, TTK_STATE_ALTERNATE|TTK_STATE_DISABLED, 0},
|
|
197
|
+
{CBS_MIXEDPRESSED, TTK_STATE_ALTERNATE|TTK_STATE_PRESSED, 0},
|
|
198
|
+
{CBS_MIXEDHOT, TTK_STATE_ALTERNATE|TTK_STATE_ACTIVE, 0},
|
|
199
|
+
{CBS_MIXEDNORMAL, TTK_STATE_ALTERNATE, 0},
|
|
200
|
+
{CBS_CHECKEDDISABLED, TTK_STATE_SELECTED|TTK_STATE_DISABLED, 0},
|
|
201
|
+
{CBS_CHECKEDPRESSED, TTK_STATE_SELECTED|TTK_STATE_PRESSED, 0},
|
|
202
|
+
{CBS_CHECKEDHOT, TTK_STATE_SELECTED|TTK_STATE_ACTIVE, 0},
|
|
203
|
+
{CBS_CHECKEDNORMAL, TTK_STATE_SELECTED, 0},
|
|
204
|
+
{CBS_UNCHECKEDDISABLED, TTK_STATE_DISABLED, 0},
|
|
205
|
+
{CBS_UNCHECKEDPRESSED, TTK_STATE_PRESSED, 0},
|
|
206
|
+
{CBS_UNCHECKEDHOT, TTK_STATE_ACTIVE, 0},
|
|
207
|
+
{CBS_UNCHECKEDNORMAL, 0,0 }
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
/*
|
|
211
|
+
* Radiobuttons:
|
|
212
|
+
*/
|
|
213
|
+
static Ttk_StateTable radiobutton_statemap[] =
|
|
214
|
+
{
|
|
215
|
+
{RBS_CHECKEDDISABLED, TTK_STATE_SELECTED|TTK_STATE_DISABLED, 0},
|
|
216
|
+
{RBS_CHECKEDPRESSED, TTK_STATE_SELECTED|TTK_STATE_PRESSED, 0},
|
|
217
|
+
{RBS_CHECKEDHOT, TTK_STATE_SELECTED|TTK_STATE_ACTIVE, 0},
|
|
218
|
+
{RBS_CHECKEDNORMAL, TTK_STATE_SELECTED, 0},
|
|
219
|
+
{RBS_UNCHECKEDDISABLED, TTK_STATE_DISABLED, 0},
|
|
220
|
+
{RBS_UNCHECKEDPRESSED, TTK_STATE_PRESSED, 0},
|
|
221
|
+
{RBS_UNCHECKEDHOT, TTK_STATE_ACTIVE, 0},
|
|
222
|
+
{RBS_UNCHECKEDNORMAL, 0,0 }
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
/*
|
|
226
|
+
* Groupboxes (tk: "frame")
|
|
227
|
+
*/
|
|
228
|
+
static Ttk_StateTable groupbox_statemap[] =
|
|
229
|
+
{
|
|
230
|
+
{GBS_DISABLED, TTK_STATE_DISABLED, 0},
|
|
231
|
+
{GBS_NORMAL, 0,0 }
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
/*
|
|
235
|
+
* Edit fields (tk: "entry")
|
|
236
|
+
*/
|
|
237
|
+
static Ttk_StateTable edittext_statemap[] =
|
|
238
|
+
{
|
|
239
|
+
{ ETS_DISABLED, TTK_STATE_DISABLED, 0 },
|
|
240
|
+
{ ETS_READONLY, TTK_STATE_READONLY, 0 },
|
|
241
|
+
{ ETS_FOCUSED, TTK_STATE_FOCUS, 0 },
|
|
242
|
+
{ ETS_HOT, TTK_STATE_ACTIVE, 0 },
|
|
243
|
+
{ ETS_NORMAL, 0, 0 }
|
|
244
|
+
/* NOT USED: ETS_ASSIST, ETS_SELECTED */
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
/*
|
|
248
|
+
* Combobox text field statemap:
|
|
249
|
+
* Same as edittext_statemap, but doesn't use ETS_READONLY
|
|
250
|
+
* (fixes: #1032409)
|
|
251
|
+
*/
|
|
252
|
+
static Ttk_StateTable combotext_statemap[] =
|
|
253
|
+
{
|
|
254
|
+
{ ETS_DISABLED, TTK_STATE_DISABLED, 0 },
|
|
255
|
+
{ ETS_FOCUSED, TTK_STATE_FOCUS, 0 },
|
|
256
|
+
{ ETS_HOT, TTK_STATE_ACTIVE, 0 },
|
|
257
|
+
{ ETS_NORMAL, 0, 0 }
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
/*
|
|
261
|
+
* Combobox button: (CBP_DROPDOWNBUTTON)
|
|
262
|
+
*/
|
|
263
|
+
static Ttk_StateTable combobox_statemap[] = {
|
|
264
|
+
{ CBXS_DISABLED, TTK_STATE_DISABLED, 0 },
|
|
265
|
+
{ CBXS_PRESSED, TTK_STATE_PRESSED, 0 },
|
|
266
|
+
{ CBXS_HOT, TTK_STATE_ACTIVE, 0 },
|
|
267
|
+
{ CBXS_NORMAL, 0, 0 }
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
/*
|
|
271
|
+
* Toolbar buttons (TP_BUTTON):
|
|
272
|
+
*/
|
|
273
|
+
static Ttk_StateTable toolbutton_statemap[] = {
|
|
274
|
+
{ TS_DISABLED, TTK_STATE_DISABLED, 0 },
|
|
275
|
+
{ TS_PRESSED, TTK_STATE_PRESSED, 0 },
|
|
276
|
+
{ TS_HOTCHECKED, TTK_STATE_SELECTED|TTK_STATE_ACTIVE, 0 },
|
|
277
|
+
{ TS_CHECKED, TTK_STATE_SELECTED, 0 },
|
|
278
|
+
{ TS_HOT, TTK_STATE_ACTIVE, 0 },
|
|
279
|
+
{ TS_NORMAL, 0,0 }
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
/*
|
|
283
|
+
* Scrollbars (Tk: "Scrollbar.thumb")
|
|
284
|
+
*/
|
|
285
|
+
static Ttk_StateTable scrollbar_statemap[] =
|
|
286
|
+
{
|
|
287
|
+
{ SCRBS_DISABLED, TTK_STATE_DISABLED, 0 },
|
|
288
|
+
{ SCRBS_PRESSED, TTK_STATE_PRESSED, 0 },
|
|
289
|
+
{ SCRBS_HOT, TTK_STATE_ACTIVE, 0 },
|
|
290
|
+
{ SCRBS_NORMAL, 0, 0 }
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
static Ttk_StateTable uparrow_statemap[] =
|
|
294
|
+
{
|
|
295
|
+
{ ABS_UPDISABLED, TTK_STATE_DISABLED, 0 },
|
|
296
|
+
{ ABS_UPPRESSED, TTK_STATE_PRESSED, 0 },
|
|
297
|
+
{ ABS_UPHOT, TTK_STATE_ACTIVE, 0 },
|
|
298
|
+
{ ABS_UPNORMAL, 0, 0 }
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
static Ttk_StateTable downarrow_statemap[] =
|
|
302
|
+
{
|
|
303
|
+
{ ABS_DOWNDISABLED, TTK_STATE_DISABLED, 0 },
|
|
304
|
+
{ ABS_DOWNPRESSED, TTK_STATE_PRESSED, 0 },
|
|
305
|
+
{ ABS_DOWNHOT, TTK_STATE_ACTIVE, 0 },
|
|
306
|
+
{ ABS_DOWNNORMAL, 0, 0 }
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
static Ttk_StateTable leftarrow_statemap[] =
|
|
310
|
+
{
|
|
311
|
+
{ ABS_LEFTDISABLED, TTK_STATE_DISABLED, 0 },
|
|
312
|
+
{ ABS_LEFTPRESSED, TTK_STATE_PRESSED, 0 },
|
|
313
|
+
{ ABS_LEFTHOT, TTK_STATE_ACTIVE, 0 },
|
|
314
|
+
{ ABS_LEFTNORMAL, 0, 0 }
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
static Ttk_StateTable rightarrow_statemap[] =
|
|
318
|
+
{
|
|
319
|
+
{ ABS_RIGHTDISABLED,TTK_STATE_DISABLED, 0 },
|
|
320
|
+
{ ABS_RIGHTPRESSED, TTK_STATE_PRESSED, 0 },
|
|
321
|
+
{ ABS_RIGHTHOT, TTK_STATE_ACTIVE, 0 },
|
|
322
|
+
{ ABS_RIGHTNORMAL, 0, 0 }
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
/*
|
|
326
|
+
* Trackbar thumb: (Tk: "scale slider")
|
|
327
|
+
*/
|
|
328
|
+
static Ttk_StateTable scale_statemap[] =
|
|
329
|
+
{
|
|
330
|
+
{ TUS_DISABLED, TTK_STATE_DISABLED, 0 },
|
|
331
|
+
{ TUS_PRESSED, TTK_STATE_PRESSED, 0 },
|
|
332
|
+
{ TUS_FOCUSED, TTK_STATE_FOCUS, 0 },
|
|
333
|
+
{ TUS_HOT, TTK_STATE_ACTIVE, 0 },
|
|
334
|
+
{ TUS_NORMAL, 0, 0 }
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
static Ttk_StateTable tabitem_statemap[] =
|
|
338
|
+
{
|
|
339
|
+
{ TIS_DISABLED, TTK_STATE_DISABLED, 0 },
|
|
340
|
+
{ TIS_SELECTED, TTK_STATE_SELECTED, 0 },
|
|
341
|
+
{ TIS_HOT, TTK_STATE_ACTIVE, 0 },
|
|
342
|
+
{ TIS_FOCUSED, TTK_STATE_FOCUS, 0 },
|
|
343
|
+
{ TIS_NORMAL, 0, 0 },
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
/*
|
|
348
|
+
*----------------------------------------------------------------------
|
|
349
|
+
* +++ Element data:
|
|
350
|
+
*
|
|
351
|
+
* The following structure is passed as the 'clientData' pointer
|
|
352
|
+
* to most elements in this theme. It contains data relevant
|
|
353
|
+
* to a single XP Theme "part".
|
|
354
|
+
*
|
|
355
|
+
* <<NOTE-GetThemeMargins>>:
|
|
356
|
+
* In theory, we should be call GetThemeMargins(...TMT_CONTENTRECT...)
|
|
357
|
+
* to calculate the internal padding. In practice, this routine
|
|
358
|
+
* only seems to work properly for BP_PUSHBUTTON. So we hardcode
|
|
359
|
+
* the required padding at element registration time instead.
|
|
360
|
+
*
|
|
361
|
+
* The PAD_MARGINS flag bit determines whether the padding
|
|
362
|
+
* should be added on the inside (0) or outside (1) of the element.
|
|
363
|
+
*
|
|
364
|
+
* <<NOTE-GetThemePartSize>>:
|
|
365
|
+
* This gives bogus metrics for some parts (in particular,
|
|
366
|
+
* BP_PUSHBUTTONS). Set the IGNORE_THEMESIZE flag to skip this call.
|
|
367
|
+
*/
|
|
368
|
+
|
|
369
|
+
typedef struct /* XP element specifications */
|
|
370
|
+
{
|
|
371
|
+
const char *elementName; /* Tk theme engine element name */
|
|
372
|
+
Ttk_ElementSpec *elementSpec;
|
|
373
|
+
/* Element spec (usually GenericElementSpec) */
|
|
374
|
+
LPCWSTR className; /* Windows window class name */
|
|
375
|
+
int partId; /* BP_PUSHBUTTON, BP_CHECKBUTTON, etc. */
|
|
376
|
+
Ttk_StateTable *statemap; /* Map Tk states to XP states */
|
|
377
|
+
Ttk_Padding padding; /* See NOTE-GetThemeMargins */
|
|
378
|
+
int flags;
|
|
379
|
+
# define IGNORE_THEMESIZE 0x80000000 /* See NOTE-GetThemePartSize */
|
|
380
|
+
# define PAD_MARGINS 0x40000000 /* See NOTE-GetThemeMargins */
|
|
381
|
+
} ElementInfo;
|
|
382
|
+
|
|
383
|
+
typedef struct
|
|
384
|
+
{
|
|
385
|
+
/*
|
|
386
|
+
* Static data, initialized when element is registered:
|
|
387
|
+
*/
|
|
388
|
+
ElementInfo *info;
|
|
389
|
+
XPThemeProcs *procs; /* Pointer to theme procedure table */
|
|
390
|
+
|
|
391
|
+
/*
|
|
392
|
+
* Dynamic data, allocated by InitElementData:
|
|
393
|
+
*/
|
|
394
|
+
HTHEME hTheme;
|
|
395
|
+
HDC hDC;
|
|
396
|
+
HWND hwnd;
|
|
397
|
+
|
|
398
|
+
/* For TkWinDrawableReleaseDC: */
|
|
399
|
+
Drawable drawable;
|
|
400
|
+
TkWinDCState dcState;
|
|
401
|
+
} ElementData;
|
|
402
|
+
|
|
403
|
+
static ElementData *
|
|
404
|
+
NewElementData(XPThemeProcs *procs, ElementInfo *info)
|
|
405
|
+
{
|
|
406
|
+
ElementData *elementData = (ElementData*)ckalloc(sizeof(ElementData));
|
|
407
|
+
|
|
408
|
+
elementData->procs = procs;
|
|
409
|
+
elementData->info = info;
|
|
410
|
+
elementData->hTheme = elementData->hDC = 0;
|
|
411
|
+
|
|
412
|
+
return elementData;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
static void DestroyElementData(void *elementData)
|
|
416
|
+
{
|
|
417
|
+
ckfree(elementData);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/*
|
|
421
|
+
* InitElementData --
|
|
422
|
+
* Looks up theme handle. If Drawable argument is non-NULL,
|
|
423
|
+
* also initializes DC.
|
|
424
|
+
*
|
|
425
|
+
* Returns:
|
|
426
|
+
* 1 on success, 0 on error.
|
|
427
|
+
* Caller must later call FreeElementData() so this element
|
|
428
|
+
* can be reused.
|
|
429
|
+
*/
|
|
430
|
+
|
|
431
|
+
static int
|
|
432
|
+
InitElementData(ElementData *elementData, Tk_Window tkwin, Drawable d)
|
|
433
|
+
{
|
|
434
|
+
Window win = Tk_WindowId(tkwin);
|
|
435
|
+
|
|
436
|
+
if (win != None) {
|
|
437
|
+
elementData->hwnd = Tk_GetHWND(win);
|
|
438
|
+
} else {
|
|
439
|
+
elementData->hwnd = elementData->procs->stubWindow;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
elementData->hTheme = elementData->procs->OpenThemeData(
|
|
443
|
+
elementData->hwnd, elementData->info->className);
|
|
444
|
+
|
|
445
|
+
if (!elementData->hTheme)
|
|
446
|
+
return 0;
|
|
447
|
+
|
|
448
|
+
elementData->drawable = d;
|
|
449
|
+
if (d != 0) {
|
|
450
|
+
elementData->hDC = TkWinGetDrawableDC(Tk_Display(tkwin), d,
|
|
451
|
+
&elementData->dcState);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
return 1;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
static void
|
|
458
|
+
FreeElementData(ElementData *elementData)
|
|
459
|
+
{
|
|
460
|
+
elementData->procs->CloseThemeData(elementData->hTheme);
|
|
461
|
+
if (elementData->drawable != 0) {
|
|
462
|
+
TkWinReleaseDrawableDC(
|
|
463
|
+
elementData->drawable, elementData->hDC, &elementData->dcState);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/*----------------------------------------------------------------------
|
|
468
|
+
* +++ Generic element implementation.
|
|
469
|
+
*
|
|
470
|
+
* Used for elements which are handled entirely by the XP Theme API,
|
|
471
|
+
* such as radiobutton and checkbutton indicators, scrollbar arrows, etc.
|
|
472
|
+
*/
|
|
473
|
+
|
|
474
|
+
static void GenericElementSize(
|
|
475
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
476
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
477
|
+
{
|
|
478
|
+
ElementData *elementData = clientData;
|
|
479
|
+
HRESULT result;
|
|
480
|
+
SIZE size;
|
|
481
|
+
|
|
482
|
+
if (!InitElementData(elementData, tkwin, 0))
|
|
483
|
+
return;
|
|
484
|
+
|
|
485
|
+
if (!(elementData->info->flags & IGNORE_THEMESIZE)) {
|
|
486
|
+
result = elementData->procs->GetThemePartSize(
|
|
487
|
+
elementData->hTheme,
|
|
488
|
+
elementData->hDC,
|
|
489
|
+
elementData->info->partId,
|
|
490
|
+
Ttk_StateTableLookup(elementData->info->statemap, 0),
|
|
491
|
+
NULL /*RECT *prc*/,
|
|
492
|
+
TS_TRUE,
|
|
493
|
+
&size);
|
|
494
|
+
|
|
495
|
+
if (SUCCEEDED(result)) {
|
|
496
|
+
*widthPtr = size.cx;
|
|
497
|
+
*heightPtr = size.cy;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/* See NOTE-GetThemeMargins
|
|
502
|
+
*/
|
|
503
|
+
*paddingPtr = elementData->info->padding;
|
|
504
|
+
if (elementData->info->flags & PAD_MARGINS) {
|
|
505
|
+
*widthPtr += Ttk_PaddingWidth(elementData->info->padding);
|
|
506
|
+
*heightPtr += Ttk_PaddingHeight(elementData->info->padding);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
static void GenericElementDraw(
|
|
511
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
512
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
513
|
+
{
|
|
514
|
+
ElementData *elementData = clientData;
|
|
515
|
+
RECT rc;
|
|
516
|
+
|
|
517
|
+
if (!InitElementData(elementData, tkwin, d)) {
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
if (elementData->info->flags & PAD_MARGINS) {
|
|
522
|
+
b = Ttk_PadBox(b, elementData->info->padding);
|
|
523
|
+
}
|
|
524
|
+
rc = BoxToRect(b);
|
|
525
|
+
|
|
526
|
+
elementData->procs->DrawThemeBackground(
|
|
527
|
+
elementData->hTheme,
|
|
528
|
+
elementData->hDC,
|
|
529
|
+
elementData->info->partId,
|
|
530
|
+
Ttk_StateTableLookup(elementData->info->statemap, state),
|
|
531
|
+
&rc,
|
|
532
|
+
NULL/*pContentRect*/);
|
|
533
|
+
|
|
534
|
+
FreeElementData(elementData);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
static Ttk_ElementSpec GenericElementSpec =
|
|
538
|
+
{
|
|
539
|
+
TK_STYLE_VERSION_2,
|
|
540
|
+
sizeof(NullElement),
|
|
541
|
+
TtkNullElementOptions,
|
|
542
|
+
GenericElementSize,
|
|
543
|
+
GenericElementDraw
|
|
544
|
+
};
|
|
545
|
+
|
|
546
|
+
/*----------------------------------------------------------------------
|
|
547
|
+
* +++ Sized element implementation.
|
|
548
|
+
*
|
|
549
|
+
* Used for elements which are handled entirely by the XP Theme API,
|
|
550
|
+
* but that require a fixed size adjustment.
|
|
551
|
+
* Note that GetThemeSysSize calls through to GetSystemMetrics
|
|
552
|
+
*/
|
|
553
|
+
|
|
554
|
+
static void
|
|
555
|
+
GenericSizedElementSize(
|
|
556
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
557
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
558
|
+
{
|
|
559
|
+
ElementData *elementData = clientData;
|
|
560
|
+
|
|
561
|
+
if (!InitElementData(elementData, tkwin, 0))
|
|
562
|
+
return;
|
|
563
|
+
|
|
564
|
+
GenericElementSize(clientData, elementRecord, tkwin,
|
|
565
|
+
widthPtr, heightPtr, paddingPtr);
|
|
566
|
+
|
|
567
|
+
*widthPtr = elementData->procs->GetThemeSysSize(NULL,
|
|
568
|
+
(elementData->info->flags >> 8) & 0xff);
|
|
569
|
+
*heightPtr = elementData->procs->GetThemeSysSize(NULL,
|
|
570
|
+
elementData->info->flags & 0xff);
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
static Ttk_ElementSpec GenericSizedElementSpec = {
|
|
574
|
+
TK_STYLE_VERSION_2,
|
|
575
|
+
sizeof(NullElement),
|
|
576
|
+
TtkNullElementOptions,
|
|
577
|
+
GenericSizedElementSize,
|
|
578
|
+
GenericElementDraw
|
|
579
|
+
};
|
|
580
|
+
|
|
581
|
+
/*----------------------------------------------------------------------
|
|
582
|
+
* +++ Scrollbar thumb element.
|
|
583
|
+
* Same as a GenericElement, but don't draw in the disabled state.
|
|
584
|
+
*/
|
|
585
|
+
|
|
586
|
+
static void ThumbElementDraw(
|
|
587
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
588
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
589
|
+
{
|
|
590
|
+
ElementData *elementData = clientData;
|
|
591
|
+
unsigned stateId = Ttk_StateTableLookup(elementData->info->statemap, state);
|
|
592
|
+
RECT rc = BoxToRect(b);
|
|
593
|
+
|
|
594
|
+
/*
|
|
595
|
+
* Don't draw the thumb if we are disabled.
|
|
596
|
+
*/
|
|
597
|
+
if (state & TTK_STATE_DISABLED)
|
|
598
|
+
return;
|
|
599
|
+
|
|
600
|
+
if (!InitElementData(elementData, tkwin, d))
|
|
601
|
+
return;
|
|
602
|
+
|
|
603
|
+
elementData->procs->DrawThemeBackground(elementData->hTheme,
|
|
604
|
+
elementData->hDC, elementData->info->partId, stateId,
|
|
605
|
+
&rc, NULL);
|
|
606
|
+
|
|
607
|
+
FreeElementData(elementData);
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
static Ttk_ElementSpec ThumbElementSpec =
|
|
611
|
+
{
|
|
612
|
+
TK_STYLE_VERSION_2,
|
|
613
|
+
sizeof(NullElement),
|
|
614
|
+
TtkNullElementOptions,
|
|
615
|
+
GenericElementSize,
|
|
616
|
+
ThumbElementDraw
|
|
617
|
+
};
|
|
618
|
+
|
|
619
|
+
/*----------------------------------------------------------------------
|
|
620
|
+
* +++ Progress bar element.
|
|
621
|
+
* Increases the requested length of PP_CHUNK and PP_CHUNKVERT parts
|
|
622
|
+
* so that indeterminate progress bars show 3 bars instead of 1.
|
|
623
|
+
*/
|
|
624
|
+
|
|
625
|
+
static void PbarElementSize(
|
|
626
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
627
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
628
|
+
{
|
|
629
|
+
ElementData *elementData = clientData;
|
|
630
|
+
int nBars = 3;
|
|
631
|
+
|
|
632
|
+
GenericElementSize(clientData, elementRecord, tkwin,
|
|
633
|
+
widthPtr, heightPtr, paddingPtr);
|
|
634
|
+
|
|
635
|
+
if (elementData->info->partId == PP_CHUNK) {
|
|
636
|
+
*widthPtr *= nBars;
|
|
637
|
+
} else if (elementData->info->partId == PP_CHUNKVERT) {
|
|
638
|
+
*heightPtr *= nBars;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
static Ttk_ElementSpec PbarElementSpec =
|
|
643
|
+
{
|
|
644
|
+
TK_STYLE_VERSION_2,
|
|
645
|
+
sizeof(NullElement),
|
|
646
|
+
TtkNullElementOptions,
|
|
647
|
+
PbarElementSize,
|
|
648
|
+
GenericElementDraw
|
|
649
|
+
};
|
|
650
|
+
|
|
651
|
+
/*----------------------------------------------------------------------
|
|
652
|
+
* +++ Notebook tab element.
|
|
653
|
+
* Same as generic element, with additional logic to select
|
|
654
|
+
* proper iPartID for the leftmost tab.
|
|
655
|
+
*
|
|
656
|
+
* Notes: TABP_TABITEMRIGHTEDGE (or TABP_TOPTABITEMRIGHTEDGE,
|
|
657
|
+
* which appears to be identical) should be used if the
|
|
658
|
+
* tab is exactly at the right edge of the notebook, but
|
|
659
|
+
* not if it's simply the rightmost tab. This information
|
|
660
|
+
* is not available.
|
|
661
|
+
*
|
|
662
|
+
* The TIS_* and TILES_* definitions are identical, so
|
|
663
|
+
* we can use the same statemap no matter what the partId.
|
|
664
|
+
*/
|
|
665
|
+
static void TabElementDraw(
|
|
666
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
667
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
668
|
+
{
|
|
669
|
+
ElementData *elementData = clientData;
|
|
670
|
+
int partId = elementData->info->partId;
|
|
671
|
+
RECT rc = BoxToRect(b);
|
|
672
|
+
|
|
673
|
+
if (!InitElementData(elementData, tkwin, d))
|
|
674
|
+
return;
|
|
675
|
+
if (state & TTK_STATE_USER1)
|
|
676
|
+
partId = TABP_TABITEMLEFTEDGE;
|
|
677
|
+
elementData->procs->DrawThemeBackground(
|
|
678
|
+
elementData->hTheme, elementData->hDC, partId,
|
|
679
|
+
Ttk_StateTableLookup(elementData->info->statemap, state), &rc, NULL);
|
|
680
|
+
FreeElementData(elementData);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
static Ttk_ElementSpec TabElementSpec =
|
|
684
|
+
{
|
|
685
|
+
TK_STYLE_VERSION_2,
|
|
686
|
+
sizeof(NullElement),
|
|
687
|
+
TtkNullElementOptions,
|
|
688
|
+
GenericElementSize,
|
|
689
|
+
TabElementDraw
|
|
690
|
+
};
|
|
691
|
+
|
|
692
|
+
/*----------------------------------------------------------------------
|
|
693
|
+
* +++ Tree indicator element.
|
|
694
|
+
*
|
|
695
|
+
* Generic element, but don't display at all if TTK_STATE_LEAF (=USER2) set
|
|
696
|
+
*/
|
|
697
|
+
|
|
698
|
+
#define TTK_STATE_OPEN TTK_STATE_USER1
|
|
699
|
+
#define TTK_STATE_LEAF TTK_STATE_USER2
|
|
700
|
+
|
|
701
|
+
static Ttk_StateTable header_statemap[] =
|
|
702
|
+
{
|
|
703
|
+
{ HIS_PRESSED, TTK_STATE_PRESSED, 0 },
|
|
704
|
+
{ HIS_HOT, TTK_STATE_ACTIVE, 0 },
|
|
705
|
+
{ HIS_NORMAL, 0,0 },
|
|
706
|
+
};
|
|
707
|
+
|
|
708
|
+
static Ttk_StateTable tvpglyph_statemap[] =
|
|
709
|
+
{
|
|
710
|
+
{ GLPS_OPENED, TTK_STATE_OPEN, 0 },
|
|
711
|
+
{ GLPS_CLOSED, 0,0 },
|
|
712
|
+
};
|
|
713
|
+
|
|
714
|
+
static void TreeIndicatorElementDraw(
|
|
715
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
716
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
717
|
+
{
|
|
718
|
+
if (!(state & TTK_STATE_LEAF)) {
|
|
719
|
+
GenericElementDraw(clientData,elementRecord,tkwin,d,b,state);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
static Ttk_ElementSpec TreeIndicatorElementSpec =
|
|
724
|
+
{
|
|
725
|
+
TK_STYLE_VERSION_2,
|
|
726
|
+
sizeof(NullElement),
|
|
727
|
+
TtkNullElementOptions,
|
|
728
|
+
GenericElementSize,
|
|
729
|
+
TreeIndicatorElementDraw
|
|
730
|
+
};
|
|
731
|
+
|
|
732
|
+
#if BROKEN_TEXT_ELEMENT
|
|
733
|
+
|
|
734
|
+
/*
|
|
735
|
+
*----------------------------------------------------------------------
|
|
736
|
+
* Text element (does not work yet).
|
|
737
|
+
*
|
|
738
|
+
* According to "Using Windows XP Visual Styles", we need to select
|
|
739
|
+
* a font into the DC before calling DrawThemeText().
|
|
740
|
+
* There's just no easy way to get an HFONT out of a Tk_Font.
|
|
741
|
+
* Maybe GetThemeFont() would work?
|
|
742
|
+
*
|
|
743
|
+
*/
|
|
744
|
+
|
|
745
|
+
typedef struct
|
|
746
|
+
{
|
|
747
|
+
Tcl_Obj *textObj;
|
|
748
|
+
Tcl_Obj *fontObj;
|
|
749
|
+
} TextElement;
|
|
750
|
+
|
|
751
|
+
static Ttk_ElementOptionSpec TextElementOptions[] =
|
|
752
|
+
{
|
|
753
|
+
{ "-text", TK_OPTION_STRING,
|
|
754
|
+
Tk_Offset(TextElement,textObj), "" },
|
|
755
|
+
{ "-font", TK_OPTION_FONT,
|
|
756
|
+
Tk_Offset(TextElement,fontObj), DEFAULT_FONT },
|
|
757
|
+
{ NULL }
|
|
758
|
+
};
|
|
759
|
+
|
|
760
|
+
static void TextElementSize(
|
|
761
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
762
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
763
|
+
{
|
|
764
|
+
TextElement *element = elementRecord;
|
|
765
|
+
ElementData *elementData = clientData;
|
|
766
|
+
RECT rc = {0, 0};
|
|
767
|
+
HRESULT hr = S_OK;
|
|
768
|
+
|
|
769
|
+
if (!InitElementData(elementData, tkwin, 0))
|
|
770
|
+
return;
|
|
771
|
+
|
|
772
|
+
hr = elementData->procs->GetThemeTextExtent(
|
|
773
|
+
elementData->hTheme,
|
|
774
|
+
elementData->hDC,
|
|
775
|
+
elementData->info->partId,
|
|
776
|
+
Ttk_StateTableLookup(elementData->info->statemap, 0),
|
|
777
|
+
Tcl_GetUnicode(element->textObj),
|
|
778
|
+
-1,
|
|
779
|
+
DT_LEFT,// | DT_BOTTOM | DT_NOPREFIX,
|
|
780
|
+
NULL,
|
|
781
|
+
&rc);
|
|
782
|
+
|
|
783
|
+
if (SUCCEEDED(hr)) {
|
|
784
|
+
*widthPtr = rc.right - rc.left;
|
|
785
|
+
*heightPtr = rc.bottom - rc.top;
|
|
786
|
+
}
|
|
787
|
+
if (*widthPtr < 80) *widthPtr = 80;
|
|
788
|
+
if (*heightPtr < 20) *heightPtr = 20;
|
|
789
|
+
|
|
790
|
+
FreeElementData(elementData);
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
static void TextElementDraw(
|
|
794
|
+
ClientData clientData, void *elementRecord, Tk_Window tkwin,
|
|
795
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
796
|
+
{
|
|
797
|
+
TextElement *element = elementRecord;
|
|
798
|
+
ElementData *elementData = clientData;
|
|
799
|
+
RECT rc = BoxToRect(b);
|
|
800
|
+
HRESULT hr = S_OK;
|
|
801
|
+
|
|
802
|
+
if (!InitElementData(elementData, tkwin, d))
|
|
803
|
+
return;
|
|
804
|
+
|
|
805
|
+
hr = elementData->procs->DrawThemeText(
|
|
806
|
+
elementData->hTheme,
|
|
807
|
+
elementData->hDC,
|
|
808
|
+
elementData->info->partId,
|
|
809
|
+
Ttk_StateTableLookup(elementData->info->statemap, state),
|
|
810
|
+
Tcl_GetUnicode(element->textObj),
|
|
811
|
+
-1,
|
|
812
|
+
DT_LEFT,// | DT_BOTTOM | DT_NOPREFIX,
|
|
813
|
+
(state & TTK_STATE_DISABLED) ? DTT_GRAYED : 0,
|
|
814
|
+
&rc);
|
|
815
|
+
FreeElementData(elementData);
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
static Ttk_ElementSpec TextElementSpec =
|
|
819
|
+
{
|
|
820
|
+
TK_STYLE_VERSION_2,
|
|
821
|
+
sizeof(TextElement),
|
|
822
|
+
TextElementOptions,
|
|
823
|
+
TextElementSize,
|
|
824
|
+
TextElementDraw
|
|
825
|
+
};
|
|
826
|
+
|
|
827
|
+
#endif /* BROKEN_TEXT_ELEMENT */
|
|
828
|
+
|
|
829
|
+
/*----------------------------------------------------------------------
|
|
830
|
+
* +++ Widget layouts:
|
|
831
|
+
*/
|
|
832
|
+
|
|
833
|
+
TTK_BEGIN_LAYOUT_TABLE(LayoutTable)
|
|
834
|
+
|
|
835
|
+
TTK_LAYOUT("TButton",
|
|
836
|
+
TTK_GROUP("Button.button", TTK_FILL_BOTH,
|
|
837
|
+
TTK_GROUP("Button.focus", TTK_FILL_BOTH,
|
|
838
|
+
TTK_GROUP("Button.padding", TTK_FILL_BOTH,
|
|
839
|
+
TTK_NODE("Button.label", TTK_FILL_BOTH)))))
|
|
840
|
+
|
|
841
|
+
TTK_LAYOUT("TMenubutton",
|
|
842
|
+
TTK_NODE("Menubutton.dropdown", TTK_PACK_RIGHT|TTK_FILL_Y)
|
|
843
|
+
TTK_GROUP("Menubutton.button", TTK_PACK_RIGHT|TTK_EXPAND|TTK_FILL_BOTH,
|
|
844
|
+
TTK_GROUP("Menubutton.padding", TTK_PACK_LEFT|TTK_EXPAND|TTK_FILL_X,
|
|
845
|
+
TTK_NODE("Menubutton.label", 0))))
|
|
846
|
+
|
|
847
|
+
TTK_LAYOUT("Horizontal.TScrollbar",
|
|
848
|
+
TTK_GROUP("Horizontal.Scrollbar.trough", TTK_FILL_X,
|
|
849
|
+
TTK_NODE("Horizontal.Scrollbar.leftarrow", TTK_PACK_LEFT)
|
|
850
|
+
TTK_NODE("Horizontal.Scrollbar.rightarrow", TTK_PACK_RIGHT)
|
|
851
|
+
TTK_GROUP("Horizontal.Scrollbar.thumb", TTK_FILL_BOTH|TTK_UNIT,
|
|
852
|
+
TTK_NODE("Horizontal.Scrollbar.grip", 0))))
|
|
853
|
+
|
|
854
|
+
TTK_LAYOUT("Vertical.TScrollbar",
|
|
855
|
+
TTK_GROUP("Vertical.Scrollbar.trough", TTK_FILL_Y,
|
|
856
|
+
TTK_NODE("Vertical.Scrollbar.uparrow", TTK_PACK_TOP)
|
|
857
|
+
TTK_NODE("Vertical.Scrollbar.downarrow", TTK_PACK_BOTTOM)
|
|
858
|
+
TTK_GROUP("Vertical.Scrollbar.thumb", TTK_FILL_BOTH|TTK_UNIT,
|
|
859
|
+
TTK_NODE("Vertical.Scrollbar.grip", 0))))
|
|
860
|
+
|
|
861
|
+
TTK_LAYOUT("Horizontal.TScale",
|
|
862
|
+
TTK_GROUP("Scale.focus", TTK_EXPAND|TTK_FILL_BOTH,
|
|
863
|
+
TTK_GROUP("Horizontal.Scale.trough", TTK_EXPAND|TTK_FILL_BOTH,
|
|
864
|
+
TTK_NODE("Horizontal.Scale.track", TTK_FILL_X)
|
|
865
|
+
TTK_NODE("Horizontal.Scale.slider", TTK_PACK_LEFT) )))
|
|
866
|
+
|
|
867
|
+
TTK_LAYOUT("Vertical.TScale",
|
|
868
|
+
TTK_GROUP("Scale.focus", TTK_EXPAND|TTK_FILL_BOTH,
|
|
869
|
+
TTK_GROUP("Vertical.Scale.trough", TTK_EXPAND|TTK_FILL_BOTH,
|
|
870
|
+
TTK_NODE("Vertical.Scale.track", TTK_FILL_Y)
|
|
871
|
+
TTK_NODE("Vertical.Scale.slider", TTK_PACK_TOP) )))
|
|
872
|
+
|
|
873
|
+
TTK_END_LAYOUT_TABLE
|
|
874
|
+
|
|
875
|
+
/*----------------------------------------------------------------------
|
|
876
|
+
* +++ XP element info table:
|
|
877
|
+
*/
|
|
878
|
+
|
|
879
|
+
#define PAD(l,t,r,b) {l,t,r,b}
|
|
880
|
+
#define NOPAD {0,0,0,0}
|
|
881
|
+
|
|
882
|
+
/* name spec className partId statemap padding flags */
|
|
883
|
+
|
|
884
|
+
static ElementInfo ElementInfoTable[] = {
|
|
885
|
+
{ "Checkbutton.indicator", &GenericElementSpec, L"BUTTON",
|
|
886
|
+
BP_CHECKBOX, checkbox_statemap, PAD(0, 0, 4, 0), PAD_MARGINS },
|
|
887
|
+
{ "Radiobutton.indicator", &GenericElementSpec, L"BUTTON",
|
|
888
|
+
BP_RADIOBUTTON, radiobutton_statemap, PAD(0, 0, 4, 0), PAD_MARGINS },
|
|
889
|
+
{ "Button.button", &GenericElementSpec, L"BUTTON",
|
|
890
|
+
BP_PUSHBUTTON, pushbutton_statemap, PAD(3, 3, 3, 3), IGNORE_THEMESIZE },
|
|
891
|
+
{ "Labelframe.border", &GenericElementSpec, L"BUTTON",
|
|
892
|
+
BP_GROUPBOX, groupbox_statemap, PAD(2, 2, 2, 2), 0 },
|
|
893
|
+
{ "Entry.field", &GenericElementSpec, L"EDIT", EP_EDITTEXT,
|
|
894
|
+
edittext_statemap, PAD(1, 1, 1, 1), 0 },
|
|
895
|
+
{ "Combobox.field", &GenericElementSpec, L"EDIT",
|
|
896
|
+
EP_EDITTEXT, combotext_statemap, PAD(1, 1, 1, 1), 0 },
|
|
897
|
+
{ "Combobox.downarrow", &GenericSizedElementSpec, L"COMBOBOX",
|
|
898
|
+
CP_DROPDOWNBUTTON, combobox_statemap, NOPAD,
|
|
899
|
+
(SM_CXVSCROLL << 8) | SM_CYVSCROLL },
|
|
900
|
+
{ "Vertical.Scrollbar.trough", &GenericElementSpec, L"SCROLLBAR",
|
|
901
|
+
SBP_UPPERTRACKVERT, scrollbar_statemap, NOPAD, 0 },
|
|
902
|
+
{ "Vertical.Scrollbar.thumb", &ThumbElementSpec, L"SCROLLBAR",
|
|
903
|
+
SBP_THUMBBTNVERT, scrollbar_statemap, NOPAD, 0 },
|
|
904
|
+
{ "Vertical.Scrollbar.grip", &GenericElementSpec, L"SCROLLBAR",
|
|
905
|
+
SBP_GRIPPERVERT, scrollbar_statemap, NOPAD, 0 },
|
|
906
|
+
{ "Horizontal.Scrollbar.trough", &GenericElementSpec, L"SCROLLBAR",
|
|
907
|
+
SBP_UPPERTRACKHORZ, scrollbar_statemap, NOPAD, 0 },
|
|
908
|
+
{ "Horizontal.Scrollbar.thumb", &ThumbElementSpec, L"SCROLLBAR",
|
|
909
|
+
SBP_THUMBBTNHORZ, scrollbar_statemap, NOPAD, 0 },
|
|
910
|
+
{ "Horizontal.Scrollbar.grip", &GenericElementSpec, L"SCROLLBAR",
|
|
911
|
+
SBP_GRIPPERHORZ, scrollbar_statemap, NOPAD, 0 },
|
|
912
|
+
{ "Scrollbar.uparrow", &GenericSizedElementSpec, L"SCROLLBAR",
|
|
913
|
+
SBP_ARROWBTN, uparrow_statemap, NOPAD,
|
|
914
|
+
(SM_CXVSCROLL << 8) | SM_CYVSCROLL },
|
|
915
|
+
{ "Scrollbar.downarrow", &GenericSizedElementSpec, L"SCROLLBAR",
|
|
916
|
+
SBP_ARROWBTN, downarrow_statemap, NOPAD,
|
|
917
|
+
(SM_CXVSCROLL << 8) | SM_CYVSCROLL },
|
|
918
|
+
{ "Scrollbar.leftarrow", &GenericSizedElementSpec, L"SCROLLBAR",
|
|
919
|
+
SBP_ARROWBTN, leftarrow_statemap, NOPAD,
|
|
920
|
+
(SM_CXHSCROLL << 8) | SM_CYHSCROLL },
|
|
921
|
+
{ "Scrollbar.rightarrow", &GenericSizedElementSpec, L"SCROLLBAR",
|
|
922
|
+
SBP_ARROWBTN, rightarrow_statemap, NOPAD,
|
|
923
|
+
(SM_CXHSCROLL << 8) | SM_CYHSCROLL },
|
|
924
|
+
{ "Horizontal.Scale.slider", &GenericElementSpec, L"TRACKBAR",
|
|
925
|
+
TKP_THUMB, scale_statemap, NOPAD, 0 },
|
|
926
|
+
{ "Vertical.Scale.slider", &GenericElementSpec, L"TRACKBAR",
|
|
927
|
+
TKP_THUMBVERT, scale_statemap, NOPAD, 0 },
|
|
928
|
+
{ "Horizontal.Scale.track", &GenericElementSpec, L"TRACKBAR",
|
|
929
|
+
TKP_TRACK, scale_statemap, NOPAD, 0 },
|
|
930
|
+
{ "Vertical.Scale.track", &GenericElementSpec, L"TRACKBAR",
|
|
931
|
+
TKP_TRACKVERT, scale_statemap, NOPAD, 0 },
|
|
932
|
+
/* ttk::progressbar elements */
|
|
933
|
+
{ "Horizontal.Progressbar.pbar", &PbarElementSpec, L"PROGRESS",
|
|
934
|
+
PP_CHUNK, null_statemap, NOPAD, 0 },
|
|
935
|
+
{ "Vertical.Progressbar.pbar", &PbarElementSpec, L"PROGRESS",
|
|
936
|
+
PP_CHUNKVERT, null_statemap, NOPAD, 0 },
|
|
937
|
+
{ "Horizontal.Progressbar.trough", &GenericElementSpec, L"PROGRESS",
|
|
938
|
+
PP_BAR, null_statemap, PAD(3,3,3,3), IGNORE_THEMESIZE },
|
|
939
|
+
{ "Vertical.Progressbar.trough", &GenericElementSpec, L"PROGRESS",
|
|
940
|
+
PP_BARVERT, null_statemap, PAD(3,3,3,3), IGNORE_THEMESIZE },
|
|
941
|
+
/* ttk::notebook */
|
|
942
|
+
{ "tab", &TabElementSpec, L"TAB",
|
|
943
|
+
TABP_TABITEM, tabitem_statemap, PAD(3,3,3,0), 0 },
|
|
944
|
+
{ "client", &GenericElementSpec, L"TAB",
|
|
945
|
+
TABP_PANE, null_statemap, PAD(1,1,3,3), 0 },
|
|
946
|
+
{ "NotebookPane.background", &GenericElementSpec, L"TAB",
|
|
947
|
+
TABP_BODY, null_statemap, NOPAD, 0 },
|
|
948
|
+
{ "Toolbutton.border", &GenericElementSpec, L"TOOLBAR",
|
|
949
|
+
TP_BUTTON, toolbutton_statemap, NOPAD,0 },
|
|
950
|
+
{ "Menubutton.button", &GenericElementSpec, L"TOOLBAR",
|
|
951
|
+
TP_SPLITBUTTON,toolbutton_statemap, NOPAD,0 },
|
|
952
|
+
{ "Menubutton.dropdown", &GenericElementSpec, L"TOOLBAR",
|
|
953
|
+
TP_SPLITBUTTONDROPDOWN,toolbutton_statemap, NOPAD,0 },
|
|
954
|
+
{ "Treeitem.indicator", &TreeIndicatorElementSpec, L"TREEVIEW",
|
|
955
|
+
TVP_GLYPH, tvpglyph_statemap, PAD(1,1,6,0), PAD_MARGINS },
|
|
956
|
+
{ "Treeheading.border", &GenericElementSpec, L"HEADER",
|
|
957
|
+
HP_HEADERITEM, header_statemap, PAD(4,0,4,0),0 },
|
|
958
|
+
{ "sizegrip", &GenericElementSpec, L"STATUS",
|
|
959
|
+
SP_GRIPPER, null_statemap, NOPAD,0 },
|
|
960
|
+
|
|
961
|
+
#if BROKEN_TEXT_ELEMENT
|
|
962
|
+
{ "Labelframe.text", &TextElementSpec, L"BUTTON",
|
|
963
|
+
BP_GROUPBOX, groupbox_statemap, NOPAD,0 },
|
|
964
|
+
#endif
|
|
965
|
+
|
|
966
|
+
{ 0,0,0,0,0,NOPAD,0 }
|
|
967
|
+
};
|
|
968
|
+
#undef PAD
|
|
969
|
+
|
|
970
|
+
/*----------------------------------------------------------------------
|
|
971
|
+
* +++ Initialization routine:
|
|
972
|
+
*/
|
|
973
|
+
|
|
974
|
+
int TtkXPTheme_Init(Tcl_Interp *interp, HWND hwnd)
|
|
975
|
+
{
|
|
976
|
+
XPThemeData *themeData;
|
|
977
|
+
XPThemeProcs *procs;
|
|
978
|
+
HINSTANCE hlibrary;
|
|
979
|
+
Ttk_Theme themePtr, parentPtr;
|
|
980
|
+
ElementInfo *infoPtr;
|
|
981
|
+
|
|
982
|
+
procs = LoadXPThemeProcs(&hlibrary);
|
|
983
|
+
if (!procs)
|
|
984
|
+
return TCL_ERROR;
|
|
985
|
+
procs->stubWindow = hwnd;
|
|
986
|
+
|
|
987
|
+
/*
|
|
988
|
+
* Create the new style engine.
|
|
989
|
+
*/
|
|
990
|
+
parentPtr = Ttk_GetTheme(interp, "winnative");
|
|
991
|
+
themePtr = Ttk_CreateTheme(interp, "xpnative", parentPtr);
|
|
992
|
+
|
|
993
|
+
if (!themePtr)
|
|
994
|
+
return TCL_ERROR;
|
|
995
|
+
|
|
996
|
+
/*
|
|
997
|
+
* Set theme data and cleanup proc
|
|
998
|
+
*/
|
|
999
|
+
|
|
1000
|
+
themeData = (XPThemeData *)ckalloc(sizeof(XPThemeData));
|
|
1001
|
+
themeData->procs = procs;
|
|
1002
|
+
themeData->hlibrary = hlibrary;
|
|
1003
|
+
|
|
1004
|
+
Ttk_SetThemeEnabledProc(themePtr, XPThemeEnabled, themeData);
|
|
1005
|
+
Ttk_RegisterCleanup(interp, themeData, XPThemeDeleteProc);
|
|
1006
|
+
|
|
1007
|
+
/*
|
|
1008
|
+
* New elements:
|
|
1009
|
+
*/
|
|
1010
|
+
for (infoPtr = ElementInfoTable; infoPtr->elementName != 0; ++infoPtr) {
|
|
1011
|
+
ClientData clientData = NewElementData(procs, infoPtr);
|
|
1012
|
+
Ttk_RegisterElementSpec(
|
|
1013
|
+
themePtr, infoPtr->elementName, infoPtr->elementSpec, clientData);
|
|
1014
|
+
Ttk_RegisterCleanup(interp, clientData, DestroyElementData);
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
Ttk_RegisterElementSpec(themePtr, "Scale.trough", &ttkNullElementSpec, 0);
|
|
1018
|
+
|
|
1019
|
+
/*
|
|
1020
|
+
* Layouts:
|
|
1021
|
+
*/
|
|
1022
|
+
Ttk_RegisterLayouts(themePtr, LayoutTable);
|
|
1023
|
+
|
|
1024
|
+
Tcl_PkgProvide(interp, "ttk::theme::xpnative", TILE_VERSION);
|
|
1025
|
+
|
|
1026
|
+
return TCL_OK;
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
#endif /* HAVE_UXTHEME_H */
|