home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2000 December
/
PCWorld_2000-12_cd.bin
/
Komunikace
/
Comanche
/
BWidget-1.2
/
notebook.tcl
< prev
next >
Wrap
Text File
|
2000-11-02
|
29KB
|
843 lines
# ------------------------------------------------------------------------------
# notebook.tcl
# This file is part of Unifix BWidget Toolkit
# $Id: notebook.tcl,v 1.1.1.1 1996/02/22 06:05:56 daniel Exp $
# ------------------------------------------------------------------------------
# Index of commands:
# - NoteBook::create
# - NoteBook::configure
# - NoteBook::cget
# - NoteBook::compute_size
# - NoteBook::insert
# - NoteBook::delete
# - NoteBook::itemconfigure
# - NoteBook::itemcget
# - NoteBook::raise
# - NoteBook::see
# - NoteBook::page
# - NoteBook::pages
# - NoteBook::index
# - NoteBook::getframe
# - NoteBook::_test_page
# - NoteBook::_itemconfigure
# - NoteBook::_compute_width
# - NoteBook::_get_x_page
# - NoteBook::_xview
# - NoteBook::_highlight
# - NoteBook::_select
# - NoteBook::_redraw
# - NoteBook::_draw_page
# - NoteBook::_draw_arrows
# - NoteBook::_draw_area
# - NoteBook::_resize
# - NoteBook::_realize
# ------------------------------------------------------------------------------
namespace eval NoteBook {
ArrowButton::use
namespace eval Page {
Widget::declare NoteBook::Page {
{-state Enum normal 0 {normal disabled}}
{-createcmd String "" 0}
{-raisecmd String "" 0}
{-leavecmd String "" 0}
{-image TkResource "" 0 label}
{-text String "" 0}
}
}
Widget::declare NoteBook {
{-foreground TkResource "" 0 button}
{-background TkResource "" 0 button}
{-activebackground TkResource "" 0 button}
{-activeforeground TkResource "" 0 button}
{-disabledforeground TkResource "" 0 button}
{-font TkResource "" 0 button}
{-side Enum top 1 {top bottom}}
{-homogeneous Boolean 0 0}
{-borderwidth Int 1 0 {=1 =2}}
{-width Int 0 0 {=0 ""}}
{-height Int 0 0 {=0 ""}}
{-repeatdelay BwResource "" 0 ArrowButton}
{-repeatinterval BwResource "" 0 ArrowButton}
{-fg Synonym -foreground}
{-bg Synonym -background}
{-bd Synonym -borderwidth}
}
Widget::addmap NoteBook "" :cmd {-background {}}
Widget::addmap NoteBook ArrowButton .fg \
{-foreground {} -background {} -activeforeground {} -activebackground {} \
-borderwidth {} -repeatinterval {} -repeatdelay {} -disabledforeground {}}
Widget::addmap NoteBook ArrowButton .fd \
{-foreground {} -background {} -activeforeground {} -activebackground {} \
-borderwidth {} -repeatinterval {} -repeatdelay {} -disabledforeground {}}
variable _warrow 12
proc ::NoteBook { path args } { return [eval NoteBook::create $path $args] }
proc use {} {}
}
# ------------------------------------------------------------------------------
# Command NoteBook::create
# ------------------------------------------------------------------------------
proc NoteBook::create { path args } {
variable $path
upvar 0 $path data
Widget::init NoteBook $path $args
set data(base) 0
set data(select) ""
set data(pages) {}
set data(pages) {}
set data(cpt) 0
set data(realized) 0
set data(wpage) 0
set data(hpage) [expr {[font metrics [Widget::getoption $path -font] -linespace] + 6}]
set bg [Widget::getoption $path -background]
# --- creation du canvas -----------------------------------------------------------------
set w [expr {[Widget::getoption $path -width]+4}]
set h [expr {[Widget::getoption $path -height]+$data(hpage)+4}]
canvas $path -relief flat -bd 0 -highlightthickness 0 -bg $bg -width $w -height $h
# --- creation des arrow -----------------------------------------------------------------
eval ArrowButton::create $path.fg [Widget::subcget $path .fg] \
-highlightthickness 0 \
-type button -dir left \
-armcommand [list "NoteBook::_xview $path -1"]
eval ArrowButton::create $path.fd [Widget::subcget $path .fd] \
-highlightthickness 0 \
-type button -dir right \
-armcommand [list "NoteBook::_xview $path 1"]
set col [BWidget::get3dcolor $path $bg]
set data(dbg) [lindex $col 0]
set data(lbg) [lindex $col 1]
bind $path <Configure> "NoteBook::_realize $path"
bind $path <Destroy> "NoteBook::_destroy $path"
rename $path ::$path:cmd
proc ::$path { cmd args } "return \[eval NoteBook::\$cmd $path \$args\]"
return $path
}
# ------------------------------------------------------------------------------
# Command NoteBook::configure
# ------------------------------------------------------------------------------
proc NoteBook::configure { path args } {
variable $path
upvar 0 $path data
set res [Widget::configure $path $args]
set redraw 0
if { [set chf [Widget::hasChanged $path -font font]] ||
[Widget::hasChanged $path -homogeneous foo] } {
if { $chf } {
set data(hpage) [expr {[font metrics $font -linespace] + 6}]
}
_compute_width $path
set redraw 1
}
if { [Widget::hasChanged $path -background bg] } {
set col [BWidget::get3dcolor $path $bg]
set data(dbg) [lindex $col 0]
set data(lbg) [lindex $col 1]
set redraw 1
}
if { [Widget::hasChanged $path -foreground fg] ||
[Widget::hasChanged $path -borderwidth bd] } {
set redraw 1
}
set wc [Widget::hasChanged $path -width w]
set hc [Widget::hasChanged $path -height h]
if { $wc || $hc } {
$path:cmd configure -width [expr {$w+2}] -height [expr {$h + $data(hpage)+2}]
} elseif { $redraw } {
_redraw $path
}
return $res
}
# ------------------------------------------------------------------------------
# Command NoteBook::cget
# ------------------------------------------------------------------------------
proc NoteBook::cget { path option } {
return [Widget::cget $path $option]
}
# ------------------------------------------------------------------------------
# Command NoteBook::compute_size
# ------------------------------------------------------------------------------
proc NoteBook::compute_size { path } {
variable $path
upvar 0 $path data
set wmax 0
set hmax 0
update idletasks
foreach page $data(pages) {
set w [winfo reqwidth $path.f$page]
set h [winfo reqheight $path.f$page]
set wmax [expr {$w>$wmax ? $w : $wmax}]
set hmax [expr {$h>$hmax ? $h : $hmax}]
}
configure $path -width $wmax -height $hmax
}
# ------------------------------------------------------------------------------
# Command NoteBook::insert
# ------------------------------------------------------------------------------
proc NoteBook::insert { path index page args } {
variable $path
upvar 0 $path data
if { [lsearch $data(pages) $page] != -1 } {
return -code error "page \"$page\" already exists"
}
Widget::init NoteBook::Page $path.f$page $args
set data(pages) [linsert $data(pages) $index $page]
if { ![winfo exists $path.f$page] } {
frame $path.f$page \
-relief flat -background [Widget::getoption $path -background] -borderwidth 10
set data($page,realized) 0
}
_compute_width $path
_draw_page $path $page 1
_redraw $path
return $path.f$page
}
# ------------------------------------------------------------------------------
# Command NoteBook::delete
# ------------------------------------------------------------------------------
proc NoteBook::delete { path page {destroyframe 1} } {
variable $path
upvar 0 $path data
set pos [_test_page $path $page]
set data(pages) [lreplace $data(pages) $pos $pos]
_compute_width $path
$path:cmd delete p:$page
if { $data(select) == $page } {
set data(select) ""
}
if { $pos < $data(base) } {
incr data(base) -1
}
if { $destroyframe } {
destroy $path.f$page
}
_redraw $path
}
# ------------------------------------------------------------------------------
# Command NoteBook::itemconfigure
# ------------------------------------------------------------------------------
proc NoteBook::itemconfigure { path page args } {
_test_page $path $page
_itemconfigure $path $page $args
_redraw $path
}
# ------------------------------------------------------------------------------
# Command NoteBook::itemcget
# ------------------------------------------------------------------------------
proc NoteBook::itemcget { path page option } {
_test_page $path $page
return [Widget::cget $path.f$page $option]
}
# ------------------------------------------------------------------------------
# Command NoteBook::move
# ------------------------------------------------------------------------------
proc NoteBook::move { path page index } {
variable $path
upvar 0 $path data
set pos [_test_page $path $page]
set data(pages) [linsert [lreplace $data(pages) $pos $pos] $index $page]
_redraw $path
}
# ------------------------------------------------------------------------------
# Command NoteBook::raise
# ------------------------------------------------------------------------------
proc NoteBook::raise { path {page ""} } {
variable $path
upvar 0 $path data
if { $page != "" } {
_test_page $path $page
_select $path $page
}
return $data(select)
}
# ------------------------------------------------------------------------------
# Command NoteBook::see
# ------------------------------------------------------------------------------
proc NoteBook::see { path page } {
variable $path
upvar 0 $path data
set pos [_test_page $path $page]
if { $pos < $data(base) } {
set data(base) $pos
_redraw $path
} else {
set w [expr {[winfo width $path]-1}]
set fpage [expr {[_get_x_page $path $pos] + $data($page,width) + 6}]
set idx $data(base)
while { $idx < $pos && $fpage > $w } {
set fpage [expr {$fpage - $data([lindex $data(pages) $idx],width)}]
incr idx
}
if { $idx != $data(base) } {
set data(base) $idx
_redraw $path
}
}
}
# ------------------------------------------------------------------------------
# Command NoteBook::page
# ------------------------------------------------------------------------------
proc NoteBook::page { path first {last ""} } {
variable $path
upvar 0 $path data
if { $last == "" } {
return [lindex $data(pages) $first]
} else {
return [lrange $data(pages) $first $last]
}
}
# ------------------------------------------------------------------------------
# Command NoteBook::pages
# ------------------------------------------------------------------------------
proc NoteBook::pages { path } {
variable $path
upvar 0 $path data
return $data(pages)
}
# ------------------------------------------------------------------------------
# Command NoteBook::index
# ------------------------------------------------------------------------------
proc NoteBook::index { path page } {
variable $path
upvar 0 $path data
return [lsearch $data(pages) $page]
}
# ------------------------------------------------------------------------------
# Command NoteBook::_destroy
# ------------------------------------------------------------------------------
proc NoteBook::_destroy { path } {
variable $path
upvar 0 $path data
foreach page $data(pages) {
Widget::destroy $path.f$page
}
Widget::destroy $path
unset data
rename $path {}
}
# ------------------------------------------------------------------------------
# Command NoteBook::getframe
# ------------------------------------------------------------------------------
proc NoteBook::getframe { path page } {
return $path.f$page
}
# ------------------------------------------------------------------------------
# Command NoteBook::_test_page
# ------------------------------------------------------------------------------
proc NoteBook::_test_page { path page } {
variable $path
upvar 0 $path data
if { [set pos [lsearch $data(pages) $page]] == -1 } {
return -code error "page \"$page\" does not exists"
}
return $pos
}
# ------------------------------------------------------------------------------
# Command NoteBook::_itemconfigure
# ------------------------------------------------------------------------------
proc NoteBook::_itemconfigure { path page lres } {
variable $path
upvar 0 $path data
set res [Widget::configure $path.f$page $lres]
if { [Widget::hasChanged $path.f$page -text foo] } {
_compute_width $path
} elseif { [Widget::hasChanged $path.f$page -image foo] } {
set data(hpage) [expr {[font metrics [Widget::getoption $path -font] -linespace] + 6}]
_compute_width $path
}
if { [Widget::hasChanged $path.f$page -state state] &&
$state == "disabled" && $data(select) == $page } {
set data(select) ""
}
return $res
}
# ------------------------------------------------------------------------------
# Command NoteBook::_compute_width
# ------------------------------------------------------------------------------
proc NoteBook::_compute_width { path } {
variable $path
upvar 0 $path data
set font [Widget::getoption $path -font]
set wmax 0
set hmax $data(hpage)
set wtot 0
if { ![info exists data(textid)] } {
set data(textid) [$path:cmd create text 0 -100 -font [Widget::getoption $path -font] -anchor nw]
}
set id $data(textid)
$path:cmd itemconfigure $id -font [Widget::getoption $path -font]
foreach page $data(pages) {
$path:cmd itemconfigure $id -text [Widget::getoption $path.f$page -text]
set wtext [expr {[lindex [$path:cmd bbox $id] 2]+20}]
if { [set img [Widget::getoption $path.f$page -image]] != "" } {
set wtext [expr {$wtext+[image width $img]+4}]
set himg [expr {[image height $img]+6}]
if { $himg > $hmax } {
set hmax $himg
}
}
set wmax [expr {$wtext>$wmax ? $wtext : $wmax}]
incr wtot $wtext
set data($page,width) $wtext
}
if { [Widget::getoption $path -homogeneous] } {
foreach page $data(pages) {
set data($page,width) $wmax
}
set wtot [expr {$wmax * [llength $data(pages)]}]
}
set data(hpage) $hmax
set data(wpage) $wtot
}
# ------------------------------------------------------------------------------
# Command NoteBook::_get_x_page
# ------------------------------------------------------------------------------
proc NoteBook::_get_x_page { path pos } {
variable _warrow
variable $path
upvar 0 $path data
set base $data(base)
set x [expr {$_warrow+1}]
if { $pos < $base } {
foreach page [lrange $data(pages) $pos [expr {$base-1}]] {
incr x [expr {-$data($page,width)}]
}
} elseif { $pos > $base } {
foreach page [lrange $data(pages) $base [expr {$pos-1}]] {
incr x $data($page,width)
}
}
return $x
}
# ------------------------------------------------------------------------------
# Command NoteBook::_xview
# ------------------------------------------------------------------------------
proc NoteBook::_xview { path inc } {
variable $path
upvar 0 $path data
if { $inc == -1 } {
set base [expr {$data(base)-1}]
set dx $data([lindex $data(pages) $base],width)
} else {
set dx [expr {-$data([lindex $data(pages) $data(base)],width)}]
set base [expr {$data(base)+1}]
}
if { $base >= 0 && $base < [llength $data(pages)] } {
set data(base) $base
$path:cmd move page $dx 0
_draw_area $path
_draw_arrows $path
}
}
# ------------------------------------------------------------------------------
# Command NoteBook::_highlight
# ------------------------------------------------------------------------------
proc NoteBook::_highlight { type path page } {
variable $path
upvar 0 $path data
if { ![string compare [Widget::getoption $path.f$page -state] "disabled"] } {
return
}
switch -- $type {
on {
$path:cmd itemconfigure "$page:poly" -fill [Widget::getoption $path -activebackground]
$path:cmd itemconfigure "$page:text" -fill [Widget::getoption $path -activeforeground]
}
off {
$path:cmd itemconfigure "$page:poly" -fill [Widget::getoption $path -background]
$path:cmd itemconfigure "$page:text" -fill [Widget::getoption $path -foreground]
}
}
}
# ------------------------------------------------------------------------------
# Command NoteBook::_select
# ------------------------------------------------------------------------------
proc NoteBook::_select { path page } {
variable $path
upvar 0 $path data
if { ![string compare [Widget::getoption $path.f$page -state] "normal"] } {
set oldsel $data(select)
if { [string compare $page $oldsel] } {
if { $oldsel != "" } {
if { [set cmd [Widget::getoption $path.f$oldsel -leavecmd]] != "" } {
if { [catch {uplevel \#0 $cmd} res] && $res == 0 } {
return
}
}
set data(select) ""
_draw_page $path $oldsel 0
}
set data(select) $page
if { $page != "" } {
if { !$data($page,realized) } {
set data($page,realized) 1
if { [set cmd [Widget::getoption $path.f$page -createcmd]] != "" } {
uplevel \#0 $cmd
}
}
if { [set cmd [Widget::getoption $path.f$page -raisecmd]] != "" } {
uplevel \#0 $cmd
}
_draw_page $path $page 0
}
_draw_area $path
}
}
}
# ------------------------------------------------------------------------------
# Command NoteBook::_redraw
# ------------------------------------------------------------------------------
proc NoteBook::_redraw { path } {
variable $path
upvar 0 $path data
if { !$data(realized) } {
return
}
foreach page $data(pages) {
_draw_page $path $page 0
}
_draw_area $path
_draw_arrows $path
}
# ------------------------------------------------------------------------------
# Command NoteBook::_draw_page
# ------------------------------------------------------------------------------
proc NoteBook::_draw_page { path page create } {
variable $path
upvar 0 $path data
# --- calcul des coordonnees et des couleurs de l'onglet ---------------------------------
set pos [lsearch $data(pages) $page]
set bg [Widget::getoption $path -background]
set h $data(hpage)
set xd [_get_x_page $path $pos]
set xf [expr {$xd + $data($page,width)}]
set lt [list $xd $h $xd 4 [expr {$xd+3}] 1 $xf 1]
set lb [list $xf 1 [expr {$xf+3}] 4 [expr {$xf+3}] [expr {$h-3}] [expr {$xf+6}] $h]
set img [Widget::getoption $path.f$page -image]
if { $data(select) == $page } {
set fgt $data(lbg)
set fgb $data(dbg)
set ytext [expr {$h/2-1}]
if { $img == "" } {
set xtext [expr {$xd+9}]
} else {
set ximg [expr {$xd+9}]
set xtext [expr {$ximg+[image width $img]+4}]
}
set bd [Widget::getoption $path -borderwidth]
set fg [Widget::getoption $path -foreground]
} else {
set fgt $data(dbg)
set fgb $fgt
set ytext [expr {$h/2}]
if { $img == "" } {
set xtext [expr {$xd+10}]
} else {
set ximg [expr {$xd+10}]
set xtext [expr {$ximg+[image width $img]+4}]
}
set bd 1
if { [Widget::getoption $path.f$page -state] == "normal" } {
set fg [Widget::getoption $path -foreground]
} else {
set fg [Widget::getoption $path -disabledforeground]
}
}
# --- creation ou modification de l'onglet -----------------------------------------------
if { $create } {
eval $path:cmd create polygon [concat $lt $lb] \
-tag {"page p:$page $page:poly"} \
-outline $bg \
-fill $bg
eval $path:cmd create line $lt -tags {"page p:$page $page:top top"} -fill $fgt -width $bd
eval $path:cmd create line $lb -tags {"page p:$page $page:bot bot"} -fill $fgb -width $bd
$path:cmd create text $xtext $ytext \
-text [Widget::getoption $path.f$page -text] \
-font [Widget::getoption $path -font] \
-fill $fg \
-anchor w \
-tags "page p:$page $page:text"
$path:cmd bind p:$page <ButtonPress-1> "NoteBook::_select $path $page"
$path:cmd bind p:$page <Enter> "NoteBook::_highlight on $path $page"
$path:cmd bind p:$page <Leave> "NoteBook::_highlight off $path $page"
} else {
eval $path:cmd coords "$page:poly" [concat $lt $lb]
eval $path:cmd coords "$page:top" $lt
eval $path:cmd coords "$page:bot" $lb
$path:cmd coords "$page:text" $xtext $ytext
$path:cmd itemconfigure "$page:poly" -fill $bg -outline $bg
$path:cmd itemconfigure "$page:top" -fill $fgt -width $bd
$path:cmd itemconfigure "$page:bot" -fill $fgb -width $bd
$path:cmd itemconfigure "$page:text" \
-text [Widget::getoption $path.f$page -text] \
-font [Widget::getoption $path -font] \
-fill $fg
}
if { $img != "" } {
if { [set id [$path:cmd find withtag $page:img]] == "" } {
$path:cmd create image $ximg $ytext \
-image $img \
-anchor w \
-tags "page p:$page $page:img"
} else {
$path:cmd coords $id $ximg $ytext
$path:cmd itemconfigure $id -image $img
}
} else {
$path:cmd delete $page:img
}
if { $data(select) == $page } {
$path:cmd raise p:$page
} elseif { $pos == 0 } {
if { $data(select) == "" } {
$path:cmd raise p:$page
} else {
$path:cmd lower p:$page p:$data(select)
}
} else {
set pred [lindex $data(pages) [expr {$pos-1}]]
if { $data(select) != $pred || $pos == 1 } {
$path:cmd lower p:$page p:$pred
} else {
$path:cmd lower p:$page p:[lindex $data(pages) [expr {$pos-2}]]
}
}
}
# ------------------------------------------------------------------------------
# Command NoteBook::_draw_arrows
# ------------------------------------------------------------------------------
proc NoteBook::_draw_arrows { path } {
variable _warrow
variable $path
upvar 0 $path data
set w [expr {[winfo width $path]-1}]
set h [expr {$data(hpage)-1}]
set nbpages [llength $data(pages)]
set xl 0
set xr [expr {$w-$_warrow+1}]
if { $data(base) > 0 } {
if { ![llength [$path:cmd find withtag "leftarrow"]] } {
$path:cmd create window $xl 1 \
-width $_warrow \
-height $h \
-anchor nw \
-window $path.fg \
-tags "leftarrow"
} else {
$path:cmd coords "leftarrow" $xl 1
$path:cmd itemconfigure "leftarrow" -width $_warrow -height $h
}
} else {
$path:cmd delete "leftarrow"
}
if { $data(base) < $nbpages-1 &&
$data(wpage) + [_get_x_page $path 0] + 6 > $w } {
if { ![llength [$path:cmd find withtag "rightarrow"]] } {
$path:cmd create window $xr 1 \
-width $_warrow \
-height $h \
-window $path.fd \
-anchor nw \
-tags "rightarrow"
} else {
$path:cmd coords "rightarrow" $xr 1
$path:cmd itemconfigure "rightarrow" -width $_warrow -height $h
}
} else {
$path:cmd delete "rightarrow"
}
}
# ------------------------------------------------------------------------------
# Command NoteBook::_draw_area
# ------------------------------------------------------------------------------
proc NoteBook::_draw_area { path } {
variable $path
upvar 0 $path data
set w [expr {[winfo width $path]-1}]
set h [expr {[winfo height $path]-1}]
set bd [Widget::getoption $path -borderwidth]
set x0 [expr {$bd-1}]
set y0 $data(hpage)
set y1 $h
set dbg $data(dbg)
set sel $data(select)
if { $sel == "" } {
set xd [expr {$w/2}]
set xf $xd
set lbg $data(dbg)
} else {
set xd [_get_x_page $path [lsearch $data(pages) $data(select)]]
set xf [expr {$xd + $data($sel,width)+6}]
set lbg $data(lbg)
}
if { [llength [$path:cmd find withtag rect]] } {
$path:cmd coords "toprect1" $xd $y0 $x0 $y0 $x0 $h
$path:cmd coords "toprect2" $w $y0 $xf $y0
$path:cmd coords "botrect" $x0 $h $w $h $w $y0
$path:cmd itemconfigure "toprect1" -fill $lbg -width $bd
$path:cmd itemconfigure "toprect2" -fill $lbg -width $bd
$path:cmd itemconfigure "botrect" -width $bd
$path:cmd raise "rect"
} else {
$path:cmd create line $xd $y0 $x0 $y0 $x0 $y1 \
-tags "rect toprect1" -fill $lbg -width $bd
$path:cmd create line $w $y0 $xf $y0 \
-tags "rect toprect2" -fill $lbg -width $bd
$path:cmd create line 1 $h $w $h $w $y0 \
-tags "rect botrect" -fill $dbg -width $bd
}
if { $sel != "" } {
if { [llength [$path:cmd find withtag "window"]] } {
$path:cmd coords "window" 2 [expr {$y0+1}]
$path:cmd itemconfigure "window" \
-width [expr {$w-1 -2}] \
-height [expr {$h-$y0-1 -2}] \
-window $path.f$sel
} else {
set y0 $data(hpage)
$path:cmd create window 2 [expr {$y0+1}] \
-width [expr {$w-3}] \
-height [expr {$h-$y0-3}] \
-anchor nw \
-tags "window" \
-window $path.f$sel
}
} else {
$path:cmd delete "window"
}
}
# ------------------------------------------------------------------------------
# Command NoteBook::_resize
# ------------------------------------------------------------------------------
proc NoteBook::_resize { path } {
_draw_area $path
_draw_arrows $path
}
# ------------------------------------------------------------------------------
# Command NoteBook::_realize
# ------------------------------------------------------------------------------
proc NoteBook::_realize { path } {
variable $path
upvar 0 $path data
if { [set width [Widget::getoption $path -width]] == 0 ||
[set height [Widget::getoption $path -height]] == 0 } {
compute_size $path
}
set data(realized) 1
_draw_area $path
_draw_arrows $path
bind $path <Configure> "NoteBook::_resize $path"
}