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,44 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* gunk.h
|
|
3
|
+
*
|
|
4
|
+
* Portability gunk.
|
|
5
|
+
*
|
|
6
|
+
* Tk doesn't seem provide a consistent API across different
|
|
7
|
+
* platforms, at least not in the public interface.
|
|
8
|
+
* This file is a dumping ground for any #ifdeffery needed
|
|
9
|
+
* to get stuff to compile on multiple platforms.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* ... Tk also doesn't provide a consistent set of #defines
|
|
15
|
+
* to determine what platform we're on ...
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#if defined(__WIN32__)
|
|
19
|
+
# define WIN_TK 1
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
#if !defined(WIN_TK) && !defined(MAC_TK) && !defined(MAC_OSX_TK)
|
|
23
|
+
# define X11_TK 1
|
|
24
|
+
#endif
|
|
25
|
+
|
|
26
|
+
#if X11_TK
|
|
27
|
+
#define TkPutImage(colors, ncolors, display, pixels, gc, image, destx, desty, srcx, srcy, width, height) \
|
|
28
|
+
XPutImage(display, pixels, gc, image, destx, desty, srcx, \
|
|
29
|
+
srcy, width, height);
|
|
30
|
+
#endif
|
|
31
|
+
|
|
32
|
+
#if defined(WIN_TK) && defined(NO_PRIVATE_HEADERS)
|
|
33
|
+
#include <windows.h>
|
|
34
|
+
#include <tkPlatDecls.h>
|
|
35
|
+
/* From tkWinInt.h: */
|
|
36
|
+
typedef struct TkWinDCState {
|
|
37
|
+
HPALETTE palette;
|
|
38
|
+
int bkmode;
|
|
39
|
+
} TkWinDCState;
|
|
40
|
+
|
|
41
|
+
EXTERN HDC TkWinGetDrawableDC(Display *, Drawable, TkWinDCState*);
|
|
42
|
+
EXTERN HDC TkWinReleaseDrawableDC(Drawable, HDC, TkWinDCState*);
|
|
43
|
+
#endif
|
|
44
|
+
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/* image.c,v 1.9 2007/11/08 01:39:25 jenglish Exp
|
|
2
|
+
* Image specifications and image element factory.
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2004 Pat Thoyts <patthoyts@users.sf.net>
|
|
5
|
+
* Copyright (C) 2004 Joe English
|
|
6
|
+
*
|
|
7
|
+
* An imageSpec is a multi-element list; the first element
|
|
8
|
+
* is the name of the default image to use, the remainder of the
|
|
9
|
+
* list is a sequence of statespec/imagename options as per
|
|
10
|
+
* [style map].
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
#include <string.h>
|
|
14
|
+
#include <tk.h>
|
|
15
|
+
#include "tkTheme.h"
|
|
16
|
+
|
|
17
|
+
#define TILE_07_COMPAT 1
|
|
18
|
+
|
|
19
|
+
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
|
20
|
+
|
|
21
|
+
/*------------------------------------------------------------------------
|
|
22
|
+
* +++ ImageSpec management.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
struct TtkImageSpec {
|
|
26
|
+
Tk_Image baseImage; /* Base image to use */
|
|
27
|
+
int mapCount; /* #state-specific overrides */
|
|
28
|
+
Ttk_StateSpec *states; /* array[mapCount] of states ... */
|
|
29
|
+
Tk_Image *images; /* ... per-state images to use */
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/* NullImageChanged --
|
|
33
|
+
* Do-nothing Tk_ImageChangedProc.
|
|
34
|
+
*/
|
|
35
|
+
static void NullImageChanged(ClientData clientData,
|
|
36
|
+
int x, int y, int width, int height, int imageWidth, int imageHeight)
|
|
37
|
+
{ /* No-op */ }
|
|
38
|
+
|
|
39
|
+
/* TtkGetImageSpec --
|
|
40
|
+
* Constructs a Ttk_ImageSpec * from a Tcl_Obj *.
|
|
41
|
+
* Result must be released using TtkFreeImageSpec.
|
|
42
|
+
*
|
|
43
|
+
* TODO: Need a variant of this that takes a user-specified ImageChanged proc
|
|
44
|
+
*/
|
|
45
|
+
Ttk_ImageSpec *
|
|
46
|
+
TtkGetImageSpec(Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr)
|
|
47
|
+
{
|
|
48
|
+
Ttk_ImageSpec *imageSpec = 0;
|
|
49
|
+
int i = 0, n = 0, objc;
|
|
50
|
+
Tcl_Obj **objv;
|
|
51
|
+
|
|
52
|
+
imageSpec = (Ttk_ImageSpec *)ckalloc(sizeof(*imageSpec));
|
|
53
|
+
imageSpec->baseImage = 0;
|
|
54
|
+
imageSpec->mapCount = 0;
|
|
55
|
+
imageSpec->states = 0;
|
|
56
|
+
imageSpec->images = 0;
|
|
57
|
+
|
|
58
|
+
if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) {
|
|
59
|
+
goto error;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if ((objc % 2) != 1) {
|
|
63
|
+
if (interp) {
|
|
64
|
+
Tcl_SetResult(interp,
|
|
65
|
+
"image specification must contain an odd number of elements",
|
|
66
|
+
TCL_STATIC);
|
|
67
|
+
}
|
|
68
|
+
goto error;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
n = (objc - 1) / 2;
|
|
72
|
+
imageSpec->states = (Ttk_StateSpec*)ckalloc(n * sizeof(Ttk_StateSpec));
|
|
73
|
+
imageSpec->images = (Tk_Image*)ckalloc(n * sizeof(Tk_Image *));
|
|
74
|
+
|
|
75
|
+
/* Get base image:
|
|
76
|
+
*/
|
|
77
|
+
imageSpec->baseImage = Tk_GetImage(
|
|
78
|
+
interp, tkwin, Tcl_GetString(objv[0]), NullImageChanged, NULL);
|
|
79
|
+
if (!imageSpec->baseImage) {
|
|
80
|
+
goto error;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* Extract state and image specifications:
|
|
84
|
+
*/
|
|
85
|
+
for (i = 0; i < n; ++i) {
|
|
86
|
+
Tcl_Obj *stateSpec = objv[2*i + 1];
|
|
87
|
+
const char *imageName = Tcl_GetString(objv[2*i + 2]);
|
|
88
|
+
Ttk_StateSpec state;
|
|
89
|
+
|
|
90
|
+
if (Ttk_GetStateSpecFromObj(interp, stateSpec, &state) != TCL_OK) {
|
|
91
|
+
goto error;
|
|
92
|
+
}
|
|
93
|
+
imageSpec->states[i] = state;
|
|
94
|
+
|
|
95
|
+
imageSpec->images[i] = Tk_GetImage(
|
|
96
|
+
interp, tkwin, imageName, NullImageChanged, NULL);
|
|
97
|
+
if (imageSpec->images[i] == NULL) {
|
|
98
|
+
goto error;
|
|
99
|
+
}
|
|
100
|
+
imageSpec->mapCount = i+1;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return imageSpec;
|
|
104
|
+
|
|
105
|
+
error:
|
|
106
|
+
TtkFreeImageSpec(imageSpec);
|
|
107
|
+
return NULL;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* TtkFreeImageSpec --
|
|
111
|
+
* Dispose of an image specification.
|
|
112
|
+
*/
|
|
113
|
+
void TtkFreeImageSpec(Ttk_ImageSpec *imageSpec)
|
|
114
|
+
{
|
|
115
|
+
int i;
|
|
116
|
+
|
|
117
|
+
for (i=0; i < imageSpec->mapCount; ++i) {
|
|
118
|
+
Tk_FreeImage(imageSpec->images[i]);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (imageSpec->baseImage) { Tk_FreeImage(imageSpec->baseImage); }
|
|
122
|
+
if (imageSpec->states) { ckfree((ClientData)imageSpec->states); }
|
|
123
|
+
if (imageSpec->images) { ckfree((ClientData)imageSpec->images); }
|
|
124
|
+
|
|
125
|
+
ckfree((ClientData)imageSpec);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* TtkSelectImage --
|
|
129
|
+
* Return a state-specific image from an ImageSpec
|
|
130
|
+
*/
|
|
131
|
+
Tk_Image TtkSelectImage(Ttk_ImageSpec *imageSpec, Ttk_State state)
|
|
132
|
+
{
|
|
133
|
+
int i;
|
|
134
|
+
for (i = 0; i < imageSpec->mapCount; ++i) {
|
|
135
|
+
if (Ttk_StateMatches(state, imageSpec->states+i)) {
|
|
136
|
+
return imageSpec->images[i];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return imageSpec->baseImage;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/*------------------------------------------------------------------------
|
|
143
|
+
* +++ Drawing utilities.
|
|
144
|
+
*/
|
|
145
|
+
|
|
146
|
+
/* LPadding, CPadding, RPadding --
|
|
147
|
+
* Split a box+padding pair into left, center, and right boxes.
|
|
148
|
+
*/
|
|
149
|
+
static Ttk_Box LPadding(Ttk_Box b, Ttk_Padding p)
|
|
150
|
+
{ return Ttk_MakeBox(b.x, b.y, p.left, b.height); }
|
|
151
|
+
|
|
152
|
+
static Ttk_Box CPadding(Ttk_Box b, Ttk_Padding p)
|
|
153
|
+
{ return Ttk_MakeBox(b.x+p.left, b.y, b.width-p.left-p.right, b.height); }
|
|
154
|
+
|
|
155
|
+
static Ttk_Box RPadding(Ttk_Box b, Ttk_Padding p)
|
|
156
|
+
{ return Ttk_MakeBox(b.x+b.width-p.right, b.y, p.right, b.height); }
|
|
157
|
+
|
|
158
|
+
/* TPadding, MPadding, BPadding --
|
|
159
|
+
* Split a box+padding pair into top, middle, and bottom parts.
|
|
160
|
+
*/
|
|
161
|
+
static Ttk_Box TPadding(Ttk_Box b, Ttk_Padding p)
|
|
162
|
+
{ return Ttk_MakeBox(b.x, b.y, b.width, p.top); }
|
|
163
|
+
|
|
164
|
+
static Ttk_Box MPadding(Ttk_Box b, Ttk_Padding p)
|
|
165
|
+
{ return Ttk_MakeBox(b.x, b.y+p.top, b.width, b.height-p.top-p.bottom); }
|
|
166
|
+
|
|
167
|
+
static Ttk_Box BPadding(Ttk_Box b, Ttk_Padding p)
|
|
168
|
+
{ return Ttk_MakeBox(b.x, b.y+b.height-p.bottom, b.width, p.bottom); }
|
|
169
|
+
|
|
170
|
+
/* Ttk_Fill --
|
|
171
|
+
* Fill the destination area of the drawable by replicating
|
|
172
|
+
* the source area of the image.
|
|
173
|
+
*/
|
|
174
|
+
static void Ttk_Fill(
|
|
175
|
+
Tk_Window tkwin, Drawable d, Tk_Image image, Ttk_Box src, Ttk_Box dst)
|
|
176
|
+
{
|
|
177
|
+
int dr = dst.x + dst.width;
|
|
178
|
+
int db = dst.y + dst.height;
|
|
179
|
+
int x,y;
|
|
180
|
+
|
|
181
|
+
if (!(src.width && src.height && dst.width && dst.height))
|
|
182
|
+
return;
|
|
183
|
+
|
|
184
|
+
for (x = dst.x; x < dr; x += src.width) {
|
|
185
|
+
int cw = MIN(src.width, dr - x);
|
|
186
|
+
for (y = dst.y; y <= db; y += src.height) {
|
|
187
|
+
int ch = MIN(src.height, db - y);
|
|
188
|
+
Tk_RedrawImage(image, src.x, src.y, cw, ch, d, x, y);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* Ttk_Stripe --
|
|
194
|
+
* Fill a horizontal stripe of the destination drawable.
|
|
195
|
+
*/
|
|
196
|
+
static void Ttk_Stripe(
|
|
197
|
+
Tk_Window tkwin, Drawable d, Tk_Image image,
|
|
198
|
+
Ttk_Box src, Ttk_Box dst, Ttk_Padding p)
|
|
199
|
+
{
|
|
200
|
+
Ttk_Fill(tkwin, d, image, LPadding(src,p), LPadding(dst,p));
|
|
201
|
+
Ttk_Fill(tkwin, d, image, CPadding(src,p), CPadding(dst,p));
|
|
202
|
+
Ttk_Fill(tkwin, d, image, RPadding(src,p), RPadding(dst,p));
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/* Ttk_Tile --
|
|
206
|
+
* Fill successive horizontal stripes of the destination drawable.
|
|
207
|
+
*/
|
|
208
|
+
static void Ttk_Tile(
|
|
209
|
+
Tk_Window tkwin, Drawable d, Tk_Image image,
|
|
210
|
+
Ttk_Box src, Ttk_Box dst, Ttk_Padding p)
|
|
211
|
+
{
|
|
212
|
+
Ttk_Stripe(tkwin, d, image, TPadding(src,p), TPadding(dst,p), p);
|
|
213
|
+
Ttk_Stripe(tkwin, d, image, MPadding(src,p), MPadding(dst,p), p);
|
|
214
|
+
Ttk_Stripe(tkwin, d, image, BPadding(src,p), BPadding(dst,p), p);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/*------------------------------------------------------------------------
|
|
218
|
+
* +++ Image element definition.
|
|
219
|
+
*/
|
|
220
|
+
|
|
221
|
+
typedef struct { /* ClientData for image elements */
|
|
222
|
+
Ttk_ImageSpec *imageSpec; /* Image(s) to use */
|
|
223
|
+
int minWidth; /* Minimum width; overrides image width */
|
|
224
|
+
int minHeight; /* Minimum width; overrides image width */
|
|
225
|
+
Ttk_Sticky sticky; /* -stickiness specification */
|
|
226
|
+
Ttk_Padding border; /* Fixed border region */
|
|
227
|
+
Ttk_Padding padding; /* Internal padding */
|
|
228
|
+
|
|
229
|
+
#if TILE_07_COMPAT
|
|
230
|
+
Ttk_ResourceCache cache; /* Resource cache for images */
|
|
231
|
+
Ttk_StateMap imageMap; /* State-based lookup table for images */
|
|
232
|
+
#endif
|
|
233
|
+
} ImageData;
|
|
234
|
+
|
|
235
|
+
static void FreeImageData(void *clientData)
|
|
236
|
+
{
|
|
237
|
+
ImageData *imageData = clientData;
|
|
238
|
+
if (imageData->imageSpec) { TtkFreeImageSpec(imageData->imageSpec); }
|
|
239
|
+
#if TILE_07_COMPAT
|
|
240
|
+
if (imageData->imageMap) { Tcl_DecrRefCount(imageData->imageMap); }
|
|
241
|
+
#endif
|
|
242
|
+
ckfree(clientData);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
static void ImageElementSize(
|
|
246
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
247
|
+
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
|
|
248
|
+
{
|
|
249
|
+
ImageData *imageData = clientData;
|
|
250
|
+
Tk_Image image = imageData->imageSpec->baseImage;
|
|
251
|
+
|
|
252
|
+
if (image) {
|
|
253
|
+
Tk_SizeOfImage(image, widthPtr, heightPtr);
|
|
254
|
+
}
|
|
255
|
+
if (imageData->minWidth >= 0) {
|
|
256
|
+
*widthPtr = imageData->minWidth;
|
|
257
|
+
}
|
|
258
|
+
if (imageData->minHeight >= 0) {
|
|
259
|
+
*heightPtr = imageData->minHeight;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
*paddingPtr = imageData->padding;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
static void ImageElementDraw(
|
|
266
|
+
void *clientData, void *elementRecord, Tk_Window tkwin,
|
|
267
|
+
Drawable d, Ttk_Box b, unsigned int state)
|
|
268
|
+
{
|
|
269
|
+
ImageData *imageData = clientData;
|
|
270
|
+
Tk_Image image = 0;
|
|
271
|
+
int imgWidth, imgHeight;
|
|
272
|
+
Ttk_Box src, dst;
|
|
273
|
+
|
|
274
|
+
#if TILE_07_COMPAT
|
|
275
|
+
if (imageData->imageMap) {
|
|
276
|
+
Tcl_Obj *imageObj = Ttk_StateMapLookup(NULL,imageData->imageMap,state);
|
|
277
|
+
if (imageObj) {
|
|
278
|
+
image = Ttk_UseImage(imageData->cache, tkwin, imageObj);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (!image) {
|
|
282
|
+
image = TtkSelectImage(imageData->imageSpec, state);
|
|
283
|
+
}
|
|
284
|
+
#else
|
|
285
|
+
image = TtkSelectImage(imageData->imageSpec, state);
|
|
286
|
+
#endif
|
|
287
|
+
|
|
288
|
+
if (!image) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
Tk_SizeOfImage(image, &imgWidth, &imgHeight);
|
|
293
|
+
src = Ttk_MakeBox(0, 0, imgWidth, imgHeight);
|
|
294
|
+
dst = Ttk_StickBox(b, imgWidth, imgHeight, imageData->sticky);
|
|
295
|
+
|
|
296
|
+
Ttk_Tile(tkwin, d, image, src, dst, imageData->border);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
static Ttk_ElementSpec ImageElementSpec =
|
|
300
|
+
{
|
|
301
|
+
TK_STYLE_VERSION_2,
|
|
302
|
+
sizeof(NullElement),
|
|
303
|
+
TtkNullElementOptions,
|
|
304
|
+
ImageElementSize,
|
|
305
|
+
ImageElementDraw
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
/*------------------------------------------------------------------------
|
|
309
|
+
* +++ Image element factory.
|
|
310
|
+
*/
|
|
311
|
+
static int
|
|
312
|
+
Ttk_CreateImageElement(
|
|
313
|
+
Tcl_Interp *interp,
|
|
314
|
+
void *clientData,
|
|
315
|
+
Ttk_Theme theme,
|
|
316
|
+
const char *elementName,
|
|
317
|
+
int objc, Tcl_Obj *CONST objv[])
|
|
318
|
+
{
|
|
319
|
+
const char *optionStrings[] =
|
|
320
|
+
{ "-border","-height","-padding","-sticky","-width",NULL };
|
|
321
|
+
enum { O_BORDER, O_HEIGHT, O_PADDING, O_STICKY, O_WIDTH };
|
|
322
|
+
|
|
323
|
+
Ttk_ImageSpec *imageSpec = 0;
|
|
324
|
+
ImageData *imageData = 0;
|
|
325
|
+
int padding_specified = 0;
|
|
326
|
+
int i;
|
|
327
|
+
|
|
328
|
+
if (objc <= 0) {
|
|
329
|
+
Tcl_AppendResult(interp, "Must supply a base image", NULL);
|
|
330
|
+
return TCL_ERROR;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
imageSpec = TtkGetImageSpec(interp, Tk_MainWindow(interp), objv[0]);
|
|
334
|
+
if (!imageSpec) {
|
|
335
|
+
return TCL_ERROR;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
imageData = (ImageData*)ckalloc(sizeof(*imageData));
|
|
339
|
+
imageData->imageSpec = imageSpec;
|
|
340
|
+
imageData->minWidth = imageData->minHeight = -1;
|
|
341
|
+
imageData->sticky = TTK_FILL_BOTH;
|
|
342
|
+
imageData->border = imageData->padding = Ttk_UniformPadding(0);
|
|
343
|
+
#if TILE_07_COMPAT
|
|
344
|
+
imageData->cache = Ttk_GetResourceCache(interp);
|
|
345
|
+
imageData->imageMap = 0;
|
|
346
|
+
#endif
|
|
347
|
+
|
|
348
|
+
for (i = 1; i < objc; i += 2) {
|
|
349
|
+
int option;
|
|
350
|
+
|
|
351
|
+
if (i == objc - 1) {
|
|
352
|
+
Tcl_AppendResult(interp,
|
|
353
|
+
"Value for ", Tcl_GetString(objv[i]), " missing",
|
|
354
|
+
NULL);
|
|
355
|
+
goto error;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
#if TILE_07_COMPAT
|
|
359
|
+
if (!strcmp("-map", Tcl_GetString(objv[i]))) {
|
|
360
|
+
imageData->imageMap = objv[i+1];
|
|
361
|
+
Tcl_IncrRefCount(imageData->imageMap);
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
#endif
|
|
365
|
+
|
|
366
|
+
if (Tcl_GetIndexFromObj(interp, objv[i], optionStrings,
|
|
367
|
+
"option", 0, &option) != TCL_OK) { goto error; }
|
|
368
|
+
|
|
369
|
+
switch (option) {
|
|
370
|
+
case O_BORDER:
|
|
371
|
+
if (Ttk_GetBorderFromObj(interp, objv[i+1], &imageData->border)
|
|
372
|
+
!= TCL_OK) { goto error; }
|
|
373
|
+
if (!padding_specified) {
|
|
374
|
+
imageData->padding = imageData->border;
|
|
375
|
+
}
|
|
376
|
+
break;
|
|
377
|
+
case O_PADDING:
|
|
378
|
+
if (Ttk_GetBorderFromObj(interp, objv[i+1], &imageData->padding)
|
|
379
|
+
!= TCL_OK) { goto error; }
|
|
380
|
+
padding_specified = 1;
|
|
381
|
+
break;
|
|
382
|
+
case O_WIDTH:
|
|
383
|
+
if (Tcl_GetIntFromObj(interp, objv[i+1], &imageData->minWidth)
|
|
384
|
+
!= TCL_OK) { goto error; }
|
|
385
|
+
break;
|
|
386
|
+
case O_HEIGHT:
|
|
387
|
+
if (Tcl_GetIntFromObj(interp, objv[i+1], &imageData->minHeight)
|
|
388
|
+
!= TCL_OK) { goto error; }
|
|
389
|
+
break;
|
|
390
|
+
case O_STICKY:
|
|
391
|
+
if (Ttk_GetStickyFromObj(interp, objv[i+1], &imageData->sticky)
|
|
392
|
+
!= TCL_OK) { goto error; }
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
if (!Ttk_RegisterElement(interp, theme, elementName, &ImageElementSpec,
|
|
397
|
+
imageData))
|
|
398
|
+
{
|
|
399
|
+
goto error;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
Ttk_RegisterCleanup(interp, imageData, FreeImageData);
|
|
403
|
+
Tcl_SetObjResult(interp, Tcl_NewStringObj(elementName, -1));
|
|
404
|
+
return TCL_OK;
|
|
405
|
+
|
|
406
|
+
error:
|
|
407
|
+
FreeImageData(imageData);
|
|
408
|
+
return TCL_ERROR;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
void TtkImage_Init(Tcl_Interp *interp)
|
|
412
|
+
{
|
|
413
|
+
Ttk_RegisterElementFactory(interp, "image", Ttk_CreateImageElement, NULL);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/*EOF*/
|