|
- #!/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
|