From 0a431c440c9fcd7ad76346915857845ad0726df5 Mon Sep 17 00:00:00 2001 From: treectrl Date: Thu, 2 Jan 2003 02:24:08 +0000 Subject: Big padx and pady patch. --- demo.tcl | 22 +- demos/bitmaps.tcl | 6 +- demos/explorer.tcl | 18 +- demos/help.tcl | 24 +- demos/imovie.tcl | 10 +- demos/layout.tcl | 24 +- demos/mailwasher.tcl | 18 +- demos/outlook-folders.tcl | 16 +- demos/outlook-newgroup.tcl | 28 +-- demos/random.tcl | 16 +- demos/www-options.tcl | 8 +- doc/treectrl.n | 79 +++--- generic/tkTreeColumn.c | 135 +++++----- generic/tkTreeCtrl.c | 26 +- generic/tkTreeCtrl.h | 15 +- generic/tkTreeStyle.c | 616 ++++++++++++++++++++++++--------------------- generic/tkTreeUtils.c | 263 +++++++++++++++++++ tests/column.test | 76 ++++-- tests/style.test | 49 ++-- 19 files changed, 899 insertions(+), 550 deletions(-) diff --git a/demo.tcl b/demo.tcl index 9521980..2885745 100644 --- a/demo.tcl +++ b/demo.tcl @@ -474,7 +474,7 @@ proc InitDemoList {} { $t style create s1 $t style elements s1 {e2 e1} # Tk listbox has linespace + 1 height - $t style layout s1 e2 -union [list e1] -ipadw 2 -ipade 2 -ipads 1 -iexpand e + $t style layout s1 e2 -union [list e1] -ipadx 2 -ipady {0 1} -iexpand e # "Picture Catalog" DemoPictureCatalog # "Picture Catalog 2" DemoPictureCatalog2 @@ -547,12 +547,12 @@ proc DisplayStylesInList {} { $t style create s1 $t style elements s1 {e3 e1} - $t style layout s1 e3 -union [list e1] -ipadw 1 -ipade 1 -ipadn 0 -ipads 1 + $t style layout s1 e3 -union [list e1] -ipadx 1 -ipady {0 1} $t style create s2 $t style elements s2 {e3 e1 e2} - $t style layout s2 e1 -pade 4 - $t style layout s2 e3 -union [list e1 e2] -ipade 1 -ipadw 1 -ipadn 0 -ipads 1 + $t style layout s2 e1 -padx {0 4} + $t style layout s2 e3 -union [list e1 e2] -ipadx 1 -ipady {0 1} } # Clear the list @@ -631,12 +631,12 @@ proc DisplayStylesInItem {item} { $t style create s1 $t style elements s1 {e3 e1} - $t style layout s1 e3 -union [list e1] -ipade 1 -ipadw 2 -ipadn 0 -ipads 1 + $t style layout s1 e3 -union [list e1] -ipadx {1 2} -ipady {0 1} $t style create s2 $t style elements s2 {e3 e1 e2} - $t style layout s2 e1 -pade 4 - $t style layout s2 e3 -union [list e1 e2] -ipadw 1 -ipade 1 -ipadn 0 -ipads 1 + $t style layout s2 e1 -padx {0 4} + $t style layout s2 e3 -union [list e1 e2] -ipadx 1 -ipady {0 1} } # Clear the list @@ -775,9 +775,9 @@ proc DemoPictureCatalog {} { set S [$T style create STYLE -orient vertical] $T style elements $S {elemSelImg elemImg elemSelTxt elemTxt} - $T style layout $S elemSelImg -union elemImg -ipadn 6 -ipads 6 -ipadw 6 -ipade 6 + $T style layout $S elemSelImg -union elemImg -ipadx 6 -ipady 6 $T style layout $S elemSelTxt -union elemTxt - $T style layout $S elemImg -pads 6 + $T style layout $S elemImg -pady {0 6} for {set i 1} {$i <= 10} {incr i} { set I [$T item create] @@ -810,9 +810,9 @@ proc DemoPictureCatalog2 {} { set S [$T style create STYLE -orient vertical] $T style elements $S {elemSelImg elemImg elemSelTxt elemTxt} $T style layout $S elemSelImg -union elemImg \ - -ipadn 6 -ipads 6 -ipadw 6 -ipade 6 + -ipadx 6 -ipady 6 $T style layout $S elemSelTxt -union elemTxt - $T style layout $S elemImg -pads 6 + $T style layout $S elemImg -pady {0 6} $T style layout $S elemImg -expand n $T style layout $S elemTxt -expand s diff --git a/demos/bitmaps.tcl b/demos/bitmaps.tcl index 36917af..9df6d8d 100644 --- a/demos/bitmaps.tcl +++ b/demos/bitmaps.tcl @@ -24,9 +24,9 @@ proc DemoBitmaps {} { set S [$T style create STYLE -orient vertical] $T style elements $S {elemSelBmp elemBmp elemSelTxt elemTxt} $T style layout $S elemSelBmp -union elemBmp \ - -ipadn 6 -ipads 6 -ipadw 6 -ipade 6 - $T style layout $S elemBmp -pads 6 -expand we - $T style layout $S elemSelTxt -union elemTxt -ipadw 2 -ipade 2 + -ipadx 6 -ipady 6 + $T style layout $S elemBmp -pady {0 6} -expand we + $T style layout $S elemSelTxt -union elemTxt -ipadx 2 $T style layout $S elemTxt -expand we set bitmapNames [list error gray75 gray50 gray25 gray12 hourglass info \ diff --git a/demos/explorer.tcl b/demos/explorer.tcl index 1b966e2..eefd7a8 100644 --- a/demos/explorer.tcl +++ b/demos/explorer.tcl @@ -59,7 +59,7 @@ proc DemoExplorerDetails {} { InitPics small-* $T column configure 0 -text Name -tag name -width 200 \ - -arrow up -arrowpadw 6 -arrowpade 6 + -arrow up -arrowpad 6 $T column configure 1 -text Size -tag size -justify right -width 60 \ -arrowside left -arrowgravity right $T column configure 2 -text Type -tag type -width 120 @@ -77,23 +77,23 @@ proc DemoExplorerDetails {} { set S [$T style create styName -orient horizontal] $T style elements $S {e4 e1 e2} $T style layout $S e1 -expand ns - $T style layout $S e2 -padw 2 -squeeze x -expand ns - $T style layout $S e4 -union [list e2] -iexpand ns -ipadw 2 -ipade 2 + $T style layout $S e2 -padx {2 0} -squeeze x -expand ns + $T style layout $S e4 -union [list e2] -iexpand ns -ipadx 2 # column 1: text set S [$T style create stySize] $T style elements $S txtSize - $T style layout $S txtSize -padw 6 -pade 6 -squeeze x -expand ns + $T style layout $S txtSize -padx 6 -squeeze x -expand ns # column 2: text set S [$T style create styType] $T style elements $S txtType - $T style layout $S txtType -padw 6 -pade 6 -squeeze x -expand ns + $T style layout $S txtType -padx 6 -squeeze x -expand ns # column 3: text set S [$T style create styDate] $T style elements $S txtDate - $T style layout $S txtDate -padw 6 -pade 6 -squeeze x -expand ns + $T style layout $S txtDate -padx 6 -squeeze x -expand ns set ::TreeCtrl::Priv(edit,$T) {e2} set ::TreeCtrl::Priv(sensitive,$T) { @@ -230,7 +230,7 @@ proc DemoExplorerLargeIcons {} { set S [$T style create STYLE -orient vertical] $T style elements $S {elemSel elemImg elemTxt} $T style layout $S elemImg -expand we - $T style layout $S elemTxt -padn 4 -padw 2 -pade 2 -squeeze x -expand we + $T style layout $S elemTxt -pady {4 0} -padx 2 -squeeze x -expand we $T style layout $S elemSel -union [list elemTxt] set ::TreeCtrl::Priv(edit,$T) {elemTxt} @@ -321,8 +321,8 @@ proc DemoExplorerList {} { set S [$T style create STYLE] $T style elements $S {elemSel elemImg elemTxt} $T style layout $S elemImg -expand ns - $T style layout $S elemTxt -squeeze x -expand ns -padw 2 - $T style layout $S elemSel -union [list elemTxt] -iexpand ns -ipadw 2 -ipade 2 + $T style layout $S elemTxt -squeeze x -expand ns -padx {2 0} + $T style layout $S elemSel -union [list elemTxt] -iexpand ns -ipadx 2 set ::TreeCtrl::Priv(edit,$T) {elemTxt} set ::TreeCtrl::Priv(sensitive,$T) { diff --git a/demos/help.tcl b/demos/help.tcl index 5fc067f..b8a8d04 100644 --- a/demos/help.tcl +++ b/demos/help.tcl @@ -28,16 +28,16 @@ proc DemoHelpContents {} { # book set S [$T style create s1] $T style elements $S {e4 e1 e3} - $T style layout $S e1 -pade 4 -expand ns + $T style layout $S e1 -padx {0 4} -expand ns $T style layout $S e3 -expand ns - $T style layout $S e4 -union [list e3] -iexpand ns -ipadw 2 -ipade 2 + $T style layout $S e4 -union [list e3] -iexpand ns -ipadx 2 # page set S [$T style create s2] $T style elements $S {e4 e2 e3} - $T style layout $S e2 -pade 4 -expand ns + $T style layout $S e2 -padx {0 4} -expand ns $T style layout $S e3 -expand ns - $T style layout $S e4 -union [list e3] -iexpand ns -ipadw 2 -ipade 2 + $T style layout $S e4 -union [list e3] -iexpand ns -ipadx 2 set parentList [list root {} {} {} {} {} {}] set parent root @@ -138,30 +138,30 @@ proc DemoHelpContents2 {} { # book set S [$T style create s1] $T style elements $S {e4 e1 e3} - $T style layout $S e1 -pade 4 -expand ns + $T style layout $S e1 -padx {0 4} -expand ns $T style layout $S e3 -expand ns - $T style layout $S e4 -union [list e3] -iexpand ns -ipadw 2 -ipade 2 + $T style layout $S e4 -union [list e3] -iexpand ns -ipadx 2 # page set S [$T style create s2] $T style elements $S {e4 e2 e3} - $T style layout $S e2 -pade 4 -expand ns + $T style layout $S e2 -padx {0 4} -expand ns $T style layout $S e3 -expand ns - $T style layout $S e4 -union [list e3] -iexpand ns -ipadw 2 -ipade 2 + $T style layout $S e4 -union [list e3] -iexpand ns -ipadx 2 # book (focus) set S [$T style create s1.f] $T style elements $S {e4 e1 e5} - $T style layout $S e1 -pade 4 -expand ns + $T style layout $S e1 -padx {0 4} -expand ns $T style layout $S e5 -expand ns - $T style layout $S e4 -union [list e5] -iexpand ns -ipadw 1 -ipade 2 + $T style layout $S e4 -union [list e5] -iexpand ns -ipadx {1 2} # page (focus) set S [$T style create s2.f] $T style elements $S {e4 e2 e5} - $T style layout $S e2 -pade 4 -expand ns + $T style layout $S e2 -padx {0 4} -expand ns $T style layout $S e5 -expand ns - $T style layout $S e4 -union [list e5] -iexpand ns -ipadw 1 -ipade 2 + $T style layout $S e4 -union [list e5] -iexpand ns -ipadx {1 2} set parentList [list root {} {} {} {} {} {}] set parent root diff --git a/demos/imovie.tcl b/demos/imovie.tcl index 4e327e2..0c99312 100644 --- a/demos/imovie.tcl +++ b/demos/imovie.tcl @@ -36,12 +36,12 @@ proc DemoIMovie {} { set S [$T style create STYLE -orient vertical] $T style elements $S {elemShadow elemRect elemTime elemImg elemName} - $T style layout $S elemShadow -detach yes -pade 2 -pads 2 -padn 1 -padw 1 -iexpand es - $T style layout $S elemTime -padw 2 - $T style layout $S elemImg -pads 1 - $T style layout $S elemName -expand we -ipads 2 -pade 3 -squeeze x + $T style layout $S elemShadow -detach yes -padx {1 2} -pady {1 2} -iexpand es + $T style layout $S elemTime -padx {2 0} + $T style layout $S elemImg -pady {0 1} + $T style layout $S elemName -expand we -ipady {0 2} -padx {0 3} -squeeze x $T style layout $S elemRect -union {elemTime elemImg elemName} \ - -ipadw 6 -ipade 6 -pade 3 -pads 3 + -ipadx 6 -padx {0 3} -pady {0 3} for {set i 0} {$i < 5} {incr i} { foreach {time name image} { diff --git a/demos/layout.tcl b/demos/layout.tcl index 8d8b13a..f36da74 100644 --- a/demos/layout.tcl +++ b/demos/layout.tcl @@ -23,13 +23,13 @@ proc DemoLayout {} { set S [$T style create s1] $T style elements $S {e4 e3 e1 e2 e5 e6 e7} - $T style layout $S e1 -padw 28 -pade 4 -padn 4 -pads 4 - $T style layout $S e2 -expand es -pade 38 - $T style layout $S e3 -union [list e1 e2] -ipadw 4 -ipade 4 -ipadn 4 -ipads 4 -padn 2 -pads 2 + $T style layout $S e1 -padx {28 4} -pady 4 + $T style layout $S e2 -expand es -padx {0 38} + $T style layout $S e3 -union [list e1 e2] -ipadx 4 -ipady 4 -pady 2 $T style layout $S e4 -detach yes -iexpand es - $T style layout $S e5 -detach yes -padw 2 -padn 2 -pads 2 -iexpand s - $T style layout $S e6 -detach yes -expand ws -pade 2 -padn 2 - $T style layout $S e7 -detach yes -expand wn -pade 2 -pads 2 + $T style layout $S e5 -detach yes -padx {2 0} -pady 2 -iexpand s + $T style layout $S e6 -detach yes -expand ws -padx {0 2} -pady {2 0} + $T style layout $S e7 -detach yes -expand wn -padx {0 2} -pady {0 2} set I [$T item create] $T item hasbutton $I yes @@ -46,8 +46,8 @@ proc DemoLayout {} { set S [$T style create s2] $T style elements $S {e4 e3 e1} - $T style layout $S e1 -padw 8 -pade 8 -padn 8 -pads 8 -iexpand e - $T style layout $S e3 -union e1 -ipadw 20 -ipade 4 -ipadn 4 -ipads 12 + $T style layout $S e1 -padx 8 -pady 8 -iexpand e + $T style layout $S e3 -union e1 -ipadx {20 4} -ipady {4 12} $T style layout $S e4 -detach yes -iexpand es set I [$T item create] @@ -64,9 +64,9 @@ proc DemoLayout {} { set S [$T style create s3] $T style elements $S {e4 e3 e1 e5 e6} - $T style layout $S e4 -union {e1 e6} -ipadw 8 -ipadn 8 -ipade 8 - $T style layout $S e3 -union {e1 e5} -ipadw 4 -ipadn 4 -ipade 4 -ipads 4 - $T style layout $S e5 -ipads 20 + $T style layout $S e4 -union {e1 e6} -ipadx 8 -ipady {8 0} + $T style layout $S e3 -union {e1 e5} -ipadx 4 -ipady 4 + $T style layout $S e5 -ipady {0 20} set I [$T item create] $T item hasbutton $I yes @@ -88,7 +88,7 @@ proc DemoLayout {} { set S [$T style create s4] $T style elements $S {eb et} - $T style layout $S eb -union et -ipadw 2 -ipadn 2 -ipade 2 -ipads 2 + $T style layout $S eb -union et -ipadx 2 -ipady 2 $T style layout $S et -squeeze x set I [$T item create] diff --git a/demos/mailwasher.tcl b/demos/mailwasher.tcl index d97dcbb..33e856f 100644 --- a/demos/mailwasher.tcl +++ b/demos/mailwasher.tcl @@ -16,14 +16,14 @@ proc DemoMailWasher {} { -xscrollincrement 1 set pad 4 - $T column configure 0 -text Delete -textpadw $pad -textpade $pad -tag delete - $T column configure 1 -text Bounce -textpadw $pad -textpade $pad -tag bounce - $T column configure 2 -text Status -width 80 -textpadw $pad -textpade $pad -tag status - $T column configure 3 -text Size -width 40 -textpadw $pad -textpade $pad -justify right -tag size - $T column configure 4 -text From -width 140 -textpadw $pad -textpade $pad -tag from - $T column configure 5 -text Subject -width 240 -textpadw $pad -textpade $pad -tag subject - $T column configure 6 -text Received -textpadw $pad -textpade $pad -arrow up -arrowpadw 4 -tag received - $T column configure 7 -text Attachments -textpadw $pad -textpade $pad -tag attachments + $T column configure 0 -text Delete -textpadx $pad -tag delete + $T column configure 1 -text Bounce -textpadx $pad -tag bounce + $T column configure 2 -text Status -width 80 -textpadx $pad -tag status + $T column configure 3 -text Size -width 40 -textpadx $pad -justify right -tag size + $T column configure 4 -text From -width 140 -textpadx $pad -tag from + $T column configure 5 -text Subject -width 240 -textpadx $pad -tag subject + $T column configure 6 -text Received -textpadx $pad -arrow up -arrowpad {4 0} -tag received + $T column configure 7 -text Attachments -textpadx $pad -tag attachments $T element create border rect -open nw -outline gray -outlinewidth 1 \ -fill [list $::SystemHighlight {selected}] @@ -57,7 +57,7 @@ proc DemoMailWasher {} { set S [$T style create sty$name] $T style elements $S [list border txt$name] $T style layout $S border -detach yes -iexpand es - $T style layout $S txt$name -padw $pad -pade $pad -squeeze x -expand ns + $T style layout $S txt$name -padx $pad -squeeze x -expand ns } for {set i 0} {$i < 1} {incr i} { foreach {from subject} { diff --git a/demos/outlook-folders.tcl b/demos/outlook-folders.tcl index 4eac92f..d503721 100644 --- a/demos/outlook-folders.tcl +++ b/demos/outlook-folders.tcl @@ -30,31 +30,31 @@ proc DemoOutlookFolders {} { set S [$T style create s1] $T style elements $S {e6 e1 e2} $T style layout $S e1 -expand ns - $T style layout $S e2 -padw 4 -expand ns -squeeze x - $T style layout $S e6 -union [list e2] -iexpand ns -ipadw 2 -ipade 2 + $T style layout $S e2 -padx {4 0} -expand ns -squeeze x + $T style layout $S e6 -union [list e2] -iexpand ns -ipadx 2 # image + text + text set S [$T style create s2] $T style elements $S {e6 e1 e3 e4} $T style layout $S e1 -expand ns - $T style layout $S e3 -padw 4 -pade 4 -expand ns -squeeze x + $T style layout $S e3 -padx 4 -expand ns -squeeze x $T style layout $S e4 -expand ns - $T style layout $S e6 -union [list e3] -iexpand ns -ipadw 2 -ipade 2 + $T style layout $S e6 -union [list e3] -iexpand ns -ipadx 2 # folder + text set S [$T style create s3] $T style elements $S {e6 e5 e2} $T style layout $S e5 -expand ns - $T style layout $S e2 -padw 4 -expand ns -squeeze x - $T style layout $S e6 -union [list e2] -iexpand ns -ipadw 2 -ipade 2 + $T style layout $S e2 -padx {4 0} -expand ns -squeeze x + $T style layout $S e6 -union [list e2] -iexpand ns -ipadx 2 # folder + text + text set S [$T style create s4] $T style elements $S {e6 e5 e3 e4} $T style layout $S e5 -expand ns - $T style layout $S e3 -padw 4 -pade 4 -expand ns -squeeze x + $T style layout $S e3 -padx 4 -expand ns -squeeze x $T style layout $S e4 -expand ns - $T style layout $S e6 -union [list e3] -iexpand ns -ipadw 2 -ipade 2 + $T style layout $S e6 -union [list e3] -iexpand ns -ipadx 2 $T item style set root 0 s1 $T item complex root [list [list e1 -image outlook-main] [list e2 -text "Outlook Express"]] diff --git a/demos/outlook-newgroup.tcl b/demos/outlook-newgroup.tcl index 217d2ec..c8fb224 100644 --- a/demos/outlook-newgroup.tcl +++ b/demos/outlook-newgroup.tcl @@ -51,19 +51,19 @@ proc DemoOutlookNewsgroup {} { set S [$T style create s1] $T style elements $S {sel.e elemImg elemTxt} $T style layout $S elemImg -expand ns - $T style layout $S elemTxt -padw 2 -pade 6 -squeeze x -expand ns - $T style layout $S sel.e -union [list elemTxt] -iexpand nes -ipadw 2 + $T style layout $S elemTxt -padx {2 6} -squeeze x -expand ns + $T style layout $S sel.e -union [list elemTxt] -iexpand nes -ipadx {2 0} # Text set S [$T style create s2.we] $T style elements $S {sel.we elemTxt} - $T style layout $S elemTxt -padw 6 -pade 6 -squeeze x -expand ns + $T style layout $S elemTxt -padx 6 -squeeze x -expand ns $T style layout $S sel.we -detach yes -iexpand es # Text set S [$T style create s2.w] $T style elements $S {sel.w elemTxt} - $T style layout $S elemTxt -padw 6 -pade 6 -squeeze x -expand ns + $T style layout $S elemTxt -padx 6 -squeeze x -expand ns $T style layout $S sel.w -detach yes -iexpand es set msgCnt 100 @@ -210,45 +210,45 @@ proc DemoOutlookNewsgroup2 {} { set S [$T style create unread] $T style elements $S {sel.e image.unread text.unread} $T style layout $S image.unread -expand ns - $T style layout $S text.unread -padw 2 -pade 6 -squeeze x -expand ns - $T style layout $S sel.e -union [list text.unread] -iexpand nes -ipadw 2 + $T style layout $S text.unread -padx {2 6} -squeeze x -expand ns + $T style layout $S sel.e -union [list text.unread] -iexpand nes -ipadx {2 0} # Image + text set S [$T style create read] $T style elements $S {sel.e image.read text.read} $T style layout $S image.read -expand ns - $T style layout $S text.read -padw 2 -pade 6 -squeeze x -expand ns - $T style layout $S sel.e -union [list text.read] -iexpand nes -ipadw 2 + $T style layout $S text.read -padx {2 6} -squeeze x -expand ns + $T style layout $S sel.e -union [list text.read] -iexpand nes -ipadx {2 0} # Image + text set S [$T style create read2] $T style elements $S {sel.e image.read2 text.unread} $T style layout $S image.read2 -expand ns - $T style layout $S text.unread -padw 2 -pade 6 -squeeze x -expand ns - $T style layout $S sel.e -union [list text.unread] -iexpand nes -ipadw 2 + $T style layout $S text.unread -padx {2 6} -squeeze x -expand ns + $T style layout $S sel.e -union [list text.unread] -iexpand nes -ipadx {2 0} # Text set S [$T style create unread.we] $T style elements $S {sel.we text.unread} - $T style layout $S text.unread -padw 6 -pade 6 -squeeze x -expand ns + $T style layout $S text.unread -padx 6 -squeeze x -expand ns $T style layout $S sel.we -detach yes -iexpand es # Text set S [$T style create read.we] $T style elements $S {sel.we text.read} - $T style layout $S text.read -padw 6 -pade 6 -squeeze x -expand ns + $T style layout $S text.read -padx 6 -squeeze x -expand ns $T style layout $S sel.we -detach yes -iexpand es # Text set S [$T style create unread.w] $T style elements $S {sel.w text.unread} - $T style layout $S text.unread -padw 6 -pade 6 -squeeze x -expand ns + $T style layout $S text.unread -padx 6 -squeeze x -expand ns $T style layout $S sel.w -detach yes -iexpand es # Text set S [$T style create read.w] $T style elements $S {sel.w text.read} - $T style layout $S text.read -padw 6 -pade 6 -squeeze x -expand ns + $T style layout $S text.read -padx 6 -squeeze x -expand ns $T style layout $S sel.w -detach yes -iexpand es set msgCnt 100 diff --git a/demos/random.tcl b/demos/random.tcl index 2d817b0..83b7d0c 100644 --- a/demos/random.tcl +++ b/demos/random.tcl @@ -32,20 +32,20 @@ proc DemoRandom {} { $T style create s1 $T style elements s1 {e5 e1 e3 e4} - $T style layout s1 e1 -pade 4 -expand ns - $T style layout s1 e3 -pade 4 -expand ns - $T style layout s1 e4 -pade 6 -expand ns - $T style layout s1 e5 -union [list e3] -iexpand ns -ipadw 2 -ipade 2 + $T style layout s1 e1 -padx {0 4} -expand ns + $T style layout s1 e3 -padx {0 4} -expand ns + $T style layout s1 e4 -padx {0 6} -expand ns + $T style layout s1 e5 -union [list e3] -iexpand ns -ipadx 2 $T style create s2 $T style elements s2 {e5 e2 e3} - $T style layout s2 e2 -pade 4 -expand ns - $T style layout s2 e3 -pade 6 -expand ns - $T style layout s2 e5 -union [list e3] -iexpand ns -ipadw 2 -ipade 2 + $T style layout s2 e2 -padx {0 4} -expand ns + $T style layout s2 e3 -padx {0 4} -expand ns + $T style layout s2 e5 -union [list e3] -iexpand ns -ipadx 2 $T style create s3 $T style elements s3 {e6} - $T style layout s3 e6 -padw 6 -pade 6 -expand ns + $T style layout s3 e6 -padx 6 -expand ns set ::TreeCtrl::Priv(sensitive,$T) { {item s1 e5 e1 e3} diff --git a/demos/www-options.tcl b/demos/www-options.tcl index c96ec97..ea9ee12 100644 --- a/demos/www-options.tcl +++ b/demos/www-options.tcl @@ -28,9 +28,9 @@ proc DemoInternetOptions {} { set S [$T style create s1] $T style elements $S {e3 e1 e2} - $T style layout $S e1 -pade 4 -expand ns + $T style layout $S e1 -padx {0 4} -expand ns $T style layout $S e2 -expand ns - $T style layout $S e3 -union [list e2] -iexpand ns -ipadw 2 -ipade 2 + $T style layout $S e3 -union [list e2] -iexpand ns -ipadx 2 set parentList [list root {} {} {} {} {} {}] set parent root @@ -158,9 +158,9 @@ proc DemoInternetOptions_2 {} { set S [$T style create s1] $T style elements $S {e3 e1 e2} - $T style layout $S e1 -pade 4 -expand ns + $T style layout $S e1 -padx {0 4} -expand ns $T style layout $S e2 -expand ns - $T style layout $S e3 -union [list e2] -iexpand ns -ipadw 2 -ipade 2 + $T style layout $S e3 -union [list e2] -iexpand ns -ipadx 2 set parentList [list root {} {} {} {} {} {}] set parent root diff --git a/doc/treectrl.n b/doc/treectrl.n index 8ace5bd..fb16cfc 100644 --- a/doc/treectrl.n +++ b/doc/treectrl.n @@ -7,7 +7,7 @@ '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" -'\" $Id: treectrl.n,v 1.14 2002/12/31 12:18:23 krischan Exp $ +'\" $Id: treectrl.n,v 1.15 2003/01/02 02:25:13 treectrl Exp $ '\" .so man.macros .TH treectrl n 8.4 Tk "Tk Commands" @@ -272,7 +272,7 @@ If the item has descendants, they are no longer displayed. If the item is configured to have a button, the button will now display the image or bitmap configured with the widget options \fB\-closedbuttonimage\fR or \fB\-closedbuttonbitmap\fR, -or a \fB\+\fR sign if no image or bitmap is configured. +or a \fB+\fR sign if no image or bitmap is configured. If the item is already closed, this command has no effect. \fIItemDesc\fR may also be the string \fBall\fR, in which case all items of the treectrl widget are collapsed. @@ -1147,7 +1147,6 @@ Returns a decimal string giving the number of columns configured in the treectrl widget. Since the always existant tail column is ignored by this command, the number can be 0 if no column is configured yet. -.RE .TP \fIpathName \fBnumitems\fR Returns a decimal string giving the number of @@ -1344,31 +1343,24 @@ managed by \fIstyle\fR. The following options are supported: .RS .TP -\fB\-pade \fIamount\fR -.TP -\fB\-padn \fIamount\fR -.TP -\fB\-pads \fIamount\fR +\fB\-padx \fIamount\fR .TP -\fB\-padw \fIamount\fR +\fB\-pady \fIamount\fR \fIAmount\fR specifies how much external padding to -leave on the corresponding side of the element. +leave on the left and right (for \fB\-padx\fR) +or top and bottom (for \fB\-pady\fR) side of the element. +\fIAmount\fR may be a list +of two values to specify padding for the two sides separately. \fIAmount\fR defaults to 0. .TP -\fB\-ipade \fIamount\fR -.TP -\fB\-ipadn \fIamount\fR -.TP -\fB\-ipads \fIamount\fR +\fB\-ipadx \fIamount\fR .TP -\fB\-ipadw \fIamount\fR +\fB\-ipady \fIamount\fR \fIAmount\fR specifies how much internal padding to -leave on the corresponding side of the element. -\fIAmount\fR defaults to 0. -.TP -\fB\-ipadw \fIamount\fR -\fIAmount\fR specifies how much internal padding to -leave on the corresponding side of the element. +leave on the left and right (for \fB\-ipadx\fR) +or top and bottom (for \fB\-ipady\fR) side of the element. +\fIAmount\fR may be a list +of two values to specify padding for the two sides separately. \fIAmount\fR defaults to 0. .TP \fB\-expand \fIstyle\fR @@ -1527,11 +1519,12 @@ Indicates onto which side an arrow should be packed, if there is more space available for drawing the arrow then needed. \fISide\fR must be either \fBleft\fR (the default) or \fBright\fR. .TP -\fB\-arrowpade \fIamount\fR -.TP -\fB\-arrowpadw \fIamount\fR -\fIAmount\fR specifies how much padding to -leave on the left or right side of the arrow. +\fB\-arrowpad \fIamount\fR +\fIAmount\fR specifies how much external padding to +leave on the left and right side of the arrow. +\fIAmount\fR may be a list +of two values to specify padding for left and right separately. +\fIAmount\fR defaults to 0. .TP \fB\-bitmap \fIbitmap\fR Specifies the bitmap to display in the element @@ -1565,15 +1558,15 @@ Specifies the image to display in the element to the left of the column title. This option overrides the \fB\-bitmap\fR column option. .TP -\fB\-imagepade \fIamount\fR -.TP -\fB\-imagepadn \fIamount\fR -.TP -\fB\-imagepads \fIamount\fR +\fB\-imagepadx \fIamount\fR .TP -\fB\-imagepadw \fIamount\fR -\fIAmount\fR specifies how much padding to -leave on the corresponding side of the image. +\fB\-imagepady \fIamount\fR +\fIAmount\fR specifies how much external padding to +leave on the left and right (for \fB\-imagepadx\fR) +or top and bottom (for \fB\-imagepady\fR) side of the image. +\fIAmount\fR may be a list +of two values to specify padding for the two sides separately. +\fIAmount\fR defaults to 0. .TP \fB\-itembackground \fIcolorList\fR Specifies a list of colors, which should be used as @@ -1615,15 +1608,15 @@ Specifies a text to be displayed inside the column title. Specifies a color, which should be used as foreground color to display the column title. .TP -\fB\-textpade \fIamount\fR +\fB\-textpadx \fIamount\fR .TP -\fB\-textpadn \fIamount\fR -.TP -\fB\-textpads \fIamount\fR -.TP -\fB\-textpadw \fIamount\fR -\fIAmount\fR specifies how much padding to -leave on the corresponding side of the text. +\fB\-textpady \fIamount\fR +\fIAmount\fR specifies how much external padding to +leave on the left and right (for \fB\-textpadx\fR) +or top and bottom (for \fB\-textpady\fR) side of the text. +\fIAmount\fR may be a list +of two values to specify padding for the two sides separately. +\fIAmount\fR defaults to 0. .TP \fB\-width \fIsize\fR Specifies the width of the column. diff --git a/generic/tkTreeColumn.c b/generic/tkTreeColumn.c index 9b796ce..23eefd0 100644 --- a/generic/tkTreeColumn.c +++ b/generic/tkTreeColumn.c @@ -28,12 +28,16 @@ struct Column int sunken; /* -sunken */ Tcl_Obj *itemBgObj; /* -itembackground */ int button; /* -button */ - Tcl_Obj *textPadObj[4]; /* -textpad* */ - int textPad[4]; /* -textpad* */ - Tcl_Obj *imagePadObj[4]; /* -imagepad* */ - int imagePad[4]; /* -imagepad* */ - Tcl_Obj *arrowPadObj[2]; /* -arrowpadw -arrowpade */ - int arrowPad[2]; /* -arrowpadw -arrowpade */ + Tcl_Obj *textPadXObj; /* -textpadx */ + int *textPadX; /* -textpadx */ + Tcl_Obj *textPadYObj; /* -textpady */ + int *textPadY; /* -textpady */ + Tcl_Obj *imagePadXObj; /* -imagepadx */ + int *imagePadX; /* -imagepadx */ + Tcl_Obj *imagePadYObj; /* -imagepady */ + int *imagePadY; /* -imagepady */ + Tcl_Obj *arrowPadObj; /* -arrowpad */ + int *arrowPad; /* -arrowpad */ #define ARROW_NONE 0 #define ARROW_UP 1 @@ -85,14 +89,10 @@ static Tk_OptionSpec columnSpecs[] = { {TK_OPTION_STRING_TABLE, "-arrowgravity", (char *) NULL, (char *) NULL, "left", -1, Tk_Offset(Column, arrowGravity), 0, (ClientData) arrowSideST, COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-arrowpade", (char *) NULL, (char *) NULL, - "6", Tk_Offset(Column, arrowPadObj[SIDE_RIGHT]), - Tk_Offset(Column, arrowPad[SIDE_RIGHT]), - 0, (ClientData) NULL, COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-arrowpadw", (char *) NULL, (char *) NULL, - "6", Tk_Offset(Column, arrowPadObj[SIDE_LEFT]), - Tk_Offset(Column, arrowPad[SIDE_LEFT]), - 0, (ClientData) NULL, COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, + {TK_OPTION_CUSTOM, "-arrowpad", (char *) NULL, (char *) NULL, + "6", Tk_Offset(Column, arrowPadObj), + Tk_Offset(Column, arrowPad), 0, (ClientData) &PadAmountOption, + COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, {TK_OPTION_BITMAP, "-bitmap", (char *) NULL, (char *) NULL, (char *) NULL, -1, Tk_Offset(Column, bitmap), TK_OPTION_NULL_OK, (ClientData) NULL, @@ -117,22 +117,14 @@ static Tk_OptionSpec columnSpecs[] = { (char *) NULL, -1, Tk_Offset(Column, imageString), TK_OPTION_NULL_OK, (ClientData) NULL, COLU_CONF_IMAGE | COLU_CONF_NWIDTH | COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-imagepade", (char *) NULL, (char *) NULL, - "6", Tk_Offset(Column, imagePadObj[RIGHT]), - Tk_Offset(Column, imagePad[RIGHT]), - 0, (ClientData) NULL, COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-imagepadn", (char *) NULL, (char *) NULL, - "0", Tk_Offset(Column, imagePadObj[TOP]), - Tk_Offset(Column, imagePad[TOP]), - 0, (ClientData) NULL, COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-imagepads", (char *) NULL, (char *) NULL, - "0", Tk_Offset(Column, imagePadObj[BOTTOM]), - Tk_Offset(Column, imagePad[BOTTOM]), - 0, (ClientData) NULL, COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-imagepadw", (char *) NULL, (char *) NULL, - "6", Tk_Offset(Column, imagePadObj[LEFT]), - Tk_Offset(Column, imagePad[LEFT]), - 0, (ClientData) NULL, COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, + {TK_OPTION_CUSTOM, "-imagepadx", (char *) NULL, (char *) NULL, + "6", Tk_Offset(Column, imagePadXObj), + Tk_Offset(Column, imagePadX), 0, (ClientData) &PadAmountOption, + COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, + {TK_OPTION_CUSTOM, "-imagepady", (char *) NULL, (char *) NULL, + "0", Tk_Offset(Column, imagePadYObj), + Tk_Offset(Column, imagePadY), 0, (ClientData) &PadAmountOption, + COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, {TK_OPTION_STRING, "-itembackground", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(Column, itemBgObj), -1, TK_OPTION_NULL_OK, (ClientData) NULL, COLU_CONF_ITEMBG}, @@ -163,22 +155,14 @@ static Tk_OptionSpec columnSpecs[] = { {TK_OPTION_COLOR, "-textcolor", (char *) NULL, (char *) NULL, DEF_BUTTON_FG, -1, Tk_Offset(Column, textColor), 0, (ClientData) NULL, COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-textpade", (char *) NULL, (char *) NULL, - "6", Tk_Offset(Column, textPadObj[RIGHT]), - Tk_Offset(Column, textPad[RIGHT]), - 0, (ClientData) NULL, COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-textpadn", (char *) NULL, (char *) NULL, - "0", Tk_Offset(Column, textPadObj[TOP]), - Tk_Offset(Column, textPad[TOP]), - 0, (ClientData) NULL, COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-textpads", (char *) NULL, (char *) NULL, - "0", Tk_Offset(Column, textPadObj[BOTTOM]), - Tk_Offset(Column, textPad[BOTTOM]), - 0, (ClientData) NULL, COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, - {TK_OPTION_PIXELS, "-textpadw", (char *) NULL, (char *) NULL, - "6", Tk_Offset(Column, textPadObj[LEFT]), - Tk_Offset(Column, textPad[LEFT]), - 0, (ClientData) NULL, COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, + {TK_OPTION_CUSTOM, "-textpadx", (char *) NULL, (char *) NULL, + "6", Tk_Offset(Column, textPadXObj), + Tk_Offset(Column, textPadX), 0, (ClientData) &PadAmountOption, + COLU_CONF_NWIDTH | COLU_CONF_DISPLAY}, + {TK_OPTION_CUSTOM, "-textpady", (char *) NULL, (char *) NULL, + "0", Tk_Offset(Column, textPadYObj), + Tk_Offset(Column, textPadY), 0, (ClientData) &PadAmountOption, + COLU_CONF_NHEIGHT | COLU_CONF_DISPLAY}, {TK_OPTION_PIXELS, "-width", (char *) NULL, (char *) NULL, (char *) NULL, Tk_Offset(Column, widthObj), Tk_Offset(Column, width), TK_OPTION_NULL_OK, (ClientData) NULL, COLU_CONF_TWIDTH}, @@ -625,8 +609,8 @@ int TreeColumn_NeededWidth(TreeColumn column_) if ((column->arrow != ARROW_NONE) && (column->arrowSide == SIDE_LEFT)) { widthList[n] = arrowWidth; - padList[n] = column->arrowPad[SIDE_LEFT]; - padList[n + 1] = column->arrowPad[SIDE_RIGHT]; + padList[n] = column->arrowPad[PAD_TOP_LEFT]; + padList[n + 1] = column->arrowPad[PAD_BOTTOM_RIGHT]; n++; } if ((column->image != NULL) || (column->bitmap != None)) @@ -636,23 +620,23 @@ int TreeColumn_NeededWidth(TreeColumn column_) Tk_SizeOfImage(column->image, &imgWidth, &imgHeight); else Tk_SizeOfBitmap(column->tree->display, column->bitmap, &imgWidth, &imgHeight); - padList[n] = MAX(column->imagePad[LEFT], padList[n]); - padList[n + 1] = column->imagePad[RIGHT]; + padList[n] = MAX(column->imagePadX[PAD_TOP_LEFT], padList[n]); + padList[n + 1] = column->imagePadX[PAD_BOTTOM_RIGHT]; widthList[n] = imgWidth; n++; } if (column->textLen > 0) { - padList[n] = MAX(column->textPad[LEFT], padList[n]); - padList[n + 1] = column->textPad[RIGHT]; + padList[n] = MAX(column->textPadX[PAD_TOP_LEFT], padList[n]); + padList[n + 1] = column->textPadX[PAD_BOTTOM_RIGHT]; widthList[n] = column->textWidth; n++; } if ((column->arrow != ARROW_NONE) && (column->arrowSide == SIDE_RIGHT)) { widthList[n] = arrowWidth; - padList[n] = column->arrowPad[SIDE_LEFT]; - padList[n + 1] = column->arrowPad[SIDE_RIGHT]; + padList[n] = column->arrowPad[PAD_TOP_LEFT]; + padList[n + 1] = column->arrowPad[PAD_BOTTOM_RIGHT]; n++; } @@ -679,7 +663,8 @@ int TreeColumn_NeededHeight(TreeColumn column_) Tk_SizeOfImage(column->image, &imgWidth, &imgHeight); else Tk_SizeOfBitmap(column->tree->display, column->bitmap, &imgWidth, &imgHeight); - imgHeight += column->imagePad[TOP] + column->imagePad[BOTTOM]; + imgHeight += column->imagePadY[PAD_TOP_LEFT] + + column->imagePadY[PAD_BOTTOM_RIGHT]; column->neededHeight = MAX(column->neededHeight, imgHeight); } if (column->text != NULL) @@ -687,7 +672,8 @@ int TreeColumn_NeededHeight(TreeColumn column_) Tk_Font tkfont = column->tkfont ? column->tkfont : column->tree->tkfont; Tk_FontMetrics fm; Tk_GetFontMetrics(tkfont, &fm); - fm.linespace += column->textPad[TOP] + column->textPad[BOTTOM]; + fm.linespace += column->textPadY[PAD_TOP_LEFT] + + column->textPadY[PAD_BOTTOM_RIGHT]; column->neededHeight = MAX(column->neededHeight, fm.linespace); } column->neededHeight += column->borderWidth * 2; @@ -1108,8 +1094,8 @@ static void Column_Layout(Column *column, struct Layout *layout) if ((column->arrow != ARROW_NONE) && (column->arrowSide == SIDE_LEFT)) { widthList[n] = layout->arrowWidth; - padList[n] = column->arrowPad[SIDE_LEFT]; - padList[n + 1] = column->arrowPad[SIDE_RIGHT]; + padList[n] = column->arrowPad[PAD_TOP_LEFT]; + padList[n + 1] = column->arrowPad[PAD_BOTTOM_RIGHT]; iArrow = n++; } if ((column->image != NULL) || (column->bitmap != None)) @@ -1119,8 +1105,8 @@ static void Column_Layout(Column *column, struct Layout *layout) Tk_SizeOfImage(column->image, &imgWidth, &imgHeight); else Tk_SizeOfBitmap(column->tree->display, column->bitmap, &imgWidth, &imgHeight); - padList[n] = MAX(column->imagePad[LEFT], padList[n]); - padList[n + 1] = column->imagePad[RIGHT]; + padList[n] = MAX(column->imagePadX[PAD_TOP_LEFT], padList[n]); + padList[n + 1] = column->imagePadX[PAD_BOTTOM_RIGHT]; widthList[n] = imgWidth; layout->imageWidth = imgWidth; iImage = n++; @@ -1132,8 +1118,9 @@ static void Column_Layout(Column *column, struct Layout *layout) layout->bytesThatFit = 0; if (layout->width >= TreeColumn_NeededWidth((TreeColumn) column)) { - padList[n] = MAX(column->textPad[LEFT], padList[n]); - padList[n + 1] = column->textPad[RIGHT]; + padList[n] = MAX(column->textPadX[PAD_TOP_LEFT], + padList[n]); + padList[n + 1] = column->textPadX[PAD_BOTTOM_RIGHT]; widthList[n] = column->textWidth; iText = n++; layout->bytesThatFit = column->textLen; @@ -1147,8 +1134,9 @@ static void Column_Layout(Column *column, struct Layout *layout) width = column->textWidth - width; layout->bytesThatFit = Ellipsis(layout->tkfont, column->text, column->textLen, &width, "..."); - padList[n] = MAX(column->textPad[LEFT], padList[n]); - padList[n + 1] = column->textPad[RIGHT]; + padList[n] = MAX(column->textPadX[PAD_TOP_LEFT], + padList[n]); + padList[n + 1] = column->textPadX[PAD_BOTTOM_RIGHT]; widthList[n] = width; iText = n++; layout->textWidth = width; @@ -1158,8 +1146,8 @@ static void Column_Layout(Column *column, struct Layout *layout) if ((column->arrow != ARROW_NONE) && (column->arrowSide == SIDE_RIGHT)) { widthList[n] = layout->arrowWidth; - padList[n] = column->arrowPad[SIDE_LEFT]; - padList[n + 1] = column->arrowPad[SIDE_RIGHT]; + padList[n] = column->arrowPad[PAD_TOP_LEFT]; + padList[n + 1] = column->arrowPad[PAD_BOTTOM_RIGHT]; iArrow = n++; } @@ -1346,9 +1334,10 @@ void TreeColumn_Draw(TreeColumn column_, Drawable drawable, int x, int y) int imgW, imgH, ix, iy, h; Tk_SizeOfImage(column->image, &imgW, &imgH); ix = x + layout.imageLeft + column->sunken; - h = column->imagePad[TOP] + imgH + column->imagePad[BOTTOM]; + h = column->imagePadY[PAD_TOP_LEFT] + imgH + + column->imagePadY[PAD_BOTTOM_RIGHT]; iy = y + (height - h) / 2 + column->sunken; - iy += column->imagePad[TOP]; + iy += column->imagePadY[PAD_TOP_LEFT]; Tk_RedrawImage(column->image, 0, 0, imgW, imgH, drawable, ix, iy); } else if (column->bitmap != None) @@ -1357,9 +1346,10 @@ void TreeColumn_Draw(TreeColumn column_, Drawable drawable, int x, int y) Tk_SizeOfBitmap(tree->display, column->bitmap, &imgW, &imgH); bx = x + layout.imageLeft + column->sunken; - h = column->imagePad[TOP] + imgH + column->imagePad[BOTTOM]; + h = column->imagePadY[PAD_TOP_LEFT] + imgH + + column->imagePadY[PAD_BOTTOM_RIGHT]; by = y + (height - h) / 2 + column->sunken; - by += column->imagePad[TOP]; + by += column->imagePadY[PAD_TOP_LEFT]; XSetClipOrigin(tree->display, column->bitmapGC, bx, by); XCopyPlane(tree->display, column->bitmap, drawable, column->bitmapGC, 0, 0, (unsigned int) imgW, (unsigned int) imgH, @@ -1397,9 +1387,10 @@ void TreeColumn_Draw(TreeColumn column_, Drawable drawable, int x, int y) mask = GCFont | GCForeground | GCGraphicsExposures; gc = Tk_GetGC(tree->tkwin, mask, &gcValues); tx = x + layout.textLeft + column->sunken; - h = column->textPad[TOP] + layout.fm.linespace + column->textPad[BOTTOM]; + h = column->textPadY[PAD_TOP_LEFT] + layout.fm.linespace + + column->textPadY[PAD_BOTTOM_RIGHT]; ty = y + (height - h) / 2 + layout.fm.ascent + column->sunken; - ty += column->textPad[TOP]; + ty += column->textPadY[PAD_TOP_LEFT]; Tk_DrawChars(tree->display, drawable, gc, layout.tkfont, text, textLen, tx, ty); Tk_FreeGC(tree->display, gc); diff --git a/generic/tkTreeCtrl.c b/generic/tkTreeCtrl.c index eb06c8a..7a3d30c 100644 --- a/generic/tkTreeCtrl.c +++ b/generic/tkTreeCtrl.c @@ -85,26 +85,16 @@ static Tk_OptionSpec optionSpecs[] = { Tk_Offset(TreeCtrl, itemHeight), 0, (ClientData) NULL, TREE_CONF_ITEMHEIGHT | TREE_CONF_RELAYOUT}, #if 0 - {TK_OPTION_PIXELS, "-itempadw", (char *) NULL, (char *) NULL, + {TK_OPTION_CUSTOM, "-itempadx", (char *) NULL, (char *) NULL, "0", - Tk_Offset(TreeCtrl, itemPadObj[LEFT]), - Tk_Offset(TreeCtrl, itemPad[LEFT]), - TK_CONFIG_NULL_OK, (ClientData) NULL, 0}, - {TK_OPTION_PIXELS, "-itempadn", (char *) NULL, (char *) NULL, + Tk_Offset(TreeCtrl, itemPadXObj), + Tk_Offset(TreeCtrl, itemPadX), + TK_CONFIG_NULL_OK, (ClientData) &PadAmountOption, 0}, + {TK_OPTION_PIXELS, "-itempady", (char *) NULL, (char *) NULL, "0", - Tk_Offset(TreeCtrl, itemPadObj[TOP]), - Tk_Offset(TreeCtrl, itemPad[TOP]), - TK_CONFIG_NULL_OK, (ClientData) NULL, 0}, - {TK_OPTION_PIXELS, "-itempade", (char *) NULL, (char *) NULL, - "0", - Tk_Offset(TreeCtrl, itemPadObj[RIGHT]), - Tk_Offset(TreeCtrl, itemPad[RIGHT]), - TK_CONFIG_NULL_OK, (ClientData) NULL, 0}, - {TK_OPTION_PIXELS, "-itempads", (char *) NULL, (char *) NULL, - "0", - Tk_Offset(TreeCtrl, itemPadObj[BOTTOM]), - Tk_Offset(TreeCtrl, itemPad[BOTTOM]), - TK_CONFIG_NULL_OK, (ClientData) NULL, 0}, + Tk_Offset(TreeCtrl, itemPadYObj), + Tk_Offset(TreeCtrl, itemPadY), + TK_CONFIG_NULL_OK, (ClientData) &PadAmountOption, 0}, #endif {TK_OPTION_COLOR, "-linecolor", "lineColor", "LineColor", "#808080", -1, Tk_Offset(TreeCtrl, lineColor), diff --git a/generic/tkTreeCtrl.h b/generic/tkTreeCtrl.h index 4778bc8..0da2923 100644 --- a/generic/tkTreeCtrl.h +++ b/generic/tkTreeCtrl.h @@ -116,8 +116,10 @@ struct TreeCtrl #define BG_MODE_ROW 2 #define BG_MODE_VISINDEX 3 int backgroundMode; /* -backgroundmode */ - int itemPad[4]; /* -itempad w/n/e/s */ - Tcl_Obj *itemPadObj[4]; /* -itempad w/n/e/s */ + int *itemPadX; /* -itempadx */ + Tcl_Obj *itemPadXObj; /* -itempadx */ + int *itemPadY; /* -itempady */ + Tcl_Obj *itemPadYObj; /* -itempady */ struct TreeCtrlDebug debug; @@ -503,3 +505,12 @@ extern void TextLayout_Size(TextLayout textLayout, int *widthPtr, int *heightPtr extern void TextLayout_Draw(Display *display, Drawable drawable, GC gc, TextLayout layout, int x, int y, int firstChar, int lastChar); + +#define PAD_TOP_LEFT 0 +#define PAD_BOTTOM_RIGHT 1 +extern Tk_ObjCustomOption PadAmountOption; + +extern int TreeCtrl_GetPadAmountFromObj _ANSI_ARGS_((Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *padObj, + int *topLeftPtr, int *bottomRightPtr)); +extern Tcl_Obj * TreeCtrl_NewPadAmountObj _ANSI_ARGS_((int *padAmounts)); diff --git a/generic/tkTreeStyle.c b/generic/tkTreeStyle.c index 7d677b0..77b02fc 100644 --- a/generic/tkTreeStyle.c +++ b/generic/tkTreeStyle.c @@ -51,8 +51,10 @@ struct ElementLink int neededHeight; int layoutWidth; int layoutHeight; - int ePad[4]; /* external padding */ - int iPad[4]; /* internal padding */ + int ePadX[2]; /* external horizontal padding */ + int ePadY[2]; /* external vertical padding */ + int iPadX[2]; /* internal horizontal padding */ + int iPadY[2]; /* internal vertical padding */ int flags; /* ELF_xxx */ int *onion, onionCount; /* -union option info */ }; @@ -83,15 +85,18 @@ struct Layout int eHeight; /* ePad + iPad + useHeight + iPad + ePad */ int iWidth; /* iPad + useWidth + iPad */ int iHeight; /* iPad + useHeight + iPad */ - int ePad[4]; /* external padding */ - int iPad[4]; /* internal padding */ - int uPad[4]; /* padding due to -union */ + int ePadX[2]; /* external horizontal padding */ + int ePadY[2]; /* external vertical padding */ + int iPadX[2]; /* internal horizontal padding */ + int iPadY[2]; /* internal vertical padding */ + int uPadX[2]; /* padding due to -union */ + int uPadY[2]; /* padding due to -union */ }; static void Style_DoExpandH(struct Layout *layout, int flags, int width) { int extraWidth; - int *ePad, *iPad; + int *ePadX, *iPadX; int eW, eE, iW, iE, eLeft, eRight, iLeft, iRight, eMax, iMax; if (!(flags & ELF_EXPAND_WE)) @@ -108,40 +113,41 @@ static void Style_DoExpandH(struct Layout *layout, int flags, int width) eRight = width - (layout->x + layout->eWidth); eMax = eLeft + eRight; - /* Internal: can expand to max of ePad[] or uPad[] */ - iW = MAX(layout->ePad[LEFT], layout->uPad[LEFT]); - iE = width - MAX(layout->ePad[RIGHT], layout->uPad[RIGHT]); - iLeft = layout->x + layout->ePad[LEFT] - iW; - iRight = iE - (layout->x + layout->eWidth - layout->ePad[RIGHT]); + /* Internal: can expand to max of ePadX[] or uPadX[] */ + iW = MAX(layout->ePadX[PAD_TOP_LEFT], layout->uPadX[PAD_TOP_LEFT]); + iE = width - MAX(layout->ePadX[PAD_BOTTOM_RIGHT], + layout->uPadX[PAD_BOTTOM_RIGHT]); + iLeft = layout->x + layout->ePadX[PAD_TOP_LEFT] - iW; + iRight = iE - (layout->x + layout->eWidth - layout->ePadX[PAD_BOTTOM_RIGHT]); iMax = iLeft + iRight; - ePad = layout->ePad; - iPad = layout->iPad; + ePadX = layout->ePadX; + iPadX = layout->iPadX; /* Internal expansion */ if (flags & ELF_iEXPAND_WE) { if ((flags & ELF_iEXPAND_WE) == ELF_iEXPAND_WE) { - iPad[LEFT] += MIN(iMax / 2, iLeft); - layout->x = iW - ePad[LEFT]; + iPadX[PAD_TOP_LEFT] += MIN(iMax / 2, iLeft); + layout->x = iW - ePadX[PAD_TOP_LEFT]; layout->iWidth += iMax; layout->eWidth += iMax; - iPad[RIGHT] = layout->iWidth - layout->eLink->neededWidth - iPad[LEFT]; + iPadX[PAD_BOTTOM_RIGHT] = layout->iWidth - layout->eLink->neededWidth - iPadX[PAD_TOP_LEFT]; } else if (flags & ELF_iEXPAND_W) { - layout->x = iW - ePad[LEFT]; + layout->x = iW - ePadX[PAD_TOP_LEFT]; layout->iWidth += iMax; layout->eWidth += iMax; - iPad[LEFT] = layout->iWidth - layout->eLink->neededWidth - iPad[RIGHT]; + iPadX[PAD_TOP_LEFT] = layout->iWidth - layout->eLink->neededWidth - iPadX[PAD_BOTTOM_RIGHT]; } else { - layout->x = iW - ePad[LEFT]; + layout->x = iW - ePadX[PAD_TOP_LEFT]; layout->iWidth += iMax; layout->eWidth += iMax; - iPad[RIGHT] = layout->iWidth - layout->eLink->neededWidth - iPad[LEFT]; + iPadX[PAD_BOTTOM_RIGHT] = layout->iWidth - layout->eLink->neededWidth - iPadX[PAD_TOP_LEFT]; } return; } @@ -155,22 +161,22 @@ static void Style_DoExpandH(struct Layout *layout, int flags, int width) layout->x = 0; layout->eWidth = width; - if (ePad[LEFT] + amt + layout->iWidth > iE) - amt -= (ePad[LEFT] + amt + layout->iWidth) - iE; - ePad[LEFT] += amt; - ePad[RIGHT] += extraWidth - amt; + if (ePadX[PAD_TOP_LEFT] + amt + layout->iWidth > iE) + amt -= (ePadX[PAD_TOP_LEFT] + amt + layout->iWidth) - iE; + ePadX[PAD_TOP_LEFT] += amt; + ePadX[PAD_BOTTOM_RIGHT] += extraWidth - amt; } else if (flags & ELF_eEXPAND_W) { layout->x = 0; - layout->eWidth = iE + ePad[RIGHT]; - ePad[LEFT] = layout->eWidth - layout->iWidth - ePad[RIGHT]; + layout->eWidth = iE + ePadX[PAD_BOTTOM_RIGHT]; + ePadX[PAD_TOP_LEFT] = layout->eWidth - layout->iWidth - ePadX[PAD_BOTTOM_RIGHT]; } else { - layout->x = iW - ePad[LEFT]; + layout->x = iW - ePadX[PAD_TOP_LEFT]; layout->eWidth = width - layout->x; - ePad[RIGHT] = layout->eWidth - layout->iWidth - ePad[LEFT]; + ePadX[PAD_BOTTOM_RIGHT] = layout->eWidth - layout->iWidth - ePadX[PAD_TOP_LEFT]; } } } @@ -178,7 +184,7 @@ static void Style_DoExpandH(struct Layout *layout, int flags, int width) static void Style_DoExpandV(struct Layout *layout, int flags, int height) { int extraHeight; - int *ePad, *iPad; + int *ePadY, *iPadY; int eN, eS, iN, iS, eAbove, eBelow, iAbove, iBelow, eMax, iMax; if (!(flags & ELF_EXPAND_NS)) @@ -188,8 +194,8 @@ static void Style_DoExpandV(struct Layout *layout, int flags, int height) if (extraHeight <= 0) return; - ePad = layout->ePad; - iPad = layout->iPad; + ePadY = layout->ePadY; + iPadY = layout->iPadY; /* External: can expand to top and bottom */ eN = 0; @@ -198,11 +204,11 @@ static void Style_DoExpandV(struct Layout *layout, int flags, int height) eBelow = height - (layout->y + layout->eHeight); eMax = eAbove + eBelow; - /* Internal: can expand to max of ePad[] or uPad[] */ - iN = MAX(ePad[TOP], layout->uPad[TOP]); - iS = height - MAX(ePad[BOTTOM], layout->uPad[BOTTOM]); - iAbove = layout->y + ePad[TOP] - iN; - iBelow = iS - (layout->y + layout->eHeight - ePad[BOTTOM]); + /* Internal: can expand to max of ePadY[] or uPadY[] */ + iN = MAX(ePadY[PAD_TOP_LEFT], layout->uPadY[PAD_TOP_LEFT]); + iS = height - MAX(ePadY[PAD_BOTTOM_RIGHT], layout->uPadY[PAD_BOTTOM_RIGHT]); + iAbove = layout->y + ePadY[PAD_TOP_LEFT] - iN; + iBelow = iS - (layout->y + layout->eHeight - ePadY[PAD_BOTTOM_RIGHT]); iMax = iAbove + iBelow; /* Internal expansion */ @@ -210,25 +216,25 @@ static void Style_DoExpandV(struct Layout *layout, int flags, int height) { if ((flags & ELF_iEXPAND_NS) == ELF_iEXPAND_NS) { - iPad[TOP] += MIN(iMax / 2, iAbove); - layout->y = iN - ePad[TOP]; + iPadY[PAD_TOP_LEFT] += MIN(iMax / 2, iAbove); + layout->y = iN - ePadY[PAD_TOP_LEFT]; layout->iHeight += iMax; layout->eHeight += iMax; - iPad[BOTTOM] = layout->iHeight - layout->eLink->neededHeight - iPad[TOP]; + iPadY[PAD_BOTTOM_RIGHT] = layout->iHeight - layout->eLink->neededHeight - iPadY[PAD_TOP_LEFT]; } else if (flags & ELF_iEXPAND_N) { - layout->y = iN - ePad[TOP]; + layout->y = iN - ePadY[PAD_TOP_LEFT]; layout->iHeight += iMax; layout->eHeight += iMax; - iPad[TOP] = layout->iHeight - layout->eLink->neededHeight - iPad[BOTTOM]; + iPadY[PAD_TOP_LEFT] = layout->iHeight - layout->eLink->neededHeight - iPadY[PAD_BOTTOM_RIGHT]; } else { - layout->y = iN - ePad[TOP]; + layout->y = iN - ePadY[PAD_TOP_LEFT]; layout->iHeight += iMax; layout->eHeight += iMax; - iPad[BOTTOM] = layout->iHeight - layout->eLink->neededHeight - iPad[TOP]; + iPadY[PAD_BOTTOM_RIGHT] = layout->iHeight - layout->eLink->neededHeight - iPadY[PAD_TOP_LEFT]; } return; } @@ -242,22 +248,22 @@ static void Style_DoExpandV(struct Layout *layout, int flags, int height) layout->y = 0; layout->eHeight = height; - if (ePad[TOP] + amt + layout->iHeight > iS) - amt -= (ePad[TOP] + amt + layout->iHeight) - iS; - ePad[TOP] += amt; - ePad[BOTTOM] += extraHeight - amt; + if (ePadY[PAD_TOP_LEFT] + amt + layout->iHeight > iS) + amt -= (ePadY[PAD_TOP_LEFT] + amt + layout->iHeight) - iS; + ePadY[PAD_TOP_LEFT] += amt; + ePadY[PAD_BOTTOM_RIGHT] += extraHeight - amt; } else if (flags & ELF_eEXPAND_N) { layout->y = 0; - layout->eHeight = iS + ePad[BOTTOM]; - ePad[TOP] = layout->eHeight - layout->iHeight - ePad[BOTTOM]; + layout->eHeight = iS + ePadY[PAD_BOTTOM_RIGHT]; + ePadY[PAD_TOP_LEFT] = layout->eHeight - layout->iHeight - ePadY[PAD_BOTTOM_RIGHT]; } else { - layout->y = iN - ePad[TOP]; + layout->y = iN - ePadY[PAD_TOP_LEFT]; layout->eHeight = height - layout->y; - ePad[BOTTOM] = layout->eHeight - layout->iHeight - ePad[TOP]; + ePadY[PAD_BOTTOM_RIGHT] = layout->eHeight - layout->iHeight - ePadY[PAD_TOP_LEFT]; } } } @@ -269,10 +275,10 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) ElementLink *eLinks1, *eLinks2, *eLink1, *eLink2; int x = 0; int w, e; - int *ePad, *iPad, *uPad; + int *ePadX, *iPadX, *uPadX, *ePadY, *iPadY, *uPadY; int numExpandWE = 0; int numSqueezeX = 0; - int i, j, k, eLinkCount = 0; + int i, j, eLinkCount = 0; eLinks1 = masterStyle->elements; eLinks2 = style->elements; @@ -289,8 +295,10 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) layout->useWidth = eLink2->neededWidth; /* No -union padding yet */ - for (j = 0; j < 4; j++) - layout->uPad[j] = 0; + layout->uPadX[PAD_TOP_LEFT] = 0; + layout->uPadX[PAD_BOTTOM_RIGHT] = 0; + layout->uPadY[PAD_TOP_LEFT] = 0; + layout->uPadY[PAD_BOTTOM_RIGHT] = 0; /* Count all non-union, non-detach squeezeable items */ if ((eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) @@ -307,16 +315,21 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (eLink1->onion == NULL) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; + ePadX = eLink1->ePadX; + ePadY = eLink1->ePadY; + iPadX = eLink1->iPadX; + iPadY = eLink1->iPadY; for (j = 0; j < eLink1->onionCount; j++) { struct Layout *layout = &layouts[eLink1->onion[j]]; - uPad = layout->uPad; - for (k = 0; k < 4; k++) - uPad[k] = MAX(uPad[k], iPad[k] + ePad[k]); + uPadX = layout->uPadX; + uPadY = layout->uPadY; + uPadX[PAD_TOP_LEFT] = MAX(uPadX[PAD_TOP_LEFT], iPadX[PAD_TOP_LEFT] + ePadX[PAD_TOP_LEFT]); + uPadX[PAD_BOTTOM_RIGHT] = MAX(uPadX[PAD_BOTTOM_RIGHT], iPadX[PAD_BOTTOM_RIGHT] + ePadX[PAD_BOTTOM_RIGHT]); + uPadY[PAD_TOP_LEFT] = MAX(uPadY[PAD_TOP_LEFT], iPadY[PAD_TOP_LEFT] + ePadY[PAD_TOP_LEFT]); + uPadY[PAD_BOTTOM_RIGHT] = MAX(uPadY[PAD_BOTTOM_RIGHT], iPadY[PAD_BOTTOM_RIGHT] + ePadY[PAD_BOTTOM_RIGHT]); } } @@ -364,18 +377,18 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (eLink1->onion != NULL) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadX = eLink1->ePadX; + iPadX = eLink1->iPadX; + uPadX = layout->uPadX; if ((eLink1->flags & ELF_SQUEEZE_X) && ((eLink1->flags & ELF_DETACH) || masterStyle->vertical)) { int width = - MAX(ePad[LEFT], uPad[LEFT]) + - iPad[LEFT] + layout->useWidth + iPad[RIGHT] + - MAX(ePad[RIGHT], uPad[RIGHT]); + MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT]) + + iPadX[PAD_TOP_LEFT] + layout->useWidth + iPadX[PAD_BOTTOM_RIGHT] + + MAX(ePadX[PAD_BOTTOM_RIGHT], uPadX[PAD_BOTTOM_RIGHT]); if (width > drawArgs->width) layout->useWidth -= (width - drawArgs->width); } @@ -390,22 +403,24 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) eLink1 = &eLinks1[i]; eLink2 = &eLinks2[i]; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadX = eLink1->ePadX; + iPadX = eLink1->iPadX; + uPadX = layout->uPadX; if ((eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; layout->eLink = eLink2; layout->master = eLink1; - layout->x = MAX(x, abs(ePad[LEFT] - MAX(ePad[LEFT], uPad[LEFT]))); - layout->iWidth = iPad[LEFT] + layout->useWidth + iPad[RIGHT]; - layout->eWidth = ePad[LEFT] + layout->iWidth + ePad[RIGHT]; - for (j = 0; j < 4; j++) - { - layout->ePad[j] = ePad[j]; - layout->iPad[j] = iPad[j]; + layout->x = MAX(x, abs(ePadX[PAD_TOP_LEFT] - MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT]))); + layout->iWidth = iPadX[PAD_TOP_LEFT] + layout->useWidth + iPadX[PAD_BOTTOM_RIGHT]; + layout->eWidth = ePadX[PAD_TOP_LEFT] + layout->iWidth + ePadX[PAD_BOTTOM_RIGHT]; + + for (j = 0; j < 2; j++) { + layout->ePadX[j] = eLink1->ePadX[j]; + layout->ePadY[j] = eLink1->ePadY[j]; + layout->iPadX[j] = eLink1->iPadX[j]; + layout->iPadY[j] = eLink1->iPadY[j]; } if (!masterStyle->vertical) @@ -448,8 +463,8 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (layouts[j].eLink != NULL) layouts[j].x += extraWidth; - ePad = layout->ePad; - iPad = layout->iPad; + ePadX = layout->ePadX; + iPadX = layout->iPadX; /* External and internal expansion */ if ((eLink1->flags & ELF_eEXPAND_WE) && (eLink1->flags & ELF_iEXPAND_WE)) @@ -468,13 +483,13 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) { if ((eLink1->flags & ELF_eEXPAND_WE) == ELF_eEXPAND_WE) { - ePad[LEFT] += eExtra / 2; - ePad[RIGHT] += eExtra - eExtra / 2; + ePadX[PAD_TOP_LEFT] += eExtra / 2; + ePadX[PAD_BOTTOM_RIGHT] += eExtra - eExtra / 2; } else if (eLink1->flags & ELF_eEXPAND_W) - ePad[LEFT] += eExtra; + ePadX[PAD_TOP_LEFT] += eExtra; else - ePad[RIGHT] += eExtra; + ePadX[PAD_BOTTOM_RIGHT] += eExtra; } /* Internal expansion */ @@ -482,13 +497,13 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) { if ((eLink1->flags & ELF_iEXPAND_WE) == ELF_iEXPAND_WE) { - iPad[LEFT] += iExtra / 2; - iPad[RIGHT] += iExtra - iExtra / 2; + iPadX[PAD_TOP_LEFT] += iExtra / 2; + iPadX[PAD_BOTTOM_RIGHT] += iExtra - iExtra / 2; } else if (eLink1->flags & ELF_iEXPAND_W) - iPad[LEFT] += iExtra; + iPadX[PAD_TOP_LEFT] += iExtra; else - iPad[RIGHT] += iExtra; + iPadX[PAD_BOTTOM_RIGHT] += iExtra; layout->iWidth += iExtra; } layout->eWidth += extraWidth; @@ -548,19 +563,22 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (!(eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadX = eLink1->ePadX; + iPadX = eLink1->iPadX; + uPadX = layout->uPadX; layout->eLink = eLink2; layout->master = eLink1; - layout->x = abs(ePad[LEFT] - MAX(ePad[LEFT], uPad[LEFT])); - layout->iWidth = iPad[LEFT] + layout->useWidth + iPad[RIGHT]; - layout->eWidth = ePad[LEFT] + layout->iWidth + ePad[RIGHT]; - for (j = 0; j < 4; j++) + layout->x = abs(ePadX[PAD_TOP_LEFT] - MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT])); + layout->iWidth = iPadX[PAD_TOP_LEFT] + layout->useWidth + iPadX[PAD_BOTTOM_RIGHT]; + layout->eWidth = ePadX[PAD_TOP_LEFT] + layout->iWidth + ePadX[PAD_BOTTOM_RIGHT]; + + for (j = 0; j < 2; j++) { - layout->ePad[j] = ePad[j]; - layout->iPad[j] = iPad[j]; + layout->ePadX[j] = eLink1->ePadX[j]; + layout->ePadY[j] = eLink1->ePadY[j]; + layout->iPadX[j] = eLink1->iPadX[j]; + layout->iPadY[j] = eLink1->iPadY[j]; } Style_DoExpandH(layout, eLink1->flags, drawArgs->width); @@ -577,8 +595,8 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (eLink1->onion == NULL) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; + ePadX = eLink1->ePadX; + iPadX = eLink1->iPadX; w = 10000, e = -10000; @@ -586,19 +604,22 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) { struct Layout *layout2 = &layouts[eLink1->onion[j]]; - w = MIN(w, layout2->x + layout2->ePad[LEFT]); - e = MAX(e, layout2->x + layout2->ePad[LEFT] + layout2->iWidth); + w = MIN(w, layout2->x + layout2->ePadX[PAD_TOP_LEFT]); + e = MAX(e, layout2->x + layout2->ePadX[PAD_TOP_LEFT] + layout2->iWidth); } layout->eLink = eLink2; layout->master = eLink1; - layout->x = w - iPad[LEFT] - ePad[LEFT]; - layout->iWidth = iPad[LEFT] + (e - w) + iPad[RIGHT]; - layout->eWidth = ePad[LEFT] + layout->iWidth + ePad[RIGHT]; - for (j = 0; j < 4; j++) + layout->x = w - iPadX[PAD_TOP_LEFT] - ePadX[PAD_TOP_LEFT]; + layout->iWidth = iPadX[PAD_TOP_LEFT] + (e - w) + iPadX[PAD_BOTTOM_RIGHT]; + layout->eWidth = ePadX[PAD_TOP_LEFT] + layout->iWidth + ePadX[PAD_BOTTOM_RIGHT]; + + for (j = 0; j < 2; j++) { - layout->ePad[j] = ePad[j]; - layout->iPad[j] = iPad[j]; + layout->ePadX[j] = eLink1->ePadX[j]; + layout->ePadY[j] = eLink1->ePadY[j]; + layout->iPadX[j] = eLink1->iPadX[j]; + layout->iPadY[j] = eLink1->iPadY[j]; } } @@ -627,19 +648,19 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) int iExtra = extraWidth - extraWidth / 2; /* External expansion */ - layout->ePad[LEFT] += eExtra; + layout->ePadX[PAD_TOP_LEFT] += eExtra; layout->x = 0; layout->eWidth += extraWidth; /* Internal expansion */ - layout->iPad[LEFT] += iExtra; + layout->iPadX[PAD_TOP_LEFT] += iExtra; layout->iWidth += iExtra; } /* External expansion only: W */ else if (eLink1->flags & ELF_eEXPAND_W) { - layout->ePad[LEFT] += extraWidth; + layout->ePadX[PAD_TOP_LEFT] += extraWidth; layout->x = 0; layout->eWidth += extraWidth; } @@ -647,7 +668,7 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) /* Internal expansion only: W */ else { - layout->iPad[LEFT] += extraWidth; + layout->iPadX[PAD_TOP_LEFT] += extraWidth; layout->x = 0; layout->iWidth += extraWidth; layout->eWidth += extraWidth; @@ -664,25 +685,25 @@ static int Style_DoLayoutH(StyleDrawArgs *drawArgs, struct Layout layouts[20]) int iExtra = extraWidth - extraWidth / 2; /* External expansion */ - layout->ePad[RIGHT] += eExtra; + layout->ePadX[PAD_BOTTOM_RIGHT] += eExtra; layout->eWidth += extraWidth; /* all the space */ /* Internal expansion */ - layout->iPad[RIGHT] += iExtra; + layout->iPadX[PAD_BOTTOM_RIGHT] += iExtra; layout->iWidth += iExtra; } /* External expansion only: E */ else if (eLink1->flags & ELF_eEXPAND_E) { - layout->ePad[RIGHT] += extraWidth; + layout->ePadX[PAD_BOTTOM_RIGHT] += extraWidth; layout->eWidth += extraWidth; } /* Internal expansion only: E */ else { - layout->iPad[RIGHT] += extraWidth; + layout->iPadX[PAD_BOTTOM_RIGHT] += extraWidth; layout->iWidth += extraWidth; layout->eWidth += extraWidth; } @@ -699,7 +720,7 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) ElementLink *eLinks1, *eLinks2, *eLink1, *eLink2; int y = 0; int n, s; - int *ePad, *iPad, *uPad; + int *ePadY, *iPadY, *uPadY; int numExpandNS = 0; int numSqueezeY = 0; int i, j, eLinkCount = 0; @@ -763,18 +784,18 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (eLink1->onion != NULL) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadY = eLink1->ePadY; + iPadY = eLink1->iPadY; + uPadY = layout->uPadY; if ((eLink1->flags & ELF_SQUEEZE_Y) && ((eLink1->flags & ELF_DETACH) || !masterStyle->vertical)) { int height = - MAX(ePad[TOP], uPad[TOP]) + - iPad[TOP] + layout->useHeight + iPad[BOTTOM] + - MAX(ePad[BOTTOM], uPad[BOTTOM]); + MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT]) + + iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT] + + MAX(ePadY[PAD_BOTTOM_RIGHT], uPadY[PAD_BOTTOM_RIGHT]); if (height > drawArgs->height) layout->useHeight -= (height - drawArgs->height); } @@ -789,16 +810,16 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) eLink1 = &eLinks1[i]; eLink2 = &eLinks2[i]; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadY = eLink1->ePadY; + iPadY = eLink1->iPadY; + uPadY = layout->uPadY; if ((eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; - layout->y = MAX(y, abs(ePad[TOP] - MAX(ePad[TOP], uPad[TOP]))); - layout->iHeight = iPad[TOP] + layout->useHeight + iPad[BOTTOM]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; + layout->y = MAX(y, abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT]))); + layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; if (masterStyle->vertical) y = layout->y + layout->eHeight; @@ -840,8 +861,8 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (layouts[j].eLink != NULL) layouts[j].y += extraHeight; - ePad = layout->ePad; - iPad = layout->iPad; + ePadY = layout->ePadY; + iPadY = layout->iPadY; /* External and internal expansion */ if ((eLink1->flags & ELF_eEXPAND_NS) && (eLink1->flags & ELF_iEXPAND_NS)) @@ -860,13 +881,13 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) { if ((eLink1->flags & ELF_eEXPAND_NS) == ELF_eEXPAND_NS) { - ePad[TOP] += eExtra / 2; - ePad[BOTTOM] += eExtra - eExtra / 2; + ePadY[PAD_TOP_LEFT] += eExtra / 2; + ePadY[PAD_BOTTOM_RIGHT] += eExtra - eExtra / 2; } else if (eLink1->flags & ELF_eEXPAND_N) - ePad[TOP] += eExtra; + ePadY[PAD_TOP_LEFT] += eExtra; else - ePad[BOTTOM] += eExtra; + ePadY[PAD_BOTTOM_RIGHT] += eExtra; } /* Internal expansion */ @@ -874,13 +895,13 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) { if ((eLink1->flags & ELF_iEXPAND_NS) == ELF_iEXPAND_NS) { - iPad[TOP] += iExtra / 2; - iPad[BOTTOM] += iExtra - iExtra / 2; + iPadY[PAD_TOP_LEFT] += iExtra / 2; + iPadY[PAD_BOTTOM_RIGHT] += iExtra - iExtra / 2; } else if (eLink1->flags & ELF_iEXPAND_N) - iPad[TOP] += iExtra; + iPadY[PAD_TOP_LEFT] += iExtra; else - iPad[BOTTOM] += iExtra; + iPadY[PAD_BOTTOM_RIGHT] += iExtra; layout->iHeight += iExtra; } layout->eHeight += extraHeight; @@ -914,13 +935,13 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (!(eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadY = eLink1->ePadY; + iPadY = eLink1->iPadY; + uPadY = layout->uPadY; - layout->y = abs(ePad[TOP] - MAX(ePad[TOP], uPad[TOP])); - layout->iHeight = iPad[TOP] + layout->useHeight + iPad[BOTTOM]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; + layout->y = abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT])); + layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; Style_DoExpandV(layout, eLink1->flags, drawArgs->height); } @@ -936,8 +957,8 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (eLink1->onion == NULL) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; + ePadY = eLink1->ePadY; + iPadY = eLink1->iPadY; n = 10000, s = -10000; @@ -945,13 +966,13 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) { struct Layout *layout2 = &layouts[eLink1->onion[j]]; - n = MIN(n, layout2->y + layout2->ePad[TOP]); - s = MAX(s, layout2->y + layout2->ePad[TOP] + layout2->iHeight); + n = MIN(n, layout2->y + layout2->ePadY[PAD_TOP_LEFT]); + s = MAX(s, layout2->y + layout2->ePadY[PAD_TOP_LEFT] + layout2->iHeight); } - layout->y = n - iPad[TOP] - ePad[TOP]; - layout->iHeight = iPad[TOP] + (s - n) + iPad[BOTTOM]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; + layout->y = n - iPadY[PAD_TOP_LEFT] - ePadY[PAD_TOP_LEFT]; + layout->iHeight = iPadY[PAD_TOP_LEFT] + (s - n) + iPadY[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; } /* Expand -union elements if needed: vertical */ @@ -978,19 +999,19 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) int iExtra = extraHeight - extraHeight / 2; /* External expansion */ - layout->ePad[TOP] += eExtra; + layout->ePadY[PAD_TOP_LEFT] += eExtra; layout->y = 0; layout->eHeight += extraHeight; /* Internal expansion */ - layout->iPad[TOP] += iExtra; + layout->iPadY[PAD_TOP_LEFT] += iExtra; layout->iHeight += iExtra; } /* External expansion only: N */ else if (eLink1->flags & ELF_eEXPAND_N) { - layout->ePad[TOP] += extraHeight; + layout->ePadY[PAD_TOP_LEFT] += extraHeight; layout->y = 0; layout->eHeight += extraHeight; } @@ -998,7 +1019,7 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) /* Internal expansion only: N */ else { - layout->iPad[TOP] += extraHeight; + layout->iPadY[PAD_TOP_LEFT] += extraHeight; layout->y = 0; layout->iHeight += extraHeight; layout->eHeight += extraHeight; @@ -1015,25 +1036,25 @@ static int Style_DoLayoutV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) int iExtra = extraHeight - extraHeight / 2; /* External expansion */ - layout->ePad[BOTTOM] += eExtra; + layout->ePadY[PAD_BOTTOM_RIGHT] += eExtra; layout->eHeight += extraHeight; /* all the space */ /* Internal expansion */ - layout->iPad[BOTTOM] += iExtra; + layout->iPadY[PAD_BOTTOM_RIGHT] += iExtra; layout->iHeight += iExtra; } /* External expansion only: S */ else if (eLink1->flags & ELF_eEXPAND_S) { - layout->ePad[BOTTOM] += extraHeight; + layout->ePadY[PAD_BOTTOM_RIGHT] += extraHeight; layout->eHeight += extraHeight; } /* Internal expansion only */ else { - layout->iPad[BOTTOM] += extraHeight; + layout->iPadY[PAD_BOTTOM_RIGHT] += extraHeight; layout->iHeight += extraHeight; layout->eHeight += extraHeight; } @@ -1056,10 +1077,10 @@ static void Layout_Size(int vertical, int numLayouts, struct Layout layouts[20], struct Layout *layout = &layouts[i]; int w, n, e, s; - w = layout->x + layout->ePad[LEFT] - MAX(layout->ePad[LEFT], layout->uPad[LEFT]); - n = layout->y + layout->ePad[TOP] - MAX(layout->ePad[TOP], layout->uPad[TOP]); - e = layout->x + layout->eWidth - layout->ePad[RIGHT] + MAX(layout->ePad[RIGHT], layout->uPad[RIGHT]); - s = layout->y + layout->eHeight - layout->ePad[BOTTOM] + MAX(layout->ePad[BOTTOM], layout->uPad[BOTTOM]); + w = layout->x + layout->ePadX[PAD_TOP_LEFT] - MAX(layout->ePadX[PAD_TOP_LEFT], layout->uPadX[PAD_TOP_LEFT]); + n = layout->y + layout->ePadY[PAD_TOP_LEFT] - MAX(layout->ePadY[PAD_TOP_LEFT], layout->uPadY[PAD_TOP_LEFT]); + e = layout->x + layout->eWidth - layout->ePadX[PAD_BOTTOM_RIGHT] + MAX(layout->ePadX[PAD_BOTTOM_RIGHT], layout->uPadX[PAD_BOTTOM_RIGHT]); + s = layout->y + layout->eHeight - layout->ePadY[PAD_BOTTOM_RIGHT] + MAX(layout->ePadY[PAD_BOTTOM_RIGHT], layout->uPadY[PAD_BOTTOM_RIGHT]); if (vertical) { @@ -1090,7 +1111,7 @@ void Style_DoLayoutNeededV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) Style *style = (Style *) drawArgs->style; Style *masterStyle = style->master; ElementLink *eLinks1, *eLinks2, *eLink1, *eLink2; - int *ePad, *iPad, *uPad; + int *ePadY, *iPadY, *uPadY; int i; int y = 0; @@ -1105,9 +1126,9 @@ void Style_DoLayoutNeededV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) eLink1 = &eLinks1[i]; eLink2 = &eLinks2[i]; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadY = eLink1->ePadY; + iPadY = eLink1->iPadY; + uPadY = layout->uPadY; /* The size of a -union element is determined by the elements * it surrounds */ @@ -1118,9 +1139,9 @@ void Style_DoLayoutNeededV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (eLink1->flags & ELF_DETACH) continue; - layout->y = MAX(y, abs(ePad[TOP] - MAX(ePad[TOP], uPad[TOP]))); - layout->iHeight = iPad[TOP] + layout->useHeight + iPad[BOTTOM]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; + layout->y = MAX(y, abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT]))); + layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; if (masterStyle->vertical) y = layout->y + layout->eHeight; @@ -1137,13 +1158,13 @@ void Style_DoLayoutNeededV(StyleDrawArgs *drawArgs, struct Layout layouts[20]) if (!(eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadY = eLink1->ePadY; + iPadY = eLink1->iPadY; + uPadY = layout->uPadY; - layout->y = abs(ePad[TOP] - MAX(ePad[TOP], uPad[TOP])); - layout->iHeight = iPad[TOP] + layout->useHeight + iPad[BOTTOM]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; + layout->y = abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT])); + layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; } } @@ -1263,8 +1284,8 @@ static void Style_NeededSize(TreeCtrl *tree, Style *style, int state, int *width Style *masterStyle = style->master; ElementLink *eLinks1, *eLinks2, *eLink1, *eLink2; struct Layout layouts[20]; - int *ePad, *iPad, *uPad; - int i, j, k; + int *ePadX, *iPadX, *uPadX, *ePadY, *iPadY, *uPadY; + int i, j; int x = 0, y = 0; if (style->master != NULL) @@ -1283,8 +1304,10 @@ static void Style_NeededSize(TreeCtrl *tree, Style *style, int state, int *width struct Layout *layout = &layouts[i]; /* No -union padding yet */ - for (j = 0; j < 4; j++) - layout->uPad[j] = 0; + layout->uPadX[PAD_TOP_LEFT] = 0; + layout->uPadX[PAD_BOTTOM_RIGHT] = 0; + layout->uPadY[PAD_TOP_LEFT] = 0; + layout->uPadY[PAD_BOTTOM_RIGHT] = 0; } /* Figure out the padding around elements surrounded by -union elements */ @@ -1295,16 +1318,21 @@ static void Style_NeededSize(TreeCtrl *tree, Style *style, int state, int *width if (eLink1->onion == NULL) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; + ePadX = eLink1->ePadX; + ePadY = eLink1->ePadY; + iPadX = eLink1->iPadX; + iPadY = eLink1->iPadY; for (j = 0; j < eLink1->onionCount; j++) { struct Layout *layout = &layouts[eLink1->onion[j]]; - uPad = layout->uPad; - for (k = 0; k < 4; k++) - uPad[k] = MAX(uPad[k], iPad[k] + ePad[k]); + uPadX = layout->uPadX; + uPadY = layout->uPadY; + uPadX[PAD_TOP_LEFT] = MAX(uPadX[PAD_TOP_LEFT], iPadX[PAD_TOP_LEFT] + ePadX[PAD_TOP_LEFT]); + uPadX[PAD_BOTTOM_RIGHT] = MAX(uPadX[PAD_BOTTOM_RIGHT], iPadX[PAD_BOTTOM_RIGHT] + ePadX[PAD_BOTTOM_RIGHT]); + uPadY[PAD_TOP_LEFT] = MAX(uPadY[PAD_TOP_LEFT], iPadY[PAD_TOP_LEFT] + ePadY[PAD_TOP_LEFT]); + uPadY[PAD_BOTTOM_RIGHT] = MAX(uPadY[PAD_BOTTOM_RIGHT], iPadY[PAD_BOTTOM_RIGHT] + ePadY[PAD_BOTTOM_RIGHT]); } } @@ -1316,17 +1344,26 @@ static void Style_NeededSize(TreeCtrl *tree, Style *style, int state, int *width eLink1 = &eLinks1[i]; eLink2 = &eLinks2[i]; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadX = eLink1->ePadX; + ePadY = eLink1->ePadY; + iPadX = eLink1->iPadX; + iPadY = eLink1->iPadY; + uPadX = layout->uPadX; + uPadY = layout->uPadY; /* The size of a -union element is determined by the elements * it surrounds */ if (eLink1->onion != NULL) { layout->x = layout->y = layout->eWidth = layout->eHeight = 0; - for (j = 0; j < 4; j++) - layout->ePad[j] = layout->iPad[j] = 0; + layout->ePadX[PAD_TOP_LEFT] = 0; + layout->ePadX[PAD_BOTTOM_RIGHT] = 0; + layout->ePadY[PAD_TOP_LEFT] = 0; + layout->ePadY[PAD_BOTTOM_RIGHT] = 0; + layout->iPadX[PAD_TOP_LEFT] = 0; + layout->iPadX[PAD_BOTTOM_RIGHT] = 0; + layout->iPadY[PAD_TOP_LEFT] = 0; + layout->iPadY[PAD_BOTTOM_RIGHT] = 0; continue; } @@ -1362,16 +1399,19 @@ static void Style_NeededSize(TreeCtrl *tree, Style *style, int state, int *width continue; layout->eLink = eLink2; - layout->x = MAX(x, abs(ePad[LEFT] - MAX(ePad[LEFT], uPad[LEFT]))); - layout->y = MAX(y, abs(ePad[TOP] - MAX(ePad[TOP], uPad[TOP]))); - layout->iWidth = iPad[LEFT] + layout->useWidth + iPad[RIGHT]; - layout->iHeight = iPad[TOP] + layout->useHeight + iPad[BOTTOM]; - layout->eWidth = ePad[LEFT] + layout->iWidth + ePad[RIGHT]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; - for (j = 0; j < 4; j++) + layout->x = MAX(x, abs(ePadX[PAD_TOP_LEFT] - MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT]))); + layout->y = MAX(y, abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT]))); + layout->iWidth = iPadX[PAD_TOP_LEFT] + layout->useWidth + iPadX[PAD_BOTTOM_RIGHT]; + layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; + layout->eWidth = ePadX[PAD_TOP_LEFT] + layout->iWidth + ePadX[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; + + for (j = 0; j < 2; j++) { - layout->ePad[j] = ePad[j]; - layout->iPad[j] = iPad[j]; + layout->ePadX[j] = eLink1->ePadX[j]; + layout->ePadY[j] = eLink1->ePadY[j]; + layout->iPadX[j] = eLink1->iPadX[j]; + layout->iPadY[j] = eLink1->iPadY[j]; } if (masterStyle->vertical) @@ -1391,22 +1431,28 @@ static void Style_NeededSize(TreeCtrl *tree, Style *style, int state, int *width if (!(eLink1->flags & ELF_DETACH) || (eLink1->onion != NULL)) continue; - ePad = eLink1->ePad; - iPad = eLink1->iPad; - uPad = layout->uPad; + ePadX = eLink1->ePadX; + ePadY = eLink1->ePadY; + iPadX = eLink1->iPadX; + iPadY = eLink1->iPadY; + uPadX = layout->uPadX; + uPadY = layout->uPadY; layout->eLink = eLink2; layout->master = eLink1; - layout->x = abs(ePad[LEFT] - MAX(ePad[LEFT], uPad[LEFT])); - layout->y = abs(ePad[TOP] - MAX(ePad[TOP], uPad[TOP])); - layout->iWidth = iPad[LEFT] + layout->useWidth + iPad[RIGHT]; - layout->iHeight = iPad[TOP] + layout->useHeight + iPad[BOTTOM]; - layout->eWidth = ePad[LEFT] + layout->iWidth + ePad[RIGHT]; - layout->eHeight = ePad[TOP] + layout->iHeight + ePad[BOTTOM]; - for (j = 0; j < 4; j++) + layout->x = abs(ePadX[PAD_TOP_LEFT] - MAX(ePadX[PAD_TOP_LEFT], uPadX[PAD_TOP_LEFT])); + layout->y = abs(ePadY[PAD_TOP_LEFT] - MAX(ePadY[PAD_TOP_LEFT], uPadY[PAD_TOP_LEFT])); + layout->iWidth = iPadX[PAD_TOP_LEFT] + layout->useWidth + iPadX[PAD_BOTTOM_RIGHT]; + layout->iHeight = iPadY[PAD_TOP_LEFT] + layout->useHeight + iPadY[PAD_BOTTOM_RIGHT]; + layout->eWidth = ePadX[PAD_TOP_LEFT] + layout->iWidth + ePadX[PAD_BOTTOM_RIGHT]; + layout->eHeight = ePadY[PAD_TOP_LEFT] + layout->iHeight + ePadY[PAD_BOTTOM_RIGHT]; + + for (j = 0; j < 2; j++) { - layout->ePad[j] = ePad[j]; - layout->iPad[j] = iPad[j]; + layout->ePadX[j] = eLink1->ePadX[j]; + layout->ePadY[j] = eLink1->ePadY[j]; + layout->iPadX[j] = eLink1->iPadX[j]; + layout->iPadY[j] = eLink1->iPadY[j]; } } @@ -1516,14 +1562,14 @@ void TreeStyle_Draw(StyleDrawArgs *drawArgs) if ((layout->iWidth > 0) && (layout->iHeight > 0)) { args.elem = layout->eLink->elem; - args.display.x = drawArgs->x + layout->x + layout->ePad[LEFT]; - args.display.y = drawArgs->y + layout->y + layout->ePad[TOP]; + args.display.x = drawArgs->x + layout->x + layout->ePadX[PAD_TOP_LEFT]; + args.display.y = drawArgs->y + layout->y + layout->ePadY[PAD_TOP_LEFT]; args.display.width = layout->iWidth; args.display.height = layout->iHeight; - args.display.pad[LEFT] = layout->iPad[LEFT]; - args.display.pad[TOP] = layout->iPad[TOP]; - args.display.pad[RIGHT] = layout->iPad[RIGHT]; - args.display.pad[BOTTOM] = layout->iPad[BOTTOM]; + args.display.pad[LEFT] = layout->iPadX[PAD_TOP_LEFT]; + args.display.pad[TOP] = layout->iPadY[PAD_TOP_LEFT]; + args.display.pad[RIGHT] = layout->iPadX[PAD_BOTTOM_RIGHT]; + args.display.pad[BOTTOM] = layout->iPadY[PAD_BOTTOM_RIGHT]; if (debugDraw) { XColor *color[3]; @@ -1549,8 +1595,8 @@ void TreeStyle_Draw(StyleDrawArgs *drawArgs) /* external */ XFillRectangle(tree->display, args.display.drawable, gc[2], - args.display.x - layout->ePad[LEFT], - args.display.y - layout->ePad[TOP], + args.display.x - layout->ePadX[PAD_TOP_LEFT], + args.display.y - layout->ePadY[PAD_TOP_LEFT], layout->eWidth, layout->eHeight); /* internal */ XFillRectangle(tree->display, args.display.drawable, @@ -1561,8 +1607,8 @@ void TreeStyle_Draw(StyleDrawArgs *drawArgs) if (!layout->master->onion && !(layout->master->flags & ELF_DETACH)) XFillRectangle(tree->display, args.display.drawable, gc[0], - args.display.x + layout->iPad[LEFT], - args.display.y + layout->iPad[TOP], + args.display.x + layout->iPadX[PAD_TOP_LEFT], + args.display.y + layout->iPadY[PAD_TOP_LEFT], layout->eLink->neededWidth, layout->eLink->neededHeight); } else @@ -1580,14 +1626,14 @@ void TreeStyle_Draw(StyleDrawArgs *drawArgs) if (layout->iWidth > 0 && layout->iHeight > 0) { args.elem = layout->eLink->elem; - args.display.x = drawArgs->x + layout->x + layout->ePad[LEFT]; - args.display.y = drawArgs->y + layout->y + layout->ePad[TOP]; + args.display.x = drawArgs->x + layout->x + layout->ePadX[PAD_TOP_LEFT]; + args.display.y = drawArgs->y + layout->y + layout->ePadY[PAD_TOP_LEFT]; args.display.width = layout->iWidth; args.display.height = layout->iHeight; - args.display.pad[LEFT] = layout->iPad[LEFT]; - args.display.pad[TOP] = layout->iPad[TOP]; - args.display.pad[RIGHT] = layout->iPad[RIGHT]; - args.display.pad[BOTTOM] = layout->iPad[BOTTOM]; + args.display.pad[LEFT] = layout->iPadX[PAD_TOP_LEFT]; + args.display.pad[TOP] = layout->iPadY[PAD_TOP_LEFT]; + args.display.pad[RIGHT] = layout->iPadX[PAD_BOTTOM_RIGHT]; + args.display.pad[BOTTOM] = layout->iPadY[PAD_BOTTOM_RIGHT]; { XColor *color[3]; GC gc[3]; @@ -1600,8 +1646,8 @@ void TreeStyle_Draw(StyleDrawArgs *drawArgs) /* external */ XDrawRectangle(tree->display, args.display.drawable, gc[0], - args.display.x - layout->ePad[LEFT], - args.display.y - layout->ePad[TOP], + args.display.x - layout->ePadX[PAD_TOP_LEFT], + args.display.y - layout->ePadY[PAD_TOP_LEFT], layout->eWidth - 1, layout->eHeight - 1); /* internal */ XDrawRectangle(tree->display, args.display.drawable, @@ -2722,14 +2768,12 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, Style *style; Element *elem; ElementLink *eLink; - int i, index, pad; - static CONST char *optionNames[] = { "-padw", "-padn", "-pade", - "-pads", "-ipadw", "-ipadn", "-ipade", - "-ipads", "-expand", "-union", "-detach", "-iexpand", + int i, index; + static CONST char *optionNames[] = { "-padx", "-pady", "-ipadx", + "-ipady", "-expand", "-union", "-detach", "-iexpand", "-squeeze", (char *) NULL }; - enum { OPTION_PADLEFT, OPTION_PADTOP, OPTION_PADRIGHT, - OPTION_PADBOTTOM, OPTION_iPADLEFT, OPTION_iPADTOP, - OPTION_iPADRIGHT, OPTION_iPADBOTTOM, OPTION_EXPAND, + enum { OPTION_PADX, OPTION_PADY, OPTION_iPADX, OPTION_iPADY, + OPTION_EXPAND, OPTION_UNION, OPTION_DETACH, OPTION_iEXPAND, OPTION_SQUEEZE }; if (objc < 5) @@ -2760,22 +2804,14 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *listObj = Tcl_NewListObj(0, NULL); Tcl_Obj *unionObj = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-padw", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->ePad[LEFT])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-padn", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->ePad[TOP])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-pade", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->ePad[RIGHT])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-pads", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->ePad[BOTTOM])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-ipadw", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->iPad[LEFT])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-ipadn", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->iPad[TOP])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-ipade", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->iPad[RIGHT])); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-ipads", -1)); - Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->iPad[BOTTOM])); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-padx", -1)); + Tcl_ListObjAppendElement(interp, listObj, TreeCtrl_NewPadAmountObj(eLink->ePadX)); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-pady", -1)); + Tcl_ListObjAppendElement(interp, listObj, TreeCtrl_NewPadAmountObj(eLink->ePadY)); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-ipadx", -1)); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->iPadX[PAD_TOP_LEFT])); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewStringObj("-ipady", -1)); + Tcl_ListObjAppendElement(interp, listObj, Tcl_NewIntObj(eLink->iPadY[PAD_TOP_LEFT])); n = 0; if (eLink->flags & ELF_eEXPAND_W) flags[n++] = 'w'; @@ -2822,20 +2858,24 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, return TCL_ERROR; switch (index) { - case OPTION_PADLEFT: - case OPTION_PADTOP: - case OPTION_PADRIGHT: - case OPTION_PADBOTTOM: + case OPTION_PADX: + { + objPtr = TreeCtrl_NewPadAmountObj(eLink->ePadX); + break; + } + case OPTION_PADY: { - objPtr = Tcl_NewIntObj(eLink->ePad[index - OPTION_PADLEFT]); + objPtr = TreeCtrl_NewPadAmountObj(eLink->ePadY); break; } - case OPTION_iPADLEFT: - case OPTION_iPADTOP: - case OPTION_iPADRIGHT: - case OPTION_iPADBOTTOM: + case OPTION_iPADX: { - objPtr = Tcl_NewIntObj(eLink->iPad[index - OPTION_iPADLEFT]); + objPtr = TreeCtrl_NewPadAmountObj(eLink->iPadX); + break; + } + case OPTION_iPADY: + { + objPtr = TreeCtrl_NewPadAmountObj(eLink->iPadY); break; } case OPTION_DETACH: @@ -2913,24 +2953,40 @@ static int StyleLayoutCmd(ClientData clientData, Tcl_Interp *interp, int objc, } switch (index) { - case OPTION_PADLEFT: - case OPTION_PADTOP: - case OPTION_PADRIGHT: - case OPTION_PADBOTTOM: + case OPTION_PADX: + { + if (TreeCtrl_GetPadAmountFromObj(interp, + tree->tkwin, objv[i + 1], + &eLink->ePadX[PAD_TOP_LEFT], + &eLink->ePadX[PAD_BOTTOM_RIGHT]) != TCL_OK) + return TCL_ERROR; + break; + } + case OPTION_PADY: + { + if (TreeCtrl_GetPadAmountFromObj(interp, + tree->tkwin, objv[i + 1], + &eLink->ePadY[PAD_TOP_LEFT], + &eLink->ePadY[PAD_BOTTOM_RIGHT]) != TCL_OK) + return TCL_ERROR; + break; + } + case OPTION_iPADX: { - if (Tk_GetPixelsFromObj(interp, tree->tkwin, objv[i + 1], &pad) != TCL_OK) + if (TreeCtrl_GetPadAmountFromObj(interp, + tree->tkwin, objv[i + 1], + &eLink->iPadX[PAD_TOP_LEFT], + &eLink->iPadX[PAD_BOTTOM_RIGHT]) != TCL_OK) return TCL_ERROR; - eLink->ePad[index - OPTION_PADLEFT] = pad; break; } - case OPTION_iPADLEFT: - case OPTION_iPADTOP: - case OPTION_iPADRIGHT: - case OPTION_iPADBOTTOM: + case OPTION_iPADY: { - if (Tk_GetPixelsFromObj(interp, tree->tkwin, objv[i + 1], &pad) != TCL_OK) + if (TreeCtrl_GetPadAmountFromObj(interp, + tree->tkwin, objv[i + 1], + &eLink->iPadY[PAD_TOP_LEFT], + &eLink->iPadY[PAD_BOTTOM_RIGHT]) != TCL_OK) return TCL_ERROR; - eLink->iPad[index - OPTION_iPADLEFT] = pad; break; } case OPTION_DETACH: @@ -3360,8 +3416,8 @@ char *TreeStyle_Identify(StyleDrawArgs *drawArgs, int x, int y) { struct Layout *layout = &layouts[i]; eLink = layout->eLink; - if ((x >= layout->x + layout->ePad[LEFT]) && (x < layout->x + layout->ePad[LEFT] + layout->iWidth) && - (y >= layout->y + layout->ePad[TOP]) && (y < layout->y + layout->ePad[TOP] + layout->iHeight)) + if ((x >= layout->x + layout->ePadX[PAD_TOP_LEFT]) && (x < layout->x + layout->ePadX[PAD_TOP_LEFT] + layout->iWidth) && + (y >= layout->y + layout->ePadY[PAD_TOP_LEFT]) && (y < layout->y + layout->ePadY[PAD_TOP_LEFT] + layout->iHeight)) { return (char *) eLink->elem->name; } @@ -3397,10 +3453,10 @@ void TreeStyle_Identify2(StyleDrawArgs *drawArgs, { struct Layout *layout = &layouts[i]; eLink = layout->eLink; - if ((drawArgs->x + layout->x + layout->ePad[LEFT] < x2) && - (drawArgs->x + layout->x + layout->ePad[LEFT] + layout->iWidth > x1) && - (drawArgs->y + layout->y + layout->ePad[TOP] < y2) && - (drawArgs->y + layout->y + layout->ePad[TOP] + layout->iHeight > y1)) + if ((drawArgs->x + layout->x + layout->ePadX[PAD_TOP_LEFT] < x2) && + (drawArgs->x + layout->x + layout->ePadX[PAD_TOP_LEFT] + layout->iWidth > x1) && + (drawArgs->y + layout->y + layout->ePadY[PAD_TOP_LEFT] < y2) && + (drawArgs->y + layout->y + layout->ePadY[PAD_TOP_LEFT] + layout->iHeight > y1)) { Tcl_ListObjAppendElement(drawArgs->tree->interp, listObj, Tcl_NewStringObj(eLink->elem->name, -1)); @@ -3614,8 +3670,8 @@ int TreeStyle_GetElemRects(StyleDrawArgs *drawArgs, int objc, if (j == objc) continue; } - rects[count].x = drawArgs->x + layout->x + layout->ePad[LEFT]; - rects[count].y = drawArgs->y + layout->y + layout->ePad[TOP]; + rects[count].x = drawArgs->x + layout->x + layout->ePadX[PAD_TOP_LEFT]; + rects[count].y = drawArgs->y + layout->y + layout->ePadY[PAD_TOP_LEFT]; rects[count].width = layout->iWidth; rects[count].height = layout->iHeight; count++; diff --git a/generic/tkTreeUtils.c b/generic/tkTreeUtils.c index f03de2d..75a245a 100644 --- a/generic/tkTreeUtils.c +++ b/generic/tkTreeUtils.c @@ -3,6 +3,37 @@ #include "tkWinInt.h" #endif +/* + * Forward declarations for procedures defined later in this file: + */ + +static int PadAmountOptionSet _ANSI_ARGS_((ClientData clientData, + Tcl_Interp *interp, Tk_Window tkwin, + Tcl_Obj **value, char *recordPtr, int internalOffset, + char *saveInternalPtr, int flags)); +static Tcl_Obj *PadAmountOptionGet _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *recordPtr, int internalOffset)); +static void PadAmountOptionRestore _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *internalPtr, + char *saveInternalPtr)); +static void PadAmountOptionFree _ANSI_ARGS_((ClientData clientData, + Tk_Window tkwin, char *internalPtr)); + +/* + * The following Tk_ObjCustomOption structure can be used as clientData entry + * of a Tk_OptionSpec record with a TK_OPTION_CUSTOM type in the form + * "(ClientData) &PadAmountOption"; the option will then parse list with + * one or two screen distances. + */ + +Tk_ObjCustomOption PadAmountOption = { + "pad amount", + PadAmountOptionSet, + PadAmountOptionGet, + PadAmountOptionRestore, + PadAmountOptionFree +}; + void wipefree(char *memPtr, int size) { memset(memPtr, 0xAA, size); @@ -879,3 +910,235 @@ void TextLayout_Draw( chunkPtr++; } } + +/* + *---------------------------------------------------------------------- + * + * TreeCtrl_GetPadAmountFromObj -- + * + * Parse a pad amount configuration options. + * A pad amount (typically the value of an option -XXXpadx or + * -XXXpady, where XXX may be a possibly empty string) can + * be either a single pixel width, or a list of two pixel widths. + * If a single pixel width, the amount specified is used for + * padding on both sides. If two amounts are specified, then + * they specify the left/right or top/bottom padding. + * + * Results: + * Standard Tcl Result. + * + * Side effects: + * Sets internal representation of the object. In case of an error + * the result of the interpreter is modified. + * + *---------------------------------------------------------------------- + */ + +int +TreeCtrl_GetPadAmountFromObj(interp, tkwin, padObj, topLeftPtr, bottomRightPtr) + Tcl_Interp *interp; /* Interpreter for error reporting, or NULL, + * if no error message is wanted. */ + Tk_Window tkwin; /* A window. Needed by Tk_GetPixels() */ + Tcl_Obj *padObj; /* Object containing a pad amount. */ + int *topLeftPtr; /* Pointer to the location, where to store the + first component of the padding. */ + int *bottomRightPtr; /* Pointer to the location, where to store the + second component of the padding. */ +{ + int padc; /* Number of element objects in padv. */ + Tcl_Obj **padv; /* Pointer to the element objects of the + * parsed pad amount value. */ + + if (Tcl_ListObjGetElements(interp, padObj, &padc, &padv) != TCL_OK) { + return TCL_ERROR; + } + + /* + * The value specifies a non empty string. + * Check that this string is indeed a valid pad amount. + */ + + if (padc < 1 || padc > 2) { + if (interp != NULL) { + error: + Tcl_ResetResult(interp); + Tcl_AppendResult(interp, "bad pad amount \"", + Tcl_GetString(padObj), "\": must be a list of ", + "1 or 2 positive screen distances", (char *) NULL); + } + return TCL_ERROR; + } + if ((Tk_GetPixelsFromObj(interp, tkwin, padv[0], topLeftPtr) + != TCL_OK) || (*topLeftPtr < 0)) { + goto error; + } + if (padc == 2) { + if ((Tk_GetPixelsFromObj(interp, tkwin, padv[1], bottomRightPtr) + != TCL_OK) || (*bottomRightPtr < 0)) { + goto error; + } + } else { + *bottomRightPtr = *topLeftPtr; + } + return TCL_OK; +} + +/* + *---------------------------------------------------------------------- + * + * TreeCtrl_NewPadAmountObj -- + * + * Create a Tcl object with an internal representation, that + * corresponds to a pad amount, i.e. an integer Tcl_Obj or a + * list Tcl_Obj with 2 elements. + * + * Results: + * The created object. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +Tcl_Obj * +TreeCtrl_NewPadAmountObj(padAmounts) + int *padAmounts; /* Internal form of a pad amount. */ +{ + Tcl_Obj *newObj; + + /* + * If both values are the same, create a list with one value, + * otherwise create a two element list with the top/left value + * first followed by the bottom/right value. + */ + + if (padAmounts[PAD_TOP_LEFT] == padAmounts[PAD_BOTTOM_RIGHT]) { + newObj = Tcl_NewIntObj(padAmounts[PAD_TOP_LEFT]); + } else { + newObj = Tcl_NewObj(); + Tcl_ListObjAppendElement((Tcl_Interp *) NULL, newObj, + Tcl_NewIntObj(padAmounts[PAD_TOP_LEFT])); + Tcl_ListObjAppendElement((Tcl_Interp *) NULL, newObj, + Tcl_NewIntObj(padAmounts[PAD_BOTTOM_RIGHT])); + } + return newObj; +} + +/* + *---------------------------------------------------------------------- + * + * PadAmountOptionSet -- + * PadAmountOptionGet -- + * PadAmountOptionRestore -- + * PadAmountOptionFree -- + * + * Handlers for object-based pad amount configuration options. + * A pad amount (typically the value of an option -XXXpadx or + * -XXXpady, where XXX may be a possibly empty string) can + * be either a single pixel width, or a list of two pixel widths. + * If a single pixel width, the amount specified is used for + * padding on both sides. If two amounts are specified, then + * they specify the left/right or top/bottom padding. + * + * Results: + * See user documentation for expected results from these functions. + * PadAmountOptionSet Standard Tcl Result. + * PadAmountOptionGet Tcl_Obj * containing a valid internal + * representation of the pad amount. + * PadAmountOptionRestore None. + * PadAmountOptionFree None. + * + * Side effects: + * Depends on the function. + * PadAmountOptionSet Sets option value to new setting, + * allocating a new integer array. + * PadAmountOptionGet Creates a new Tcl_Obj. + * PadAmountOptionRestore Resets option value to original value. + * PadAmountOptionFree Free storage for internal rep. + * + *---------------------------------------------------------------------- + */ + +static int +PadAmountOptionSet(clientData, interp, tkwin, valuePtr, recordPtr, + internalOffset, saveInternalPtr, flags) + ClientData clientData; /* unused. */ + Tcl_Interp *interp; /* Interpreter for error reporting, or NULL, + * if no error message is wanted. */ + Tk_Window tkwin; /* A window. Needed by Tk_GetPixels() */ + Tcl_Obj **valuePtr; /* The argument to "-padx", "-pady", "-ipadx", + * or "-ipady". The thing to be parsed. */ + char *recordPtr; /* Pointer to start of widget record. */ + int internalOffset; /* Offset of internal representation or + * -1, if no internal repr is wanted. */ + char *saveInternalPtr; /* Pointer to the place, where the saved + * internal form (of type "int *") resides. */ + int flags; /* Flags as specified in Tk_OptionSpec. */ +{ + int topLeft, bottomRight; /* The two components of the padding. */ + int *new; /* Pointer to the allocated array of integers + * containing the parsed pad amounts. */ + int **internalPtr; /* Pointer to the place, where the internal + * form (of type "int *") resides. */ + + /* + * Check that the given object indeed specifies a valid pad amount. + */ + + if (TreeCtrl_GetPadAmountFromObj(interp, tkwin, *valuePtr, + &topLeft, &bottomRight) != TCL_OK) { + return TCL_ERROR; + } + + /* + * Store a pointer to an allocated array of the two padding values + * into the widget record at the specified offset. + */ + + if (internalOffset >= 0) { + internalPtr = (int **) (recordPtr + internalOffset); + *(int **) saveInternalPtr = *internalPtr; + new = (int *) ckalloc(2 * sizeof(int)); + new[PAD_TOP_LEFT] = topLeft; + new[PAD_BOTTOM_RIGHT] = bottomRight; + *internalPtr = new; + } + return TCL_OK; +} + +static Tcl_Obj * +PadAmountOptionGet(clientData, tkwin, recordPtr, internalOffset) + ClientData clientData; /* unused. */ + Tk_Window tkwin; /* A window; unused. */ + char *recordPtr; /* Pointer to start of widget record. */ + int internalOffset; /* Offset of internal representation. */ +{ + int *padAmounts = *(int **)(recordPtr + internalOffset); + + return TreeCtrl_NewPadAmountObj(padAmounts); +} + +static void +PadAmountOptionRestore(clientData, tkwin, internalPtr, saveInternalPtr) + ClientData clientData; /* unused. */ + Tk_Window tkwin; /* A window; unused. */ + char *internalPtr; /* Pointer to the place, where the internal + * form (of type "int *") resides. */ + char *saveInternalPtr; /* Pointer to the place, where the saved + * internal form (of type "int *") resides. */ +{ + *(int **) internalPtr = *(int **) saveInternalPtr; +} + +static void +PadAmountOptionFree(clientData, tkwin, internalPtr) + ClientData clientData; /* unused. */ + Tk_Window tkwin; /* A window; unused */ + char *internalPtr; /* Pointer to the place, where the internal + * form (of type "int *") resides. */ +{ + if (*(int **)internalPtr != NULL) { + ckfree((char *) *(int **)internalPtr); + } +} diff --git a/tests/column.test b/tests/column.test index efb3752..4e056bf 100644 --- a/tests/column.test +++ b/tests/column.test @@ -10,7 +10,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# CVS: @(#) $Id: column.test,v 1.1 2002/12/30 21:42:19 krischan Exp $ +# CVS: @(#) $Id: column.test,v 1.2 2003/01/02 02:27:50 treectrl Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 @@ -90,11 +90,11 @@ test column-3.2 {column configure: invalid column} -body { test column-3.3 {column configure: list all options} -body { .t column configure column1 -} -result {{-arrow {} {} none none} {-arrowside {} {} right right} {-arrowgravity {} {} left left} {-arrowpade {} {} 6 6} {-arrowpadw {} {} 6 6} {-bitmap {} {} {} {}} {-background {} {} #d9d9d9 #d9d9d9} {-borderwidth {} {} 2 2} {-button {} {} 1 1} {-expand {} {} 0 0} {-font {} {} {} {}} {-image {} {} {} {}} {-imagepade {} {} 6 6} {-imagepadn {} {} 0 0} {-imagepads {} {} 0 0} {-imagepadw {} {} 6 6} {-itembackground {} {} {} {}} {-justify {} {} left left} {-minwidth {} {} {} {}} {-relief {} {} raised raised} {-stepwidth {} {} {} {}} {-sunken {} {} 0 0} {-tag {} {} {} column1} {-text {} {} {} {}} {-textcolor {} {} Black Black} {-textpade {} {} 6 6} {-textpadn {} {} 0 0} {-textpads {} {} 0 0} {-textpadw {} {} 6 6} {-width {} {} {} {}} {-visible {} {} 1 1} {-widthhack {} {} 0 0}} +} -result {{-arrow {} {} none none} {-arrowside {} {} right right} {-arrowgravity {} {} left left} {-arrowpad {} {} 6 6} {-bitmap {} {} {} {}} {-background {} {} #d9d9d9 #d9d9d9} {-borderwidth {} {} 2 2} {-button {} {} 1 1} {-expand {} {} 0 0} {-font {} {} {} {}} {-image {} {} {} {}} {-imagepadx {} {} 6 6} {-imagepady {} {} 0 0} {-itembackground {} {} {} {}} {-justify {} {} left left} {-minwidth {} {} {} {}} {-relief {} {} raised raised} {-stepwidth {} {} {} {}} {-sunken {} {} 0 0} {-tag {} {} {} column1} {-text {} {} {} {}} {-textcolor {} {} Black Black} {-textpadx {} {} 6 6} {-textpady {} {} 0 0} {-width {} {} {} {}} {-visible {} {} 1 1} {-widthhack {} {} 0 0}} test column-3.4 {column configure: tail column} -body { .t column configure tail -} -result {{-arrow {} {} none none} {-arrowside {} {} right right} {-arrowgravity {} {} left left} {-arrowpade {} {} 6 6} {-arrowpadw {} {} 6 6} {-bitmap {} {} {} {}} {-background {} {} #d9d9d9 #d9d9d9} {-borderwidth {} {} 2 2} {-button {} {} 1 1} {-expand {} {} 0 0} {-font {} {} {} {}} {-image {} {} {} {}} {-imagepade {} {} 6 6} {-imagepadn {} {} 0 0} {-imagepads {} {} 0 0} {-imagepadw {} {} 6 6} {-itembackground {} {} {} {}} {-justify {} {} left left} {-minwidth {} {} {} {}} {-relief {} {} raised raised} {-stepwidth {} {} {} {}} {-sunken {} {} 0 0} {-tag {} {} {} tail} {-text {} {} {} {}} {-textcolor {} {} Black Black} {-textpade {} {} 6 6} {-textpadn {} {} 0 0} {-textpads {} {} 0 0} {-textpadw {} {} 6 6} {-width {} {} {} {}} {-visible {} {} 1 1} {-widthhack {} {} 0 0}} +} -result {{-arrow {} {} none none} {-arrowside {} {} right right} {-arrowgravity {} {} left left} {-arrowpad {} {} 6 6} {-bitmap {} {} {} {}} {-background {} {} #d9d9d9 #d9d9d9} {-borderwidth {} {} 2 2} {-button {} {} 1 1} {-expand {} {} 0 0} {-font {} {} {} {}} {-image {} {} {} {}} {-imagepadx {} {} 6 6} {-imagepady {} {} 0 0} {-itembackground {} {} {} {}} {-justify {} {} left left} {-minwidth {} {} {} {}} {-relief {} {} raised raised} {-stepwidth {} {} {} {}} {-sunken {} {} 0 0} {-tag {} {} {} tail} {-text {} {} {} {}} {-textcolor {} {} Black Black} {-textpadx {} {} 6 6} {-textpady {} {} 0 0} {-width {} {} {} {}} {-visible {} {} 1 1} {-widthhack {} {} 0 0}} test column-3.5 {column configure: invalid -arrow} -body { .t column configure column1 -arrow straight @@ -123,14 +123,22 @@ test column-3.10 {column configure/cget: -arrowgravity} -body { .t column cget column1 -arrowgravity } -result {right} -test column-3.11 {column configure: invalid -arrowpadw} -body { - .t column configure column1 -arrowpadw x -} -returnCodes error -result {bad screen distance "x"} +test column-3.11 {column configure: invalid -arrowpad} -body { + .t column configure column1 -arrowpad x +} -returnCodes error -result {bad pad amount "x": must be a list of 1 or 2 positive screen distances} + +test column-3.11a {column configure: invalid 2 element -arrowpad} -body { + .t column configure column1 -arrowpad {3 x} +} -returnCodes error -result {bad pad amount "3 x": must be a list of 1 or 2 positive screen distances} -test column-3.12 {column configure/cget: -arrowpadw/e} -body { - .t column configure column1 -arrowpadw 8 -arrowpade 5 - list [.t column cget column1 -arrowpadw] \ - [.t column cget column1 -arrowpade] +test column-3.12 {column configure/cget: -arrowpad} -body { + .t column configure column1 -arrowpad 8 + .t column cget column1 -arrowpad +} -result {8} + +test column-3.12a {column configure/cget: 2 element -arrowpad} -body { + .t column configure column1 -arrowpad {8 5} + .t column cget column1 -arrowpad } -result {8 5} test column-3.13 {column configure: invalid -bitmap} -body { @@ -187,16 +195,26 @@ test column-3.24 {column configure/cget: -image} -body { .t column cget column1 -image } -result {emptyImg} -test column-3.25 {column configure: invalid -imagepade} -body { - .t column configure column1 -imagepade y -} -returnCodes error -result {bad screen distance "y"} +test column-3.25 {column configure: invalid -imagepadx} -body { + .t column configure column1 -imagepadx y +} -returnCodes error -result {bad pad amount "y": must be a list of 1 or 2 positive screen distances} + +test column-3.25a {column configure: invalid 2 element -imagepadx} -body { + .t column configure column1 -imagepadx "y \{" +} -returnCodes error -result {unmatched open brace in list} -test column-3.26 {column configure/cget: -imagepadw/e} -body { - .t column configure column1 -imagepadw 9 -imagepade 4 - list [.t column cget column1 -imagepadw] \ - [.t column cget column1 -imagepade] +test column-3.26 {column configure/cget: -imagepadx} -body { + .t column configure column1 -imagepadx 9 -imagepady 4 + list [.t column cget column1 -imagepadx] \ + [.t column cget column1 -imagepady] } -result {9 4} +test column-3.26a {column configure/cget: 2 element -imagepadx/y} -body { + .t column configure column1 -imagepadx {9 0} -imagepady {4 3} + list [.t column cget column1 -imagepadx] \ + [.t column cget column1 -imagepady] +} -result {{9 0} {4 3}} + test column-3.27 {column configure: invalid -itembackground} -body { .t column configure column1 -itembackground no } -returnCodes error -result {unknown color name "no"} @@ -265,16 +283,26 @@ test column-3.41 {column configure: -text} -body { .t column cget column1 -text } -result {Text above Column 1} -test column-3.42 {column configure: invalid -textpadw} -body { - .t column configure column1 -textpadw baz -} -returnCodes error -result {bad screen distance "baz"} +test column-3.42 {column configure: invalid -textpadx} -body { + .t column configure column1 -textpadx baz +} -returnCodes error -result {bad pad amount "baz": must be a list of 1 or 2 positive screen distances} + +test column-3.42a {column configure: invalid 2 element -textpadx} -body { + .t column configure column1 -textpadx {foo bar baz} +} -returnCodes error -result {bad pad amount "foo bar baz": must be a list of 1 or 2 positive screen distances} -test column-3.43 {column configure/cget: -textpadw/e} -body { - .t column configure column1 -textpadw 8 -textpade 5 - list [.t column cget column1 -textpadw] \ - [.t column cget column1 -textpade] +test column-3.43 {column configure/cget: -textpadx/y} -body { + .t column configure column1 -textpadx 8 -textpady 5 + list [.t column cget column1 -textpadx] \ + [.t column cget column1 -textpady] } -result {8 5} +test column-3.43a {column configure/cget: 2 element -textpadx/y} -body { + .t column configure column1 -textpadx {8 4} -textpady {4 5} + list [.t column cget column1 -textpadx] \ + [.t column cget column1 -textpady] +} -result {{8 4} {4 5}} + test column-3.44 {column configure: invalid -width} -body { .t column configure column1 -width all } -returnCodes error -result {bad screen distance "all"} diff --git a/tests/style.test b/tests/style.test index f6c0482..ca4e83c 100644 --- a/tests/style.test +++ b/tests/style.test @@ -10,7 +10,7 @@ # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # -# CVS: @(#) $Id: style.test,v 1.1 2002/12/30 21:42:22 krischan Exp $ +# CVS: @(#) $Id: style.test,v 1.2 2003/01/02 02:27:50 treectrl Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 @@ -125,57 +125,74 @@ test style-6.1 {style layout: missing args} -body { test style-6.2 {style layout: no options specified} -body { .t style layout testStyle eText -} -result {-padw 0 -padn 0 -pade 0 -pads 0 -ipadw 0 -ipadn 0 -ipade 0 -ipads 0 -expand {} -iexpand {} -detach no -squeeze {} -union {}} +} -result {-padx 0 -pady 0 -ipadx 0 -ipady 0 -expand {} -iexpand {} -detach no -squeeze {} -union {}} -test style-6.3 {style layout: option -pads} -body { - .t style layout testStyle eText -pads 3 - .t style layout testStyle eText -pads +test style-6.3 {style layout: option -padx} -body { + .t style layout testStyle eText -padx 3 + .t style layout testStyle eText -padx } -result {3} -test style-6.4 {style layout: option -expand} -body { +test style-6.4 {style layout: invalid 2 element -pady} -body { + .t style layout testStyle eText -pady {3 ""} +} -returnCodes error -result {bad pad amount "3 """: must be a list of 1 or 2 positive screen distances} + +test style-6.5 {style layout: invalid 2 element -pady} -body { + .t style layout testStyle eText -pady "\{" +} -returnCodes error -result {unmatched open brace in list} + +test style-6.6 {style layout: invalid 2 element -pady} -body { + .t style layout testStyle eText -pady {3 -7} +} -returnCodes error -result {bad pad amount "3 -7": must be a list of 1 or 2 positive screen distances} + +test style-6.7 {style layout: invalid 2 element -pady} -body { + .t style layout testStyle eText -pady {3 7} + .t style layout testStyle eText -pady +} -result {3 7} + +test style-6.8 {style layout: option -expand} -body { .t style layout testStyle eText -expand "hello world" } -returnCodes error -result {bad expand value "hello world": must be a string containing zero or more of n, e, s, and w} -test style-6.5 {style layout: option -expand} -body { +test style-6.9 {style layout: option -expand} -body { .t style layout testStyle eText -expand ew .t style layout testStyle eText -expand } -result {we} -test style-6.6 {style layout: option -squeeze} -body { +test style-6.10 {style layout: option -squeeze} -body { .t style layout testStyle eText -squeeze xyzzy } -returnCodes error -result {bad squeeze value "xyzzy": must be a string containing zero or more of x and y} -test style-6.7 {style layout: option -squeeze} -body { +test style-6.11 {style layout: option -squeeze} -body { .t style layout testStyle eText -squeeze xy .t style layout testStyle eText -squeeze } -result {xy} -test style-6.8 {style layout: option -union invalid list} -body { +test style-6.12 {style layout: option -union invalid list} -body { .t style layout testStyle eText -union "\{" } -returnCodes error -result {unmatched open brace in list} -test style-6.9 {style layout: option -union unknown elements} -body { +test style-6.13 {style layout: option -union unknown elements} -body { .t style layout testStyle eText -union {foo bar} } -returnCodes error -result {element "foo" doesn't exist} -test style-6.10 {style layout: option -union element not in style} -body { +test style-6.14 {style layout: option -union element not in style} -body { .t style layout testStyle eText -union {eBorder eRect} } -returnCodes error -result {style testStyle does not use element eRect} -test style-6.11 {style layout: option -union with itself} -body { +test style-6.15 {style layout: option -union with itself} -body { .t style layout testStyle eText -union {eBorder eText} } -returnCodes error -result {element eText can't form union with itself} -test style-6.12 {style layout: option -union} -body { +test style-6.16 {style layout: option -union} -body { .t style layout testStyle eText -union {eBorder eImage} .t style layout testStyle eText -union } -result {eBorder eImage} -test style-6.13 {style layout: option invalid -detach} -body { +test style-6.17 {style layout: option invalid -detach} -body { .t style layout testStyle eText -detach {x y} } -returnCodes error -result {expected boolean value but got "x y"} -test style-6.14 {style layout: option -detach} -body { +test style-6.18 {style layout: option -detach} -body { .t style layout testStyle eText -detach true .t style layout testStyle eText -detach } -result {1} -- cgit v0.12