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,40 @@
|
|
|
1
|
+
// RCS: @(#) tile.rc,v 1.3 2006/09/30 17:53:08 jenglish Exp
|
|
2
|
+
//
|
|
3
|
+
// Version Resource Script
|
|
4
|
+
//
|
|
5
|
+
|
|
6
|
+
#include <winver.h>
|
|
7
|
+
|
|
8
|
+
LANGUAGE 0x9, 0x1 /* LANG_ENGLISH, SUBLANG_DEFAULT */
|
|
9
|
+
|
|
10
|
+
VS_VERSION_INFO VERSIONINFO
|
|
11
|
+
FILEVERSION COMMAVERSION
|
|
12
|
+
PRODUCTVERSION COMMAVERSION
|
|
13
|
+
FILEFLAGSMASK 0x3fL
|
|
14
|
+
#ifdef DEBUG
|
|
15
|
+
FILEFLAGS VS_FF_DEBUG
|
|
16
|
+
#else
|
|
17
|
+
FILEFLAGS 0x0L
|
|
18
|
+
#endif
|
|
19
|
+
FILEOS VOS__WINDOWS32
|
|
20
|
+
FILETYPE VFT_DLL
|
|
21
|
+
FILESUBTYPE 0x0L
|
|
22
|
+
BEGIN
|
|
23
|
+
BLOCK "StringFileInfo"
|
|
24
|
+
BEGIN
|
|
25
|
+
BLOCK "040904b0" /* LANG_ENGLISH/SUBLANG_ENGLISH_US, Unicode CP */
|
|
26
|
+
BEGIN
|
|
27
|
+
VALUE "FileDescription", "Tile " DOTVERSION " Tk theme extension\0"
|
|
28
|
+
VALUE "OriginalFilename", "tile" VERSION ".dll\0"
|
|
29
|
+
VALUE "FileVersion", DOTVERSION "\0"
|
|
30
|
+
VALUE "LegalCopyright", "Copyright \251 2003 Joe English and other parties\0"
|
|
31
|
+
VALUE "ProductName", "Tile " DOTVERSION " Tk theme extension\0"
|
|
32
|
+
VALUE "ProductVersion", DOTVERSION "\0"
|
|
33
|
+
END
|
|
34
|
+
END
|
|
35
|
+
BLOCK "VarFileInfo"
|
|
36
|
+
BEGIN
|
|
37
|
+
VALUE "Translation", 0x409, 1200
|
|
38
|
+
END
|
|
39
|
+
END
|
|
40
|
+
|
|
@@ -0,0 +1,734 @@
|
|
|
1
|
+
/* winTheme.c - Copyright (C) 2004 Pat Thoyts <patthoyts@users.sf.net>
|
|
2
|
+
*
|
|
3
|
+
* winTheme.c,v 1.41 2007/12/02 04:34:31 jenglish Exp
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#ifdef _MSC_VER
|
|
7
|
+
#define WIN32_LEAN_AND_MEAN
|
|
8
|
+
#endif
|
|
9
|
+
|
|
10
|
+
#include <windows.h>
|
|
11
|
+
|
|
12
|
+
#include <tk.h>
|
|
13
|
+
|
|
14
|
+
#ifdef NO_PRIVATE_HEADERS
|
|
15
|
+
#include <tkPlatDecls.h>
|
|
16
|
+
#include "gunk.h"
|
|
17
|
+
#else
|
|
18
|
+
#include <tkWinInt.h>
|
|
19
|
+
#endif
|
|
20
|
+
|
|
21
|
+
#ifndef DFCS_HOT /* Windows 98/Me, Windows 200/XP only */
|
|
22
|
+
#define DFCS_HOT 0
|
|
23
|
+
#endif
|
|
24
|
+
|
|
25
|
+
#include "tkTheme.h"
|
|
26
|
+
|
|
27
|
+
/*
|
|
28
|
+
* BoxToRect --
|
|
29
|
+
* Helper routine. Converts a Ttk_Box to a Win32 RECT.
|
|
30
|
+
*/
|
|
31
|
+
static RECT BoxToRect(Ttk_Box b)
|
|
32
|
+
{
|
|
33
|
+
RECT rc;
|
|
34
|
+
rc.top = b.y;
|
|
35
|
+
rc.left = b.x;
|
|
36
|
+
rc.bottom = b.y + b.height;
|
|
37
|
+
rc.right = b.x + b.width;
|
|
38
|
+
return rc;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* ReliefToEdge --
|
|
43
|
+
* Convert a Tk "relief" value into an Windows "edge" value.
|
|
44
|
+
* NB: Caller must check for RELIEF_FLAT and RELIEF_SOLID,
|
|
45
|
+
* which must be handled specially.
|
|
46
|
+
*
|
|
47
|
+
* Passing the BF_FLAT flag to DrawEdge() yields something similar
|
|
48
|
+
* to TK_RELIEF_SOLID. TK_RELIEF_FLAT can be implemented by not
|
|
49
|
+
* drawing anything.
|
|
50
|
+
*/
|
|
51
|
+
static unsigned int ReliefToEdge(int relief)
|
|
52
|
+
{
|
|
53
|
+
switch (relief) {
|
|
54
|
+
case TK_RELIEF_RAISED: return EDGE_RAISED;
|
|
55
|
+
case TK_RELIEF_SUNKEN: return EDGE_SUNKEN;
|
|
56
|
+
case TK_RELIEF_RIDGE: return EDGE_BUMP;
|
|
57
|
+
case TK_RELIEF_GROOVE: return EDGE_ETCHED;
|
|
58
|
+
case TK_RELIEF_SOLID: return BDR_RAISEDOUTER;
|
|
59
|
+
default:
|
|
60
|
+
case TK_RELIEF_FLAT: return BDR_RAISEDOUTER;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* ---------------------------------------------------------------------- */
|
|
65
|
+
|
|
66
|
+
static Ttk_StateTable checkbutton_statemap[] =
|
|
67
|
+
{
|
|
68
|
+
{ DFCS_CHECKED|DFCS_INACTIVE, TTK_STATE_SELECTED|TTK_STATE_DISABLED, 0 },
|
|
69
|
+
{ DFCS_CHECKED|DFCS_PUSHED, TTK_STATE_SELECTED|TTK_STATE_PRESSED, 0 },
|
|
70
|
+
{ DFCS_CHECKED, TTK_STATE_SELECTED, 0 },
|
|
71
|
+
{ DFCS_INACTIVE, TTK_STATE_DISABLED, TTK_STATE_SELECTED },
|
|
72
|
+
{ DFCS_PUSHED, TTK_STATE_PRESSED, TTK_STATE_SELECTED},
|
|
73
|
+
{ 0, 0, 0 }
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
static Ttk_StateTable pushbutton_statemap[] =
|
|
77
|
+
{
|
|
78
|
+
{ DFCS_INACTIVE, TTK_STATE_DISABLED, 0 },
|
|
79
|
+
{ DFCS_PUSHED, TTK_STATE_PRESSED, 0 },
|
|
80
|
+
{ DFCS_HOT, TTK_STATE_ACTIVE, 0 },
|
|
81
|
+
{ 0, 0, 0 }
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
static Ttk_StateTable arrow_statemap[] =
|
|
85
|
+
{
|
|
86
|
+
{ DFCS_INACTIVE, TTK_STATE_DISABLED, 0 },
|
|
87
|
+
{ DFCS_PUSHED | DFCS_FLAT, TTK_STATE_PRESSED, 0 },
|
|
88
|
+
{ 0, 0, 0 }
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/*------------------------------------------------------------------------
|
|
92
|
+
* +++ FrameControlElement --
|
|
93
|
+
* General-purpose element for things drawn with DrawFrameControl
|
|
94
|
+
*/
|
|
95
|
+
typedef struct
|
|
96
|
+
{
|
|
97
|
+
const char *name; /* element name */
|
|
98
|
+
int classId; /* class id for DrawFrameControl */
|
|
99
|
+
int partId; /* part id for DrawFrameControl */
|
|
100
|
+
int cxId; /* system metric id for size in x */
|
|
101
|
+
int cyId; /* system metric id for size in y */
|
|
102
|
+
Ttk_StateTable *stateMap; /* map Tk states to Win32 flags */
|
|
103
|
+
Ttk_Padding margins; /* additional placement padding */
|
|
104
|
+
} FrameControlElementData;
|
|
105
|
+
|
|
106
|
+
static FrameControlElementData FrameControlElements[] =
|
|
107
|
+
{
|
|
108
|
+
{ "Checkbutton.indicator",
|
|
109
|
+
DFC_BUTTON, DFCS_BUTTONCHECK, SM_CYMENUCHECK, SM_CYMENUCHECK,
|
|
110
|
+
checkbutton_statemap, {0,0,4,0} },
|
|
111
|
+
{ "Radiobutton.indicator",
|
|
112
|
+
DFC_BUTTON, DFCS_BUTTONRADIO, SM_CYMENUCHECK, SM_CYMENUCHECK,
|
|
113
|
+
checkbutton_statemap, {0,0,4,0} },
|
|
114
|
+
{ "uparrow",
|
|
115
|
+
DFC_SCROLL, DFCS_SCROLLUP, SM_CXVSCROLL, SM_CYVSCROLL,
|
|
116
|
+
arrow_statemap, {0,0,0,0} },
|
|
117
|
+
{ "downarrow",
|
|
118
|
+
DFC_SCROLL, DFCS_SCROLLDOWN, SM_CXVSCROLL, SM_CYVSCROLL,
|
|
119
|
+
arrow_statemap, {0,0,0,0} },
|
|
120
|
+
{ "leftarrow",
|
|
121
|
+
DFC_SCROLL, DFCS_SCROLLLEFT, SM_CXHSCROLL, SM_CYHSCROLL,
|
|
122
|
+
arrow_statemap, {0,0,0,0} },
|
|
123
|
+
{ "rightarrow",
|
|
124
|
+
DFC_SCROLL, DFCS_SCROLLRIGHT, SM_CXHSCROLL, SM_CYHSCROLL,
|
|
125
|
+
arrow_statemap, {0,0,0,0} },
|
|
126
|
+
{ "sizegrip",
|
|
127
|
+
DFC_SCROLL, DFCS_SCROLLSIZEGRIP, SM_CXVSCROLL, SM_CYHSCROLL,
|
|
128
|
+
arrow_statemap, {0,0,0,0} },
|
|
129
|
+
|
|
130
|
+
{ 0,0,0,0,0,0, {0,0,0,0} }
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
/* ---------------------------------------------------------------------- */
|
|
134
|
+
|
|
135
|
+
static void FrameControlElementSize(
|
|
136
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
137
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
138
|
+
{
|
|
139
|
+
FrameControlElementData *p = clientData;
|
|
140
|
+
*widthPtr = GetSystemMetrics(p->cxId) + Ttk_PaddingWidth(p->margins);
|
|
141
|
+
*heightPtr = GetSystemMetrics(p->cyId) + Ttk_PaddingHeight(p->margins);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
static void FrameControlElementDraw(
|
|
145
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
146
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
147
|
+
{
|
|
148
|
+
FrameControlElementData *elementData = clientData;
|
|
149
|
+
RECT rc = BoxToRect(b);
|
|
150
|
+
TkWinDCState dcState;
|
|
151
|
+
HDC hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
|
|
152
|
+
|
|
153
|
+
DrawFrameControl(hdc, &rc,
|
|
154
|
+
elementData->classId,
|
|
155
|
+
elementData->partId|Ttk_StateTableLookup(elementData->stateMap, state));
|
|
156
|
+
TkWinReleaseDrawableDC(d, hdc, &dcState);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
static Ttk_ElementSpec FrameControlElementSpec =
|
|
160
|
+
{
|
|
161
|
+
TK_STYLE_VERSION_2,
|
|
162
|
+
sizeof(NullElement),
|
|
163
|
+
TtkNullElementOptions,
|
|
164
|
+
FrameControlElementSize,
|
|
165
|
+
FrameControlElementDraw
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
/*----------------------------------------------------------------------
|
|
169
|
+
* +++ Border element implementation.
|
|
170
|
+
*/
|
|
171
|
+
|
|
172
|
+
typedef struct {
|
|
173
|
+
Tcl_Obj *reliefObj;
|
|
174
|
+
} BorderElement;
|
|
175
|
+
|
|
176
|
+
static Ttk_ElementOptionSpec BorderElementOptions[] = {
|
|
177
|
+
{ "-relief",TK_OPTION_RELIEF,Tk_Offset(BorderElement,reliefObj), "flat" },
|
|
178
|
+
{NULL}
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
static void BorderElementSize(
|
|
182
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
183
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
184
|
+
{
|
|
185
|
+
paddingPtr->left = paddingPtr->right = GetSystemMetrics(SM_CXEDGE);
|
|
186
|
+
paddingPtr->top = paddingPtr->bottom = GetSystemMetrics(SM_CYEDGE);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
static void BorderElementDraw(
|
|
190
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
191
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
192
|
+
{
|
|
193
|
+
BorderElement *border = elementRecord;
|
|
194
|
+
RECT rc = BoxToRect(b);
|
|
195
|
+
int relief = TK_RELIEF_FLAT;
|
|
196
|
+
TkWinDCState dcState;
|
|
197
|
+
HDC hdc;
|
|
198
|
+
|
|
199
|
+
Tk_GetReliefFromObj(NULL, border->reliefObj, &relief);
|
|
200
|
+
|
|
201
|
+
if (relief != TK_RELIEF_FLAT) {
|
|
202
|
+
UINT xFlags = (relief == TK_RELIEF_SOLID) ? BF_FLAT : 0;
|
|
203
|
+
hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
|
|
204
|
+
DrawEdge(hdc, &rc, ReliefToEdge(relief), BF_RECT | xFlags);
|
|
205
|
+
TkWinReleaseDrawableDC(d, hdc, &dcState);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
static Ttk_ElementSpec BorderElementSpec =
|
|
210
|
+
{
|
|
211
|
+
TK_STYLE_VERSION_2,
|
|
212
|
+
sizeof(BorderElement),
|
|
213
|
+
BorderElementOptions,
|
|
214
|
+
BorderElementSize,
|
|
215
|
+
BorderElementDraw
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
/*
|
|
219
|
+
* Entry field borders:
|
|
220
|
+
* Sunken border; also fill with window color.
|
|
221
|
+
*/
|
|
222
|
+
|
|
223
|
+
typedef struct
|
|
224
|
+
{
|
|
225
|
+
Tcl_Obj *backgroundObj;
|
|
226
|
+
} FieldElement;
|
|
227
|
+
|
|
228
|
+
static Ttk_ElementOptionSpec FieldElementOptions[] =
|
|
229
|
+
{
|
|
230
|
+
{ "-fieldbackground", TK_OPTION_BORDER,
|
|
231
|
+
Tk_Offset(FieldElement,backgroundObj), "white" },
|
|
232
|
+
{NULL}
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
static void FieldElementSize(
|
|
236
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
237
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
238
|
+
{
|
|
239
|
+
paddingPtr->left = paddingPtr->right = GetSystemMetrics(SM_CXEDGE);
|
|
240
|
+
paddingPtr->top = paddingPtr->bottom = GetSystemMetrics(SM_CYEDGE);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
static void FieldElementDraw(
|
|
244
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
245
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
246
|
+
{
|
|
247
|
+
FieldElement *field = elementRecord;
|
|
248
|
+
Tk_3DBorder bg = Tk_Get3DBorderFromObj(tkwin, field->backgroundObj);
|
|
249
|
+
RECT rc = BoxToRect(b);
|
|
250
|
+
TkWinDCState dcState;
|
|
251
|
+
HDC hdc;
|
|
252
|
+
|
|
253
|
+
Tk_Fill3DRectangle(
|
|
254
|
+
tkwin, d, bg, b.x, b.y, b.width, b.height, 0, TK_RELIEF_FLAT);
|
|
255
|
+
|
|
256
|
+
hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
|
|
257
|
+
DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT);
|
|
258
|
+
TkWinReleaseDrawableDC(d, hdc, &dcState);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
static Ttk_ElementSpec FieldElementSpec =
|
|
262
|
+
{
|
|
263
|
+
TK_STYLE_VERSION_2,
|
|
264
|
+
sizeof(FieldElement),
|
|
265
|
+
FieldElementOptions,
|
|
266
|
+
FieldElementSize,
|
|
267
|
+
FieldElementDraw
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
/*------------------------------------------------------------------------
|
|
271
|
+
* +++ Button borders.
|
|
272
|
+
* Drawn with DrawFrameControl instead of DrawEdge;
|
|
273
|
+
* Also draw default indicator and focus ring.
|
|
274
|
+
*/
|
|
275
|
+
typedef struct {
|
|
276
|
+
Tcl_Obj *reliefObj;
|
|
277
|
+
Tcl_Obj *highlightColorObj;
|
|
278
|
+
Tcl_Obj *defaultStateObj;
|
|
279
|
+
} ButtonBorderElement;
|
|
280
|
+
|
|
281
|
+
static Ttk_ElementOptionSpec ButtonBorderElementOptions[] = {
|
|
282
|
+
{ "-relief",TK_OPTION_RELIEF,
|
|
283
|
+
Tk_Offset(ButtonBorderElement,reliefObj), "flat" },
|
|
284
|
+
{ "-highlightcolor",TK_OPTION_COLOR,
|
|
285
|
+
Tk_Offset(ButtonBorderElement,highlightColorObj), "black" },
|
|
286
|
+
{ "-default", TK_OPTION_ANY,
|
|
287
|
+
Tk_Offset(ButtonBorderElement,defaultStateObj), "disabled" },
|
|
288
|
+
{NULL}
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
static void ButtonBorderElementSize(
|
|
292
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
293
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
294
|
+
{
|
|
295
|
+
ButtonBorderElement *bd = elementRecord;
|
|
296
|
+
int relief = TK_RELIEF_RAISED;
|
|
297
|
+
int defaultState = TTK_BUTTON_DEFAULT_DISABLED;
|
|
298
|
+
short int cx, cy;
|
|
299
|
+
|
|
300
|
+
Tk_GetReliefFromObj(NULL, bd->reliefObj, &relief);
|
|
301
|
+
Ttk_GetButtonDefaultStateFromObj(NULL, bd->defaultStateObj, &defaultState);
|
|
302
|
+
cx = GetSystemMetrics(SM_CXEDGE);
|
|
303
|
+
cy = GetSystemMetrics(SM_CYEDGE);
|
|
304
|
+
|
|
305
|
+
/* Space for default indicator:
|
|
306
|
+
*/
|
|
307
|
+
if (defaultState != TTK_BUTTON_DEFAULT_DISABLED) {
|
|
308
|
+
++cx; ++cy;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/* Space for focus ring:
|
|
312
|
+
*/
|
|
313
|
+
cx += 2;
|
|
314
|
+
cy += 2;
|
|
315
|
+
|
|
316
|
+
*paddingPtr = Ttk_MakePadding(cx,cy,cx,cy);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
static void ButtonBorderElementDraw(
|
|
320
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
321
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
322
|
+
{
|
|
323
|
+
ButtonBorderElement *bd = elementRecord;
|
|
324
|
+
int relief = TK_RELIEF_FLAT;
|
|
325
|
+
int defaultState = TTK_BUTTON_DEFAULT_DISABLED;
|
|
326
|
+
TkWinDCState dcState;
|
|
327
|
+
HDC hdc;
|
|
328
|
+
RECT rc;
|
|
329
|
+
|
|
330
|
+
Tk_GetReliefFromObj(NULL, bd->reliefObj, &relief);
|
|
331
|
+
Ttk_GetButtonDefaultStateFromObj(NULL, bd->defaultStateObj, &defaultState);
|
|
332
|
+
|
|
333
|
+
if (defaultState == TTK_BUTTON_DEFAULT_ACTIVE) {
|
|
334
|
+
XColor *highlightColor =
|
|
335
|
+
Tk_GetColorFromObj(tkwin, bd->highlightColorObj);
|
|
336
|
+
GC gc = Tk_GCForColor(highlightColor, d);
|
|
337
|
+
XDrawRectangle(Tk_Display(tkwin), d, gc, b.x,b.y,b.width-1,b.height-1);
|
|
338
|
+
}
|
|
339
|
+
if (defaultState != TTK_BUTTON_DEFAULT_DISABLED) {
|
|
340
|
+
++b.x; ++b.y; b.width -= 2; b.height -= 2;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
|
|
344
|
+
|
|
345
|
+
rc = BoxToRect(b);
|
|
346
|
+
DrawFrameControl(hdc, &rc,
|
|
347
|
+
DFC_BUTTON, /* classId */
|
|
348
|
+
DFCS_BUTTONPUSH | Ttk_StateTableLookup(pushbutton_statemap, state));
|
|
349
|
+
|
|
350
|
+
/* Draw focus ring:
|
|
351
|
+
*/
|
|
352
|
+
if (state & TTK_STATE_FOCUS) {
|
|
353
|
+
short int borderWidth = 3; /* @@@ Use GetSystemMetrics?*/
|
|
354
|
+
rc = BoxToRect(Ttk_PadBox(b, Ttk_UniformPadding(borderWidth)));
|
|
355
|
+
DrawFocusRect(hdc, &rc);
|
|
356
|
+
}
|
|
357
|
+
TkWinReleaseDrawableDC(d, hdc, &dcState);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
static Ttk_ElementSpec ButtonBorderElementSpec =
|
|
361
|
+
{
|
|
362
|
+
TK_STYLE_VERSION_2,
|
|
363
|
+
sizeof(ButtonBorderElement),
|
|
364
|
+
ButtonBorderElementOptions,
|
|
365
|
+
ButtonBorderElementSize,
|
|
366
|
+
ButtonBorderElementDraw
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
/*------------------------------------------------------------------------
|
|
370
|
+
* +++ Focus element.
|
|
371
|
+
* Draw dashed focus rectangle.
|
|
372
|
+
*/
|
|
373
|
+
|
|
374
|
+
static void FocusElementSize(
|
|
375
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
376
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
377
|
+
{
|
|
378
|
+
*paddingPtr = Ttk_UniformPadding(1);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
static void FocusElementDraw(
|
|
382
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
383
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
384
|
+
{
|
|
385
|
+
if (state & TTK_STATE_FOCUS) {
|
|
386
|
+
RECT rc = BoxToRect(b);
|
|
387
|
+
TkWinDCState dcState;
|
|
388
|
+
HDC hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
|
|
389
|
+
DrawFocusRect(hdc, &rc);
|
|
390
|
+
TkWinReleaseDrawableDC(d, hdc, &dcState);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
static Ttk_ElementSpec FocusElementSpec =
|
|
395
|
+
{
|
|
396
|
+
TK_STYLE_VERSION_2,
|
|
397
|
+
sizeof(NullElement),
|
|
398
|
+
TtkNullElementOptions,
|
|
399
|
+
FocusElementSize,
|
|
400
|
+
FocusElementDraw
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
/* FillFocusElement --
|
|
404
|
+
* Draws a focus ring filled with the selection color
|
|
405
|
+
*/
|
|
406
|
+
|
|
407
|
+
typedef struct {
|
|
408
|
+
Tcl_Obj *fillColorObj;
|
|
409
|
+
} FillFocusElement;
|
|
410
|
+
|
|
411
|
+
static Ttk_ElementOptionSpec FillFocusElementOptions[] = {
|
|
412
|
+
{ "-focusfill", TK_OPTION_COLOR,
|
|
413
|
+
Tk_Offset(FillFocusElement,fillColorObj), "white" },
|
|
414
|
+
{ NULL }
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
/* @@@ FIX THIS */
|
|
418
|
+
static void FillFocusElementDraw(
|
|
419
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
420
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
421
|
+
{
|
|
422
|
+
FillFocusElement *focus = elementRecord;
|
|
423
|
+
if (state & TTK_STATE_FOCUS) {
|
|
424
|
+
RECT rc = BoxToRect(b);
|
|
425
|
+
TkWinDCState dcState;
|
|
426
|
+
XColor *fillColor = Tk_GetColorFromObj(tkwin, focus->fillColorObj);
|
|
427
|
+
GC gc = Tk_GCForColor(fillColor, d);
|
|
428
|
+
HDC hdc;
|
|
429
|
+
|
|
430
|
+
XFillRectangle(Tk_Display(tkwin),d,gc, b.x,b.y,b.width,b.height);
|
|
431
|
+
hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
|
|
432
|
+
DrawFocusRect(hdc, &rc);
|
|
433
|
+
TkWinReleaseDrawableDC(d, hdc, &dcState);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/*
|
|
438
|
+
* ComboboxFocusElement --
|
|
439
|
+
* Read-only comboboxes have a filled focus ring, editable ones do not.
|
|
440
|
+
*/
|
|
441
|
+
static void ComboboxFocusElementDraw(
|
|
442
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
443
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
444
|
+
{
|
|
445
|
+
if (state & TTK_STATE_READONLY) {
|
|
446
|
+
FillFocusElementDraw(clientData, elementRecord, tkwin, d, b, state);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
static Ttk_ElementSpec ComboboxFocusElementSpec =
|
|
451
|
+
{
|
|
452
|
+
TK_STYLE_VERSION_2,
|
|
453
|
+
sizeof(FillFocusElement),
|
|
454
|
+
FillFocusElementOptions,
|
|
455
|
+
FocusElementSize,
|
|
456
|
+
ComboboxFocusElementDraw
|
|
457
|
+
};
|
|
458
|
+
|
|
459
|
+
/*----------------------------------------------------------------------
|
|
460
|
+
* +++ Scrollbar trough element.
|
|
461
|
+
*
|
|
462
|
+
* The native windows scrollbar is drawn using a pattern brush giving a
|
|
463
|
+
* stippled appearance when the trough might otherwise be invisible.
|
|
464
|
+
* We can deal with this here.
|
|
465
|
+
*/
|
|
466
|
+
|
|
467
|
+
typedef struct { /* clientData for Trough element */
|
|
468
|
+
HBRUSH PatternBrush;
|
|
469
|
+
HBITMAP PatternBitmap;
|
|
470
|
+
} TroughClientData;
|
|
471
|
+
|
|
472
|
+
static const WORD Pattern[] = {
|
|
473
|
+
0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa
|
|
474
|
+
};
|
|
475
|
+
|
|
476
|
+
static void TroughClientDataDeleteProc(void *clientData)
|
|
477
|
+
{
|
|
478
|
+
TroughClientData *cd = clientData;
|
|
479
|
+
DeleteObject(cd->PatternBrush);
|
|
480
|
+
DeleteObject(cd->PatternBitmap);
|
|
481
|
+
ckfree(clientData);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
static TroughClientData *TroughClientDataInit(Tcl_Interp *interp)
|
|
485
|
+
{
|
|
486
|
+
TroughClientData *cd = (TroughClientData*)ckalloc(sizeof(*cd));
|
|
487
|
+
cd->PatternBitmap = CreateBitmap(8, 8, 1, 1, Pattern);
|
|
488
|
+
cd->PatternBrush = CreatePatternBrush(cd->PatternBitmap);
|
|
489
|
+
Ttk_RegisterCleanup(interp, cd, TroughClientDataDeleteProc);
|
|
490
|
+
return cd;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
static void TroughElementDraw(
|
|
494
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
495
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
496
|
+
{
|
|
497
|
+
TroughClientData *cd = clientData;
|
|
498
|
+
TkWinDCState dcState;
|
|
499
|
+
HDC hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
|
|
500
|
+
HBRUSH hbr;
|
|
501
|
+
COLORREF bk, oldbk, oldtxt;
|
|
502
|
+
|
|
503
|
+
hbr = SelectObject(hdc, GetSysColorBrush(COLOR_SCROLLBAR));
|
|
504
|
+
bk = GetSysColor(COLOR_3DHIGHLIGHT);
|
|
505
|
+
oldtxt = SetTextColor(hdc, GetSysColor(COLOR_3DFACE));
|
|
506
|
+
oldbk = SetBkColor(hdc, bk);
|
|
507
|
+
|
|
508
|
+
/* WAS: if (bk (COLOR_3DHIGHLIGHT) == GetSysColor(COLOR_WINDOW)) ... */
|
|
509
|
+
if (GetSysColor(COLOR_SCROLLBAR) == GetSysColor(COLOR_BTNFACE)) {
|
|
510
|
+
/* Draw using the pattern brush */
|
|
511
|
+
SelectObject(hdc, cd->PatternBrush);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
PatBlt(hdc, b.x, b.y, b.width, b.height, PATCOPY);
|
|
515
|
+
SetBkColor(hdc, oldbk);
|
|
516
|
+
SetTextColor(hdc, oldtxt);
|
|
517
|
+
SelectObject(hdc, hbr);
|
|
518
|
+
TkWinReleaseDrawableDC(d, hdc, &dcState);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
static Ttk_ElementSpec TroughElementSpec =
|
|
522
|
+
{
|
|
523
|
+
TK_STYLE_VERSION_2,
|
|
524
|
+
sizeof(NullElement),
|
|
525
|
+
TtkNullElementOptions,
|
|
526
|
+
TtkNullElementSize,
|
|
527
|
+
TroughElementDraw
|
|
528
|
+
};
|
|
529
|
+
|
|
530
|
+
/*------------------------------------------------------------------------
|
|
531
|
+
* +++ Thumb element.
|
|
532
|
+
*/
|
|
533
|
+
|
|
534
|
+
typedef struct
|
|
535
|
+
{
|
|
536
|
+
Tcl_Obj *orientObj;
|
|
537
|
+
} ThumbElement;
|
|
538
|
+
|
|
539
|
+
static Ttk_ElementOptionSpec ThumbElementOptions[] =
|
|
540
|
+
{
|
|
541
|
+
{ "-orient", TK_OPTION_ANY,Tk_Offset(ThumbElement,orientObj),"horizontal"},
|
|
542
|
+
{ NULL }
|
|
543
|
+
};
|
|
544
|
+
|
|
545
|
+
static void ThumbElementSize(
|
|
546
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
547
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
548
|
+
{
|
|
549
|
+
ThumbElement *thumbPtr = elementRecord;
|
|
550
|
+
int orient;
|
|
551
|
+
|
|
552
|
+
Ttk_GetOrientFromObj(NULL, thumbPtr->orientObj, &orient);
|
|
553
|
+
if (orient == TTK_ORIENT_HORIZONTAL) {
|
|
554
|
+
*widthPtr = GetSystemMetrics(SM_CXHTHUMB);
|
|
555
|
+
*heightPtr = GetSystemMetrics(SM_CYHSCROLL);
|
|
556
|
+
} else {
|
|
557
|
+
*widthPtr = GetSystemMetrics(SM_CXVSCROLL);
|
|
558
|
+
*heightPtr = GetSystemMetrics(SM_CYVTHUMB);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
static void ThumbElementDraw(
|
|
563
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
564
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
565
|
+
{
|
|
566
|
+
RECT rc = BoxToRect(b);
|
|
567
|
+
TkWinDCState dcState;
|
|
568
|
+
HDC hdc;
|
|
569
|
+
|
|
570
|
+
/* Windows doesn't show a thumb when the scrollbar is disabled */
|
|
571
|
+
if (state & TTK_STATE_DISABLED)
|
|
572
|
+
return;
|
|
573
|
+
|
|
574
|
+
hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
|
|
575
|
+
DrawEdge(hdc, &rc, EDGE_RAISED, BF_RECT | BF_MIDDLE);
|
|
576
|
+
TkWinReleaseDrawableDC(d, hdc, &dcState);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
static Ttk_ElementSpec ThumbElementSpec =
|
|
580
|
+
{
|
|
581
|
+
TK_STYLE_VERSION_2,
|
|
582
|
+
sizeof(ThumbElement),
|
|
583
|
+
ThumbElementOptions,
|
|
584
|
+
ThumbElementSize,
|
|
585
|
+
ThumbElementDraw
|
|
586
|
+
};
|
|
587
|
+
|
|
588
|
+
/* ----------------------------------------------------------------------
|
|
589
|
+
* The slider element is the shaped thumb used in the slider widget.
|
|
590
|
+
* Windows likes to call this a trackbar.
|
|
591
|
+
*/
|
|
592
|
+
|
|
593
|
+
typedef struct
|
|
594
|
+
{
|
|
595
|
+
Tcl_Obj *orientObj; /* orientation of the slider widget */
|
|
596
|
+
} SliderElement;
|
|
597
|
+
|
|
598
|
+
static Ttk_ElementOptionSpec SliderElementOptions[] =
|
|
599
|
+
{
|
|
600
|
+
{ "-orient", TK_OPTION_ANY, Tk_Offset(SliderElement,orientObj),
|
|
601
|
+
"horizontal" },
|
|
602
|
+
{ NULL }
|
|
603
|
+
};
|
|
604
|
+
|
|
605
|
+
static void SliderElementSize(
|
|
606
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
607
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
608
|
+
{
|
|
609
|
+
SliderElement *slider = elementRecord;
|
|
610
|
+
int orient;
|
|
611
|
+
|
|
612
|
+
Ttk_GetOrientFromObj(NULL, slider->orientObj, &orient);
|
|
613
|
+
if (orient == TTK_ORIENT_HORIZONTAL) {
|
|
614
|
+
*widthPtr = (GetSystemMetrics(SM_CXHTHUMB) / 2) | 1;
|
|
615
|
+
*heightPtr = GetSystemMetrics(SM_CYHSCROLL);
|
|
616
|
+
} else {
|
|
617
|
+
*widthPtr = GetSystemMetrics(SM_CXVSCROLL);
|
|
618
|
+
*heightPtr = (GetSystemMetrics(SM_CYVTHUMB) / 2) | 1;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
static void SliderElementDraw(
|
|
623
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
624
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
625
|
+
{
|
|
626
|
+
RECT rc = BoxToRect(b);
|
|
627
|
+
TkWinDCState dcState;
|
|
628
|
+
HDC hdc;
|
|
629
|
+
|
|
630
|
+
hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
|
|
631
|
+
DrawEdge(hdc, &rc, EDGE_RAISED, BF_RECT | BF_MIDDLE);
|
|
632
|
+
TkWinReleaseDrawableDC(d, hdc, &dcState);
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
static Ttk_ElementSpec SliderElementSpec =
|
|
636
|
+
{
|
|
637
|
+
TK_STYLE_VERSION_2,
|
|
638
|
+
sizeof(SliderElement),
|
|
639
|
+
SliderElementOptions,
|
|
640
|
+
SliderElementSize,
|
|
641
|
+
SliderElementDraw
|
|
642
|
+
};
|
|
643
|
+
|
|
644
|
+
/*------------------------------------------------------------------------
|
|
645
|
+
* +++ Notebook elements.
|
|
646
|
+
*/
|
|
647
|
+
|
|
648
|
+
static void ClientElementSize(
|
|
649
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
650
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
651
|
+
{
|
|
652
|
+
paddingPtr->left = paddingPtr->right = GetSystemMetrics(SM_CXEDGE);
|
|
653
|
+
paddingPtr->top = paddingPtr->bottom = GetSystemMetrics(SM_CYEDGE);
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
static void ClientElementDraw(
|
|
657
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
658
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
659
|
+
{
|
|
660
|
+
RECT rc = BoxToRect(b);
|
|
661
|
+
TkWinDCState dcState;
|
|
662
|
+
HDC hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
|
|
663
|
+
DrawEdge(hdc, &rc, EDGE_RAISED, BF_RECT | BF_SOFT);
|
|
664
|
+
TkWinReleaseDrawableDC(d, hdc, &dcState);
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
static Ttk_ElementSpec ClientElementSpec =
|
|
668
|
+
{
|
|
669
|
+
TK_STYLE_VERSION_2,
|
|
670
|
+
sizeof(NullElement),
|
|
671
|
+
TtkNullElementOptions,
|
|
672
|
+
ClientElementSize,
|
|
673
|
+
ClientElementDraw
|
|
674
|
+
};
|
|
675
|
+
|
|
676
|
+
/*------------------------------------------------------------------------
|
|
677
|
+
* +++ Layouts.
|
|
678
|
+
*/
|
|
679
|
+
|
|
680
|
+
TTK_BEGIN_LAYOUT_TABLE(LayoutTable)
|
|
681
|
+
|
|
682
|
+
TTK_LAYOUT("TButton",
|
|
683
|
+
TTK_GROUP("Button.border", TTK_FILL_BOTH,
|
|
684
|
+
TTK_GROUP("Button.padding", TTK_FILL_BOTH,
|
|
685
|
+
TTK_NODE("Button.label", TTK_FILL_BOTH))))
|
|
686
|
+
|
|
687
|
+
TTK_LAYOUT("TCombobox",
|
|
688
|
+
TTK_GROUP("Combobox.field", TTK_FILL_BOTH,
|
|
689
|
+
TTK_NODE("Combobox.downarrow", TTK_PACK_RIGHT|TTK_FILL_Y)
|
|
690
|
+
TTK_GROUP("Combobox.padding", TTK_PACK_LEFT|TTK_EXPAND|TTK_FILL_BOTH,
|
|
691
|
+
TTK_GROUP("Combobox.focus", TTK_PACK_LEFT|TTK_EXPAND|TTK_FILL_BOTH,
|
|
692
|
+
TTK_NODE("Combobox.textarea", TTK_FILL_BOTH)))))
|
|
693
|
+
|
|
694
|
+
TTK_END_LAYOUT_TABLE
|
|
695
|
+
|
|
696
|
+
/* ---------------------------------------------------------------------- */
|
|
697
|
+
|
|
698
|
+
MODULE_SCOPE
|
|
699
|
+
int TtkWinTheme_Init(Tcl_Interp *interp, HWND hwnd)
|
|
700
|
+
{
|
|
701
|
+
Ttk_Theme themePtr, parentPtr;
|
|
702
|
+
FrameControlElementData *fce = FrameControlElements;
|
|
703
|
+
|
|
704
|
+
parentPtr = Ttk_GetTheme(interp, "alt");
|
|
705
|
+
themePtr = Ttk_CreateTheme(interp, "winnative", parentPtr);
|
|
706
|
+
if (!themePtr) {
|
|
707
|
+
return TCL_ERROR;
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
Ttk_RegisterElementSpec(themePtr, "border", &BorderElementSpec, NULL);
|
|
711
|
+
Ttk_RegisterElementSpec(themePtr, "Button.border",
|
|
712
|
+
&ButtonBorderElementSpec, NULL);
|
|
713
|
+
Ttk_RegisterElementSpec(themePtr, "field", &FieldElementSpec, NULL);
|
|
714
|
+
Ttk_RegisterElementSpec(themePtr, "focus", &FocusElementSpec, NULL);
|
|
715
|
+
Ttk_RegisterElementSpec(themePtr, "Combobox.focus",
|
|
716
|
+
&ComboboxFocusElementSpec, NULL);
|
|
717
|
+
Ttk_RegisterElementSpec(themePtr, "thumb", &ThumbElementSpec, NULL);
|
|
718
|
+
Ttk_RegisterElementSpec(themePtr, "slider", &SliderElementSpec, NULL);
|
|
719
|
+
Ttk_RegisterElementSpec(themePtr, "Scrollbar.trough", &TroughElementSpec,
|
|
720
|
+
TroughClientDataInit(interp));
|
|
721
|
+
|
|
722
|
+
Ttk_RegisterElementSpec(themePtr, "client", &ClientElementSpec, NULL);
|
|
723
|
+
|
|
724
|
+
for (fce = FrameControlElements; fce->name != 0; ++fce) {
|
|
725
|
+
Ttk_RegisterElementSpec(themePtr, fce->name,
|
|
726
|
+
&FrameControlElementSpec, fce);
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
Ttk_RegisterLayouts(themePtr, LayoutTable);
|
|
730
|
+
|
|
731
|
+
Tcl_PkgProvide(interp, "ttk::theme::winnative", TILE_VERSION);
|
|
732
|
+
return TCL_OK;
|
|
733
|
+
}
|
|
734
|
+
|