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,268 @@
|
|
1
|
+
/*
|
2
|
+
* tkstate.c,v 1.11 2005/04/06 00:03:09 jenglish Exp
|
3
|
+
*
|
4
|
+
* Tk widget state utilities.
|
5
|
+
*
|
6
|
+
* Copyright (c) 2003 Joe English. Freely redistributable.
|
7
|
+
*
|
8
|
+
*/
|
9
|
+
|
10
|
+
#include <string.h>
|
11
|
+
|
12
|
+
#include <tk.h>
|
13
|
+
#include "tkTheme.h"
|
14
|
+
|
15
|
+
/*
|
16
|
+
* Table of state names. Must be kept in sync with TTK_STATE_*
|
17
|
+
* #defines in tkTheme.h.
|
18
|
+
*/
|
19
|
+
static const char *stateNames[] =
|
20
|
+
{
|
21
|
+
"active", /* Mouse cursor is over widget or element */
|
22
|
+
"disabled", /* Widget is disabled */
|
23
|
+
"focus", /* Widget has keyboard focus */
|
24
|
+
"pressed", /* Pressed or "armed" */
|
25
|
+
"selected", /* "on", "true", "current", etc. */
|
26
|
+
"background", /* Top-level window lost focus (Mac,Win "inactive") */
|
27
|
+
"alternate", /* Widget-specific alternate display style */
|
28
|
+
"invalid", /* Bad value */
|
29
|
+
"readonly", /* Editing/modification disabled */
|
30
|
+
NULL
|
31
|
+
};
|
32
|
+
|
33
|
+
/*------------------------------------------------------------------------
|
34
|
+
* +++ StateSpec object type:
|
35
|
+
*
|
36
|
+
* The string representation consists of a list of state names,
|
37
|
+
* each optionally prefixed by an exclamation point (!).
|
38
|
+
*
|
39
|
+
* The internal representation uses the upper half of the longValue
|
40
|
+
* to store the on bits and the lower half to store the off bits.
|
41
|
+
* If we ever get more than 16 states, this will need to be reconsidered...
|
42
|
+
*/
|
43
|
+
|
44
|
+
static int StateSpecSetFromAny(Tcl_Interp *interp, Tcl_Obj *obj);
|
45
|
+
/* static void StateSpecFreeIntRep(Tcl_Obj *); */
|
46
|
+
#define StateSpecFreeIntRep 0 /* not needed */
|
47
|
+
static void StateSpecDupIntRep(Tcl_Obj *, Tcl_Obj *);
|
48
|
+
static void StateSpecUpdateString(Tcl_Obj *);
|
49
|
+
|
50
|
+
static
|
51
|
+
struct Tcl_ObjType StateSpecObjType =
|
52
|
+
{
|
53
|
+
"StateSpec",
|
54
|
+
StateSpecFreeIntRep,
|
55
|
+
StateSpecDupIntRep,
|
56
|
+
StateSpecUpdateString,
|
57
|
+
StateSpecSetFromAny
|
58
|
+
};
|
59
|
+
|
60
|
+
static void StateSpecDupIntRep(Tcl_Obj *srcPtr, Tcl_Obj *copyPtr)
|
61
|
+
{
|
62
|
+
copyPtr->internalRep.longValue = srcPtr->internalRep.longValue;
|
63
|
+
copyPtr->typePtr = &StateSpecObjType;
|
64
|
+
}
|
65
|
+
|
66
|
+
static int StateSpecSetFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr)
|
67
|
+
{
|
68
|
+
int status;
|
69
|
+
int objc;
|
70
|
+
Tcl_Obj **objv;
|
71
|
+
int i;
|
72
|
+
unsigned int onbits = 0, offbits = 0;
|
73
|
+
|
74
|
+
status = Tcl_ListObjGetElements(interp, objPtr, &objc, &objv);
|
75
|
+
if (status != TCL_OK)
|
76
|
+
return status;
|
77
|
+
|
78
|
+
for (i = 0; i < objc; ++i) {
|
79
|
+
char *stateName = Tcl_GetString(objv[i]);
|
80
|
+
int on, j;
|
81
|
+
|
82
|
+
if (*stateName == '!') {
|
83
|
+
++stateName;
|
84
|
+
on = 0;
|
85
|
+
} else {
|
86
|
+
on = 1;
|
87
|
+
}
|
88
|
+
|
89
|
+
for (j = 0; stateNames[j] != 0; ++j) {
|
90
|
+
if (strcmp(stateName, stateNames[j]) == 0)
|
91
|
+
break;
|
92
|
+
}
|
93
|
+
|
94
|
+
if (stateNames[j] == 0) {
|
95
|
+
if (interp) {
|
96
|
+
Tcl_ResetResult(interp);
|
97
|
+
Tcl_AppendResult(interp, "Invalid state name ", stateName,NULL);
|
98
|
+
}
|
99
|
+
return TCL_ERROR;
|
100
|
+
}
|
101
|
+
|
102
|
+
if (on) {
|
103
|
+
onbits |= (1<<j);
|
104
|
+
} else {
|
105
|
+
offbits |= (1<<j);
|
106
|
+
}
|
107
|
+
}
|
108
|
+
|
109
|
+
/* Invalidate old intrep:
|
110
|
+
*/
|
111
|
+
if (objPtr->typePtr && objPtr->typePtr->freeIntRepProc) {
|
112
|
+
objPtr->typePtr->freeIntRepProc(objPtr);
|
113
|
+
}
|
114
|
+
|
115
|
+
objPtr->typePtr = &StateSpecObjType;
|
116
|
+
objPtr->internalRep.longValue = (onbits << 16) | offbits;
|
117
|
+
|
118
|
+
return TCL_OK;
|
119
|
+
}
|
120
|
+
|
121
|
+
static void StateSpecUpdateString(Tcl_Obj *objPtr)
|
122
|
+
{
|
123
|
+
unsigned int onbits = (objPtr->internalRep.longValue & 0xFFFF0000) >> 16;
|
124
|
+
unsigned int offbits = objPtr->internalRep.longValue & 0x0000FFFF;
|
125
|
+
unsigned int mask = onbits | offbits;
|
126
|
+
Tcl_DString result;
|
127
|
+
int i, len;
|
128
|
+
|
129
|
+
Tcl_DStringInit(&result);
|
130
|
+
|
131
|
+
for (i=0; stateNames[i] != NULL; ++i) {
|
132
|
+
if (mask & (1<<i)) {
|
133
|
+
if (offbits & (1<<i))
|
134
|
+
Tcl_DStringAppend(&result, "!", 1);
|
135
|
+
Tcl_DStringAppend(&result, stateNames[i], -1);
|
136
|
+
Tcl_DStringAppend(&result, " ", 1);
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
140
|
+
len = Tcl_DStringLength(&result);
|
141
|
+
if (len) {
|
142
|
+
/* 'len' includes extra trailing ' ' */
|
143
|
+
objPtr->bytes = Tcl_Alloc((unsigned)len);
|
144
|
+
objPtr->length = len-1;
|
145
|
+
strncpy(objPtr->bytes, Tcl_DStringValue(&result), (size_t)len-1);
|
146
|
+
objPtr->bytes[len-1] = '\0';
|
147
|
+
} else {
|
148
|
+
/* empty string */
|
149
|
+
objPtr->length = 0;
|
150
|
+
objPtr->bytes = Tcl_Alloc(1);
|
151
|
+
*objPtr->bytes = '\0';
|
152
|
+
}
|
153
|
+
|
154
|
+
Tcl_DStringFree(&result);
|
155
|
+
}
|
156
|
+
|
157
|
+
Tcl_Obj *Ttk_NewStateSpecObj(unsigned int onbits, unsigned int offbits)
|
158
|
+
{
|
159
|
+
Tcl_Obj *objPtr = Tcl_NewObj();
|
160
|
+
|
161
|
+
Tcl_InvalidateStringRep(objPtr);
|
162
|
+
objPtr->typePtr = &StateSpecObjType;
|
163
|
+
objPtr->internalRep.longValue = (onbits << 16) | offbits;
|
164
|
+
|
165
|
+
return objPtr;
|
166
|
+
}
|
167
|
+
|
168
|
+
int Ttk_GetStateSpecFromObj(
|
169
|
+
Tcl_Interp *interp,
|
170
|
+
Tcl_Obj *objPtr,
|
171
|
+
Ttk_StateSpec *spec)
|
172
|
+
{
|
173
|
+
if (objPtr->typePtr != &StateSpecObjType) {
|
174
|
+
int status = StateSpecSetFromAny(interp, objPtr);
|
175
|
+
if (status != TCL_OK)
|
176
|
+
return status;
|
177
|
+
}
|
178
|
+
|
179
|
+
spec->onbits = (objPtr->internalRep.longValue & 0xFFFF0000) >> 16;
|
180
|
+
spec->offbits = objPtr->internalRep.longValue & 0x0000FFFF;
|
181
|
+
return TCL_OK;
|
182
|
+
}
|
183
|
+
|
184
|
+
|
185
|
+
/*
|
186
|
+
* Tk_StateMapLookup --
|
187
|
+
*
|
188
|
+
* A state map is a paired list of StateSpec / value pairs.
|
189
|
+
* Returns the value corresponding to the first matching state
|
190
|
+
* specification, or NULL if not found or an error occurs.
|
191
|
+
*/
|
192
|
+
Tcl_Obj *Ttk_StateMapLookup(
|
193
|
+
Tcl_Interp *interp, /* Where to leave error messages; may be NULL */
|
194
|
+
Ttk_StateMap map, /* State map */
|
195
|
+
Ttk_State state) /* State to look up */
|
196
|
+
{
|
197
|
+
Tcl_Obj **specs;
|
198
|
+
int nSpecs;
|
199
|
+
int j, status;
|
200
|
+
|
201
|
+
status = Tcl_ListObjGetElements(interp, map, &nSpecs, &specs);
|
202
|
+
if (status != TCL_OK)
|
203
|
+
return NULL;
|
204
|
+
|
205
|
+
for (j = 0; j < nSpecs; j += 2) {
|
206
|
+
Ttk_StateSpec spec;
|
207
|
+
status = Ttk_GetStateSpecFromObj(interp, specs[j], &spec);
|
208
|
+
if (status != TCL_OK)
|
209
|
+
return NULL;
|
210
|
+
if (Ttk_StateMatches(state, &spec))
|
211
|
+
return specs[j+1];
|
212
|
+
}
|
213
|
+
if (interp) {
|
214
|
+
Tcl_ResetResult(interp);
|
215
|
+
Tcl_AppendResult(interp, "No match in state map", NULL);
|
216
|
+
}
|
217
|
+
return NULL;
|
218
|
+
}
|
219
|
+
|
220
|
+
/* Ttk_GetStateMapFromObj --
|
221
|
+
* Returns a Ttk_StateMap from a Tcl_Obj*.
|
222
|
+
* Since a Ttk_StateMap is just a specially-formatted Tcl_Obj,
|
223
|
+
* this basically just checks for errors.
|
224
|
+
*/
|
225
|
+
Ttk_StateMap Ttk_GetStateMapFromObj(
|
226
|
+
Tcl_Interp *interp, /* Where to leave error messages; may be NULL */
|
227
|
+
Tcl_Obj *mapObj) /* State map */
|
228
|
+
{
|
229
|
+
Tcl_Obj **specs;
|
230
|
+
int nSpecs;
|
231
|
+
int j, status;
|
232
|
+
|
233
|
+
status = Tcl_ListObjGetElements(interp, mapObj, &nSpecs, &specs);
|
234
|
+
if (status != TCL_OK)
|
235
|
+
return NULL;
|
236
|
+
|
237
|
+
if (nSpecs % 2 != 0) {
|
238
|
+
if (interp)
|
239
|
+
Tcl_SetResult(interp,
|
240
|
+
"State map must have an even number of elements",
|
241
|
+
TCL_STATIC);
|
242
|
+
return 0;
|
243
|
+
}
|
244
|
+
|
245
|
+
for (j = 0; j < nSpecs; j += 2) {
|
246
|
+
Ttk_StateSpec spec;
|
247
|
+
if (Ttk_GetStateSpecFromObj(interp, specs[j], &spec) != TCL_OK)
|
248
|
+
return NULL;
|
249
|
+
}
|
250
|
+
|
251
|
+
return mapObj;
|
252
|
+
}
|
253
|
+
|
254
|
+
/*
|
255
|
+
* Ttk_StateTableLooup --
|
256
|
+
* Look up an index from a statically allocated state table.
|
257
|
+
*/
|
258
|
+
int Ttk_StateTableLookup(Ttk_StateTable *map, unsigned int state)
|
259
|
+
{
|
260
|
+
while ((state & map->onBits) != map->onBits
|
261
|
+
|| (~state & map->offBits) != map->offBits)
|
262
|
+
{
|
263
|
+
++map;
|
264
|
+
}
|
265
|
+
return map->index;
|
266
|
+
}
|
267
|
+
|
268
|
+
/*EOF*/
|
@@ -0,0 +1,145 @@
|
|
1
|
+
/* trace.c,v 1.4 2005/09/12 03:11:01 jenglish Exp
|
2
|
+
*
|
3
|
+
* Copyright 2003, Joe English
|
4
|
+
*
|
5
|
+
* Simplified interface to Tcl_TraceVariable.
|
6
|
+
*
|
7
|
+
* PROBLEM: Can't distinguish "variable does not exist" (which is OK)
|
8
|
+
* from other errors (which are not).
|
9
|
+
*/
|
10
|
+
|
11
|
+
#include <tk.h>
|
12
|
+
#include "tkTheme.h"
|
13
|
+
#include "widget.h"
|
14
|
+
|
15
|
+
struct TtkTraceHandle_
|
16
|
+
{
|
17
|
+
Tcl_Interp *interp; /* Containing interpreter */
|
18
|
+
Tcl_Obj *varnameObj; /* Name of variable being traced */
|
19
|
+
Ttk_TraceProc callback; /* Callback procedure */
|
20
|
+
void *clientData; /* Data to pass to callback */
|
21
|
+
};
|
22
|
+
|
23
|
+
/*
|
24
|
+
* Tcl_VarTraceProc for trace handles.
|
25
|
+
*/
|
26
|
+
static char *
|
27
|
+
VarTraceProc(
|
28
|
+
ClientData clientData, /* Widget record pointer */
|
29
|
+
Tcl_Interp *interp, /* Interpreter containing variable. */
|
30
|
+
CONST char *name1, /* (unused) */
|
31
|
+
CONST char *name2, /* (unused) */
|
32
|
+
int flags) /* Information about what happened. */
|
33
|
+
{
|
34
|
+
Ttk_TraceHandle *tracePtr = clientData;
|
35
|
+
const char *name, *value;
|
36
|
+
Tcl_Obj *valuePtr;
|
37
|
+
|
38
|
+
if (flags & TCL_INTERP_DESTROYED) {
|
39
|
+
return NULL;
|
40
|
+
}
|
41
|
+
|
42
|
+
name = Tcl_GetString(tracePtr->varnameObj);
|
43
|
+
|
44
|
+
/*
|
45
|
+
* If the variable is being unset, then re-establish the trace:
|
46
|
+
*/
|
47
|
+
if (flags & TCL_TRACE_DESTROYED) {
|
48
|
+
Tcl_TraceVar(interp, name,
|
49
|
+
TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
|
50
|
+
VarTraceProc, clientData);
|
51
|
+
tracePtr->callback(tracePtr->clientData, NULL);
|
52
|
+
return NULL;
|
53
|
+
}
|
54
|
+
|
55
|
+
/*
|
56
|
+
* Call the callback:
|
57
|
+
*/
|
58
|
+
valuePtr = Tcl_GetVar2Ex(interp, name, NULL, TCL_GLOBAL_ONLY);
|
59
|
+
value = valuePtr ? Tcl_GetString(valuePtr) : NULL;
|
60
|
+
tracePtr->callback(tracePtr->clientData, value);
|
61
|
+
|
62
|
+
return NULL;
|
63
|
+
}
|
64
|
+
|
65
|
+
/* Ttk_TraceVariable(interp, varNameObj, callback, clientdata) --
|
66
|
+
* Attach a write trace to the specified variable,
|
67
|
+
* which will pass the variable's value to 'callback'
|
68
|
+
* whenever the variable is set.
|
69
|
+
*
|
70
|
+
* When the variable is unset, passes NULL to the callback
|
71
|
+
* and reattaches the trace.
|
72
|
+
*/
|
73
|
+
Ttk_TraceHandle *Ttk_TraceVariable(
|
74
|
+
Tcl_Interp *interp,
|
75
|
+
Tcl_Obj *varnameObj,
|
76
|
+
Ttk_TraceProc callback,
|
77
|
+
void *clientData)
|
78
|
+
{
|
79
|
+
Ttk_TraceHandle *h = (Ttk_TraceHandle*)ckalloc(sizeof(*h));
|
80
|
+
int status;
|
81
|
+
|
82
|
+
h->interp = interp;
|
83
|
+
h->varnameObj = Tcl_DuplicateObj(varnameObj);
|
84
|
+
Tcl_IncrRefCount(h->varnameObj);
|
85
|
+
h->clientData = clientData;
|
86
|
+
h->callback = callback;
|
87
|
+
|
88
|
+
status = Tcl_TraceVar(interp, Tcl_GetString(varnameObj),
|
89
|
+
TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
|
90
|
+
VarTraceProc, (ClientData)h);
|
91
|
+
|
92
|
+
if (status != TCL_OK) {
|
93
|
+
Tcl_DecrRefCount(h->varnameObj);
|
94
|
+
ckfree((ClientData)h);
|
95
|
+
return NULL;
|
96
|
+
}
|
97
|
+
|
98
|
+
return h;
|
99
|
+
}
|
100
|
+
|
101
|
+
/*
|
102
|
+
* Ttk_UntraceVariable --
|
103
|
+
* Remove previously-registered trace and free the handle.
|
104
|
+
*/
|
105
|
+
void Ttk_UntraceVariable(Ttk_TraceHandle *h)
|
106
|
+
{
|
107
|
+
if (h) {
|
108
|
+
Tcl_UntraceVar(h->interp, Tcl_GetString(h->varnameObj),
|
109
|
+
TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
|
110
|
+
VarTraceProc, (ClientData)h);
|
111
|
+
Tcl_DecrRefCount(h->varnameObj);
|
112
|
+
ckfree((ClientData)h);
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
/*
|
117
|
+
* Ttk_FireTrace --
|
118
|
+
* Executes a trace handle as if the variable has been written.
|
119
|
+
*
|
120
|
+
* Note: may reenter the interpreter.
|
121
|
+
*/
|
122
|
+
int Ttk_FireTrace(Ttk_TraceHandle *tracePtr)
|
123
|
+
{
|
124
|
+
Tcl_Interp *interp = tracePtr->interp;
|
125
|
+
void *clientData = tracePtr->clientData;
|
126
|
+
const char *name = Tcl_GetString(tracePtr->varnameObj);
|
127
|
+
Ttk_TraceProc callback = tracePtr->callback;
|
128
|
+
Tcl_Obj *valuePtr;
|
129
|
+
const char *value;
|
130
|
+
|
131
|
+
/* Read the variable.
|
132
|
+
* Note that this can reenter the interpreter, and anything can happen --
|
133
|
+
* including the current trace handle being freed!
|
134
|
+
*/
|
135
|
+
valuePtr = Tcl_GetVar2Ex(interp, name, NULL, TCL_GLOBAL_ONLY);
|
136
|
+
value = valuePtr ? Tcl_GetString(valuePtr) : NULL;
|
137
|
+
|
138
|
+
/* Call callback.
|
139
|
+
*/
|
140
|
+
callback(clientData, value);
|
141
|
+
|
142
|
+
return TCL_OK;
|
143
|
+
}
|
144
|
+
|
145
|
+
/*EOF*/
|
@@ -0,0 +1,174 @@
|
|
1
|
+
/* track.c,v 1.9 2007/10/22 03:13:34 jenglish Exp
|
2
|
+
* Copyright (c) 2004, Joe English
|
3
|
+
*
|
4
|
+
* TtkTrackElementState() -- helper routine for widgets
|
5
|
+
* like scrollbars in which individual elements may
|
6
|
+
* be active or pressed instead of the widget as a whole.
|
7
|
+
*
|
8
|
+
* Usage:
|
9
|
+
* TtkTrackElementState(&recordPtr->core);
|
10
|
+
*
|
11
|
+
* Registers an event handler on the widget that tracks pointer
|
12
|
+
* events and updates the state of the element under the
|
13
|
+
* mouse cursor.
|
14
|
+
*
|
15
|
+
* The "active" element is the one under the mouse cursor,
|
16
|
+
* and is normally set to the ACTIVE state unless another element
|
17
|
+
* is currently being pressed.
|
18
|
+
*
|
19
|
+
* The active element becomes "pressed" on <ButtonPress> events,
|
20
|
+
* and remains "active" and "pressed" until the corresponding
|
21
|
+
* <ButtonRelease> event.
|
22
|
+
*
|
23
|
+
* TODO: Handle "chords" properly (e.g., <B1-ButtonPress-2>)
|
24
|
+
*/
|
25
|
+
|
26
|
+
#include <tk.h>
|
27
|
+
#include "tkTheme.h"
|
28
|
+
#include "widget.h"
|
29
|
+
|
30
|
+
typedef struct
|
31
|
+
{
|
32
|
+
WidgetCore *corePtr; /* Widget to track */
|
33
|
+
Ttk_LayoutNode *activeElement; /* element under the mouse cursor */
|
34
|
+
Ttk_LayoutNode *pressedElement; /* currently pressed element */
|
35
|
+
} ElementStateTracker;
|
36
|
+
|
37
|
+
/*
|
38
|
+
* ActivateElement(es, node) --
|
39
|
+
* Make 'node' the active element if non-NULL.
|
40
|
+
* Deactivates the currently active element if different.
|
41
|
+
*
|
42
|
+
* The active element has TTK_STATE_ACTIVE set _unless_
|
43
|
+
* another element is 'pressed'
|
44
|
+
*/
|
45
|
+
static void ActivateElement(ElementStateTracker *es, Ttk_LayoutNode *node)
|
46
|
+
{
|
47
|
+
if (es->activeElement == node) {
|
48
|
+
/* No change */
|
49
|
+
return;
|
50
|
+
}
|
51
|
+
|
52
|
+
if (!es->pressedElement) {
|
53
|
+
if (es->activeElement) {
|
54
|
+
/* Deactivate old element */
|
55
|
+
Ttk_ChangeElementState(es->activeElement, 0,TTK_STATE_ACTIVE);
|
56
|
+
}
|
57
|
+
if (node) {
|
58
|
+
/* Activate new element */
|
59
|
+
Ttk_ChangeElementState(node, TTK_STATE_ACTIVE,0);
|
60
|
+
}
|
61
|
+
TtkRedisplayWidget(es->corePtr);
|
62
|
+
}
|
63
|
+
|
64
|
+
es->activeElement = node;
|
65
|
+
}
|
66
|
+
|
67
|
+
/* ReleaseElement --
|
68
|
+
* Releases the currently pressed element, if any.
|
69
|
+
*/
|
70
|
+
static void ReleaseElement(ElementStateTracker *es)
|
71
|
+
{
|
72
|
+
if (!es->pressedElement)
|
73
|
+
return;
|
74
|
+
|
75
|
+
Ttk_ChangeElementState(
|
76
|
+
es->pressedElement, 0,TTK_STATE_PRESSED|TTK_STATE_ACTIVE);
|
77
|
+
es->pressedElement = 0;
|
78
|
+
|
79
|
+
/* Reactivate element under the mouse cursor:
|
80
|
+
*/
|
81
|
+
if (es->activeElement)
|
82
|
+
Ttk_ChangeElementState(es->activeElement, TTK_STATE_ACTIVE,0);
|
83
|
+
|
84
|
+
TtkRedisplayWidget(es->corePtr);
|
85
|
+
}
|
86
|
+
|
87
|
+
/* PressElement --
|
88
|
+
* Presses the specified element.
|
89
|
+
*/
|
90
|
+
static void PressElement(ElementStateTracker *es, Ttk_LayoutNode *node)
|
91
|
+
{
|
92
|
+
if (es->pressedElement) {
|
93
|
+
ReleaseElement(es);
|
94
|
+
}
|
95
|
+
|
96
|
+
if (node) {
|
97
|
+
Ttk_ChangeElementState(
|
98
|
+
node, TTK_STATE_PRESSED|TTK_STATE_ACTIVE, 0);
|
99
|
+
}
|
100
|
+
|
101
|
+
es->pressedElement = node;
|
102
|
+
TtkRedisplayWidget(es->corePtr);
|
103
|
+
}
|
104
|
+
|
105
|
+
/* ElementStateEventProc --
|
106
|
+
* Event handler for tracking element states.
|
107
|
+
*/
|
108
|
+
|
109
|
+
static const unsigned ElementStateMask =
|
110
|
+
ButtonPressMask
|
111
|
+
| ButtonReleaseMask
|
112
|
+
| PointerMotionMask
|
113
|
+
| LeaveWindowMask
|
114
|
+
| EnterWindowMask
|
115
|
+
| StructureNotifyMask
|
116
|
+
;
|
117
|
+
|
118
|
+
static void
|
119
|
+
ElementStateEventProc(ClientData clientData, XEvent *ev)
|
120
|
+
{
|
121
|
+
ElementStateTracker *es = (ElementStateTracker *)clientData;
|
122
|
+
Ttk_LayoutNode *node;
|
123
|
+
|
124
|
+
switch (ev->type)
|
125
|
+
{
|
126
|
+
case MotionNotify :
|
127
|
+
node = Ttk_LayoutIdentify(
|
128
|
+
es->corePtr->layout,ev->xmotion.x,ev->xmotion.y);
|
129
|
+
ActivateElement(es, node);
|
130
|
+
break;
|
131
|
+
case LeaveNotify:
|
132
|
+
ActivateElement(es, 0);
|
133
|
+
if (ev->xcrossing.mode == NotifyGrab)
|
134
|
+
PressElement(es, 0);
|
135
|
+
break;
|
136
|
+
case EnterNotify:
|
137
|
+
node = Ttk_LayoutIdentify(
|
138
|
+
es->corePtr->layout,ev->xcrossing.x,ev->xcrossing.y);
|
139
|
+
ActivateElement(es, node);
|
140
|
+
break;
|
141
|
+
case ButtonPress:
|
142
|
+
node = Ttk_LayoutIdentify(
|
143
|
+
es->corePtr->layout, ev->xbutton.x, ev->xbutton.y);
|
144
|
+
if (node)
|
145
|
+
PressElement(es, node);
|
146
|
+
break;
|
147
|
+
case ButtonRelease:
|
148
|
+
ReleaseElement(es);
|
149
|
+
break;
|
150
|
+
case DestroyNotify:
|
151
|
+
/* Unregister this event handler and free client data.
|
152
|
+
*/
|
153
|
+
Tk_DeleteEventHandler(es->corePtr->tkwin,
|
154
|
+
ElementStateMask, ElementStateEventProc, es);
|
155
|
+
ckfree(clientData);
|
156
|
+
break;
|
157
|
+
}
|
158
|
+
}
|
159
|
+
|
160
|
+
/*
|
161
|
+
* TtkTrackElementState --
|
162
|
+
* Register an event handler to manage the 'pressed'
|
163
|
+
* and 'active' states of individual widget elements.
|
164
|
+
*/
|
165
|
+
|
166
|
+
void TtkTrackElementState(WidgetCore *corePtr)
|
167
|
+
{
|
168
|
+
ElementStateTracker *es = (ElementStateTracker*)ckalloc(sizeof(*es));
|
169
|
+
es->corePtr = corePtr;
|
170
|
+
es->activeElement = es->pressedElement = 0;
|
171
|
+
Tk_CreateEventHandler(corePtr->tkwin,
|
172
|
+
ElementStateMask,ElementStateEventProc,es);
|
173
|
+
}
|
174
|
+
|