450 lines
13 KiB
Tcl
450 lines
13 KiB
Tcl
#!/bin/sh
|
|
# the next line restarts using wish \
|
|
exec wish "$0" "$@"
|
|
|
|
# widget --
|
|
#
|
|
# This script demonstrates the various widgets provided by Tix,
|
|
# along with many of the features of the Tix library. This file
|
|
# only contains code to generate the main window for the
|
|
# application, which invokes individual demonstrations. The
|
|
# code for the actual demonstrations is contained in separate
|
|
# ".tcl" files in the samples/ subdirectory, which are sourced
|
|
# by this script as needed.
|
|
#
|
|
# Copyright (c) 1992-1994 The Regents of the University of California.
|
|
# Copyright (c) 1994-1996 Sun Microsystems, Inc.
|
|
# Copyright (c) 1998-2000 Scriptics Corporation.
|
|
# Copyright (c) 2000-2001 Tix Project Group.
|
|
#
|
|
# See the file "license.terms" for information on usage and redistribution
|
|
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
# $Id: widget,v 1.7 2008/03/17 22:58:51 hobbs Exp $
|
|
|
|
package require Tix
|
|
tix initstyle
|
|
eval destroy [winfo child .]
|
|
wm title . "Tix Widget Tour"
|
|
set tix_demo_running 1
|
|
set demo_dir [file dirname [info script]]
|
|
tix addbitmapdir [file join $demo_dir bitmaps]
|
|
|
|
# createMainWindow --
|
|
#
|
|
# Creates the main window, consisting of a menu bar and a text
|
|
# widget that explains how to use the program, plus lists all of
|
|
# the demos as hypertext items.
|
|
|
|
proc createMainWindow {} {
|
|
global tcl_platform old_cursor
|
|
|
|
switch $tcl_platform(platform) {
|
|
"windows" {
|
|
set font {Arial 12}
|
|
}
|
|
"unix" {
|
|
set font {Helvetica 12}
|
|
}
|
|
default {
|
|
set font {Helvetica 12}
|
|
}
|
|
}
|
|
|
|
menu .menuBar -tearoff 0
|
|
.menuBar add cascade -menu .menuBar.file -label "File" -underline 0
|
|
menu .menuBar.file -tearoff 0
|
|
|
|
# On the Mac use the specia .apple menu for the about item
|
|
if {$tcl_platform(platform) eq "macintosh"} {
|
|
.menuBar add cascade -menu .menuBar.apple
|
|
menu .menuBar.apple -tearoff 0
|
|
.menuBar.apple add command -label "About ..." -command "aboutBox"
|
|
} else {
|
|
.menuBar.file add command -label "About ..." -command "aboutBox"
|
|
.menuBar.file add sep
|
|
}
|
|
|
|
.menuBar.file add command -label "Exit" -command "exit"
|
|
. configure -menu .menuBar
|
|
|
|
frame .statusBar
|
|
label .statusBar.lab -text " " -relief sunken -bd 1 \
|
|
-font -*-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -anchor w
|
|
label .statusBar.foo -width 8 -relief sunken -bd 1 \
|
|
-font -*-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -anchor w
|
|
pack .statusBar.lab -side left -padx 2 -expand yes -fill both
|
|
pack .statusBar.foo -side left -padx 2
|
|
pack .statusBar -side bottom -fill x -pady 2
|
|
|
|
frame .textFrame
|
|
scrollbar .s -orient vertical -command {.t yview} -highlightthickness 0 \
|
|
-takefocus 1
|
|
pack .s -in .textFrame -side right -fill y
|
|
text .t -yscrollcommand {.s set} -wrap word -width 55 -height 30 \
|
|
-font $font \
|
|
-setgrid 1 -highlightthickness 0 -padx 4 -pady 2 -takefocus 0
|
|
pack .t -in .textFrame -expand y -fill both -padx 1
|
|
pack .textFrame -expand yes -fill both
|
|
|
|
if {$tcl_platform(platform) eq "windows"} {
|
|
#
|
|
# Make the scrollbar look win32
|
|
#
|
|
|
|
.textFrame config -bd 2 -relief sunken
|
|
.t config -bd 0
|
|
pack .t -padx 0
|
|
}
|
|
|
|
set old_cursor [.t cget -cursor]
|
|
|
|
# Create a bunch of tags to use in the text widget, such as those for
|
|
# section titles and demo descriptions. Also define the bindings for
|
|
# tags.
|
|
|
|
.t tag configure title -font {Helvetica 18 bold} -justify center
|
|
.t tag configure header -font {Helvetica 14 bold}
|
|
|
|
# We put some "space" characters to the left and right of each
|
|
# demo description so that the descriptions are highlighted only
|
|
# when the mouse cursor is right over them (but not when the
|
|
# cursor is to their left or right)
|
|
#
|
|
.t tag configure demospace -lmargin1 1c -lmargin2 1c -spacing1 1
|
|
.t tag configure codeicon -lmargin1 1c -lmargin2 1c
|
|
|
|
if {[winfo depth .] == 1} {
|
|
.t tag configure demo -lmargin1 1c -lmargin2 1c \
|
|
-underline 1
|
|
.t tag configure visited -lmargin1 1c -lmargin2 1c \
|
|
-underline 1
|
|
.t tag configure hot -background black -foreground white
|
|
} else {
|
|
.t tag configure demo -lmargin1 1c -lmargin2 1c \
|
|
-foreground blue -underline 1
|
|
.t tag configure visited -lmargin1 1c -lmargin2 1c \
|
|
-foreground #303080 -underline 1
|
|
.t tag configure hot -foreground red -underline 1
|
|
}
|
|
.t tag bind demo <ButtonRelease-1> {
|
|
invoke [.t index {@%x,%y}]
|
|
}
|
|
.t tag bind codeicon <ButtonRelease-1> {
|
|
showCode [.t index [list {@%x,%y} +2 chars]]
|
|
}
|
|
global lastLine
|
|
set lastLine ""
|
|
.t tag bind demo <Enter> {
|
|
set lastLine [.t index {@%x,%y linestart}]
|
|
.t tag add hot [list $lastLine +3 chars] \
|
|
[list $lastLine lineend -1 chars]
|
|
.t config -cursor hand2
|
|
showStatus run [.t index {@%x,%y}]
|
|
}
|
|
.t tag bind demo <Leave> {
|
|
.t tag remove hot 1.0 end
|
|
.t config -cursor $old_cursor
|
|
.statusBar.lab config -text ""
|
|
}
|
|
.t tag bind demo <Motion> {
|
|
set newLine [.t index {@%x,%y linestart}]
|
|
if {[string compare $newLine $lastLine] != 0} {
|
|
.t tag remove hot 1.0 end
|
|
set lastLine $newLine
|
|
|
|
set tags [.t tag names {@%x,%y}]
|
|
set i [lsearch -glob $tags demo-*]
|
|
if {$i >= 0} {
|
|
.t tag add hot [list $lastLine +3 chars] \
|
|
[list $lastLine lineend -1 chars]
|
|
}
|
|
}
|
|
showStatus run [.t index {@%x,%y}]
|
|
}
|
|
|
|
.t tag bind codeicon <Enter> {
|
|
.t config -cursor hand2
|
|
}
|
|
.t tag bind codeicon <Leave> {
|
|
.t config -cursor $old_cursor
|
|
}
|
|
.t tag bind codeicon <Motion> {
|
|
set tags [.t tag names [list {@%x,%y} +2 chars]]
|
|
set i [lsearch -glob $tags demo-*]
|
|
if {$i >= 0} {
|
|
showStatus code [.t index [list {@%x,%y} +2 chars]]
|
|
} else {
|
|
showStatus code ""
|
|
}
|
|
}
|
|
|
|
# Create the text for the text widget.
|
|
|
|
.t insert end "Tix Widget Tour\n" title
|
|
addNewLine .t
|
|
addText .t {
|
|
This program demonstrates the features of the Tix
|
|
library. Click on one of the highlighted lines below to run
|
|
the sample program and click on the
|
|
}
|
|
addSpace .t
|
|
.t image create end -image [tix getimage code]
|
|
addSpace .t
|
|
addText .t {
|
|
icon to view its source code.
|
|
}
|
|
|
|
addNewLine .t
|
|
addNewLine .t
|
|
|
|
addHeader .t "Hierachical ListBox"
|
|
|
|
addDemo .t HList1.tcl "Simple HList"
|
|
addDemo .t ChkList.tcl "CheckList"
|
|
addDemo .t SHList.tcl "ScrolledHList (1)"
|
|
addDemo .t SHList2.tcl "ScrolledHList (2)"
|
|
addDemo .t Tree.tcl "Simple Tree"
|
|
|
|
# TODO
|
|
# addDemo .t "Dynamic Tree" DynTree.tcl
|
|
|
|
addHeader .t "Tabular ListBox"
|
|
|
|
addDemo .t STList1.tcl "ScrolledTList (1)"
|
|
addDemo .t STList2.tcl "ScrolledTList (2)"
|
|
addDemo .t STList3.tcl "TList File Viewer"
|
|
|
|
addHeader .t "Grid Widget"
|
|
|
|
addDemo .t SGrid0.tcl "Simple Grid"
|
|
addDemo .t SGrid1.tcl "ScrolledGrid"
|
|
addDemo .t EditGrid.tcl "Editable Grid"
|
|
|
|
addHeader .t "Manager Widgets"
|
|
|
|
addDemo .t ListNBK.tcl ListNoteBook
|
|
addDemo .t NoteBook.tcl NoteBook
|
|
addDemo .t PanedWin.tcl PanedWindow
|
|
|
|
addHeader .t "Scrolled Widgets"
|
|
|
|
addDemo .t SListBox.tcl ScrolledListBox
|
|
addDemo .t SText.tcl ScrolledText
|
|
addDemo .t SWindow.tcl ScrolledWindow
|
|
addDemo .t CObjView.tcl "Canvas Object View"
|
|
|
|
addHeader .t "Miscellaneous Widgets"
|
|
|
|
addDemo .t Balloon.tcl Balloon
|
|
addDemo .t BtnBox.tcl ButtonBox
|
|
addDemo .t ComboBox.tcl ComboBox
|
|
addDemo .t Control.tcl Control
|
|
addDemo .t LabEntry.tcl LabelEntry
|
|
addDemo .t LabFrame.tcl LabelFrame
|
|
addDemo .t Meter.tcl Meter
|
|
addDemo .t OptMenu.tcl OptionMenu
|
|
addDemo .t PopMenu.tcl PopupMenu
|
|
addDemo .t Select.tcl Select
|
|
addDemo .t StdBBox.tcl StdButtonBox
|
|
|
|
addHeader .t "Image Types"
|
|
|
|
addDemo .t CmpImg.tcl "Compound image in buttons"
|
|
addDemo .t CmpImg3.tcl "Compound image in icons"
|
|
#addDemo .t CmpImg2.tcl "Compound image in notebook"
|
|
#addDemo .t CmpImg4.tcl \
|
|
# "Create color tabs in notebook using compound image"
|
|
|
|
addDemo .t Xpm.tcl "XPM pixmap image in buttons"
|
|
addDemo .t Xpm1.tcl "XPM pixmap image in menu"
|
|
|
|
.t configure -state disabled
|
|
focus .s
|
|
|
|
#
|
|
# Because .t is disabled and not focused, we have to do the
|
|
# following hacks to make the scrolling work well
|
|
#
|
|
bind .s <MouseWheel> {
|
|
.t yview scroll [expr {- (%D / 120) * 2}] units
|
|
}
|
|
bind .s <Up> {
|
|
.t yview scroll -1 units
|
|
}
|
|
bind .s <Down> {
|
|
.t yview scroll 1 units
|
|
}
|
|
bind .s <Prior> {
|
|
.t yview scroll -1 page
|
|
}
|
|
bind .s <Next> {
|
|
.t yview scroll 1 page
|
|
}
|
|
bind .s <Home> {
|
|
.t yview 1.0
|
|
}
|
|
bind .s <End> {
|
|
.t yview end
|
|
}
|
|
}
|
|
|
|
# invoke --
|
|
# This procedure is called when the user clicks on a demo description.
|
|
# It is responsible for invoking the demonstration.
|
|
#
|
|
# Arguments:
|
|
# index - The index of the character that the user clicked on.
|
|
|
|
proc invoke {index} {
|
|
global demo_dir
|
|
|
|
# Find out which sample to run
|
|
set tags [.t tag names $index]
|
|
set i [lsearch -glob $tags demo-*]
|
|
if {$i < 0} {
|
|
return
|
|
}
|
|
set demo [string range [lindex $tags $i] 5 end]
|
|
set title [string trim [.t get [list $index linestart +3 chars] \
|
|
[list $index lineend]]]
|
|
# Get the name of this sample
|
|
set w .[lindex [split $demo .] 0]
|
|
set w [string tolower $w]
|
|
|
|
if [winfo exists $w] {
|
|
wm deiconify $w
|
|
raise $w
|
|
return
|
|
}
|
|
|
|
# Load the sample if it's not running
|
|
set cursor [.t cget -cursor]
|
|
.t configure -cursor watch
|
|
update
|
|
uplevel #0 [list source [file join $demo_dir samples $demo]]
|
|
|
|
toplevel $w
|
|
wm title $w $title
|
|
RunSample $w
|
|
|
|
update
|
|
.t configure -cursor $cursor
|
|
|
|
.t tag add visited "$index linestart +1 chars" "$index lineend -1 chars"
|
|
}
|
|
|
|
# showStatus --
|
|
#
|
|
# Show the name of the demo program in the status bar. This procedure
|
|
# is called when the user moves the cursor over a demo description.
|
|
#
|
|
|
|
proc showStatus {which index} {
|
|
set tags [.t tag names $index]
|
|
set i [lsearch -glob $tags demo-*]
|
|
set cursor [.t cget -cursor]
|
|
if {$i < 0} {
|
|
.statusBar.lab config -text " "
|
|
set newcursor xterm
|
|
} else {
|
|
set demo [string range [lindex $tags $i] 5 end]
|
|
if {"$which" == "run"} {
|
|
set text "Run the \"$demo\" sample program"
|
|
} else {
|
|
set text "Show code of the \"$demo\" sample program"
|
|
}
|
|
.statusBar.lab config -text $text
|
|
set newcursor hand2
|
|
}
|
|
if [string compare $cursor $newcursor] {
|
|
.t config -cursor $newcursor
|
|
}
|
|
}
|
|
|
|
# showCode --
|
|
# This procedure is called when the user clicks on the "code" icon.
|
|
# It is responsible for displaying the code of the selected sample program.
|
|
#
|
|
# Arguments:
|
|
# index - The index of the character that the user clicked on.
|
|
|
|
proc showCode {index} {
|
|
global demo_dir
|
|
|
|
set tags [.t tag names $index]
|
|
set i [lsearch -glob $tags demo-*]
|
|
if {$i < 0} {
|
|
return
|
|
}
|
|
set cursor [.t cget -cursor]
|
|
.t configure -cursor watch
|
|
update
|
|
set demo [string range [lindex $tags $i] 5 end]
|
|
|
|
# Create the .code window
|
|
if {![winfo exists .code]} {
|
|
toplevel .code
|
|
frame .code.f
|
|
tixScrolledText .code.st
|
|
button .code.close -text Close -width 6 -command "wm withdraw .code"
|
|
pack .code.f -side bottom -fill x
|
|
pack .code.st -side top -fill both -expand yes
|
|
pack .code.close -in .code.f -side right -padx 10 -pady 10
|
|
}
|
|
set text [.code.st subwidget text]
|
|
$text delete 1.0 end
|
|
set fd [open [file join $demo_dir samples $demo]]
|
|
set data [read $fd]
|
|
close $fd
|
|
$text insert end $data
|
|
|
|
wm deiconify .code
|
|
wm title .code [file nativename [file join $demo_dir samples $demo]]
|
|
update
|
|
.t configure -cursor $cursor
|
|
}
|
|
|
|
proc addText {t text} {
|
|
regsub -all \n+ $text " " text
|
|
regsub -all {[ ]+} $text " " text
|
|
$t insert end [string trim $text]
|
|
}
|
|
|
|
proc addHeader {t text} {
|
|
addNewLine $t
|
|
$t insert end [string trim $text] header
|
|
addNewLine $t
|
|
}
|
|
|
|
proc addNewLine {t} {
|
|
$t insert end "\n" {demospace}
|
|
}
|
|
|
|
proc addSpace {t} {
|
|
$t insert end " " {demospace}
|
|
}
|
|
|
|
proc addDemo {t name text} {
|
|
$t insert end " " demospace
|
|
$t image create end -image [tix getimage code]
|
|
$t tag add codeicon [list end -2 chars] [list end -1 chars]
|
|
$t insert end " " demospace
|
|
$t insert end $text [list demo demo-$name]
|
|
$t insert end " " demospace
|
|
addNewLine $t
|
|
}
|
|
|
|
# aboutBox --
|
|
#
|
|
# Pops up a message box with an "about" message
|
|
#
|
|
proc aboutBox {} {
|
|
tk_messageBox -icon info -type ok -title "About Widget Tour" -message \
|
|
"Tix widget tour\n\nCopyright (c) 2000-2001 Tix Project Group."
|
|
}
|
|
|
|
#
|
|
# Start the program
|
|
#
|
|
|
|
createMainWindow
|