Pratt 1.5.6
Sign up to get free protection for your applications and to get access to all the features.
- 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*/
|