iwidgets-4.1.0/0000755003604700454610000000000013136712367011737 5ustar dgp771diviwidgets-4.1.0/demos/0000755003604700454610000000000013136712365013044 5ustar dgp771diviwidgets-4.1.0/demos/html/0000755003604700454610000000000013136712365014010 5ustar dgp771diviwidgets-4.1.0/demos/html/buttonbox.n.html0000644003604700454610000001605507347201064017161 0ustar dgp771divbuttonbox - Create and manipulate a manager widget for buttons

buttonbox - Create and manipulate a manager widget for buttons

SYNOPSIS

buttonbox pathName ?options?

INHERITANCE

itk::Widget <- buttonbox

STANDARD OPTIONS

background
cursor

See the "options" manual entry for details on the standard options.

WIDGET-SPECIFIC OPTIONS

Name:                   orient
Class:                  Orient
Command-Line Switch:	-orient

Name:                   padX
Class:                  PadX
Command-Line Switch:	-padx

Name:                   padY
Class:                  PadY
Command-Line Switch:	-pady


DESCRIPTION

The buttonbox command creates a manager widget for controlling buttons. The button box also supports the display and invocation of a default button. The button box can be configured either horizontally or vertically.

METHODS

The buttonbox command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command.

Many of the widget commands for the buttonbox take as one argument an indicator of which button of the button box to operate on. These indicators are called indexes and allow reference and manipulation of buttons regardless of their current map state. buttonbox indexes may be specified in any of the following forms:

number
Specifies the button numerically, where 0 corresponds to the left/top-most button of the button box.
end
Indicates the right/bottom-most button of the button box.
default
Indicates the current default button of the button box. This is the button with the default ring displayed.
pattern
If the index doesn't satisfy one of the above forms then this form is used. Pattern is pattern-matched against the tag of each button in the button box, in order from left/top to right/left, until a matching entry is found. The rules of Tcl_StringMatch are used.

WIDGET-SPECIFIC METHODS

pathName add tag args
Add a button distinguished by tag to the end of the button box. If additional arguments are present they specify options to be applied to the button. See PushButton for information on the options available.
pathName buttonconfigure index ?options?
This command is similar to the configure command, except that it applies to the options for an individual button, whereas configure applies to the options for the button box as a whole. Options may have any of the values accepted by the PushButton command. If options are specified, options are modified as indicated in the command and the command returns an empty string. If no options are specified, returns a list describing the current options for entry index (see Tk_ConfigureInfo for information on the format of this list).
pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the buttonbox command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the buttonbox command.
pathName default index
Sets the default button to the button given by index. This causes the default ring to appear arround the specified button.
pathName delete index
Deletes the button given by index from the button box.
pathName hide index
Hides the button denoted by index. This doesn't remove the button permanently, just inhibits its display.
pathName index index
Returns the numerical index corresponding to index.
pathName insert index tag ?option value option value ...?
Same as the add command except that it inserts the new button just before the one given by index, instead of appending to the end of the button box. The option, and value arguments have the same interpretation as for the add widget command.
pathName invoke ?index?
Invoke the command associated with a button. If no arguments are given then the current default button is invoked, otherwise the argument is expected to be a button index.
pathName show index
Display a previously hidden button denoted by index.

EXAMPLE

 buttonbox .bb

 .bb add Yes -text Yes -command "puts Yes" 
 .bb add No -text No -command "puts No"
 .bb add Maybe -text Maybe -command "puts Maybe"
 .bb default Yes

 pack .bb -expand yes -fill both

AUTHORS

Bret A. Schuhmacher

Mark L. Ulferts

KEYWORDS

buttonbox, pushbutton, button, widget iwidgets-4.1.0/demos/html/calendar.n.html0000644003604700454610000002574107375230203016706 0ustar dgp771divcalendar - Create and manipulate a monthly calendar

calendar - Create and manipulate a monthly calendar

SYNOPSIS

calendar pathName ?options?

INHERITANCE

itk::Widget <- calendar

STANDARD OPTIONS

background
cursor
foreground

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

int

See the "datefield" manual entry for details on this option. Note that this option is needed when the calendar is used in conjunction with the dateentry widget. It is necessary for support of international date formats in versions of Tk less than 8.4.

WIDGET-SPECIFIC OPTIONS

Name:                   backwardImage
Class:                  Image
Command-Line Switch:	-backwardimage

Name:                   buttonForeground
Class:                  Foreground
Command-Line Switch:	-buttonforeground

Name:                   command
Class:                  Command
Command-Line Switch:	-command
%d
Replaced with the date selected in the format mm/dd/yyyy.

Name:                   currentDateFont
Class:                  Font
Command-Line Switch:	-currentdatefont

Name:                   dateFont
Class:                  Font
Command-Line Switch:	-datefont

Name:                   dayFont
Class:                  Font
Command-Line Switch:	-dayfont

Name:                   days
Class:                  days
Command-Line Switch:	-days

Name:                   forewardImage
Class:                  Image
Command-Line Switch:	-forewardimage

Name:                   height
Class:                  Height
Command-Line Switch:	-height

Name:                   outline
Class:                  Outline
Command-Line Switch:	-outline

Name:                   selectColor
Class:                  Foreground
Command-Line Switch:	-selectcolor

Name:                   selectThickness
Class:                  SelectThickness
Command-Line Switch:	-selectthickness

Name:                   startday
Class:                  Day
Command-Line Switch:	-startday

Name:                   titleFont
Class:                  Font
Command-Line Switch:	-titlefont

Name:                   weekdayBackground
Class:                  Background
Command-Line Switch:	-weekdaybackground

Name:                   weekendBackground
Class:                  Background
Command-Line Switch:	-weekendbackground

Name:                   width
Class:                  Width
Command-Line Switch:	-width


DESCRIPTION

The calendar command creates a calendar widget for the selection of a date, displaying a single month at a time. Buttons exist on the top to change the month in effect turning the pages of a calendar. As a page is turned, the dates for the month are modified. Selection of a date visually marks that date. The selected value can be monitored via the -command option or just retrieved using the get command.

METHODS

The calendar command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for calendar widgets:

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the calendar command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the calendar command.
pathName get ?format?
Returns the currently selected date in a format of string or as an integer clock value using the -string and -clicks format options respectively. The default is by string. Reference the clock command for more information on obtaining dates and their formats.
pathName select date
Changes the currently selected date to the value specified which must be in the form of a date string, an integer clock value or as the keyword "now". Reference the clock command for more information on obtaining dates and their formats. Note that selecting a date does not change the month being shown to that of the date given. This chore is left to the show\R command.
pathName show date
Changes the currently displayed date to be that of the date argument which must be in the form of a date string, an integer clock value or as the keyword "now". Reference the clock command for more information on obtaining dates and their formats.

COMPONENTS

Name:                   forward
Class:                  Button

Name:                   page
Class:                  Canvas

Name:                   backward
Class:                  Button

EXAMPLE

 proc selectCmd {date} {
   puts $date
 }

 calendar .c -command {selectCmd %d} -weekendbackground mistyrose \\
	-weekdaybackground ghostwhite -outline black \\
        -startday wednesday -days {We Th Fr Sa Su Mo Tu}
 pack .c 

AUTHORS

Mark L. Ulferts

Michael J. McLennan

KEYWORDS

calendar, widget iwidgets-4.1.0/demos/html/canvasprintbox.n.html0000644003604700454610000002274607347201103020174 0ustar dgp771divcanvasprintbox - Create and manipulate a canvas print box widget

canvasprintbox - Create and manipulate a canvas print box widget

SYNOPSIS

canvasprintbox pathName ?options?

INHERITANCE

itk::Widget <- Canvasprintbox

STANDARD OPTIONS

activeBackground
foreground
insertBackground
insertWidth
selectBackground
background
highlightBackground
insertBorderWidth
relief
selectBorderWidth
borderWidth
highlightColor
insertOffTime
repeatDelay
selectForeground
cursor
highlightThickness
insertOnTime
repeatInterval

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

WIDGET-SPECIFIC OPTIONS

Name:                   filename
Class:                  FileName
Command-Line Switch:	-filename

Name:                   hpagecnt
Class:                  PageCnt
Command-Line Switch:	-hpagecnt

Name:                   orient
Class:                  Orient
Command-Line Switch:	-orient

Name:                   output
Class:                  Output
Command-Line Switch:	-output

Name:                   pageSize
Class:                  PageSize
Command-Line Switch:	-pagesize

Name:                   posterize
Class:                  Posterize
Command-Line Switch:	-posterize

Name:                   printCmd
Class:                  PrintCmd
Command-Line Switch:	-printcmd

Name:                   printRegion
Class:                  PrintRegion
Command-Line Switch:	-printregion

Name:                   stretch
Class:                  Stretch
Command-Line Switch:	-stretch

Name:                   vPageCnt
Class:                  PageCnt
Command-Line Switch:	-vpagecnt


DESCRIPTION

Implements a print box for printing the contents of a canvas widget to a printer or a file. It is possible to specify page orientation, the number of pages to print the image on and if the output should be stretched to fit the page. Options exist to control the appearance and actions of the widget.

METHODS

The canvasprintbox command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for canvasprintbox widgets:

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the canvasprintbox command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the canvasprintbox command.
pathName getoutput
Returns the value of the printercmd or filename option depending on the current setting of output.
pathName print
Perfrom the actual printing of the canvas using the current settings of all the attributes. Returns a boolean indicating wether the printing was successful or not.
pathName refresh
Retrieves the current value for all edit fields and updates the stamp accordingly. Is useful for Apply-buttons.
pathName setcanvas canvas
This is used to set the canvas that has to be printed. A stamp-sized copy will automatically be drawn to show how the output would look with the current settings.
pathName stop
Stops the drawing of the "stamp". I'm currently unable to detect when a Canvasprintbox gets destroyed or withdrawn. It's therefore advised that you perform a stop before you do something like that.

COMPONENTS

Name:                   prtflentry
Class:                  Entry

Name:                   hpcnt
Class:                  Entry
Name:                   vpcnt
Class:                  Entry

EXAMPLE

canvasprintbox .fsb -orient landscape -stretch 1
pack .fsb -padx 10 -pady 10 -fill both -expand yes 

AUTHOR

Tako Schotanus

KEYWORDS

canvasprintbox, widget iwidgets-4.1.0/demos/html/canvasprintdialog.n.html0000644003604700454610000001342207347201111020631 0ustar dgp771divcanvasprintdialog - Create and manipulate a canvas print dialog widget

canvasprintdialog - Create and manipulate a canvas print dialog widget

SYNOPSIS

canvasprintdialog pathName ?options?

INHERITANCE

itk::Toplevel <- Dialogshell <- Dialog <- Canvasprintdialog

STANDARD OPTIONS

activeBackground
foreground
insertBackground
insertWidth
selectBackground
background
highlightBackground
insertBorderWidth
relief
selectBorderWidth
borderWidth
highlightColor
insertOffTime
repeatDelay
selectForeground
cursor
highlightThickness
insertOnTime
repeatInterval

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

filename
pagesize
vpagecnt
hpagecnt
posterize
orient
printcmd
output
printregion

See the "canvasprintbox" widget manual entry for details on the above associated options.

INHERITED OPTIONS

buttonBoxPadX
padY
buttonBoxPadY
separator
buttonBoxPos
thickness
padX

See the "dialogshell" widget manual entry for details on the above inherited options.

master
modality

See the "shell" widget manual entry for details on the above inherited options.

title

See the "Toplevel" widget manual entry for details on the above inherited options.

WIDGET-SPECIFIC OPTIONS


DESCRIPTION

The canvasprintdialog command creates a print dialog for printing the contents of a canvas widget to a printer or a file. It is possible to specify page orientation, the number of pages to print the image on and if the output should be stretched to fit the page.

METHODS

The canvasprintdialog command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for canvasprintdialog widgets:

ASSOCIATED METHODS

getoutput
setcanvas
refresh
print

See the "canvasprintbox" class manual entry for details on the associated methods.

INHERITED METHODS

add
insert
buttonconfigure
invoke
default
show
hide

See the "buttonbox" widget manual entry for details on the above inherited methods.

activate
deactivate

See the "dialogshell" widget manual entry for details on the above inherited methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the canvasprintdialog command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the canvasprintdialog command.

COMPONENTS

Name:                   cpb
Class:                  Canvasprintbox

EXAMPLE

 canvasprintdialog .cpb 
 .cpb activate

AUTHOR

Tako Schotanus

KEYWORDS

canvasprintdialog, canvasprintbox, dialog, widget iwidgets-4.1.0/demos/html/checkbox.n.html0000644003604700454610000001462206570244356016731 0ustar dgp771divcheckbox - Create and manipulate a checkbox widget

checkbox - Create and manipulate a checkbox widget

SYNOPSIS

checkbox pathName ?options?

INHERITANCE

itk::Widget <- labeledframe <- checkbox

STANDARD OPTIONS

background
foreground
borderWidth
relief
cursor
selectColor
disabledForeground

See the "options" manual entry for details on the standard options.

INHERITED OPTIONS

labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable
labelMargin

See the "labeledframe" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   command
Class:                  Command
Command-Line Switch:    -command


DESCRIPTION

The checkbox command creates a check button box widget capable of adding, inserting, deleting, selecting, and configuring checkbuttons as well as obtaining the currently selected button.

METHODS

The checkbox command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command.

Many of the widget commands for the checkbox take as one argument an indicator of which checkbutton of the checkbox to operate on. These indicators are called indexes and allow reference and manipulation of checkbuttons. Checkbox indexes may be specified in any of the following forms:

number
Specifies the checkbutton numerically, where 0 corresponds to the top checkbutton of the checkbox.
end
Indicates the last checkbutton of the checkbox.
pattern
If the index doesn't satisfy one of the above forms then this form is used. Pattern is pattern-matched against the tag of each checkbutton in the checkbox, in order from top to bottom, until a matching entry is found. The rules of Tcl_StringMatch are used.

WIDGET-SPECIFIC METHODS

pathName add tag ?option value option value?
Adds a new checkbutton to the checkbuttond window on the bottom. The command takes additional options which are passed on to the checkbutton as construction arguments. These include the standard Tk checkbutton options. The tag is returned.
pathName buttonconfigure index ?options?
This command is similar to the configure command, except that it applies to the options for an individual checkbutton, whereas configureapplies to the options for the checkbox as a whole. Options may have any of the values accepted by the add widget command. If options are specified, options are modified as indicated in the command and the command returns an empty string. If no options are specified, returns a list describing the current options for entry index (see Tk_ConfigureInfo for information on the format of this list).
pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the checkbox command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the checkbox command.
pathName delete index
Deletes a specified checkbutton given an index.
pathName deselect index
Deselects a specified checkbutton given an index.
pathName flash index
Flashes a specified checkbutton given an index.
pathName get ?index?
Returns the tags of the currently selected checkbuttons or the selection status of specific checkbutton when given an index.
pathName index index
Returns the numerical index corresponding to index.
pathName insert index tag ?option value option value ...?
Same as the add command except that it inserts the new checkbutton just before the one given by index, instead of appending to the end of the checkbox. The option, and value arguments have the same interpretation as for the add widget command.
pathName select index
Selects a specified checkbutton given an index.

EXAMPLE

 checkbox .cb -labeltext Styles
 .cb add bold -text Bold
 .cb add italic -text Italic
 .cb add underline -text Underline
 .cb select underline

 pack .cb -padx 10 -pady 10 -fill both -expand yes

AUTHOR

John A. Tucker

KEYWORDS

checkbox, widget iwidgets-4.1.0/demos/html/combobox.n.html0000644003604700454610000003543207347201117016744 0ustar dgp771divcombobox - Create and manipulate combination box widgets

combobox - Create and manipulate combination box widgets

SYNOPSIS

combobox pathName ?options?

INHERITANCE

itk::Widget <- LabeledWidget <- Entryfield <- Combobox

STANDARD OPTIONS


cursor
highlightColor
insertWidth
insertWidth
selectBorderWidth

justify
highlightThickness
insertBackground
insertBorderWidth
textVariable
background
exportSelection
relief
insertOffTime
selectForeground

borderWidth
foreground
width
insertOnTime
selectBackground

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

hscrollmode
textBackground
textFont
vscrollmode

See the "scrolledlistbox" manual entry for details on the above inherited options.

show

See the "entry" manual entry for details on the above inherited option.

INHERITED OPTIONS

childSitePos
invalid
command
textBackground
fixed
textFont
focusCommand
validate

See the "entryfield" class manual entry for details on the inherited options.

labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable
labelMargin

See the "labeledwidget" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   arrowRelief
Class:                  Relief
Command-Line Switch:	-arrowrelief

Name:                   completion
Class:                  Completion
Command-Line Switch:	-completion

Name:                   dropdown
Class:                  Dropdown
Command-Line Switch:	-dropdown

Name:                   editable
Class:                  Editable
Command-Line Switch:	-editable

Name:                   grab
Class:                  Grab
Command-Line Switch:	-grab

Name:                   listHeight
Class:                  Height
Command-Line Switch:	-listheight

Name:                   margin
Class:                  Margin
Command-Line Switch:	-margin

Name:                   popupCursor
Class:                  Cursor
Command-Line Switch:	-popupcursor

Name:                   selectionCommand
Class:                  SelectionCommand
Command-Line Switch:	-selectioncommand

Name:                   state
Class:                  State
Command-Line Switch:	-state

Name:                   unique
Class:                  Unique
Command-Line Switch:	-unique

DESCRIPTION

The combobox command creates an enhanced entry field widget with an optional associated label and a scrollable list. When an item is selected in the list area of a Combobox, its value is then displayed in the entry field text area. Functionally similar to an Optionmenu, the Combobox adds (optional) list scrolling and (optional) item editing and inserting capabilities.

There are two basic styles of Comboboxes (determined by the -dropdown option): dropdown and simple. The dropdown style adds an arrow button to the right of the entry field which when activated will pop up (and down) the scrolled listbox beneath the entry field. The simple (non-dropdown) Combobox permanently displays the listbox beneath the entry field and has no arrow button. Either style allows an optional entry field label.

METHODS

The combobox command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for Combobox widgets:

ASSOCIATED METHODS

icursor
scan

See the "entry" manual entries for details on the above associated methods.

curselection
xview
index
yview
see
size

See the "listbox" manual entries for details on the above associated methods.

getcurselection
justify
sort

See the "scrolledlistbox" manual entries for details on the above associated methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the combobox command.
pathName clear ?component?
Clears the contents from one or both components. Valid component values are list, or entry. With no component specified, both are cleared.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the combobox command.
pathName delete component first ?last?
Delete one or more elements from a given component, list or entry. If a list item to be removed is currently selected (displayed in the entry field area), the entry field will be cleared.
pathName get ?index?
With no arguments, returns the contents currently in the entry field area. With a single argument, returns the contents of the listbox item at the indicated index.
pathName insert component index element ?element element ...?
Insert one or more new elements into the given component, list or entry, just before the element given by index.
pathName selection option first ?last?
Adjust the selection within the listbox component and updates the contents of the entry field component to the value of the selected item. See the "listbox" manual entry for more details on parameter options.

COMPONENTS

Name:                   entry
Class:                  Entry

Name:                   list
Class:                  Scrolledlistbox

DEFAULT BINDINGS

The Combobox generally has the same bindings as its primary component items - the Scrolledlistbox and Entryfield. However it also adds these:

[1] Button-1 mouse press on the arrow key of a dropdown Combobox causes the list to be popped up. If the combobox is non-editable, a Button-1 press on the entry field area will also pop up the list.

[2] Button-1 mouse press anywhere on the display removes a dropdown listbox which has been popped up, unless the keypress is upon one of the Combobox scrollbars which scrolls the list. If it is pressed upon an item in the list area, that item will be selected before the list is removed.

[3] Button-3 mouse press on the arrow key of a dropdown Combobox causes the next item to be selected. Shift-Button-3 causes the previous item to be selected.

[4] Escape keypress removes a dropdown list which has been popped up.

[5] The <space> and <Return> keystrokes select the current item. They also remove the popped up list for dropdown comboboxes.

[6] Up and Down arrow keypresses from the entry field and arrow button component cause the previous and next items in the listbox to be selected respectively. Ctl-P and Ctl-N are similarly mapped for emacs emulation.

[7] Entry field and arrow button component Shift-Up and Shift-Down arrow keys pop up and down the listbox of a dropdown Combobox. The arrow button component also maps <Return> and <space> similarly.

EXAMPLE

 proc selectCmd {} {
    puts stdout "[.cb2 getcurselection]"
 }

 #
 # Non-editable Dropdown Combobox
 #
 combobox .cb1 -labeltext Month: \\
     -selectioncommand {puts "selected: [.cb1 getcurselection]"} \\
     -editable false -listheight 185 -popupcursor hand1 
 .cb1 insert list end Jan Feb Mar Apr May June Jul Aug Sept Oct Nov Dec
	
 #
 # Editable Dropdown Combobox
 #
 combobox .cb2 -labeltext "Operating System:" -selectioncommand selectCmd
 .cb2 insert list end Linux HP-UX SunOS Solaris Irix
 .cb2 insert entry end L

 pack .cb1 -padx 10 -pady 10 -fill x 
 pack .cb2 -padx 10 -pady 10 -fill x

ORIGINAL AUTHOR

John S. Sigler

CURRENT MAINTAINER

Mitch Gorman (logain@erols.com)

KEYWORDS

combobox, entryfield, scrolledlistbox, itk::Widget, entry, listbox, widget, iwidgets iwidgets-4.1.0/demos/html/dateentry.n.html0000644003604700454610000001423107375230203017124 0ustar dgp771divdateentry - Create and manipulate a dateentry widget

dateentry - Create and manipulate a dateentry widget

SYNOPSIS

dateentry pathName ?options?

INHERITANCE

itk::Widget <- LabeledWidget <- Datefield <- Dateentry

STANDARD OPTIONS

background
foreground
justify
borderWidth
highlightColor
relief
cursor
highlightThickness
exportSelection
insertBackground

See the "options" manual entry for details on the standard options.

INHERITED OPTIONS

disabledForeground
labelMargin
state
labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable

See the "labeledwidget" class manual entry for details on these inherited options.

command
textFont
int
iq
state
textBackground

See the "datefield" class manual entry for details on these inherited options.

ASSOCIATED OPTIONS

backwardImage
dateFont
outline
titleFont
buttonForeground
dayFont
selectColor
weekdayBackground
command
days
selectThickness
weekendBackground
currentDateFont
forwardImage
startDay

See the "calendar" manual entry for details on the associated options.

WIDGET-SPECIFIC OPTIONS

Name:                   grab
Class:                  Grab
Command-Line Switch:	-grab

Name:                   icon
Class:                  Icon
Command-Line Switch:	-icon


DESCRIPTION

The dateentry command creates a quicken style date entry field with a popup calendar by combining the datefield and calendar widgets together. This allows a user to enter the date via the keyboard or by using the mouse and selecting the calendar icon which brings up a popup calendar.

METHODS

The dateentry command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for dateentry widgets:

INHERITED METHODS

get
isvalid
show

See the "datefield" manual entry for details on the associated methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the dateentry command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the dateentry command.

COMPONENTS

Name:                   label
Class:                  Label

Name:                   iconbutton
Class:                  Label

Name:                   date
Class:                  Entry

EXAMPLE

 dateentry .de
 pack .de

AUTHOR

Mark L. Ulferts

KEYWORDS

dateentry, widget iwidgets-4.1.0/demos/html/datefield.n.html0000644003604700454610000001667007375230203017057 0ustar dgp771divdatefield - Create and manipulate a date field widget

datefield - Create and manipulate a date field widget

SYNOPSIS

datefield pathName ?options?

INHERITANCE

itk::Widget <- LabeledWidget <- datefield

STANDARD OPTIONS

background
foreground
justify
borderWidth
highlightColor
relief
cursor
highlightThickness
exportSelection
insertBackground

See the "options" manual entry for details on the standard options.

INHERITED OPTIONS

disabledForeground
labelMargin
state
labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable

See the "labeledwidget" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   childSitePos
Class:                  Position
Command-Line Switch:	-childsitepos

Name:                   command
Class:                  Command
Command-Line Switch:	-command

Name:                   gmt
Class:                  GMT
Command-Line Switch:	-gmt

Name:                   int
Class:                  DateFormat
Command-Line Switch:	-int

Name:                   iq
Class:                  Iq
Command-Line Switch:	-iq

Name:                   state
Class:                  State
Command-Line Switch:	-state

Name:                   textBackground
Class:                  Background
Command-Line Switch:	-textbackground

Name:                   textFont
Class:                  Font
Command-Line Switch:	-textfont


DESCRIPTION

The datefield command creates an enhanced text entry widget for the purpose of date entry with various degrees of built-in intelligence.

METHODS

The datefield command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for datefield widgets:

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the datefield command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the datefield command.
pathName get ?format?
Returns the current contents of the datefield in a format of string or as an integer clock value using the -string and -clicks format options respectively. The default is by string. Reference the clock command for more information on obtaining dates and their formats.
pathName isvalid
Returns a boolean indication of the validity of the currently displayed date value. For example, 03/03/1960 is valid whereas 02/29/1997 is invalid.
pathName show date
Changes the currently displayed date to be that of the date argument. The date may be specified either as a string, an integer clock value or the keyword "now". Reference the clock command for more information on obtaining dates and their formats.

COMPONENTS

Name:                   date
Class:                  Entry

EXAMPLE

 proc returnCmd {} {
   puts [.df get]
 }

 datefield .df -command returnCmd
 pack .df -fill x -expand yes -padx 10 -pady 10

AUTHOR

Mark L. Ulferts

KEYWORDS

datefield, widget iwidgets-4.1.0/demos/html/dialog.n.html0000644003604700454610000001145607347201142016371 0ustar dgp771divdialog - Create and manipulate a dialog widget

dialog - Create and manipulate a dialog widget

SYNOPSIS

dialog pathName ?options?

INHERITANCE

itk::Toplevel <- Shell <- Dialogshell <- Dialog

STANDARD OPTIONS

background
cursor
foreground

See the "options" manual entry for details on the standard options.

INHERITED OPTIONS

buttonBoxPadX
padY
buttonBoxPadY
separator
buttonBoxPos
thickness
padX

See the "dialogshell" manual entry for details on the above inherited options.

height
master
modality
width

See the "shell" manual entry for details on the above inherited options.

title

See the "Toplevel" manual entry for details on the above inherited options.


DESCRIPTION

The dialog command creates a dialog box providing standard buttons and a child site for use in derived classes. The buttons include ok, apply, cancel, and help. Methods and Options exist to configure the buttons and their containing box.

METHODS

The dialog command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for dialog widgets:

INHERITED METHODS

add
index
buttonconfigure
insert
default
invoke
hide
show

See the "buttonbox" manual entry for details on the above inherited methods.

childsite

See the "dialogshell" manual entry for details on the above inherited methods.

activate
center
deactivate

See the "shell" manual entry for details on the above inherited methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the dialog command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the dialog command.

EXAMPLE

 dialog .d -modality global
 .d buttonconfigure OK -command {puts OK; .d deactivate 1}
 .d buttonconfigure Apply -command {puts Apply}
 .d buttonconfigure Cancel -command {puts Cancel; .d deactivate 0}
 .d buttonconfigure Help -command {puts Help}
 
 listbox [.d childsite].lb -relief sunken
 pack [.d childsite].lb -expand yes -fill both

 if {[.d activate]} {
     puts "Exit via OK button"
 } else {
     puts "Exit via Cancel button"
 }

AUTHORS

Mark L. Ulferts

Bret A. Schuhmacher

KEYWORDS

dialog, dialogshell, shell, widget iwidgets-4.1.0/demos/html/dialogshell.n.html0000644003604700454610000001572207347201151017421 0ustar dgp771divdialogshell - Create and manipulate a dialog shell widget

dialogshell - Create and manipulate a dialog shell widget

SYNOPSIS

dialogshell pathName ?options?

INHERITANCE

itk::Toplevel <- Shell <- Dialogshell

STANDARD OPTIONS

background
cursor
foreground

See the "options" manual entry for details on the standard options.

INHERITED OPTIONS

height
master
modality
width

See the "shell" manual entry for details on the above inherited options.

title

See the "Toplevel" manual entry for details on the above inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   buttonBoxPadX
Class:                  Pad
Command-Line Switch:	-buttonboxpadx

Name:                   buttonBoxPadY
Class:                  Pad
Command-Line Switch:	-buttonboxpady

Name:                   buttonBoxPos
Class:                  Position
Command-Line Switch:	-buttonboxpos

Name:                   padX
Class:                  Pad
Command-Line Switch:	-padx

Name:                   padY
Class:                  Pad
Command-Line Switch:	-pady

Name:                   separator
Class:                  Separator
Command-Line Switch:	-separator

Name:                   thickness
Class:                  Thickness
Command-Line Switch:	-thickness

DESCRIPTION

The dialogshell command creates a dialog shell which is a top level widget composed of a button box, separator, and child site area. The class also has methods to control button construction.

METHODS

The dialogshell command create a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for dialogshell widgets:

INHERITED METHODS

activate
center
deactivate

See the "shell" manual entry for details on the above inherited methods.

ASSOCIATED METHODS

add
hide
show
buttonconfigure
index
default
insert
delete
invoke

See the "buttonbox" manual entry for details on the associated methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the dialogshell command.
pathName childsite
Returns the pathname of the child site widget.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the dialogshell command.

COMPONENTS

Name:                   dschildsite
Class:                  frame

Name:                   separator
Class:                  frame

Name:                   bbox
Class:                  ButtonBox

EXAMPLE

 dialogshell .ds -modality none
 
 .ds add OK -text "OK" 
 .ds add Cancel -text "Cancel"
 .ds default OK
 
 .ds activate

AUTHOR

Mark L. Ulferts

KEYWORDS

dialogshell, dialog, shell, widget iwidgets-4.1.0/demos/html/disjointlistbox.n.html0000644003604700454610000002476007447553303020376 0ustar dgp771diviwidgets::disjointlistbox - Create and manipulate a disjointlistbox widget

iwidgets::disjointlistbox - Create and manipulate a disjointlistbox widget

SYNOPSIS

iwidgets::disjointlistbox pathName ?options?

INHERITANCE

itk::Widget <- iwidgets::Disjointlistbox

STANDARD OPTIONS


activeForeground
buttonPlacement
highlightColor
activeBackground
activeRelief
clientData
highlightThickness
selectBorderWidth
background
cursor
disabledForeground
selectForeground
borderWidth
foreground
elementBorderWidth

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

lhsButtonLabel
rhsButtonLabel

See the "button" widget manual entry for details on the above associated options.

labelFont
lhsLabelText
rhsLabelText

See the "label" widget manual entry for details on the above associated options.

jump
troughColor

See the "scrollbar" widget class manual entry for details on the above associated options.

textBackground
textFont
lhsItems
rhsItems

See the "scrolledlistbox" widget manual entry for details on the above associated options.

WIDGET-SPECIFIC OPTIONS

Name:                   buttonPlacement
Class:                  ButtonPlacement
Command-Line Switch:	-buttonplacement

Name:                   lhsLabelText
Class:                  LabelText
Command-Line Switch:	-lhslabeltext

Name:                   rhsLabelText
Class:                  LabelText
Command-Line Switch:	-rhslabeltext

Name:                   lhsButtonLabel
Class:                  LabelText
Command-Line Switch:	-lhsbuttonlabel

Name:                   rhsButtonLabel
Class:                  LabelText
Command-Line Switch:	-rhsbuttonlabel

Name:                   lhsSortOption
Class:                  LhsSortOption
Command-Line Switch:	-lhssortoption

Name:                   rhsSortOption
Class:                  RhsSortOption
Command-Line Switch:	-rhssortoption


DESCRIPTION

The iwidgets::disjointlistbox command creates a disjoint pair of listboxs similar to the OSF/Motif "Book" printing dialog of the "FrameMaker" program. It is implementation constists of a two Scrolledlistboxs, 2 buttons, and 2 labels. The disjoint behavior of this widget exists between the interaction of the two Scrolledlistboxes with one another. That is, a given instance of a Disjointlistbox will never exist, without the aid of a hack magician, which has Scrolledlistbox widgets with items in common. That means the relationship between the two is maintained similar to that of disjoint sets. Users may transfer items between the two Listbox widgets using the the two buttons. Options exists which include the ability to configure the "items" displayed by the 2 Scrolledlistboxes and to control the placement of the insertion and removal buttons.

METHODS

The iwidgets::disjointlistbox command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for disjointlistbox widgets:

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the iwidgets::disjointlistbox command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the iwidgets::disjointlistbox command.
pathName setlhs
Set the current contents of the left-most Scrolledlistbox with the input list of items. Removes all (if any) items from the right-most Scrolledlistbox which exist in the input list option to maintain the disjoint property between the two
pathName setrhs
Set the current contents of the right-most Scrolledlistbox with the input list of items. Removes all (if any) items from the left-most Scrolledlistbox which exist in the input list option to maintain the disjoint property between the two
pathName getlhs
Returns the current contents of the left-most Scrolledlistbox
pathName getrhs
Returns the current contents of the right-most Scrolledlistbox
pathName insertlhs
Add the input list of items to the current contents of the left-most Scrolledlistbox. Removes all (if any) items from the right-most Scrolledlistbox which exist in the input list option to maintain the disjoint property between the two
pathName insertrhs
Add the input list of items to the current contents of the right-most Scrolledlistbox. Removes all (if any) items from the left-most Scrolledlistbox which exist in the input list option to maintain the disjoint property between the two.

COMPONENTS

Name:                   lhs
Class:                  Scrolledlistbox

Name:                   rhs
Class:                  Scrolledlistbox

Name:                   lhsbutton
Class:                  utton

Name:                   rhsbutton
Class:                  Button

Name:                   lhsCount
Class:                  Label

Name:                   rhsCount
Class:                  Label

EXAMPLE

package require Iwidgets 4.0
iwidgets::disjointlistbox .dlb
pack .dlb -padx 10 -pady 10 -fill both -expand yes 

AUTHOR(S)

John A. Tucker Anthony Parent

KEYWORDS

disjointlistbox, widget iwidgets-4.1.0/demos/html/entryfield.n.html0000644003604700454610000002250307347201166017300 0ustar dgp771diventryfield - Create and manipulate a entry field widget

entryfield - Create and manipulate a entry field widget

SYNOPSIS

entryfield pathName ?options?

INHERITANCE

itk::Widget <- LabeledWidget <- entryfield

STANDARD OPTIONS

background
foreground
insertBorderWidth
justify
selectForeground
borderWidth
highlightColor
insertOffTime
relief
textVariable
cursor
highlightThickness
insertOnTime
selectBackground
width
exportSelection
insertBackground
insertWidth
selectBorderWidth

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

show
state

See the "entry" manual entry for details on the associated options.

INHERITED OPTIONS

disabledForeground
labelMargin
state
labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable

See the "labeledwidget" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   childSitePos
Class:                  Position
Command-Line Switch:	-childsitepos

Name:                   command
Class:                  Command
Command-Line Switch:	-command

Name:                   fixed
Class:                  Fixed
Command-Line Switch:	-fixed

Name:                   focusCommand
Class:                  Command
Command-Line Switch:	-focuscommand

Name:                   invalid
Class:                  Command
Command-Line Switch:	-invalid

Name:                   textBackground
Class:                  Background
Command-Line Switch:	-textbackground

Name:                   textFont
Class:                  Font
Command-Line Switch:	-textfont

Name:                   validate
Class:                  Command
Command-Line Switch:	-validate
%c
Replaced with the current input character.
%P
Replaced with the contents of the entryfield modified to include the latest keystoke. This is equivalent to peeking at the future contents, enabling rejection prior to the update.
%S
Replaced with the current contents of the entryfield prior to the latest keystroke being added.
%W
Replaced with the entryfield widget pathname.


DESCRIPTION

The entryfield command creates an enhanced text entry widget with an optional associated label. Addtional options support validation and establishing a upper limit on the number of characters which may be entered in the field.

METHODS

The entryfield command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for entryfield widgets:

ASSOCIATED METHODS

delete
insert
get
scan
icursor
selection
index
xview

See the "entry" manual entry for details on the associated methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the entryfield command.
pathName childsite
Returns the path name of the child site.
pathName clear
Clear entry widget
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the entryfield command.

COMPONENTS

Name:                   efchildsite
Class:                  frame

Name:                   entry
Class:                  entry

EXAMPLE

 option add *textBackground white
 
 proc returnCmd {} {
     puts stdout "Return Pressed"
 }
 
 proc invalidCmd {} {
     puts stdout "Alphabetic contents invalid"
 }
 
 entryfield .ef -command returnCmd
 
 entryfield .fef -labeltext "Fixed:" -fixed 10 -width 12
 
 entryfield .nef -labeltext "Numeric:" -validate numeric -width 12
 
 entryfield .aef -labeltext "Alphabetic:" \\
    -validate alphabetic -width 12 -invalid invalidCmd
 
 entryfield .pef -labeltext "Password:" \\
    -show \267 -width 12 -command returnCmd
 
 Labeledwidget::alignlabels .ef .fef .nef .aef .pef

 pack .ef -fill x -expand yes -padx 10 -pady 5
 pack .fef -fill x -expand yes -padx 10 -pady 5
 pack .nef -fill x -expand yes -padx 10 -pady 5
 pack .aef -fill x -expand yes -padx 10 -pady 5
 pack .pef -fill x -expand yes -padx 10 -pady 5

AUTHORS

Sue Yockey

Mark L. Ulferts

KEYWORDS

entryfield, widget iwidgets-4.1.0/demos/html/extbutton.n.html0000644003604700454610000001067307347201177017176 0ustar dgp771divextbutton - Extends the behavior of the Tk button

extbutton - Extends the behavior of the Tk button

SYNOPSIS

extbutton pathName ?options?

INHERITANCE

itk::Widget <- extbutton

STANDARD OPTIONS

activebackground
bd
foreground
text
activeforeground
cursor
image
bitmap
disabledforeground
justify
background
font
relief

See the "options" manual entry for details on the standard options.

WIDGET-SPECIFIC OPTIONS

Name:                   bitmapforeground
Class:                  Foreground
Command-Line Switch:	-bitmapforeground

Name:                   command
Class:                  Command
Command-Line Switch:	-command

Name:                   defaultring
Class:                  DefaultRing
Command-Line Switch:    -defaultring

Name:                   defaultringpad
Class:                  Pad
Command-Line Switch:    -defaultringpad

Name:                   imagePos
Class:                  Position
Command-Line Switch:    -imagepos

Name:                   ringBackground
Class:                  Background
Command-Line Switch:	-ringbackground


DESCRIPTION

The extbutton extends the behavior of the atomic Tk button by allowing text and an image or bitmap to coexist. The user may use the -image or -bitmap options to specify an image as well as the -imagepos option to specify image position relative to the text. Note that the extbutton is not intended to be used without an image/bitmap. There will be an emtpy space next to the text if no image/bitmap is specified.

METHODS

The extbutton command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?

INHERITED METHODS

Each of the following methods are inherited from itk::Archetype. See that man page for details.
pathName cget
pathName component
pathName config
pathName configure

WIDGET-SPECIFIC METHODS

pathName invoke
Evaluates the command fragment associated with the -command option.
pathName flash
Simulates the Tk button's flash command.

EXAMPLES


iwidgets::extbutton .eb -text "Bitmap example" -bitmap info \
  -background bisque -activeforeground red -bitmapforeground blue \
  -defaultring 1 -command {puts "Bisque is beautiful"}
pack .eb -expand 1

iwidgets::extbutton .eb -text "Image example" -relief ridge -image \
  [image create photo -file $itk::library/../iwidgets/demos/images/clear.gif] \
  -font 9x15bold -background lightgreen -imagepos e \
  -activebackground lightyellow
pack .eb -expand 1

AUTHOR

Chad Smith

KEYWORDS

button, pushbutton iwidgets-4.1.0/demos/html/extfileselectionbox.n.html0000644003604700454610000003033607347201205021207 0ustar dgp771divextfileselectionbox - Create and manipulate a file selection box widget

extfileselectionbox - Create and manipulate a file selection box widget

SYNOPSIS

extfileselectionbox pathName ?options?

INHERITANCE

itk::Widget <- Extfileselectionbox

STANDARD OPTIONS

activeBackground
foreground
insertBorderWidth
selectBackground
background
highlightColor
insertOffTime
selectBorderWidth
borderWidth
highlightThickness
insertOnTime
selectForeground
cursor
insertBackground
insertWidth

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

popupCursor
textBackground
textFont

See the "combobox" widget manual entry for details on the above associated options.

labelFont

See the "labeledwidget" widget manual entry for details on the above associated options.

sashCursor

See the "panedwindow" widget manual entry for details on the above associated options.

activeRelief
elementBorderWidth
jump
troughColor

See the "scrollbar" widget class manual entry for details on the above associated options.

textBackground
textFont

See the "scrolledlistbox" widget manual entry for details on the above associated options.

WIDGET-SPECIFIC OPTIONS

Name:                   childSitePos
Class:                  Position
Command-Line Switch:	-childsitepos

Name:                   directory
Class:                  Directory
Command-Line Switch:	-directory

Name:                   dirSearchCommand
Class:                  Command
Command-Line Switch:	-dirsearchcommand

Name:                   dirsLabel
Class:                  Text
Command-Line Switch:	-dirslabel

Name:                   dirsOn
Class:                  DirsOn
Command-Line Switch:	-dirson

Name:                   fileSearchCommand
Class:                  Command
Command-Line Switch:	-filesearchcommand

Name:                   filesLabel
Class:                  Text
Command-Line Switch:	-fileslabel

Name:                   filesOn
Class:                  FilesOn
Command-Line Switch:	-fileson

Name:                   fileType
Class:                  FileType
Command-Line Switch:	-filetype

Name:                   filterCommand
Class:                  Command
Command-Line Switch:	-filtercommand

Name:                   filterLabel
Class:                  Text
Command-Line Switch:	-filterlabel

Name:                   filterOn
Class:                  FilterOn
Command-Line Switch:	-filteron

Name:                   height
Class:                  Height
Command-Line Switch:	-height

Name:                   invalid
Class:                  Command
Command-Line Switch:	-invalid

Name:                   mask
Class:                  Mask
Command-Line Switch:	-mask

Name:                   noMatchString
Class:                  NoMatchString
Command-Line Switch:	-nomatchstring

Name:                   selectDirCommand
Class:                  Command
Command-Line Switch:	-selectdirommand

Name:                   selectFileCommand
Class:                  Command
Command-Line Switch:	-selectfileommand

Name:                   selectionCommand
Class:                  Command
Command-Line Switch:	-selectioncommand

Name:                   selectionLabel
Class:                  Text
Command-Line Switch:	-selectionlabel

Name:                   selectionOn
Class:                  SelectionOn
Command-Line Switch:	-selectionon

Name:                   width
Class:                  Width
Command-Line Switch:	-width


DESCRIPTION

The extfileselectionbox command creates an extended file selection box which is slightly different than the fileselectionbox widget. The differences are mostly cosmetic in that the listboxes are within a panedwindow and the entryfields for the filter and selection have been replaced by comboboxes. Other than that the interface is practically the same.

METHODS

The extfileselectionbox command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for extfileselectionbox widgets:

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the extfileselectionbox command.
pathName childsite
Returns the child site widget path name.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the extfileselectionbox command.
pathName filter
Update the current contents of the extended file selection box based on the current filter combobox value.
pathName get
Returns the current value of the selection combobox widget.

COMPONENTS

Name:                   dirs
Class:                  Scrolledlistbox

Name:                   files
Class:                  Scrolledlistbox

Name:                   filter
Class:                  Combobox

Name:                   selection
Class:                  Combobox

EXAMPLE

extfileselectionbox .fsb
pack .fsb -padx 10 -pady 10 -fill both -expand yes 

AUTHORS

Mark L. Ulferts

Anthony Parent

KEYWORDS

extfileselectionbox, widget iwidgets-4.1.0/demos/html/extfileselectiondialog.n.html0000644003604700454610000002035707347201214021660 0ustar dgp771divextfileselectiondialog - Create and manipulate a file selection dialog widget

extfileselectiondialog - Create and manipulate a file selection dialog widget

SYNOPSIS

extfileselectiondialog pathName ?options?

INHERITANCE

itk::Toplevel <- Shell <- Dialogshell <- Dialog <- Extfileselectiondialog

STANDARD OPTIONS

activeBackground
foreground
insertBorderWidth
selectBackground
background
highlightColor
insertOffTime
selectBorderWidth
borderWidth
highlightThickness
insertOnTime
selectForeground
cursor
insertBackground
insertWidth

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

popupCursor
textBackground
textFont

See the "combobox" widget manual entry for details on the above associated options.

childSitePos
dirsOn
filesOn
invalid
selectionOn
directory
filesLabel
fileType
mask
dirsLabel
filesLabelOn
filterLabel
noMatchString
dirSearchCommand
fileSearchCommand
filterOn
selectionLabel

See the "extfileselectionbox" widget manual entry for details on the above associated options.

labelFont

See the "labeledwidget" widget manual entry for details on the above associated options.

sashCursor

See the "panedwindow" widget manual entry for details on the above associated options.

labelFont

See the "labeledwidget" widget manual entry for details on the above associated options.

activeRelief
elementBorderWidth
jump
troughColor

See the "scrollbar" widget class manual entry for details on the above associated options.

textBackground
textFont

See the "scrolledlistbox" widget manual entry for details on the above associated options.

INHERITED OPTIONS

buttonBoxPadX
padY
buttonBoxPadY
separator
buttonBoxPos
thickness
padX

See the "dialogshell" widget manual entry for details on the above inherited options.

height
master
modality
width

See the "shell" widget manual entry for details on the above inherited options.

title

See the "Toplevel" widget manual entry for details on the above inherited options.


DESCRIPTION

The extfileselectiondialog command creates an extended file selection dialog which is slightly different than the fileselectiondialog widget. The differences are mostly cosmetic in that the listboxes are within a panedwindow and the entryfields for the filter and selection have been replaced by comboboxes. Other than that the interface is practically the same.

METHODS

The extfileselectiondialog command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for extfileselectiondialog widgets:

ASSOCIATED METHODS

get
childsite
filter

See the "fileselectionbox" class manual entry for details on the associated methods.

INHERITED METHODS

add
insert
buttonconfigure
invoke
default
show
hide

See the "buttonbox" widget manual entry for details on the above inherited methods.

activate
center
deactivate

See the "shell" widget manual entry for details on the above inherited methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the extfileselectiondialog command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the extfileselectiondialog command.

COMPONENTS

Name:                   fsb
Class:                  Fileselectionbox

EXAMPLE

 #
 # Non-modal example
 #
 proc okCallback {} {
     puts "You selected [.nmfsd get]"
     .nmfsd deactivate
 }

 extfileselectiondialog .nmfsd -title Non-Modal
 .nmfsd buttonconfigure OK -command okCallback

 .nmfsd activate

 #
 # Modal example
 #
 extfileselectiondialog .mfsd -modality application
 .mfsd center

 if {[.mfsd activate]} {
     puts "You selected [.mfsd get]"
 } else {
     puts "You cancelled the dialog"
 }

AUTHORS

Mark L. Ulferts

Anthony L. Parent

KEYWORDS

extfileselectiondialog, extfileselectionbox, dialog, dialogshell, shell, widget iwidgets-4.1.0/demos/html/feedback.n.html0000644003604700454610000001154306570255546016671 0ustar dgp771divfeedback - Create and manipulate a feedback widget to display feedback on

feedback - Create and manipulate a feedback widget to display feedback on

the current status of an ongoing operation to the user.

SYNOPSIS

feedback pathName ?options?

INHERITANCE

itk::Widget <- Labeledwidget <- Feedback

STANDARD OPTIONS

background
highlightThickness
cursor
foreground
highlightColor

See the "options" manual entry for details on the standard options.

INHERITED OPTIONS

labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable
labelMargin

See the "labeledwidget" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   barcolor
Class:                  BarColor
Command-Line Switch:	-barcolor

Name:                   barheight
Class:                  BarHeight
Command-Line Switch:	-barheight

Name:                   troughColor
Class:                  TroughColor
Command-Line Switch:	-troughcolor

Name:                   steps
Class:                  Steps
Command-Line Switch:	-steps

DESCRIPTION

The feedback command creates a widget to display feedback on the current status of an ongoing operation to the user. Display is given as a percentage and as a thermometer type bar. Options exist for adding a label and controlling its position.

METHODS

The feedback command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for scrolledtext widgets:

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the scrolledhtml command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the feedback command.
pathName reset
Reset the current number of steps completed to 0, and configures the percentage complete label text to 0%
pathName step ?inc?
Increase the current number of steps completed by the amount specified by inc. Inc defaults to 1.

EXAMPLE

 feedback .fb -labeltext "Status" -steps 20
 pack .fb -padx 10 -pady 10 -fill both -expand yes

 for {set i 0} {$i < 20} {incr i} {
     .fb step
     after 500
 }

ACKNOWLEDGEMENTS

Sam Shen

AUTHOR

Kris Raney

KEYWORDS

feedback, widget iwidgets-4.1.0/demos/html/fileselectionbox.n.html0000644003604700454610000003034407347201305020466 0ustar dgp771divfileselectionbox - Create and manipulate a file selection box widget

fileselectionbox - Create and manipulate a file selection box widget

SYNOPSIS

fileselectionbox pathName ?options?

INHERITANCE

itk::Widget <- Fileselectionbox

STANDARD OPTIONS

activeBackground
foreground
insertBorderWidth
selectBackground
background
highlightColor
insertOffTime
selectBorderWidth
borderWidth
highlightThickness
insertOnTime
selectForeground
cursor
insertBackground
insertWidth

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

textBackground
textFont

See the "entryfield" widget manual entry for details on the above associated options.

labelFont

See the "labeledwidget" widget manual entry for details on the above associated options.

activeRelief
elementBorderWidth
jump
troughColor

See the "scrollbar" widget class manual entry for details on the above associated options.

textBackground
textFont

See the "scrolledlistbox" widget manual entry for details on the above associated options.

WIDGET-SPECIFIC OPTIONS

Name:                   childSitePos
Class:                  Position
Command-Line Switch:	-childsitepos

Name:                   directory
Class:                  Directory
Command-Line Switch:	-directory

Name:                   dirSearchCommand
Class:                  Command
Command-Line Switch:	-dirsearchcommand

Name:                   dirsLabel
Class:                  Text
Command-Line Switch:	-dirslabel

Name:                   dirsOn
Class:                  DirsOn
Command-Line Switch:	-dirson

Name:                   fileSearchCommand
Class:                  Command
Command-Line Switch:	-filesearchcommand

Name:                   filesLabel
Class:                  Text
Command-Line Switch:	-fileslabel

Name:                   filesOn
Class:                  FilesOn
Command-Line Switch:	-fileson

Name:                   fileType
Class:                  FileType
Command-Line Switch:	-filetype

Name:                   filterCommand
Class:                  Command
Command-Line Switch:	-filtercommand

Name:                   filterLabel
Class:                  Text
Command-Line Switch:	-filterlabel

Name:                   filterOn
Class:                  FilterOn
Command-Line Switch:	-filteron

Name:                   height
Class:                  Height
Command-Line Switch:	-height

Name:                   invalid
Class:                  Command
Command-Line Switch:	-invalid

Name:                   mask
Class:                  Mask
Command-Line Switch:	-mask

Name:                   noMatchString
Class:                  NoMatchString
Command-Line Switch:	-nomatchstring

Name:                   selectDirCommand
Class:                  Command
Command-Line Switch:	-selectdirommand

Name:                   selectFileCommand
Class:                  Command
Command-Line Switch:	-selectfileommand

Name:                   selectionCommand
Class:                  Command
Command-Line Switch:	-selectioncommand

Name:                   selectionLabel
Class:                  Text
Command-Line Switch:	-selectionlabel

Name:                   selectionOn
Class:                  SelectionOn
Command-Line Switch:	-selectionon

Name:                   width
Class:                  Width
Command-Line Switch:	-width


DESCRIPTION

The fileselectionbox command creates a file selection box similar to the OSF/Motif standard Xmfileselectionbox composite widget. The fileselectionbox is composed of directory and file scrolled lists as well as filter and selection entry fields. Bindings are in place such that selection of a directory list item loads the filter entry field and selection of a file list item loads the selection entry field. Options exist to control the appearance and actions of the widget.

METHODS

The fileselectionbox command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for fileselectionbox widgets:

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the fileselectionbox command.
pathName childsite
Returns the child site widget path name.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the fileselectionbox command.
pathName filter
Update the current contents of the file selection box based on the current filter entry field value.
pathName get
Returns the current value of the selection entry widget.

COMPONENTS

Name:                   dirs
Class:                  Scrolledlistbox

Name:                   files
Class:                  Scrolledlistbox

Name:                   filter
Class:                  Entryfield

Name:                   selection
Class:                  Entryfield

EXAMPLE

fileselectionbox .fsb
pack .fsb -padx 10 -pady 10 -fill both -expand yes 

AUTHOR

Mark L. Ulferts

KEYWORDS

fileselectionbox, widget iwidgets-4.1.0/demos/html/fileselectiondialog.n.html0000644003604700454610000001714507347201315021142 0ustar dgp771divfileselectiondialog - Create and manipulate a file selection dialog widget

fileselectiondialog - Create and manipulate a file selection dialog widget

SYNOPSIS

fileselectiondialog pathName ?options?

INHERITANCE

itk::Toplevel <- Shell <- Dialogshell <- Dialog <- Fileselectiondialog

STANDARD OPTIONS

activeBackground
foreground
insertBorderWidth
selectBackground
background
highlightColor
insertOffTime
selectBorderWidth
borderWidth
highlightThickness
insertOnTime
selectForeground
cursor
insertBackground
insertWidth

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

textBackground
textFont

See the "entryfield" widget manual entry for details on the above associated options.

childSitePos
dirsOn
filesOn
invalid
selectionOn
directory
filesLabel
fileType
mask
dirsLabel
filesLabelOn
filterLabel
noMatchString
dirSearchCommand
fileSearchCommand
filterOn
selectionLabel

See the "fileselectionbox" widget manual entry for details on the above associated options.

labelFont

See the "labeledwidget" widget manual entry for details on the above associated options.

textBackground
textFont

See the "scrolledlistbox" widget manual entry for details on the above associated options.

activeRelief
elementBorderWidth
jump
troughColor

See the "scrollbar" widget class manual entry for details on the above associated options.

INHERITED OPTIONS

buttonBoxPadX
padY
buttonBoxPadY
separator
buttonBoxPos
thickness
padX

See the "dialogshell" widget manual entry for details on the above inherited options.

height
master
modality
width

See the "shell" widget manual entry for details on the above inherited options.

title

See the "Toplevel" widget manual entry for details on the above inherited options.


DESCRIPTION

The fileselectiondialog command creates a file selection dialog similar to the OSF/Motif standard composite widget. The fileselectiondialog is derived from the Dialog class and is composed of a FileSelectionBox with attributes set to manipulate the dialog buttons.

METHODS

The fileselectiondialog command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for fileselectiondialog widgets:

ASSOCIATED METHODS

get
childsite
filter

See the "fileselectionbox" class manual entry for details on the associated methods.

INHERITED METHODS

add
insert
buttonconfigure
invoke
default
show
hide

See the "buttonbox" widget manual entry for details on the above inherited methods.

activate
center
deactivate

See the "shell" widget manual entry for details on the above inherited methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the fileselectiondialog command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the fileselectiondialog command.

COMPONENTS

Name:                   fsb
Class:                  Fileselectionbox

EXAMPLE

 #
 # Non-modal example
 #
 proc okCallback {} {
     puts "You selected [.nmfsd get]"
     .nmfsd deactivate
 }

 fileselectiondialog .nmfsd -title Non-Modal
 .nmfsd buttonconfigure OK -command okCallback

 .nmfsd activate

 #
 # Modal example
 #
 fileselectiondialog .mfsd -modality application
 .mfsd center

 if {[.mfsd activate]} {
     puts "You selected [.mfsd get]"
 } else {
     puts "You cancelled the dialog"
 }

AUTHOR

Mark L. Ulferts

KEYWORDS

fileselectiondialog, fileselectionbox, dialog, dialogshell, shell, widget iwidgets-4.1.0/demos/html/finddialog.n.html0000644003604700454610000002403507347201324017231 0ustar dgp771divfinddialog - Create and manipulate a find dialog widget

finddialog - Create and manipulate a find dialog widget

SYNOPSIS

finddialog pathName ?options?

INHERITANCE

itk::Toplevel <- Shell <- Dialogshell <- Finddialog

STANDARD OPTIONS

activeBackground
cursor
highlightColor
insertOffTime
selectBorderWidth
activeForeground
disabledForeground
highlightThickness
insertOnTime
selectColor
background
font
insertBackground
insertWidth
selectForeground
borderWidth
foreground
insertBorderWidth
selectBackground

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

selectColor

See the "checkbutton" widget manual entry for details on the above associated options.

selectColor

See the "entryfield" widget manual entry for details on the above associated options.

labelFont

See the "labeledwidget" widget manual entry for details on the above associated options.

INHERITED OPTIONS

buttonBoxPadX
padY
buttonBoxPadY
separator
buttonBoxPos
thickness
padX

See the "dialogshell" widget manual entry for details on the above inherited options.

height
master
modality
width

See the "shell" widget manual entry for details on the above inherited options.

title

See the "Toplevel" widget manual entry for details on the above inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   clearCommand
Class:                  Command
Command-Line Switch:	-clearcommand

Name:                   matchCommand
Class:                  Command
Command-Line Switch:	-matchcommand

Name:                   patternBackground
Class:                  Background
Command-Line Switch:	-patternbackground

Name:                   patternForeground
Class:                  Background
Command-Line Switch:	-patternforeground

Name:                   searchBackground
Class:                  Background
Command-Line Switch:	-searchbackground

Name:                   searchForeground
Class:                  Background
Command-Line Switch:	-searchforeground

Name:                   textWidget
Class:                  TextWidget
Command-Line Switch:	-textwidget

DESCRIPTION

The finddialog command creates a find dialog that works in conjunction with a text or scrolledtext widget to provide a means of performing search operations. The user is prompted for a text pattern to be found in the text or scrolledtext widget. The search can be for all occurances, by regular expression, considerate of the case, or backwards.

METHODS

The finddialog command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for finddialog widgets:

INHERITED METHODS

add
invoke
buttonconfigure
show
default
hide

See the "buttonbox" widget manual entry for details on the above inherited methods.

activate
center
deactivate

See the "shell" widget manual entry for details on the above inherited methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the finddialog command.
pathName clear
Clears the pattern in the entry field and the pattern matchin indicators in the text or scrolledtext widget.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the finddialog command.
pathName find
Search for a specific text string in the text widget given by the -textwidget option. This method is the standard callback for the Find button. It is made available such that it can be bound to a find again action.

COMPONENTS

Name:                   all
Class:                  Checkbutton

Name:                   backwards
Class:                  Checkbutton

Name:                   case
Class:                  Checkbutton

Name:                   pattern
Class:                  Entryfield

Name:                   regexp
Class:                  Checkbutton

EXAMPLE

 scrolledtext .st
 pack .st
 .st insert end "Now is the time for all good men\\n" 
 .st insert end "to come to the aid of their country"

 finddialog .fd -textwidget .st
 .fd center .st
 .fd activate

AUTHOR

Mark L. Ulferts

KEYWORDS

finddialog, dialogshell, shell, widget iwidgets-4.1.0/demos/html/hierarchy.n.html0000644003604700454610000005160307347201334017111 0ustar dgp771divhierarchy - Create and manipulate a hierarchy widget

hierarchy - Create and manipulate a hierarchy widget

SYNOPSIS

hierarchy pathName ?options?

INHERITANCE

itk::Widget <- Labeledwidget <- Scrolledwidget <- Hierarchy

STANDARD OPTIONS

activeBackground
cursor
highlightThickness
activeForeground
disabledForeground
relief
background
foreground
selectBackground
borderWidth
highlightColor
selectForeground

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

activeRelief
elementBorderWidth
jump
troughColor

See the "scrollbar" widget manual entry for details on the above associated options.

spacing1
spacing2
spacing3
tabs

See the "text" widget manual entry for details on the above associated options.

INHERITED OPTIONS

labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable
labelMargin

See the "labeledwidget" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   alwaysQuery
Class:                  AlwaysQuery
Command-Line Switch:	-alwaysquery

Name:                   closedIcon
Class:                  Icon
Command-Line Switch:	-closedicon

Name:                   expanded
Class:                  Expanded
Command-Line Switch:	-expanded

Name:                   filter
Class:                  Filter
Command-Line Switch:	-filter

Name:                   height
Class:                  Height
Command-Line Switch:	-height

Name:                   iconCommand
Class:                  Command
Command-Line Switch:	-iconcommand

Name:                   markBackground
Class:                  Foreground
Command-Line Switch:	-markbackground

Name:                   markForeground
Class:                  Background
Command-Line Switch:	-markforeground

Name:                   menuCursor
Class:                  Cursor
Command-Line Switch:	-menucursor

Name:                   nodeIcon
Class:                  Icon
Command-Line Switch:	-nodeicon

Name:                   openIcon
Class:                  Icon
Command-Line Switch:	-openicon

Name:                   queryCommand
Class:                  Command
Command-Line Switch:	-querycommand

Name:                   hscrollMode
Class:                  ScrollMode
Command-Line Switch:	-hscrollmode

Name:                   sbWidth
Class:                  Width
Command-Line Switch:	-sbwidth

Name:                   scrollMargin
Class:                  Margin
Command-Line Switch:	-scrollmargin

Name:                   textBackground
Class:                  Background
Command-Line Switch:	-textbackground

Name:                   textFont
Class:                  Font
Command-Line Switch:	-textfont

Name:                   visibleitems
Class:                  VisibleItems
Command-Line Switch:	-visibleitems

Name:                   vscrollMode
Class:                  ScrollMode
Command-Line Switch:	-vscrollmode

Name:                   width
Class:                  Width
Command-Line Switch:	-width


DESCRIPTION

The hierarchy command creates a hierarchical data view widget. It allows the graphical management of a a list of nodes that can be expanded or collapsed. Individual nodes can be highlighted. Clicking with the right mouse button on any item brings up a special item menu. Clicking on the background area brings up a different popup menu. Options exist to provide user control over the loading of the nodes and actions associated with node selection. Since the hierarchy is based on the scrolledtext widget, it includes options to control the method in which the scrollbars are displayed, i.e. statically or dynamically. Options also exist for adding a label to the hierarchy and controlling its position.

METHODS

The hierarchy command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for hierarchy widgets:

ASSOCIATED METHODS

bbox
dlineinfo
insert
tag
compare
dump
scan
window
debug
get
search
xview
delete
index
see
yview

See the "text" manual entry for details on the standard methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the hierarchy command.
pathName clear
Removes all items from the hierarchy display including all tags and icons. The display will remain empty until the -filter or -querycommand options are set.
pathName collapse uid
Collapses the hierarchy beneath the node with the specified unique id by one level. Since this can take a moment for large hierarchies, the cursor will be changed to a watch during the collapse. Also, if any of the nodes beneath the node being collapsed are selected, their status is changed to unselected.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the hierarchy command.
pathName current
Returns the tags for the node that was most recently selected by the right mouse button when the item menu was posted. Usually used by the code in the item menu to figure out what item is being manipulated.
pathName draw ?when?
Performs a complete redraw of the entire hierarchy. When may be either -now or -eventually where the latter means the draw can be performed after idle.
pathName expand uid
Expands the hierarchy beneath the node with the specified unique id by one level. Since this can take a moment for large hierarchies, the cursor will be changed to a watch during the expansion.
pathName mark option ?arg arg ...?
This command is used to manipulate marks which is quite similar to selection, adding a secondary means of hilighting an item in the hierarchy. The exact behavior of the command depends on the option argument that follows the mark argument. The following forms of the command are currently supported:
pathName refresh uid
Performs a redraw of a specific node that has the given uid. If the node is not currently visible or in other words already drawn on the text, then no action is taken.
pathName prune uid
Removes the node specified by the given uid from the hierarchy. Should the node have children, then all of its children will be removed as well.
pathName selection option ?arg arg ...?
This command is used to manipulate the selection of nodes in the hierarchy. The exact behavior of the command depends on the option argument that follows the selection argument. The following forms of the command are currently supported:
A nodes selection status is also dependent on it being visible. If a node is selected and its parent is then collapsed making the selected node not visible, then its selection status is changed to unselected.
pathName toggle uid
Toggles the hierarchy beneath the node with the specified unique id. If the hierarchy is currently expanded, then it is collapsed, and vice-versa.

COMPONENTS

Name:                   list
Class:                  Text

Name:                   bgMenu
Class:                  Menu

Name:                   horizsb
Class:                  Scrollbar

Name:                   itemMenu
Class:                  Menu

Name:                   vertsb
Class:                  Scrollbar

EXAMPLE

proc get_files {file} {
    global env

    if {$file == ""} {
        set dir $env(HOME)
    } else {
        set dir $file
    }

    if {[catch {cd $dir}] != 0} {
        return ""
    }

    set rlist ""

    foreach file [lsort [glob -nocomplain *]] {
        lappend rlist [list [file join $dir $file] $file]
    }

    return $rlist
}

hierarchy .h -querycommand "get_files %n" -visibleitems 30x15 \
    -labeltext $env(HOME)
pack .h -side left -expand yes -fill both

AUTHORS

Mark L. Ulferts

Michael J. McLennan

KEYWORDS

hierarchy, text, widget iwidgets-4.1.0/demos/html/hyperhelp.n.html0000644003604700454610000001621706570255551017144 0ustar dgp771divhyperhelp - Create and manipulate a hyperhelp widget

hyperhelp - Create and manipulate a hyperhelp widget

SYNOPSIS

hyperhelp pathName ?options?

INHERITANCE

itk::Toplevel <- shell <- hyperhelp

STANDARD OPTIONS

activeBackground
cursor
highlightThickness
insertOnTime
relief
selectBorderWidth
background
exportSelection
insertBackground
insertWidth
repeatDelay
selectForeground
borderWidth
foreground
insertBorderWidth
padX
repeatInterval
setGrid
closecmd
highlightColor
insertOffTime
padY
selectBackground

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

hscrollmode
fontsize
width
unknownimage
vscrollmode
fixedfont
height
textbackground
link
state
fontname
linkhighlight
wrap

See the "scrolledhtml" widget manual entry for details on the above associated options.

INHERITED OPTIONS

modality
title

See the "shell" manual entry for details on the above inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   topics
Class:                  Topics
Command-Line Switch:    -topics

Name:                   helpdir
Class:                  Directory
Command-Line Switch:    -helpdir

Name:                   closeCmd
Class:                  CloseCmd
Command-Line Switch:    -closecmd

Name:                   maxHistory
Class:                  MaxHistory
Command-Line Switch:    -maxhistory

Name:                   beforelink
Class:                  BeforeLink
Command-Line Switch:    -beforelink

Name:                   afterlink
Class:                  AfterLink
Command-Line Switch:    -afterlink


DESCRIPTION

The hyperhelp command creates a shell window with a pulldown menu showing a list of topics. The topics are displayed by importing a HTML formatted file named helpdir/topic.html. For a list of supported HTML tags, see scrolledhtml(n).

METHODS

The hyperhelp command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for dialog widgets:

INHERITED METHODS

activate
center
childsite
deactivate

See the "shell" manual entry for details on the above inherited methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the hyperhelp command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the hyperhelp command.
pathName showtopic topic
Display html file helpdir/topic.html. Topic may optionally be of the form topicname#anchorname. In this form, either topicname or anchorname or both may be empty. If topicname is empty, the current topic is assumed. If anchorname is empty, the top of the document is assumed
pathName followlink href
Display html file href. Href may be optionally be of the form filename#anchorname. In this form, either filename or anchorname or both may be empty. If filename is empty, the current document is assumed. If anchorname is empty, the top of the document is assumed.
pathName forward
Display html file one forward in history list, if applicable.
pathName back
Display html file one back in history list, if applicable.

EXAMPLE

 hyperhelp .h -topics { Intro Help } -helpdir ~/help
 .h showtopic Intro
 

AUTHOR

Kris Raney

KEYWORDS

hyperhelp, html, help, shell, widget iwidgets-4.1.0/demos/html/iwidgets4.0.0UserCmds.html0000755003604700454610000000727007340264623020553 0ustar dgp771div
iwidgets4.0.0 User Commands
iwidgets4.0.0 User Commands

iwidgets-4.1.0/demos/html/labeledframe.n.html0000644003604700454610000001454706570244361017550 0ustar dgp771divlabeledframe - Create and manipulate a labeled frame widget

labeledframe - Create and manipulate a labeled frame widget

SYNOPSIS

labeledframe pathName ?options?

INHERITANCE

itk::Archetype <- labeledframe

STANDARD OPTIONS

background
relief
borderwidth
cursor
foreground

See the "options" manual entry for details on the standard options.

WIDGET-SPECIFIC OPTIONS

Name:                   iPadX
Class:                  IPad
Command-Line Switch:	-ipadx

Name:                   iPadY
Class:                  IPad
Command-Line Switch:	-ipady

Name:                   labelBitmap
Class:                  Bitmap
Command-Line Switch:	-labelbitmap

Name:                   labelImage
Class:                  Image
Command-Line Switch:	-labelimage

Name:                   labelMargin
Class:                  Margin
Command-Line Switch:	-labelmargin

Name:                   labelText
Class:                  Text
Command-Line Switch:	-labeltext

Name:                   labelVariable
Class:                  Variable
Command-Line Switch:	-labelvariable

Name:                   labelFont
Class:                  Font
Command-Line Switch:	-labelfont

Name:                   labelPos
Class:                  Position
Command-Line Switch:	-labelpos


DESCRIPTION

The labeledframe command creates a hull frame with a grooved relief, a label positioned within the grooved relief of the hull frame, and a frame childsite. The frame childsite can filled with any widget via a derived class or though the use of the childsite method. This class was designed to be a general purpose base class for supporting the combination of labeled frame and a childsite. The options include the ability to position the label at configurable locations within the grooved relief of the hull frame, and control the display of the label.

METHODS

The labeledframe command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for labeledframe widgets:

WIDGET-SPECIFIC METHODS

pathName childsite
Return the path name of the child site.
pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the labeledframe command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the labeledframe command.

COMPONENTS

Name:                   label
Class:                  label

EXAMPLE

 labeledframe .lw -labeltext "Entry Frame" -labelpos n
 pack .lw -fill both -expand yes -padx 10 -pady 10
 set cs [.lw childsite]

 pack [Entryfield $cs.entry1 -labeltext "Name:"] -side top -fill x
 pack [Spinint $cs.entry2 -labeltext "Number:"] -side top -fill x
 pack [Pushbutton $cs.entry3 -text "Details:"] -side top -fill x

AUTHOR

John A. Tucker

KEYWORDS

labeledframe, widget iwidgets-4.1.0/demos/html/labeledwidget.n.html0000644003604700454610000001554407347201342017732 0ustar dgp771divlabeledwidget - Create and manipulate a labeled widget

labeledwidget - Create and manipulate a labeled widget

SYNOPSIS

labeledwidget pathName ?options?

INHERITANCE

itk::Widget <- labeledwidget

STANDARD OPTIONS

background
cursor
foreground

See the "options" manual entry for details on the standard options.

WIDGET-SPECIFIC OPTIONS

Name:                   disabledForeground
Class:                  DisabledForeground
Command-Line Switch:	-disabledforeground

Name:                   labelBitmap
Class:                  Bitmap
Command-Line Switch:	-labelbitmap

Name:                   labelFont
Class:                  Font
Command-Line Switch:	-labelfont

Name:                   labelImage
Class:                  Image
Command-Line Switch:	-labelimage

Name:                   labelMargin
Class:                  Margin
Command-Line Switch:	-labelmargin

Name:                   labelPos
Class:                  Position
Command-Line Switch:	-labelpos

Name:                   labelText
Class:                  Text
Command-Line Switch:	-labeltext

Name:                   labelVariable
Class:                  Variable
Command-Line Switch:	-labelvariable

Name:                   state
Class:                  State
Command-Line Switch:	-state


DESCRIPTION

The labeledwidget command creates a labeled widget which contains a label and child site. The child site is a frame which can filled with any widget via a derived class or though the use of the childsite method. This class was designed to be a general purpose base class for supporting the combination of label widget and a childsite. The options include the ability to position the label around the childsite widget, modify the font and margin, and control the display of the labels.

METHODS

The labeledwidget command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for labeledwidget widgets:

WIDGET-SPECIFIC METHODS

pathName childsite
Return the path name of the child site.
pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the labeledwidget command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the labeledwidget command.

STATIC METHODS

Labeledwidget::alignlabels widget ?widget ...?
The alignlabels procedure takes a list of widgets derived from the Labeledwidget class and uses the label margin to make each widget have the same total space for the combination of label and margin. The net effect is to left align the labels. Generally, this method is only useful with a label position of w, which is the default.

COMPONENTS

Name:                   label
Class:                  label

Name:                   lwchildsite
Class:                  frame

EXAMPLE

 labeledwidget .lw -labeltext "Canvas Widget" -labelpos s
 pack .lw -fill both -expand yes -padx 10 -pady 10

 set cw [canvas [.lw childsite].c -relief raised -width 200 -height 200]
 pack $cw -padx 10 -pady 10

AUTHOR

Mark L. Ulferts

KEYWORDS

labeledwidget, widget iwidgets-4.1.0/demos/html/mainwindow.n.html0000644003604700454610000002434407347201354017313 0ustar dgp771divmainwindow - Create and manipulate a mainwindow widget

mainwindow - Create and manipulate a mainwindow widget

SYNOPSIS

mainwindow pathName ?options?

INHERITANCE

itk::Toplevel <- shell <- mainwindow

STANDARD OPTIONS

background
foreground
cursor
highlightBackground
disabledForeground
highlightColor
font
highlightThickness

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

balloonBackground
balloonForeground
balloonDelay1
balloonDelay2
ballonFont

See the "toolbar" manual entry for details on the above associated options.

INHERITED OPTIONS

title

See the "Toplevel" manual entry for details on the above inherited options.

height
padY
master
width
modality
padX

See the "shell" manual entry for details on the above inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   helpLine
Class:                  HelpLine
Command-Line Switch:	-helpline

Name:                   menuBarBackground
Class:                  Background
Command-Line Switch:	-menubarbackground

Name:                   menuBarFont
Class:                  Font
Command-Line Switch:	-menubarfont

Name:                   menuBarForeround
Class:                  Foreground
Command-Line Switch:	-menubarforeground

Name:                   statusLine
Class:                  StatusLine
Command-Line Switch:	-statusline

Name:                   toolBarBackground
Class:                  Background
Command-Line Switch:	-toolbarbackground

Name:                   toolBarFont
Class:                  Font
Command-Line Switch:	-toolbarfont

Name:                   toolBarForeround
Class:                  Foreground
Command-Line Switch:	-toolbarforeground

DESCRIPTION

The mainwindow command creates a mainwindow shell which contains a menubar, toolbar, mousebar, childsite, status line, and help line. Each item may be filled and configured to suit individual needs.

METHODS

The mainwindow command create a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for mainwindow widgets:

INHERITED METHODS

activate
center
deactivate

See the "shell" manual entry for details on the above inherited methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the mainwindow command.
pathName childsite
Returns the pathname of the child site widget.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the mainwindow command.
pathName menubar ?args?
The menubar method provides access to the menubar. Invoked with no arguments it returns the pathname of the menubar. With arguments, they are evaluated against the menubar which in effect provides access to the entire API of the menubar. See the "menubar" manual entry for details on the commands available in the menubar.
pathName mousebar ?args?
The mousebar method provides access to the mousebar which is a vertical toolbar. Invoked with no arguments it returns the pathname of the mousebar. With arguments, they are evaluated against the mousebar which in effect provides access to the entire API of the underlying toolbar. See the "toolbar" manual entry for details on the commands available in the mousebar.
pathName msgd ?args?
The msgd method provides access to the messagedialog contained in the mainwindow. Invoked with no arguments it returns the pathname of the messagedialog. With arguments, they are evaluated against the messagedialog which in effect provides access to the entire API of the messagedialog. See the "messagedialog" manual entry for details on the commands available in the messagedialog.
pathName toolbar ?args?
The toolbar method provides access to the toolbar. Invoked with no arguments it returns the pathname of the toolbar. With arguments, they are evaluated against the toolbar which in effect provides access to the entire API of the toolbar. See the "toolbar" manual entry for details on the commands available in the toolbar.

COMPONENTS

Name:                   help
Class:                  Label

Name:                   menubar
Class:                  Menubar

Name:                   mousebar
Class:                  Toolbar

Name:                   msgd
Class:                  Messagedialog

Name:                   status
Class:                  Label

Name:                   toolbar
Class:                  Toolbar

EXAMPLE

 mainwindow .mw

 #
 # Add a File menubutton
 #
 .mw menubar add menubutton file -text "File" -underline 0 -padx 8 -pady 2 \\
    -menu {options -tearoff no
	   command new -label "New" -underline 0 \\
	       -helpstr "Create a new file"
	   command open -label "Open ..." -underline 0 \\
	       -helpstr "Open an existing file"
	   command save -label "Save" -underline 0 \\
	       -helpstr "Save the current file"
	   command saveas -label "Save As ..." -underline 5 \\
	       -helpstr "Save the file as a differnet name"
	   command print -label "Print" -underline 0 \\
	       -helpstr "Print the file"
           separator sep1
	   command close -label "Close" -underline 0 \\
	       -helpstr "Close the file"
	   separator sep2
	   command exit -label "Exit" -underline 1 \\
	       -helpstr "Exit this application" 
    }

 #
 # Install a scrolledtext widget in the childsite.
 #
 scrolledtext [.mw childsite].st
 pack [.mw childsite].st -fill both -expand yes

 #
 # Activate the main window.
 #
 .mw activate

AUTHORS

Mark L. Ulferts

John A. Tucker

KEYWORDS

mainwindow, shell, widget iwidgets-4.1.0/demos/html/menubar.n.html0000644003604700454610000005555306570255552016604 0ustar dgp771divmenubar - Create and manipulate menubar menu widgets

menubar - Create and manipulate menubar menu widgets

SYNOPSIS

menubar pathName ?options?

INHERITANCE

itk::Widget <- menubar

STANDARD OPTIONS

activeBackground
activeBorderWidth
activeForeground
anchor
foreground
borderWidth
cursor
disabledForeground
font
padX
highlightBackground
highligthThickness
highlightColor
justify
padY
relief
wrapLength
background

See the "options" manual entry for details on the standard options.

WIDGET-SPECIFIC OPTIONS

Name:                   helpVariable
Class:                  HelpVariable
Command-Line Switch:	-helpvariable

Name:                   menuButtons
Class:                  MenuButtons
Command-Line Switch:	-menubuttons

    -menubuttons
    -text
    -text
    -text

{
File
Edit
Options
menubar
menubutton
menubutton
menubutton
}
.mb
file
edit
options

DESCRIPTION

The menubar command creates a new window (given by the pathName argument) and makes it into a menubar menu widget. Additional options, described above may be specified on the command line or in the option database to configure aspects of the menubar such as its colors and font. The menubar command returns its pathName argument. At the time this command is invoked, there must not exist a window named pathName, but pathName's parent must exist.

A menubar is a widget that simplifies the task of creating menu hierarchies. It encapsulates a frame widget, as well as menubuttons, menus, and menu entries. The menubar allows menus to be specified and referenced in a more consistent manner than using Tk to build menus directly. Menubar allows a menu tree to be expressed in a hierachical "language". The menubar accepts a menuButtons option that allows a list of menubuttons to be added to the menubar. In turn, each menubutton accepts a menu option that specifies a list of menu entries to be added to the menubutton's menu. Cascade entries also accept the menu option for specifying a list of menu entries to be added to the cascade's menu. Additionally, the menubar allows each component of the menubar system to be referenced by a simple menuPathName syntax. The menubar also extends the set of options for menu entries to include a helpStr option.

MENU PATH NAMES

A menuPathName is a series of component names separated by the `.' character. Each menubar component can be referenced via these menuPathNames. menuPathNames are similar to widget pathNames in Tk. Some correspond directly to a widget pathName (components of type menu or menubutton), others correspond to a menu entry type. Every widget and entry in a menubar can be referenced with the menuPathName naming convention. A menubar can have four types of components:

The suffix of a menuPathName may have the form of:

tkWidgetName
Specifies the name of the component, either a frame, menubutton, menu, or an entry. This is the normal naming of widgets. For example, .file references a menubutton named file.

The menuPathName is a series of segment names, each separated by the '.' character. Segment names may be one of the following forms:

number
Specifies the index of the the component. For menubuttons, 0 corresponds to the left-most menubutton of the menu bar frame. As an example, .1 would correspond to the second menubutton on the menu bar frame.
end
Specifes the last component. For menubuttons, it specifies the right-most entry of the menu bar frame. For menu entries, it specifies the bottom-most entry of the menu.
last
Same as end.

Finally, menu components always end with the menu keyword. These components are automatically created via the -menu option on menubuttons and cascades or via the add or insert commands.

menu
Specifes the menu pane that is associated with the given menubutton prefix. For example, .file.menu specifies the menu pane attached to the .file menubutton.

For example, the path .file.new specifies the entry named new on the menu associated with the file menubutton located on the menu bar. The path .file.menu specifies the menu pane associated with the menubutton .file. The path .last specifies the last menu on the menu bar. The path .0.last would specify the first menu (file) and the last entry on that menu (quit), yielding .file.quit. As a restriction, the last name segment of menuPathName cannot be one of the keywords last, menu, end, nor may it be a numeric value (integer).

WIDGET-SPECIFIC METHODS

The menubar command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
option and the args determine the exact behavior of the command.

In addition, many of the widget commands for menubar take as one argument a path name to a menu component. These path names are called menuPathNames. See the discussion on MENUBAR PATH NAMES above.

The following commands are possible for menubar widgets:

pathName add type menuPathName ?option value option value?
Adds either a menu to the menu bar or a menu entry to a menu pane.
pathName cget option
Returns the current value of the configuration option given by option.
pathName configure ?options value option value?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string.
pathName delete menuPathName ?menuPathName2?
If menuPathName is of component type Menubutton or Menu, delete operates on menus. If menuPathName is of component type Entry, delete operates on menu entries. This command deletes all components between menuPathName and menuPathName2 inclusive. If menuPathName2 is omitted then it defaults to menuPathName. Returns an empty string. If menuPathName is of type menubar, then all menus and the menu bar frame will be destroyed. In this case menuPathName2 is ignored.
pathName index menuPathName
If menuPathName is of type menubutton or menu, it returns the position of the menu/menubutton on the menubar frame. If menuPathName is of type command, separator, radiobutton, checkbutton, or cascade, it returns the menu widget's numerical index for the entry corresponding to menuPathName. If path is not found or the path is equal to ".", a value of -1 is returned.
pathName insert menuPathName type name ?option value?
Insert a new component named name before the component specified by menuPathName.
pathName invoke menuPathName
Invoke the action of the menu entry denoted by menuPathName. See the sections on the individual entries in the menu(1) man pages. If the menu entry is disabled then nothing happens. If the entry has a command associated with it then the result of that command is returned as the result of the invoke widget command. Otherwise the result is an empty string. If menuPathName is not a menu entry, an error is issued.
pathName menucget menuPathName option
Returns the current value of the configuration option given by option. The component type of menuPathName determines the valid available options.
pathName menuconfigure menuPathName ?option value?
Query or modify the configuration options of the componet of the menubar specified by menuPathName. If no option is specified, returns a list describing all of the available options for menuPathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. The component type of menuPathName determines the valid available options.
pathName path ?mode? pattern
Returns a fully formed menuPathName that matches pattern. If no match is found it returns -1. The mode argument indicates how the search is to be matched against pattern and it must have one of the following values:
pathName type menuPathName
Returns the type of the component specified by menuPathName. For menu entries, this is the type argument passed to the add/insert widget command when the entry was created, such as command or separator. Othewise it is either a menubutton or a menu.
pathName yposition menuPathName
Returns a decimal string giving the y-coordinate within the menu window of the topmost pixel in the entry specified by menuPathName. If the menuPathName is not an entry, an error is issued.

EXAMPLE ONE: USING GRAMMAR

The following example creates a menubar with "File", "Edit", "Options" menubuttons. Each of these menubuttons has an associated menu. In turn the File menu has menu entries, as well as the Edit menu and the Options menu. The Options menu is a tearoff menu with selectColor (for radiobuttons) set to blue. In addition, the Options menu has a cascade titled More, with several menu entries attached to it as well. An entry widget is provided to display help status.

menubar .mb -helpvariable helpVar -menubuttons { menubutton file -text File -menu { options -tearoff false command new -label New \\ -helpstr "Open new document" \\ -command {puts NEW} command close -label Close \\ -helpstr "Close current document" \\ -command {puts CLOSE} separator sep1 command exit -label Exit -command {exit} \\ -helpstr "Exit application" } menubutton edit -text Edit -menu { options -tearoff false command undo -label Undo -underline 0 \\ -helpstr "Undo last command" \\ -command {puts UNDO} separator sep2 command cut -label Cut -underline 1 \\ -helpstr "Cut selection to clipboard" \\ -command {puts CUT} command copy -label Copy -underline 1 \\ -helpstr "Copy selection to clipboard" \\ -command {puts COPY} command paste -label Paste -underline 0 \\ -helpstr "Paste clipboard contents" \\ -command {puts PASTE} } menubutton options -text Options -menu { options -tearoff false -selectcolor blue radiobutton byName -variable viewMode \\ -value NAME -label "by Name" \\ -helpstr "View files by name order" \\ -command {puts NAME} radiobutton byDate -variable viewMode \\ -value DATE -label "by Date" \\ -helpstr "View files by date order" \\ -command {puts DATE} cascade prefs -label Preferences -menu { command colors -label Colors... \\ -helpstr "Change text colors" \\ -command {puts COLORS} command fonts -label Fonts... \\ -helpstr "Change text font" \\ -command {puts FONT} } } }
frame
-height
-textvariable
-anchor
-expand
-fill
pack
-fill

EXAMPLE
Alternatively
could
using
configure
menubar
-menubuttons
-text
command
command
separator
-label
edit


.edit.undo
0
.edit.sep2
.edit.cut
1
.edit.copy
1
.edit.paste
0
.options
{
viewMode
-label
byDate
-value
Date"
cascade
-menu
-label
-label
.mb
nw
yes
option
the
evaluated
the
positive
is
string
commands,
However,
into
single
can
enclosing
curly
ensures,
value
will
as
and
The
this

Menu"
menubar
menubutton
menubutton
-menu
\\
-variable
-onvalue
0
-text

.fr
300
helpVar
nw
yes
both
.ef
x
TWO:
the
be
the
methods:
.mb
{
File
new
close
sep1
Quit
-text
.mb
-label
.mb
.mb
-label
.mb
-label
.mb
-label
.mb
-text
radiobutton
\\
"by
-variable
DATE
}
.options.prefs
{
Colors...
Fonts...
-side
-fill

CAVEATS


as
-menu
by
subst
side
that
may
and/or
substitutions
more
word.
be
candidate
braces
for
for
still
a
not
following
case:
set
set
.mb
file
edit
{
-label
{[scope
1
}
Options
-width
entry
pack
-fill
pack
-expand
-anchor
-expand
USING
same
created
add


.mb
menubutton
-menu
-label
-label
command
}
Edit
add
Undo
add
add
Cut
add
Copy
add
Paste
add
Options
byName
-value
Name"
viewMode
-label
.mb
-label
command
command
}
left
x
The
well
option
menubar
command.
of
the
contain
backslash
might
than
These
protected
substitutions
({}).
example,
an
be
single
multiple
example

fileMenuName
var
-menubuttons
-text
-text
checkbutton
Check
var]}
\\
menubutton
}
300
.ef
.mb
x
.fr
yes
sw
yes
METHODS
menu
by
and

configure
file
{
New
Close
quit
menubutton
}
command
-underline
separator
command
-underline
command
-underline
command
-underline
menubutton
-menu
-variable
NAME
radiobutton
\\
"by
add
Preferences
colors
fonts
pack
-anchor
-expand
-menubuttons
as
is
with
The
this
option
variables,
substitutions.
expand
a
expansions
by
in
This
a
option
treated
value
values.
illustrates

    "File
    {}
    {
    {$fileMenuName}
    Edit
    check
    \\
    \\
    -offvalue
    options
    The variable fileMenuName will expand to "File Menu" when the subst command is used on the menubutton specification. In addition, the [scope...] command will expand to @scope :: var. By enclosing these inside {} they stay as a single value. Note that only {} work for this. [list...], "" etc. will not protect these from the subst command.

ACKNOWLEDGMENTS

Bret Schumaker

    1994 - Early work on a menubar widget.

Mark Ulferts, Mark Harrison, John Sigler

    Invaluable feedback on grammar and usability of the menubar widget

AUTHOR

Bill W. Scott

KEYWORDS

frame, menu, menubutton, entries, help iwidgets-4.1.0/demos/html/messagebox.n.html0000644003604700454610000002500607347201363017270 0ustar dgp771divmessagebox - Create and manipulate a messagebox text widget

messagebox - Create and manipulate a messagebox text widget

SYNOPSIS

messagebox pathName ?options?

INHERITANCE

itk::Widget <- Labeledwidget <- Scrolledwidget <- Messagebox

STANDARD OPTIONS

activeBackground
cursor
highlightColor
relief
activeForeground
exportSelection
highlightThickness
setGrid
background
font
padX
borderWidth
foreground
padY

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable
labelMargin

See the "labeledwidget" class manual entry for details on the above associated options.

activeRelief
elementBorderWidth
jump
troughColor

See the "scrollbar" widget manual entry for details on the above associated options.

height
textBackground
hscrollMode
visibleItems
sbWidth
vscrollMode
scrollMargin
width

See the "scrolledtext" widget manual entry for details on the above associated options.

spacing1
spacing2
spacing3

See the "text" widget manual entry for details on the above associated options.

WIDGET-SPECIFIC OPTIONS

Name:                   fileName
Class:                  FileName
Command-Line Switch:	-filename
    Specifies the filename to be displayed in the file selection dialog when it pops up during a save of the messagebox contents operation.

Name:                   maxLines
Class:                  MaxLines
Command-Line Switch:	-maxlines
    Specifies the maximum number of lines allowed in the text area of the messagebox. When this limit is reached, the oldest line will be deleted such that the total number of lines remains maxlines.

Name:                   saveDir
Class:                  SaveDir
Command-Line Switch:	-savedir
    Specifies the default directory to display when the file selection dialog pops up during a save of the messagebox contents operation. If this parameter is not specified, then the files in the current working directory are displayed.


DESCRIPTION

The messagebox command creates a scrolled information messages area widget. Message types can be user defined and configured. Their options include foreground, background, font, bell, and their display mode of on or off. This allows message types to defined as needed, removed when no longer so, and modified when necessary. An export method is provided for file I/O.

The number of lines displayed may be limited with the default being 1000. When this limit is reached, the oldest line is removed. A popup menu which appears when the right mouse button has been pressed in the message area has been predefined. The contents of the popup menu by default support clearing the area and saving its contents to a file. Additional operations may be defined or existing operations removed by using the component command to access the popup menu.

MESSAGE TYPES

The display characteristics of messages issued to the messagebox vary with the message type. Types are defined by the user and they may be added, removed, and configured. The options of the message type control the display include the following:

-background color
Color specifies the background color to use for characters associated with the message type. It may have any of the forms accepted by Tk_GetColor.
-bell boolean
Specifies whether or not to ring the bell whenenver a message of this type is issued. Boolean may have any of the forms accepted by Tk_GetBoolean. The default is 0.
-font\ fontName
FontName is the name of a font to use for drawing characters. It may have any of the forms accepted by Tk_GetFontStruct.
-foreground color
Color specifies the foreground color to use for characters associated with the message type. It may have any of the forms accepted by Tk_GetColor.
-show boolean
Specifies whether of not to display this message type when issued. Boolean may have any of the forms accepted by Tk_GetBoolean. The default is 1.

METHODS

The messagebox command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for messagebox widgets:

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the messagebox command.
pathName clear
Clear the messagebox of all messages.
pathName export filename
Write text to a file. If filename exists then contents are replaced with text widget contents.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the messagebox command.
pathName type option msgtype ?arg arg ...?
This command is used to manipulate message types. The behavior of the command depends on the option argument that follows the type keyword. The following forms of the command are supported:
    pathName type add msgtype ?option value ...?
    Adds a new message type given by msgtype with the display properties defined by the option value pairs. See MESSAGE TYPES for information on the options that are supported.
    pathName type cget msgtype option
    Returns the value of a configuration option for a message type. Msgtype identifies the message type, and option specifies a particular configuration option, which must be one of the ones listed in the section MESSAGE TYPES.
    pathName type configure msgtype ?option value ...?
    Query or modify the configuration options for a message type. If no option is specified, returns a list describing all of the available options for the message type msgtype. If option is specified with no value, then the command returns a list describing the one named option. If one or more option-value pairs are specified, then the command modifies the given option(s) to have the given value(s); in this case the command returns an empty string. See MESSAGE TYPES for information on the options that are supported. pathName type remove msgtype Removes an existing message type given by msgtype.
pathName issue string ?level? ?tags?
Print a string to the text area at the given level and with any additional tags specified.

COMPONENTS

Name:                   itemMenu
Class:                  Menu
    This is the popup menu that gets displayed when you right-click in the text area of the messagebox. Its contents may be modified via the component command.

Name:                   text
Class:                  Scrolledtext
    The text component is the scrolledtext widget. See the "scrolledtext" widget manual entry for details on the text component item.

EXAMPLE

 messagebox .mb -hscrollmode dynamic -labeltext "Messages" -labelpos n \\
	-height 120 -width 550 -savedir "/tmp" -textbackground #d9d9d9

 pack .mb -padx 5 -pady 5 -fill both -expand yes

 .mb type add ERROR -background red -foreground white -bell 1
 .mb type add WARNING -background yellow -foreground black
 .mb type add INFO -background white -foreground black

 .mb issue "This is an error message in red with a beep" ERROR
 .mb issue "This warning message in yellow" WARNING
 .mb issue "This is an informational message" INFO

AUTHORS

Alfredo Jahn V

Mark L. Ulferts

KEYWORDS

messagebox, scrolledtext, text, widget iwidgets-4.1.0/demos/html/messagedialog.n.html0000644003604700454610000001530507347201372017740 0ustar dgp771divmessagedialog - Create and manipulate a message dialog widget

messagedialog - Create and manipulate a message dialog widget

SYNOPSIS

messagedialog pathName ?options?

INHERITANCE

itk::Toplevel <- Shell <- Dialogshell <- Dialog <- Messagedialog

STANDARD OPTIONS

background
foreground
bitmap
image
cursor
text
font

See the "options" manual entry for details on the standard options.

INHERITED OPTIONS

buttonBoxPadX
padY
buttonBoxPadY
separator
buttonBoxPos
thickness
padX

See the "dialogshell" widget manual entry for details on the above inherited options.

master
modality

See the "shell" widget manual entry for details on the above inherited options.

title

See the "Toplevel" widget manual entry for details on the above inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   imagePos
Class:                  Position
Command-Line Switch:	-imagepos
    Specifies the image position relative to the message text: n, s, e, or w. The default is w.

Name:                   textPadX
Class:                  Pad
Command-Line Switch:	-textpadx
    Specifies a non-negative value indicating how much extra space to request for the message text in the X direction. The value may have any of the forms acceptable to Tk_GetPixels.

Name:                   textPadY
Class:                  Pad
Command-Line Switch:	-textpady
    Specifies a non-negative value indicating how much extra space to request for the message text in the X direction. The value may have any of the forms acceptable to Tk_GetPixels.


DESCRIPTION

The messagedialog command creates a message dialog composite widget. The messagedialog is derived from the Dialog class and is composed of an image and associated message text with commands to manipulate the dialog buttons.

METHODS

The messagedialog command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for messagedialog widgets:

INHERITED METHODS

add
insert
buttonconfigure
invoke
default
show
hide

See the "buttonbox" widget manual entry for details on the above inherited methods.

childsite

See the "dialogshell" widget manual entry for details on the above inherited methods.

activate
center
deactivate

See the "dialogshell" widget manual entry for details on the above inherited methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the messagedialog command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the messagedialog command.

COMPONENTS

Name:                   image
Class:                  Label
    The image component is the bitmap or image of the message dialog. See the "label" widget manual entry for details on the image component item.

Name:                   message
Class:                  Label
    The message component provides the textual portion of the message dialog. See the "label" widget manual entry for details on the message component item.

EXAMPLE

 #
 # Standard question message dialog used for confirmation.
 #
 messagedialog .md -title "Message Dialog" -text "Are you sure ?" \\
	-bitmap questhead -modality global

 .md buttonconfigure OK -text Yes
 .md buttonconfigure Cancel -text No

 if {[.md activate]} {
    .md configure -text "Are you really sure ?"
    if {[.md activate]} {
	puts stdout "Yes"
    } else {
	puts stdout "No"
    }
 } else {
    puts stdout "No"
 }

 destroy .md

 #
 # Copyright notice with automatic deactivation.
 #
 messagedialog .cr -title "Copyright" -bitmap @dsc.xbm -imagepos n \\
     -text "Copyright 1995 DSC Communications Corporation\\n \\
	    All rights reserved"
 
 .cr hide Cancel

 .cr activate
 after 10000 ".cr deactivate"

AUTHOR

Mark L. Ulferts

KEYWORDS

messagedialog, dialog, dialogshell, shell, widget iwidgets-4.1.0/demos/html/notebook.n.html0000644003604700454610000003601606570255554016766 0ustar dgp771divnotebook - create and manipulate notebook widgets

notebook - create and manipulate notebook widgets

SYNOPSIS

notebook pathName ?options?

INHERITANCE

itk::Widget <- notebook

STANDARD OPTIONS

background
cursor
foreground
height
scrollCommand
width

See the "options" manual entry for details on the standard options.

WIDGET-SPECIFIC OPTIONS

Name:                   auto
Class:                  Auto
Command-Line Switch:	-auto

DESCRIPTION

The notebook command creates a new window (given by the pathName argument) and makes it into a notebook widget. Additional options, described above may be specified on the command line or in the option database to configure aspects of the notebook such as its colors, font, and text. The notebook command returns its pathName argument. At the time this command is invoked, there must not exist a window named pathName, but pathName's parent must exist. A notebook is a widget that contains a set of pages. It displays one page from the set as the selected page. When a page is selected, the page's contents are displayed in the page area. When first created a notebook has no pages. Pages may be added or deleted using widget commands described below.

NOTEBOOK PAGES

A notebook's pages area contains a single child site frame. When a new page is created it is a child of this frame. The page's child site frame serves as a geometry container for applications to pack widgets into. It is this frame that is automatically unpacked or packed when the auto option is true. This creates the effect of one page being visible at a time. When a new page is selected, the previously selected page's child site frame is automatically unpacked from the notebook's child site frame and the newly selected page's child site is packed into the notebook's child site frame. However, sometimes it is desirable to handle page changes in a different manner. By specifying the auto option as false, child site packing can be disabled and done differently. For example, all widgets might be packed into the first page's child site frame. Then when a new page is selected, the application can reconfigure the widgets and give the appearance that the page was flipped. In both cases the command option for a page specifies a Tcl Command to execute when the page is selected. In the case of auto being true, it is called between the unpacking of the previously selected page and the packing of the newly selected page.

WIDGET-SPECIFIC METHODS

The notebookfR command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
option and the args determine the exact behavior of the command.

Many of the widget commands for a notebook take as one argument an indicator of which page of the notebook to operate on. These indicators are called indexes and may be specified in any of the following forms:

number
Specifies the index of the the component. For menus, 0 corresponds to the left-most menu of the menu bar. For entries, 0 corresponds to the top-most entry of the menu. number Specifies the page numerically, where 0 corresponds to the first page in the notebook, 1 to the second, and so on.
select
Specifies the currently selected page's index. If no page is currently selected, the value -1 is returned.
end
Specifes the last page in the notebooks's index. If the notebook is empty this will return -1.
pattern
If the index doesn't satisfy the form of a number, then this form is used. Pattern is pattern-matched against the label of each page in the notebook, in order from the first to the last page, until a matching entry is found. The rules of Tcl_StringMatch are used.

'............................................................................. The following commands are possible for notebook widgets:

pathName add ?option value?
Add a new page at the end of the notebook. A new child site frame is created. Returns the child site pathName. If additional arguments are present, they specify any of the following options:
pathName childSite ?index?
If passed no arguments, returns a list of pathNames for all the pages in the notebook. If the notebook is empty, an empty list is returned
pathName cget option
Returns the current value of the configuration option given by option.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the notebook command.
pathName delete index1 ?index2?
Delete all of the pages between index1 and index2 inclusive. If index2 is omitted then it defaults to index1. Returns an empty string.
pathName index index
Returns the numerical index corresponding to index.
pathName insert index ?option value?
Insert a new page in the notebook before the page specified by index. A new child site frame is created. See the add command for valid options. Returns the child site pathName.
pathName next
Advances the selected page to the next page (order is determined by insertion order). If the currently selected page is the last page in the notebook, the selection wraps around to the first page in the notebook.
pathName pagecget index ?option?
Returns the current value of the configuration option given by option for the page specified by index. The valid available options are the same as available to the add command.
pathName pageconfigure index ?option? ?value option value ...?
This command is similar to the configure command, except that it applies to the options for an individual page, whereas configure applies to the options for the notebook. Options may have any of the values accepted by the add widget command. If options are specified, options are modified as indicated in the command and the command returns an empty string. If no options are specified, returns a list describing the current options for page index (see Tk_ConfigureInfo for information on the format of this list).
pathName prev
Moves the selected page to the previous page (order is determined by insertion order). If the currently selected page is the first page in the notebook, the selection wraps around to the last page in the notebook.
pathName select index
Selects the page specified by index as the currently selected page.
pathName view
Returns the currently selected page. This command is for compatibility with the scrollbar widget.
pathName view index
Selects the page specified by index as the currently selected page. This command is for compatibility with the scrollbar widget.
pathName view moveto fraction
Uses the fraction value to determine the corresponding page to move to. This command is for compatibility with the scrollbar widget.
pathName view scroll num what
Uses the num value to determine how many pages to move forward or backward (num can be negative or positive). The what argument is ignored. This command is for compatibility with the scrollbar widget.

EXAMPLE

Following is an example that creates a notebook with two pages. In this example, we use a scrollbar widget to control the notebook widget.

    the
    pack
    -width
    pack
    \\
    -expand
    left
    \\
    #
    to
    #
    "Page
    add
    .nb
    Two"
    Get
    frames
    pages.
    childsite
    [.nb

buttons
of
$page1CS.b
pack
-text
$page2CS.b
Select
of
select
#
and
#
together,
scrollbar
".nb
-scrollcommand
.scroll
yes

notebook
it.
100
.nb
-fill
yes
\\
-pady
Add
the
"Page
Two",
-label
add

the
of
set
0]
childsite

    on
    the
    -text
    $page1CS.b
    "Button

the
the
0
Create
associate
and
then
ScrollBar
view"
".scroll
-fill
-pady
#
widget
notebook
-height
-anchor
both
\\
-padx
10
two
notebook,
One"
respectively.
"Page
-label

    child
    these
    page1CS
    set
    "Page
    #
    each
    notebook
    "Button
    button
    Two"

      first
      notebook

    the
    teh
    the
    pack
    .scroll
    .nb
    set"
    y
    10
Create
and
.nb
100
nw
\\
-side
10

    pages
    labelled
    and
    .nb
    One"
    "Page
    #
    site
    two
    [.nb
    page2CS
    Two"]
    Create
    page
    button
    One"
    $page2CS.b
    pack
    #
    page
    .nb

      scrollbar
      scrollbar
      notebook
      the
      -command
      configure
      pack
      -expand

AUTHOR

Bill W. Scott

KEYWORDS

notebook page iwidgets-4.1.0/demos/html/optionmenu.n.html0000644003604700454610000002240207366300520017321 0ustar dgp771divoptionmenu - Create and manipulate a option menu widget

optionmenu - Create and manipulate a option menu widget

SYNOPSIS

optionmenu pathName ?options?

INHERITANCE

itk::Widget <- Labeledwidget <- optionmenu

STANDARD OPTIONS

activeBackground
borderWidth
foreground
activeBorderWidth
cursor
highlightColor
activeForeground
disabledForeground
highlightThickness
background
font
relief

See the "options" manual entry for details on the standard options.

INHERITED OPTIONS

disabledForeground
labelMargin
state
labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable

See the "LabeledWidget" manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   clickTime
Class:                  ClickTime
Command-Line Switch:	-clicktime

Name:                   command
Class:                  Command
Command-Line Switch:	-command

Name:                   cyclicOn
Class:                  CyclicOn
Command-Line Switch:	-cyclicon

Name:                   popupCursor
Class:                  Cursor
Command-Line Switch:	-popupcursor

Name:                   state
Class:                  State
Command-Line Switch:	-state

Name:                   width
Class:                  Width
Command-Line Switch:	-width


DESCRIPTION

The optionmenu command creates an option menu widget with options to manage it. An option menu displays a frame containing a label and a button. A pop-up menu will allow for the value of the button to change.

METHODS

The optionmenu command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command.

Many of the widget commands for an optionmenu take as one argument an indicator of which entry of the option menu to operate on. These indicators are called indexes and may be specified in any of the following forms:

number
Specifies the entry numerically, where 0 corresponds to the top-most entry of the option menu, 1 to the entry below it, and so on.
end
Indicates the bottommost entry in the menu. If there are no entries in the menu then -1 is returned.
select
Returns the numerical index of the currently selected option menu entry. If no entries exist in the menu, then -1 is returned.
pattern
If the index doesn't satisfy one of the above forms then this form is used. Pattern is pattern-matched against the label of each entry in the option menu, in order from the top down, until a matching entry is found. The rules of Tcl_StringMatch are used.

The following widget commands are possible for optionmenu widgets:

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the optionmenu command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the optionmenu command.
pathName delete first ?last?
Delete all of the option menu entries between first and last inclusive. If last is omitted then it defaults to first.
pathName disable index
Disable the option menu entry specified by index. Disabling a menu item will prevent the user from being able to select this item from the menu. This only effects the state of the item in the menu, in other words, should the item be the currently selected item, the programmer is responsible for determining this condition and taking appropriate action.
pathName enable index
Enable the option menu entry specified by index. Enabling a menu item allows the user to select this item from the menu.
pathName get ?first? ?last?
If no arguments are specified, this operation returns the currently selected option menu item. Otherwise, it returns the name of the option at index first, or a range of options between first and last.
pathName index index
Returns the numerical index corresponding to index.
pathName insert index string ?string?
Insert an item, or list of items, into the menu at location index.
pathName select index
Select an item from the option menu to be displayed as the currently selected item.
pathName sort mode
Sort the current menu in either ascending, or descending order. The values increasing, or decreasing are also accepted.

COMPONENTS

Name:                   menuBtn
Class:                  Menubutton

Name:                   popupMenu
Class:                  Menu

EXAMPLE

 optionmenu .om -labelmargin 5 \\
     -labelon true -labelpos w -labeltext "Operating System :"

 .om insert end Unix VMS Linux OS/2 {Windows NT} DOS
 .om sort ascending
 .om select Linux

 pack .om  -padx 10 -pady 10

ACKNOWLEDGEMENTS:

Michael J. McLennan

Steven B. Jaggers

Bret Schuhmacher

AUTHOR

Alfredo Jahn

KEYWORDS

optionmenu, widget iwidgets-4.1.0/demos/html/panedwindow.n.html0000644003604700454610000002565407347201410017454 0ustar dgp771divpanedwindow - Create and manipulate a paned window widget

panedwindow - Create and manipulate a paned window widget

SYNOPSIS

panedwindow pathName ?options?

INHERITANCE

itk::Widget <- panedwindow

STANDARD OPTIONS

background
cursor

See the "options" manual entry for details on the standard options.

WIDGET-SPECIFIC OPTIONS

Name:                   height
Class:                  Height
Command-Line Switch:	-height

Name:                   orient
Class:                  Orient
Command-Line Switch:	-orient

Name:                   sashBorderWidth
Class:                  BorderWidth
Command-Line Switch:	-sashborderwidth

Name:                   sashCursor
Class:                  Cursor
Command-Line Switch:	-sashcursor

Name:                   sashHeight
Class:                  Height
Command-Line Switch:	-sashheight

Name:                   sashIndent
Class:                  SashIndent
Command-Line Switch 	sashindent

Name:                   sashWidth
Class:                  Width
Command-Line Switch:	-sashwidth

Name:                   showHandle
Class:                  ShowHandle
Command-Line Switch:	-showhandle

Name:                   thickness
Class:                  Thickness
Command-Line Switch:	-thickness

Name:                   width
Class:                  Width
Command-Line Switch:	-width


DESCRIPTION

The panedwindow command creates a multiple paned window widget capable of orienting the panes either vertically or horizontally. Each pane is itself a frame acting as a child site for other widgets. The border separating each pane contains a sash which allows user positioning of the panes relative to one another.

METHODS

The panedwindow command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command.

Many of the widget commands for the panedwindow take as one argument an indicator of which pane of the paned window to operate on. These indicators are called indexes and allow reference and manipulation of panes regardless of their current map state. Paned window indexes may be specified in any of the following forms:

number
Specifies the pane numerically, where 0 corresponds to the nearest (top/left-most) pane of the paned window.
end
Indicates the farthest (bottom/right-most) pane of the paned window.
pattern
If the index doesn't satisfy one of the above forms then this form is used. Pattern is pattern-matched against the tag of each pane in the panedwindow, in order from left/top to right/left, until a matching entry is found. The rules of Tcl_StringMatch are used.

WIDGET-SPECIFIC METHODS

pathName add tag ?option value option value?
Adds a new pane to the paned window on the far side (right/bottom). The following options may be specified:
pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the panedwindow command.
pathName childsite ?index?
Returns a list of the child site path names or a specific child site given an index. The list is constructed from the near side (left/top) to the far side (right/bottom).
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the panedwindow command.
pathName delete index
Deletes a specified pane given an index.
pathName fraction percentage percentage ?percentage percentage ...?
Sets the visible percentage of the panes. Specifies a set of percentages which are applied to the visible panes from the near side (left/top). The number of percentages must be equal to the current number of visible (mapped) panes and add up to 100.
pathName hide index
Changes the visiblity of the specified pane, allowing a previously displayed pane to be visually removed rather than deleted.
pathName index index
Returns the numerical index corresponding to index.
pathName insert index tag ?option value option value ...?
Same as the add command except that it inserts the new pane just before the one given by index, instead of appending to the end of the panedwindow. The option, and value arguments have the same interpretation as for the add widget command.
pathName paneconfigure index ?options?
This command is similar to the configure command, except that it applies to the options for an individual pane, whereas configure applies to the options for the paned window as a whole. Options may have any of the values accepted by the add widget command. If options are specified, options are modified as indicated in the command and the command returns an empty string. If no options are specified, returns a list describing the current options for entry index (see Tk_ConfigureInfo for information on the format of this list).
pathName reset
Redisplays the pane window using default percentages.
pathName show index
Changes the visiblity of the specified pane, allowing a previously hidden pane to be displayed.

NOTES

EXAMPLE

 panedwindow .pw -width 300 -height 300 
 .pw add top
 .pw add middle -margin 10
 .pw add bottom -margin 10 -minimum 10

 pack .pw -fill both -expand yes

 foreach pane [.pw childSite] {
    button $pane.b -text $pane -relief raised -borderwidth 2
    pack $pane.b -fill both -expand yes
 }

 .pw fraction 50 30 20
 .pw paneconfigure 0 -minimum 20
 .pw paneconfigure bottom -margin 15

ACKNOWLEDGEMENTS:

Jay Schmidgall

Joe Hidebrand <hildjj@fuentez.com>

Ken Copeland <ken@hilco.com>

AUTHOR

Mark L. Ulferts

KEYWORDS

panedwindow, widget iwidgets-4.1.0/demos/html/promptdialog.n.html0000644003604700454610000001573407347201422017637 0ustar dgp771divpromptdialog - Create and manipulate a prompt dialog widget

promptdialog - Create and manipulate a prompt dialog widget

SYNOPSIS

promptdialog pathName ?options?

INHERITANCE

itk::Toplevel <- dialogshell <- dialog <- promptdialog

STANDARD OPTIONS

background
foreground
insertBorderWidth
relief
borderWidth
highlightColor
insertOffTime
selectBackground
cursor
highlightThickness
insertOnTime
selectBorderWidth
exportSelection
insertBackground
insertWidth
selectForeground

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

show

See the "entry" widget manual entry for details on the above associated options.

invalid
textBackground
textFont
validate

See the "entryfield" widget manual entry for details on the above associated options.

labelFont
labelPos
labelText

See the "labeledwidget" widget manual entry for details on the above associated options.

INHERITED OPTIONS

buttonBoxPadX
padY
buttonBoxPadY
separator
buttonBoxPos
thickness
padX

See the "dialogshell" widget manual entry for details on the above inherited options.

height
master
modality
width

See the "shell" widget manual entry for details on the above inherited options.

title

See the "Toplevel" widget manual entry for details on the above inherited options.


DESCRIPTION

The promptdialog command creates a prompt dialog similar to the OSF/Motif standard prompt dialog composite widget. The promptdialog is derived from the dialog class and is composed of a EntryField with commands to manipulate the dialog buttons.

METHODS

The promptdialog command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for promptdialog widgets:

ASSOCIATED METHODS

delete
insert
get
scan
icursor
selection
index
xview

See the "entry" widget manual entry for details on the above associated methods.

clear

See the "entryfield" widget manual entry for details on the above associated methods.

INHERITED METHODS

add
invoke
buttonconfigure
show
default
hide

See the "buttonbox" widget manual entry for details on the above inherited methods.

childsite

See the "dialogshell" widget manual entry for details on the above inherited methods.

activate
center
deactivate

See the "shell" widget manual entry for details on the above inherited methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the promptdialog command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the promptdialog command.

COMPONENTS

Name:                   prompt
Class:                  Entryfield

EXAMPLE

 option add *textBackground white

 promptdialog .pd -modality global -title Password -labeltext Password: -show *
 .pd hide Apply

 if {[.pd activate]} {
     puts "Password entered: [.pd get]"
 } else {
     puts "Password prompt cancelled"
 }

AUTHOR

Mark L. Ulferts

KEYWORDS

promptdialog, dialog, dialogshell, shell, widget iwidgets-4.1.0/demos/html/pushbutton.n.html0000644003604700454610000001214407347201431017341 0ustar dgp771divpushbutton - Create and manipulate a push button widget

pushbutton - Create and manipulate a push button widget

SYNOPSIS

pushbutton pathName ?options?

INHERITANCE

itk::Widget <- pushbutton

STANDARD OPTIONS

activeBackground
borderWidth
font
highlightThickness
state
activeForeground
command
foreground
image
text
background
cursor
highlightBackground
padX
underline
bitmap
disabledForeground
highlightColor
padY
wrapLength

See the "options" manual entry for details on the standard options.

WIDGET-SPECIFIC OPTIONS

Name:                   defaultRing
Class:                  DefaultRing
Command-Line Switch:	-defaultring

Name:                   defaultRingPad
Class:                  Pad
Command-Line Switch:	-defaultringpad

Name:                   height
Class:                  Height
Command-Line Switch:	-height

Name:                   width
Class:                  Width
Command-Line Switch:	-width


DESCRIPTION

The pushbutton command creates a push button with an optional default ring used for default designation and traversal.

METHODS

The pushbutton command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for pushbutton widgets:

ASSOCIATED METHODS

flash
invoke

See the "button" manual entry for details on the associated methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the pushbutton command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the pushbutton command.

COMPONENTS

Name:                   pushbutton
Class:                  Button

EXAMPLE

pushbutton .pb -text "Hello" -command {puts "Hello World"} -defaultring 1
pack .pb -padx 10 -pady 10

AUTHOR

Bret A. Schuhmacher

Mark L. Ulferts

KEYWORDS

pushbutton, widget iwidgets-4.1.0/demos/html/radiobox.n.html0000644003604700454610000001456407347201437016753 0ustar dgp771divradiobox - Create and manipulate a radiobox widget

radiobox - Create and manipulate a radiobox widget

SYNOPSIS

radiobox pathName ?options?

INHERITANCE

itk::Widget <- labeledframe <- radiobox

STANDARD OPTIONS

background
foreground
borderWidth
relief
cursor
selectColor
disabledForeground

See the "options" manual entry for details on the standard options.

INHERITED OPTIONS

labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable
labelMargin

See the "labeledframe" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   command
Class:                  Command
Command-Line Switch:    -command


DESCRIPTION

The radiobox command creates a radio button box widget capable of adding, inserting, deleting, selecting, and configuring radiobuttons as well as obtaining the currently selected button.

METHODS

The radiobox command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command.

Many of the widget commands for the radiobox take as one argument an indicator of which radiobutton of the radiobox to operate on. These indicators are called indexes and allow reference and manipulation of radiobuttons. Radiobox indexes may be specified in any of the following forms:

number
Specifies the radiobutton numerically, where 0 corresponds to the top radiobutton of the radiobox.
end
Indicates the last radiobutton of the radiobox.
pattern
If the index doesn't satisfy one of the above forms then this form is used. Pattern is pattern-matched against the tag of each radiobutton in the radiobox, in order from top to bottom, until a matching entry is found. The rules of Tcl_StringMatch are used.

WIDGET-SPECIFIC METHODS

pathName add tag ?option value option value?
Adds a new radiobutton to the radiobuttond window on the bottom. The command takes additional options which are passed on to the radiobutton as construction arguments. These include the standard Tk radiobutton options. The tag is returned.
pathName buttonconfigure index ?options?
This command is similar to the configure command, except that it applies to the options for an individual radiobutton, whereas configureapplies to the options for the radiobox as a whole. Options may have any of the values accepted by the add widget command. If options are specified, options are modified as indicated in the command and the command returns an empty string. If no options are specified, returns a list describing the current options for entry index (see Tk_ConfigureInfo for information on the format of this list).
pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the radiobox command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the radiobox command.
pathName delete index
Deletes a specified radiobutton given an index.
pathName deselect index
Deselects a specified radiobutton given an index.
pathName flash index
Flashes a specified radiobutton given an index.
pathName get
Returns the tag of the currently selected radiobutton.
pathName index index
Returns the numerical index corresponding to index.
pathName insert index tag ?option value option value ...?
Same as the add command except that it inserts the new radiobutton just before the one given by index, instead of appending to the end of the radiobox. The option, and value arguments have the same interpretation as for the add widget command.
pathName select index
Selects a specified radiobutton given an index.

EXAMPLE

 radiobox .rb -labeltext Fonts
 .rb add times -text Times
 .rb add helvetica -text Helvetica
 .rb add courier -text Courier
 .rb add symbol -text Symbol
 .rb select courier

 pack .rb -padx 10 -pady 10 -fill both -expand yes

AUTHORS

Michael J. McLennan

Mark L. Ulferts

KEYWORDS

radiobox, widget iwidgets-4.1.0/demos/html/scopedobject.n.html0000644003604700454610000000620506570244362017602 0ustar dgp771divscopedobject - Create and manipulate a scoped \[incr Tcl\] class object.

scopedobject - Create and manipulate a scoped \[incr Tcl\] class object.

SYNOPSIS

scopedobject objName ?options?

INHERITANCE

None

STANDARD OPTIONS

Name:                   enterscopecommand:
Command-Line Switch:	-enterscopecommand

Name:                   enterscopecommand:
Command-Line Switch:	-enterscopecommand


DESCRIPTION

The scopedobject command creates a base class for defining Itcl classes which posses scoped behavior like Tcl variables. The objects are only accessible within the procedure in which they are instantiated and are deleted when the procedure returns. This class was designed to be a general purpose base class for supporting scoped incr Tcl classes. The options include the execute a Tcl script command when an object enters and exits its scope.

METHODS

The scopedobject command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the object. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for scopedobject objects:

OBJECT-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the scopedobject command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the object. If no option is specified, returns a list describing all of the available options for pathName. If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given objects option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the scopedobject command.

EXAMPLE

  proc scopedobject_demo {} {
    scopedobject #auto \
        -exitscopecommand {puts "enter scopedobject_demo"} \
        -exitscopecommand {puts "exit scopedobject_demo"}
  }

  scopedobject_demo

AUTHOR

John A. Tucker

KEYWORDS

scopedobject, object iwidgets-4.1.0/demos/html/scrolledcanvas.n.html0000644003604700454610000002231107347201447020135 0ustar dgp771divscrolledcanvas - Create and manipulate scrolled canvas widgets

scrolledcanvas - Create and manipulate scrolled canvas widgets

SYNOPSIS

scrolledcanvas pathName ?options?

INHERITANCE

itk::Widget <- Labeledwidget <- Scrolledwidget <- Scrolledcanvas

STANDARD OPTIONS

activeBackground
exportSelection
highlightThickness
insertWidth
selectForeground
background
font
insertBorderWidth
relief
borderWidth
foreground
insertOffTime
selectBackground
cursor
highlightColor
insertOnTime
selectBorderWidth

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

closeEnough
yScrollIncrement
confine
scrollRegion
xScrollIncrement

See the "canvas" widget manual entry for details on the above associated options.

activeRelief
elementBorderWidth
jump
troughColor

See the "scrollbar" widget manual entry for details on the above associated options.

INHERITED OPTIONS

disabledForeground
labelMargin
state
labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable

See the "labeledwidget" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   autoMargin
Class:                  AutoMargin
Command-Line Switch:	-automargin

Name:                   autoResize
Class:                  AutoResize
Command-Line Switch:	-autoresize

Name:                   height
Class:                  Height
Command-Line Switch:	-height

Name:                   hscrollMode
Class:                  ScrollMode
Command-Line Switch:	-hscrollmode

Name:                   sbWidth
Class:                  Width
Command-Line Switch:	-sbwidth

Name:                   scrollMargin
Class:                  ScrollMargin
Command-Line Switch:	-scrollmargin

Name:                   textBackground
Class:                  Background
Command-Line Switch -textbackground

Name:                   vscrollMode
Class:                  ScrollMode
Command-Line Switch:	-vscrollmode

Name:                   width
Class:                  Width
Command-Line Switch:	-width

DESCRIPTION

The scrolledcanvas command creates a scrolled canvas with additional options to manage horizontal and vertical scrollbars. This includes options to control which scrollbars are displayed and the method, i.e. statically or dynamically.

METHODS

The scrolledcanvas command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for scrolledcanvas widgets:

ASSOCIATED METHODS

addtag
canvasy
delete
gettags
itemconfigure
raise
type
bbox
coords
dtag
icursor
lower
scale
xview
bind
create
find
index
move
scan
yview
canvasx
dchars
focus
insert
postscript
select

See the "canvas" manual entry for details on the associated methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the scrolledcanvas command.
pathName childsite
Returns the child site widget path name.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the scrolledcanvas command.
pathName justify direction
Justifies the canvas contents via the scroll bars in one of four directions: left, right, top, or bottom.

COMPONENTS

Name:                   canvas
Class:                  Canvas

Name:                   horizsb
Class:                  Scrollbar

Name:                   vertsb
Class:                  Scrollbar

EXAMPLE

  scrolledcanvas .sc 

  .sc create rectangle 100 100 400 400 -fill red
  .sc create rectangle 300 300 600 600 -fill green
  .sc create rectangle 200 200 500 500 -fill blue

  pack .sc -padx 10 -pady 10 -fill both -expand yes

AUTHOR

Mark L. Ulferts

KEYWORDS

scrolledcanvas, canvas, widget iwidgets-4.1.0/demos/html/scrolledframe.n.html0000644003604700454610000001715407347201672017765 0ustar dgp771divscrolledframe - Create and manipulate scrolled frame widgets

scrolledframe - Create and manipulate scrolled frame widgets

SYNOPSIS

scrolledframe pathName ?options?

INHERITANCE

itk::Widget <- Labeledwidget <-Scrolledwidget <- Scrolledframe

STANDARD OPTIONS

activeBackground
font
relief
background
foreground
selectBackground
borderWidth
highlightColor
selectBorderWidth
cursor
highlightThickness
selectForeground

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

activeRelief
elementBorderWidth
jump
troughColor

See the "scrollbar" manual entry for details on the associated options.

INHERITED OPTIONS

LabelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable
labelMargin

See the "labeledwidget" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   height
Class:                  Height
Command-Line Switch:	-height

Name:                   hscrollMode
Class:                  ScrollMode
Command-Line Switch:	-hscrollmode

Name:                   sbWidth
Class:                  Width
Command-Line Switch:	-sbwidth

Name:                   scrollMargin
Class:                  Margin
Command-Line Switch:	-scrollmargin

Name:                   vscrollMode
Class:                  ScrollMode
Command-Line Switch:	-vscrollmode

Name:                   width
Class:                  Width
Command-Line Switch:	-width

DESCRIPTION

The scrolledframe combines the functionallity of scrolling with that of a typical frame widget to implement a clipable viewing area whose visible region may be modified with the scroll bars. This enables the contruction of visually larger areas than which could normally be displayed, containing a heterogenous mix of other widgets. Options exist which allow full control over which scrollbars are displayed and the method, i.e. statically or dynamically. The frame itself may be accessed by the childsite method and then filled with other widget combinations.

METHODS

The scrolledframe command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for scrolledframe widgets:

ASSOCIATED METHODS

xview
yview

See the "canvas" manual entry for details on the associated methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the scrolledframe command.
pathName childsite
Return the path name of the child site.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the scrolledframe command.
pathName justify direction
Justifies the frame contents via the scroll bars in one of four directions: left, right, top, or bottom.

COMPONENTS

Name:                   horizsb
Class:                  Scrollbar

Name:                   vertsb
Class:                  Scrollbar

EXAMPLE

scrolledframe .sf -width 150 -height 180 -labelon yes -labeltext scrolledframe

set cs [.sf childsite]
pack [button $cs.b1 -text Hello] -pady 10
pack [button $cs.b2 -text World] -pady 10
pack [button $cs.b3 -text "This is a test"] -pady 10
pack [button $cs.b4 -text "This is a really big button"] -pady 10
pack [button $cs.b5 -text "This is another really big button"] -pady 10
pack [button $cs.b6 -text "This is the last really big button"] -pady 10

pack .sf -expand yes -fill both -padx 10 -pady 10

AUTHORS

Mark L. Ulferts

Sue Yockey

KEYWORDS

scrolledframe, frame, widget iwidgets-4.1.0/demos/html/scrolledhtml.n.html0000644003604700454610000002652707537260565017652 0ustar dgp771divscrolledhtml - Create and manipulate a scrolled text widget with the capability

scrolledhtml - Create and manipulate a scrolled text widget with the capability

of displaying HTML formatted documents.

SYNOPSIS

scrolledhtml pathName ?options?

INHERITANCE

itk::Widget <- Labeledwidget <- Scrolledtext <- Scrolledhtml

STANDARD OPTIONS

activeBackground
exportSelection
insertBackground
insertWidth
repeatDelay
selectForeground
background
foreground
insertBorderWidth
padX
repeatInterval
setGrid
borderWidth
highlightColor
insertOffTime
padY
selectBackground
cursor
highlightThickness
insertOnTime
relief
selectBorderWidth

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

activeRelief
elementBorderWidth
jump
troughColor

See the "scrollbar" widget manual entry for details on the above associated options.

spacing1
tabs
spacing2
wrap
spacing3
state

See the "text" widget manual entry for details on the above associated options.

INHERITED OPTIONS

labelBitmap
labelPos
hscrollMode
vscrollMode
labelFont
labelText
sbWidth
width
labelImage
labelVariable
scrollMargin
labelMargin
height
visibleitems

See the "scrolledtext" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   feedback
Class:                  FeedBack
Command-Line Switch:	-feedback

Name:                   fixedfont
Class:                  FixedFont
Command-Line Switch:	-fixedfont

Name:                   fontname
Class:                  FontName
Command-Line Switch:	-fontname

Name:                   fontsize
Class:                  FontSize
Command-Line Switch:	-fontsize

Name:                   foreground
Class:                  Foreground
Command-Line Switch:	-foreground

Name:                   link
Class:                  Link
Command-Line Switch:	-link

Name:                   linkcommand
Class:                  LinkCommand
Command-Line Switch:	-linkcommand

Name:                   alink
Class:                  alink
Command-Line Switch:	-alink

Name:                   textBackground
Class:                  Background
Command-Line Switch:	-textbackground

Name:                   unknownimage
Class:                  UnknownImage
Command-Line Switch:	-unknownimage

Name:                   update
Class:                  Update
Command-Line Switch:	-alink


DESCRIPTION

The scrolledhtml command creates a scrolled text widget with the additional capability to display html formatted documents. An import method is provided to read an html document file, and a render method is provided to display a html formatted text string.

METHODS

The scrolledhtml command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for scrolledhtml widgets:

ASSOCIATED METHODS

bbox
dlineinfo
mark
tag
compare
get
scan
window
debug
index
search
xview
delete
insert
see
yview

See the "text" manual entry for details on the standard methods.

INHERITED METHODS

export
clear

See the "scrolledhtml" manual entry for details on the inherited methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the scrolledhtml command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the scrolledhtml command.
pathName import ?option? href
Load html formatted text from a file. Href must exist. If option is -link, href is assumed to be relative to the application's current working directory. Otherwise, href is assumed to be relative to the path of the last page loaded. Href is either a filename, or a reference of the form filename#anchorname. In the latter form, fIFilename and/or anchorname may be empty. If filename is empty, the current document is assumed. If anchorname is empty, the top of the document is assumed.
pathName pwd
Print the current working directory of the widget, i.e. the directory of the last page loaded.
pathName render htmltext ?wd?
Display HTML formatted text htmltext. Wd gives the base path to use for all links and images in the document. Wd defaults to the application's current working directory.
pathName title
Return the title of the current page, as given in the <title>...</title> field in the document.

HTML COMPLIANCE

This widget is compliant with HTML 3.2 with the following exceptions:

No features requiring a connection to an http server are supported.

Some image alignments aren't supported, because they are not supported by the text widget.

The <br> attributes dealing with image alignments aren't supported.

Automatic table sizing is not supported very well, due to limitations of the text widget

EXAMPLE

 option add *textBackground white

 scrolledhtml .sh -fontname helvetica -linkcommand "this import -link"

 pack .sh -padx 10 -pady 10 -fill both -expand yes

 .sh import ~/public_html/index.html

BUGS

ACKNOWLEDGEMENTS

Sam Shen

AUTHOR

Kris Raney

KEYWORDS

scrolledhtml, html, text, widget iwidgets-4.1.0/demos/html/scrolledlistbox.n.html0000644003604700454610000003236207444677035020365 0ustar dgp771diviwidgets::scrolledlistbox - Create and manipulate scrolled listbox widgets

iwidgets::scrolledlistbox - Create and manipulate scrolled listbox widgets

SYNOPSIS

iwidgets::scrolledlistbox pathName ?options?

INHERITANCE

itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Scrolledwidget <- iwidgets::Scrolledlistbox

STANDARD OPTIONS


cursor
highlightThickness
selectForeground

activeBackground
exportSelection
relief
background
foreground
selectBackground
borderWidth
highlightColor
selectBorderWidth

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

selectMode
listvariable

See the "listbox" widget manual entry for details on the above associated options.

activeRelief
elementBorderwidth
jump
troughColor

See the "scrollbar" widget manual entry for details on the above associated options.

INHERITED OPTIONS

disabledForeground
labelMargin
state
labelBitmap
labelPos
sticky
labelFont
labelText
labelImage
labelVariable

See the "labeledwidget" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   dblClickCommand
Class:                  Command
Command-Line Switch:	-dblclickcommand

Name:                   height
Class:                  Height
Command-Line Switch:	-height

Name:                   hscrollMode
Class:                  ScrollMode
Command-Line Switch:	-hscrollmode

Name:                   sbWidth
Class:                  Width
Command-Line Switch:	-sbwidth

Name:                   scrollMargin
Class:                  Margin
Command-Line Switch:	-scrollmargin

Name:                   selectionCommand
Class:                  Command
Command-Line Switch:	-selectioncommand

Name:                   state
Class:                  State
Command-Line Switch:	-state

Name:                   textBackground
Class:                  Background
Command-Line Switch -textbackground

Name:                   textFont
Class:                  Font
Command-Line Switch:	-textfont

Name:                   visibleitems
Class:                  VisibleItems
Command-Line Switch:	-visibleitems

Name:                   vscrollMode
Class:                  ScrollMode
Command-Line Switch:	-vscrollmode

Name:                   width
Class:                  Width
Command-Line Switch:	-width

DESCRIPTION

The iwidgets::scrolledlistbox command creates a scrolled listbox with additional options to manage horizontal and vertical scrollbars. This includes options to control which scrollbars are displayed and the method, i.e. statically or dynamically.

METHODS

The iwidgets::scrolledlistbox command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command.

Many of the widget commands for a scrolledlistbox take as one argument an indicator of which entry of the list box to operate on. These indicators are called indexes and may be specified in any of the following forms:

number
Specifies the element as a numerical index, where 0 corresponds to the first element in the listbox.
active
Indicates the element that has the location cursor. This element will be displayed with an underline when the listbox has the keyboard focus, and it is specified with the activate widget command.
anchor
Indicates the anchor point for the selection, which is set with the selection anchor widget command.
end
Indicates the end of the listbox. For some commands this means just after the last element; for other commands it means the last element.
@x,y
Indicates the element that covers the point in the listbox window specified by x and y (in pixel coordinates). If no element covers that point, then the closest element to that point is used.
pattern
If the index doesn't satisfy one of the above forms then this form is used. Pattern is pattern-matched against the items in the list box, in order from the top down, until a matching entry is found. The rules of Tcl_StringMatch are used.

The following widget commands are possible for scrolledlistbox widgets:

ASSOCIATED METHODS

activate
get
nearest
size
bbox
index
scan
xview
curselection
insert
see
yview
delete
itemconfigure
selection

See the "listbox" manual entry for details on the associated methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the iwidgets::scrolledlistbox command.
pathName clear
Clears the listbox of all items.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the iwidgets::scrolledlistbox command.
pathName getcurselection
Returns the contents of the listbox element indicated by the current selection indexes. Short cut version of get and curselection command combination.
pathName justify direction
Justifies the list contents via teh scroll bars in one of four directions: left, right, top, or bottom.
pathName selecteditemcount
Returns the number of items currently selected in the list.
pathName sort order
Sort the current list in any of the forms accepted by Tcl's lsort command. Also accepts either ascending or descending order.

COMPONENTS

Name:                   listbox
Class:                  listbox

Name:                   horizsb
Class:                  Scrollbar

Name:                   vertsb
Class:                  Scrollbar

EXAMPLE

 package require Iwidgets 4.0
 option add *textBackground white
 proc selCmd {} {
    puts stdout "[.slb getcurselection]"
 }
 proc defCmd {} {
    puts stdout "Double Click"
    return [selCmd]
 }
 iwidgets::scrolledlistbox .slb -selection single \\
    -vscrollmode static -hscrollmode dynamic -labeltext "List" \\
    -selectioncommand selCmd -dblclickcommand defCmd
 pack .slb -padx 10 -pady 10 -fill both -expand yes
 .slb insert end {Hello {Out There} World} 

AUTHOR

Mark L. Ulferts

KEYWORDS

scrolledlistbox, listbox, widget iwidgets-4.1.0/demos/html/scrolledtext.n.html0000644003604700454610000002444507537260565017667 0ustar dgp771divscrolledtext - Create and manipulate a scrolled text widget

scrolledtext - Create and manipulate a scrolled text widget

SYNOPSIS

scrolledtext pathName ?options?

INHERITANCE

itk::Widget <- Labeledwidget <- Scrolledwidget <- Scrolledtext

STANDARD OPTIONS

activeBackground
exportSelection
insertBackground
insertWidth
selectBackground
background
foreground
insertBorderWidth
padX
selectBorderWidth
borderWidth
highlightColor
insertOffTime
padY
selectForeground
cursor
highlightThickness
insertOnTime
relief
setGrid

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

activeRelief
elementBorderWidth
jump
troughColor

See the "scrollbar" widget manual entry for details on the above associated options.

spacing1
tabs
spacing2
wrap
spacing3
state

See the "text" widget manual entry for details on the above associated options.

INHERITED OPTIONS

disabledForeground
labelMargin
state
labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable

See the "labeledwidget" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   height
Class:                  Height
Command-Line Switch:	-height

Name:                   hscrollMode
Class:                  ScrollMode
Command-Line Switch:	-hscrollmode

Name:                   sbWidth
Class:                  Width
Command-Line Switch:	-sbwidth

Name:                   scrollMargin
Class:                  Margin
Command-Line Switch:	-scrollmargin

Name:                   textBackground
Class:                  Background
Command-Line Switch:	-textbackground

Name:                   textFont
Class:                  Font
Command-Line Switch:	-textfont

Name:                   visibleitems
Class:                  VisibleItems
Command-Line Switch:	-visibleitems

Name:                   vscrollMode
Class:                  ScrollMode
Command-Line Switch:	-vscrollmode

Name:                   width
Class:                  Width
Command-Line Switch:	-width


DESCRIPTION

The scrolledtext command creates a scrolled text widget with additional options to manage the scrollbars. This includes options to control the method in which the scrollbars are displayed, i.e. statically or dynamically. Options also exist for adding a label to the scrolled text area and controlling its position. Import/export of methods are provided for file I/O.

METHODS

The scrolledtext command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for scrolledtext widgets:

ASSOCIATED METHODS

bbox
dlineinfo
mark
tag
compare
get
scan
window
debug
index
search
xview
delete
insert
see
yview

See the "text" manual entry for details on the standard methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the scrolledtext command.
pathName childsite
Returns the child site widget path name.
pathName clear
Clear the text area of all characters.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the scrolledtext command.
pathName import filename ?index?
Load the text from a file into the text area at the index. The filename must exist.
pathName export filename
Write text to a file. If filename exists then contents are replaced with text widget contents.

COMPONENTS

Name:                   text
Class:                  Text

Name:                   horizsb
Class:                  Scrollbar

Name:                   vertsb
Class:                  Scrollbar

EXAMPLE

 option add *textBackground white

 scrolledtext .st -scrollmode dynamic -labeltext "Password File"

 pack .st -padx 10 -pady 10 -fill both -expand yes

 .st import /etc/passwd

AUTHOR

Mark L. Ulferts

KEYWORDS

scrolledtext, text, widget iwidgets-4.1.0/demos/html/selectionbox.n.html0000644003604700454610000002453307347201717017640 0ustar dgp771divselectionbox - Create and manipulate a selection box widget

selectionbox - Create and manipulate a selection box widget

SYNOPSIS

selectionbox pathName ?options?

INHERITANCE

itk::Widget <- selectionbox

STANDARD OPTIONS

activeBackground
exportSelection
insertBackground
insertWidth
selectBackground
background
foreground
insertBorderWidth
relief
selectBorderWidth
borderWidth
highlightColor
insertOffTime
repeatDelay
selectForeground
cursor
highlightThickness
insertOnTime
repeatInterval

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

textBackground
textFont

See the "entryfield" widget class manual entry for details on the above associated options.

labelFont
labelMargin

See the "labeledwidget" class manual entry for details on the above associated options.

activeRelief
elementBorderWidth
jump
troughColor

See the "scrollbar" widget class manual entry for details on the above associated options.

dblClickCommand
textBackground
hscrollMode
textFont
sbWidth
vscrollMode
scrollMargin

See the "scrolledlistbox" widget class manual entry for details on the above associated options.

WIDGET-SPECIFIC OPTIONS

Name:                   childSitePos
Class:                  Position
Command-Line Switch:	-childsitepos

Name:                   height
Class:                  Height
Command-Line Switch:	-height

Name:                   itemsCommand
Class:                  Command
Command-Line Switch:	-itemscommand

Name:                   itemsLabel
Class:                  Text
Command-Line Switch:	-itemslabel

Name:                   itemsLabelPos
Class:                  Position
Command-Line Switch:	-itemslabelpos

Name:                   itemsOn
Class:                  ItemsOn
Command-Line Switch:	-itemson

Name:                   margin
Class:                  Margin
Command-Line Switch:	-margin

Name:                   selectionCommand
Class:                  Command
Command-Line Switch:	-selectioncommand

Name:                   selectionLabel
Class:                  Text
Command-Line Switch:	-selectionlabel

Name:                   selectionLabelPos
Class:                  Position
Command-Line Switch:	-selectionlabelpos

Name:                   selectionOn
Class:                  SelectionOn
Command-Line Switch:	-selectionon

Name:                   width
Class:                  Width
Command-Line Switch:	-width


DESCRIPTION

The selectionbox command creates a scrolled list of items and a selection entry field. The user may choose any of the items displayed in the scrolled list of alternatives and the selection field will be filled with the choice. The user is also free to enter a new value in the selection entry field. Both the list and entry areas have labels. A child site is also provided in which the user may create other widgets to be used in conjunction with the selection box.

METHODS

The selectionbox command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command.

ASSOCIATED METHODS

curselection
scan
delete
selection
index
size
nearest

See the "listbox" widget class manual entry for details on the associated methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the selectionbox command.
pathName childsite
Returns the child site widget path name.
pathName clear component
Delete the contents of either the selection entry widget or items list. The component argument may be either items or selection.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the selectionbox command.
pathName get
Returns the current value of the selection entry widget.
pathName insert component args
Insert element(s) into either the selection entry widget or items list. The component argument may be either items or selection. The args follow the rules of either an entry or list widget depending on the component value.
pathName selectitem
Replace the selection entry field contents with the currently selected items value.

COMPONENTS

Name:                   childsite
Class:                  Frame

Name:                   items
Class:                  Scrolledlistbox

Name:                   selection
Class:                  Entryfield

EXAMPLE

 option add *textBackground white

 selectionbox .sb -items {Hello {Out There} World}
 pack .sb -padx 10 -pady 10 -fill both -expand yes 

 set cs [label [.sb childsite].label -text "Child Site"]
 pack $cs -fill x -padx 10 -pady 10

 .sb insert items 2 {Cruel Cruel}

 .sb selection set 1

AUTHOR

Mark L. Ulferts

KEYWORDS

selectionbox, widget iwidgets-4.1.0/demos/html/selectiondialog.n.html0000644003604700454610000001636507347201727020314 0ustar dgp771divselectiondialog - Create and manipulate a selection dialog widget

selectiondialog - Create and manipulate a selection dialog widget

SYNOPSIS

selectiondialog pathName ?options?

INHERITANCE

itk::Toplevel <- Shell <- Dialogshell <- Dialog <- Selectiondialog

STANDARD OPTIONS

activeBackground
exportSelection
insertBackground
insertWidth
background
foreground
insertBorderWidth
selectBackground
borderWidth
highlightColor
insertOffTime
selectBorderWidth
cursor
highlightThickness
insertOnTime
selectForeground

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

textBackground
textFont

See the "entryfield" widget manual entry for details on the above associated options.

labelFont

See the "labeledwidget" widget manual entry for details on the above associated options.

activeRelief
elementBorderWidth
jump
troughColor

See the "scrollbar" widget class manual entry for details on the above associated options.

textBackground
textFont

See the "scrolledlistbox" widget class manual entry for details on the above associated options. childsitepos itemsCommand itemsLabel itemsOn selectionCommand selectionLabel selectionOn

See the "selectionbox" widget manual entry for details on the above associated options.

INHERITED OPTIONS

buttonBoxPadX
padY
buttonBoxPadY
separator
buttonBoxPos
thickness
padX

See the "dialogshell" widget manual entry for details on the above inherited options.

height
master
modality
width

See the "shell" widget manual entry for details on the above inherited options.

title

See the "Toplevel" widget manual entry for details on the above inherited options.


DESCRIPTION

The selectiondialog command creates a selection box similar to the OSF/Motif standard selection dialog composite widget. The selectiondialog is derived from the Dialog class and is composed of a selectionbox with commands to manipulate the dialog buttons.

METHODS

The selectiondialog command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for selectiondialog widgets:

ASSOCIATED METHODS

childsite
selectitem
clear
get
insert

See the "selectionbox" widget manual entry for details on the above associated methods.

curselection
scan
delete
selection
index
size
nearest

See the "listbox" widget manual entry for details on the above associated methods.

INHERITED METHODS

add
invoke
buttonconfigure
show
default
hide

See the "buttonbox" widget manual entry for details on the above inherited methods.

activate
center
deactivate

See the "shell" widget manual entry for details on the above inherited methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the selectiondialog command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the selectiondialog command.

COMPONENTS

Name:                   selectionbox
Class:                  Selectionbox

EXAMPLE

 selectiondialog .sd 
 .sd activate

AUTHOR

Mark L. Ulferts

KEYWORDS

selectiondialog, selectionbox, dialog, dialogshell, shell, widget iwidgets-4.1.0/demos/html/shell.n.html0000644003604700454610000001523707347201736016253 0ustar dgp771divshell - Create and manipulate a shell widget

shell - Create and manipulate a shell widget

SYNOPSIS

shell pathName ?options?

INHERITANCE

itk::Toplevel <- shell

STANDARD OPTIONS

background
cursor
foreground

See the "options" manual entry for details on the standard options.

INHERITED OPTIONS

title

See the "Toplevel" manual entry for details on the above inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   height
Class:                  Height
Command-Line Switch:	-height

Name:                   master
Class:                  Window
Command-Line Switch:	-master

Name:                   modality
Class:                  Modality
Command-Line Switch:	-modality

Name:                   padX
Class:                  Pad
Command-Line Switch:	-padx

Name:                   padY
Class:                  Pad
Command-Line Switch:	-pady

Name:                   width
Class:                  Width
Command-Line Switch:	-width

DESCRIPTION

The shell command creates a shell which is a top level widget which supports modal operation.

METHODS

The shell command create a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for shell widgets:

WIDGET-SPECIFIC METHODS

pathName activate
Display the shell and wait based on the modality. For application and system modal activations, perform a grab operation, and wait for the result. The result may be returned via an argument to the deactivate method.
pathName center ?widget?
Centers the shell with respect to another widget. The widget argument is optional. If provided, it should be the path of another widget with to center upon. If absent, then the shell will be centered on the screen as a whole.
pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the shell command.
pathName childsite
Returns the pathname of the child site widget.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the shell command.
pathName deactivate ?arg?
Deactivate the display of the shell. The method takes an optional argument to be passed to the activate method which returns the value. The optional argument is only effective for application and system modal dialogs.

COMPONENTS

Name:                   shellchildsite
Class:                  frame

EXAMPLE

 shell .sh -modality application -padx 20 -pady 20 -title Shell

 pack [label [.sh childsite].l -text SHELL]

 .sh center
 .sh activate

AUTHOR

Mark L. Ulferts

Kris Raney

KEYWORDS

shell, widget iwidgets-4.1.0/demos/html/spindate.n.html0000644003604700454610000002370707347201746016755 0ustar dgp771divspindate - Create and manipulate time spinner widgets

spindate - Create and manipulate time spinner widgets

SYNOPSIS

spindate pathName ?options?

INHERITANCE

itk::Widget <- Spindate

STANDARD OPTIONS

background
cursor
foreground
relief

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

textBackground
textFont

See the "entryfield" manual entry for details on the above associated options.

labelFont
labelMargin

See the "labeledwidget" manual entry for details on the above associated options.

arrowOrient
repeatDelay
repeatInterval

See the "spinner" manual entry for details on the above associated options.

WIDGET-SPECIFIC OPTIONS

Name:                   dateMargin
Class:                  Margin
Command-Line Switch:	-datemargin

Name:                   dayLabel
Class:                  Text
Command-Line Switch:	-daylabel

Name:                   dayOn
Class:                  dayOn
Command-Line Switch:	-dayon

Name:                   dayWidth
Class:                  Width
Command-Line Switch:	-daywidth

Name:                   labelPos
Class:                  Position
Command-Line Switch:	-labelpos

Name:                   monthFormat
Class:                  MonthFormat
Command-Line Switch:	-monthformat

Name:                   monthLabel
Class:                  Text
Command-Line Switch:	-monthlabel

Name:                   monthOn
Class:                  monthOn
Command-Line Switch:	-monthon

Name:                   monthWidth
Class:                  Width
Command-Line Switch:	-monthwidth

Name:                   orient
Class:                  Orient
Command-Line Switch:	-orient

Name:                   yearDigits
Class:                  YearDigits
Command-Line Switch:	-yeardigits

Name:                   yearLabel
Class:                  Text
Command-Line Switch:	-yearlabel

Name:                   yearOn
Class:                  yearOn
Command-Line Switch:	-yearon

Name:                   yearWidth
Class:                  Width
Command-Line Switch:	-yearwidth



spindate
set
use
entry.
an
year


creates
command
pathName.
be
various
widget.
following
pathName
...
?
the
exact
command.
are
widgets:



current
configuration
option.
any
accepted
command.
pathName
option

the
the
option
a
of
for
for
format
If
with
the
list
named
will
the
the
no
If
option-value
then
the
to
value(s);
the
empty
have
values
spindate


current
spindate
format
as
value
and
respectively.
by
clock
information
and

date
the
to
the
date
either
an
or
Reference
for
obtaining
formats.

Spinner

DESCRIPTION


command
of
in
The
month,
spinner
The
a
whose
This
used
operations
It
general
option

args
behavior
The
possible

WIDGET-SPECIFIC
pathName

value
option
Option
of
by

configure
value
Query
configuration
widget.
is
list
the
pathName
information
of
option
no
command
describing
option
be
corresponding
value
option
one
pairs
the
given
have
in
command
string.
any
accepted
command.
pathName

contents
widget
of
an
using
-clicks
The
string.
command
on
their


currently
be
date
may
as
integer
the
the
more
dates

Name:


creates
spinners
date
set
day,
widget.
spindate
new
name
command
to
on
has
form:
?arg
Option
determine
of
following
for
METHODS
cget
Returns
of
given
may
the
the


?option?
...
?
or
options
If
specified,
describing
available
(see
on
this
is
value,
returns
the
(this
identical
sublist
returned
is
or
are
command
widget
the
this
returns
Option
of
by

get
Returns
of
in
string
integer
the
format
default
Reference
for
obtaining
formats.
pathName

displayed
that
argument.
be
a
clock
keyword
clock
information
and

COMPONENTS


month
The
a
for
value
includes
and

METHODS


command
Tcl
is
may
invoke
the
the

arg
and
the
the
commands
spindate

option
the
the
by
have
values
spindate

?value

modify
of
no
returns
all
options
Tk_ConfigureInfo
the
list).
specified
then
a
one
list
to
of
if
specified).
more
specified,
modifies
option(s)
given
case
an
may
the
the

?format?
the
the
a
or
clock
-string
options
is
the
more
dates

show
Changes
date
of
The
specified
string,
value
"now".
command
on
their


Class:

    The month spinner component is the month spinner of the date spinner. See the Spinner widget manual entry for details on the month component item.

Name:                   day
Class:                  Spinint
    The day spinner component is the day spinner of the date spinner. See the SpinInt widget manual entry for details on the day component item.

Name:                   year
Class:                  Spinint
    The year spinner component is the year spinner of the date spinner. See the SpinInt widget manual entry for details on the year component item.

EXAMPLE

spindate .sd
pack .sd -padx 10 -pady 10

AUTHORS

Sue Yockey

Mark L. Ulferts

KEYWORDS

spindate, spinint, spinner, entryfield, entry, widget iwidgets-4.1.0/demos/html/spinint.n.html0000644003604700454610000001477406570255571016640 0ustar dgp771divspinint - Create and manipulate a integer spinner widget

spinint - Create and manipulate a integer spinner widget

SYNOPSIS

spinint pathName ?options?

INHERITANCE

itk::Widget <- Labeledwidget <- Spinner <- Spinint

STANDARD OPTIONS

background
foreground
insertBorderWidth
justify
selectForeground
borderWidth
highlightColor
insertOffTime
relief
textVariable
cursor
highlightThickness
insertOnTime
selectBackground
exportSelection
insertBackground
insertWidth
selectBorderWidth

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

show
state

See the "entry" manual entry for details on the associated options.

INHERITED OPTIONS

command
invalid
width
childSitePos
textBackground
fixed
textFont
focusCommand
validate

See the "entryfield" widget manual entry for details on the above inherited options.

disabledForeground
labelMargin
state
labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable

See the "labeledwidget" widget manual entry for details on the above inherited options.

arroworient
repeatInterval
decrement
increment
repeatDelay

See the "spinner" widget manual entry for details on the above inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   range
Class:                  Range
Command-Line Switch:	-range
    Specifies a two element list of minimum and maximum integer values. The default is no range, {{} {}}.

Name:                   step
Class:                  Step
Command-Line Switch:	-step
    Specifies the increment/decrement value. The default is 1.

Name:                   wrap
Class:                  Wrap
Command-Line Switch:	-wrap
    Specifies whether to wrap the spinner value upon reaching the minimum or maximum value in any of the forms acceptable to Tcl_GetBoolean. The default is true.


DESCRIPTION

The spinint command creates a spinint widget. The spinint allows "spinning" of integer values within a specified range with wrap support. The spinner arrows may be drawn horizontally or vertically.

METHODS

The spinint command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for spinint widgets:

ASSOCIATED METHODS

delete
insert
xview
get
peek
icursor
scan
index
selection

See the "entry" manual entry for details on the associated methods.

INHERITED METHODS

childsite
clear

See the "entryfield" manual entry for details on the associated methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the spinint command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the spinint command.
pathName down
Decrement the spinner value by the value given in the step option.
pathName up
Increment the spinner value by the value given in the step option.

COMPONENTS

EXAMPLE

 option add *textBackground white
 
 spinint .si -labeltext "Temperature" -labelpos w \\
    -fixed yes -width 5 -range {32 212}

 pack .si -pady 10

AUTHOR

Sue Yockey

KEYWORDS

spinint, widget iwidgets-4.1.0/demos/html/spinner.n.html0000644003604700454610000001714707347201755016625 0ustar dgp771divspinner - Create and manipulate a spinner widget

spinner - Create and manipulate a spinner widget

SYNOPSIS

spinner pathName ?options?

INHERITANCE

itk::Widget <- Labeledwidget <- Spinner

STANDARD OPTIONS

background
foreground
insertBorderWidth
justify
selectForeground
borderWidth
highlightColor
insertOffTime
relief
textVariable
cursor
highlightThickness
insertOnTime
selectBackground
exportSelection
insertBackground
insertWidth
selectBorderWidth

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

show
state

See the "entry" manual entry for details on the associated options.

INHERITED OPTIONS

childSitePos
invalid
width
command
textBackground
fixed
textFont
focusCommand
validate

See the "entryfield" widget manual entry for details on the above inherited options.

disabledForeground
labelMargin
state
labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable

See the "labeledwidget" widget manual entry for details on the above inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   arrowOrient
Class:                  Orient
Command-Line Switch:	-arroworient

Name:                   decrement
Class:                  Command
Command-Line Switch:	-decrement

Name:                   increment
Class:                  Command
Command-Line Switch:	-increment

Name:                   repeatDelay
Class:                  RepeatDelay
Command-Line Switch:	-repeatdelay

Name:                   repeatInterval
Class:                  RepeatInterval
Command-Line Switch:	-repeatinterval


DESCRIPTION

The spinner command creates a spinner widget. The spinner is comprised of an entryfield plus up and down arrow buttons. Arrows may be drawn horizontally or vertically.

METHODS

The spinner command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for spinner widgets:

ASSOCIATED METHODS

delete
insert
get
scan
icursor
selection
index
xview

See the "entry" manual entry for details on the associated methods.

INHERITED METHODS

childsite
clear
peek

See the "entryfield" manual entry for details on the associated methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the spinner command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the spinner command.
pathName down
Derived classes may overload this method to specialize functionality.
pathName up
Derived classes may overload this method to specialize functionality.

COMPONENTS

Name:                   downarrow
Class:                  Canvas

Name:                   uparrow
Class:                  Canvas

EXAMPLE

 set months {January February March April May June July \\
                 August September October November December}

 proc blockInput {char} {
     return 0
 }

 proc spinMonth {step} {
     global months

     set index [expr [lsearch $months [.sm get]] + $step]

     if {$index < 0} {set index 11}
     if {$index > 11} {set index 0}

     .sm delete 0 end
     .sm insert 0 [lindex $months $index]
 }

 spinner .sm -labeltext "Month : " -width 10 -fixed 10 -validate blockInput \\
             -decrement {spinMonth -1} -increment {spinMonth 1}
 .sm insert 0 January

 pack .sm -padx 10 -pady 10

ACKNOWLEDGEMENTS:

Ken Copeland <ken@hilco.com>

AUTHOR

Sue Yockey

KEYWORDS

spinner, widget iwidgets-4.1.0/demos/html/spintime.n.html0000644003604700454610000002331107347201764016765 0ustar dgp771divspintime - Create and manipulate time spinner widgets

spintime - Create and manipulate time spinner widgets

SYNOPSIS

spintime pathName ?options?

INHERITANCE

itk::Widget <- Spintime

STANDARD OPTIONS

background
cursor
foreground
relief

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

textBackground
textFont

See the "entryfield" manual entry for details on the above associated options.

labelFont
labelMargin

See the "labeledwidget" manual entry for details on the above associated options.

arrowOrient
repeatDelay
repeatInterval

See the "spinner" manual entry for details on the above associated options.

WIDGET-SPECIFIC OPTIONS

Name:                   labelPos
Class:                  Position
Command-Line Switch:	-labelpos

Name:                   hourLabel
Class:                  Text
Command-Line Switch:	-hourlabel

Name:                   hourOn
Class:                  hourOn
Command-Line Switch:	-houron

Name:                   hourWidth
Class:                  Width
Command-Line Switch:	-hourwidth

Name:                   militaryOn
Class:                  militaryOn
Command-Line Switch:	-militaryon

Name:                   minuteLabel
Class:                  Text
Command-Line Switch:	-minutelabel

Name:                   minuteOn
Class:                  minuteOn
Command-Line Switch:	-minuteon

Name:                   minuteWidth
Class:                  Width
Command-Line Switch:	-minutewidth

Name:                   orient
Class:                  Orient
Command-Line Switch:	-orient

Name:                   secondLabel
Class:                  Text
Command-Line Switch:	-secondlabel

Name:                   secondOn
Class:                  secondOn
Command-Line Switch:	-secondon

Name:                   secondWidth
Class:                  Width
Command-Line Switch:	-secondwidth

Name:                   timeMargin
Class:                  Margin
Command-Line Switch:	-timemargin



spintime
set
use
entry.
an
second


creates
command
pathName.
be
various
widget.
following
pathName
...
?
the
exact
command.
are
widgets:



current
configuration
option.
any
accepted
command.
pathName
option

the
the
option
a
of
for
for
format
If
with
the
list
named
will
the
the
no
If
option-value
then
the
to
value(s);
the
empty
have
values
spintime


current
spintime
format
as
value
and
respectively.
by
clock
information
and

time
the
to
the
time
either
an
or
Reference
for
obtaining
format.

Spinint

DESCRIPTION


command
of
in
The
hour,
spinner
The
a
whose
This
used
operations
It
general
option

args
behavior
The
possible

WIDGET-SPECIFIC
pathName

value
option
Option
of
by

configure
value
Query
configuration
widget.
is
list
the
pathName
information
of
option
no
command
describing
option
be
corresponding
value
option
one
pairs
the
given
have
in
command
string.
any
accepted
command.
pathName

contents
widget
of
an
using
-clicks
The
string.
command
on
its


currently
be
time
may
as
integer
the
the
more
times

Name:


creates
spinners
time
set
minute,
widget.
spintime
new
name
command
to
on
has
form:
?arg
Option
determine
of
following
for
METHODS
cget
Returns
of
given
may
the
the


?option?
...
?
or
options
If
specified,
describing
available
(see
on
this
is
value,
returns
the
(this
identical
sublist
returned
is
or
are
command
widget
the
this
returns
Option
of
by

get
Returns
of
in
string
integer
the
format
default
Reference
for
obtaining
formats.
pathName

displayed
that
argument.
be
a
clock
keyword
clock
information
and

COMPONENTS


hour
The
a
for
value
includes
and

METHODS


command
Tcl
is
may
invoke
the
the

arg
and
the
the
commands
spintime

option
the
the
by
have
values
spintime

?value

modify
of
no
returns
all
options
Tk_ConfigureInfo
the
list).
specified
then
a
one
list
to
of
if
specified).
more
specified,
modifies
option(s)
given
case
an
may
the
the

?format?
the
the
a
or
clock
-string
options
is
the
more
time

show
Changes
time
of
The
specified
string,
value
"now".
command
on
its


Class:

    The hour component is the hour spinner of the time spinner. See the SpinInt widget manual entry for details on the hour component item.

Name:                   minute
Class:                  Spinint
    The minute component is the minute spinner of the time spinner. See the SpinInt widget manual entry for details on the minute component item.

Name:                   second
Class:                  Spinint
    The second component is the second spinner of the time spinner. See the SpinInt widget manual entry for details on the second component item.

EXAMPLE

spintime .st
pack .st -padx 10 -pady 10

AUTHORS

Sue Yockey

Mark L. Ulferts

KEYWORDS

spintime, spinint, spinner, entryfield, entry, widget iwidgets-4.1.0/demos/html/tabnotebook.n.html0000644003604700454610000007334706570255576017471 0ustar dgp771divtabnotebook - create and manipulate tabnotebook widgets

tabnotebook - create and manipulate tabnotebook widgets

SYNOPSIS

tabnotebook pathName? options?

INHERITANCE

itk::Widget <- tabnotebook

STANDARD OPTIONS

background
cursor
disabledForeground
font
foreground
height
scrollCommand
width

See the "options" manual entry for details on the standard options.

WIDGET-SPECIFIC OPTIONS

Name:                   angle
Class:                  Angle
Command-Line Switch:	-angle

Name:                   auto
Class:                  Auto
Command-Line Switch:	-auto

Name:                   backdrop
Class:                  Backdrop
Command-Line Switch:	-backdrop

Name:                   background
Class:                  Background
Command-Line Switch:	-background

Name:                   bevelAmount
Class:                  BevelAmount
Command-Line Switch:	-bevelamount

Name:                   borderWidth
Class:                  BorderWidth
Command-Line Switch:	-borderwidth

Name:                   disabledForeground
Class:                  DisabledForeground
Command-Line Switch:	-disabledforeground

Name:                   equalTabs
Class:                  EqualTabs
Command-Line Switch:	-equaltabs

Name:                   foreground
Class:                  Foreground
Command-Line Switch:	-foreground

Name:                   gap
Class:                  Gap
Command-Line Switch:	-gap

Name:                   margin
Class:                  Margin
Command-Line Switch:	-Bmargin

Name:                   padX
Class:                  PadX
Command-Line Switch:	-padx

Name:                   padY
Class:                  PadY
Command-Line Switch:	-pady

Name:                   raiseSelect
Class:                  RaiseSelect
Command-Line Switch:	-raiseselect

Name:                   start
Class:                  Start
Command-Line Switch:	-start

Name:                   state
Class:                  State
Command-Line Switch:	-state

Name:                   tabBackground
Class:                  TabBackground
Command-Line Switch:	-tabbackground

Name:                   tabBorders
Class:                  TabBorders
Command-Line Switch:	-tabborders

Name:                   tabForeground
Class:                  TabForeground
Command-Line Switch:	-tabforeground

Name:                   tabPos
Class:                  TabPos
Command-Line Switch:	-tabpos

DESCRIPTION

The tabnotebook command creates a new window (given by the pathName argument) and makes it into a tabnotebook widget. Additional options, described above may be specified on the command line or in the option database to configure aspects of the tabnotebook such as its colors, font, and text. The tabnotebook command returns its pathName argument. At the time this command is invoked, there must not exist a window named pathName, but pathName's parent must exist.

A tabnotebook is a widget that contains a set of tabbed pages. It displays one page from the set as the selected page. A Tab displays the label for the page to which it is attached and serves as a page selector. When a page's tab is selected, the page's contents are displayed in the page area. The selected tab has a three-dimensional effect to make it appear to float above the other tabs. The tabs are displayed as a group along either the left, top, right, or bottom edge. When first created a tabnotebook has no pages. Pages may be added or deleted using widget commands described below.

A special option may be provided to the tabnotebook. The -auto option specifies whether the tabnotebook will automatically handle the unpacking and packing of pages when pages are selected. A value of true signifies that the notebook will automatically manage it. This is the default value. A value of false signifies the notebook will not perform automatic switching of pages.

NOTEBOOK PAGES

A tabnotebook's pages area contains a single child site frame. When a new page is created it is a child of this frame. The page's child site frame serves as a geometry container for applications to pack widgets into. It is this frame that is automatically unpacked or packed when the auto option is true. This creates the effect of one page being visible at a time. When a new page is selected, the previously selected page's child site frame is automatically unpacked from the tabnotebook's child site frame and the newly selected page's child site is packed into the tabnotebook's child site frame.

However, sometimes it is desirable to handle page changes in a different manner. By specifying the auto option as false, child site packing can be disabled and done differently. For example, all widgets might be packed into the first page's child site frame. Then when a new page is selected, the application can reconfigure the widgets and give the appearance that the page was flipped.

In both cases the command option for a page specifies a Tcl Command to execute when the page is selected. In the case of auto being true, it is between the unpacking of the previously selected page and the packing of the newly selected page.

Notebook pages can also be controlled with scroll bars or other widgets that obey the scrollcommand protocol. By giving a scrollbar a -command to call the tabnotebook's select method, the tabnotebook can be controlled with a scrollbar.

The notebook area is implemented with the notebook mega widget.

TABS

Tabs appear along the edge of the notebook area. Tabs are drawn to appear attached to their associated page. When a tab is clicked on, the associated page is selected and the tab is drawn as raised above all other tabs and as a seamless part of its notebook page. Tabs can be controlled in their location along the edges, the angle tab sides are drawn with, gap between tabs, starting margin of tabs, internal padding around text labels in a tab, the font, and its label.

The Tab area is implemented with the tabset mega widget. See tabset(1). Tabs may be oriented along either the north, south, east, or west sides with the tabPos option. North and south tabs may appear as angled, square, or bevelled. West and east tabs may appear as square or bevelled. By changing tab gaps, tab angles, bevelling, orientations, colors, fonts, start locations, and margins; tabs may appear in a wide variety of styles. For example, it is possible to implement Microsoft-style tabs, Borland property tab styles, or Borland Delphi style tabs all with the same tabnotebook.

WIDGET-SPECIFIC METHODS

The tabnotebook command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
option and the args determine the exact behavior of the command.

Many of the widget commands for a notebook take as one argument an indicator of which page of the notebook to operate on. These indicators are called indexes and may be specified in any of the following forms:

number
Specifies the page numerically, where 0 corresponds to the first page in the notebook, 1 to the second, and so on.
select
Specifies the currently selected page's index. If no page is currently selected, the value -1 is returned.
end
Specifes the last page in the tabnotebook's index. If the notebook is empty this will return -1.
pattern
If the index doesn't satisfy any of the above forms, then this form is used. Pattern is pattern-matched against the label of each page in the notebook, in order from the first to the last page, until a matching entry is found. The rules of Tcl_StringMatch are used. '............................................................................. The following commands are possible for tabnotebook widgets:
pathName add ?option value option value ...?
Add a new page at the end of the tabnotebook. A new child site frame is created. Returns the child site pathName. If additional arguments are present, they specify any of the following options:
'>>>>>>>>>>
pathName childSite ?index? If passed no arguments, returns a list of pathNames for all the pages in the tabnotebook. If the tab notebook is empty, an empty list is returned
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the tabnotebook command.
pathName delete index1 ?index2?
Delete all of the pages between index1 and index2 inclusive. If index2 is omitted then it defaults to index1. Returns an empty string.
pathName index index
Returns the numerical index corresponding to index.
pathName insert index ?option value option value ...?
Insert a new page in the tabnotebook before the page specified by index. A new child site frame is created. The additional arguments are the same as for the add command. Returns the child site pathName.
pathName next
Advances the selected page to the next page (order is determined by insertion order). If the currently selected page is the last page in the notebook, the selection wraps around to the first page in the notebook. It behaves as if the user selected the new page.
pathName pageconfigure index ?option? ?value option value ...?
This command is similar to the configure command, except that it applies to the options for an individual page, whereas configure applies to the options for the tabnotebook as a whole. Options may have any of the values accepted by the add widget command. If options are specified, options are modified as indicated in the command and the command returns an empty string. If no options are specified, returns a list describing the current options for page index (see Tk_ConfigureInfo for information on the format of this list).
pathName prev
Moves the selected page to the previous page (order is determined by insertion order). If the currently selected page is the first page in the notebook, the selection wraps around to the last page in the notebook. It behaves as if the user selected the new page.
pathName select index
Selects the page specified by index as the currently selected page. It behaves as if the user selected the new page.
pathName view
Returns the currently selected page. This command is for compatibility with the scrollbar widget.
pathName view index
Selects the page specified by index as the currently selected page. This command is for compatibility with the scrollbar widget.
pathName view moveto fraction
Uses the fraction value to determine the corresponding page to move to. This command is for compatibility with the scrollbar widget.
pathName view scroll num what
Uses the num value to determine how many pages to move forward or backward (num can be negative or positive). The what argument is ignored. This command is for compatibility with the scrollbar widget.

COMPONENTS

Generally all behavior of the internal components, tabset and notebook are controlled via the pageconfigure method. The following section documents these two components.

Name:                   tabset
Class:                  Tabset

Name:                   notebook
Class:                  Notebook

EXAMPLE

Following is an example that creates a tabnotebook with two pages.


    the
    pack
    -width
    pack
    nw
    \\
    -side
    10

      pages
      #
      and
      add
      .tn
      Two"
      Get
      frames
      pages.
      childsite
      [.tn

    buttons
    of
    $page1CS.b
    pack
    -text
    $page2CS.b
    Select
    of
    select

tabnotebook
it.
100
.tn
\\
-expand
left
\\
#
to
labelled
"Page
-label
add

the
of
set
0]
childsite

    on
    the
    -text
    $page1CS.b
    "Button

the
the
0
#
widget
tabnotebook
-height
\\
-fill
yes
\\
-pady
Add
the
"Page
Two"
"Page
-label

    child
    these
    page1CS
    set
    "Page
    #
    each
    tabnotebook.
    "Button
    button
    Two"

      first
      tabnotebook.

Create
and
.tn
100
-anchor
both
\\
-padx
10
two
tabnotebook,
One"
.tn
One"
"Page
#
site
two
[.tn
page2CS
Two"]
Create
page
button
One"
$page2CS.b
pack
#
page
.tn

AUTHOR

Bill W. Scott

KEYWORDS

tab tabset notebook tabnotebook page iwidgets-4.1.0/demos/html/tabset.n.html0000644003604700454610000005170306570255573016431 0ustar dgp771divtabset - create and manipulate tabs as as set

tabset - create and manipulate tabs as as set

SYNOPSIS

tabset pathName ?options?

INHERITANCE

itk::Widget <- tabset

STANDARD OPTIONS

background
foreground
width
font
selectForeground
selectBackground
disabledForeground
cursor
height

See the "options" manual entry for details on the standard options.

WIDGET-SPECIFIC OPTIONS

Name:                   angle
Class:                  Angle
Command-Line Switch:	-angle

Name:                   backdrop
Class:                  Backdrop
Command-Line Switch:	-backdrop

Name:                   bevelAmount
Class:                  BevelAmount
Command-Line Switch:	-bevelamount

Name:                   command
Class:                  Command
Command-Line Switch:	-command
Specifes the prefix of a Tcl command to invoke to change the view in the 
widget associated with the tabset. When a user selects a tab, a Tcl command 
is invoked. The actual command consists of this option followed by a space 
and a number. The number is the numerical index of the tab that has been 
selected.

Name: equalTabs Class: EqualTabs Command-Line Switch: -equaltabs

Name:                   gap
Class:                  Gap
Command-Line Switch:	-gap

Name:                   margin
Class:                  Margin
Command-Line Switch:	-margin

Name:                   padX
Class:                  PadX
Command-Line Switch:	-padx

Name:                   padY
Class:                  PadY
Command-Line Switch:	-pady

Name:                   raiseSelect
Class:                  RaiseSelect
Command-Line Switch:	-raiseselect

Name:                   start
Class:                  Start
Command-Line Switch:	-start

Name:                   state
Class:                  State
Command-Line Switch:	-state

Name:                   tabBorders
Class:                  TabBorders
Command-Line Switch:	-tabborders

Name:                   tabPos
Class:                  TabPos
Command-Line Switch:	-tabpos

DESCRIPTION

The tabset command creates a new window (given by the pathName argument) and makes it into a tabset widget. Additional options, described above may be specified on the command line or in the option database to configure aspects of the tabset such as its colors, font, and text. The tabset command returns its pathName argument. At the time this command is invoked, there must not exist a window named pathName, but pathName's parent must exist.

A tabset is a widget that contains a set of Tab buttons. It displays these tabs in a row or column depending on it tabpos. When a tab is clicked on, it becomes the only tab in the tab set that is selected. All other tabs are deselected. The Tcl command prefix associated with this tab (through the command tab configure option) is invoked with the tab index number appended to its argument list. This allows the tabset to control another widget such as a Notebook.

TABS

Tabs are drawn to appear attached to another widget. The tabset draws an edge boundary along one of its edges. This edge is known as the attachment edge. This edge location is dependent on the value of tabPos. For example, if tabPos is s, the attachment edge wil be on the top side of the tabset (in order to attach to the bottom or south side of its attached widget). The selected tab is draw with a 3d relief to appear above the other tabs. This selected tab "opens" toward attachment edge.

Tabs can be controlled in their location along the edges, the angle that tab sides are drawn with, gap between tabs, starting margin of tabs, internal padding around labels in a tab, the font, and its text or bitmap.

WIDGET-SPECIFIC METHODS

The tabset command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
option and the args determine the exact behavior of the command.

Many of the widget commands for a tabset take as one argument an indicator of which tab of the tabset to operate on. These indicators are called indexes and may be specified in any of the following forms:

number
Specifies the tab numerically, where 0 corresponds to the first tab in the tab set, 1 to the second, and so on.
select
Specifies the currently selected tab's index. If no tab is currently selected, the value -1 is returned.
end
Specifes the last tab in the tabset's index. If the tabset is empty this will return -1.
pattern
If the index doesn't satisfy any of the above forms, then this form is used. Pattern is pattern-matched against the label of each tab in the tabset, in order from the first to the last tab, until a matching entry is found. The rules of Tcl_StringMatch are used.

'............................................................................. The following commands are possible for tabset widgets:


    a
    how
    item
    list
    from
    callback.
    item
    selection
    .l
    .l

      proc
      to
      #
      pixel
      list..
      y
      whichItem
      .ts

    a
    items
    #
    1
    selectTab
    -selectmode
    .l
    .l
    .l
    pack
    <ButtonPress-1>
    }
    Create
    its
    selectItem
    labels
    (one
    .ts
    add
    add
    select
    -fill


proc
to
#
given
the
proc
}
clear
selection
see
#
that
select
given
coordinate
proc
}
[.l
select

    listbox
    (one
    and
    press
    procedure.
    single
    insert
    insert
    selection
    .l
    {

a
-command
#
to
and
-command
-label
-label
0
x
#
that
select
from
an
tabset
selectItem
{
[.l
set
$item
Define
knows
a
a
from
selectTab
{
nearest
$whichItem
#
with
and
bind
to
listbox
-exportselection
end
end
set
bind
selectTab

    tabset,
    to
    Add
    the
    two).
    selectItem
    1
    2
    pack
    -expand
Define
knows
an
a
index
-command
{
.l
curselection]
$item
}
a
how
tab
y
the
{
set
$y]
}
Create
two
two)
button
the
.l
false
one
two
0
.l
%y
#
set
call
two
tabset
tabset
.ts
.ts
.ts
.ts
no

AUTHOR

Bill W. Scott

KEYWORDS

tab tabset notebook tabnotebook iwidgets-4.1.0/demos/html/timeentry.n.html0000644003604700454610000001511207347201773017155 0ustar dgp771divtimeentry - Create and manipulate a timeentry widget

timeentry - Create and manipulate a timeentry widget

SYNOPSIS

timeentry pathName ?options?

INHERITANCE

itk::Widget <- LabeledWidget <- Timefield <- Timeentry

STANDARD OPTIONS

background
foreground
justify
borderWidth
highlightColor
relief
cursor
highlightThickness
exportSelection
insertBackground

See the "options" manual entry for details on the standard options.

INHERITED OPTIONS

disabledForeground
labelMargin
state
labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable

See the "labeledwidget" class manual entry for details on these inherited options.

command
textFont
format
seconds
textBackground

See the "timefield" class manual entry for details on these inherited options.

ASSOCIATED OPTIONS

hourRadius
pivotRadius
clockColor
watchWidth
hourColor
pivotColor
clockStipple
minuteRadius
secondRadius
tickColor
minuteColor
secondColor
watchHeight

See the "watch" manual entry for details on the associated options.

WIDGET-SPECIFIC OPTIONS

Name:                   closeText
Class:                  Text
Command-Line Switch:	-closetext

Name:                   grab
Class:                  Grab
Command-Line Switch:	-grab

Name:                   icon
Class:                  Icon
Command-Line Switch:	-icon

Name:                   state
Class:                  State
Command-Line Switch:	-state


DESCRIPTION

The timeentry command creates a time entry field with a popup watch by combining the timefield and watch widgets together. This allows a user to enter the time via the keyboard or by using the mouse and selecting the watch icon which brings up a popup watch.

METHODS

The timeentry command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for timeentry widgets:

INHERITED METHODS

get
isvalid
show

See the "timefield" manual entry for details on the associated methods.

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the timeentry command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the timeentry command.

COMPONENTS

Name:                   label
Class:                  Label

Name:                   iconbutton
Class:                  Label

Name:                   time
Class:                  Entry

EXAMPLE

 timeentry .te
 pack .te

AUTHOR

Mark L. Ulferts

KEYWORDS

timeentry, widget iwidgets-4.1.0/demos/html/timefield.n.html0000644003604700454610000001351507347202003017067 0ustar dgp771divtimefield - Create and manipulate a time field widget

timefield - Create and manipulate a time field widget

SYNOPSIS

timefield pathName ?options?

INHERITANCE

itk::Widget <- LabeledWidget <- timefield

STANDARD OPTIONS

background
foreground
justify
borderWidth
highlightColor
relief
cursor
highlightThickness
exportSelection
insertBackground

See the "options" manual entry for details on the standard options.

INHERITED OPTIONS

disabledForeground
labelMargin
state
labelBitmap
labelPos
labelFont
labelText
labelImage
labelVariable

See the "labeledwidget" class manual entry for details on the inherited options.

WIDGET-SPECIFIC OPTIONS

Name:                   childSitePos
Class:                  Position
Command-Line Switch:	-childsitepos

Name:                   command
Class:                  Command
Command-Line Switch:	-command

Name:                   state
Class:                  State
Command-Line Switch:	-state

Name:                   textBackground
Class:                  Background
Command-Line Switch:	-textbackground

Name:                   textFont
Class:                  Font
Command-Line Switch:	-textfont


DESCRIPTION

The timefield command creates an enhanced text entry widget for the purpose of time entry with various degrees of built-in intelligence.

METHODS

The timefield command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for timefield widgets:

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the timefield command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the timefield command.
pathName get ?format?
Returns the current contents of the timefield in a format of string or as an integer clock value using the -string and -clicks format options respectively. The default is by string. Reference the clock command for more information on obtaining times and their formats.
pathName isvalid
Returns a boolean indication of the validity of the currently displayed time value. For example, 12:59:59 is valid whereas 25:59:59 is invalid.
pathName show time
Changes the currently displayed time to be that of the time argument. The time may be specified either as a string, an integer clock value or the keyword "now" (the default). Reference the clock command for more information on obtaining times and their formats.

COMPONENTS

Name:                   time
Class:                  Entry

EXAMPLE

 proc returnCmd {} {
   puts [.tf get]
 }

 timefield .tf -command returnCmd
 pack .tf -fill x -expand yes -padx 10 -pady 10

AUTHOR

John A. Tucker Mark L. Ulferts

KEYWORDS

timefield, widget iwidgets-4.1.0/demos/html/toolbar.n.html0000644003604700454610000003256007015107776016605 0ustar dgp771div<B>toolbar</B> - Create and manipulate a tool bar

toolbar - Create and manipulate a tool bar

SYNOPSIS

toolbar pathName ?options?

STANDARD OPTIONS

activeBackground
activeForeground
background
borderWidth
cursor
disabledForeground
font
foreground
highlightBackground
highlightColor
highlightThickness
insertBackground
insertForeground
orient
selectBackground
selectBorderWidth
selectColor
selectForeground
state
troughColor

See the "options" manual entry for details on the standard options. For widgets added to the toolbar, these options will be propogated if the widget supports the option. For example, all widgets that support a font option will be changed if the the toolbar's font option is configured.

WIDGET-SPECIFIC OPTIONS

Name:                   balloonBackground
Class:                  BalloonBackground
Command-Line Switch:	-ballooonbackground

Name:                   balloonDelay1
Class:                  BalloonDelay1
Command-Line Switch:	-balloondelay1

Name:                   balloonDelay2
Class:                  BalloonDelay2
Command-Line Switch:	-balloondelay2

Name:                   balloonFont
Class:                  BalloonFont
Command-Line Switch:	-balloonfont

Name:                   balloonForeground
Class:                  BalloonForeground
Command-Line Switch:	-ballooonforeground

Name:                   helpVariable
Class:                  HelpVariable
Command-Line Switch:	-helpvariable

Name:                   orient
Class:                  Orient
Command-Line Switch:	-orient

DESCRIPTION

The toolbar command creates a new window (given by the pathName argument) and makes it into a toolbar widget. Additional options, described above may be specified on the command line or in the option database to configure aspects of the toolbar such as its colors, font, and orientation. The toolbar command returns its pathName argument. At the time this command is invoked, there must not exist a window named pathName, but pathName's parent must exist.

A toolbar is a widget that displays a collection of widgets arranged either in a row or a column (depending on the value of the -orient option). This collection of widgets is usually for user convenience to give access to a set of commands or settings. Any widget may be placed on a toolbar. However, command or value-oriented widgets (such as button, radiobutton, etc.) are usually the most useful kind of widgets to appear on a toolbar.

In addition, the toolbar adds two new options to all widgets that are added to it. These are the helpStr and balloonStr options. See the discussion for the widget command add below.

WIDGET-SPECIFIC METHODS

The toolbar command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and args determine the exact behavior of the command.

Many of the widget commands for a toolbar take as one argument an indicator of which widget item of the toolbar to operate on. The indicator is called an index and may be specified in any of the following forms:

number
Specifies the widget numerically, where 0 corresponds to the first widget in the notebook, 1 to the second, and so on. (For horizontal, 0 is the leftmost; for vertical, 0 is the topmost).
end
Specifes the last widget in the toolbar's index. If the toolbar is empty this will return -1.
last
Same as end.
pattern
If the index doesn't satisfy any of the above forms, then this form is used. Pattern is pattern-matched against the widgetName of each widget in the toolbar, in order from the first to the last widget, until a matching entry is found. An exact match must occur.

The following commands are possible for toolbar widgets:

pathName add widgetCommand widgetName ?option value?
Adds a widget with the command widgetCommand whose name is widgetName to the toolbar. If widgetCommand is radiobutton or checkbutton, its packing is slightly padded to match the geometry of button widgets. In addition, the indicatorOn option is false by default and the selectColor is that of the toolbar background by default. This allows Radiobutton and Checkbutton widgets to be added as icons by simply setting their bitmap or image options. If additional arguments are present, they are the set of available options that the widget type of widgetCommand supports. In addition they may also be one of the following options:
pathName cget option
Returns the current value of the configuration option given by option.
pathName configure ?option value?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string.
pathName delete index ?index2?
This command deletes all items between index and index2 inclusive. If index2 is omitted then it defaults to index. Returns an empty string.
pathName index index
Returns the widget's numerical index for the entry corresponding to index. If index is not found, -1 is returned.
pathName insert beforeIndex widgetCommand widgetName ?option value?
Insert a new item named widgetName with the
command widgetCommand before the item specified by beforeIndex. If widgetCommand is radiobutton or checkbutton, its packing is slightly padded to match the geometry of button widgets. In addition, the indicatorOn option is false by default and the selectColor is that of the toolbar background by default. This allows Radiobutton and Checkbutton widgets to be added as icons by simply setting their bitmap or image options. The set of available options is the same as specified in the ad command.
pathName itemcget index option
Returns the current value of the configuration option given by option for index. The item type of index determines the valid available options.
pathName itemconfigure index ?option value?
Query or modify the configuration options of the widget of the toolbar specified by index. If no option is specified, returns a list describing all of the available options for index (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. The item type of index determines the valid available options. The set of available options is the same as specified in the ad command.

EXAMPLE

 toolbar .tb -helpvariable statusVar

 .tb add button item1 \\
    -helpstr "Save It" -bitmap @./icons/Tool_32_box.xbm \\
    -balloonstr "Save" -command {puts 1}
 .tb add button item2 \\
    -helpstr "Save It" -bitmap @./icons/Tool_32_brush.xbm \\
    -balloonstr "Save" -command {puts 1}
 .tb add button item3 \\
    -helpstr "Save It" -bitmap @./icons/Tool_32_cut.xbm \\
    -balloonstr "Save" -command {puts 1}
 .tb add button item4 \\
    -helpstr "Save It" -bitmap @./icons/Tool_32_draw.xbm \\
    -balloonstr "Save" -command {puts 1}
 .tb add button item5 \\
    -bitmap @./icons/Tool_32_erase.xbm -helpstr "Play It" \\
    -command {puts 2}
 .tb add frame filler \\
    -borderwidth 1 -width 10 -height 10
 .tb add radiobutton item6 \\
    -bitmap @./icons/Tool_32_oval.xbm -command {puts 4} \\
    -variable result -value OPEN -helpstr "Radio Button # 1" \\
    -balloonstr "Radio"
 .tb add radiobutton item7 \\
    -bitmap @./icons/Tool_32_line.xbm -command {puts 5} \\
    -variable result -value CLOSED
 .tb add checkbutton item8 \\
    -bitmap @./icons/Tool_32_text.xbm -command {puts 6} \\
    -variable checkit -onvalue yes -offvalue no    
 .tb add checkbutton check2 \\
    -bitmap @./icons/Tool_32_points.xbm -command {puts 7} \\
     -variable checkit2 -onvalue yes -offvalue no    

 pack .tb -side top -anchor nw

AUTHOR

Bill Scott

KEYWORDS

toolbar, button, radiobutton, checkbutton, iwidgets, widget iwidgets-4.1.0/demos/html/watch.n.html0000644003604700454610000002140607347202012016231 0ustar dgp771divwatch - Create and manipulate time with a watch widgets

watch - Create and manipulate time with a watch widgets

SYNOPSIS

watch pathName ?options?

INHERITANCE

itk::Widget <- Watch

STANDARD OPTIONS

background
cursor
foreground
relief

See the "options" manual entry for details on the standard options.

ASSOCIATED OPTIONS

See the "Canvas" manual entry for details on the above associated options.

WIDGET-SPECIFIC OPTIONS

Name:                   clockColor
Class:                  ColorfR
Command-Line Switch:	-clockcolor
    Fill color for the main oval encapsulating the watch, in any of the forms acceptable to Tk_GetColor. The default is "White".


BitmapfR

Name:
Command-Line
clockStipple
Switch:
Class:
-clockstipple
    Bitmap for the main oval encapsulating the watch, in any of the forms acceptable to Tk_GetBitmap. The default is "".

Name:                   height
Class:                  Height
Command-Line Switch:	-height
    Specifies the height of the watch widget in any of the forms acceptable to Tk_GetPixels. The default height is 175 pixels.

Name:                   hourColor
Class:                  ColorfR
Command-Line Switch:	-hourcolor
    Fill color for the hour hand, in any of the forms acceptable to Tk_GetColor. The default is "Red".

Name:                   hourRadius
Class:                  Radius
Command-Line Switch:	-hourradius
    Specifies the radius of the hour hand as a percentage of the radius from the center to the out perimeter of the clock. The value must be a fraction <= 1. The default is ".5".

Name:                   minuteColor
Class:                  ColorfR
Command-Line Switch:	-minutecolor
    Fill color for the minute hand, in any of the forms acceptable to Tk_GetColor. The default is "Yellow".

Name:                   minuteRadius
Class:                  Radius
Command-Line Switch:	-minuteradius
    Specifies the radius of the minute hand as a percentage of the radius from the center to the out perimeter of the clock. The value must be a fraction <= 1. The default is ".8".

Name:                   pivotColor
Class:                  ColorfR
Command-Line Switch:	-pivotcolor
    Fill color for the circle in which the watch hands rotate in any of the forms acceptable to Tk_GetColor. The default is "White".

Name:                   pivotRadius
Class:                  Radius
Command-Line Switch:	-pivotradius
    Specifies the radius of the circle in which the watch hands rotate as a percentage of the radius. The value must be a fraction <= 1. The default is ".1".

Name:                   secondColor
Class:                  ColorfR
Command-Line Switch:	-secondcolor
    Fill color for the second hand, in any of the forms acceptable to Tk_GetColor. The default is "Black".

Name:                   secondRadius
Class:                  Radius
Command-Line Switch:	-secondradius
    Specifies the radius of the second hand as a percentage of the radius from the center to the out perimeter of the clock. The value must be a fraction <= 1. The default is ".9".

Name:                   showAmPm
Class:                  ShosAmPm
Command-Line Switch:	-showampm
    Specifies whether the AM/PM radiobuttons should be displayed, in any of the forms acceptable to Tcl_GetBoolean. The default is yes.

Name:                   state
Class:                  State
Command-Line Switch:	-state
    Specifies the editable state for the hands on the watch. In a normal state, the user can select and move the hands via mouse button 1. The valid values are normal, and disabled. The defult is normal.

Name:                   tickColor
Class:                  ColorfR
Command-Line Switch:	-tickcolor
    Fill color for the 60 ticks around the perimeter of the watch, in any of the forms acceptable to Tk_GetColor. The default is "Black".

Name:                   width
Class:                  Width
Command-Line Switch:	-width
    Specifies the width of the watch widget in any of the forms acceptable to Tk_GetPixels. The default height is 155 pixels.

DESCRIPTION

The watch command creates a watch with hour, minute, and second hands modifying the time value.

METHODS

The watch command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form:

pathName option ?arg arg ...?
Option and the args determine the exact behavior of the command. The following commands are possible for watch widgets:

WIDGET-SPECIFIC METHODS

pathName cget option
Returns the current value of the configuration option given by option. Option may have any of the values accepted by the watch command.
pathName configure ?option? ?value option value ...?
Query or modify the configuration options of the widget. If no option is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If option is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. Option may have any of the values accepted by the watch command.
pathName get ?format?
Returns the current time of the watch in a format of string or as an integer clock value using the -string and -clicks format options respectively. The default is by string. Reference the clock command for more information on obtaining time and its formats.
pathName show time
Changes the currently displayed time to be that of the time argument. The time may be specified either as a string, an integer clock value or the keyword "now". Reference the clock command for more information on obtaining time and its format.
pathName watch ?args?
Evaluates the specifieds args against the canvas component.

COMPONENTS

Name:                   canvas
Class:                  Canvas

Name:                   frame
Class:                  Frame

Name:                   am
Class:                  Radiobutton

Name:                   pm
Class:                  Radiobutton

EXAMPLE

watch .w -state disabled -showampm no -width 155 -height 155
pack .w -padx 10 -pady 10 -fill both -expand yes

while {1} {
  after 1000
  .w show
  update
}

AUTHORS

John Tucker

Mark L. Ulferts

KEYWORDS

watch, hand, ticks, pivot, widget iwidgets-4.1.0/demos/buttonbox0000644003604700454610000000065207340260050015003 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: buttonbox in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::buttonbox .bb .bb add OK -text OK -command "puts OK" .bb add Apply -text Apply -command "puts Apply" .bb add Cancel -text Cancel -command "puts Cancel" .bb default OK pack .bb -expand yes -fill both iwidgets-4.1.0/demos/calendar0000644003604700454610000000143407340260063014533 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: calendar in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *Calendar.buttonForeground black option add *Calendar.outline black option add *Calendar.weekdayBackground white option add *Calendar.weekendBackground mistyrose option add *Calendar.selectColor red . configure -background white iwidgets::calendar .cal pack .cal -expand yes -fill both iwidgets::optionmenu .days -labeltext "Start Day:" -command { set day [.days get] .cal configure -startday $day -days $caldays($day) } pack .days -padx 4 -pady 4 array set caldays { sunday {S M T W T F S} monday {Mo Tu We Th Fr Sa Su} } .days insert end sunday monday iwidgets-4.1.0/demos/canvasprintbox0000644003604700454610000000117107340260103016014 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: canvasprintbox in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell # # Make a canvas for the main application: # canvas .c -width 200 -height 200 -background white pack .c .c create rectangle 30 30 150 150 -fill blue .c create oval 70 70 190 190 -fill red .c create polygon 60 50 110 180 10 180 -fill green .c create text 100 5 -anchor n -text "Example Drawing" iwidgets::canvasprintbox .pcb -printcmd "lpr" -pagesize "A4" .pcb setcanvas .c iwidgets-4.1.0/demos/canvasprintdialog0000644003604700454610000000152207340260112016463 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: canvasprintdialog in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell # # Make a canvas for the main application: # canvas .c -width 200 -height 200 -background white pack .c .c create rectangle 30 30 150 150 -fill blue .c create oval 70 70 190 190 -fill red .c create polygon 60 50 110 180 10 180 -fill green .c create text 100 5 -anchor n -text "Example Drawing" button .print -text "Print..." -command { if {[.pcd activate]} { puts "use command \".pcd print\" to really print" } else { puts "aborted" } } pack .print iwidgets::canvasprintdialog .pcd -modality application \ -printcmd "lpr" -pagesize "A4" .pcd setcanvas .c iwidgets-4.1.0/demos/catalog0000644003604700454610000003147410625401371014402 0ustar dgp771div#!/bin/sh # ---------------------------------------------------------------------- # PROGRAM: demo program for [incr Widgets] # ---------------------------------------------------------------------- # Michael J. McLennan # Bell Labs Innovations for Lucent Technologies # mmclennan@lucent.com # http://www.tcltk.com/itcl/ # ====================================================================== # Copyright (c) 1993-1998 Lucent Technologies, Inc. # ====================================================================== #\ exec wish8.4 "$0" package require Iwidgets 4.0 # ---------------------------------------------------------------------- option add *Scrolledtext.textBackground white startupFile option add *Scrolledlistbox.textBackground white startupFile option add *Scrolledhtml.textBackground white startupFile option add *Scrolledhtml.padX 10 startupFile option add *boxColor blue startupFile option add *boxTextColor white startupFile # ---------------------------------------------------------------------- global selfdir set selfdir [file normalize [file dirname [info script]]] # ---------------------------------------------------------------------- # USAGE: iw_demo_file # # Returns the proper demo file name for a demo called . # ---------------------------------------------------------------------- proc iw_demo_file {name} { global selfdir return [file join $selfdir $name] } # ---------------------------------------------------------------------- # USAGE: iw_demo_manpage # # Returns the proper man page file for a demo called . # ---------------------------------------------------------------------- proc iw_demo_manpage {name} { global selfdir return [file join $selfdir html $name.n.html] } # ---------------------------------------------------------------------- # USAGE: iw_load_demo # # Loads a demo program with the given . Demos can be written # as if they will pop up in the main application window, but they will # pop up inside the tab notebook instead. # ---------------------------------------------------------------------- proc iw_load_demo {name} { global widgets catch {eval destroy [winfo children $widgets(info-example)]} iw_lock on iw_status "Loading..." set win [frame $widgets(info-example).inner] pack $win -expand yes set loadcmd { set fid [open [iw_demo_file $name] r] set code [read $fid] close $fid } if {[catch $loadcmd result] == 0} { regsub -all "(\"|\{|\\\[| |\n|^|\t)((\\.\[A-Za-z0-9\]+)+)" \ $code "\\1$win\\2" code regsub -all "(\"|\{|\\\[| |\n|^)(\\. )" \ $code "\\1$win " code if {[catch {uplevel #0 $code} result] == 0} { $widgets(info-code) clear $widgets(info-code) import [iw_demo_file $name] iw_draw_hier $name iw_load_manpage $name iw_lock off iw_status "" return } } catch {eval destroy [winfo children $win]} label $win.err -background white -wraplength 4i \ -text "Can't load demo:\n$result" pack $win.err -expand yes iw_lock off iw_status "" } # overload a few critical functions that might be used by demo programs... rename exit tcl_exit proc exit {{status 0}} { # do nothing } rename puts tcl_puts proc puts {args} { global widgets if {[llength $args] == 1} { iw_status [lindex $args 0] } else { eval tcl_puts $args } } # ---------------------------------------------------------------------- # USAGE: iw_load_manpage # # Loads the man page for the current demo. Man pages are not # automatically loaded unless the man page viewer is visible. # This procedure checks to see if the viewer is visible, and loads # the man page if needed. # ---------------------------------------------------------------------- set iwManPage "" proc iw_load_manpage {{name ""}} { global widgets iwManPage if {[winfo ismapped $widgets(info-manpage)]} { if {$name == ""} { set name [$widgets(list) getcurselection] } if {$name != $iwManPage} { iw_lock on iw_status "Loading man page..." $widgets(info-manpage) import [iw_demo_manpage $name] iw_lock off iw_status "" place forget $widgets(info-manpage-feedback) } set iwManPage $name } } # ---------------------------------------------------------------------- # USAGE: iw_manpage_progress # # Handles the progress meter whenever an HTML man page is rendered. # If the progress meter is not showing, it is put up, and the current # state is updated. If the meter is at 100%, it is taken down. # ---------------------------------------------------------------------- proc iw_manpage_progress {n} { global widgets remaining if {![winfo ismapped $widgets(info-manpage-feedback)]} { $widgets(info-manpage-feedback) configure -steps $n $widgets(info-manpage-feedback) reset place $widgets(info-manpage-feedback) -relx 0.5 -rely 0.5 \ -anchor c -width 200 update set remaining $n } $widgets(info-manpage-feedback) step [expr $remaining - $n] set remaining $n } # ---------------------------------------------------------------------- # USAGE: iw_status # # Displays a status near the top of the window. # ---------------------------------------------------------------------- proc iw_status {message} { global widgets $widgets(status) configure -text $message update } # ---------------------------------------------------------------------- # USAGE: iw_lock # # Locks or unlocks the main window. Sets a grab on the main menu, # so that all events are sent to it. # ---------------------------------------------------------------------- proc iw_lock {state} { global widgets if {$state} { grab set $widgets(mainMenu) . configure -cursor watch } else { grab release $widgets(mainMenu) . configure -cursor "" } } # ---------------------------------------------------------------------- # USAGE: iw_draw_hier # # Queries the hierarchy for a particular class in demo and # draws a class diagram into a display window. Usually invoked when # a demo is loaded to display the class hierarchy for the associated # widget. # ---------------------------------------------------------------------- proc iw_draw_hier {name} { global widgets set canv $widgets(info-hier) $canv delete all set class [string toupper [string index $name 0]][string tolower [string range $name 1 end]] if {[catch [list namespace eval iwidgets [list itcl::find classes $class]]] == 0} { set objs [namespace eval iwidgets [list itcl::find objects -class $class]] if {[llength $objs]} { update idletasks set bases [[lindex $objs 0] info heritage] iw_draw_level [lrange $bases 1 end] $canv [lindex $bases 0] set bbox [$canv bbox all] $canv move all [expr [lindex $bbox 0] * -1] [expr [lindex $bbox 1] * -1] $canv xview moveto 0 $canv yview moveto 0 set bbox [$canv bbox all] set x [expr ([winfo width $widgets(info)] / 2) - ([lindex $bbox 2] / 2)] set y 10 $canv move all $x $y } } } # ---------------------------------------------------------------------- # USAGE: iw_draw_level # # Draws one level of the hierarchy for . # ---------------------------------------------------------------------- proc iw_draw_level {bases canv class} { set org [iw_draw_box $canv $class] set top $org set offset 0 if {[llength $bases]} { $canv lower [$canv create line $offset $org \ $offset [expr $top-10] \ -40 [expr $top-10] \ -24 [expr $top-10] \ -20 [expr $top-16] \ -16 [expr $top-10] \ -20 [expr $top-16] \ -20 [expr $top-26]] $canv move all 20 [expr -($top-26+$org)] set del [iw_draw_level [lrange $bases 1 end] $canv [lindex $bases 0]] $canv move all -20 [expr $top-26+$org] set top [expr $top+$del-30+$org] incr offset 4 } return $top } # ---------------------------------------------------------------------- # USAGE: iw_draw_box # # Draws one box for a class hierarchy onto a canvas window. # ---------------------------------------------------------------------- proc iw_draw_box {canv class} { set bg [option get $canv boxColor BoxColor] set textbg [option get $canv boxTextColor BoxTextColor] set cname [string trimleft $class :] $canv create text 0 0 -anchor center -text $cname \ -fill $textbg -tags $class set bbox [$canv bbox $class] set x0 [expr [lindex $bbox 0]-4] set y0 [expr [lindex $bbox 1]-4] set x1 [expr [lindex $bbox 2]+4] set y1 [expr [lindex $bbox 3]+4] $canv create rectangle $x0 $y0 $x1 $y1 \ -outline black -fill $bg $canv raise $class return $y0 } # ---------------------------------------------------------------------- wm title . {[incr Widgets] Demo} wm geometry . 750x440 frame .mbar -borderwidth 2 -relief raised pack .mbar -fill x set widgets(mainMenu) [menubutton .mbar.main -text "Main" -menu .mbar.main.m] pack .mbar.main -side left menu .mbar.main.m .mbar.main.m add command -label "About..." -command {.about activate} .mbar.main.m add separator .mbar.main.m add command -label "Quit" -command tcl_exit iwidgets::panedwindow .pw -orient vertical pack .pw -expand yes -fill both .pw add "widgets" set pane [.pw childsite "widgets"] set widgets(list) $pane.wlist iwidgets::scrolledlistbox $widgets(list) -labeltext "Select a widget:" \ -selectioncommand {iw_load_demo [$widgets(list) getcurselection]} \ -labelpos nw -vscrollmode dynamic -hscrollmode none \ -exportselection no pack $widgets(list) -expand yes -fill both -padx 8 .pw add "info" set pane [.pw childsite "info"] set widgets(info) $pane.info .pw fraction 25 75 set widgets(status) [label $pane.status] pack $pane.status -anchor w iwidgets::tabnotebook $widgets(info) -tabpos s pack $widgets(info) -expand yes -fill both set widgets(info-example) [$widgets(info) add -label "Example"] $widgets(info-example) configure -background white set win [$widgets(info) add -label "Example Code"] set widgets(info-code) [iwidgets::scrolledtext $win.code \ -wrap none -vscrollmode dynamic -hscrollmode none] pack $widgets(info-code) -expand yes -fill both -padx 4 -pady 4 set win [$widgets(info) add -label "Inheritance"] set widgets(info-hier) [iwidgets::scrolledcanvas $win.canv -textbackground white \ -vscrollmode dynamic -hscrollmode dynamic] pack $widgets(info-hier) -expand yes -fill both -padx 4 -pady 4 set win [$widgets(info) add -label "Man Page"] set widgets(info-manpage) [iwidgets::scrolledhtml $win.html \ -wrap word -vscrollmode dynamic -hscrollmode none \ -feedback "iw_manpage_progress" \ -linkcommand "$win.html import -link"] pack $widgets(info-manpage) -expand yes -fill both -padx 4 -pady 4 set widgets(info-manpage-feedback) [iwidgets::feedback $win.html.fb \ -borderwidth 2] bind $widgets(info-manpage) {iw_load_manpage} $widgets(info) select "Example" # ---------------------------------------------------------------------- # "About" window # ---------------------------------------------------------------------- iwidgets::dialog .about -title {About: [incr Widgets] Demo} -modality none .about hide "Apply" .about hide "Help" .about hide "Cancel" .about buttonconfigure "OK" -command ".about deactivate" .about default "OK" set win [.about childsite] label $win.title -text {[incr Widgets]} pack $win.title catch {$win.title configure -font -*-helvetica-bold-o-normal-*-*-180-*} set file [file join $selfdir iwidgets.gif] label $win.icon -image [image create photo -file $file] pack $win.icon -side left label $win.by -text "Contributed By" pack $win.by catch {$win.by configure -font -*-helvetica-medium-r-normal-*-*-100-*} label $win.authors -text "Mark L. Ulferts Sue Yockey John Sigler Bill Scott Alfredo Jahn Tako Schotanus Kris Raney John Tucker Mitch Gorman John Reekie Ken Copeland Tony Parent Chad Smith and Michael McLennan " pack $win.authors catch {$win.authors configure -font -*-helvetica-medium-o-normal-*-*-120-*} # ---------------------------------------------------------------------- # Load up a list of demos... # ---------------------------------------------------------------------- foreach file [lsort [glob [file join $selfdir *]]] { set name [file tail $file] if {![file isdirectory $file] && ![string match *.* $name] && ![string match catalog $name] && ![string match scopedobject $name]} { if {$name == "mainwindow"} { # This demo is doesn't work well with the catalog # so we skip it. continue } $widgets(list) insert end $name } } $widgets(list) selection set 0 uplevel #0 [$widgets(list) cget -selectioncommand] iwidgets-4.1.0/demos/checkbox0000644003604700454610000000063307340260127014551 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: checkbox in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::checkbox .cb -labeltext Styles .cb add bold -text Bold .cb add italic -text Italic .cb add underline -text Underline .cb select underline pack .cb -padx 10 -pady 10 -fill both -expand yes iwidgets-4.1.0/demos/combobox0000644003604700454610000000076707340260135014602 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: combobox in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell iwidgets::combobox .cb -labeltext "Font:" -labelpos w -selectioncommand { puts "selected: [.cb getcurselection]" } .cb insert list end Ariel Courier Helvetica Knarly Lucida \ Rumpus Symbol Times "Zapf Dingbats" .cb selection set Times pack .cb iwidgets-4.1.0/demos/dateentry0000644003604700454610000000055307340260144014762 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: dateentry in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 proc returnCmd {} { puts [.de get] } iwidgets::dateentry .de -labeltext "Date:" -command returnCmd pack .de -fill x -expand yes -padx 10 -pady 10 iwidgets-4.1.0/demos/datefield0000644003604700454610000000061407375230203014703 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: datefield in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 proc returnCmd {} { puts [.df get] } iwidgets::datefield .df -labeltext "Date (International Format):" \ -command returnCmd -int 1 pack .df -fill x -expand yes -padx 10 -pady 10 iwidgets-4.1.0/demos/demo.html0000644003604700454610000000176307302304675014664 0ustar dgp771divDemo HTML Page
iwidgets logo

Display Your HTML Pages

Now you can write all of your documentation in HTML format! You can publish it on the World Wide Web, or bundle it with your tool and display it using a hyperhelp or scrolledhtml widget.


Most of the usual HTML tags are recognized and supported.
So you can include things like:

  • block quotes
  • bold
  • code
  • color images
  • definition lists
  • directory lists
  • italic
  • preformatted text
  • superscript
  • unordered lists
  • ...and much, much more!


Build it. Document it. Let us display it.

iwidgets-4.1.0/demos/dialog0000644003604700454610000000223507340260163014222 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: dialog in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::radiobox .rb -labelpos nw \ -labeltext "Use modality to\nlock up your\napplication:" pack .rb -padx 4 -pady 4 .rb add none -text "-modality none" .rb add application -text "-modality application" .rb add global -text "-modality global" .rb select none button .activate -text "Push Me" -command { .d configure -modality [.rb get] .d activate } pack .activate # # Build a generic dialog # iwidgets::dialog .d .d buttonconfigure OK -command { puts "pushed: OK" .d deactivate 1 } .d buttonconfigure Apply -command { puts "pushed: Apply" } .d buttonconfigure Cancel -command { puts "pushed: Cancel" .d deactivate 0 } .d buttonconfigure Help -command { puts "pushed: Help" } # # Add something to the top of the dialog... # set win [.d childsite] label $win.ex -text "Standard Dialog\n(put your widgets here)" \ -background black -foreground white \ -width 40 -height 5 pack $win.ex -expand yes -fill both -padx 4 -pady 4 iwidgets-4.1.0/demos/dialogshell0000644003604700454610000000171307340260172015252 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: dialogshell in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::radiobox .rb -labeltext "Use modality to\nlock up your\napplication:" pack .rb -padx 4 -pady 4 .rb add none -text "-modality none" .rb add application -text "-modality application" .rb add global -text "-modality global" .rb select none button .activate -text "Push Me" -command { .ds configure -modality [.rb get] .ds activate } pack .activate # # Build a generic dialog # iwidgets::dialogshell .ds .ds add dismiss -text "Dismiss" -command {.ds deactivate} .ds default dismiss # # Add something to the top of the dialog... # set win [.ds childsite] label $win.ex -text "Minimal Dialog\n(put your widgets here)" \ -background black -foreground white \ -width 40 -height 5 pack $win.ex -expand yes -fill both -padx 4 -pady 4 iwidgets-4.1.0/demos/disjointlistbox0000644003604700454610000000055207340260201016204 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: disjointlistbox in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::disjointlistbox .dlb pack .dlb -padx 10 -pady 10 -fill both -expand yes .dlb insertlhs {black white red blue yellow green magenta} iwidgets-4.1.0/demos/entryfield0000644003604700454610000000204107340260207015122 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: entryfield in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell . configure -background white iwidgets::entryfield .login -labeltext "Login:" -labelpos nw \ -command { focus [.passwd component entry] } pack .login -padx 4 -pady 4 iwidgets::entryfield .passwd -labeltext "Password:" -labelpos nw -show "\267" \ -command { focus [.phone component entry] } pack .passwd -padx 4 -pady 4 iwidgets::entryfield .phone -labeltext "Phone:" -labelpos nw \ -command { focus [.login component entry] } \ -validate {check_phonenum %W "%c"} pack .phone -padx 4 -pady 4 proc check_phonenum {entry char} { set current [$entry get] set len [string length $current] if {$len == 3 || $len == 7} { $entry delete 0 end $entry insert 0 "$current-" } if {$len < 12 && [string match {[0-9]} $char]} { return 1 } return 0 } iwidgets-4.1.0/demos/extbutton0000644003604700454610000000120507346163222015017 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: extbutton in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::extbutton .eb1 -text "Bitmap example" -bitmap info \ -background bisque -activeforeground red -bitmapforeground blue \ -defaultring 1 -command {puts "Bisque is beautiful"} iwidgets::extbutton .eb2 -text "Image example" -bd 3 -image \ [image create photo -file $iwidgets::library/demos/images/clear.gif] \ -font 9x15bold -background lightgreen -imagepos e \ -activebackground lightyellow pack .eb1 .eb2 -pady 8 iwidgets-4.1.0/demos/extfileselectionbox0000644003604700454610000000050607340260226017041 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: extfileselectionbox in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell iwidgets::extfileselectionbox .fsb -width 4i -height 4i pack .fsb iwidgets-4.1.0/demos/extfileselectiondialog0000644003604700454610000000071107340260235017506 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: extfileselectiondialog in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::extfileselectiondialog .efsd -modality application button .select -text "Files..." -command { if {[.efsd activate]} { puts "selected: [.efsd get]" } else { puts "" } } pack .select -side left iwidgets-4.1.0/demos/feedback0000644003604700454610000000076007340260336014512 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: feedback in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 . configure -background white iwidgets::feedback .fb -labeltext "Status " -steps 22 pack .fb -padx 4 -pady 4 button .go -text "Go" -command { .fb reset for {set i 0} {$i < 22} {incr i} { .fb step after 100 } } pack .go -padx 4 -pady 4 iwidgets-4.1.0/demos/fileselectionbox0000644003604700454610000000050007340260346016315 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: fileselectionbox in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell iwidgets::fileselectionbox .fsb -width 4i -height 4i pack .fsb iwidgets-4.1.0/demos/fileselectiondialog0000644003604700454610000000070007340260354016765 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: fileselectiondialog in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::fileselectiondialog .fsd -modality application button .select -text "Files..." -command { if {[.fsd activate]} { puts "selected: [.fsd get]" } else { puts "" } } pack .select -side left iwidgets-4.1.0/demos/finddialog0000644003604700454610000002277407340260363015077 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: finddialog in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 # # Demo script for the Finddialog class # proc find {} { if {! [winfo exists .findd]} { iwidgets::finddialog .findd -textwidget .st } .findd center .st .findd activate } iwidgets::scrolledtext .st -visibleitems 50x14 -wrap none pack .st button .findb -text "Press to Search Text" -command find pack .findb -pady 5 .st insert end " The Declaration of Independence (Adopted in Congress 4 July 1776) When, in the course of human events, it becomes necessary for one people to dissolve the political bonds which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the laws of nature and of nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation. We hold these truths to be self-evident, that all men are created equal, that they are endowed by their Creator with certain unalienable rights, that among these are life, liberty and the pursuit of happiness. That to secure these rights, governments are instituted among men, deriving their just powers form the consent of the governed. That whenever any form of government becomes destructive to these ends, it is the right of the people to alter or to abolish it, and to institute new government, laying its foundation on such principles and organizing its powers in such form, as to them shall seem most likely to effect their safety and happiness. Prudence, indeed, will dictate that governments long established should not be changed for light and transient causes; and accordingly all experience hath shown that mankind are more disposed to suffer, while evils are sufferable, than to right themselves by abolishing the forms to which they are accustomed. But when a long train of abuses and usurpations, pursuing invariably the same object evinces a design to reduce them under absolute despotism, it is their right, it is their duty, to throw off such government, and to provide new guards for their future security. --Such has been the patient sufferance of these colonies; and such is now the necessity which constrains them to alter their former systems of government. The history of the present King of Great Britain is a history of repeated injuries and usurpations, all having in direct object the establishment of an absolute tyranny over these states. To prove this, let facts be submitted to a candid world. He has refused his assent to laws, the most wholesome and necessary for the public good. He has forbidden his governors to pass laws of immediate and pressing importance, unless suspended in their operation till his assent should be obtained; and when so suspended, he has utterly neglected to attend to them. He has refused to pass other laws for the accommodation of large districts of people, unless those people would relinquish the right of representation in the legislature, a right inestimable to them and formidable to tyrants only. He has called together legislative bodies at places unusual, uncomfortable, and distant from the depository of their public records, for the sole purpose of fatiguing them into compliance with his measures. He has dissolved representative houses repeatedly, for opposing with manly firmness his invasions on the rights of the people. He has refused for a long time, after such dissolutions, to cause others to be elected; whereby the legislative powers, incapable of annihilation, have returned to the people at large for their exercise; the state remaining in the meantime exposed to all the dangers of invasion from without, and convulsions within. He has endeavored to prevent the population of these states; for that purpose obstructing the laws for naturalization of foreigners; refusing to pass others to encourage their migration hither, and raising the conditions of new appropriations of lands. He has obstructed the administration of justice, by refusing his assent to laws for establishing judiciary powers. He has made judges dependent on his will alone, for the tenure of their offices, and the amount and payment of their salaries. He has erected a multitude of new offices, and sent hither swarms of officers to harass our people, and eat out their substance. He has kept among us, in times of peace, standing armies without the consent of our legislature. He has affected to render the military independent of and superior to civil power. He has combined with others to subject us to a jurisdiction foreign to our constitution, and unacknowledged by our laws; giving his assent to their acts of pretended legislation: For quartering large bodies of armed troops among us: For protecting them, by mock trial, from punishment for any murders which they should commit on the inhabitants of these states: For cutting off our trade with all parts of the world: For imposing taxes on us without our consent: For depriving us in many cases, of the benefits of trial by jury: For transporting us beyond seas to be tried for pretended offenses: For abolishing the free system of English laws in a neighboring province, establishing therein an arbitrary government, and enlarging its boundaries so as to render it at once an example and fit instrument for introducing the same absolute rule in these colonies: For taking away our charters, abolishing our most valuable laws, and altering fundamentally the forms of our governments: For suspending our own legislatures, and declaring themselves invested with power to legislate for us in all cases whatsoever. He has abdicated government here, by declaring us out of his protection and waging war against us. He has plundered our seas, ravaged our coasts, burned our towns, and destroyed the lives of our people. He is at this time transporting large armies of foreign mercenaries to complete the works of death, desolation and tyranny, already begun with circumstances of cruelty and perfidy scarcely paralleled in the most barbarous ages, and totally unworthy the head of a civilized nation. He has constrained our fellow citizens taken captive on the high seas to bear arms against their country, to become the executioners of their friends and brethren, or to fall themselves by their hands. He has excited domestic insurrections amongst us, and has endeavored to bring on the inhabitants of our frontiers, the merciless Indian savages, whose known rule of warfare, is undistinguished destruction of all ages, sexes and conditions. In every stage of these oppressions we have petitioned for redress in the most humble terms: our repeated petitions have been answered only by repeated injury. A prince, whose character is thus marked by every act which may define a tyrant, is unfit to be the ruler of a free people. Nor have we been wanting in attention to our British brethren. We have warned them from time to time of attempts by their legislature to extend an unwarrantable jurisdiction over us. We have reminded them of the circumstances of our emigration and settlement here. We have appealed to their native justice and magnanimity, and we have conjured them by the ties of our common kindred to disavow these usurpations, which, would inevitably interrupt our connections and correspondence. We must, therefore, acquiesce in the necessity, which denounces our separation, and hold them, as we hold the rest of mankind, enemies in war, in peace friends. We, therefore, the representatives of the United States of America, in General Congress, assembled, appealing to the Supreme Judge of the world for the rectitude of our intentions, do, in the name, and by the authority of the good people of these colonies, solemnly publish and declare, that these united colonies are, and of right ought to be free and independent states; that they are absolved from all allegiance to the British Crown, and that all political connection between them and the state of Great Britain, is and ought to be totally dissolved; and that as free and independent states, they have full power to levy war, conclude peace, contract alliances, establish commerce, and to do all other acts and things which independent states may of right do. And for the support of this declaration, with a firm reliance on the protection of Divine Providence, we mutually pledge to each other our lives, our fortunes and our sacred honor. New Hampshire: Josiah Bartlett, William Whipple, Matthew Thornton Massachusetts: John Hancock, Samual Adams, John Adams, Robert Treat Paine, Elbridge Gerry Rhode Island: Stephen Hopkins, William Ellery Connecticut: Roger Sherman, Samuel Huntington, William Williams, Oliver Wolcott New York: William Floyd, Philip Livingston, Francis Lewis, Lewis Morris New Jersey: Richard Stockton, John Witherspoon, Francis Hopkinson, John Hart, Abraham Clark Pennsylvania: Robert Morris, Benjamin Rush, Benjamin Franklin, John Morton, George Clymer, James Smith, George Taylor, James Wilson, George Ross Delaware: Caesar Rodney, George Read, Thomas McKean Maryland: Samuel Chase, William Paca, Thomas Stone, Charles Carroll of Carrollton Virginia: George Wythe, Richard Henry Lee, Thomas Jefferson, Benjamin Harrison, Thomas Nelson, Jr., Francis Lightfoot Lee, Carter Braxton North Carolina: William Hooper, Joseph Hewes, John Penn South Carolina: Edward Rutledge, Thomas Heyward, Jr., Thomas Lynch, Jr., Arthur Middleton Georgia: Button Gwinnett, Lyman Hall, George Walton " iwidgets-4.1.0/demos/hierarchy0000644003604700454610000001152707340260371014746 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: hierarchy in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 # This demo displays a users file system starting at thier HOME # directory. You can change the starting directory by setting the # environment variable SHOWDIR. # if {![info exists env(SHOWDIR)]} { set env(SHOWDIR) $env(HOME) } # ---------------------------------------------------------------------- # PROC: get_files file # # Used as the -querycommand for the hierarchy viewer. Returns the # list of files under a particular directory. If the file is "", # then the SHOWDIR is used as the directory. Otherwise, the node itself # is treated as a directory. The procedure returns a unique id and # the text to be displayed for each file. The unique id is the complete # path name and the text is the file name. # ---------------------------------------------------------------------- proc get_files {file} { global env if {$file == ""} { set dir $env(SHOWDIR) } else { set dir $file } if {[catch {cd $dir}] != 0} { return "" } set rlist "" foreach file [lsort [glob -nocomplain *]] { lappend rlist [list [file join $dir $file] $file] } return $rlist } # ---------------------------------------------------------------------- # PROC: select_node tags status # # Select/Deselect the node given the tags and current selection status. # The unique id which is the complete file path name is mixed in with # all the tags for the node. So, we'll find it by searching for our # SHOWDIR and then doing the selection or deselection. # ---------------------------------------------------------------------- proc select_node {tags status} { global env set uid [lindex $tags [lsearch -regexp $tags $env(SHOWDIR)]] if {$status} { .h selection remove $uid } else { .h selection add $uid } } # ---------------------------------------------------------------------- # PROC: expand_node tags # # Expand the node given the tags. The unique id which is the complete # file path name is mixed in with all the tags for the node. So, we'll # find it by searching for our SHOWDIR and then doing the expansion. # ---------------------------------------------------------------------- proc expand_node {tags} { global env set uid [lindex $tags [lsearch -regexp $tags $env(SHOWDIR)]] .h expand $uid } # ---------------------------------------------------------------------- # PROC: collapse_node tags # # Collapse the node given the tags. The unique id which is the complete # file path name is mixed in with all the tags for the node. So, we'll # find it by searching for our SHOWDIR and then doing the collapse. # ---------------------------------------------------------------------- proc collapse_node {tags} { global env set uid [lindex $tags [lsearch -regexp $tags $env(SHOWDIR)]] .h collapse $uid } # ---------------------------------------------------------------------- # PROC: expand_recursive # # Recursively expand all the file nodes in the hierarchy. # ---------------------------------------------------------------------- proc expand_recursive {node} { set files [get_files $node] foreach tagset $files { set uid [lindex $tagset 0] .h expand $uid if {[get_files $uid] != {}} { expand_recursive $uid } } } # ---------------------------------------------------------------------- # PROC: expand_all # # Expand all the file nodes in the hierarchy. # ---------------------------------------------------------------------- proc expand_all {} { expand_recursive "" } # ---------------------------------------------------------------------- # PROC: collapse_all # # Collapse all the nodes in the hierarchy. # ---------------------------------------------------------------------- proc collapse_all {} { .h configure -querycommand "get_files %n" } # # Create the hierarchy mega-widget, adding commands to both the item # and background popup menus. # iwidgets::hierarchy .h -querycommand "get_files %n" -visibleitems 30x15 \ -labeltext $env(SHOWDIR) -selectcommand "select_node %n %s" pack .h -side left -expand yes -fill both .h component itemMenu add command -label "Select" \ -command {select_node [.h current] 0} .h component itemMenu add command -label "Deselect" \ -command {select_node [.h current] 1} .h component itemMenu add separator .h component itemMenu add command -label "Expand" \ -command {expand_node [.h current]} .h component itemMenu add command -label "Collapse" \ -command {collapse_node [.h current]} .h component bgMenu add command -label "Expand All" -command expand_all .h component bgMenu add command -label "Collapse All" -command collapse_all .h component bgMenu add command -label "Clear Selections" \ -command {.h selection clear} iwidgets-4.1.0/demos/hyperhelp0000644003604700454610000000076207340260377014775 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: hyperhelp in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell button .push -text "Help..." -command { set win [iwidgets::hyperhelp .#auto -title "Hyperhelp demo" -modality none \ -topics {demo} -helpdir [file join ${iwidgets::library} demos]] $win showtopic demo $win activate } pack .push iwidgets-4.1.0/demos/iwidgets.gif0000644003604700454610000001705706577264041015370 0ustar dgp771divGIF87an÷ÿÿÿ÷÷÷ïïïçççßßß×××ÏÏÏÇÇǾ¾¾¶¶¶®®®¦¦¦žžž–––ŽŽŽ†††yyyqqqiiiaaaYYYQQQIIIAAA888000((( ( YAAA((ÿÿA0ÿiYÿ(aIA÷QÿQŽyq†qiiYQaQIÏQÿQyiaŽiYiI8aA0ßY®AqaYQA8ïi ÿiÇQ¦AŽqaiQAﮆÿa†iYÏ–içŽIßiqQ8iI0aA(׎Qç–Qï†0×i®†a¾Žaמi–iIÏ–a–a8¶q8×q iYIqYAI8(ß–QφAçŽ8¶®¦yqiqiaqaQyaI¦†aצqiQ8aI0YA(¶†Qç¦a®yI8(ÿ–(÷Ž ßyï†ÿŽ( çŽ(ç†ÿŽaQ8žyI–qAçŽqaI¦y8÷®0÷¾Qÿ¦ž–†®qIA0ç®(צ Ï–ÿÏQ÷ÇIï¾AÿÇ0Ïžߦß®(ÿ¾×¶ ÷×(ïÏ ß¾÷×ßÇ(÷ß(¾¶aÿ÷Aÿ÷ ççßÇǾ®®¦yyqÏÏ¶ŽŽyÿÿ×00((( ¶¶Ž––iÿÿ¶QQ8ÿÿ¦ïïŽÿÿ–aa8ÿÿq††8÷÷YççQ00ÿÿ8ÿÿIQ y†a¦¾yqŽQŽž†–¦–yŽyiyiYqYaŽi8YQ8ŽyQ†yiž–aϾ–ÏÇ–×ÏyÏÇiǾ ia0ž–Y÷ï ¦žž––Žßçç×ßß¶¾¾¾ÇDz²²¦®®ž¦¦¾ÏϦ¶¶QYY×ïï–¦¦ßÿÿ–®®†žž¾ççi††Çÿÿ¦××¶ÿÿy¶¶–ßßi¦¦†ÏÏYŽŽžÿÿY––†ïïAyy†ÿÿqßß AAAŽŽQ¶¶0qqQÇÇ0yyaÿÿA®®YÿÿIÿÿ(ÿÿaaÿÿÿÿ(AIy†–,nþH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£ÇŠ |I’¡€SžJª\) åFVÊ)`ÀHŽfêÜØ²@Xªìzq@T#Êt¢€£ hJõ¡bŽ©B ´ªW… `ë«Ùƒ8°ÌA׳p<õ95nÜšxk×lË–}í¦ l—á¸Î 58ìw¬+Æ^ŸBhTH$d¦5tR¥Ê˜—I(À쎪Fø”šäÓ¥8C²<°%$­?  $ÍÑéR´0é¤Ü €à ^#U|öÖöyJƒ‡ T#/ Ô8þ—ZZ›ÀW˜h{BEQ+ÓH,¶%“¨²ž{r °G#a€×È# &ÐS (ƒE#w HPMĨÒ p'z ’ªAIp6À "‹€†æ™¦@hàgŒ@Q" ²…Áа܈#6"ä¡1…àHk\¢ÚS @Âc}¥h¡APÀ=–2IBÊñÇ"h'Ø^ˆ€Q0@ÇŽˆp€@]¶€ÔGÇ–À ˜œY!dr‚%ÐÀtf(Fy&"$0æ_`Ù#¦Î@6€y òdmŽN0ÊŽ’ZcþQÐ %\7Pƒ¥Ò‰H"ÏX—~@€ÈoQ)ÔBµ!À@3;†ñÅ20šð€®€8p€t‡ @Â*P$`Ic ¢<g¢G€”R@­×µôE¯Y ,P€¯g€°ô ɦyÈÀŸ¬qf")pÉ% LÀ‡u 2G^ èÑD%H ò€%Fê!…, 0i`“üà®z8b <@A-uèˆKˆÄ)A!’ÀXr³»€Ð""vDpÁÌ}=•GÐBkçƒ,ÁHë¡À%7 öÇzܡŠóÜtëAÇ3ö*þ$s3ñ-w àꢂ ¡ `0÷!@PDÝ”×1ÁÁ¶ö8K¡@1>¥€%–DÑ9΀˜Nùê8³±Æ‹ë…aðÁ"Ezt´’4€A¸ã<îÄÁG4C5ÔXpŒ5,‹!àÅìU%ðbœàÎDÃq÷ÅÁ®4ðqDÁC)wÜrK3·ÄÂMÚ€„ðª®nö·µPG%˜Eý8€*È& º `Ðtx@ˆ1[Z†Í 0¬O …  R iv[SsPCqVÌòS͉%câG¢0(€±UQNï&ÐUxA,à ` ƒg÷À@/~ñŒ¨¤XÀA id#²Ø3ï ®¯®cx v³ˆØÀ(Nq Æ¡Žh— KÙÀAöé€X#<˜À2p0‘pQ¬5Ûjƒ3X )†A lphÀæ¨Å,¤Á ]XY»Àò5¶|nðb‘Íx¤auðàÈü þŒà—^v0"> ÎÜŒ9êbÔ…Æ1t‘ ]d£êð† ËQŽ^ôB¼àÅ6°Ñ kT¸ÀŽÁ‹^¤`ÀM€Âਙ–˜ xàcPÂʼÐE9~Ž_ãÁø…:ÔAoüBÐÞÐ."\`cÙÈÆ@’a Ocåð Îö…7ÄÁÕ¥å~>8€ƒÕÂpÇ0†[ÿ9À[¸ñƒG<â Jûøà €csã0ÁyÒg ¬UÅCÊàÁ Tð‰aXàh)Du«‰¦ÔÅ¢¯c4  lÀ1ÂQ‹Ì€ ØCþ´@ 7¥% Œ N°ƒq C àB( {æßi@ß,.HÀµ¨Æ4 h&C¸G¢à€háÒ½S´W¢0eLÌ'8ÜQ „oà™ƒ“#ÈéýÉQîu¯dW.ü±Í[Ì`F7Ž`‰( H€Ì¦Îx!?ÃHa€ƒÞ¢D¼âÓÎx²Ïû»XtÑ¥ñ€gH#Ø<˜Ae`˜¼)Ê!ÀxPdàg8Ë%ö½¾Ùƒ\¸@6@Ð xöHF¶¡‹jhãÓȆ5º±‹^œ/0À¾øÎ’ òÀ@Žv„¸ÃZP€*þЀ! -jßh"T û¿¶8>°1œ¹×:r‹S¦¤Å<§Œ#€U@o}5ÑÚÁú´¢$ »0 ±@Y$@ÀcšVñb4á!  ?GÔ “uàž4nA€ñWR%–ÀL h <ÀÈp0*ø”¡6;U<Õ!@6€ JPM>‘q€qÈ` Ù0 <0ƒ`p¤p˜Ì÷Õ4* `sð%@þgŒ3\‚Ôd` 0Ÿ Ö` Exñ s„ ]xU±—p þqUc†hhlxîp ŸLèWÑÍ   {$À›¤5âW;hÎÒ‰¨R¢s†WH8€ à…–X€JÌ´‡ò@-0$ËwUN¸-a‚âƨ à3²g4pæ€ É0ÆxÉô¢Ï`eÛ@p¨Íø…r1 С°Œ>hŒj±`s0à ¾@o16 €  ºà G@Žåh㤠Œ æ(†å¨Ï÷Ep°¿ðרQÉe P_GžH 6=@Ð}„ˆŠ@¡ ‰Py¡ þ,“â& äÐ3`ŠÇx+>cµÈ ÖP /Ð ¤ FI + p‚;y5Ñ;Ï   /“Xp ß PÂpvx” ¡%G–@ p ”{ð¬÷ ÖpBÐ °¥p ™°xM‰éB ‹  ÷Ñh1)p °NŒ) µøIŒ·{%™‰™ôÆÀ¸1Ç0$ÃqP}ÙEÏÈ ª°zQ B1‰Ô€ Îo`Ë` Ôp™ÃÀÊo>d‡v À{Ç ž`͈¢¥Oyqª z1Ä` ކÜÑŒ06@þ‚# € êpZ ÃñPM8Éx—· r!Í€ðÁ°Ë0*ë¤ ¦Ð €1Ä`Gð ¹@ µÀu‡Gô66"ôG‘ ÈxÇ b“ cJ‚ › £‚”ðþ‰W%  a°  T p Ö0 Óp Õ°eÄ` Ç DÔ– B`wd—'rZ*5N pƒ~9#¯òEª€½ÈDÏ1‘¢ÐBX€>AÓ@›Ìp Ëð|ÇpÄ0 0 Å`£Ó° °_Ð À —@W•[]iÚÄ€ˆ”' ÀÊ þZÀ‰  ¡p¢×P °¥x.ð9Ä€[´‰ €H±LSÅ0y¹¨Ê~i€dÔwÐ rÁLÀƒ  ɰªà&¡RBB: §Xt‘[Š[ºÚ™P°Ø°Ž@¢²zÒ œ!HµÊ„À}•«F'ÄúŸÁ„ ä  akµŽp …À )«€œÓJ€ ¤¹$ßâ„>Áw{Z‰ÐeÚ0Ͱ‚DëÄ ”§Á®ëª €_P¶õ*B‘\+2Bñ PÎâ@ óРPÍÀþX±ð ϱˆpˆp_†Ášcxp¹ú±ráŽC‹‚Ð`€(¨*u à0óà)›…@–p[·N¯6ÛŸÒ À ‚¯úõ0Yá x´cȧРi5GÛ¢Ьd2Ð óð´ ²@~[~¸e É,ºB'{0,ŠÊ^‰d m02)xWA sK¹£R.*0B û‚¢Ãa²y µ€ <„Ê d +S#<ªÉ³òz†ã·Ä0 j»/µkµ‹[yỜt‘% 0ð´Q‹ 7LpšæKs3ÀSý;&4CØ[M D~Üð›]z¾ê[#Ê·¾GÁÊÇ4jÉ4Ô…ÜÐ €VÍзPBh-+189pN‡ES“° %<ãP hë|ÛeLÁ0›ÃšÚÃ>ŒÌb·+ÐÐ 5–ÂpƒR‡.Œ»^E^@`B 3Ò­Û;À×W«–pÌÃ?\¦›ÚÃð&¦ ÐÐÆp×Ý ]l £Ë8%‡±éýþp€SÀ¾õM 5šJPj11ñNÇ€hÜÃ<šÇ°4µ ð–•@É…;¦wÌ qìÆÎÀ € 6`õEŠ;}LT0 ª0 aÐG0æ5$0ŸËÈÕ@¦¬{ ` ™ª© ° • G` Ÿ¬wLd pC ãâÜìžnìÆpë ê€áàØ€Röõ-´3_Y…° G0Ï8pY pÈ5ÌŒ, üÅ Æ0.Û<Í•À Ü|GÞ™ Ñ<–1ZGË„œßüÍÝ€€¡Ú5¦Îù1Mpº¹'P£pVp4pþŽ( Là¾u»Å ÐÅÓ üQG Í{åIôV  ôIó6™ô&™DÝNñòÍÕ Õà cJ @Œ†¬ /03ð$0U`ÒcpF舳/ŠüŸŒ # ƒµœxv@͉íÔÖí4×tÍ `׎d×1á P»ÕP é ¸ÀÇ`Æ€5¡ç,600FhVðGp fÈÀ4šÆÏÔº“ wmס}סíH  OyÚªÝ}ñ‚¦ÊgÓð ° cL $¡eˆ€ Pñ€@º80 3˜½­ ‘¢C8˜ª×út\úþÔ}Ð}րՀșÎÀ4÷   Ó –мHÊ!x´;uD~k@4 ]¨“ÉŠqBÀÕŠJÖ-ÝÖíßPݨ4à.Ö>$ý„™ØÚ€ Æ` ûýP0ŒÃpƒ ö98.ø(0,‡ÈÍîXÀ]ªÕýžâŽâŽp·âÏÎôZǰÇp ¹ ߀ÐÀËŠ¹å»d ÚÑ G0LYÖ¹mŒ0:ôÛŒ+ÖÇæIå2^åÌAV¤cž˜08ƒ£=kÌDÞ ˰Æ P ûʯhÀéHÉ€!·«‹|§cƒþp Pdµ2ÌÑå¤c Þå‚nž.è‚– ã,ËlÍp¢dp'|ÁÈà'ånŸ `!ðV`3pF7€ç1óv àò½äItîL‹Þ赾莾ëºÞèÀ7½{õµÌ `¸]¦Z°88¥žÒ!pcG€V°h°ípªþŸí„]]ê&²0,ã–2Îîôfí>c#GôîAÄRŸ­x¦´Xt)€3@U@î9Ô~gÐ"°í"ð´Ê›Ý]ÈÉärM8 ßGðê2~âPÀÕ pDönþï$GpDB&GóîFê† @×¢$™M_Ýg íh°#à'›² p~ËŒ\à·ÀŒ£ƒ³$êF0Ïò>. ÝæY°~È@òèvòé–D4 ~; äç£mÚ°½fˆäcÐí°åŠÎëêžë».f2ƒç”ó<V0GŽG×wíäfîÆOÑ1cÿAÍ p0 Ê£< ù“?ù 'H§­ÝÖÂ` wõ!@V „Šnž°'nŸ§Ý}vMozWŠ»Z\04 qoÚ  Ö¬©ëÔDôÈÜ0 ;Å0.Œ?ùOޝü`öÊþÃpð-öéß»È\`ׄ¿ &}ƒym™p#œúÀ¸¹Y Í0Ï`à §wçë«Á3–Ð Àç0 G›Ô*%8–?µSÛ !¡Y…fÍ& lv@@ xÀaBƒÉH¨`AÓ¼yVŽÌ€`À@%  ¥–xù2ÀL5èCƒ†$8P`%K˜5 @Ð`‚† 8Œ£†­®iÐbM @V3 ¸ìêu‚† àÚЬ‚8˜ ¶G+FŒpI@tæ^š5ýòí+€€ }¬Ð8r„Æ„= Rú… @ðKÍ0``ÚTƒ¹ ¸teþ«vͪ_ÄšP!î,Õ `` ¶(ž¼™€„¼Tð°Áb óü7°\2ÌÛ !D#Šg8XP 9€ô¬pC 4ç ZÛg`×Ü[…‰ Ù+ &¸0 A¹ ¶`&ÁP€,À,ÁƒÁ¸ã"›0L‹ £ 2Ø@„2@A1fx`ÈTrk7KÊ(9p º $ÀF`ÒIÇ=È(`I¸FœþPà5ÈX"€’Bð æqð#P@`Âí#™¸K‚çò@„3úH¬ ŠS€¥Ú2VLÍ‚ 2Ðþ@8òƒ ¼áåF¯©f4h¶Ù`‚Št)9•Hñx« Ê f¸Ë€½(̯5`(AÞ"ðr‚ À<à CÁd` ¤H`«Å .à`ƒ  ì`sÀ!'lzÑE—oÌ áŒÜî%– €µ" ñY¥­ö Ìá"èÖã–:v5Xè4ÁÞ,±Ä¡(ÈÀƒ<(51tòzJ—Ijëèß X@¡¢€þK2ˆ¥õ2ë¹ú˜ šuúi¿ÔäñÕ©™,9ñi'ø—#Þ=#1Éi¨‡VXºj¦IxŒîíZ‚VY›i¡03ÂÀýcq(ªËõtítOFXÎàà}—L)ušÁ ãCÀDwIiÅÐéˆw;èÀѰé–àQ\X§6ð@Ð¥6Ý˵Ă *ÀÀƒŠßµ¢^ÉǸ€yÀXúÄúa .€À²4§õ%9#ŠÇþ¸'Œ‹jeAŸ£Jæ4€!ØÀ<`…1XÁdlƒ*Ì 1gðÀÿ¼Ò .ÜfnGÂÞ ¯”À㨄{ð^V }QÍ‚)—yà TAzX»5“lÁò‚ä„5õ¦ 0Àbç1**@z±L¶Ç=áÐp´[@ín'!ºŠ›““¬À‰±B©2>€U h Pd8¸M@ cQ:FÆîàU² JµKdGŽ/A‚`B#ôÁ óÀ0D .@jAÐ%íG!0ZÉ~ŠôX[B`„3ˆ `À0·£,À%¤ÁPþ¸ 8„dÀ’Ñ@œ„%WYå+™©U cpƒ.`‰Ï( Ъ`Ä#ˆaW3’b;háºL¥*£9: MsÑTI Ž`… ` kp€bPž áBCÂ*(01VÍyVT&öì¢Ã,¤€0Óx([b°‰†^ ˆa•@ xÅ¢ól%Ç^Z@ÑC BP*÷]ÀÒ%JHgÊs¦ÅhF›e!0`î›Ç­>áª:ДɤãH†rÔ—ÆÔ•/-Í(°> ÈâQåB&;éX¡<“«o]bRév”¦öd²`2Uú/P¶:&÷„k`áZSÝ$Ó”t„(I†¢TÁ66°**QÒŠ:Ö²—- Q/Û¬€;iwidgets-4.1.0/demos/labeledframe0000644003604700454610000000230707340260414015365 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: labeledframe in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 set tk_strictMotif 1 iwidgets::Labeledframe .pr -labelpos ne -labeltext "Print range" set cs [.pr childsite] radiobutton $cs.all \ -highlightthickness 0 \ -anchor w \ -justify left \ -text "All" \ -underline 0 \ -value 1 radiobutton $cs.range \ -highlightthickness 0 \ -anchor w \ -justify left \ -text "Pages" \ -underline 2 \ -value 0 iwidgets::entryfield $cs.from \ -highlightthickness 0 \ -labelpos w \ -labeltext "from:" \ -width 10 [$cs.from component label] configure -justify left -underline 0 iwidgets::entryfield $cs.to \ -highlightthickness 0 \ -labelpos w \ -labeltext "to:" \ -width 10 [$cs.to component label] configure -justify left -underline 0 pack $cs.all -side top -fill x -anchor w pack $cs.range -side left -fill x -anchor w pack $cs.from -side left -fill x -anchor w pack $cs.to -side left -fill x -anchor w pack .pr -fill both iwidgets-4.1.0/demos/labeledwidget0000644003604700454610000000127007340260405015554 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: labeledwidget in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 . configure -background white iwidgets::labeledwidget .lw -labeltext "Label Text:" pack .lw -padx 4 -pady 4 set win [.lw childsite] label $win.ex -text "(put your widgets here)" \ -background black -foreground white \ -width 30 -height 3 pack $win.ex -expand yes -fill both -padx 4 -pady 4 iwidgets::optionmenu .pos -labeltext "Position:" -command { .lw configure -labelpos [.pos get] } pack .pos -padx 4 -pady 4 .pos insert end e n ne nw s se sw w .pos select w iwidgets-4.1.0/demos/mainwindow0000644003604700454610000001222607340260422015136 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: mainwindow in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 wm withdraw . iwidgets::mainwindow .mw set imagedir [file join ${iwidgets::library} demos images] # # Add a File menubutton # .mw menubar add menubutton file -text "File" -underline 0 -padx 8 -pady 2 \ -menu {options -tearoff no command new -label "New" -underline 0 \ -helpstr "Create a new file" command open -label "Open ..." -underline 0 \ -helpstr "Open an existing file" command save -label "Save" -underline 0 \ -helpstr "Save the current file" command saveas -label "Save As ..." -underline 5 \ -helpstr "Save the file as a differnet name" command print -label "Print" -underline 0 \ -helpstr "Print the file" separator sep1 command close -label "Close" -underline 0 \ -helpstr "Close the file" separator sep2 command exit -label "Exit" -underline 1 \ -helpstr "Exit this application" } # # Add the Edit menubutton. # .mw menubar add menubutton edit -text "Edit" -underline 0 -padx 8 -pady 2 \ -menu {options -tearoff no command cut -label "Cut" -underline 2 \ -helpstr "Cut the selection into the clipboard" command copy -label "Copy" -underline 0 \ -helpstr "Copy the selection to the clipboard" command paste -label "Paste" -underline 0 \ -helpstr "Paste the clipboard to the current point" separator sep3 command find -label "Find" -underline 2 \ -helpstr "Search the text" separator sep4 command clear -label "Clear" -underline 2 \ -helpstr "Clear the selection" } # # Add the Help menubutton. # .mw menubar add menubutton help -text "Help" -underline 0 -padx 8 -pady 2 \ -menu {options -tearoff no command onwindow -label "On Window" -underline 3 \ -helpstr "Obtain help on the window" command onkeys -label "On Keys" -underline 3 \ -helpstr "Obtain help on the keys" command index -label "Index" -underline 0 \ -helpstr "View the help index" command onhelp -label "On Help" -underline 2 \ -helpstr "Obtain help on help" command onversion -label "On Version" -underline 2 \ -helpstr "View the version information" } # # Add items to the toolbar. # .mw toolbar add frame filler1 -width 108 -relief raised -borderwidth 2 .mw toolbar add button new \ -image [image create photo -file [file join $imagedir new.gif]] \ -helpstr "Create a new file" \ -balloonstr "New" .mw toolbar add button open \ -image [image create photo -file [file join $imagedir open.gif]] \ -helpstr "Open an existing file" \ -balloonstr "Open" .mw toolbar add button close \ -image [image create photo -file [file join $imagedir close.gif]] \ -helpstr "Close the file" \ -balloonstr "Close" .mw toolbar add frame filler2 -width 20 -relief raised -borderwidth 2 .mw toolbar add button cut \ -image [image create photo -file [file join $imagedir cut.gif]] \ -helpstr "Cut the selection into the cut buffer" \ -balloonstr "Cut" .mw toolbar add button copy \ -image [image create photo -file [file join $imagedir copy.gif]] \ -helpstr "Copy the selection to the cut buffer" \ -balloonstr "Copy" .mw toolbar add button paste \ -image [image create photo -file [file join $imagedir paste.gif]] \ -helpstr "Paste the cut buffer to the current point" \ -balloonstr "Paste" .mw toolbar add button clear \ -image [image create photo -file [file join $imagedir clear.gif]] \ -helpstr "Clear the selection" \ -balloonstr "Clear" .mw toolbar add frame filler3 -relief raised -borderwidth 2 # # Add items to the menubar. # .mw mousebar add button save \ -image [image create photo -file [file join $imagedir save.gif]] \ -helpstr "Save the current file" .mw mousebar add button print \ -image [image create photo -file [file join $imagedir print.gif]] \ -helpstr "Print the file" .mw mousebar add button find \ -image [image create photo -file [file join $imagedir find.gif]] \ -helpstr "Search the text" .mw mousebar add frame filler1 -height 20 -relief raised -borderwidth 2 .mw mousebar add button help \ -image [image create photo -file [file join $imagedir help.gif]] \ -helpstr "Obtain help for this window" .mw mousebar add frame filler2 -relief raised -borderwidth 2 .mw mousebar add button exit \ -image [image create photo -file [file join $imagedir exit.gif]] \ -helpstr "Exit this application" .mw mousebar add frame filler3 -height 5 # # Change the packing of the last fillers in the tool and mouse bar # so that it expands across and down the rest of the mainwindow. # pack [.mw toolbar component filler3] -expand yes -fill both pack [.mw mousebar component filler2] -expand yes -fill both # # Install a scrolledtext widget in the childsite. # iwidgets::scrolledtext [.mw childsite].st -visibleitems 40x8 pack [.mw childsite].st -fill both -expand yes # # Activate the main window. # .mw activate iwidgets-4.1.0/demos/menubar0000644003604700454610000000467207340260430014420 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: menubar in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::menubar .mb -helpvariable helpVar -menubuttons { menubutton file -text "File" -menu { options -tearoff false command new -label "New" \ -helpstr "Open new document" \ -command {puts "selected: New"} command close -label "Close" \ -helpstr "Close current document" \ -command {puts "selected: Close"} separator sep1 command exit -label "Exit" -command {exit} \ -helpstr "Exit application" } menubutton edit -text "Edit" -menu { options -tearoff false command undo -label "Undo" -underline 0 \ -helpstr "Undo last command" \ -command {puts "selected: Undo"} separator sep2 command cut -label "Cut" -underline 1 \ -helpstr "Cut selection to clipboard" \ -command {puts CUT} command copy -label "Copy" -underline 1 \ -helpstr "Copy selection to clipboard" \ -command {puts "selected: Copy"} command paste -label "Paste" -underline 0 \ -helpstr "Paste clipboard contents into document" \ -command {puts "selected: Paste"} } menubutton options -text "Options" -menu { options -tearoff false -selectcolor blue radiobutton byName -variable viewMode \ -value NAME -label "by Name" \ -helpstr "View files by name order" \ -command {puts "selected: by Name"} radiobutton byDate -variable viewMode \ -value DATE -label "by Date" \ -helpstr "View files by date order" \ -command {puts "selected: by Date"} cascade prefs -label "Preferences" -menu { command colors -label Colors... \ -helpstr "Change text colors" \ -command {puts "selected: Colors..."} command fonts -label "Fonts..." \ -helpstr "Change text font" \ -command {puts "selected: Fonts..."} } } } pack .mb -fill x frame .fr -width 200 -height 200 -background white pack .fr -fill both label .help -anchor w -textvariable helpVar -width 40 pack .help -fill x iwidgets-4.1.0/demos/messagebox0000644003604700454610000000207507340260437015126 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: messagebox in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 . configure -background white iwidgets::messagebox .mb -hscrollmode dynamic -labeltext "Messages" \ -labelpos n -visibleitems 50x8 pack .mb -padx 5 -pady 5 -fill both -expand yes .mb type add ERROR -background red -foreground white -bell 1 .mb type add WARNING -background yellow -foreground black .mb type add INFO -background white -foreground black frame .cntls -background white pack .cntls -padx 5 -pady 5 -fill x button .cntls.error -text "Error" -command { .mb issue "This is an error message in red with a beep" ERROR } pack .cntls.error -side left -expand yes button .cntls.warning -text "Warning" -command { .mb issue "This warning message in yellow" WARNING } pack .cntls.warning -side left -expand yes button .cntls.info -text "Info" -command { .mb issue "This is an informational message" INFO } pack .cntls.info -side left -expand yes iwidgets-4.1.0/demos/messagedialog0000644003604700454610000000110207340260446015563 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: messagedialog in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 button .b -text "Confirm..." -command { if {[.md activate]} { puts "selected: Yes" } else { puts "selected: No" } } pack .b iwidgets::messagedialog .md -title "Message Dialog" -modality application \ -bitmap questhead -text "Are you sure?" .md hide Help .md buttonconfigure OK -text "Yes" .md buttonconfigure Cancel -text "No" iwidgets-4.1.0/demos/notebook0000644003604700454610000000413507340260454014607 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: notebook in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell option add *Scale.width 8 . configure -background white iwidgets::optionmenu .pages -labeltext "Page:" -command { .nb view [.pages get] } pack .pages -padx 4 -pady 4 .pages insert end "Personal Info" "Favorite Color" "Blank Page" iwidgets::notebook .nb -width 3i -height 2.6i pack .nb -padx 4 -pady 4 # Page #1 # ---------------------------------------------------------------------- set page [.nb add -label "Personal Info"] iwidgets::entryfield $page.name -labeltext "Name:" -labelpos nw pack $page.name iwidgets::entryfield $page.addr -labeltext "Address:" -labelpos nw pack $page.addr iwidgets::entryfield $page.addr2 -labeltext "City, State:" -labelpos nw pack $page.addr2 iwidgets::entryfield $page.email -labeltext "E-mail:" -labelpos nw pack $page.email # Page #2 # ---------------------------------------------------------------------- set page [.nb add -label "Favorite Color"] frame $page.sample -width 20 -height 20 \ -borderwidth 2 -relief raised pack $page.sample -fill both -pady 4 scale $page.r -label "Red" -orient horizontal \ -from 0 -to 255 -command "set_color $page" pack $page.r -fill x scale $page.g -label "Green" -orient horizontal \ -from 0 -to 255 -command "set_color $page" pack $page.g -fill x scale $page.b -label "Blue" -orient horizontal \ -from 0 -to 255 -command "set_color $page" pack $page.b -fill x proc set_color {page {val 0}} { set r [$page.r get] set g [$page.g get] set b [$page.b get] set color [format "#%.2x%.2x%.2x" $r $g $b] $page.sample configure -background $color } set_color $page # Page #3 # ---------------------------------------------------------------------- set page [.nb add -label "Blank Page"] label $page.title -text "(put your widgets here)" \ -background black -foreground white \ -width 25 -height 3 pack $page.title -expand yes -fill both .nb view "Personal Info" iwidgets-4.1.0/demos/optionmenu0000644003604700454610000000064307340260463015164 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: optionmenu in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::optionmenu .cb -labeltext "Font:" -labelpos w -command { puts "selected: [.cb get]" } pack .cb .cb insert end Ariel Courier Helvetica Knarly Lucida \ Rumpus Symbol Times "Zapf Dingbats" iwidgets-4.1.0/demos/panedwindow0000644003604700454610000000154007340260472015303 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: panedwindow in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 . configure -background white iwidgets::panedwindow .pw -width 3i -height 3i pack .pw -padx 4 -pady 4 .pw add "top" set pane [.pw childsite "top"] label $pane.l -text "(put some widgets here)" \ -background black -foreground white pack $pane.l -expand yes -fill both .pw add "bottom" set pane [.pw childsite "bottom"] label $pane.l -text "(put other widgets here)" \ -background black -foreground white pack $pane.l -expand yes -fill both .pw fraction 40 60 iwidgets::optionmenu .orient -labeltext "Orientation:" -command { .pw configure -orient [.orient get] } pack .orient -padx 4 -pady 4 .orient insert end horizontal vertical iwidgets-4.1.0/demos/promptdialog0000644003604700454610000000105307340260500015454 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: promptdialog in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell button .b -text "Get Password..." -command { if {[.pd activate]} { puts "password: [.pd get]" } else { puts "cancelled" } } pack .b iwidgets::promptdialog .pd -title "Prompt Dialog" -modality application \ -labeltext "Password:" -show "*" .pd hide Apply .pd hide Help iwidgets-4.1.0/demos/pushbutton0000644003604700454610000000101707340260560015174 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: pushbutton in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 . configure -background white iwidgets::pushbutton .pb -text "Push Me" -defaultring yes -command { puts "Hello, World!" } pack .pb -padx 4 -pady 4 checkbutton .default -text "Default ring" -variable defring \ -command {.pb configure -defaultring $defring} pack .default -padx 4 -pady 4 .default invoke iwidgets-4.1.0/demos/radiobox0000644003604700454610000000066107340260567014603 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: radiobox in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::radiobox .rb -labeltext "Size:" -labelpos nw pack .rb -padx 4 -pady 4 -fill both .rb add small -text "Small" .rb add med -text "Medium" .rb add large -text "Large" .rb add xlarge -text "Biggie" .rb select med iwidgets-4.1.0/demos/scopedobject0000644003604700454610000000047207340260575015437 0ustar dgp771div#!/bin/sh # \ exec wish8.4 -f $0 $* package require Iwidgets 4.0 # # Demo script for the Scopedobject class # proc scopedobject_demo {} { iwidgets::scopedobject #auto \ -exitscopecommand {puts "enter scopedobject_demo"} \ -exitscopecommand {puts "exit scopedobject_demo"} } scopedobject_demo iwidgets-4.1.0/demos/scrolledcanvas0000644003604700454610000000244607340260603015771 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: scrolledcanvas in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell . configure -background white iwidgets::scrolledcanvas .canv -labeltext "Scrolledcanvas" \ -vscrollmode dynamic -hscrollmode dynamic -autoresize yes pack .canv -expand yes -fill both -padx 4 -pady 4 .canv xview moveto 0 .canv yview moveto 0 button .zoomin -text "Zoom In" -command { .canv scale all 0 0 2 2 .canv configure -scrollregion [.canv bbox all] } pack .zoomin -side left -expand yes -padx 4 -pady 4 button .zoomout -text "Zoom Out" -command { .canv scale all 0 0 0.5 0.5 .canv xview moveto 0 .canv yview moveto 0 .canv configure -scrollregion [.canv bbox all] } pack .zoomout -side left -expand yes -padx 4 -pady 4 bind [.canv component canvas] {add_rectangle %W %x %y} bind [.canv component canvas] {add_rectangle %W %x %y} proc add_rectangle {win x y} { set x [$win canvasx $x] set y [$win canvasy $y] $win create rectangle \ [expr $x-4] [expr $y-4] \ [expr $x+4] [expr $y+4] \ -outline "" -fill red $win configure -scrollregion [$win bbox all] } iwidgets-4.1.0/demos/scrolledframe0000644003604700454610000000145407340260612015606 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: scrolledframe in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell iwidgets::scrolledframe .sf -width 4i -height 2i -labeltext "Scrolledframe" pack .sf set win [.sf childsite] set all "" foreach option [.sf configure] { if {[llength $option] == 5} { set name [lindex $option 0] set val [lindex $option end] set entry [iwidgets::entryfield $win.#auto] pack $entry -fill x $entry configure -labeltext $name \ -command ".sf configure $name \[$entry get\]" $entry insert 0 $val lappend all $entry } } eval iwidgets::Labeledwidget::alignlabels $all iwidgets-4.1.0/demos/scrolledhtml0000644003604700454610000000072207340260620015454 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: scrolledhtml in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell iwidgets::scrolledhtml .sh -labeltext "Scrolledhtml" \ -width 5i -height 3i \ -wrap word -linkcommand ".sh import -link" -padx 10 pack .sh .sh import [file join ${iwidgets::library} demos demo.html] iwidgets-4.1.0/demos/scrolledlistbox0000644003604700454610000000142707340260626016205 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: scrolledlistbox in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell . configure -background white iwidgets::scrolledlistbox .slb -labeltext "Scrolledlistbox" \ -vscrollmode dynamic -hscrollmode none \ -selectmode single \ -labelpos nw -selectioncommand { puts "click: [.slb getcurselection]" } pack .slb -padx 4 -pady 4 .slb insert 0 Hello World! Cruel .slb delete "Hello" .slb insert 0 "Goodbye" button .add -text "Add" -command { .slb insert end "Goodbye!" } pack .add -padx 4 -pady 4 button .del -text "Delete" -command { .slb delete 0 } pack .del -padx 4 -pady 4 iwidgets-4.1.0/demos/scrolledtext0000644003604700454610000000072007340260634015477 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: scrolledtext in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell iwidgets::scrolledtext .st -labeltext "Scrolledtext" -wrap none \ -vscrollmode static -hscrollmode dynamic \ -width 5i -height 2i pack .st .st import [file join ${iwidgets::library} demos scrolledtext] iwidgets-4.1.0/demos/selectionbox0000644003604700454610000000065207340260644015466 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: selectionbox in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell iwidgets::selectionbox .sb -selectionlabel "Font:" -height 2i pack .sb .sb insert items end Ariel Courier Helvetica Knarly Lucida \ Rumpus Symbol Times "Zapf Dingbats" iwidgets-4.1.0/demos/selectiondialog0000644003604700454610000000115707340260653016136 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: selectiondialog in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell iwidgets::selectiondialog .sd -modality application .sd configure -selectionlabel "Font:" .sd insert items end Ariel Courier Helvetica Knarly Lucida \ Rumpus Symbol Times "Zapf Dingbats" button .select -text "Font..." -command { if {[.sd activate]} { puts "selected: [.sd get]" } else { puts "cancelled" } } pack .select -side left iwidgets-4.1.0/demos/shell0000644003604700454610000000054207340260664014077 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: selectiondialog in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::shell .sh -modality none -padx 20 -pady 20 -title Shell pack [label [.sh childsite].l -text SHELL] .sh center .sh activate iwidgets-4.1.0/demos/spindate0000644003604700454610000000045407340260672014600 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: spindate in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell iwidgets::spindate .sd -monthformat brief pack .sd iwidgets-4.1.0/demos/spinint0000644003604700454610000000150107340260701014440 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: spinint in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell . configure -background white iwidgets::spinint .times -labeltext "Countdown:" -range {0 10} -width 3 pack .times -padx 10 -pady 10 .times delete 0 end .times insert end "5" frame .test pack .test -padx 10 -pady 10 button .test.go -text "Go" -command { set count [.times get] while {$count >= 0} { .test.readout configure -text $count update after 200 incr count -1 } .test.readout configure -text "blast-off!" } pack .test.go -side left label .test.readout -width 15 -background seashell pack .test.readout -side left -padx 4 -pady 4 iwidgets-4.1.0/demos/spinner0000644003604700454610000000137707340260710014445 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: spinner in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell proc spinMonth {win step} { set months { January February March April May June July August September October November December } set index [expr [lsearch $months [$win get]] + $step] if {$index < 0} {set index 11} if {$index > 11} {set index 0} $win delete 0 end $win insert 0 [lindex $months $index] } iwidgets::spinner .sm -labeltext "Month:" -width 10 -fixed 10 \ -decrement {spinMonth .sm -1} -increment {spinMonth .sm 1} pack .sm .sm insert 0 "January" iwidgets-4.1.0/demos/spintime0000644003604700454610000000043107340260717014614 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: spintime in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell iwidgets::spintime .st pack .st iwidgets-4.1.0/demos/tabnotebook0000644003604700454610000000424007340260725015274 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: tabnotebook in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 option add *textBackground seashell option add *Tabnotebook.backdrop DimGray option add *Scale.width 8 . configure -background white iwidgets::tabnotebook .tnb -width 5i -height 3i pack .tnb -padx 4 -pady 4 # Page #1 # ---------------------------------------------------------------------- set page [.tnb add -label "Personal Info"] iwidgets::entryfield $page.name -labeltext "Name:" -labelpos nw pack $page.name iwidgets::entryfield $page.addr -labeltext "Address:" -labelpos nw pack $page.addr iwidgets::entryfield $page.addr2 -labeltext "City, State:" -labelpos nw pack $page.addr2 iwidgets::entryfield $page.email -labeltext "E-mail:" -labelpos nw pack $page.email # Page #2 # ---------------------------------------------------------------------- set page [.tnb add -label "Favorite Color"] frame $page.sample -width 20 -height 20 \ -borderwidth 2 -relief raised pack $page.sample -fill both -pady 4 scale $page.r -label "Red" -orient horizontal \ -from 0 -to 255 -command "set_color $page" pack $page.r -fill x scale $page.g -label "Green" -orient horizontal \ -from 0 -to 255 -command "set_color $page" pack $page.g -fill x scale $page.b -label "Blue" -orient horizontal \ -from 0 -to 255 -command "set_color $page" pack $page.b -fill x proc set_color {page {val 0}} { set r [$page.r get] set g [$page.g get] set b [$page.b get] set color [format "#%.2x%.2x%.2x" $r $g $b] $page.sample configure -background $color } set_color $page # Page #3 # ---------------------------------------------------------------------- set page [.tnb add -label "Blank Page"] label $page.title -text "(put your widgets here)" \ -background black -foreground white \ -width 25 -height 3 pack $page.title -expand yes -fill both iwidgets::optionmenu .orient -labeltext "Tabs:" -command { .tnb configure -tabpos [.orient get] } pack .orient -padx 4 -pady 4 .orient insert end n s e w .tnb view "Personal Info" .tnb configure -tabpos [.orient get] iwidgets-4.1.0/demos/tabset0000644003604700454610000000062407340260736014253 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: tabset in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 proc showTab {num} { puts "selected: [.ts tabcget $num -label]" } iwidgets::tabset .ts -command showTab pack .ts for {set i 1} {$i <= 5} {incr i} { .ts add -label "#$i" } .ts select 0 iwidgets-4.1.0/demos/timeentry0000644003604700454610000000045707340260744015014 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: timeentry in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 iwidgets::timeentry .de -labeltext "Time:" pack .de -fill x -expand yes -padx 10 -pady 10 iwidgets-4.1.0/demos/timefield0000644003604700454610000000055307340260752014732 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: timefield in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 proc returnCmd {} { puts [.df get] } iwidgets::timefield .df -labeltext "Time:" -command returnCmd pack .df -fill x -expand yes -padx 10 -pady 10 iwidgets-4.1.0/demos/toolbar0000644003604700454610000000274407340260761014436 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: toolbar in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 label .status -textvariable statusVar -width 40 -anchor w pack .status -side bottom iwidgets::toolbar .tb -helpvariable statusVar -orient vertical pack .tb -side left -anchor nw -padx 4 -pady 4 set imagedir [file join ${iwidgets::library} demos images] .tb add button select \ -helpstr "Select drawing elements" \ -image [image create photo -file [file join $imagedir select.gif]] \ -balloonstr "Selection tool" \ -command {puts "tool: select"} .tb add button magnify \ -helpstr "Magnify drawing area" \ -image [image create photo -file [file join $imagedir mag.gif]] \ -balloonstr "Zoom tool" \ -command {puts "tool: magnify"} .tb add button ruler \ -helpstr "Measure distances on drawing" \ -image [image create photo -file [file join $imagedir ruler.gif]] \ -balloonstr "Ruler tool" \ -command {puts "tool: ruler"} .tb add frame filler \ -borderwidth 1 \ -width 10 \ -height 10 .tb add button poly \ -helpstr "Draw a polygon" \ -image [image create photo -file [file join $imagedir poly.gif]] \ -balloonstr "Polygon tool" \ -command {puts "tool: polygon"} canvas .worksp -width 2i -height 3i \ -borderwidth 2 -relief sunken -background white pack .worksp -side right -expand yes -fill both -padx 4 -pady 4 iwidgets-4.1.0/demos/watch0000644003604700454610000000070607340260767014104 0ustar dgp771div# ---------------------------------------------------------------------- # DEMO: watch in [incr Widgets] # ---------------------------------------------------------------------- package require Iwidgets 4.0 set tk_strictMotif 1 iwidgets::watch .w -state disabled -showampm no -width 155 -height 155 pack .w -padx 10 -pady 10 -fill both -expand yes proc fix_time {} { if {! [winfo exists .w]} return .w show after 1000 fix_time } fix_time iwidgets-4.1.0/demos/images/0000755003604700454610000000000013136712365014311 5ustar dgp771diviwidgets-4.1.0/demos/images/box.xbm0000644003604700454610000000160006557146155015615 0ustar dgp771div#define Tool_32_box_width 32 #define Tool_32_box_height 32 static unsigned char Tool_32_box_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x0f, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0xe0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; iwidgets-4.1.0/demos/images/clear.gif0000644003604700454610000000042706577264041016075 0ustar dgp771divGIF89a ³Ì™™™™™™™™™™™ÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿ!ù, @ÄÐÉI«½ ƒËÁúË#.r˜[מø€pÆMHm#@£ËsïSžÒé X>Èñh¶àÐxT­JRêÔ¸4`®Ø>šŸâ,ÉED¥aÌnÛšÚ_nÕÀáóc5STT;%75Iaci‹`ŽŒ\hŒƒ&EEGto$C.'œzK!"&›cjqž©“v/M¯Kw²¢Y¬1¸d:+-•ˆ8}UUj€P7ˆSW¿AtÍÏ|†ÕbÅ‘’”Þ]àäâæ;iwidgets-4.1.0/demos/images/close.gif0000644003604700454610000000037106577264041016112 0ustar dgp771divGIF89a ³Ì™™™™™™™™™™™ÌÌÌÿÿÿÿÿÿÌÿÿÿÿÿÿ!ù , @¦°ÉI«½ ±;ÿ^¥-ª¦ìê¶ÀqHçbßx®ßñ<À`C4 §–ÒÕ£mШtJ….š™vËíz}Űð(›Í%ñE3ò^ð6¯/ç˼]…ßëï24Hƒ„Hjˆ‰Š‹Œgidf$…Gm#—†>št(s~¦¥£ª+©§v­«ª¥;´µ¨‡oUº»·ž®²‡_ÃÄ`ÇÈ;iwidgets-4.1.0/demos/images/copy.gif0000644003604700454610000000041506577264041015756 0ustar dgp771divGIF89a ³Ì™™™™™™™™™™™ÌÌÌÿÿÿÿÿÿÌÿÿÿÿÿÿ!ù , @º°ÉI«½<„`(z\‰f§}lÚ=p “&¸¹®ö0<3ç+œpX ’H=^+…*ÞJ´,ùKÙˆX! 1êz¿"î-je–šÎ¹Æ$¸Ñ×N+ɯã"]G}܃X:2UiY‚ƒYŠVއƒ’““*cv.o8xCQhŸ–j8¡œrtKgn…G¤†FsI‘1c³=|=„P€«P”·V_S¼~@OD»<½¿ÂÉŠ˜ÄÊ‹\vÛ_ ;iwidgets-4.1.0/demos/images/cut.gif0000644003604700454610000000026306577264041015600 0ustar dgp771divGIF89a ³Ì™™™™™™™™™™™ÌÌÌÿÿÿÿÿÿÿÿÿÿÿÿ!ù, @`ðÉI«½8ë}`˜Œ‰grèdi릣YbGœ¹ÎoïÿÀ`¯baH‡h#%Z8Îh¢Z¯Ø¬vËí&u˜"*F5v>⯓ %ºÍ.æmuXƒ/EÏfZÆ:á^‚[;iwidgets-4.1.0/demos/images/exit.gif0000644003604700454610000000061406577264041015756 0ustar dgp771divGIF87af&òp€/OOЀPÙÙÙõÞ³ÿÿ9cc,f&þHºÜþ0ÊI«½8ëÍ»ÿ`(Žd œhªe;A,Ï1P°nîÁ4mßPÃëÕ …lÈ´{¿2ج:N„ç,*]Z¿ Àádäv©`+À0†"¥poººfkmð8š¸ÂI°t‚m2xyS}~€Y‹Š‚ƒE†yr|‰’œvG‡ˆW~€§(!užžm•z‰š ¨a© «¬’®I‡—} X´¦²b¼Ê¼œ¼<¯g±*Ã)³Æ/}»„x°£ÇÖ‹ÅBuÎ[ßÑáÕ¶ÖælÛGëí¢ÈâŽýòÿ9’iá–ĸ}+æý+ÆÒ˜ÐôñI°–BÄÜ„6ZÇ\¿ötl¢È—%‘#‡°Â2"”"©`I ´·`z É³¦Ož¯€ÐÔù¡§ÑŸYL õIt'Ò£@}ÝxÚÔ)Tªx¦ö¬Êá*Ô+©rK¶¬Ù³hÓnH;iwidgets-4.1.0/demos/images/find.gif0000644003604700454610000000060206577264041015722 0ustar dgp771divGIF87af&òÿÿÿÿÿ€€€€ÙÙÙ,f&þhºÜþ0ÊI«½8ëÍ»ÿ`(Ždiž¥hë®!»ô(xÌu8ÀŠeî|È P *„@BrÚX ™Â"z¤N—M,`±u½¾Ý5LTl‹’N§ÀiìøzÍ(â$s9u€x€bbUc@…!‡w ŠMŒuxvt ‚y{C¡¥¦ ’ž€‚‡­ ¢Ck¦´´¯„„…›¾¨†¡•B·¥¶´¹Ÿ»¾«°ÃÅ¡ÀÉš¬ÍØÏŽ£LÕyáÎ äËݲNªíË’¿¼2Ñìïâ×çÌåÊÜVÔ9’Ñ8mþVÅ)XA> `ˆf„à ëŒÌ1SP±†Cfs.â(P€cG (àPŠ $Iš<é‚…Ë>õb–tD…Š6UrƌьuŽ)jâ§„¤1™š8úT¨J©X³jÝʵ«×¯`%$;iwidgets-4.1.0/demos/images/help.gif0000644003604700454610000000111706577264041015734 0ustar dgp771divGIF87af&óÿÿÿÿÿÿÿ€ÿÿ€€€€ÙÙÙ€€€€,f&þ0ÉI«½8ëÍ»ÿ`(Ždiž(,¤p®íñÊxn­@ßÓ® Ц+~^¾ß!á»IM£ôB X¯Öe³–€œÓ)te8 YæOýÃZÃáñ²|P¸¯¥$/ÞÉuv „.nK{`}2V + tv….6,“ |Œ8V†€ ‚†‡œ‰ž‹oB°³:o¯s,vl¹4¯´²ÆÈ1¢¤fIMª¬¯ Ê]ÄØ)Æ™”,j=ž¿Áá6ÚT°ÈXÛNox%¢¸™e¦>éM+­DGŒÝyo ‰7Í`±åÀ>`>u(«Ý ¹M 0 ^)AþY¶¡æêŸlb<¦Nƒ£„•…{xnÉ;nÌöŽåAh0wÉÔÒb"‰Pꤵ²çz¹î *Ä&À´~Š®±[Ê•'Á®Ooš´°Î ª4ŒÚlY«m6w^ß Û“Ô,[¬®Âj `N–MyÊû)a¬.³ ö¥­YŽm"èÙ}ÆC‰^’þ‡ÒœZ¤oeíŒÅ¢éÜ’t Â5`²©,Í.ó½ÙòŒ‡‹ÎÒèiÛ©é0|·òW«Ñ~âMnpˆ—ޏœù<Ž£ìQ.tù^圭Ǻ ºè½Mßãpí¦,’äA?ìUPÜÏ?|þÿ(à€F;iwidgets-4.1.0/demos/images/line.xbm0000644003604700454610000000157206557146161015761 0ustar dgp771div#define lineOp_width 32 #define lineOp_height 32 static unsigned char lineOp_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; iwidgets-4.1.0/demos/images/mag.gif0000644003604700454610000000026706577264041015555 0ustar dgp771divGIF87aÂiiiÛÛÛ‚‚‚ÿÿÿyiïI<Ž,„ºÜþ0ÊI+ Û„÷C°=B÷}âÈtDÛ¢ªR ® «]PÛ^ºuƒ¯42…„[eÐC¾ƒÁ¯éìM©BëµT%nuYï—YÓO¡Œ&0O @­0}…aNWcòz|t €{ƒ …‡‚‰‹yˆ‰ ’“†ƒ”š›˜–Š £# ;iwidgets-4.1.0/demos/images/new.gif0000644003604700454610000000032406577264042015575 0ustar dgp771divGIF89a ³/OO¿¿¿Ò´ŒõÞ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù, @PHª½ØÎÍ% `(Žá`@ÐQdëéú½4ws'°N9]ëÆ GÄñ¸Sá˜0ÔO ÍødPR˜E:‹]ÑÖnb˰¯ÒÊf«¹ÌÊ”7]§K¯‡Ïžìodhc,ƒ…e„yq‡‹GŠhig‰‘†“a—”?žŸ ¡¢Ÿ;iwidgets-4.1.0/demos/images/open.gif0000644003604700454610000000040206577264042015742 0ustar dgp771divGIF89a ³Ì™™™™™™™™™™™ÌÌÌÿÿÿÿÿÿÌÿÿÿÿÿÿ!ù , @¯°ÉI«½¼ÍÀ`6hÙ@ª®_Œ 2ÌtmÏȲÇþÀÉK&c#ŸÈˆ9sЧ4·ë5zجv‹ z¿`¯éä91ÃÑfLî¼x–7Ê<­óäͨ¾­*Í€GVa„…†‡ˆ„G‰.mp†D’”“–”-’lmk‘jkžd‘¡B ,¦){}¨n|´°²µº~.«º¯N¼)Á:ÆÇÈÇPË, P·Ü £Š—ñ¹£f¦ÚƒÕÕÅ‘P˜4jÖ|9Nì°WS¿Ö:ѾŽuÚϺ!,±öw§G75((Æ…4@(gc¸é% 8a™p×(Ç8éIªF·¹Õ *˜‡ ¶ÈåõȰê(ÚØú€ûwÖ@›zk+Ö P,°›h‘,lø‰8z¹©ë øÌ<½ðºÈËd¢Kç}Þ-þQj>¾¦îþ/?O_oŸ¯¿ÏßP;iwidgets-4.1.0/demos/images/ruler.gif0000644003604700454610000000025606577264042016141 0ustar dgp771divGIF87aÂiii¾¶ÿI<Žyiï,{ºÜþ0ÊI«½8»À»ÿ` @a ãà ÄÀºí+·h´Æ8¬¿)Ì»œl`û¹ŽÈc,éK:wL•ñ‰\ºjRªv€Ín©’Õwx,Ž Ökóœì6Äßto3ݦ¹k;éfÀÇG}~u€xf…QR(‹ŒŽs~’•–—˜™š ;iwidgets-4.1.0/demos/images/save.gif0000644003604700454610000000041606577264042015744 0ustar dgp771divGIF87af&ñÿÿÿ  ÙÙÙ,f&眩Ëí£œ´Ú‹³Þ¼û†âH–扦êʶ®ÄòLÓïzÍË·šÛ†ÄbPø¥Ž¢À„Í” æÓ¨CvxÔƒõ:Œn|2õ kbÕdy:`{Ýoy}UßÍ®=NW³–ÕE¸e3·øÆèˆq„Ô#IÇ¡Øæ&g×s—õ j)¨¸Y*º :zñר‰j ;HHùéjaFÆIÛwº+Q™‹x™* ¼üª;7È'kÍÜ<"®óm‚^³ÎB9_oŸ¯¿Ïßïÿ0 À) ;iwidgets-4.1.0/demos/images/select.gif0000644003604700454610000000017406577264042016266 0ustar dgp771divGIF87a¡iiiÿÿÿ,U„©Ëí£œ,X ƒ×½u^¢\0"¥y¦ÆÊŠ̶]Ë^ÛßCýz1á裣¥‹¶bÎ@¨hÊ ÀÞ8*j“Û 5Z×A#5¿Ôì¶û o;iwidgets-4.1.0/demos/images/text.xbm0000644003604700454610000000157206557146165016022 0ustar dgp771div#define font_edit_width 32 #define font_edit_height 32 static unsigned char font_edit_bits[] = { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x80, 0x7b, 0x00, 0x00, 0x80, 0x7e, 0x00, 0x00, 0xc0, 0xfd, 0x00, 0x00, 0x60, 0xfb, 0x00, 0x00, 0xb0, 0xf7, 0x00, 0x00, 0xd0, 0xef, 0x00, 0x00, 0xf8, 0xdf, 0x00, 0x00, 0xd4, 0x7f, 0x00, 0x00, 0xaa, 0x1f, 0x00, 0x00, 0x15, 0x0f, 0x00, 0x80, 0x82, 0x06, 0x03, 0x40, 0x01, 0x01, 0x07, 0xa0, 0x80, 0x00, 0x0f, 0x10, 0x40, 0x00, 0x1f, 0x08, 0x20, 0x00, 0x3b, 0xe4, 0x1f, 0x00, 0x73, 0x1a, 0x00, 0x00, 0xe3, 0x07, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x00, 0xe3, 0x03, 0x00, 0x00, 0x7b, 0x07, 0x00, 0x00, 0x1f, 0x06, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; iwidgets-4.1.0/.cvsignore0000644003604700454610000000007107302606220013721 0ustar dgp771divMakefile config.log confdefs.h iwidgets.tcl pkgIndex.tcl iwidgets-4.1.0/CHANGES0000644003604700454610000017134113136711657012742 0ustar dgp771div[incr Widgets] CHANGES ---------------------- ========================================================================== CURRENT VERSION: 4.1.0 PREVIOUS VERSION: 4.0.2 ========================================================================== CURRENT VERSION: 4.0.2 PREVIOUS VERSION: 4.0.1 ========================================================================== CURRENT VERSION: 4.0.1 PREVIOUS VERSION: 4.0.0 DATE: 9/16/02 CONTACT: Chad Smith (itclguy@attbi.com) This is primarily a bug-fix release of the [incr Widgets]. Please see the ChangeLog for a detailed explanation of the changes made to the various widgets and the SourceForge tickets to which each change is associated. Check out the incoming/demos directory. I've added a couple new widgets that were submitted to SourceForge. Let me know if you think they are useful or not. If so, they can be added to the distribution in a future release. Many thanks to Marty Backe for his tireless efforts closing out numerous SF tickets for this release! ========================================================================== ========================================================================== -------------------------- iwidgets-4.0.0 ------------------------------ -------------------- CHANGES FROM iwidgets-3.1.0 ----------------------- ========================================================================== DATE: 8/07/01 CONTACT: Chad Smith (itclguy@yahoo.com) -------- CHANGES: -------- This release of the [incr Widgets] marks the first time they are released independently of the [incr Tcl] distribution. The Iwidgets package is now separate from Itcl and can be optionally downloaded and built as a true extension to Itcl (well actually Itk). Along with the Makefile/configuration-type changes necessary for removing the Iwidgets from Itcl, there are many other changes you should note in this release. I'll try to list each of these: o - The most important change is that doing a 'package require Iwidgets' no longer pulls the itcl namespace commands into the global namespace. Previously, this was done because none of the itcl-specific commands such as class, configbody, etc. were properly resolved in the [incr Widgets] classes. Now, all references to itcl commands use proper namespace resolution. For example, "class iwidgets::Checkbox" is now replaced with "itcl::class iwidgets::Checkbox". Here is a list of itcl commands that are now properly scoped: class body configbody scope code There are likely many folks in the community that have come to rely on the exporting of itcl commands into the global namespace, so if you're one of these folks you have two choices if you want to use this version of the [incr Widgets]: (1) You can add a "namespace import -force itcl::*" at the beginning of your application (this is what 'package require Iwidgets' used to do); or (2) you can add "itcl::" in front of each of the itcl-specific commands in your code. o - A new mega-widget, extbutton, was added to the distribution. Note that this new widget will only work with Tk 8.4 or later. A man page and test case is available in the distribution. o - "readonly" was added as a new value for the combobox's -state option. o - A new option, -gmt, was added to the datefield. It accepts boolean values. o - A new option, -state, was added to the radiobox. o - A new method, bbox, was added to tabset to return the bounding box that will completely enclose all tabs. o - A new option, -automount, was added to extfileselectionbox and fileselectionbox. o - Error checking was added to hierarchy's -alwaysquery option to enforce boolean values, and some memory leaks were plugged in the 'clear' method. ========================================================================== ========================================================================== -------------------------- iwidgets-3.0.0 ------------------------------ -------------------- CHANGES FROM iwidgets-2.2.0 ----------------------- ========================================================================== [incr Widgets] version 3.0.0 is compatable with itcl3.0 [incr Widgets] has undergone a major overhaul between the last version and 3.0.0. Since so many changes have taken place it made more since to list them by widget class name rather than the old style of new features and bug fixes. The majority of the changes are under the covers and will have minimal impact of existing scripts, but there are a few that may bite you. To locate possible incompatabilities, just search this file for the key words "POSSIBLE INCOMPATIBILITY". In addition, quite a few new widgets have been added to the set. They include the following: Calendar Checkbox Dateentry Datefield Disjointlistbox Extfileselectionbox Extfileselectiondialog Finddialog Hierarchy Labeledframe Mainwindow Messagebox Scrolledwidget Timeentry Timefield Watch Thanx to the following contributors who have been kind enough to help me support this effort through enhancements, bug fixes, and new widgets. John Tucker jatucker@austin.dsccc.com Mitch Gorman emrys@net-gate.com John Reekie johnr@EECS.Berkeley.EDU Alfredo Jahn ajahn@spd.dsccc.com Michael McLennan mmclennan@lucent.com Labeledwidget ______________________________________________________________________________ >> Reimplemented geometry management using the grid instead of the packer. >> Changed component option basis to be that of the "usuals". >> Removed a redundant frame component named "shell" just below the hull. >> Corrected labelvariable bug. Setting the labelvariable had no effect. The code has been corrected such that a trace is installed on the variable which forces an update of the label text upon writes to the variable. >> Removed the labmargin frame component used for implementing a margin. This is now accomplished via the grid by maintaining an empty row/column for the margin and adjusting its minsize. >> POSSIBLE INCOMPATIBILITY - The childsite is now a protected component. If you need access to it, use the childsite command. >> Added new label position orientation settings. The current label positions are nw, n, ne, sw, s, se, en, e, es, wn, w, and ws. >> Updated the test script and man page. Scrolledlistbox ______________________________________________________________________________ >> Derived from the Scrolledwidget class which provides the vertical and horizontal scrollbars along with the options to control their display. >> Reimplemented geometry management using the grid instead of the packer. >> Changed component option basis to be that of the "usuals". >> Added a -state option that allows you to disable the listbox. Selection is blocked. The foreground of the scrolledlistbox label is changed to disbabledforeground. >> Fixed the infinite looping problem which would occur with -hscrollmode set to dynamic and a really long line added just out of the view port. As you'd scroll down the horizontal scrollbar bar would start flashing on and off. >> Removed the margin frame components used for implementing a margin between the listbox and scrollbars. This is now accomplished via the grid by maintaining an empty row/column for the margin and adjusting its minsize. >> POSSIBLE INCOMPATIBILITY - Removed -items option. This was originally put in as a convienence, but it turns out to be quite costly in terms of performance. It had to go. The insert/delete/get commands can be used instead which is much more in line with Tk. >> Updated the test script, demo, and man page. Entryfield ______________________________________________________________________________ >> Reimplemented geometry management using the grid instead of the packer. >> Modified the real type validation to except exponents. Patch provided by evans@engineous.com (Rick Evans). >> The -state option changes the label to disabledforeground when the entryfield is disabled. >> Changed component option basis to be that of the "usuals". >> Added a -pasting configuration option to allow user to enable/disable pasting into the entry component of the entryfield. csmith@adc.com (Chad Smith) >> Removed hardcoded state comparisons in the _keyPress method and replaced with code to mask out and keypress events. csmith@adc.com (Chad Smith) Pushbutton ______________________________________________________________________________ >> Changed component option basis to be that of the "usuals". >> POSSIBLE INCOMPATABILITY - The pushButton component has been changed to pushbutton. >> POSSIBLE INCOMPATABILITY - The following options have been removed and are not directly available in the pushbutton anymore: -anchor -justify -textvariable The underlying button component still maintains them , but not the pushbutton itself. You can still set them via the component command, i.e. ".pb component pushButton configure -justify left" Buttonbox ______________________________________________________________________________ >> Changed component option basis to be that of the "usuals". Shell ______________________________________________________________________________ >> Changed component option basis to be that of the "usuals". >> Added a -width and -height option. A value of zero causes the width and/or height to be adjusted to the required value based on the size requests of the components placed in the childsite. Otherwise, the width and/or height is fixed. The default is zero. >> Added -width and -height tests to the test script and updated the man page. >> The activate method no longer returns an error if it is called when the shell is already active. Instead, the shell is just raised. Dialogshell ______________________________________________________________________________ >> Reimplemented geometry management using the grid instead of the packer. >> Changed component option basis to be that of the "usuals". >> Updated the test script and man page, adding the -width and -height options that are inherited from the shell. Dialog ______________________________________________________________________________ >> Updated the test script and man page, adding the -width and -height options that are inherited from the shell. Selectionbox ______________________________________________________________________________ >> Reimplemented geometry management using the grid instead of the packer. >> Changed component option basis to be that of the "usuals". >> Modified the insert and delete methods to use the items insert and delete method rather than configuring the -items option which has been removed from the underlying scrolledlistbox. >> Removed the margin frame component used for implementing a margin between the items and selection. This is now accomplished via the grid by maintaining an empty row for the margin and adjusting its minsize. >> Removed the unecessary frame that was used to contrain the width and height of the widget. This is now performed directly on the widget hull. >> POSSIBLE INCOMPATABILITY - The following options have been removed and are not directly available in the selectionbox anymore: -hscrollmode -itemslabelpos -labelmargin -margin -relief -sbwidth -scrollmargin -selectionlabelpos -vscrollmode The underlying components still maintain them, but not the selectionbox itself. You can still set them via the component command, i.e. ".sb component selection configure -labelpos nw" or ".sb component items configure -hscrollmode static" >> Added a -width and -height option. A value of zero causes the width and/or height to be adjusted to the required value based on the size requests of the components placed in the childsite. Otherwise, the width and/or height is fixed. The default is zero. >> Updated the test script, demo, and man page. Selectiondialog ______________________________________________________________________________ >> Pack propagation is now handled by the shell class. >> Modified the insert and delete methods to use the insert and delete method rather than configuring the -items option which has been removed from the underlying scrolledlistbox. >> Changed component option basis to be that of the "usuals". >> POSSIBLE INCOMPATABILITY - The "sb" component has been renamed to be "selectionbox". This is much more descriptive. >> POSSIBLE INCOMPATABILITY - The following options have been removed and are not directly available in the selectiondialog anymore: -hscrollmode -itemslabelpos -labelmargin -margin -relief -sbwidth -scrollmargin -selectionlabelpos -vscrollmode The underlying components still maintain them, but not the selectiondialog itself. You can still set them via the component command, i.e. ".sd component selectionbox configure -margin 10" or ".sd component selectionbox component items configure -hscrollmode static" >> The -width and -height options are now controlled by the shell class. A value of zero causes the width and/or height to be adjusted to the required value based on the size requests of the components. Otherwise, the width and/or height is fixed. The default is zero. Scrolledtext ______________________________________________________________________________ >> Derived from the Scrolledwidget class which provides the vertical and horizontal scrollbars along with the options to control their display. >> Reimplemented geometry management using the grid instead of the packer, eliminating quite a few unneeded frames along the way. >> Changed component option basis to be that of the "usuals". >> Removed the margin frame components used for implementing a margin between the text and scrollbars. This is now accomplished via the grid by maintaining an empty row/column for the margin and adjusting its minsize. >> The -state option changes the label to disabledforeground when the scrolledtext is disabled. >> Fixed the infinite looping problem which would occur with -wrap set to none, -hscrollmode set to dynamic and a really long line added just out of the view port. As you'd scroll down the horizontal scrollbar bar would start flashing on and off. >> Added an index argument to the import method so a file can be imported into the text area at positions other than just the end. >> Updated the test script and man page. Feedback ______________________________________________________________________________ >> Corrected namspace problem by removing global scope qualifier from class definition as well as method and option bodies. Bug report and patch provided by evans@engineous.com (Rick Evans). Hyperhelp ______________________________________________________________________________ >> Corrected namspace problem by removing global scope qualifier from class definition as well as method and option bodies. Bug report provided by evans@engineous.com (Rick Evans). Scrolledhtml ______________________________________________________________________________ >> Corrected namspace problem by removing global scope qualifier from class definition as well as method and option bodies. Bug report provided by evans@engineous.com (Rick Evans). Canvasprintbox ______________________________________________________________________________ >> Added tcl_platform to list of global variables declared in print method. Bug report provided by evans@engineous.com (Rick Evans). Scrolledcanvas ______________________________________________________________________________ >> Derived from the Scrolledwidget class which provides the vertical and horizontal scrollbars along with the options to control their display. >> POSSIBLE INCOMPATIBILITY - The ScrCanvas component has been renamed canvas. >> The -state option changes the label to disabledforeground when the scrolledcanvas is disabled. >> Reimplemented geometry management using the grid instead of the packer. >> Changed component option basis to be that of the "usuals". >> Removed the margin frame components used for implementing a margin between the canvas and scrollbars. This is now accomplished via the grid by maintaining an empty row/column for the margin and adjusting its minsize. >> Updated the test script, demo, and man page. Scrolledframe ______________________________________________________________________________ >> Derived from the Scrolledwidget class which provides the vertical and horizontal scrollbars along with the options to control their display. >> POSSIBLE INCOMPATIBILITY - The childsite is now a protected component. If you need access to it, use the childsite command. >> POSSIBLE INCOMPATIBILITY - The scrCanvas component has been renamed canvas and the scrFrame component to sfchildsite. >> Reimplemented geometry management using the grid instead of the packer. >> Changed component option basis to be that of the "usuals". >> Fixed the infinite looping problem which would occur with -hscrollmode set to dynamic and a really long component added just out of the view port. As you'd scroll down the horizontal scrollbar bar would start flashing on and off. >> Removed the margin frame components used for implementing a margin between the canvas and scrollbars. This is now accomplished via the grid by maintaining an empty row/column for the margin and adjusting its minsize. >> Updated the test script, demo, and man page. Promptdialog ______________________________________________________________________________ >> Changed component option basis to be that of the "usuals". >> POSSIBLE INCOMPATABILITY - Renamed the "ef" component to "prompt". >> POSSIBLE INCOMPATABILITY - The following options have been removed and are not directly available in the promptdialog anymore: -fixed -justify -labelbitmap -labelimage -labelmargin -state -textvariable -width The underlying components still maintain them, but not the promptdialog itself. You can still set them via the component command, i.e. ".pd component prompt configure -labelpos w" >> Updated the test script, demo, and man page. Messagedialog ______________________________________________________________________________ >> Changed component option basis to be that of the "usuals". >> POSSIBLE INCOMPATABILITY - Renamed the "msg" component to "message". >> POSSIBLE INCOMPATABILITY - The following options have been removed and are not directly available in the messagedialog anymore: -anchor -justify -wraplength The underlying components still maintain them, but not the messagedialog itself. You can still set them via the component command, i.e. ".md component message configure -justify left" >> Reimplemented geometry management using the grid instead of the packer. >> Updated the test script, demo, and man page. Hierarchy ______________________________________________________________________________ >> New iwidgets hierarchical data viewer mega-widget which manages a list of nodes that can be expanded or collapsed. Individual nodes can be highlighted. Clicking with the right mouse button on any item brings up a special item menu. Clicking on the background area brings up a different popup menu. >> Many thanks to Michael McLennan who provided the nucleus of this code. >> Man page, test script, and demo have been produced. >> The catalog demo has been updated to include the hierarchy demo. Checkbox ______________________________________________________________________________ >> New iwidget checkbox mega-widget which manages a group of check buttons quite similar to that of the existing radiobox. >> Thanks to John Tucker for the contributed code. >> Man page, test script, and demo have been produced. >> The catalog demo has been updated to include the checkbox demo. Radiobox ______________________________________________________________________________ >> Changed component option basis to be that of the "usuals". >> Changed the base class to be labeledframe. >> Updated the test script, demo, and man page. Spinner ______________________________________________________________________________ >> Reimplemented geometry management using the grid instead of the packer. >> Removed a redundant frame component named "arrowFrame". >> Removed the use of the option database to set the option values. Spinint ______________________________________________________________________________ >> Removed the use of the option database to set the option values. Datefield ______________________________________________________________________________ >> New iwidget. The datefield is a smart date entry field with adjustable built-in intelligence levels. It can be made smart enough not to accept any bad dates or made dumb enough to accept any old thing typed. Since it is derived from the labeledwidget, it also includes an optional label. >> Man page, test script, and demo have been produced. >> The catalog demo has been updated to include the datefield demo. Calendar ______________________________________________________________________________ >> New iwidget. The calendar widget provide for the selection and/or display of dates. It displays a single month at a time. Buttons exist on the top to change the month in effect turning th pages of a calendar. As a page is turned, the dates for the month are modified. Selection of a date visually marks that date. The selected value can be monitored via the -command option or just retrieved using the get method. Methods also exist to select a date and show a particular month. The option set allows the calendars appearance to take on many forms. For example, the background of the weekdays and weekends can be independently changed, the starting day of the week can be set to any of the days, the titles and fonts of everything is configurable, and an outline can be displayed around the each day. >> Many thanks to Michael McLennan who provided me a early copy of his book which gave me the example on which this code is based. >> Man page, test script, and demo have been produced. >> The catalog demo has been updated to include the calendar demo. Dateentry ______________________________________________________________________________ >> New iwidget. Dateentry is a quicken style date entry field with a popup calendar produced by combining the datefield and calendar widgets together. This allows a user to enter the date via the keyboard or by using the mouse by selecting the calendar icon which brings up a popup calendar. Since it is based on both the datefield and calendar, both option sets exists under the same roof in the dateentry. >> Man page, test script, and demo have been produced. >> The catalog demo has been updated to include the dateentry demo. Messagebox ______________________________________________________________________________ >> New iwidget. Implements an information messages area widget with scrollbars. Message types can be user defined and configured. Their options include foreground, background, font, bell, and their display mode of on or off. This allows message types to defined as needed, removed when no longer so, and modified when necessary. The number of lines that can be displayed may be limited. When this limit is reached, the oldest line is removed. There is also support for saving the contents to a file, using the standard file selection dialog. >> Many thanks to Alfredo Jahn who came up with idea and provided me a very stable working version which I extended to support user defined message types. >> Man page, test script, and demo have been produced. >> The catalog demo has been updated to include the messagebox demo. Spintime ______________________________________________________________________________ >> Reimplemented geometry management using the grid instead of the packer. >> Removed the margin frame component used for implementing a margin between the hour, minute and second components. This is now accomplished via the grid by maintaining an empty row for the margin and adjusting its minsize. >> POSSIBLE INCOMPATIBILITY - The delete, clear, and insert methods have been removed. Use the show method to set the time. >> POSSIBLE INCOMPATIBILITY - The get method has been changed such that it returns the time as either a colon separated string or a clock clicks value. >> Added a show method to be used to set the time. The method takes as an argument either a valid time string, a clock clicks value, or the keyword now. >> The current time will now appear as the default. >> Updated the test script, demo, and man page. Spindate ______________________________________________________________________________ >> Reimplemented geometry management using the grid instead of the packer. >> Removed the margin frame component used for implementing a margin between the month, day and year components. This is now accomplished via the grid by maintaining an empty row for the margin and adjusting its minsize. >> Spindate now uses the clock command during the spinning of the date components. Only valid dates are spun now. >> POSSIBLE INCOMPATIBILITY - Changed the -monthformat option to be string, brief, and full doing away with the optional user specified list. >> POSSIBLE INCOMPATIBILITY - The delete, clear, and insert methods have been removed. Use the show method to set the date. >> POSSIBLE INCOMPATIBILITY - The get method has been changed such that it returns the date as either a string or a clock clicks value. >> Added a show method to be used to set the time. The method takes as an argument either a valid time string, a clock clicks value, or the keyword now. >> The current date will now appear as the default. >> Selection and keyboard entry of values has been disabled. The value may only be changed via the spinners which insures correct operation. >> Updated the test script, demo, and man page.. Feedback ______________________________________________________________________________ >> Reimplemented geometry management using the grid instead of the packer. >> Made all the itk_components public. >> Added a trough which appears beneath the feedback widget. It has a -troughcolor option to set its color. Scrolledhtml ______________________________________________________________________________ >> Added -alink (same as -linkhighlight, but matches html naming) and -update options. >> Added new tags to come up to html3.2: basefont div font table td th tr >> Added numbering formats for
  • tag. >> Fixed to delete images after page is cleared. >> Fixed to bring anchor points to middle when moving down to a nearby anchor point. >> Fixes to regular expression matches. >> Performance enhancements with stack algorithm and regular expression searches. Hyperhelp ______________________________________________________________________________ >> Added -closecmd and -maxhistory options. >> Made itk_components public/private (which could conceivably break someone, if they were using a component directly that is now private) >> Fixed bindings. Toolbar ______________________________________________________________________________ >> Added a destructor to cancel the possibly pending after command request to display the popup help. >> Corrected the vertical packing such that items are expanded horizontally. Finddialog ______________________________________________________________________________ >> New iwidget. Finddialog works in conjunction with a text or scrolledtext widget to provide a means of performing search operations. The user is prompted for a text pattern to be found in the text or scrolledtext widget. The search can be for all occurances, by regular expression, considerate of the case, or backwards. >> Man page, test script, and demo have been produced. >> The catalog demo has been updated to include the finddialog demo. Panedwindow ______________________________________________________________________________ >> Corrected show/hide bug which caused the placement of the sash and separator to be incorrect. If you added a couple of panes and then hid them all of them followed by showing them, the sash distribution was wrong. >> Corrected a divide by zero problem which occurred when you hid all of the panes. Combobox ______________________________________________________________________________ >> Mitch Gorman (emrys@net-gate.com) has taken over maintenance of the combobox from John Sigler. >> Entry completion has been added. Should your typing in the entry field match an item in the list, it is completed for you automatically. This feature is switchable via the -completion option. The default is on. >> It now utilizes a true button for the arrowBtn component. >> The -state option has been fixed such that it can be truly disabled. >> Reimplemented geometry management using the grid instead of the packer. >> A -grab option has been added to do both local and global grabs of the drop-down listbox. >> POSSIBLE INCOMPATIBILITY - Removed -items option. This was originally put in as a convienence, but it turns out to be quite costly in terms of performance. It had to go. The insert/delete/get commands can be used instead which is much more in line with Tk. >> POSSIBLE INCOMPATIBILITY - The following options have been removed: -autoclear and -fliparrow. >> The combobox now utilizes built-in bitmaps for button glyphs. >> Removed the margin frame component used for implementing a margin between the entry and arrow button. This is now accomplished via the grid by maintaining an empty column for the margin and adjusting its minsize. >> List elements are preserved when switching between drop-down and simple styles via the -dropdown option. >> The functionality of the -state and -editable options have been made completely independent of each other. It can be editable/normal, non-editable/normal, or disabled, and toggling one option will not impact the other option when the first is toggled back >> Corrected the validation processing in the -unique option. >> Fixed various error messages returned due to bad arguments, options, etc. Fileselectionbox ______________________________________________________________________________ >> Reimplemented geometry management using the grid instead of the packer. >> Changed component option basis to be that of the "usuals". >> Removed frame components used for margins. This is now accomplished via the grid by maintaining an empty row/column for the margin and setting its minsize. >> Changed the default value of -nomatchstring to "". >> The directory and files lists are now shown without the leading directory name. Although this differs from the Motif standard, it keeps the fileselectionbox more in line with the tk_getSaveFile dialog. >> POSSIBLE INCOMPATIBILITY - The -style option which allowed you to display the fileselectionbox in a "notif" style using comboboxes for the filter and selection and kept the lists in a panedwindow has been removed. A related option, -dirsfraction is also gone. This feature caused the fileselectionbox to be much slower during construction than anticipated. If you liked the "notif" style, it exists in a new mega-widget call extfileselectionbox and extfileselectiondialog. >> POSSIBLE INCOMPATIBILITY - The childsite is now a protected component. If you need access to it, use the childsite command. >> POSSIBLE INCOMPATABILITY - The following options have been removed and are not directly available in the fileselectionbox anymore: -relief -repeatdelay -repeatinterval -labelmargin -hscrollmode -sbwidth -scrollmargin -vscrollmode -dirslabelpos -fileslabelpos -filterlabelpos -selectionimage- selectionlabelpos -filterfocuscommand -selectionfocuscommand -dbldirscommand -dblfilescommand The underlying components still maintain them , but not the fileselectionbox itself. You can still set them via the component command, i.e. ".fsb component dirs configure -hscrollmode none" >> POSSIBLE INCOMPATIBILITY - The -horizmargin and -vertmargin options have been removed. I doubt if anybody other than the most picky of people will be effected. >> Added new childsite position orientation settings. The new positions are n, s, e, w, top, bottom, and center. >> Updated the test script and man page. Extfileselectionbox ______________________________________________________________________________ >> New Iwidget. The extfileselectionbox is basically the "notif" portion of the previous version of the fileselectionbox. It was separated from the fileselectionbox for performance reasons. >> Created test script, demo and man page. >> The catalog demo has been updated to include the extfileselectionbox demo. Tabset ______________________________________________________________________________ >> Corrected tab display problem which was occurring on HP machines. Some additional updates were installed in tab selection and deselection. They will only be invoke should the os be HP-UX. Also, the ability to scroll the tabs via MB2 has been disabled for HPs. Thanks to tilt@designacc.com (Thomas Tempero) for first reporting the problem mikesz@pcs.mot.com (Michael Szilagyi) for sending me the fix which was implemented. Timefield ______________________________________________________________________________ >> New iwidget. The timefield is a smart time entry field. It verifies user time input prior to its display. Since it is derived from the labeledwidget, it also includes an optional label. >> Man page, test script, and demo have been produced. >> The catalog demo has been updated to include the timefield demo. Watch ______________________________________________________________________________ >> New iwidget. The watch widget displays a simple clock face. Methods exist to set/get the time. The hands can be adjusted via mouse selection with the new setting being retrievable via the get method. It is very configurable. The colors of the hands, face, and marks can all be changed to suit your needs. >> Many thanks to John Tucker who developed this nice widget. >> Man page, test script, and demo have been produced. >> The catalog demo has been updated to include the watch demo. Timeentry ______________________________________________________________________________ >> New iwidget. Timeentry, like the dateentry, is along the quicken lines as well. It displays a timefield with a watch icon button beside it. Selection of button presents a popup watch which enables you to select the time by dragging the hands about the face. The popup has a close button that removes the popup and sets the timefield to the value previously displayed in the watch. You can also just enter the time directly as you would in the standard timefield. >> Man page, test script, and demo have been produced. >> The catalog demo has been updated to include the timeentry demo. ========================================================================== -------------------------- iwidgets-2.1.1 ------------------------------ -------------------- CHANGES FROM iwidgets-2.1.0 ----------------------- ========================================================================== [incr Widgets] version 2.1.1 is compatable with itcl2.1 NEW FEATURES ------------------------------------------------------------------------------ >> Added pagecget method to notebook class. Patch supplied by Tom Tromey (tromey@cygnus.com). >> Added buttoncget method to buttonbox class. Patch supplied by Tom Tromey (tromey@cygnus.com). >> Added buttoncget method to dialogshell class. Patch supplied by Tom Tromey (tromey@cygnus.com). >> Added -closecmd option to the hyperhelp mega-widget. Previously, closing the hyperhelp widget deleted the object which was deemed to be user hostile. Now, there exists a -closecmd option which defaults to just deactivating the widget. Should you wish to destroy the widget, either do so explictly or modify the -closecmd to do it. BUG FIXES ------------------------------------------------------------------------------ >> Corrected selectborderwidth option class name in the toolbar The class name was set to SelectBorderWidth rather than BorderWidth. This created problems when attempting to use the toolbar with other widgets like the scrolledcanvas. Bug report by csmith@adc.com (Chad Smith). >> Allow negative indexes in scrolledlistbox Negative indicies are reasonable and valid. Bug report by wfarel@cas.org (Bill Farel). >> Corrected problem with caps-lock and num-lock in entryfields Validation was not being being done if the num-lock or caps-lock keys are down. Bug report by ronnie@r2d2.wink.com (Ronnie Carpio). >> Corrected problem with special character entry in entryfields Upon entry of a special character in the entry field like \ or [ an error would be reported: "Error: missing "". The substitutions being performed in iwidgets::Entryfield::_keyPress have been corrected. Bug report and patch provided by ronnie@r2d2.wink.com (Ronnie Carpio). >> Made the relayout method in pushbutton protected. The relayout method in the pushbutton needed to be changed from private to protected so parent classes can have access. Bug discovered by Mario Weilguni >> Corrected html tag parsing in scrolledhtml mega-widget Fixed regular expressions parsing html tags to ignore text in quotes and only examine first attribute in list. >> Corrected optionmenu insert bug The option menu would not allow you to insert an entry beyond the current length of the popup menu. It should just default to using the end in this case. >> Corrected scrolledtext import method newline insertion problem There was a bug in the scrolledtext widget. It always inserted a newline before the text of the file when doing an "import". And it didn't correctly preserve a trailing newline on the file. Reported by Tom Tromey (tromey@cygnus.com) >> Corrected minor problems in notebook class. The index method gave an error if (eg) "select" wass passed but there is no selection. Instead it should return -1 as documented. Changed it to always return -1 in case of error. This makes more sense. If there are no items in the notebook, the -scrollcommand should still be run (if it is set). Otherwise, you end up with a scrollbar that looks odd, and when you try to scroll you get errors. Changed it so that it will tell the scrollbar that the entire notebook is being displayed. Reported by Tom Tromey (tromey@cygnus.com) >> Corrected menubar menucget command to return errors for bad options. The command " menucget .element" returned something other than an error message. This has been corrected. Reported by Tom Tromey (tromey@cygnus.com) >> Corrected menubar man page. The usage for the menubar menucget command was wrong and has been fixed. Reported by Tom Tromey (tromey@cygnus.com) INCOMPATIBLE CHANGES ------------------------------------------------------------------------------ ========================================================================== -------------------------- iwidgets-2.1.0 ------------------------------ -------------------- CHANGES FROM iwidgets-2.0.1 ----------------------- ========================================================================== [incr Widgets] version 2.1.0 is compatable with itcl2.1 NEW FEATURES ------------------------------------------------------------------------------ >> Eliminated unneeded update idletask calls. Went through many of the [incr Widgets] and got rid of those update idletask calls that were not really needed. This should speed a few of them up a bit. >> The hyperhelp mega-widget has been enhanced such that topic items don't need to be in the help directory. It's just an added option in specifying topics. To use it, you would replace '-topics {topic1 topic2 topic3}' with '-topics {topic1 {topicname2 filename2} {topic3 filename3}}'. In other words, you only have to change where you want to specify a pathname. If you don't specify a filename, everything works the same. >> Added a -autoclear option to the combobox. The combobox was doing an automatic erasure of the entry field contents upon hitting return. With this option, you can turn that off but it still puts the string in the list. >> Added a -master option to the shell class. The shell made all instances transient with "." as the master. With this option, you can change the master to other toplevels. The default is no master for shells, and "." for all dialogs which are derived from shell. >> Added a -style option to the fileselectionbox and fileselection dialog. Tony Parent did a great job of augmenting the fileselectionbox with a style option that allows you to change the layout from the standard motif look-and-feel to a better than motif layout. This new layout is called notif and features comboboxes for the filter and selection entry fields and a paned window contains the two listboxes allowing you to change the allocation of space for the lists. >> Removed the center childsite position for the fileselectionbox. This is a side effect of the notif change made by Tony Parent. It just isn't easy to have a center position when your in a pane window. It is a small sacrifice for the having an alternate layout of the fileselectionbox. BUG FIXES ------------------------------------------------------------------------------ >> The makefile was amended to install the unknown.gif file correctly. The hyperhelp and scrolledhtml widgets need an unknown gif file that is used when unable to load an image. The makefile was not properly installing it. >> The scrolledhtml.n man page was fixed to allow man2html to work. The scrolledhtml.n file had a bug which would hang man2html during a "make install-html". The bug affected only the htmling of the file not the man page itself. INCOMPATIBLE CHANGES ------------------------------------------------------------------------------ ========================================================================== -------------------------- iwidgets-2.0.1 ------------------------------ -------------------- CHANGES FROM iwidgets-2.0.0 ----------------------- ========================================================================== [incr Widgets] version 2.0.1 is compatable with itcl2.0 NEW FEATURES ------------------------------------------------------------------------------ >> Added extra frame around canvas widget in Scrolledcanvas class The borderwidth, relief, and hightlight options have been removed from the canvas widget and placed on the new encompassing frame widget. This fixes the problem with canvas widgets including the border and highlight ring in the clipping region. >> Added extra frame around text widget in Scrolledtext class The borderwidth, relief, and hightlight options have been removed from the text widget and placed on the new encompassing frame widget. This fixes the problem with text widgets including the border and highlight ring in the clipping region. >> The canvasprintbox stamp supports resizing and default print buttons Tako Schotanus updated the canvasprintbox such that the stamp now gets updated whenever the window is resized. Also, he modified the dialog default buttons to be Print, Apply and Cancel. Apply does a refresh and Print does what you'd expect. >> Added feedback mega-widget to [incr Widgets] The feedback widget is a gage for displaying process status. Display is given as a percentage and as a thermometer type bar. Options exist for adding a label and controlling its position. Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his feedback.tcl code from tk inspect. The original code is copyright 1995 Lawrence Berkeley Laboratory. >> Added scrolledhtml mega-widget to [incr Widgets] The scrolledhtml widget implements a scrollable html text widget through inheritance from scrolledtext. Import reads from an html file, while export still writes plain text. Also provides a render command, to display html text passed in as an argument. Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his tkhtml.tcl code from tk inspect. The original code is copyright 1995 Lawrence Berkeley Laboratory. >> Added hyperhelp mega-widget to [incr Widgets] The hyperhelp widget implements a help facility using html formatted hypertext files. Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his help.tcl code from tk inspect. >> Added menubar mega-widget to [incr Widgets] Actually it was kind-of already an iwidget. It was living in the incoming directory for a time. No one had a complaints about it so now it is a full citizen. BUG FIXES ------------------------------------------------------------------------------ >> Corrected spurious quote in toolbar.itk Thanks to Tom Tromey for finding this elusive little buglet and sending the patch. Wish all problems were reported in this manner. >> Corrected problem with dialogs being unable to acquire a grab. The dialogshell activate method would generate an error if unable to acquire a grab for application and global modal dialogs. The fix installed adds a catch and a reattempt loop with a delay. In other words, the dialog shell will continuously attempt to acquire the grab with a delay between attempts. >> Corrected problem with pushbutton not displaying the tab traversal ring. The pushbutton would not display the tab traversal ring when the default ring was enabled. This has been corrected. >> Corrected scrolledlistbox getcurselection method with multiple selectmode. If the current scrolledlistbox selectmode is multiple, then the getcurselection method should always return the selected items as a list, regardless of the number of items selected. It used to return a list only if more than one item is selected. >> Buttonbox wasn't adjusting geometrically following hides if not mapped. Bernard Johnson from TI was good enough to find this one. It could be seen by creating a dialog, activating, deactivating, then hiding a button. Next, activate it again and you'd notice that the dialog's buttonbox had not been resized. The problem was that the resizing of the buttonbox was bound to the map event, which once mapped, was removed when it shouldn't have been. >> Buttonbox wasn't adjusting properly following button additions which were preceeded by deletions. Greg McFarlane found this one. The buttonbox needed to do perform and update idletasks following the sizing of the box during a deletion. Otherwise, the values returned by winfo were incorrect during a subsequent button addition. >> Removed underlining of listbox items in the combobox. Milind Khandekar requested that this feature be removed. It was annoying. INCOMPATIBLE CHANGES ------------------------------------------------------------------------------ ========================================================================== -------------------------- iwidgets-2.0.0 ------------------------------ -------------------- CHANGES FROM iwidgets-2.0b4 ----------------------- ========================================================================== [incr Widgets] version 2.0.0 is compatable with itcl2.0 NEW FEATURES ------------------------------------------------------------------------------ >> The copyright has been assigned to DSC Communications Corporation. The copyright has been transferred from private individuals to DSC. It is still an open copyright, just changes in the legalize wording. >> Added several new mega-widgets. The new mega-widgets include the toolbar, tabnotebook, tabset, and notebook. Check the man pages for details. >> Added demo catalog. The demos directory now contains a catalog program. It displays the code for each demo upon single select. Double-click starts the demo. >> Added incoming directory for experimental mega-widgets. An incoming directory exists in the distribution which contains beta state mega-widgets. They are not installed, but do include the needed doc, demos, and tests. These mega-widgets may or may not make the cut. Please send feedback on their viability. If enough positive response is felt, then they will be moved up. Otherwise, I'll move them to an outgoing directory and later delete them altogether. >> With the introduction of the new itcl-2.0b3 code command, the following changes were required. All "bind" and "after" commands now use "code". All "-command" options and scrollbar commands now use "code". Removed "uplevel /scope" combinations from command type options. Replaced "eval" with "uplevel #0" for evaluation of command options. >> Added curselection method to selectionbox and selectiondialog class. The curselection command from the contained listbox of the selectionbox has been thinwrapped. >> Removed BLT dependency for implementing application modal dialogs. The dialogshell class no longer uses blt_busy for application modal dialogs. Instead, local grabs are performed. The benefits are speed and extension independence. Minus is the loss of the watch cursor which blt_busy used. I figure, programmers wanting the cursor action can implement it themselves on an as needed basis. >> Added a grab stack in the dialogshell. The dialogshell uses a grabstack to keep track of the current blocking levels. Thus a application modal dialog can activate another one and upon closing the last one, the next one in the stack gets the block. This feature did not exist before. >> Replace "after 1" commands with "after idle" This produces the same result, but makes for a cleaner syntax. >> Added center command to the dialogshell. The dialogshell provides a center command which takes an optional argument of the path for another widget. Upon activation, the dialogshell will be centered with respect to it. The command may also be invoked with no arguments to center the dialogshell on the screen as a whole. Since all other dialog classes are derived from dialogshell, all dialogs now have the center command available. >> Made the Help button hidden by default for dialogs Most people turn it off right away anyway. It is still there. Just need to do a "show Help" if you need it back. >> Comboxbox now derived from entryfield. The combobox structure has been modified to be derived from the entryfield class. Now combobox labels can be aligned using the labeledwidget alignlabels method along with optionmenus, entryfields and such. >> Added -justify and -wraplength to Messagedialog. The justify and wraplength options are now kept for the label in the messagedialog widget. >> Added a man page generator for itcl. In the doc directory is a new utility called mkitclman. It does a good job at an initial pass of man page generation for new iwidget classes. You still need to get in there and beef up the man page which is produced, but it is better than starting from scratch. >> Added the canvasprintbox and canvasprintdialog mega-widgets. Two new mega-widgets, canvasprintbox and canvasprintdialog, have been contributed to [incr Widgets]. Thanks to Tako Schotanus, Tako.Schotanus@bouw.tno.nl. >> Added the textbackground option to the scrolledcanvas widget The textbackground option has been added to the scrolledcanvas widget similarly to the scrolledlistbox and entryfield widgets. BUG FIXES ------------------------------------------------------------------------------ >> Enabled repeat action in spinners. This was available in iwidgets two versions ago. I made in incorrect merge and lost the change. It has now been added back into the spinner. >> Eliminated use of #auto in panedwindow. Using #auto made the test script fail should you run it two times in a row. Instead, the class keeps its own unique counter which is always reset upon construction. This was more of an annoyance than a bug. >> Corrected selection problem in selectiondialog. The selectiondialog wasn't configuring the itemscommand properly, so selection of an item was not reflected in the selection entryfield. >> Corrected index usage problem in buttonbox insert method. The buttonbox insert method didn't correctly convert the index argument prior to inserting the new pushbutton. This has been fixed. >> Corrected flicker problem in scrolled* widgets. Modified the scrolled* widgets to only change the current scrollbar display if different than the current setting. This fixes the flicker problem which was apparent during horizontal scrolling. >> Entryfield command option performs a break. Following evaluation of the command option for entryfield widgets, a break is performed. This caused a problem when entryfields were in a dialog. Hitting return in the entryfield, invoked the dialogs default button. This has been fixed. INCOMPATIBLE CHANGES ------------------------------------------------------------------------------ >> Removed -highlightbackground option from mega-widgets All the -highlightbackground options have been renamed to be -background. This was always an annoyance anyway. Now, setting the -background changes all the highlightbackgrounds as well. Should anybody still for some odd reason need -highlightbackground, just access the component with the "component name configure" command. ========================================================================== -------------------------- iwidgets-2.0b0 ------------------------------ -------------------- CHANGES FROM iwidgets-2.0b1 ----------------------- ========================================================================== [incr Widgets] versions b1, b2, b3, and b4 are compatable with itcl-2.0b2 NEW FEATURES ------------------------------------------------------------------------------ >> A secondary lower case mega-widget command now exits. Mega-widgets can now be created using the new lower case, more tk'ish method or still using the class name. Entryfield .ef and entryfield .ef both perform the same operation. >> The demos should now all work. The correct wish is now called. itkwish instead of the old itcl_wish. >> The man pages have all been updated to the best of my ability. >> A new more minimal format for the code style has been implemented. The class declaration only contains declarations. All implementation is spearate. This creates a much more readable class. >> All class file names as well as the tests, doc, and demos are all lower case. >> Several new validate types such as hexidecimal and real have been added to the Entryfield. >> The Panedwindow class additional commands: A paneconfigure command exists for configuring indiviual tagged panes. panedwindow .pw .pw add first .pw add last .pw paneconfigure first -margin 10 An insert command exists. It takes an index and tag as arguments followed by optional arguments to be applied to the pane. .pw insert end second -minimum 20 >> The Buttonbox class now has additional commands: A buttonconfigure command exists for configuring indiviual tagged buttons. buttonbox .bb .bb add OK -text OK .bb add Cancel -text Cancel .bb buttonconfigure OK -command [list puts OK] An insert command has been added. It takes an index as the first arg, followed by the tag and button arguments. .bb insert Cancel Apply -text Apply The invoke command no long excepts a list of buttons to invoke. That didn't make much sense. It takes an optional index for a single button to invoke. Without any arguments, the default button is invoked. BUG FIXES ------------------------------------------------------------------------------ >> Corrected scrolled* packing The packing order of all the scrolled* mega-widgets has been modified such that the scrollbars are the last to be clipped. >> Corrected buttonbox single button centering The buttonbox has been modified such that a box with only one button will be correctly centered. >> scrolledlist selection corrected The -selectioncommand is now invoked following any selection of an item, regardless if it was already selected. The programmer must now determine if the selected item has changed if necessary. The previous approach of only invoking the -selectioncommand if the selection has changed caused too many problems, making it behave erraticly. >> Corrected problems preventing classes being derived from scrolled* classes Several variables were incorrectly declared to be private rather than protected. Also, the _scroll* method was incorrectly declared private instead of protected. These problems prevented inheritance from the scrolled* classes. INCOMPATIBLE CHANGES ------------------------------------------------------------------------------ >> The class names are now upper case on the first character only. Class names have been changed to be upper case on the first character only to be more X'ish. Old class names like EntryField are now Entryfield. >> All public methods are now all lowercase. This effects the typical common method such as childsite. Others effected include : ::iwidgets::Labeledwidget::alignlabels >> Labeledwidget class changes: The -labelon option has been removed. The mega-widget now unpacks both the label and margin if neither the -labeltext, -labelbitmap, or -labeimage have a value. The -font option has been removed. The -labelfont option should be used instead. >> Entryfield class changes: The -labelon option is not inherited by the Entryfield anymore. See the Labeledwidget changes above. The Entryfield fixed option has a different meaning. It now specified the maximum number of characters allowed. A value of zero is unlimited. This frees up the width option to be able to specify a greater number of characters than the fixed amount for visual effect. The -type and -validate options have been combined to just -validate which now takes either a type keyword or a command. The command receives additional trailing arguments consisting of the input character and the the widget. I hope to change this soon to use substitutions like %c for the character at a later date. The -background option has been removed. The -textbackground option should be used instead. The -validate option now has several substitution strings which may be passed to the validation script. >> ScrollBar class changes: It has been deleted. It wasn't a big win. The only benefit was that the -background option automatically calculated the troughcolor at 80% of its value. It's just as easy to use the option database and change the Tk scrollbar troughcolor to whatever value is desired. The various scrolled* classes now all use the straight Tk scrollbar. >> Panedwindow class changes: Panes are now tagged. This means the add, and insert methods take an additional argument which is the tag for that pane. The panedwindow index method now takes the tag as well as the number and keyword "end". Other methods such as delete, hide, and show now can use the pane tag as an index. panedwindow .pw .pw add bottom .pw insert 0 top .pw insert 1 middle .pw delete middle The refresh method has been renamed to reset. The semi-private -state option has been removed. The only method of controlling the display of panes is via the hide and show methods. >> Dialogshell class changes: The modality option value of "system" has been renamed to be "global" >> Dialog class changes: All the options for the buttons have been removed. The buttonconfigure method should be used instead. The class simply creates the standard OK, Apply, Cancel, and Help buttons tagged by their default labels. The buttonconfigure method can be used to make modifications to the buttons. The hide and show methods should now be used instead of the the -disp* options. dialog .d .d buttonconfigure OK -text Enter .d hide Help .d hide Apply The -orient option is no longer kept. It seemed rarely used if at all. The -buttonboxpos option handles the mojority of the cases as is. >> Scrolledcanvas class changes: The binditem method is now been renamed back to bind. This is what it should have been all along. A problem in the alpha version of [incr Tcl] prevented use of this word. iwidgets-4.1.0/ChangeLog0000644003604700454610000014412411602441614013505 0ustar dgp771div2011-06-28 Andreas Kupries * configure.in: Modified --with-itcl to look for DIR/library/itcl.tcl, not DIR/itcl/library/itcl.tk. Further added the option --with-itk to look for DIR/library/itk.tcl. Done to handle the split of the itcl/itk CVS repository into two fossil repositories. * configure: (Regenerated). 2008-08-20 Jeff Hobbs * generic/disjointlistbox.itk (::iwidgets::disjointlistbox): fix 8.5 grid anchoring. [Bug 2062394] 2007-06-10 Jeff Hobbs * generic/shell.itk (::iwidgets::shell): fix problem with "tkwait visibility" in iwidget's dialog box (allaert) * generic/pushbutton.itk (::iwidgets::pushbutton): handle Tk 8.4 frame padx/y changes. * iwidgets.tcl.in: don't add non-existent path to auto_path * generic/datefield.itk (::iwidgets::datefield): use string match instead of regexp 2007-05-24 Jeff Hobbs * generic/combobox.itk: use -state readonly for combobox. [Bug 998874] (griffin) * generic/calendar.itk: 8.5-compatible last day of month calculation. [Bug 1311531] (broeken) * demos/catalog: make location independent. [Bug 1631754] (kupries) 2006-04-11 Jeff Hobbs * generic/extfileselectionbox.itk (iwidgets::Extfileselectionbox::_setDirList): set currentIndex to default value 2005-04-11 Jeff Hobbs * configure, tclconfig/tcl.m4: TEA 3.2 update * configure.in (AC_PROG_INSTALL): add back @INSTALL*@ check 2005-01-24 Jeff Hobbs * tclconfig/install-sh, tclconfig/tcl.m4 (new): * tcl.m4 (removed): * Makefile.in, aclocal.m4: Updated to TEA 3.1 build system * configure, configure.in: * iwidgets.tcl.in, pkgIndex.tcl.in: 2002-10-25 Andreas Kupries * configure.in: Added determination of EXEEXT or else SC_PROG_TCLSH may pick up the wrong file as executable (In my case it mistook tclsh83g.pdb for the tclsh). Regen'd configure. 2002-09-25 Jeff Hobbs * Makefile.in: improved libdir support (steffen) 2002-09-22 Marty Backe * generic/shell.itk: SF ticket 611739 Changed _return from a private to protected. * generic/entryfield.itk bindings are now passed to the parent unless the -command option is defined. 2002-09-09 Chad Smith ******************************** **** IWIDGETS 4.0.1 RELEASE **** ******************************** * Makefile.in: SF ticket 227921 Updated man page installation such that "iwidgets_" is now prepended to the man page filename. This is done to avoid naming conflicts with man pages in other extensions. 2002-09-09 Chad Smith * generic/scrolledtext.itk * doc/scrolledtext.n * doc/scrolledhtml.n * demos/html/scrolledtext.n.html * demos/html/scrolledhtml.n.html * tests/scrolledtext.test * tests/scrolledhtml.test SF ticket 532602: added -tabs to scrolledtext (and scrolledhtml due to inheritance) 2002-09-08 Marty Backe * generic/combobox.itk Fixed SF bug 501300 - keyboard navigation was not working properly if any items were null 2002-09-06 Chad Smith * generic/hierarchy.itk: SF ticket 596111 After reconfiguring -querycommand, the text component lost its tag configuration. Added code to reset the hilite, lowlite, and info tags. 2002-09-05 Chad Smith * generic/hierarchy.itk: SF ticket 600941 Marked node lost its highlighting when parent folder closed and reopened 2002-09-05 Chad Smith * generic/canvasprintbox.itk: SF ticket 560153 Wouldn't print to a filename other than "canvas.ps". 2002-09-05 Chad Smith * generic/tabnotebook.itk: SF ticket 514222 Patch added for infinite loop problem introduced by new -padx and -pady Tk frame widget options in 8.4 2002-09-05 Chad Smith * generic/tabnotebook.itk: SF ticket 603823 Patch for bugs related to the -int option * generic/calendar.itk: SF ticket 603823 Found bug while testing the dateentry patch. Several methods expected -int to be set to "yes" or "no" 2002-03-24 Marty Backe * generic/disjointlistbox.itk Applied patch sumitted by Brett Schwarz to add two new sort options which determine how items are added to each scrolledlistbox. Did some various code formatting cleanup. * doc/disjointlistbox.n Updated the man page to reflect the addition of the two sort options. * demos/html/disjointlistbox.n.html Updated the html version of the man page * tests/disjointlistbox.test Added tests for the the two new options. 2002-03-19 Marty Backe * generic/messagebox.itk Modified the save method to center the tk_getSaveFile dialog on the messagebox window. 2002-03-16 Marty Backe * generic/scrolledlistbox.itk: SF Patch 494696 Applied patch submitted by Brett Schwarz to change the sort method to accept any sort arguments allowed by Tcl's lsort. Modified patch to generate an appropriate error message if an invalid sort argument is provided. * doc/scrolledlistbox.n Updated the man page to reflect the new sort arguments. * demos/html/scrolledlistbox.n.html Updated per change to doc/scrolledlistbox.n * tests/scrolledlistbox.test Updated the 'fail test' to reflect the new error message generated by an invalid sort argument. * tests/combobox.test Updated the sort 'failed test' to reflect the new error message generated by an invalid sort argument. Fallout from patch to scrolledlistbox.itk. See above. 2002-03-15 Marty Backe * generic/messagebox.itk Fixed a couple of bugs relating to the popup menu 'Save' function: 1) The filename that was saved to was also echoed to the messagebox. Unfortunately the variable referenced was not valid, so a stack trace followed any Save operation. 2) The message 'issued' to the messagebox from item 1) above used the tag INFO, which doesn't exist by default. I choose to remove the 'issue' after a file Save. The widget really shouldn't contribute anything to the messagebox output. The user of the messagebox iwidget should have control over what gets displayed. Changed the 'export' method to directly use the scrolledtext 'export' method instead of re-implementing it within this widget. Rearranged the layout of the popup menu. Moved the 'Clear' menu to the end of the list. It was too easy to generate the popup and accidentally choose the 'Clear' function. * generic/hyperhelp.itk Removed the 'error' statement that would cause any application that used Hyperhelp to stacktrace if a file to be rendered couldn't be opened. It's now just a silent error. Perhaps a -errorcommand option could be added later. 2002-03-10 Marty Backe * generic/extfileselectionbox.itk: SF ticket 482080 Fixed SF ticket 482080 - wrapped _pwd in quotes Fixed newly discovered bug: When the current directory contains a directory named after a punctuation mark (e.g., ! '). Method _setDirList was always setting the Dir listbox selection to index 0, which is normally ".", unless the directory contains a directory named after a punctuation mark. Now it gets set to "." regardless. 2002-02-26 Marty Backe * generic/radiobox.itk: SF ticket 521332 Fixed various bugs: 1) Traces weren't being released when the object was destroyed. 2) Small memory leak - _modes($this) array element not deleted when the object was destroyed. 3) If the -command option was defined, the command would be triggered when the first radiobutton was added via the add method. Added a destructor to fix bugs 1 & 2. Modified the constructor to fix bug 3. * generic/extfileselectiondialog.itk: SF ticket 521335 Added the -sashcursor option (was already defined in the man page, but wasn't implemented). * tests/radiobox.test: Added test to check for bug number 3 above. * tests/extfileselectiondialog.test: Added 2 option tests for -sashcursor & -labelfont. Updated the option count test. 2002-02-24 Marty Backe * generic/datefield.itk Fixed bugs introduced in previous patch - unbraced 'if' conditionals * generic/tabset.itk Fixed bug introduced in previous patch - 'code' used instead of 'itcl::code'. * generic/shell.itk: SF ticket 521338 The 'center' method now properly centers windows that have been resized between calls to center. * generic/scrolledlistbox.ikt: SF ticket 521326 The binding was removed to eliminate multiple triggers of the command specified by the -selectioncommand option if the mouse is moved while the item is being selected. 2002-02-16 Marty Backe * generic/scrolledhtml.itk: SF ticket 481956 Fixed potential for lengthy page renderings to throw a bgerror. 2001-12-11 Chad Smith * generic/combobox.itk: SF ticket 474817 Fixed an auto-completion problem. 2001-12-07 Chad Smith * generic/tabset.itk: Added patch submitted by Reinhard Max to optimize tab addition. 2001-11-29 Chad Smith * configure.in: * Makefile.in: SF tickets 462528 and 486735 Removed a lot of unnecessary variables. Updated configure.in so that autoconf-generated version matches the configure script that is included (thanks Andreas). Removed --with-itk and changed --with-itcl to be required if Iwidgets is not installed direcly underneath toplevel Itcl directory. 2001-09-20 Chad Smith * generic/shell.itk: SF ticket 227885 Added an 'update idletasks' to flush the event loop after activating a shell iwidgets. 2001-09-18 Chad Smith * generic/radiobox.itk: SF ticket 227923 Added code to keep users from modifying -variable and -value radiobutton component options. 2001-09-17 Chad Smith * generic/entryfield.itk: SF ticket 227912 Corrected some pasting problems. 2001-09-14 Chad Smith * generic/tabset.itk: SF ticket 460879 Commented out a line of code to keep the tab from forcing focus on the hull frame on . 2001-09-14 Chad Smith * generic/tabnotebook.itk: SF tickets 452803 and 461471 Had to do an "undo" of some previous code that was causing an infinite resizing on events. 2001-08-07 Chad Smith ******************************** **** IWIDGETS 4.0.0 RELEASE **** ******************************** * Merged iwidgets_overhaul branch to CVS head. This branch included all modifications necessary to extract the iwidgets from the itcl distribution. 2001-07-17 Jeff Hobbs * Makefile.in: removed attempt to install $(GENERIC_DIR)/*.tcl from install-libraries target as there aren't any .tcl files there since the removal of generic/scopedobject.tcl. This was resulting in an error on install. 2001-05-24 davygrvy * ChangeLog (added): Auto gen'd this from output of `cvs log`. This will help us make a nice quality digest of the changes done for a release. 2001-05-23 davygrvy * .cvsignore: * configure: * configure.in: Updated patch level to 3.0.2 in prep for a release. 2001-05-22 davygrvy * win/iwidgets.tcl: * win/makefile.vc: * win/pkg.vc: makefile.vc actually works again. * win/pkgIndex.tcl: we'll auto gen these from the makefile * win/makefile.vc: got catalog.tcl installing 2001-05-21 davygrvy * demos/demo.html: Moved change on the old iwidget3.0.0 to the new repository tree for Iwidgets 2001-05-19 davygrvy * generic/menubar.itk: * generic/tabnotebook.itk: Moved Chad's changes to the new repository files from the old iwidgets3.0.0 2001-05-18 davygrvy * generic/scopedobject.tcl: removed due to copy 2001-04-25 davygrvy * generic/colors.itk: * win/catalog.bat: * win/makefile.bc: * win/tclIndex: cleaning of prior 2.2.0 import to match the correct HEAD * CHANGES: * Makefile.in: * README: * aclocal.m4: * configure: * configure.in: * demos/buttonbox: * demos/canvasprintdialog: * demos/catalog: * demos/combobox: * demos/demo.html: * demos/dialog: * demos/dialogshell: * demos/entryfield: * demos/feedback: * demos/fileselectionbox: * demos/fileselectiondialog: * demos/html/buttonbox.n.html: * demos/html/canvasprintbox.n.html: * demos/html/canvasprintdialog.n.html: * demos/html/combobox.n.html: * demos/html/dialog.n.html: * demos/html/dialogshell.n.html: * demos/html/entryfield.n.html: * demos/html/feedback.n.html: * demos/html/fileselectionbox.n.html: * demos/html/fileselectiondialog.n.html: * demos/html/hyperhelp.n.html: * demos/html/iwidgets2.2.0UserCmds.html: * demos/html/labeledwidget.n.html: * demos/html/menubar.n.html: * demos/html/messagedialog.n.html: * demos/html/notebook.n.html: * demos/html/optionmenu.n.html: * demos/html/panedwindow.n.html: * demos/html/promptdialog.n.html: * demos/html/pushbutton.n.html: * demos/html/radiobox.n.html: * demos/html/scrolledcanvas.n.html: * demos/html/scrolledframe.n.html: * demos/html/scrolledhtml.n.html: * demos/html/scrolledlistbox.n.html: * demos/html/scrolledtext.n.html: * demos/html/selectionbox.n.html: * demos/html/selectiondialog.n.html: * demos/html/shell.n.html: * demos/html/spindate.n.html: * demos/html/spinint.n.html: * demos/html/spinner.n.html: * demos/html/spintime.n.html: * demos/html/tabnotebook.n.html: * demos/html/tabset.n.html: * demos/html/toolbar.n.html: * demos/hyperhelp: * demos/images/mag.gif: * demos/images/poly.gif: * demos/images/ruler.gif: * demos/images/select.gif: * demos/iwidgets.gif: * demos/labeledwidget: * demos/menubar: * demos/messagedialog: * demos/notebook: * demos/optionmenu: * demos/panedwindow: * demos/promptdialog: * demos/pushbutton: * demos/radiobox: * demos/scrolledcanvas: * demos/scrolledframe: * demos/scrolledhtml: * demos/scrolledlistbox: * demos/scrolledtext: * demos/selectionbox: * demos/selectiondialog: * demos/spindate: * demos/spinint: * demos/spinner: * demos/spintime: * demos/tabnotebook: * demos/tabset: * demos/toolbar: * doc/buttonbox.n: * doc/canvasprintbox.n: * doc/canvasprintdialog.n: * doc/combobox.n: * doc/dialog.n: * doc/dialogshell.n: * doc/entryfield.n: * doc/feedback.n: * doc/fileselectionbox.n: * doc/fileselectiondialog.n: * doc/hyperhelp.n: * doc/iwidgets.ps: * doc/labeledwidget.n: * doc/man.macros: * doc/menubar.n: * doc/messagedialog.n: * doc/mkitclman: * doc/notebook.n: * doc/optionmenu.n: * doc/panedwindow.n: * doc/promptdialog.n: * doc/pushbutton.n: * doc/radiobox.n: * doc/scrolledcanvas.n: * doc/scrolledframe.n: * doc/scrolledhtml.n: * doc/scrolledlistbox.n: * doc/scrolledtext.n: * doc/selectionbox.n: * doc/selectiondialog.n: * doc/shell.n: * doc/spindate.n: * doc/spinint.n: * doc/spinner.n: * doc/spintime.n: * doc/tabnotebook.n: * doc/tabset.n: * doc/tk2html: * doc/tk2html.awk: * doc/tk2html.perl: * doc/tk2html2.awk: * doc/toolbar.n: * generic/buttonbox.itk: * generic/canvasprintbox.itk: * generic/canvasprintdialog.itk: * generic/colors.itk: * generic/combobox.itk: * generic/dialog.itk: * generic/dialogshell.itk: * generic/entryfield.itk: * generic/feedback.itk: * generic/fileselectionbox.itk: * generic/fileselectiondialog.itk: * generic/hyperhelp.itk: * generic/labeledwidget.itk: * generic/menubar.itk: * generic/messagedialog.itk: * generic/notebook.itk: * generic/optionmenu.itk: * generic/pane.itk: * generic/panedwindow.itk: * generic/promptdialog.itk: * generic/pushbutton.itk: * generic/radiobox.itk: * generic/scrolledcanvas.itk: * generic/scrolledframe.itk: * generic/scrolledhtml.itk: * generic/scrolledlistbox.itk: * generic/scrolledtext.itk: * generic/selectionbox.itk: * generic/selectiondialog.itk: * generic/shell.itk: * generic/spindate.itk: * generic/spinint.itk: * generic/spinner.itk: * generic/spintime.itk: * generic/tabnotebook.itk: * generic/tabset.itk: * generic/tclIndex: * generic/toolbar.itk: * generic/unknownimage.gif: * incoming/README: * incoming/doc/man.macros: * incoming/tests/all: * incoming/tests/defs: * iwidgets.tcl.in: * license.terms: * outgoing/README: * pkgIndex.tcl.in: * tests/all: * tests/all.tcl: * tests/buttonbox.test: * tests/canvasprintbox.test: * tests/canvasprintdialog.test: * tests/combobox.test: * tests/defs: * tests/dialog.test: * tests/dialogshell.test: * tests/entryfield.test: * tests/feedback.test: * tests/fileselectionbox.test: * tests/fileselectiondialog.test: * tests/hyperhelp.html: * tests/hyperhelp.test: * tests/labeledwidget.test: * tests/menubar.test: * tests/messagedialog.test: * tests/notebook.test: * tests/optionmenu.test: * tests/panedwindow.test: * tests/promptdialog.test: * tests/pushbutton.test: * tests/radiobox.test: * tests/scrolledcanvas.test: * tests/scrolledframe.test: * tests/scrolledhtml.test: * tests/scrolledlistbox.test: * tests/scrolledtext.test: * tests/selectionbox.test: * tests/selectiondialog.test: * tests/shell.test: * tests/spindate.test: * tests/spinint.test: * tests/spinner.test: * tests/spintime.test: * tests/tabnotebook.test: * tests/tabset.test: * tests/toolbar.test: * tests/usual.test: * win/catalog.bat: * win/iwidgets.tcl: * win/makefile.bc: * win/makefile.vc: * win/pkgIndex.tcl: * win/tclIndex: import of current 2.2.0 * win/pkg.vc: moved the info about the iwidget version for makefile.vc 2001-04-04 smithc * generic/menubar.itk: Fixed stack trace that would occur if the programmer attempted to create two menu items with the same command name. 2000-12-19 smithc * generic/combobox.itk: Fixed 3 bugs: 1) bug with -state config option 2) added some performance enhancements 3) added code to restore grabs following dropdown listbox unmap 2000-12-06 smithc * generic/hierarchy.itk: Added patches submitted by Martin Backe on 12/5/00. One was for a memory leak in the clear() method, and the other was to correct %n substitution in the _select() method. * doc/hierarchy.n: Added -selectcommand to the man page. 2000-08-25 csmith * generic/scrolledlistbox.itk: Patch submitted by Shaun Lowry - I don't know the ticket number, but here's part of the ticket description: Name: Shaun Lowry email: slowry@iss.net Support: Gold Severity: 2 OperatingSystem: Windows NT OperatingSystemVersion: NT4 SP6 Machine: Beige :-) (home built PC) Synopsis: scrolledlistbox "pattern" based selection doesn't work properly ReproducibleScript: package require Iwidgets iwidgets::scrolledlistbox .f .f insert end "friendly" .f insert end "hostile" .f get host* .f get friend* 2000-08-22 welch * configure: * configure.in: Bumped version number to 3.0.1 (PARTS LIST NOTICE) * generic/scrolledlistbox.itk: Added catch around -listvariable option so this can be used with older versions of Tk that do not have this option on listboxes. 2000-08-17 csmith * generic/timeentry.itk: Same problem as dateentry. See documentation for dateentry version 1.2 in CVS. I don't have a ticket number. -chad smith * generic/dateentry.itk: While documenting the iwidgets last year in my book, I came across a bug where destroying a component didn't remove it from the composite options list. I told Michael about it, and he's fixed it in 3.2. This broke the dateentry because it was explicitly unsetting the component from the itk_component array. I simply deleted that line of code. I need to make a pass at the rest of the iwidgets to see which other ones were also unsetting the component. -chad smith 2000-08-08 csmith * generic/hierarchy.itk: Several enhancements and bug fixes added by Doug Howard. Doug added the following configuration options: -dblclickcommand -icondblcommand -imagecommand -imagedblcommand -imagemenuloadcommand -textmenuloadcommand He also added two public methods: expanded and expState. Multiple non-public methods were added to support the new configuration options. I have updated the man page for each new option and public method. * doc/hierarchy.n: Man page updated per the additional configuration options and public methods added by Doug Howard. * tests/hierarchy.test: Needed to change the number of configuration options per additions by Doug Howard so hierarchy would pass the 'make test'. 2000-08-07 welch * configure: Ran autoconf 2000-08-02 welch * Makefile.in: * configure: Changed this to use installFiles.tcl instead of install-sh 2000-07-29 welch * configure: * configure: Ran autoconf 2000-07-14 welch * configure: Updated configure 2000-07-06 mmc * generic/timefield.itk: * tests/all: * tests/all.tcl: * tests/defs: * tests/menubar.test: * tests/notebook.test: * tests/tabnotebook.test: * tests/tabset.test: * tests/toolbar.test: * unix/Makefile.in: * unix/configure.in: * unix/install-sh: * unix/iwidgets.tcl.in: * unix/pkgIndex.tcl.in: 6/26/00 (bug fix) Fixed Itcl_ClassVarResolver so that the formal parameters in a method/proc take precedence over class data members. 6/30/00 (bug fix) Fixed all itcl/itk/iwidgets3.0.0 tests to run cleanly with the new tcltest package. 7/1/00 (bug fix) Fixed "itk_component delete" so that the composite option list is cleaned up whenever a component is deleted. For example, suppose a component is the sole contributor of -font. When that component is removed via "itk_component delete", the -font option goes away as well. Also fixed the handling of the itk-delete-* binding for the component. When the component is removed, the binding tag is also removed by itk::remove_destroy_hook. 7/5/00 (bug fix) Fixed the check done during object creation to avoid clobbering existing commands. Previously, itcl would look for any command-- in the local *and* global namespace--that might be clobbered. Now, it looks for commands only in the local namespace, since those are the only ones that could truly be clobbered. 7/5/00 (cleanup) Removed obsolete Makefile/configure files in the various "unix" directories. Makefiles and configure files now reside one level above, in the standard TEA place. 2000-06-06 wart * Makefile.in: * configure: * configure.in: * tests/all.tcl: * tests/buttonbox.test: * tests/calendar.test: * tests/canvasprintbox.test: * tests/canvasprintdialog.test: * tests/checkbox.test: * tests/combobox.test: * tests/dateentry.test: * tests/datefield.test: * tests/dialog.test: * tests/dialogshell.test: * tests/disjointlistbox.test: * tests/entryfield.test: * tests/extfileselectionbox.test: * tests/extfileselectiondialog.test: * tests/feedback.test: * tests/fileselectionbox.test: * tests/fileselectiondialog.test: * tests/finddialog.test: * tests/hierarchy.test: * tests/hyperhelp.test: * tests/labeledframe.test: * tests/labeledwidget.test: * tests/menubar.test: * tests/messagebox.test: * tests/messagedialog.test: * tests/notebook.test: * tests/optionmenu.test: * tests/panedwindow.test: * tests/promptdialog.test: * tests/pushbutton.test: * tests/radiobox.test: * tests/regexpfield.test: * tests/scrolledcanvas.test: * tests/scrolledframe.test: * tests/scrolledhtml.test: * tests/scrolledlistbox.test: * tests/scrolledtext.test: * tests/selectionbox.test: * tests/selectiondialog.test: * tests/shell.test: * tests/spindate.test: * tests/spinint.test: * tests/spinner.test: * tests/spintime.test: * tests/tabnotebook.test: * tests/tabset.test: * tests/timeentry.test: * tests/timefield.test: * tests/toolbar.test: * tests/usual.test: * tests/watch.test: Modified tests to run with TEA Makefile 2000-06-02 csmith * generic/timefield.itk: Here are the comments from an itcl mailing list poster as well as my comments interspersed. iwidgets::timefield 2000-04-26 csmith * generic/checkbox.itk: Bug fix - patch by Mark Wilson added to select method to handle boolean (other than 0,1) -onvalue options. 2000-04-19 mmc * configure: * configure.in: - fixed itcl::find to find classes/objects in *all* namespaces - fixed tests to run cleanly 2000-03-28 csmith * generic/scrolledhtml.itk: Applied patches submitted by Brian Griffin. The patches are as follows: *** scrolledhtml.itk 1999/02/21 02:50:38 1.3 --- scrolledhtml.itk 2000/03/14 18:07:27 *************** class iwidgets::Scrolledhtml { *** 141,146 **** --- 141,147 ---- itk_option define -unknownimage unknownimage File {} itk_option define -textbackground textBackground Background {} itk_option define -update update Update 1 + itk_option define -debug deBug Debug 0 =20 public method import {args} public method clear {} *************** body iwidgets::Scrolledhtml::import {arg *** 544,550 **** append _cwd [file dirname $filename] } else { set f [open $filename r] ! g set _cwd [file dirname $filename] } } } --- 545,551 ---- append _cwd [file dirname $filename] } else { set f [open $filename r] ! set _cwd [file dirname $filename] } } } *************** body iwidgets::Scrolledhtml::render {htm *** 611,618 **** [lindex $entity 1]] "" entity set cmd [string tolower [lindex $entity 0]] if {[info command _entity_$cmd]!=3D""} { ! catch {eval _entity_$cmd [lrange $entity 1 end]} } set html \ [string range $html [expr [lindex $match 1]+1] end] } --- 612,624 ---- [lindex $entity 1]] "" entity set cmd [string tolower [lindex $entity 0]] if {[info command _entity_$cmd]!=3D""} { ! if {[catch {eval _entity_$cmd [lrange $entity 1 end]} bad]} { ! if {$itk_option(-debug)} { ! global errorInfo ! puts stderr "render: _entity_$cmd [lrange $entity 1 end] = Error:$bad\n$errorInfo" ! } } + } set html \ [string range $html [expr [lindex $match 1]+1] end] } *************** body iwidgets::Scrolledhtml::_append_tex *** 728,743 **** if ![string length $text] return } if {!$_pre && !$_intitle} { ! set p [$_hottext get "end - 2c"] set n [string index $text 0] if {$n =3D=3D " " && $p =3D=3D " "} { set text [string range $text 1 end] } ! $_hottext insert end $text $_tag return } if {$_pre && !$_intitle} { ! $_hottext insert end $text $_tag return } append _title $text --- 734,757 ---- if ![string length $text] return } if {!$_pre && !$_intitle} { ! if {[catch {$_hottext get "end - 2c"} p]} { ! set p "" ! } set n [string index $text 0] if {$n =3D=3D " " && $p =3D=3D " "} { set text [string range $text 1 end] } ! if {[catch {$_hottext insert end $text $_tag}]} { ! set pht [winfo parent $_hottext] ! catch {$pht insert end $text $_tag} ! } =20 return } if {$_pre && !$_intitle} { ! if {[catch {$_hottext insert end $text $_tag}]} { ! set pht [winfo parent $_hottext] ! catch {$pht insert end $text $_tag} ! } =20 return } append _title $text *************** body iwidgets::Scrolledhtml::_set_tag {} *** 807,813 **** if {![info exists _tagl($_tag)]} { set _tagfont($_tag) 1 eval $_hottext tag configure $_tag \ ! -foreground $_color \ -lmargin1 ${_left}m \ -lmargin2 ${_left2}m $args if [catch {eval $_hottext tag configure $_tag \ --- 821,827 ---- if {![info exists _tagl($_tag)]} { set _tagfont($_tag) 1 eval $_hottext tag configure $_tag \ ! -foreground \$_color \ -lmargin1 ${_left}m \ -lmargin2 ${_left2}m $args if [catch {eval $_hottext tag configure $_tag \ *************** body iwidgets::Scrolledhtml::_entity_tab *** 2127,2133 **** # end table # ------------------------------------------------------------------ body iwidgets::Scrolledhtml::_entity_/table {} { ! if $_intable { _pop tableborder set table [[_pop table] childsite] _pop row --- 2141,2147 ---- # end table # ------------------------------------------------------------------ body iwidgets::Scrolledhtml::_entity_/table {} { ! if {$_intable} { _pop tableborder set table [[_pop table] childsite] _pop row *************** body iwidgets::Scrolledhtml::_entity_/ta *** 2150,2155 **** --- 2164,2181 ---- set _link [_pop link] set _alink [_pop alink] foreach x [grid slaves $table] { + set text [$x get 1.0 end] + set tl [split $text \n] + set max 0 + foreach l $tl { + set len [string length $l] + if {$len > $max} { + set max $len + } + } + if {$max > [$x cget -width]} { + $x configure -width $max + } if {[$x cget -height] =3D=3D 1} { $x configure -height [lindex [split [$x index "end - 1 chars"] "."] = 0] } *************** body iwidgets::Scrolledhtml::_entity_td=20 *** 2219,2227 **** set cellspacing [_peek cellspacing] set _hottext $table.cell[incr _counter] text $_hottext -relief flat -width $ar(width) -height $ar(height) = \ ! -foreground $_color -background $_bgcolor = -highlightthickness 0 \ ! -wrap word -cursor $itk_option(-cursor) \ -padx $cellpadding -pady $cellpadding if [info exists ar(nowrap)] { $_hottext configure -wrap none } --- 2245,2258 ---- set cellspacing [_peek cellspacing] set _hottext $table.cell[incr _counter] text $_hottext -relief flat -width $ar(width) -height $ar(height) \ ! -highlightthickness 0 -wrap word -cursor $itk_option(-cursor) \ -padx $cellpadding -pady $cellpadding + if {$_color !=3D ""} { + $_hottext config -foreground $_color + } + if {$_bgcolor !=3D ""} { + $_hottext config -background $_bgcolor=20 + } if [info exists ar(nowrap)] { $_hottext configure -wrap none } *************** body iwidgets::Scrolledhtml::_entity_td=20 *** 2229,2235 **** --- 2260,2272 ---- $_hottext configure -relief sunken } set row [_peek row] + if {$row < 0} { + set row 0 + } set column [_pop column] + if {$column < 0} { + set column 0 + } while {[grid slaves $table -row $row -column $column] !=3D ""} { incr column } * generic/shell.itk: Reversed these two lines of code in the activate() method. wm deiconify $itk_component(hull) raise $itk_component(hull) This fixes a problem mentioned by Brett Schwarz with a particular window manager he was using with Linux. After testing this code change on a number of other platforms/WMs (Solaris, Windows, HP-UX -- OLVWM, CDE, GNOME, FVWM) it does not appear to affect behavior on any of these other systems. 2000-03-21 csmith * generic/fileselectionbox.itk: From a patch I received from Brett Schwarz: BUG --- When the -fileson option is set to false, then only the directory listing is shown. It is implied that this becomes a directory selector. However, when single clicking on a directory, the selection entry widget only gets updated with the tail of the directory name (what is actually in the directory listbox), not the whole path. DESIRED BEHAVIOR * generic/extfileselectionbox.itk: From a patch I received from Brett Schwarz: BUG --- When the -fileson option is set to false, then only the directory listing is shown. I is implied that this becomes a directory selector. However, when single clicking on a directory, the selection entry widget only gets updated with the tail of the directory name (what is actually in the directory listbox), not the whole path. DESIRED BEHAVIOR 2000-03-10 csmith * doc/checkbox.n: Updated man page to reflect addition of new config option: orient. * generic/radiobox.itk: Added a new configuration option to the radiobox: -orient, which specifies the orientation of the radiobuttons within the radiobox. * generic/checkbox.itk: Added a new config option to the checkbox: -oritent, which allows the user to specify the orientation of the checkbuttons, either horizontally or vertically (default). * doc/radiobox.n: Updated man page to reflect the new config option I added: orient. 2000-03-09 csmith * doc/scrolledlistbox.n: Updated man page to include -listvariable associated option and itemconfigure associated method. * generic/spinint.itk: Added patch submitted by Brett Schwarz. When a value outside the specified range is typed into the entryfield component, the spinint will beep if the up or down arrow is pressed. We decided it was better to change the value back to within the valid range. For example, if the range is from 10 to 20: user types 50 in entryfield: up arrow results in 10 down arrow results in 20 user types 5 in entryfield: up arrow results in 10 down arrow results in 20 * generic/feedback.itk: This is to close ticket #2881. While implementing the fix, I found another bug where resizing of the window did not update the trough. So I did not add the patch from this ticket. Rather, I added a new binding in the class constructor on the hull such that events invoke the _display method to update the trough. This binding fixes both cases and does not introduce any performance problems. * doc/scrolledtext.n: Updated man page to include image associated method. 2000-03-08 csmith * generic/hierarchy.itk: Implemented and tested bug fix for ticket #3444. csmith: 3/8/00 4:02pm 2000-03-02 csmith * generic/scrolledlistbox.itk: Added a wrapper method for the new tk8.3 itemconfigure command for the listbox. * generic/scrolledtext.itk: This is to close bug report #3446. I added a wrapper method for the text widget's new image function per request. * unix/Makefile.in: This is to close ticket #3958. Removed the "iwidgets.tcl and pkgIndex.tcl" targets from 'make clean'. * generic/scrolledlistbox.itk: Added -listvariable to the list of options kept with the listbox component is added so that this option is available at the mega-widget level. 2000-01-31 csmith * generic/combobox.itk: Small bug fix in the delete method when deleting text from the entry component. 2000-01-26 csmith * generic/disjointlistbox.itk: This mega-widget is setting tk_strictMotif to 1. Several emails circulated around the itcl mailing list about problems that this caused. disjointlistbox is the only mega-widget that set this global variable, so I've removed the line of code that did this. After a brief sanity check, things look fine without this line of code. 2000-01-24 wart * configure: Regenerated configure scripts to pick up changes to tcl.m4 * configure: Regenerated configure scripts to pick up recent changes to tcl.m4 2000-01-07 csmith * generic/messagedialog.itk: Added -wraplength and -justify to configuration options. I don't know why these were removed from version 2.2, but they're useful and should be there. 2000-01-03 csmith * generic/combobox.itk: One typo dealing with -state with -dropdown is false ("info exists" should have been "winfo exists"). Also added a conditional in the delete method to avoid a possible stack dump. * generic/watch.itk: -tickcolor was not working - simple fix to modify the canvas option from -fill to -outline * generic/timefield.itk: Patch by Massimo Morin to add -gmt and -textvariable options to the timefield. * generic/optionmenu.itk: The 'select' method was not working properly when passed the "end" argument. Modified the 'select' method to check for a bad index value - did not use the patch attached to the bug report. * generic/canvasprintbox.itk: minor bug fix, -pagesize was not updating the optionmenu * generic/calendar.itk: Fixed a bug with -buttonforeground when photos used instead of bitmaps. * generic/spindate.itk: datemargin was not working properly. Bug fixed by Brett Schwarz. * generic/finddialog.itk: Patch by Brett Schwarz to fix -clearcommand and -matchcommand options, which were not working. * generic/extfileselectionbox.itk: A few public methods should be private: _selectDir _dblSelectDir _selectFile * Makefile.in: Patch submitted by Andreas Gustafsson: 'make clean' removes files generated by the configure script and should only remove files generated by make. 1999-12-20 csmith * generic/labeledframe.itk: Fixed some access level inconsistencies with some class methods. One public method (smt) should not be public. Actually, I can't find anywhere in any code where this method is called. Maybe it should be deleted? I made it protected along with 3 private methods that were labeled as protected in the method comment block. * generic/checkbox.itk: 1) I removed the following configuration option definitions from the class definition: -command, -disabledforeground, and -selectcolor. These options are now only applicable after checkbuttons have been added to the checkbox. a) The -command option never worked anyway. It was defined via 'itk_option define' but was not implemented. The easiest solution was to keep this option when adding a new checkbutton. This at least adds -command functionality but doesn't provide for % variable substitutions, which would be a nice addition for future revisions. b) The -disabledforeground and -selectcolor options were valid options for initial checkbox creation but had no error checking. You could therefore create a new checkbox with -selectcolor set to "foo bar" and it would work OK. When you tried to add a new checkbutton via the add() method, however, it would fail until the class level -selectcolor was modified. This could lead to confusion, so these two options are now only valid after (or during) the addition of checkbuttons. Tk then handles the error checking. 2) Added -state to the keep fragment during checkbutton addition. So in a nutshell, these 4 options are now valid checkbox options after at least one checkbutton has been added: -command -disabledforeground -selectcolor -state 1999-12-16 wart * Makefile.in: Install a few extra useful files (license.terms, catalog.bat) 1999-12-16 csmith * generic/menubar.itk: public method _helpHandler should be private. Not sure how this originally happened unless just an oversight on the author's part. 1999-12-15 csmith * generic/feedback.itk: Modified the _display method per a bug report submitted by Kory Hopkins on 9/24/99 (at least that's when I got it). There was a simple code change to fix a problem with the trough calculation when stepping. 1999-11-24 wart * configure: regenerated configure scripts to pick up tcl.m4 changes * configure: tcl.m4: Updated to reflect recent TEA changes */configure: Regnereated with new tcl.m4 iwidgets2.2.0/Makefile.in: Don't copy nonexistent files 1999-11-18 csmith * generic/optionmenu.itk: Modified a ternary expression to a simple if:then conditional because of some problems with exponentials. * generic/optionmenu.itk: Just for clarity, changed the menubutton component's designated "-indicator" option to "-indicatoron". Someone noticed it and actually submitted a bug report on it. Geez. * doc/toolbar.n: Removed the -relief option from the list of standard options. * generic/scrolledtext.itk: Fixed a bug with the search method. The arguments needed to be evaluated one level down the call stack. * demos/html/toolbar.n.html: Removed the -relief option from the standard options and also alphabetized each of the standard options for lookup convenience. 1999-09-14 wart * iwidgets.tcl.in: * pkgIndex.tcl.in: Fixed installation of pkgIndex.tcl file. We have to install a pre-made pkgIndex.tcl file since pkg_mkIndex can't seem to make a usable one. 1999-09-10 wart * Makefile.in: Fixed bug when calling mkIndex.tcl for itk reduced amount of output from "make install" in iwidgets 1999-09-09 wart * iwidgets.tcl.in: * pkgIndex.tcl.in: Added pkgIndex files for Iwidgets Top level Makefile should no longer loop endlessly if the configure went bad. 1999-09-04 wart * Makefile.in: * aclocal.m4: * configure: * configure.in: TEA changes. Itcl now uses the same Makefiles and configure scripts for both Windows and Unix. Note that static shells are not yet done in this TEA implementation. 1999-08-21 matt * win/makefile.vc: Moved HTML install to seperate non-default target, since the files that it tries to install don't exist and cause a failure during the install. 1999-07-26 csmith * generic/pane.itk: A typo in the configbody for -minimum. The first '$' should be removed from set $itk_option(-minimum) $pixels 1999-07-22 csmith * generic/notebook.itk: This is to incorporate a bug fix reported by Larry Virden for the tabbed notebook. Looks like a typo in the code, where set $_currPage -1 should be set _currPage -1 * generic/calendar.itk: This is to fix a problem reported by Larry Virden in the calendar iwidget. There's a typo in the line, set $_time $time which should be set _time $time 1999-07-08 rjohnson * demos/html/iwidgets2.2.0UserCmds.html: * demos/html/iwidgets3.0.0UserCmds.htm: Updated html index file to 3.0. * demos/html/iwidgets3.0.0UserCmds.htm: * demos/html/iwidgets3.0.0UserCmds.html: Messed up extension. 1999-06-16 csmith * generic/toolbar.itk: This fix is contributed by Raviv Gil. Below is his description of the bug. "Working with iwidgets3.0.0 we've encountered the following problem : We created a toolbar containing several buttons, each button with a short help string. Passing above the toolbar and then closing the window sometimes opened a Tcl Error message indicating that the method 'showBalloon' was invoked for an invalid tk path." * generic/panedwindow.itk: There were several places in the code that looped from 1 to the number of actual panes in the panedwindow when the code should be looping over the number of active panes. Each of these areas in the code could cause a stack dump, complaining about an invalid pathanme regarding a sash or a separator. I've changed each of these areas to use _activePanes instead of _panes. 1999-05-25 redman * unix/configure.in: Fix the makefile and configure files, etc., for Unix in order to compile with Tcl/Tk 8.1 with stubs. Builds itclsh and itkwish properly. 1999-03-30 csmith * generic/checkbox.itk: ::Checkbox::select invokes the specified checkbutton regardless of whether it's selected or not. It should only tell the checkbutton to invoke if the checkbutton is not already selected. * generic/menubar.itk: There was a typo in the redefinition of the tkMenuFind proc at the bottom of menubar.itk. "winfo" was being used instead of "info" with the "command" argument. 1999-03-15 csmith * tests/entryfield.test: Added one line of code in the 'foreach test' loop for the new - pasting option. * doc/entryfield.n: Updated man page to document a new option, -pasting, which allows the developer to disable pasting into the entry component of the entryfield. This is useful when using -validate because validation does not catch pasting text. * generic/entryfield.itk: 1) Added a new configuration option, -pasting, which allows the user to disable pasting text into the entry component of the entryfield. Previously, when using -validate, the user was allowed to paste text which could cause stack dumps into the entryfield because pasting was not caught. The user, for instance, could paste a 40 digit number and kill any expr's since the integer is too large for tcl to handle. 2) The _keyPress method hardcoded state comparisons for , , , and . The problem was that these hardcoded values were UNIX-specific. I added platform-independant code. * CHANGES: Added to entries under the Entryfield section: 1) documented new configuration option, -pasting; and 2) documented change to _keyPress method to remove hardcoded state comparisons. 1999-03-08 csmith * generic/panedwindow.itk: Instantiating an extfileselectionbox iwidgets with a single configuration option, '-fileson 0', caused a stack dump as a result of accessing an invalid tk window pathname in iwidgets::Panedwindow::sashcursor. The solution was to wrap a conditional around the path to see if it exists before trying to use it. 1999-03-04 csmith * generic/combobox.itk: The -command configuration option was being overwritten in the _createComponents method if it was specified during widget creation. 1999-02-21 rjohnson * generic/scrolledhtml.itk: Removed stack trace error in widget. However, the widget still doesn't display correctly... 1999-01-25 stanton * unix/iwidgets.tcl.in: * win/iwidgets.tcl: Changed so iwidgets.tcl does a "namespace import -force itcl::*" This is a hack to get around the fact that iwidgets uses "class" instead of "itcl::class". The correct long term solution is to change all of the iwidgets code to use qualified names. 1998-12-22 rjohnson * demos/watch: Fixed bug in watch demo. 1998-12-18 rjohnson * demos/catalog: Removed the mainwindow demo from the catalog demo. It was not a well behaved demo and running would break the catalog demo. [Bug ID: 508] 1998-09-14 stanton * demos/images/clear.gif: * demos/images/close.gif: * demos/images/copy.gif: * demos/images/cut.gif: * demos/images/exit.gif: * demos/images/find.gif: * demos/images/help.gif: * demos/images/mag.gif: * demos/images/new.gif: * demos/images/open.gif: * demos/images/paste.gif: * demos/images/poly.gif: * demos/images/print.gif: * demos/images/ruler.gif: * demos/images/save.gif: * demos/images/select.gif: * demos/iwidgets.gif: * generic/unknownimage.gif: Fixed binary files 1998-09-10 stanton * doc/iwidgets.ps: added iwidgets.ps as a binary file 1998-08-25 stanton * demos/mainwindow: fixed bug where image names conflicted with global commands 1998-08-24 stanton * generic/hyperhelp.itk: fixed portability bug in file name handling * demos/html/buttonbox.n.html: * demos/html/canvasprintbox.n.html: * demos/html/canvasprintdialog.n.html: * demos/html/combobox.n.html: * demos/html/dialog.n.html: * demos/html/dialogshell.n.html: * demos/html/entryfield.n.html: * demos/html/feedback.n.html: * demos/html/fileselectionbox.n.html: * demos/html/fileselectiondialog.n.html: * demos/html/hyperhelp.n.html: * demos/html/iwidgets2.2.0UserCmds.html: * demos/html/labeledwidget.n.html: * demos/html/menubar.n.html: * demos/html/messagedialog.n.html: * demos/html/notebook.n.html: * demos/html/optionmenu.n.html: * demos/html/panedwindow.n.html: * demos/html/promptdialog.n.html: * demos/html/pushbutton.n.html: * demos/html/radiobox.n.html: * demos/html/scrolledcanvas.n.html: * demos/html/scrolledframe.n.html: * demos/html/scrolledhtml.n.html: * demos/html/scrolledlistbox.n.html: * demos/html/scrolledtext.n.html: * demos/html/selectionbox.n.html: * demos/html/selectiondialog.n.html: * demos/html/shell.n.html: * demos/html/spindate.n.html: * demos/html/spinint.n.html: * demos/html/spinner.n.html: * demos/html/spintime.n.html: * demos/html/tabnotebook.n.html: * demos/html/tabset.n.html: * demos/html/toolbar.n.html: updated 1998-08-21 stanton * demos/catalog: removed extraneous import 1998-08-18 welch * demos/catalog: Fixed demo 1998-08-11 welch * CHANGES: * demos/catalog: * demos/html/buttonbox.n.html: * demos/html/canvasprintbox.n.html: * demos/html/combobox.n.html: * demos/html/dialogshell.n.html: * demos/html/entryfield.n.html: * demos/html/fileselectionbox.n.html: * demos/html/fileselectiondialog.n.html: * demos/html/hyperhelp.n.html: * demos/html/labeledwidget.n.html: * demos/html/menubar.n.html: * demos/html/notebook.n.html: Updates from Michael * demos/feedback: * demos/html/canvasprintdialog.n.html: * demos/html/dialog.n.html: * demos/html/feedback.n.html: * demos/html/messagedialog.n.html: * demos/html/optionmenu.n.html: * demos/html/panedwindow.n.html: * demos/html/promptdialog.n.html: * demos/html/pushbutton.n.html: * demos/html/radiobox.n.html: * demos/html/scrolledcanvas.n.html: * demos/html/scrolledframe.n.html: * demos/html/scrolledhtml.n.html: * demos/html/scrolledlistbox.n.html: * demos/html/scrolledtext.n.html: * demos/html/selectionbox.n.html: * demos/html/selectiondialog.n.html: * demos/html/shell.n.html: * demos/html/spindate.n.html: * demos/html/spinint.n.html: * demos/html/spinner.n.html: * demos/html/spintime.n.html: * demos/html/tabnotebook.n.html: * demos/html/tabset.n.html: * demos/html/toolbar.n.html: * demos/mainwindow: * demos/watch: * doc/calendar.n: * doc/labeledframe.n: * doc/optionmenu.n: * doc/selectionbox.n: * generic/combobox.itk: * generic/entryfield.itk: * generic/hierarchy.itk: * generic/menubar.itk: * generic/messagebox.itk: * generic/optionmenu.itk: * generic/radiobox.itk: * generic/scrolledframe.itk: * generic/scrolledhtml.itk: * generic/shell.itk: * generic/toolbar.itk: * tests/entryfield.test: * tests/hyperhelp.test: * tests/optionmenu.test: * tests/shell.test: * tests/spinner.test: * unix/Makefile.in: * unix/iwidgets.tcl.in: * unix/pkgIndex.tcl.in: 3.0 final from Michael * unix/Makefile.in: Fixed symlink iwidgets-4.1.0/Makefile.in0000644003604700454610000001240013127751371013777 0ustar dgp771div# # This file is a Makefile for [incr Widgets]. If it has the name # "Makefile.in" then it is a template for a Makefile; to generate # the actual Makefile, run "./configure", which is a configuration # script generated by the "autoconf" program (constructs like # "@foo@" will get replaced in the actual Makefile. # # RCS: $Id: Makefile.in,v 1.17 2017/07/07 18:29:13 dgp Exp $ # Current [incr Widgets] version; used in various names. ITCL_VERSION = @itcl_VERSION@ #---------------------------------------------------------------- # Things you can change to personalize the Makefile for your own # site (you can make these changes in either Makefile.in or # Makefile, but changes to Makefile will get lost if you re-run # the configuration script). #---------------------------------------------------------------- # Pointer to lib dirs needed during testing: TCL_SRC_DIR = @TCL_SRC_DIR@ TK_SRC_DIR = @TK_SRC_DIR@ ITCL_SRC_DIR = @itcl_SRC_DIR@ ITK_SRC_DIR = @ITK_SRC_DIR@ #---------------------------------------------------------------- # The information below is modified by the configure script when # Makefile is generated from Makefile.in. You shouldn't normally # modify any of this stuff by hand. #---------------------------------------------------------------- srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ datadir = @datadir@ mandir = @mandir@ includedir = @includedir@ DESTDIR = PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ top_builddir = . PKG_DIR = $(PACKAGE_NAME)$(PACKAGE_VERSION) pkgdatadir = $(DESTDIR)$(datadir)/$(PKG_DIR) pkglibdir = $(DESTDIR)$(libdir)/$(PKG_DIR) pkgincludedir = $(DESTDIR)$(includedir)/$(PKG_DIR) # Top-level directory in which to install manual entries: MAN_INSTALL_DIR = $(DESTDIR)$(mandir)/mann INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ SHELL = @SHELL@ TOP_DIR = $(srcdir) GENERIC_DIR = $(TOP_DIR)/generic EXTRA_PATH = $(TCL_BIN_DIR):$(TK_BIN_DIR):$(ITCL_LIB_DIR):$(ITK_LIB_DIR) TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` \ TK_LIBRARY=`@CYGPATH@ $(TK_SRC_DIR)/library` \ ITCL_LIBRARY=`@CYGPATH@ @ITCL_LIB_DIR@` \ ITK_LIBRARY=`@CYGPATH@ @ITK_LIB_DIR@` \ IWIDGETS_LIBRARY=`@CYGPATH@ $(srcdir)` \ @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \ PATH="$(EXTRA_PATH):$(PATH)" \ TCLLIBPATH="$(top_builddir)" TCLSH_PROG = @TCLSH_PROG@ WISH_PROG = @WISH_PROG@ TCLSH = $(TCLSH_ENV) $(TCLSH_PROG) WISH = $(TCLSH_ENV) $(WISH_PROG) #---------------------------------------------------------------- # The information below should be usable as is. The configure # script won't modify it and you shouldn't need to modify it # either. #---------------------------------------------------------------- info: @echo "Please specify either 'make test' or 'make install'." all: @echo "Nothing to make for target 'all'. Run 'make test' to \ test the distribution" @echo "and 'make install' to install it." install: install-libraries install-doc install-demos test: $(WISH) `@CYGPATH@ $(srcdir)/tests/all.tcl` -load "package require -exact Itcl $(ITCL_VERSION); package forget Itk; package forget itk; package require -exact Iwidgets $(PACKAGE_VERSION)" $(TESTFLAGS) | cat shell: @$(WISH) $(SCRIPT) install-libraries: @mkdir -p $(pkglibdir)/scripts @echo "Installing source files from $(GENERIC_DIR) into $(pkglibdir)" @for i in $(GENERIC_DIR)/*.itk $(GENERIC_DIR)/*.itcl \ $(GENERIC_DIR)/tclIndex $(GENERIC_DIR)/*.gif ; do \ $(INSTALL_DATA) $$i $(pkglibdir)/scripts; \ done; @echo "Installing iwidgets.tcl and pkgIndex.tcl into $(pkglibdir)" @for i in iwidgets.tcl pkgIndex.tcl ; do \ $(INSTALL_DATA) $$i $(pkglibdir); \ done; install-demos: @mkdir -p $(pkglibdir)/demos/images @mkdir -p $(pkglibdir)/demos/html @echo "Installing demos from $(srcdir)/demos into $(pkglibdir)/demos" @for i in $(srcdir)/demos/*; do \ if test -f $$i ; then \ $(INSTALL_SCRIPT) $$i $(pkglibdir)/demos; \ fi; \ done; @echo "Installing images from $(srcdir)/demos/images into $(pkglibdir)/demos/images" @for i in $(srcdir)/demos/images/*; do \ if test -f $$i ; then \ $(INSTALL_DATA) $$i $(pkglibdir)/demos/images; \ fi; \ done; @echo "Installing html man pages from $(srcdir)/demos/html into $(pkglibdir)/demos/html" @for i in $(srcdir)/demos/html/*; do \ if test -f $$i ; then \ $(INSTALL_DATA) $$i $(pkglibdir)/demos/html; \ fi; \ done; install-doc: @mkdir -p $(MAN_INSTALL_DIR) @echo "Installing man pages from $(TOP_DIR)/doc into $(MAN_INSTALL_DIR)" @cd $(TOP_DIR)/doc; for i in *.n; do \ rm -f $(MAN_INSTALL_DIR)/`basename $$i`; \ rm -f $(MAN_INSTALL_DIR)/`basename iwidgets_$$i`; \ sed -e '/man\.macros/r man.macros' -e '/man\.macros/d' \ $$i > $(MAN_INSTALL_DIR)/`basename iwidgets_$$i`; \ chmod 444 $(MAN_INSTALL_DIR)/`basename iwidgets_$$i`; \ done; $(INSTALL_DATA) $(srcdir)/license.terms $(pkglibdir) Makefile: $(srcdir)/Makefile.in $(SHELL) config.status clean: rm -f core errs *~ \#* TAGS *.E a.out errors distclean: clean rm -f Makefile config.status config.cache config.log depend: configure: configure.in autoconf # DO NOT DELETE THIS LINE -- make depend depends on it. iwidgets-4.1.0/README0000644003604700454610000002350213136711657012622 0ustar dgp771div------------------------------------------------------------------------------ [incr Widgets] - version 4.1.0 ------------------------------------------------------------------------------ Please send general comments, suggestions, and questions to chad_smith@adc.com or itclguy@yahoo.com. Much of this file was written by Mark Ulferts, the original [incr Widgets] guy, several years ago when the Iwidgets were first released. Chad has assumed responsibilities for updates and maintenance. ============================================================================== Copyright (c) 1995 DSC Technologies Corporation ============================================================================== This software is copyrighted by DSC Technologies and private individual contributors. The copyright holder is specifically listed in the header of each file. The following terms apply to all files associated with the software unless explicitly disclaimed in individual files by private contributors. Permission to use, copy, modify, distribute and license this software and its documentation for any purpose, and without fee or written agreement with DSC, is hereby granted, provided that the above copyright notice appears in all copies and that both the copyright notice and warranty disclaimer below appear in supporting documentation, and that the names of DSC Technologies Corporation or DSC Communications Corporation not be used in advertising or publicity pertaining to the software without specific, written prior permission. DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. RESTRICTED RIGHTS: Use, duplication or disclosure by the government is subject to the restrictions as set forth in subparagraph (c) (1) (ii) of the Rights in Technical Data and Computer Software Clause as DFARS 252.227-7013 and FAR 52.227-19. ============================================================================== OVERVIEW ------------------------------------------------------------------------------ - Introduction - Distribution - Web site - Getting started - Contributions - Acknowledgements ------------------------------------------------------------------------------ Introduction ------------------------------------------------------------------------------ [incr Widgets] is an object-oriented mega-widget set which extends Tcl/Tk and is based on [incr Tcl] and [incr Tk]. This set of mega-widgets delivers many new, general purpose widgets like option menus, comboboxes, selection boxes, and various dialogs whose couterparts are found in Motif and Windows. Since [incr Widgets] is based on the [incr Tk] extension, the Tk framework of configuration options, widget commands, and default bindings is maintained. In other words, each [incr Widgets] mega-widget seamlessly blends with the standard Tk widgets. They look, act and feel like Tk widgets. In addition, all [incr Widgets] mega-widgets are object oriented and may themselves be extended, using either inheritance or composition. [incr Widgets] offers a strong object-oriented foundation which addresses the need for a flexible and extensible mega-widget set. Its usage replaces common widget combinations with higher level abstractions, simplifying code, reducing errors, increasing readability, adding productivity, and promoting a singular look-and-feel. The ability to extend [incr Widgets] enables developers to create new mega-widgets based on previous work. In short, [incr Widgets] is a library of reusable mega-widgets that can be easily extended using composition or inheritance, allowing quicker development of large scale applications. Usage drastically reduces development time. New dialogs can be created in hours. Whole applications in a few days. Reuse becomes a reality. Many projects are benefitting frm the intergration of this mega-widget set into their development strategy. [incr Widgets] is an [incr Tcl] and [incr Tk] success story. Good products come from good foundations. Distribution ------------------------------------------------------------------------------ The [incr Widgets] distribution may be downloaded at SourceForge: www.sourceforge.net/projects/incrtcl. The current distribution is version 4.1.0. Web site ------------------------------------------------------------------------------ For the most current news regarding [incr Widgets] please consult the web site - http://incrtcl.sourceforge.net/iwidgets. Many thanks to Brett Schwarz who has done an incredible job overhauling this site. Take a look! Getting started ------------------------------------------------------------------------------ The "doc" directory contains man pages and a technical paper. The man pages are installed under the man directory off your --prefix, and as of version 4.0.1 are prepended with the text "iwidgets_" to easily differentiate [incr Widgets] man pages from those of other extensions. doc/iwidgets.ps ... Updated paper presented at Tcl Workshop 95. doc/*.n ........... Man pages The "demos" directory contains demo scripts for each mega-widget as well as html versions of all the [incr Widgets] man pages. The demos are also installed under the lib directory off your --prefix. demos/catalog ..... Comprehensive demo package which illustrates [incr Widgets] usage additionally displaying the source. demos/html ..... HTML version of the [incr Widgets] man pages. The "tests" directory contains a set of test scripts for [incr Widgets]. They also make for a great demo of the flexiblity of the mega-widgets. Installation ------------------------------------------------------------------------------ NOTE: Having the itcl distribution is a prerequsite to using iwidgets. Thus, if you don't have itcl you need to visit Source Forge to download and install it first. Once you have downloaded and installed [incr Tcl] and [incr Tk], you can proceed with [incr Widgets] installation as follows: 1) Copy the iwidgets4.1.0.tar.gz file to your toplevel [incr Tcl] directory. For example, if you have the itcl3.2.1 distribution in a directory named /usr/local/tcl/itcl3.2.1, then you should copy the iwidgets file to this directory. Note, if you don't copy the iwidgets archive to this directory, then you will need to specify the --with-itcl flag when you run the configure script. 2) Untar/unzip the archive: gunzip -c iwidgets4.0.2.tar.gz |tar xvf - 3) Run the configuration script: cd iwidgets4.0.0 ./configure By default, the configuration script will set things up to be installed in "/usr/local". You can change this by specifying a different "prefix" in the "configure" command. You'll want to use the same value you used for the prefix in the configuration of your [incr Tcl/Tk] distribution. ./configure --prefix=/your/install/path The "configure" script generates a Makefile from the Makefile.in template. Also, as mentioned eariler, you may need to tell the [incr Widgets] where the [incr Tcl] source is located. For example, if your toplevel [incr Tcl] directory is located in /opt/tools/tcl/itcl3.2.1 and you are building the [incr Widgets] in a directory other than this, then you will need to use the following: ./configure --prefix=/your/install/path \ --with-itcl=/opt/tools/tcl/itcl3.2.1 4) Run the test suite: make test 7) Install the [incr Widgets] man pages, demos, and script files. make install Acknowledgements ------------------------------------------------------------------------------ Thanks to Brett Schwarz for a ton of work done on the new [incr Widgets] web site, http://incrtcl.sourceforge.net/iwidgets. Thanks to the original develment team, comprised of Mark Ulferts, Sue Yockey, Bret Schuhmacher, Alfredo Jahn, John Sigler, and Bill Scott. Also thanks to Mark Harrison for his influence, confidence, and ideas. Thanks also to the new set of contributors which include John Tucker, Mitch Gorman, John Reekie, Alfredo Jahn, Ken Copeland, Tako Schotanus, Tony Parent and Michael McLennan Thanks to Michael McLennan, creator of [incr Tcl] and [incr Tk], for the beta copies, training, assistance, and his infectious enthusiasm. Thanks to DSC Communications for picking up the copyright and supporting the public release of this software. Thanks to John P. Davis for creating the [incr Widgets] "Flaming Toaster" logo which can be seen at http://www.tcltk.com/iwidgets Thanks to WebNet Technologies for their assistance is designing the [incr Widgets] web site, as well as hosting it. Special thanks to my wife Karen for supporting this effort and to our two girls, Katelyn and Bailey, who occasionally shared the PC with me. Also thanks to my Discman and its relentless power supply as well as my rock and roll CD collection. No music, no software. -- ____________________________________________________________________________ _/_/ _/_/ _/ _/ _/ Mark L. Ulferts _/ _/ _/ _/ _/ _/ _/ ulferts@swbell.net _/ _/_/ _/ _/ _/ _/ mulferts@austin.dsccc.com _/ _/ _/ _/ _/_/_/ _/ _/_/_/_/ _/ DSC Communications Corp, Austin Texas iwidgets-4.1.0/aclocal.m40000644003604700454610000000004210175313471013564 0ustar dgp771divbuiltin(include,tclconfig/tcl.m4) iwidgets-4.1.0/configure0000754003604700454610000066056213125005611013645 0ustar dgp771div#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for iwidgets 4.1.0. # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME='iwidgets' PACKAGE_TARNAME='iwidgets' PACKAGE_VERSION='4.1.0' PACKAGE_STRING='iwidgets 4.1.0' PACKAGE_BUGREPORT='' ac_unique_file="generic/buttonbox.itk" # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CYGPATH EXEEXT PKG_LIB_FILE PKG_STUB_LIB_FILE PKG_STUB_SOURCES PKG_STUB_OBJECTS PKG_TCL_SOURCES PKG_HEADERS PKG_INCLUDES PKG_LIBS PKG_CFLAGS TCL_VERSION TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_LIBS TCL_DEFS TCL_EXTRA_CFLAGS TCL_LD_FLAGS TCL_SHLIB_LD_LIBS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_LIBS TK_XINCLUDES itcl_VERSION itcl_BIN_DIR itcl_SRC_DIR itcl_LIB_FILE itcl_LIB_SPEC itcl_STUB_LIB_FILE itcl_STUB_LIB_SPEC itcl_STUB_LIB_PATH INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT AR TCLSH_PROG CELIB_DIR LIBOBJS CPP EGREP DL_LIBS CFLAGS_DEBUG CFLAGS_OPTIMIZE CFLAGS_WARNING STLIB_LD SHLIB_LD SHLIB_CFLAGS SHLIB_LD_LIBS LDFLAGS_DEBUG LDFLAGS_OPTIMIZE LD_LIBRARY_PATH_VAR WISH_PROG ITCL_LIB_DIR ITK_LIB_DIR ITK_SRC_DIR IWIDGETS_SRC_DIR LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures iwidgets 4.1.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of iwidgets 4.1.0:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-64bit enable 64bit support (where applicable) --enable-64bit-vis enable 64bit Sparc VIS support --enable-wince enable Win/CE support (where applicable) --disable-load disallow dynamic loading and "load" command Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tk directory containing tk configuration (tkConfig.sh) --with-itcl directory containing itcl configuration (itclConfig.sh) --with-itk=DIR use Itk 3.0 binaries from DIR --with-celib=DIR use Windows/CE support library from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF iwidgets configure 4.1.0 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by iwidgets $as_me 4.1.0, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.2" echo "$as_me:$LINENO: checking for correct TEA configuration" >&5 echo $ECHO_N "checking for correct TEA configuration... $ECHO_C" >&6 if test x"${PACKAGE_NAME}" = x ; then { { echo "$as_me:$LINENO: error: The PACKAGE_NAME variable must be defined by your TEA configure.in" >&5 echo "$as_me: error: The PACKAGE_NAME variable must be defined by your TEA configure.in" >&2;} { (exit 1); exit 1; }; } fi if test x"3.2" = x ; then { { echo "$as_me:$LINENO: error: TEA version not specified." >&5 echo "$as_me: error: TEA version not specified." >&2;} { (exit 1); exit 1; }; } elif test "3.2" != "${TEA_VERSION}" ; then echo "$as_me:$LINENO: result: warning: requested TEA version \"3.2\", have \"${TEA_VERSION}\"" >&5 echo "${ECHO_T}warning: requested TEA version \"3.2\", have \"${TEA_VERSION}\"" >&6 else echo "$as_me:$LINENO: result: ok (TEA ${TEA_VERSION})" >&5 echo "${ECHO_T}ok (TEA ${TEA_VERSION})" >&6 fi case "`uname -s`" in *win32*|*WIN32*|*CYGWIN_NT*|*CYGWIN_9*|*CYGWIN_ME*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CYGPATH+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then echo "$as_me:$LINENO: result: $CYGPATH" >&5 echo "${ECHO_T}$CYGPATH" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) CYGPATH=echo EXEEXT="" TEA_PLATFORM="unix" ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in tclconfig $srcdir/tclconfig; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in tclconfig $srcdir/tclconfig" >&5 echo "$as_me: error: cannot find install-sh or install.sh in tclconfig $srcdir/tclconfig" >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. #-------------------------------------------------------------------- # See if there was a command-line option for where Tcl or Tk is; if # not, search for Tcl and/or Tk. #-------------------------------------------------------------------- # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl or --without-tcl was given. if test "${with_tcl+set}" = set; then withval="$with_tcl" with_tclconfig=${withval} fi; echo "$as_me:$LINENO: checking for Tcl configuration" >&5 echo $ECHO_N "checking for Tcl configuration... $ECHO_C" >&6 if test "${ac_cv_c_tclconfig+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case ${with_tclconfig} in */tclConfig.sh ) if test -f ${with_tclconfig}; then { echo "$as_me:$LINENO: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig=`echo ${with_tclconfig} | sed 's!/tclConfig\.sh$!!'` fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)` else { { echo "$as_me:$LINENO: error: ${with_tclconfig} directory doesn't contain tclConfig.sh" >&5 echo "$as_me: error: ${with_tclconfig} directory doesn't contain tclConfig.sh" >&2;} { (exit 1); exit 1; }; } fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig=`(cd $i; pwd)` break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig=`(cd $i/unix; pwd)` break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" { echo "$as_me:$LINENO: WARNING: \"Cannot find Tcl configuration definitions\"" >&5 echo "$as_me: WARNING: \"Cannot find Tcl configuration definitions\"" >&2;} exit 0 else no_tcl= TCL_BIN_DIR=${ac_cv_c_tclconfig} echo "$as_me:$LINENO: result: found $TCL_BIN_DIR/tclConfig.sh" >&5 echo "${ECHO_T}found $TCL_BIN_DIR/tclConfig.sh" >&6 fi fi echo "$as_me:$LINENO: checking for existence of $TCL_BIN_DIR/tclConfig.sh" >&5 echo $ECHO_N "checking for existence of $TCL_BIN_DIR/tclConfig.sh... $ECHO_C" >&6 if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then echo "$as_me:$LINENO: result: loading" >&5 echo "${ECHO_T}loading" >&6 . $TCL_BIN_DIR/tclConfig.sh else echo "$as_me:$LINENO: result: file not found" >&5 echo "${ECHO_T}file not found" >&6 fi # # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f $TCL_BIN_DIR/Makefile ; then TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC} TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC} TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH} fi # # eval is required to do the TCL_DBGX substitution # eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" #AC_SUBST(TCL_BUILD_LIB_SPEC) #AC_SUBST(TCL_BUILD_STUB_LIB_SPEC) # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true # Check whether --with-tk or --without-tk was given. if test "${with_tk+set}" = set; then withval="$with_tk" with_tkconfig=${withval} fi; echo "$as_me:$LINENO: checking for Tk configuration" >&5 echo $ECHO_N "checking for Tk configuration... $ECHO_C" >&6 if test "${ac_cv_c_tkconfig+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case ${with_tkconfig} in */tkConfig.sh ) if test -f ${with_tkconfig}; then { echo "$as_me:$LINENO: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&5 echo "$as_me: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&2;} with_tkconfig=`echo ${with_tkconfig} | sed 's!/tkConfig\.sh$!!'` fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig=`(cd ${with_tkconfig}; pwd)` else { { echo "$as_me:$LINENO: error: ${with_tkconfig} directory doesn't contain tkConfig.sh" >&5 echo "$as_me: error: ${with_tkconfig} directory doesn't contain tkConfig.sh" >&2;} { (exit 1); exit 1; }; } fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9]* 2>/dev/null` ; do if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig=`(cd $i; pwd)` break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9]* 2>/dev/null` ; do if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig=`(cd $i/unix; pwd)` break fi done fi fi if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" { echo "$as_me:$LINENO: WARNING: \"Cannot find Tk configuration definitions\"" >&5 echo "$as_me: WARNING: \"Cannot find Tk configuration definitions\"" >&2;} exit 0 else no_tk= TK_BIN_DIR=${ac_cv_c_tkconfig} echo "$as_me:$LINENO: result: found $TK_BIN_DIR/tkConfig.sh" >&5 echo "${ECHO_T}found $TK_BIN_DIR/tkConfig.sh" >&6 fi fi echo "$as_me:$LINENO: checking for existence of ${TK_BIN_DIR}/tkConfig.sh" >&5 echo $ECHO_N "checking for existence of ${TK_BIN_DIR}/tkConfig.sh... $ECHO_C" >&6 if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then echo "$as_me:$LINENO: result: loading" >&5 echo "${ECHO_T}loading" >&6 . $TK_BIN_DIR/tkConfig.sh else echo "$as_me:$LINENO: result: could not find ${TK_BIN_DIR}/tkConfig.sh" >&5 echo "${ECHO_T}could not find ${TK_BIN_DIR}/tkConfig.sh" >&6 fi # # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f $TK_BIN_DIR/Makefile ; then TK_LIB_SPEC=${TK_BUILD_LIB_SPEC} TK_STUB_LIB_SPEC=${TK_BUILD_STUB_LIB_SPEC} TK_STUB_LIB_PATH=${TK_BUILD_STUB_LIB_PATH} fi # # eval is required to do the TK_DBGX substitution # eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # # Ok, lets find the itcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-itcl # if test x"${no_itcl}" = x ; then # we reset no_itcl in case something fails here no_itcl=true # Check whether --with-itcl or --without-itcl was given. if test "${with_itcl+set}" = set; then withval="$with_itcl" with_itclconfig=${withval} fi; echo "$as_me:$LINENO: checking for itcl configuration" >&5 echo $ECHO_N "checking for itcl configuration... $ECHO_C" >&6 if test "${ac_cv_c_itclconfig+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # First check to see if --with-itcl was specified. if test x"${with_itclconfig}" != x ; then case ${with_itclconfig} in */itclConfig.sh ) if test -f ${with_itclconfig}; then { echo "$as_me:$LINENO: WARNING: --with-itcl argument should refer to directory containing itclConfig.sh, not to itclConfig.sh itself" >&5 echo "$as_me: WARNING: --with-itcl argument should refer to directory containing itclConfig.sh, not to itclConfig.sh itself" >&2;} with_itclconfig=`echo ${with_itclconfig} | sed 's!/itclConfig\.sh$!!'` fi;; esac if test -f "${with_itclconfig}/itclConfig.sh" ; then ac_cv_c_itclconfig=`(cd ${with_itclconfig}; pwd)` else { { echo "$as_me:$LINENO: error: ${with_itclconfig} directory doesn't contain itclConfig.sh" >&5 echo "$as_me: error: ${with_itclconfig} directory doesn't contain itclConfig.sh" >&2;} { (exit 1); exit 1; }; } fi fi # then check for a private itcl installation if test x"${ac_cv_c_itclconfig}" = x ; then for i in \ ../itcl \ `ls -dr ../itcl*[0-9].[0-9]*.[0-9]* 2>/dev/null` \ `ls -dr ../itcl*[0-9].[0-9][0-9] 2>/dev/null` \ `ls -dr ../itcl*[0-9].[0-9] 2>/dev/null` \ `ls -dr ../itcl*[0-9].[0-9]* 2>/dev/null` \ ../../itcl \ `ls -dr ../../itcl*[0-9].[0-9]*.[0-9]* 2>/dev/null` \ `ls -dr ../../itcl*[0-9].[0-9][0-9] 2>/dev/null` \ `ls -dr ../../itcl*[0-9].[0-9] 2>/dev/null` \ `ls -dr ../../itcl*[0-9].[0-9]* 2>/dev/null` \ ../../../itcl \ `ls -dr ../../../itcl*[0-9].[0-9]*.[0-9]* 2>/dev/null` \ `ls -dr ../../../itcl*[0-9].[0-9][0-9] 2>/dev/null` \ `ls -dr ../../../itcl*[0-9].[0-9] 2>/dev/null` \ `ls -dr ../../../itcl*[0-9].[0-9]* 2>/dev/null` \ ${srcdir}/../itcl \ `ls -dr ${srcdir}/../itcl*[0-9].[0-9]*.[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../itcl*[0-9].[0-9][0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../itcl*[0-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../itcl*[0-9].[0-9]* 2>/dev/null` \ ; do if test -f "$i/itclConfig.sh" ; then ac_cv_c_itclconfig=`(cd $i; pwd)` break fi if test -f "$i/unix/itclConfig.sh" ; then ac_cv_c_itclconfig=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_itclconfig}" = x ; then for i in `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ ; do if test -f "$i/itclConfig.sh" ; then ac_cv_c_itclconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_itclconfig}" = x ; then itcl_BIN_DIR="# no itcl configs found" { echo "$as_me:$LINENO: WARNING: \"Cannot find itcl configuration definitions\"" >&5 echo "$as_me: WARNING: \"Cannot find itcl configuration definitions\"" >&2;} exit 0 else no_itcl= itcl_BIN_DIR=${ac_cv_c_itclconfig} echo "$as_me:$LINENO: result: found $itcl_BIN_DIR/itclConfig.sh" >&5 echo "${ECHO_T}found $itcl_BIN_DIR/itclConfig.sh" >&6 fi fi echo "$as_me:$LINENO: checking for existence of ${itcl_BIN_DIR}/itclConfig.sh" >&5 echo $ECHO_N "checking for existence of ${itcl_BIN_DIR}/itclConfig.sh... $ECHO_C" >&6 if test -f "${itcl_BIN_DIR}/itclConfig.sh" ; then echo "$as_me:$LINENO: result: loading" >&5 echo "${ECHO_T}loading" >&6 . ${itcl_BIN_DIR}/itclConfig.sh else echo "$as_me:$LINENO: result: file not found" >&5 echo "${ECHO_T}file not found" >&6 fi # # If the itcl_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable itcl_LIB_SPEC will be set to the value # of itcl_BUILD_LIB_SPEC. An extension should make use of itcl_LIB_SPEC # instead of itcl_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f ${itcl_BIN_DIR}/Makefile ; then { echo "$as_me:$LINENO: WARNING: Found Makefile - using build library specs for itcl" >&5 echo "$as_me: WARNING: Found Makefile - using build library specs for itcl" >&2;} itcl_LIB_SPEC=${itcl_BUILD_LIB_SPEC} itcl_STUB_LIB_SPEC=${itcl_BUILD_STUB_LIB_SPEC} itcl_STUB_LIB_PATH=${itcl_BUILD_STUB_LIB_PATH} fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' #-------------------------------------------------------------------- # See if --with-itcl was specified to give the [incr Tcl] and [incr Tk] # source code location. If not, then we'll assume that the Iwidgets # package is being installed directly beneath the toplevel Itcl directory. #-------------------------------------------------------------------- #AC_ARG_WITH(itcl, [ --with-itcl=DIR use Itcl 3.0 binaries from DIR], # itcl_search=$withval, itcl_search=`cd ${srcdir}/..; pwd`) ITCL_LIB_DIR="" if test -r $itcl_SRC_DIR/library/itcl.tcl; then ITCL_LIB_DIR=$itcl_SRC_DIR/library fi if test -z "$ITCL_LIB_DIR"; then { { echo "$as_me:$LINENO: error: Can't find Itcl source. Use --with-itcl to specify the the toplevel incr Tcl directory on your system. This directory should contain library/itcl.tcl." >&5 echo "$as_me: error: Can't find Itcl source. Use --with-itcl to specify the the toplevel incr Tcl directory on your system. This directory should contain library/itcl.tcl." >&2;} { (exit 1); exit 1; }; } fi # Check whether --with-itk or --without-itk was given. if test "${with_itk+set}" = set; then withval="$with_itk" itk_search=$withval else itk_search=`cd ${srcdir}/..; pwd` fi; ITK_LIB_DIR="" if test -r $itk_search/library/itk.tcl; then ITK_LIB_DIR=$itk_search/library ITK_SRC_DIR=$itk_search fi if test -z "$ITK_LIB_DIR"; then { { echo "$as_me:$LINENO: error: Can't find Itk source. Use --with-itk to specify the the toplevel incr Tk directory on your system. This directory should contain library/itk.tcl." >&5 echo "$as_me: error: Can't find Itk source. Use --with-itk to specify the the toplevel incr Tk directory on your system. This directory should contain library/itk.tcl." >&2;} { (exit 1); exit 1; }; } fi #-------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before $prefix is used. #-------------------------------------------------------------------- if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then { echo "$as_me:$LINENO: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} prefix=${TCL_PREFIX} else { echo "$as_me:$LINENO: --prefix defaulting to /usr/local" >&5 echo "$as_me: --prefix defaulting to /usr/local" >&6;} prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then { echo "$as_me:$LINENO: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} exec_prefix=${TCL_EXEC_PREFIX} else { echo "$as_me:$LINENO: --exec-prefix defaulting to ${prefix}" >&5 echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} exec_prefix=$prefix fi fi #-------------------------------------------------------------------- # Needed for running the test suite #-------------------------------------------------------------------- ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std1 is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std1. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Allow the user to provide this setting in the env if test "x${TCLSH_PROG}" = "x" ; then echo "$as_me:$LINENO: checking for tclsh" >&5 echo $ECHO_N "checking for tclsh... $ECHO_C" >&6 if test "${ac_cv_path_tclsh+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else search_path=`echo ${PATH} | sed -e 's/:/ /g'` if test "${TEA_PLATFORM}" != "windows" -o \ \( "$do64bit_ok" = "no" -a "$doWince" = "no" \) ; then # Do not allow target tclsh in known cross-compile builds, # as we need one we can run on this system search_path="${TCL_BIN_DIR} ${TCL_BIN_DIR}/../bin ${exec_prefix}/bin ${prefix}/bin ${search_path}" fi for dir in $search_path ; do for j in `ls -r $dir/tclsh[8-9]*${EXEEXT} 2> /dev/null` \ `ls -r $dir/tclsh*${EXEEXT} 2> /dev/null` ; do if test x"$ac_cv_path_tclsh" = x ; then if test -f "$j" ; then ac_cv_path_tclsh=$j break fi fi done done fi if test -f "$ac_cv_path_tclsh" ; then TCLSH_PROG=$ac_cv_path_tclsh echo "$as_me:$LINENO: result: $TCLSH_PROG" >&5 echo "${ECHO_T}$TCLSH_PROG" >&6 else { { echo "$as_me:$LINENO: error: No tclsh found in PATH: $search_path" >&5 echo "$as_me: error: No tclsh found in PATH: $search_path" >&2;} { (exit 1); exit 1; }; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Step 0: Enable 64 bit support? echo "$as_me:$LINENO: checking if 64bit support is enabled" >&5 echo $ECHO_N "checking if 64bit support is enabled... $ECHO_C" >&6 # Check whether --enable-64bit or --disable-64bit was given. if test "${enable_64bit+set}" = set; then enableval="$enable_64bit" do64bit=$enableval else do64bit=no fi; echo "$as_me:$LINENO: result: $do64bit" >&5 echo "${ECHO_T}$do64bit" >&6 # Step 0.b: Enable Solaris 64 bit VIS support? echo "$as_me:$LINENO: checking if 64bit Sparc VIS support is requested" >&5 echo $ECHO_N "checking if 64bit Sparc VIS support is requested... $ECHO_C" >&6 # Check whether --enable-64bit-vis or --disable-64bit-vis was given. if test "${enable_64bit_vis+set}" = set; then enableval="$enable_64bit_vis" do64bitVIS=$enableval else do64bitVIS=no fi; echo "$as_me:$LINENO: result: $do64bitVIS" >&5 echo "${ECHO_T}$do64bitVIS" >&6 if test "$do64bitVIS" = "yes"; then # Force 64bit on with VIS do64bit=yes fi # Step 0.c: Cross-compiling options for Windows/CE builds? if test "${TEA_PLATFORM}" = "windows" ; then echo "$as_me:$LINENO: checking if Windows/CE build is requested" >&5 echo $ECHO_N "checking if Windows/CE build is requested... $ECHO_C" >&6 # Check whether --enable-wince or --disable-wince was given. if test "${enable_wince+set}" = set; then enableval="$enable_wince" doWince=$enableval else doWince=no fi; echo "$as_me:$LINENO: result: $doWince" >&5 echo "${ECHO_T}$doWince" >&6 fi # Step 1: set the variable "system" to hold the name and version number # for the system. This can usually be done via the "uname" command, but # there are a few systems, like Next, where this doesn't work. echo "$as_me:$LINENO: checking system version (for dynamic loading)" >&5 echo $ECHO_N "checking system version (for dynamic loading)... $ECHO_C" >&6 if test -f /usr/lib/NextStep/software_version; then system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` else system=`uname -s`-`uname -r` if test "$?" -ne 0 ; then echo "$as_me:$LINENO: result: unknown (can't find uname command)" >&5 echo "${ECHO_T}unknown (can't find uname command)" >&6 system=unknown else # Special check for weird MP-RAS system (uname returns weird # results, and the version is kept in special file). if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then system=MP-RAS-`awk '{print }' /etc/.relid'` fi if test "`uname -s`" = "AIX" ; then system=AIX-`uname -v`.`uname -r` fi if test "${TEA_PLATFORM}" = "windows" ; then system=windows fi echo "$as_me:$LINENO: result: $system" >&5 echo "${ECHO_T}$system" >&6 fi fi # Step 2: check for existence of -ldl library. This is needed because # Linux can use either -ldl or -ldld for dynamic loading. echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then have_dl=yes else have_dl=no fi # Step 3: set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and CC_SEARCH_FLAGS becomes LD_SEARCH_FLAGS for us # (and we have no CC_SEARCH_FLAGS). do64bit_ok=no LDFLAGS_ORIG="$LDFLAGS" TCL_EXPORT_FILE_SUFFIX="" UNSHARED_LIB_SUFFIX="" TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g if test "$GCC" = "yes" ; then CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall -Wno-implicit-int" else CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" fi TCL_NEEDS_EXP_FILE=0 TCL_BUILD_EXP_FILE="" TCL_EXP_FILE="" # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then echo "$as_me:$LINENO: result: $AR" >&5 echo "${ECHO_T}$AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" case $system in windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. if test "$do64bit" = "yes" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft SDK" fi # Ensure that this path has no spaces to work in autoconf if test "${TEA_PLATFORM}" = "windows" ; then # we need TCLSH_PROG defined to get Windows short pathnames echo "$as_me:$LINENO: checking short pathname for MSSDK (${MSSDK})" >&5 echo $ECHO_N "checking short pathname for MSSDK (${MSSDK})... $ECHO_C" >&6 shortpath= case "${MSSDK}" in *\ *) # Only do this if we need to. shortpath=`echo "puts [file attributes {${MSSDK}} -shortname] ; exit" | ${TCLSH_PROG} 2>/dev/null` ;; esac if test "x${shortpath}" = "x" ; then echo "$as_me:$LINENO: result: not changed" >&5 echo "${ECHO_T}not changed" >&6 else MSSDK=$shortpath echo "$as_me:$LINENO: result: ${MSSDK}" >&5 echo "${ECHO_T}${MSSDK}" >&6 fi fi if test ! -d "${MSSDK}/bin/win64" ; then { echo "$as_me:$LINENO: WARNING: could not find 64-bit SDK to enable 64bit mode" >&5 echo "$as_me: WARNING: could not find 64-bit SDK to enable 64bit mode" >&2;} do64bit="no" else do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" = "yes" ; then { { echo "$as_me:$LINENO: error: Windows/CE and 64-bit builds incompatible" >&5 echo "$as_me: error: Windows/CE and 64-bit builds incompatible" >&2;} { (exit 1); exit 1; }; } fi if test "$GCC" = "yes" ; then { { echo "$as_me:$LINENO: error: Windows/CE and GCC builds incompatible" >&5 echo "$as_me: error: Windows/CE and GCC builds incompatible" >&2;} { (exit 1); exit 1; }; } fi # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true # Check whether --with-celib or --without-celib was given. if test "${with_celib+set}" = set; then withval="$with_celib" with_celibconfig=${withval} fi; echo "$as_me:$LINENO: checking for Windows/CE celib directory" >&5 echo $ECHO_N "checking for Windows/CE celib directory... $ECHO_C" >&6 if test "${ac_cv_c_celibconfig+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else { { echo "$as_me:$LINENO: error: ${with_celibconfig} directory doesn't contain inc directory" >&5 echo "$as_me: error: ${with_celibconfig} directory doesn't contain inc directory" >&2;} { (exit 1); exit 1; }; } fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_celibconfig}" = x ; then { { echo "$as_me:$LINENO: error: Cannot find celib support library directory" >&5 echo "$as_me: error: Cannot find celib support library directory" >&2;} { (exit 1); exit 1; }; } else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} echo "$as_me:$LINENO: result: found $CELIB_DIR" >&5 echo "${ECHO_T}found $CELIB_DIR" >&6 if test "${TEA_PLATFORM}" = "windows" ; then # we need TCLSH_PROG defined to get Windows short pathnames echo "$as_me:$LINENO: checking short pathname for CELIB_DIR (${ac_cv_c_celibconfig})" >&5 echo $ECHO_N "checking short pathname for CELIB_DIR (${ac_cv_c_celibconfig})... $ECHO_C" >&6 shortpath= case "${ac_cv_c_celibconfig}" in *\ *) # Only do this if we need to. shortpath=`echo "puts [file attributes {${ac_cv_c_celibconfig}} -shortname] ; exit" | ${TCLSH_PROG} 2>/dev/null` ;; esac if test "x${shortpath}" = "x" ; then echo "$as_me:$LINENO: result: not changed" >&5 echo "${ECHO_T}not changed" >&6 else CELIB_DIR=$shortpath echo "$as_me:$LINENO: result: ${CELIB_DIR}" >&5 echo "${ECHO_T}${CELIB_DIR}" >&6 fi fi fi fi # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi # Ensure that this path has no spaces to work in autoconf if test "${TEA_PLATFORM}" = "windows" ; then # we need TCLSH_PROG defined to get Windows short pathnames echo "$as_me:$LINENO: checking short pathname for WCEROOT (${WCEROOT})" >&5 echo $ECHO_N "checking short pathname for WCEROOT (${WCEROOT})... $ECHO_C" >&6 shortpath= case "${WCEROOT}" in *\ *) # Only do this if we need to. shortpath=`echo "puts [file attributes {${WCEROOT}} -shortname] ; exit" | ${TCLSH_PROG} 2>/dev/null` ;; esac if test "x${shortpath}" = "x" ; then echo "$as_me:$LINENO: result: not changed" >&5 echo "${ECHO_T}not changed" >&6 else WCEROOT=$shortpath echo "$as_me:$LINENO: result: ${WCEROOT}" >&5 echo "${ECHO_T}${WCEROOT}" >&6 fi fi if test "${TEA_PLATFORM}" = "windows" ; then # we need TCLSH_PROG defined to get Windows short pathnames echo "$as_me:$LINENO: checking short pathname for SDKROOT (${SDKROOT})" >&5 echo $ECHO_N "checking short pathname for SDKROOT (${SDKROOT})... $ECHO_C" >&6 shortpath= case "${SDKROOT}" in *\ *) # Only do this if we need to. shortpath=`echo "puts [file attributes {${SDKROOT}} -shortname] ; exit" | ${TCLSH_PROG} 2>/dev/null` ;; esac if test "x${shortpath}" = "x" ; then echo "$as_me:$LINENO: result: not changed" >&5 echo "${ECHO_T}not changed" >&6 else SDKROOT=$shortpath echo "$as_me:$LINENO: result: ${SDKROOT}" >&5 echo "${ECHO_T}${SDKROOT}" >&6 fi fi if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then { { echo "$as_me:$LINENO: error: could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" >&5 echo "$as_me: error: could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" >&2;} { (exit 1); exit 1; }; } doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" = "yes" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="${MSSDK}/Bin/Win64/cl.exe" CFLAGS="${CFLAGS} -I${MSSDK}/Include/prerelease \ -I${MSSDK}/Include/Win64/crt \ -I${MSSDK}/Include" RC="${MSSDK}/bin/rc.exe" lflags="-MACHINE:IA64 -LIBPATH:${MSSDK}/Lib/IA64 \ -LIBPATH:${MSSDK}/Lib/Prerelease/IA64 -nologo" LINKBIN="${MSSDK}/bin/win64/link.exe" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="${CEBINROOT}/cl.exe" else CC="${CEBINROOT}/cl${ARCH}.exe" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="${WCEROOT}/Common/EVC/bin/rc.exe" arch=`echo ${ARCH} | awk '{print tolower($0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do cat >>confdefs.h <<_ACEOF #define $i 1 _ACEOF done cat >>confdefs.h <<_ACEOF #define _WIN32_WCE $CEVERSION _ACEOF cat >>confdefs.h <<_ACEOF #define UNDER_CE $CEVERSION _ACEOF CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="${CEBINROOT}/link.exe" else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode RC="windres" CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD="$CC -shared" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # This essentially turns it all on. LDFLAGS_DEBUG="-debug:full -debugtype:both -warn:2" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots # Bogus to avoid getting this turned off DL_OBJS="tclLoadNone.obj" ;; AIX-*) if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then # AIX requires the _r compiler when gcc isn't being used if test "${CC}" != "cc_r" ; then CC=${CC}_r fi echo "$as_me:$LINENO: result: Using $CC for compiling with threads" >&5 echo "${ECHO_T}Using $CC for compiling with threads" >&6 fi LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" SHLIB_LD_LIBS='${LIBS}' DL_OBJS="tclLoadDl.o" LD_LIBRARY_PATH_VAR="LIBPATH" # AIX v<=4.1 has some different flags than 4.2+ if test "$system" = "AIX-4.1" -o "`uname -v`" -lt "4" ; then #LIBOBJS="$LIBOBJS tclLoadAix.o" case $LIBOBJS in "tclLoadAix.$ac_objext" | \ *" tclLoadAix.$ac_objext" | \ "tclLoadAix.$ac_objext "* | \ *" tclLoadAix.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS tclLoadAix.$ac_objext" ;; esac DL_LIBS="-lld" fi # Check to enable 64-bit flags for compiler/linker on AIX 4+ if test "$do64bit" = "yes" -a "`uname -v`" -gt "3" ; then if test "$GCC" = "yes" ; then { echo "$as_me:$LINENO: WARNING: \"64bit mode not supported with GCC on $system\"" >&5 echo "$as_me: WARNING: \"64bit mode not supported with GCC on $system\"" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS="$LDFLAGS -q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" fi fi if test "`uname -m`" = "ia64" ; then # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" # AIX-5 has dl* in libc.so DL_LIBS="" if test "$GCC" = "yes" ; then LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else LD_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' fi else if test "$GCC" = "yes" ; then SHLIB_LD="gcc -shared" else SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry" fi SHLIB_LD="${TCL_SRC_DIR}/unix/ldAix ${SHLIB_LD} ${SHLIB_LD_FLAGS}" DL_LIBS="-ldl" LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' TCL_NEEDS_EXP_FILE=1 TCL_EXPORT_FILE_SUFFIX='${PACKAGE_VERSION}.exp' fi # On AIX <=v4 systems, libbsd.a has to be linked in to support # non-blocking file IO. This library has to be linked in after # the MATH_LIBS or it breaks the pow() function. The way to # insure proper sequencing, is to add it to the tail of MATH_LIBS. # This library also supplies gettimeofday. # # AIX does not have a timezone field in struct tm. When the AIX # bsd library is used, the timezone global and the gettimeofday # methods are to be avoided for timezone deduction instead, we # deduce the timezone by comparing the localtime result on a # known GMT value. echo "$as_me:$LINENO: checking for gettimeofday in -lbsd" >&5 echo $ECHO_N "checking for gettimeofday in -lbsd... $ECHO_C" >&6 if test "${ac_cv_lib_bsd_gettimeofday+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gettimeofday (); int main () { gettimeofday (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_bsd_gettimeofday=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_bsd_gettimeofday=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gettimeofday" >&5 echo "${ECHO_T}$ac_cv_lib_bsd_gettimeofday" >&6 if test $ac_cv_lib_bsd_gettimeofday = yes; then libbsd=yes else libbsd=no fi if test $libbsd = yes; then MATH_LIBS="$MATH_LIBS -lbsd" cat >>confdefs.h <<\_ACEOF #define USE_DELTA_FOR_TZ 1 _ACEOF fi ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -nostart" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" ;; BSD/OS-2.1*|BSD/OS-3*) SHLIB_CFLAGS="" SHLIB_LD="shlicc -r" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" LD_SEARCH_FLAGS="" ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD="cc -shared" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" LDFLAGS="$LDFLAGS -export-dynamic" LD_SEARCH_FLAGS="" ;; dgux*) SHLIB_CFLAGS="-K PIC" SHLIB_LD="cc -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" LD_SEARCH_FLAGS="" ;; HP-UX-*.11.*) # Use updated header definitions where possible cat >>confdefs.h <<\_ACEOF #define _XOPEN_SOURCE_EXTENDED 1 _ACEOF SHLIB_SUFFIX=".sl" echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" SHLIB_LD_LIBS='${LIBS}' DL_OBJS="tclLoadShl.o" DL_LIBS="-ldld" LDFLAGS="$LDFLAGS -Wl,-E" LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" fi if test "$GCC" = "yes" ; then SHLIB_LD="gcc -shared" SHLIB_LD_LIBS='${LIBS}' LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' fi # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes" ; then if test "$GCC" = "yes" ; then hpux_arch=`${CC} -dumpmachine` case $hpux_arch in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD="${CC} -shared" SHLIB_LD_LIBS='${LIBS}' ;; *) { echo "$as_me:$LINENO: WARNING: \"64bit mode not supported with GCC on $system\"" >&5 echo "$as_me: WARNING: \"64bit mode not supported with GCC on $system\"" >&2;} ;; esac else do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS="$LDFLAGS +DD64" fi fi ;; HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*) SHLIB_SUFFIX=".sl" echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" SHLIB_LD_LIBS="" DL_OBJS="tclLoadShl.o" DL_LIBS="-ldld" LDFLAGS="$LDFLAGS -Wl,-E" LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' fi LD_LIBRARY_PATH_VAR="SHLIB_PATH" ;; IRIX-4.*) SHLIB_CFLAGS="-G 0" SHLIB_SUFFIX=".a" SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0" SHLIB_LD_LIBS='${LIBS}' DL_OBJS="tclLoadAout.o" DL_LIBS="" LDFLAGS="$LDFLAGS -Wl,-D,08000000" LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' SHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' ;; IRIX-5.*) SHLIB_CFLAGS="" SHLIB_LD="ld -shared -rdata_shared" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' ;; IRIX-6.*|IRIX64-6.5*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' if test "$GCC" = "yes" ; then CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" else case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" fi ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes" ; then if test "$GCC" = "yes" ; then { echo "$as_me:$LINENO: WARNING: 64bit mode not supported by gcc" >&5 echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS="$LDFLAGS -64" fi fi ;; Linux*) SHLIB_CFLAGS="-fPIC" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # egcs-2.91.66 on Redhat Linux 6.0 generates lots of warnings # when you inline the string and math operations. Turn this off to # get rid of the warnings. #CFLAGS_OPTIMIZE="${CFLAGS_OPTIMIZE} -D__NO_STRING_INLINES -D__NO_MATH_INLINES" if test "$have_dl" = yes; then SHLIB_LD="${CC} -shared" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" LDFLAGS="$LDFLAGS -Wl,--export-dynamic" LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' else if test "${ac_cv_header_dld_h+set}" = set; then echo "$as_me:$LINENO: checking for dld.h" >&5 echo $ECHO_N "checking for dld.h... $ECHO_C" >&6 if test "${ac_cv_header_dld_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_dld_h" >&5 echo "${ECHO_T}$ac_cv_header_dld_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking dld.h usability" >&5 echo $ECHO_N "checking dld.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking dld.h presence" >&5 echo $ECHO_N "checking dld.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: dld.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: dld.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: dld.h: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: dld.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: dld.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: dld.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: dld.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: dld.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: dld.h: see the Autoconf documentation" >&5 echo "$as_me: WARNING: dld.h: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: dld.h: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: dld.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: dld.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: dld.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: dld.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: dld.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------- ## ## Report this to the iwidgets lists. ## ## ----------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for dld.h" >&5 echo $ECHO_N "checking for dld.h... $ECHO_C" >&6 if test "${ac_cv_header_dld_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_dld_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_dld_h" >&5 echo "${ECHO_T}$ac_cv_header_dld_h" >&6 fi if test $ac_cv_header_dld_h = yes; then SHLIB_LD="ld -shared" DL_OBJS="tclLoadDld.o" DL_LIBS="-ldld" LD_SEARCH_FLAGS="" fi fi if test "`uname -m`" = "alpha" ; then CFLAGS="$CFLAGS -mieee" fi # The combo of gcc + glibc has a bug related # to inlining of functions like strtod(). The # -fno-builtin flag should address this problem # but it does not work. The -fno-inline flag # is kind of overkill but it works. # Disable inlining only when one of the # files in compat/*.c is being linked in. if test x"${USE_COMPAT}" != x ; then CFLAGS="$CFLAGS -fno-inline" fi ;; GNU*) SHLIB_CFLAGS="-fPIC" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".so" if test "$have_dl" = yes; then SHLIB_LD="${CC} -shared" DL_OBJS="" DL_LIBS="-ldl" LDFLAGS="$LDFLAGS -Wl,--export-dynamic" LD_SEARCH_FLAGS="" else if test "${ac_cv_header_dld_h+set}" = set; then echo "$as_me:$LINENO: checking for dld.h" >&5 echo $ECHO_N "checking for dld.h... $ECHO_C" >&6 if test "${ac_cv_header_dld_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_dld_h" >&5 echo "${ECHO_T}$ac_cv_header_dld_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking dld.h usability" >&5 echo $ECHO_N "checking dld.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking dld.h presence" >&5 echo $ECHO_N "checking dld.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: dld.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: dld.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: dld.h: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: dld.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: dld.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: dld.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: dld.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: dld.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: dld.h: see the Autoconf documentation" >&5 echo "$as_me: WARNING: dld.h: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: dld.h: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: dld.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: dld.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: dld.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: dld.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: dld.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------- ## ## Report this to the iwidgets lists. ## ## ----------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for dld.h" >&5 echo $ECHO_N "checking for dld.h... $ECHO_C" >&6 if test "${ac_cv_header_dld_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_dld_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_dld_h" >&5 echo "${ECHO_T}$ac_cv_header_dld_h" >&6 fi if test $ac_cv_header_dld_h = yes; then SHLIB_LD="ld -shared" DL_OBJS="" DL_LIBS="-ldld" LD_SEARCH_FLAGS="" fi fi if test "`uname -m`" = "alpha" ; then CFLAGS="$CFLAGS -mieee" fi ;; MP-RAS-02*) SHLIB_CFLAGS="-K PIC" SHLIB_LD="cc -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" LD_SEARCH_FLAGS="" ;; MP-RAS-*) SHLIB_CFLAGS="-K PIC" SHLIB_LD="cc -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" LDFLAGS="$LDFLAGS -Wl,-Bexport" LD_SEARCH_FLAGS="" ;; NetBSD-*|FreeBSD-[1-2].*) # Not available on all versions: check for include file. if test "${ac_cv_header_dlfcn_h+set}" = set; then echo "$as_me:$LINENO: checking for dlfcn.h" >&5 echo $ECHO_N "checking for dlfcn.h... $ECHO_C" >&6 if test "${ac_cv_header_dlfcn_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_dlfcn_h" >&5 echo "${ECHO_T}$ac_cv_header_dlfcn_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking dlfcn.h usability" >&5 echo $ECHO_N "checking dlfcn.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking dlfcn.h presence" >&5 echo $ECHO_N "checking dlfcn.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: dlfcn.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: dlfcn.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: dlfcn.h: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: dlfcn.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: dlfcn.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: dlfcn.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: dlfcn.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: dlfcn.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: dlfcn.h: see the Autoconf documentation" >&5 echo "$as_me: WARNING: dlfcn.h: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: dlfcn.h: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: dlfcn.h: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: dlfcn.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: dlfcn.h: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: dlfcn.h: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: dlfcn.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ----------------------------------- ## ## Report this to the iwidgets lists. ## ## ----------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for dlfcn.h" >&5 echo $ECHO_N "checking for dlfcn.h... $ECHO_C" >&6 if test "${ac_cv_header_dlfcn_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_dlfcn_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_dlfcn_h" >&5 echo "${ECHO_T}$ac_cv_header_dlfcn_h" >&6 fi if test $ac_cv_header_dlfcn_h = yes; then # NetBSD/SPARC needs -fPIC, -fpic will not do. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' echo "$as_me:$LINENO: checking for ELF" >&5 echo $ECHO_N "checking for ELF... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __ELF__ yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.1.0' fi rm -f conftest* else SHLIB_CFLAGS="" SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".a" DL_OBJS="tclLoadAout.o" DL_LIBS="" LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' fi # FreeBSD doesn't handle version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; OpenBSD-*) SHLIB_LD="${CC} -shared" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" LD_SEARCH_FLAGS="" echo "$as_me:$LINENO: checking for ELF" >&5 echo $ECHO_N "checking for ELF... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __ELF__ yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.1.0' else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.1.0' fi rm -f conftest* # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; FreeBSD-*) # FreeBSD 3.* and greater have ELF. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" LDFLAGS="$LDFLAGS -export-dynamic" LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' if test "${TCL_THREADS}" = "1" ; then # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi case $system in FreeBSD-3.*) # FreeBSD-3 doesn't handle version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' TCL_LIB_VERSIONS_OK=nodots ;; esac ;; Darwin-*) SHLIB_CFLAGS="-fno-common" SHLIB_LD="cc -dynamiclib \${LDFLAGS}" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".dylib" DL_OBJS="tclLoadDyld.o" DL_LIBS="" LDFLAGS="$LDFLAGS -prebind -Wl,-search_paths_first" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" CFLAGS_OPTIMIZE="-Os" ;; NEXTSTEP-*) SHLIB_CFLAGS="" SHLIB_LD="cc -nostdlib -r" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadNext.o" DL_LIBS="" LD_SEARCH_FLAGS="" ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy cat >>confdefs.h <<\_ACEOF #define _OE_SOCKETS 1 _ACEOF # needed in sys/socket.h ;; OSF1-1.0|OSF1-1.1|OSF1-1.2) # OSF/1 1.[012] from OSF, and derivatives, including Paragon OSF/1 SHLIB_CFLAGS="" # Hack: make package name same as library name SHLIB_LD='ld -R -export :' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadOSF.o" DL_LIBS="" LD_SEARCH_FLAGS="" ;; OSF1-1.*) # OSF/1 1.3 from OSF using ELF, and derivatives, including AD2 SHLIB_CFLAGS="-fPIC" if test "$SHARED_BUILD" = "1" ; then SHLIB_LD="ld -shared" else SHLIB_LD="ld -non_shared" fi SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" LD_SEARCH_FLAGS="" ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = "1" ; then SHLIB_LD='ld -shared -expect_unresolved "*"' else SHLIB_LD='ld -non_shared -expect_unresolved "*"' fi SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' if test "$GCC" = "yes" ; then CFLAGS="$CFLAGS -mieee" else CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" fi # see pthread_intro(3) for pthread support on osf1, k.furukawa if test "${TCL_THREADS}" = "1" ; then CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` if test "$GCC" = "yes" ; then LIBS="$LIBS -lpthread -lmach -lexc" else CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi fi ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" # dlopen is in -lc on QNX DL_LIBS="" LD_SEARCH_FLAGS="" ;; RISCos-*) SHLIB_CFLAGS="-G 0" SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0" SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".a" DL_OBJS="tclLoadAout.o" DL_LIBS="" LDFLAGS="$LDFLAGS -Wl,-D,08000000" LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' ;; SCO_SV-3.2*) # Note, dlopen is available only on SCO 3.2.5 and greater. However, # this test works, since "uname -s" was non-standard in 3.2.4 and # below. if test "$GCC" = "yes" ; then SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" else SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" fi SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" LD_SEARCH_FLAGS="" ;; SINIX*5.4*) SHLIB_CFLAGS="-K PIC" SHLIB_LD="cc -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" LD_SEARCH_FLAGS="" ;; SunOS-4*) SHLIB_CFLAGS="-PIC" SHLIB_LD="ld" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' # SunOS can't handle version numbers with dots in them in library # specs, like -ltcl7.5, so use -ltcl75 instead. Also, it # requires an extra version number at the end of .so file names. # So, the library has to have a name like libtcl75.so.1.0 SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.1.0' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; SunOS-5.[0-6]*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. cat >>confdefs.h <<\_ACEOF #define _REENTRANT 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _POSIX_PTHREAD_SEMANTICS 1 _ACEOF SHLIB_CFLAGS="-KPIC" # Note: need the LIBS below, otherwise Tk won't find Tcl's # symbols when dynamically loaded into tclsh. SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" if test "$GCC" = "yes" ; then SHLIB_LD="$CC -shared" LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else SHLIB_LD="/usr/ccs/bin/ld -G -z text" LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. cat >>confdefs.h <<\_ACEOF #define _REENTRANT 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define _POSIX_PTHREAD_SEMANTICS 1 _ACEOF SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes" ; then arch=`isainfo` if test "$arch" = "sparcv9 sparc" ; then if test "$GCC" = "yes" ; then if test "`gcc -dumpversion` | awk -F. '{print }'" -lt "3" ; then { echo "$as_me:$LINENO: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" fi else do64bit_ok=yes if test "$do64bitVIS" = "yes" ; then CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS="$LDFLAGS -xarch=v9a" else CFLAGS="$CFLAGS -xarch=v9" LDFLAGS="$LDFLAGS -xarch=v9" fi fi else { echo "$as_me:$LINENO: WARNING: \"64bit mode only supported sparcv9 system\"" >&5 echo "$as_me: WARNING: \"64bit mode only supported sparcv9 system\"" >&2;} fi fi # Note: need the LIBS below, otherwise Tk won't find Tcl's # symbols when dynamically loaded into tclsh. SHLIB_LD_LIBS='${LIBS}' SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" if test "$GCC" = "yes" ; then SHLIB_LD="$CC -shared" LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' if test "$do64bit" = "yes" ; then # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #LD_SEARCH_FLAGS="${LD_SEARCH_FLAGS},-R,$v9gcclibdir" fi else SHLIB_LD="/usr/ccs/bin/ld -G -z text" LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; ULTRIX-4.*) SHLIB_CFLAGS="-G 0" SHLIB_SUFFIX=".a" SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0" SHLIB_LD_LIBS='${LIBS}' DL_OBJS="tclLoadAout.o" DL_LIBS="" LDFLAGS="$LDFLAGS -Wl,-D,08000000" LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' if test "$GCC" != "yes" ; then CFLAGS="$CFLAGS -DHAVE_TZSET -std1" fi ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD="cc -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="-ldl" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. hold_ldflags=$LDFLAGS echo "$as_me:$LINENO: checking for ld accepts -Bexport flag" >&5 echo $ECHO_N "checking for ld accepts -Bexport flag... $ECHO_C" >&6 LDFLAGS="$LDFLAGS -Wl,-Bexport" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then found=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 LDFLAGS=$hold_ldflags found=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext echo "$as_me:$LINENO: result: $found" >&5 echo "${ECHO_T}$found" >&6 LD_SEARCH_FLAGS="" ;; esac if test "$do64bit" = "yes" -a "$do64bit_ok" = "no" ; then { echo "$as_me:$LINENO: WARNING: \"64bit support being disabled -- don\'t know magic for this platform\"" >&5 echo "$as_me: WARNING: \"64bit support being disabled -- don\'t know magic for this platform\"" >&2;} fi # Step 4: If pseudo-static linking is in use (see K. B. Kenny, "Dynamic # Loading for Tcl -- What Became of It?". Proc. 2nd Tcl/Tk Workshop, # New Orleans, LA, Computerized Processes Unlimited, 1994), then we need # to determine which of several header files defines the a.out file # format (a.out.h, sys/exec.h, or sys/exec_aout.h). At present, we # support only a file format that is more or less version-7-compatible. # In particular, # - a.out files must begin with `struct exec'. # - the N_TXTOFF on the `struct exec' must compute the seek address # of the text segment # - The `struct exec' must contain a_magic, a_text, a_data, a_bss # and a_entry fields. # The following compilation should succeed if and only if either sys/exec.h # or a.out.h is usable for the purpose. # # Note that the modified COFF format used on MIPS Ultrix 4.x is usable; the # `struct exec' includes a second header that contains information that # duplicates the v7 fields that are needed. if test "x$DL_OBJS" = "xtclLoadAout.o" ; then echo "$as_me:$LINENO: checking sys/exec.h" >&5 echo $ECHO_N "checking sys/exec.h... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { struct exec foo; unsigned long seek; int flag; #if defined(__mips) || defined(mips) seek = N_TXTOFF (foo.ex_f, foo.ex_o); #else seek = N_TXTOFF (foo); #endif flag = (foo.a_magic == OMAGIC); return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then tcl_ok=usable else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 tcl_ok=unusable fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $tcl_ok" >&5 echo "${ECHO_T}$tcl_ok" >&6 if test $tcl_ok = usable; then cat >>confdefs.h <<\_ACEOF #define USE_SYS_EXEC_H 1 _ACEOF else echo "$as_me:$LINENO: checking a.out.h" >&5 echo $ECHO_N "checking a.out.h... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { struct exec foo; unsigned long seek; int flag; #if defined(__mips) || defined(mips) seek = N_TXTOFF (foo.ex_f, foo.ex_o); #else seek = N_TXTOFF (foo); #endif flag = (foo.a_magic == OMAGIC); return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then tcl_ok=usable else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 tcl_ok=unusable fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $tcl_ok" >&5 echo "${ECHO_T}$tcl_ok" >&6 if test $tcl_ok = usable; then cat >>confdefs.h <<\_ACEOF #define USE_A_OUT_H 1 _ACEOF else echo "$as_me:$LINENO: checking sys/exec_aout.h" >&5 echo $ECHO_N "checking sys/exec_aout.h... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { struct exec foo; unsigned long seek; int flag; #if defined(__mips) || defined(mips) seek = N_TXTOFF (foo.ex_f, foo.ex_o); #else seek = N_TXTOFF (foo); #endif flag = (foo.a_midmag == OMAGIC); return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then tcl_ok=usable else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 tcl_ok=unusable fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $tcl_ok" >&5 echo "${ECHO_T}$tcl_ok" >&6 if test $tcl_ok = usable; then cat >>confdefs.h <<\_ACEOF #define USE_SYS_EXEC_AOUT_H 1 _ACEOF else DL_OBJS="" fi fi fi fi # Step 5: disable dynamic loading if requested via a command-line switch. # Check whether --enable-load or --disable-load was given. if test "${enable_load+set}" = set; then enableval="$enable_load" tcl_ok=$enableval else tcl_ok=yes fi; if test "$tcl_ok" = "no"; then DL_OBJS="" fi if test "x$DL_OBJS" != "x" ; then BUILD_DLTEST="\$(DLTEST_TARGETS)" else echo "Can't figure out how to do dynamic loading or shared libraries" echo "on this system." SHLIB_CFLAGS="" SHLIB_LD="" SHLIB_SUFFIX="" DL_OBJS="tclLoadNone.o" DL_LIBS="" LDFLAGS="$LDFLAGS_ORIG" LD_SEARCH_FLAGS="" BUILD_DLTEST="" fi # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. if test "$DL_OBJS" != "tclLoadNone.o" ; then if test "$GCC" = "yes" ; then case $system in AIX-*) ;; BSD/OS*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*) ;; Darwin-*) ;; RISCos-*) ;; SCO_SV-3.2*) ;; ULTRIX-4.*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac fi fi if test "$SHARED_LIB_SUFFIX" = "" ; then SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' fi if test "$UNSHARED_LIB_SUFFIX" = "" ; then UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' fi # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary echo "$as_me:$LINENO: checking for required early compiler flags" >&5 echo $ECHO_N "checking for required early compiler flags... $ECHO_C" >&6 tcl_flags="" if test "${tcl_cv_flag__isoc99_source+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then tcl_cv_flag__isoc99_source=no else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _ISOC99_SOURCE 1 #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then tcl_cv_flag__isoc99_source=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 tcl_cv_flag__isoc99_source=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then cat >>confdefs.h <<\_ACEOF #define _ISOC99_SOURCE 1 _ACEOF tcl_flags="$tcl_flags _ISOC99_SOURCE" fi if test "${tcl_cv_flag__largefile64_source+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then tcl_cv_flag__largefile64_source=no else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _LARGEFILE64_SOURCE 1 #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then tcl_cv_flag__largefile64_source=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 tcl_cv_flag__largefile64_source=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then cat >>confdefs.h <<\_ACEOF #define _LARGEFILE64_SOURCE 1 _ACEOF tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" fi if test "x${tcl_flags}" = "x" ; then echo "$as_me:$LINENO: result: none" >&5 echo "${ECHO_T}none" >&6 else echo "$as_me:$LINENO: result: ${tcl_flags}" >&5 echo "${ECHO_T}${tcl_flags}" >&6 fi echo "$as_me:$LINENO: checking for 64-bit integer type" >&5 echo $ECHO_N "checking for 64-bit integer type... $ECHO_C" >&6 if test "${tcl_cv_type_64bit+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { __int64 value = (__int64) 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then tcl_type_64bit=__int64 else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 tcl_type_64bit="long long" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { switch (0) { case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; } ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then tcl_cv_type_64bit=${tcl_type_64bit} else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "${tcl_cv_type_64bit}" = none ; then cat >>confdefs.h <<\_ACEOF #define TCL_WIDE_INT_IS_LONG 1 _ACEOF echo "$as_me:$LINENO: result: using long" >&5 echo "${ECHO_T}using long" >&6 elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # We actually want to use the default tcl.h checks in this # case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* echo "$as_me:$LINENO: result: using Tcl header defaults" >&5 echo "${ECHO_T}using Tcl header defaults" >&6 else cat >>confdefs.h <<_ACEOF #define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} _ACEOF echo "$as_me:$LINENO: result: ${tcl_cv_type_64bit}" >&5 echo "${ECHO_T}${tcl_cv_type_64bit}" >&6 # Now check for auxiliary declarations echo "$as_me:$LINENO: checking for struct dirent64" >&5 echo $ECHO_N "checking for struct dirent64... $ECHO_C" >&6 if test "${tcl_cv_struct_dirent64+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { struct dirent64 p; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then tcl_cv_struct_dirent64=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 tcl_cv_struct_dirent64=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then cat >>confdefs.h <<\_ACEOF #define HAVE_STRUCT_DIRENT64 1 _ACEOF fi echo "$as_me:$LINENO: result: ${tcl_cv_struct_dirent64}" >&5 echo "${ECHO_T}${tcl_cv_struct_dirent64}" >&6 echo "$as_me:$LINENO: checking for struct stat64" >&5 echo $ECHO_N "checking for struct stat64... $ECHO_C" >&6 if test "${tcl_cv_struct_stat64+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { struct stat64 p; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then tcl_cv_struct_stat64=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 tcl_cv_struct_stat64=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_struct_stat64}" = "xyes" ; then cat >>confdefs.h <<\_ACEOF #define HAVE_STRUCT_STAT64 1 _ACEOF fi echo "$as_me:$LINENO: result: ${tcl_cv_struct_stat64}" >&5 echo "${ECHO_T}${tcl_cv_struct_stat64}" >&6 echo "$as_me:$LINENO: checking for off64_t" >&5 echo $ECHO_N "checking for off64_t... $ECHO_C" >&6 if test "${tcl_cv_type_off64_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { off64_t offset; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then tcl_cv_type_off64_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 tcl_cv_type_off64_t=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_type_off64_t}" = "xyes" ; then cat >>confdefs.h <<\_ACEOF #define HAVE_TYPE_OFF64_T 1 _ACEOF fi echo "$as_me:$LINENO: result: ${tcl_cv_type_off64_t}" >&5 echo "${ECHO_T}${tcl_cv_type_off64_t}" >&6 fi # Allow the user to provide this setting in the env if test "x${TCLSH_PROG}" = "x" ; then echo "$as_me:$LINENO: checking for tclsh" >&5 echo $ECHO_N "checking for tclsh... $ECHO_C" >&6 if test "${ac_cv_path_tclsh+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else search_path=`echo ${PATH} | sed -e 's/:/ /g'` if test "${TEA_PLATFORM}" != "windows" -o \ \( "$do64bit_ok" = "no" -a "$doWince" = "no" \) ; then # Do not allow target tclsh in known cross-compile builds, # as we need one we can run on this system search_path="${TCL_BIN_DIR} ${TCL_BIN_DIR}/../bin ${exec_prefix}/bin ${prefix}/bin ${search_path}" fi for dir in $search_path ; do for j in `ls -r $dir/tclsh[8-9]*${EXEEXT} 2> /dev/null` \ `ls -r $dir/tclsh*${EXEEXT} 2> /dev/null` ; do if test x"$ac_cv_path_tclsh" = x ; then if test -f "$j" ; then ac_cv_path_tclsh=$j break fi fi done done fi if test -f "$ac_cv_path_tclsh" ; then TCLSH_PROG=$ac_cv_path_tclsh echo "$as_me:$LINENO: result: $TCLSH_PROG" >&5 echo "${ECHO_T}$TCLSH_PROG" >&6 else { { echo "$as_me:$LINENO: error: No tclsh found in PATH: $search_path" >&5 echo "$as_me: error: No tclsh found in PATH: $search_path" >&2;} { (exit 1); exit 1; }; } fi fi # Allow the user to provide this setting in the env if test "x${WISH_PROG}" = "x" ; then echo "$as_me:$LINENO: checking for wish" >&5 echo $ECHO_N "checking for wish... $ECHO_C" >&6 if test "${ac_cv_path_wish+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else search_path=`echo ${PATH} | sed -e 's/:/ /g'` if test "${TEA_PLATFORM}" != "windows" -o \ \( "$do64bit_ok" = "no" -a "$doWince" = "no" \) ; then # Do not allow target wish in known cross-compile builds, # as we need one we can run on this system search_path="${TK_BIN_DIR} ${TK_BIN_DIR}/../bin ${TCL_BIN_DIR} ${TCL_BIN_DIR}/../bin ${exec_prefix}/bin ${prefix}/bin ${search_path}" fi for dir in $search_path ; do for j in `ls -r $dir/wish[8-9]*${EXEEXT} 2> /dev/null` \ `ls -r $dir/wish*${EXEEXT} 2> /dev/null` ; do if test x"$ac_cv_path_wish" = x ; then if test -f "$j" ; then ac_cv_path_wish=$j break fi fi done done fi if test -f "$ac_cv_path_wish" ; then WISH_PROG=$ac_cv_path_wish echo "$as_me:$LINENO: result: $WISH_PROG" >&5 echo "${ECHO_T}$WISH_PROG" >&6 else { { echo "$as_me:$LINENO: error: No wish found in PATH: $search_path" >&5 echo "$as_me: error: No wish found in PATH: $search_path" >&2;} { (exit 1); exit 1; }; } fi fi #-------------------------------------------------------------------- # Fill in template files with the proper info. #-------------------------------------------------------------------- ac_config_files="$ac_config_files Makefile iwidgets.tcl pkgIndex.tcl" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then we branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. cat >confdef2opt.sed <<\_ACEOF t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g p _ACEOF # We use echo to avoid assuming a particular line-breaking character. # The extra dot is to prevent the shell from consuming trailing # line-breaks from the sub-command output. A line-break within # single-quotes doesn't work because, if this script is created in a # platform that uses two characters for line-breaks (e.g., DOS), tr # would break. ac_LF_and_DOT=`echo; echo .` DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by iwidgets $as_me 4.1.0, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ iwidgets config.status 4.1.0 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "iwidgets.tcl" ) CONFIG_FILES="$CONFIG_FILES iwidgets.tcl" ;; "pkgIndex.tcl" ) CONFIG_FILES="$CONFIG_FILES pkgIndex.tcl" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@CYGPATH@,$CYGPATH,;t t s,@EXEEXT@,$EXEEXT,;t t s,@PKG_LIB_FILE@,$PKG_LIB_FILE,;t t s,@PKG_STUB_LIB_FILE@,$PKG_STUB_LIB_FILE,;t t s,@PKG_STUB_SOURCES@,$PKG_STUB_SOURCES,;t t s,@PKG_STUB_OBJECTS@,$PKG_STUB_OBJECTS,;t t s,@PKG_TCL_SOURCES@,$PKG_TCL_SOURCES,;t t s,@PKG_HEADERS@,$PKG_HEADERS,;t t s,@PKG_INCLUDES@,$PKG_INCLUDES,;t t s,@PKG_LIBS@,$PKG_LIBS,;t t s,@PKG_CFLAGS@,$PKG_CFLAGS,;t t s,@TCL_VERSION@,$TCL_VERSION,;t t s,@TCL_BIN_DIR@,$TCL_BIN_DIR,;t t s,@TCL_SRC_DIR@,$TCL_SRC_DIR,;t t s,@TCL_LIB_FILE@,$TCL_LIB_FILE,;t t s,@TCL_LIB_FLAG@,$TCL_LIB_FLAG,;t t s,@TCL_LIB_SPEC@,$TCL_LIB_SPEC,;t t s,@TCL_STUB_LIB_FILE@,$TCL_STUB_LIB_FILE,;t t s,@TCL_STUB_LIB_FLAG@,$TCL_STUB_LIB_FLAG,;t t s,@TCL_STUB_LIB_SPEC@,$TCL_STUB_LIB_SPEC,;t t s,@TCL_LIBS@,$TCL_LIBS,;t t s,@TCL_DEFS@,$TCL_DEFS,;t t s,@TCL_EXTRA_CFLAGS@,$TCL_EXTRA_CFLAGS,;t t s,@TCL_LD_FLAGS@,$TCL_LD_FLAGS,;t t s,@TCL_SHLIB_LD_LIBS@,$TCL_SHLIB_LD_LIBS,;t t s,@TK_VERSION@,$TK_VERSION,;t t s,@TK_BIN_DIR@,$TK_BIN_DIR,;t t s,@TK_SRC_DIR@,$TK_SRC_DIR,;t t s,@TK_LIB_FILE@,$TK_LIB_FILE,;t t s,@TK_LIB_FLAG@,$TK_LIB_FLAG,;t t s,@TK_LIB_SPEC@,$TK_LIB_SPEC,;t t s,@TK_STUB_LIB_FILE@,$TK_STUB_LIB_FILE,;t t s,@TK_STUB_LIB_FLAG@,$TK_STUB_LIB_FLAG,;t t s,@TK_STUB_LIB_SPEC@,$TK_STUB_LIB_SPEC,;t t s,@TK_LIBS@,$TK_LIBS,;t t s,@TK_XINCLUDES@,$TK_XINCLUDES,;t t s,@itcl_VERSION@,$itcl_VERSION,;t t s,@itcl_BIN_DIR@,$itcl_BIN_DIR,;t t s,@itcl_SRC_DIR@,$itcl_SRC_DIR,;t t s,@itcl_LIB_FILE@,$itcl_LIB_FILE,;t t s,@itcl_LIB_SPEC@,$itcl_LIB_SPEC,;t t s,@itcl_STUB_LIB_FILE@,$itcl_STUB_LIB_FILE,;t t s,@itcl_STUB_LIB_SPEC@,$itcl_STUB_LIB_SPEC,;t t s,@itcl_STUB_LIB_PATH@,$itcl_STUB_LIB_PATH,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@OBJEXT@,$OBJEXT,;t t s,@AR@,$AR,;t t s,@TCLSH_PROG@,$TCLSH_PROG,;t t s,@CELIB_DIR@,$CELIB_DIR,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@CPP@,$CPP,;t t s,@EGREP@,$EGREP,;t t s,@DL_LIBS@,$DL_LIBS,;t t s,@CFLAGS_DEBUG@,$CFLAGS_DEBUG,;t t s,@CFLAGS_OPTIMIZE@,$CFLAGS_OPTIMIZE,;t t s,@CFLAGS_WARNING@,$CFLAGS_WARNING,;t t s,@STLIB_LD@,$STLIB_LD,;t t s,@SHLIB_LD@,$SHLIB_LD,;t t s,@SHLIB_CFLAGS@,$SHLIB_CFLAGS,;t t s,@SHLIB_LD_LIBS@,$SHLIB_LD_LIBS,;t t s,@LDFLAGS_DEBUG@,$LDFLAGS_DEBUG,;t t s,@LDFLAGS_OPTIMIZE@,$LDFLAGS_OPTIMIZE,;t t s,@LD_LIBRARY_PATH_VAR@,$LD_LIBRARY_PATH_VAR,;t t s,@WISH_PROG@,$WISH_PROG,;t t s,@ITCL_LIB_DIR@,$ITCL_LIB_DIR,;t t s,@ITK_LIB_DIR@,$ITK_LIB_DIR,;t t s,@ITK_SRC_DIR@,$ITK_SRC_DIR,;t t s,@IWIDGETS_SRC_DIR@,$IWIDGETS_SRC_DIR,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi iwidgets-4.1.0/configure.in0000644003604700454610000000562513125005611014241 0ustar dgp771divdnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during [incr Tcl] dnl installation to configure the system for the local environment. # RCS: $Id: configure.in,v 1.17 2017/06/28 20:03:21 dgp Exp $ AC_INIT([iwidgets], [4.1.0]) TEA_INIT([3.2]) AC_CONFIG_AUX_DIR(tclconfig) AC_CONFIG_SRCDIR([generic/buttonbox.itk]) #-------------------------------------------------------------------- # See if there was a command-line option for where Tcl or Tk is; if # not, search for Tcl and/or Tk. #-------------------------------------------------------------------- TEA_PATH_TCLCONFIG TEA_LOAD_TCLCONFIG TEA_PATH_TKCONFIG TEA_LOAD_TKCONFIG TEA_PATH_CONFIG(itcl) TEA_LOAD_CONFIG(itcl) AC_PROG_INSTALL #-------------------------------------------------------------------- # See if --with-itcl was specified to give the [incr Tcl] and [incr Tk] # source code location. If not, then we'll assume that the Iwidgets # package is being installed directly beneath the toplevel Itcl directory. #-------------------------------------------------------------------- #AC_ARG_WITH(itcl, [ --with-itcl=DIR use Itcl 3.0 binaries from DIR], # itcl_search=$withval, itcl_search=`cd ${srcdir}/..; pwd`) ITCL_LIB_DIR="" if test -r $itcl_SRC_DIR/library/itcl.tcl; then ITCL_LIB_DIR=$itcl_SRC_DIR/library fi if test -z "$ITCL_LIB_DIR"; then AC_MSG_ERROR([Can't find Itcl source. Use --with-itcl to specify the the toplevel [incr Tcl] directory on your system. This directory should contain library/itcl.tcl.]) fi AC_ARG_WITH(itk, [ --with-itk=DIR use Itk 3.0 binaries from DIR], itk_search=$withval, itk_search=`cd ${srcdir}/..; pwd`) ITK_LIB_DIR="" if test -r $itk_search/library/itk.tcl; then ITK_LIB_DIR=$itk_search/library ITK_SRC_DIR=$itk_search fi if test -z "$ITK_LIB_DIR"; then AC_MSG_ERROR([Can't find Itk source. Use --with-itk to specify the the toplevel [incr Tk] directory on your system. This directory should contain library/itk.tcl.]) fi #-------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before $prefix is used. #-------------------------------------------------------------------- TEA_PREFIX #-------------------------------------------------------------------- # Needed for running the test suite #-------------------------------------------------------------------- TEA_CONFIG_CFLAGS([]) TEA_PROG_TCLSH TEA_PROG_WISH #-------------------------------------------------------------------- # Fill in template files with the proper info. #-------------------------------------------------------------------- AC_SUBST(TCL_SRC_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(ITCL_LIB_DIR) AC_SUBST(ITK_LIB_DIR) AC_SUBST(ITK_SRC_DIR) AC_SUBST(IWIDGETS_SRC_DIR) AC_OUTPUT([Makefile iwidgets.tcl pkgIndex.tcl]) iwidgets-4.1.0/iwidgets.tcl.in0000644003604700454610000000257313127755700014674 0ustar dgp771div# # iwidgets.tcl # ---------------------------------------------------------------------- # Invoked automatically by [incr Tk] upon startup to initialize # the [incr Widgets] package. # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com # # @(#) $Id: iwidgets.tcl.in,v 1.8 2017/07/07 19:06:40 dgp Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 Mark L. Ulferts # ====================================================================== # See the file "license.terms" for information on usage and # redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. package require Tcl 8.0 package require Tk 8.0 package require Itcl @itcl_VERSION@ if {[string length [package provide Itk]] == 0} { package forget Itk package forget itk } package require Itk [string index @itcl_VERSION@ 0] namespace eval ::iwidgets { namespace export * variable library [file dirname [info script]] variable version @PACKAGE_VERSION@ lappend auto_path $iwidgets::library variable subdir foreach subdir {generic scripts} { if {[file isdirectory [file join $iwidgets::library $subdir]]} { lappend auto_path [file join $iwidgets::library $subdir] } } unset subdir } package provide Iwidgets $iwidgets::version iwidgets-4.1.0/license.terms0000644003604700454610000000333706557145750014450 0ustar dgp771divThis software is copyrighted by DSC Technologies and private individual contributors. The copyright holder is specifically listed in the header of each file. The following terms apply to all files associated with the software unless explicitly disclaimed in individual files by private contributors. Copyright 1997 DSC Technologies Corporation Permission to use, copy, modify, distribute and license this software and its documentation for any purpose, and without fee or written agreement with DSC, is hereby granted, provided that the above copyright notice appears in all copies and that both the copyright notice and warranty disclaimer below appear in supporting documentation, and that the names of DSC Technologies Corporation or DSC Communications Corporation not be used in advertising or publicity pertaining to the software without specific, written prior permission. DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. RESTRICTED RIGHTS: Use, duplication or disclosure by the government is subject to the restrictions as set forth in subparagraph (c) (1) (ii) of the Rights in Technical Data and Computer Software Clause as DFARS 252.227-7013 and FAR 52.227-19. iwidgets-4.1.0/pkgIndex.tcl.in0000644003604700454610000000017710175313474014622 0ustar dgp771div# Tcl package index file, version 1.0 package ifneeded Iwidgets @PACKAGE_VERSION@ [list source [file join $dir iwidgets.tcl]] iwidgets-4.1.0/doc/0000755003604700454610000000000013136712366012503 5ustar dgp771diviwidgets-4.1.0/doc/buttonbox.n0000644003604700454610000001506507476742023014720 0ustar dgp771div'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) buttonbox.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::buttonbox iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::buttonbox \- Create and manipulate a manager widget for buttons .SH SYNOPSIS \fBiwidgets::buttonbox\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::buttonbox .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fBbackground\fR \fBcursor\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "WIDGET-SPECIFIC OPTIONS" .ta 4c 8c 12c .LP .nf Name: \fBorient\fR Class: \fBOrient\fR Command-Line Switch: \fB-orient\fR .fi .IP Orientation of the button box: \fBhorizontal\fR or \fBvertical\fR. The default is horizontal. .LP .nf Name: \fBpadX\fR Class: \fBPadX\fR Command-Line Switch: \fB-padx\fR .fi .IP Specifies a non-negative padding distance to leave between the button group and the outer edge of the button box in the x direction. The value may be given in any of the forms acceptable to \fBTk_GetPixels\fR. The default is 5 pixels. .LP .nf Name: \fBpadY\fR Class: \fBPadY\fR Command-Line Switch: \fB-pady\fR .fi .IP Specifies a non-negative padding distance to leave between the button group and the outer edge of the button box in the y direction. The value may be given in any of the forms acceptable to \fBTk_GetPixels\fR. The default is 5 pixels. .LP .BE .SH DESCRIPTION .PP The \fBiwidgets::buttonbox\fR command creates a manager widget for controlling buttons. The button box also supports the display and invocation of a default button. The button box can be configured either horizontally or vertically. .SH "METHODS" .PP The \fBiwidgets::buttonbox\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. .PP Many of the widget commands for the buttonbox take as one argument an indicator of which button of the button box to operate on. These indicators are called \fIindexes\fR and allow reference and manipulation of buttons regardless of their current map state. buttonbox indexes may be specified in any of the following forms: .TP 12 \fInumber\fR Specifies the button numerically, where 0 corresponds to the left/top-most button of the button box. .TP 12 \fBend\fR Indicates the right/bottom-most button of the button box. .TP 12 \fBdefault\fR Indicates the current default button of the button box. This is the button with the default ring displayed. .TP 12 \fIpattern\fR If the index doesn't satisfy one of the above forms then this form is used. \fIPattern\fR is pattern-matched against the tag of each button in the button box, in order from left/top to right/left, until a matching entry is found. The rules of \fBTcl_StringMatch\fR are used. .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBadd\fR \fItag\fR \fIargs\fR Add a button distinguished by \fItag\fR to the end of the button box. If additional arguments are present they specify options to be applied to the button. See \fBPushButton\fR for information on the options available. .TP \fIpathName \fBbuttonconfigure\fR \fIindex\fR ?\fIoptions\fR? This command is similar to the \fBconfigure\fR command, except that it applies to the options for an individual button, whereas \fBconfigure\fR applies to the options for the button box as a whole. \fIOptions\fR may have any of the values accepted by the \fBPushButton\fR command. If \fIoptions\fR are specified, options are modified as indicated in the command and the command returns an empty string. If no \fIoptions\fR are specified, returns a list describing the current options for entry \fIindex\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::buttonbox\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::buttonbox\fR command. .TP \fIpathName \fBdefault\fR \fIindex\fR Sets the default button to the button given by \fIindex\fR. This causes the default ring to appear arround the specified button. .TP \fIpathName \fBdelete\fR \fIindex\fR Deletes the button given by \fIindex\fR from the button box. .TP \fIpathName \fBhide\fR \fIindex\fR Hides the button denoted by \fIindex\fR. This doesn't remove the button permanently, just inhibits its display. .TP \fIpathName \fBindex \fIindex\fR Returns the numerical index corresponding to \fIindex\fR. .TP \fIpathName \fBinsert \fIindex\fR \fItag\fR ?\fIoption value option value ...\fR? Same as the \fBadd\fR command except that it inserts the new button just before the one given by \fIindex\fR, instead of appending to the end of the button box. The \fIoption\fR, and \fIvalue\fR arguments have the same interpretation as for the \fBadd\fR widget command. .TP \fIpathName \fBinvoke\fR \fI?index?\fR Invoke the command associated with a button. If no arguments are given then the current default button is invoked, otherwise the argument is expected to be a button \fIindex\fR. .TP \fIpathName \fBshow\fR \fIindex\fR Display a previously hidden button denoted by \fIindex\fR. .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::buttonbox .bb .bb add Yes -text Yes -command "puts Yes" .bb add No -text No -command "puts No" .bb add Maybe -text Maybe -command "puts Maybe" .bb default Yes pack .bb -expand yes -fill both .DE .SH AUTHOR Bret A. Schuhmacher .DE Mark L. Ulferts .SH KEYWORDS buttonbox, pushbutton, button, widget iwidgets-4.1.0/doc/calendar.n0000644003604700454610000002350307476742023014441 0ustar dgp771div'\" '\" Copyright (c) 1997 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) calendar.n 1.0 97/04/30 16:04:44 '\" .so man.macros .HS iwidgets::calendar iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::calendar \- Create and manipulate a monthly calendar .SH SYNOPSIS \fBiwidgets::calendar\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::calendar .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fBbackground\fR \fBcursor\fR \fBforeground\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBint\fR .fi .LP See the "datefield" manual entry for details on this option. Note that this option is needed when the calendar is used in conjunction with the dateentry widget. It is necessary for support of international date formats in versions of Tk < 8.4. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBbackwardImage\fR Class: \fBImage\fR Command-Line Switch: \fB-backwardimage\fR .fi .IP Specifies a image to be displayed on the backwards calendar button. This image must have been created previously with the \fBimage create\fR command. If none is specified, a default is provided. .LP .nf Name: \fBbuttonForeground\fR Class: \fBForeground\fR Command-Line Switch: \fB-buttonforeground\fR .fi .IP Specifies the foreground color of the forward and backward buttons in any of the forms acceptable to \fBTk_GetColor\fR. The default color is blue. .LP .nf Name: \fBcommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-command\fR .fi .IP Specifies a Tcl script to executed upon selection of a date in the calendar. If the command script contains any \fB%\fR characters, then the script will not be executed directly. Instead, a new script will be generated by replacing each \fB%\fR, and the character following it, with information from the calendar. The replacement depends on the character following the \fB%\fR, as defined in the list below. .TP \fB%d\fR Replaced with the date selected in the format mm/dd/yyyy. .LP .nf Name: \fBcurrentDateFont\fR Class: \fBFont\fR Command-Line Switch: \fB-currentdatefont\fR .fi .IP Specifies the font used for the current date text in any of the forms acceptable to \fBTk_GetFont\fR. .LP .nf Name: \fBdateFont\fR Class: \fBFont\fR Command-Line Switch: \fB-datefont\fR .fi .IP Specifies the font used for the days of the month text in any of the forms acceptable to \fBTk_GetFont\fR. .LP .nf Name: \fBdayFont\fR Class: \fBFont\fR Command-Line Switch: \fB-dayfont\fR .fi .IP Specifies the font used for the days of the week text in any of the forms acceptable to \fBTk_GetFont\fR. .LP .nf Name: \fBdays\fR Class: \fBdays\fR Command-Line Switch: \fB-days\fR .fi .IP Specifies a list of values to be used for the days of the week text to displayed above the days of the month. The default value is {Su Mo Tu We Th Fr Sa}. .LP .nf Name: \fBforewardImage\fR Class: \fBImage\fR Command-Line Switch: \fB-forewardimage\fR .fi .IP Specifies a image to be displayed on the forewards calendar button. This image must have been created previously with the \fBimage create\fR command. If none is specified, a default is provided. .LP .nf Name: \fBheight\fR Class: \fBHeight\fR Command-Line Switch: \fB-height\fR .fi .IP Specifies a desired window height that the calendar widget should request from its geometry manager. The value may be specified in any of the forms acceptable to \fBTk_GetPixels\fR. The default height is 165 pixels. .LP .nf Name: \fBoutline\fR Class: \fBOutline\fR Command-Line Switch: \fB-outline\fR .fi .IP Specifies the outline color used to surround the days of the month text in any of the forms acceptable to \fBTk_GetColor\fR. The default is the same color as the background. .LP .nf Name: \fBselectColor\fR Class: \fBForeground\fR Command-Line Switch: \fB-selectcolor\fR .fi .IP Specifies the color of the ring displayed that distinguishes the currently selected date in any of the forms acceptable to \fBTk_GetColor\fR. The default is red. .LP .nf Name: \fBselectThickness\fR Class: \fBSelectThickness\fR Command-Line Switch: \fB-selectthickness\fR .fi .IP Specifies the thickness of the ring displayed that distinguishes the currently selected date. The default is 3 pixels. .LP .nf Name: \fBstartday\fR Class: \fBDay\fR Command-Line Switch: \fB-startday\fR .fi .IP Specifies the starting day for the week: \fBsunday\fR, \fBmonday\fR, \fBtuesday\fR, \fBwednesday\fR, \fBthursday\fR, \fBfriday\fR, or \fBsaturday\fR. The default is sunday. .LP .nf Name: \fBtitleFont\fR Class: \fBFont\fR Command-Line Switch: \fB-titlefont\fR .fi .IP Specifies the font used for the title text which consists of the month and year. The font may be given in any of the forms acceptable to \fBTk_GetFont\fR. .LP .nf Name: \fBweekdayBackground\fR Class: \fBBackground\fR Command-Line Switch: \fB-weekdaybackground\fR .fi .IP Specifies the background color for the weekdays which allows it to be visually distinguished from the weekend. The color may be given in any of the forms acceptable to \fBTk_GetColor\fR. The default is the same as the background. .LP .nf Name: \fBweekendBackground\fR Class: \fBBackground\fR Command-Line Switch: \fB-weekendbackground\fR .fi .IP Specifies the background color for the weekends which allows it to be visually distinguished from the weekdays. The color may be given in any of the forms acceptable to \fBTk_GetColor\fR. The default is the same as the background. .LP .nf Name: \fBwidth\fR Class: \fBWidth\fR Command-Line Switch: \fB-width\fR .fi .IP Specifies a desired window width that the calendar widget should request from its geometry manager. The value may be specified in any of the forms acceptable to \fBTk_GetPixels\fR. The default width is 200 pixels. .LP .BE .SH DESCRIPTION .PP The \fBiwidgets::calendar\fR command creates a calendar widget for the selection of a date, displaying a single month at a time. Buttons exist on the top to change the month in effect turning the pages of a calendar. As a page is turned, the dates for the month are modified. Selection of a date visually marks that date. The selected value can be monitored via the -command option or just retrieved using the get command. .SH "METHODS" .PP The \fBiwidgets::calendar\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for calendar widgets: .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::calendar\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::calendar\fR command. .TP \fIpathName \fBget\fR ?\fBformat\fR? Returns the currently selected date in a format of string or as an integer clock value using the \fB-string\fR and \fB-clicks\fR format options respectively. The default is by string. Reference the clock command for more information on obtaining dates and their formats. .TP \fIpathName \fBselect\fR \fIdate\fR Changes the currently selected date to the value specified which must be in the form of a date string, an integer clock value or as the keyword "now". Reference the clock command for more information on obtaining dates and their formats. Note that selecting a date does not change the month being shown to that of the date given. This chore is left to the \fBshow\fR command. .TP \fIpathName \fBshow\fR \fIdate\fR Changes the currently displayed date to be that of the date argument which must be in the form of a date string, an integer clock value or as the keyword "now". Reference the clock command for more information on obtaining dates and their formats. .SH "COMPONENTS" .LP .nf Name: \fBforward\fR Class: \fBButton\fR .fi .IP The forward component provides the button on the upper right of the calendar that changes the month to be the next. See the "button" widget manual entry for details on the forward component item. .LP .nf Name: \fBpage\fR Class: \fBCanvas\fR .fi .IP The page component provides the canvas on which the title, days of the week, and days of the month appear. See the "canvas" widget manual entry for details on the page component item. .LP .nf Name: \fBbackward\fR Class: \fBButton\fR .fi .TP The backward component provides the button on the upper right of the calendar that changes the month to be the next. See the "button" widget manual entry for details on the backward component item. .SH EXAMPLE .DS package require Iwidgets 4.0 proc selectCmd {date} { puts $date } iwidgets::calendar .c -command {selectCmd %d} \\ -weekendbackground mistyrose \\ -weekdaybackground ghostwhite -outline black \\ -startday wednesday -days {We Th Fr Sa Su Mo Tu} pack .c .DE .SH AUTHOR Mark L. Ulferts .DE Michael J. McLennan .SH KEYWORDS calendar, widget iwidgets-4.1.0/doc/canvasprintbox.n0000644003604700454610000002102707476742023015730 0ustar dgp771div'\" '\" iwidgets::canvasprintbox (c) 1995 Tako Schotanus '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" .so man.macros .HS iwidgets::canvasprintbox iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::canvasprintbox \- Create and manipulate a canvas print box widget .SH SYNOPSIS \fBiwidgets::canvasprintbox\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::Canvasprintbox .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB activeBackground background borderWidth cursor foreground highlightBackground highlightColor highlightThickness insertBackground insertBorderWidth insertOffTime insertOnTime insertWidth relief repeatDelay repeatInterval selectBackground selectBorderWidth selectForeground\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .IP .LP .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBfilename\fR Class: \fBFileName\fR Command-Line Switch: \fB-filename\fR .fi .IP The file to write the postscript output to (Only when output is set to "file"). If posterizing is turned on and \fBhpagecnt\fR and/or \fBvpagecnt\fR is more than 1, x.y is appended to the filename where x is the horizontal page number and y the vertical page number. .LP .nf Name: \fBhpagecnt\fR Class: \fBPageCnt\fR Command-Line Switch: \fB-hpagecnt\fR .fi .IP Is used in combination with \fBposterize\fR to determine over how many pages the output should be distributed. This attribute specifies how many pages should be used horizontaly. Any change to this attribute will automatically update the "stamp". Defaults to 1. .LP .nf Name: \fBorient\fR Class: \fBOrient\fR Command-Line Switch: \fB-orient\fR .fi .IP Determines the orientation of the output to the printer (or file). It can take the value "portrait" or "landscape" (default). Changes to this attribute will be reflected immediately in the "stamp". Defaults to "landscape" but will be changed automaticaly to the value deemed appropiate for the current canvas. Setting this attribute when the canvasprintbox is first constructed (instead of using the "configure" method) will turn off the auto adjustment of this attribute. .LP .nf Name: \fBoutput\fR Class: \fBOutput\fR Command-Line Switch: \fB-output\fR .fi .IP Specifies where the postscript output should go: to the printer or to a file. Can take on the values "printer" or "file". The corresponding entry-widget will reflect the contents of either the \fBprintcmd\fR attribute or the \fBfilename\fR attribute. Defaults to "printer". .LP .nf Name: \fBpageSize\fR Class: \fBPageSize\fR Command-Line Switch: \fB-pagesize\fR .fi .IP The pagesize the printer supports. Changes to this attribute will be reflected immediately in the "stamp". Defaults to "a4". .LP .nf Name: \fBposterize\fR Class: \fBPosterize\fR Command-Line Switch: \fB-posterize\fR .fi .IP Indicates if posterizing is turned on or not. Posterizing the output means that it is possible to distribute the output over more than one page. This way it is possible to print a canvas/region which is larger than the specified pagesize without stretching. If used in combination with stretching it can be used to "blow up" the contents of a canvas to as large as size as you want (See attributes: hpagecnt and vpagecnt). Any change to this attribute will automatically update the "stamp". Defaults to 0. .LP .nf Name: \fBprintCmd\fR Class: \fBPrintCmd\fR Command-Line Switch: \fB-printcmd\fR .fi .IP The command to execute when printing the postscript output. The command will get the postscript directed to its standard input (Only when output is set to "printer"). Defaults to "lpr". .LP .nf Name: \fBprintRegion\fR Class: \fBPrintRegion\fR Command-Line Switch: \fB-printregion\fR .fi .IP A list of four coordinates specifying which part of the canvas to print. An empty list means that the canvas' entire \fBscrollregion\fR should be printed. Any change to this attribute will automatically update the "stamp". Defaults to an empty list. .LP .nf Name: \fBstretch\fR Class: \fBStretch\fR Command-Line Switch: \fB-stretch\fR .fi .IP Determines if the output should be stretched to fill the page (as defined by the attribute pagesize) as large as possible. The aspect-ratio of the output will be retained and the output will never fall outside of the boundaries of the page. Defaults to 0 but will be changed automaticaly to the value deemed appropiate for the current canvas. Setting this attribute when the canvasprintbox is first constructed (instead of using the "configure" method) will turn off the auto adjustment of this attribute. .LP .nf Name: \fBvPageCnt\fR Class: \fBPageCnt\fR Command-Line Switch: \fB-vpagecnt\fR .fi .IP Is used in combination with "posterize" to determine over how many pages the output should be distributed. This attribute specifies how many pages should be used verticaly. Any change to this attribute will automatically update the "stamp". Defaults to 1. .LP .BE .SH DESCRIPTION .PP Implements a print box for printing the contents of a canvas widget to a printer or a file. It is possible to specify page orientation, the number of pages to print the image on and if the output should be stretched to fit the page. Options exist to control the appearance and actions of the widget. .SH "METHODS" .PP The \fBiwidgets::canvasprintbox\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for canvasprintbox widgets: .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::canvasprintbox\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::canvasprintbox\fR command. .TP \fIpathName\fR \fBgetoutput\fR Returns the value of the \fBprintercmd\fR or \fBfilename\fR option depending on the current setting of \fBoutput\fR. .TP \fIpathName\fR \fBprint\fR Perfrom the actual printing of the canvas using the current settings of all the attributes. Returns a boolean indicating wether the printing was successful or not. .TP \fIpathName\fR \fBrefresh\fR Retrieves the current value for all edit fields and updates the stamp accordingly. Is useful for Apply-buttons. .TP \fIpathName\fR \fBsetcanvas\fR \fIcanvas\fR This is used to set the \fIcanvas\fR that has to be printed. A stamp-sized copy will automatically be drawn to show how the output would look with the current settings. .TP \fIpathName \fBstop\fR Stops the drawing of the "stamp". I'm currently unable to detect when a Canvasprintbox gets destroyed or withdrawn. It's therefore advised that you perform a stop before you do something like that. .SH "COMPONENTS" .LP .nf Name: \fBprtflentry\fR Class: \fBEntry\fR .fi .IP The prtflentry component is the entry field for user input of the \fBfilename\fR or \fBprinter\fR command (depending on the value of \fBoutput\fR). .LP .nf Name: \fBhpcnt\fR Class: \fBEntry\fR .fi .IP The hpcnt component is the entry field for user input of the number of pages to use horizontaly when \fBposterize\fR is turned on. .fi .nf Name: \fBvpcnt\fR Class: \fBEntry\fR .fi .IP The vpcnt component is the entry field for user input of the number of pages to use verticaly when \fBposterize\fR is turned on. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::canvasprintbox .fsb -orient landscape -stretch 1 pack .fsb -padx 10 -pady 10 -fill both -expand yes .DE .SH AUTHOR Tako Schotanus .LP Tako.Schotanus@bouw.tno.nl .SH KEYWORDS canvasprintbox, widget iwidgets-4.1.0/doc/canvasprintdialog.n0000644003604700454610000001130507476742024016376 0ustar dgp771div'\" '\" iwidgets::canvasprintdialog (c) 1995 Mark L. Ulferts '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) canvasprintdialog.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::canvasprintdialog iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::canvasprintdialog \- Create and manipulate a canvas print dialog widget .SH SYNOPSIS \fBiwidgets::canvasprintdialog\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Toplevel <- iwidgets::Dialogshell <- iwidgets::Dialog <- iwidgets::Canvasprintdialog .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB activeBackground background borderWidth cursor foreground highlightBackground highlightColor highlightThickness insertBackground insertBorderWidth insertOffTime insertOnTime insertWidth relief repeatDelay repeatInterval selectBackground selectBorderWidth selectForeground\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBfilename\fR \fBhpagecnt\fR \fBorient\fR \fBoutput\fR \fBpagesize\fR \fBposterize\fR \fBprintcmd\fR \fBprintregion\fR \fBvpagecnt\fR .fi .LP See the "canvasprintbox" widget manual entry for details on the above associated options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR \fBpadY\fR \fBseparator\fR \fBthickness\fR .fi .LP See the "dialogshell" widget manual entry for details on the above inherited options. .LP .nf .ta 4c 8c 12c \fBmaster\fR \fBmodality\fR .fi .LP See the "shell" widget manual entry for details on the above inherited options. .LP .LP .nf .ta 4c 8c 12c \fBtitle\fR .fi .LP See the "Toplevel" widget manual entry for details on the above inherited options. .LP .SH "WIDGET-SPECIFIC OPTIONS" .LP .BE .SH DESCRIPTION .PP The \fBiwidgets::canvasprintdialog\fR command creates a print dialog for printing the contents of a canvas widget to a printer or a file. It is possible to specify page orientation, the number of pages to print the image on and if the output should be stretched to fit the page. .SH "METHODS" .PP The \fBiwidgets::canvasprintdialog\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for canvasprintdialog widgets: .SH "ASSOCIATED METHODS" .LP .nf .ta 4c 8c 12c \fBgetoutput\fR \fBsetcanvas\fR \fBrefresh\fR \fBprint\fR .fi .LP See the "canvasprintbox" class manual entry for details on the associated methods. .SH "INHERITED METHODS" .LP .nf .ta 4c 8c 12c \fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR \fBinsert\fR \fBinvoke\fR \fBshow\fR .fi .LP See the "buttonbox" widget manual entry for details on the above inherited methods. .LP .nf .ta 4c 8c 12c \fBactivate\fR \fBdeactivate\fR .fi .LP See the "dialogshell" widget manual entry for details on the above inherited methods. .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::canvasprintdialog\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::canvasprintdialog\fR command. .SH "COMPONENTS" .LP .nf Name: \fBcpb\fR Class: \fBCanvasprintbox\fR .fi .IP The cpb component is the canvas print box for the canvas print dialog. See the "canvasprintbox" widget manual entry for details on the cpb component item. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::canvasprintdialog .cpb .cpb activate .DE .SH AUTHOR Tako Schotanus .LP Tako.Schotanus@bouw.tno.nl .SH KEYWORDS canvasprintdialog, canvasprintbox, dialog, widget iwidgets-4.1.0/doc/checkbox.n0000644003604700454610000001416407476742024014462 0ustar dgp771div'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) checkbox.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::checkbox iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::checkbox \- Create and manipulate a checkbox widget .SH SYNOPSIS \fBiwidgets::checkbox\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::Labeledframe <- iwidgets::Checkbox .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fBbackground\fR \fBborderWidth\fR \fBcursor\fR \fBdisabledForeground\fR \fBforeground\fR \fBrelief\fR \fBselectColor\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR .fi .LP See the "labeledframe" class manual entry for details on the inherited options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBcommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-command\fR .fi .IP Specifies a Tcl command procedure to be evaluated following a change in the current check box selection. .LP .nf Name: \fBorient\fR Class: \fBOrient\fR Command-Line Switch: \fB-orient\fR Default Value: \fBvertical\fR .fi .IP Specifies the orientation of the checkbuttons within the checkbox. Valid values are either "horizontal" or "vertical". .LP .BE .SH DESCRIPTION .PP The \fBiwidgets::checkbox\fR command creates a check button box widget capable of adding, inserting, deleting, selecting, and configuring checkbuttons as well as obtaining the currently selected button. .SH "METHODS" .PP The \fBiwidgets::checkbox\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. .PP Many of the widget commands for the \fBcheckbox\fR take as one argument an indicator of which checkbutton of the checkbox to operate on. These indicators are called \fIindexes\fR and allow reference and manipulation of checkbuttons. Checkbox indexes may be specified in any of the following forms: .TP 12 \fInumber\fR Specifies the checkbutton numerically, where 0 corresponds to the top checkbutton of the checkbox. .TP 12 \fBend\fR Indicates the last checkbutton of the checkbox. .TP 12 \fIpattern\fR If the index doesn't satisfy one of the above forms then this form is used. \fIPattern\fR is pattern-matched against the tag of each checkbutton in the checkbox, in order from top to bottom, until a matching entry is found. The rules of \fBTcl_StringMatch\fR are used. .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBadd\fR \fItag\fR ?\fIoption value option value\fR? Adds a new checkbutton to the checkbuttond window on the bottom. The command takes additional options which are passed on to the checkbutton as construction arguments. These include the standard Tk checkbutton options. The tag is returned. .TP \fIpathName \fBbuttonconfigure\fR \fIindex\fR ?\fIoptions\fR? This command is similar to the \fBconfigure\fR command, except that it applies to the options for an individual checkbutton, whereas \fBconfigure\fRapplies to the options for the checkbox as a whole. \fIOptions\fR may have any of the values accepted by the \fBadd\fR widget command. If \fIoptions\fR are specified, options are modified as indicated in the command and the command returns an empty string. If no \fIoptions\fR are specified, returns a list describing the current options for entry \fIindex\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::checkbox\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::checkbox\fR command. .TP \fIpathName \fBdelete\fR \fIindex\fR Deletes a specified checkbutton given an \fIindex\fR. .TP \fIpathName \fBdeselect\fR \fIindex\fR Deselects a specified checkbutton given an \fIindex\fR. .TP \fIpathName \fBflash\fR \fIindex\fR Flashes a specified checkbutton given an \fIindex\fR. .TP \fIpathName \fBget\fR ?\fIindex\fR? Returns the tags of the currently selected checkbuttons or the selection status of specific checkbutton when given an index. .TP \fIpathName \fBindex\fR \fIindex\fR Returns the numerical index corresponding to index. .TP \fIpathName \fBinsert \fIindex\fR \fItag\fR ?\fIoption value option value ...\fR? Same as the \fBadd\fR command except that it inserts the new checkbutton just before the one given by \fIindex\fR, instead of appending to the end of the checkbox. The \fIoption\fR, and \fIvalue\fR arguments have the same interpretation as for the \fBadd\fR widget command. .TP \fIpathName \fBselect\fR \fIindex\fR Selects a specified checkbutton given an \fIindex\fR. .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::checkbox .cb -labeltext Styles .cb add bold -text Bold .cb add italic -text Italic .cb add underline -text Underline .cb select underline pack .cb -padx 10 -pady 10 -fill both -expand yes .DE .SH AUTHOR John A. Tucker .SH KEYWORDS checkbox, widget iwidgets-4.1.0/doc/combobox.n0000644003604700454610000003136507476742024014506 0ustar dgp771div'\" '\" Copyright (c) 1995 John S. Sigler '\" Copyright (c) 1997 Mitch Gorman '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) Combobox.n '\" .so man.macros .HS iwidgets::combobox iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::combobox \- Create and manipulate combination box widgets .SH SYNOPSIS \fBiwidgets::combobox\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::LabeledWidget <- iwidgets::Entryfield <- iwidgets::Combobox .SH "STANDARD OPTIONS" .LP .ta 4c 8c 12c .nf \fB background borderWidth cursor justify exportSelection foreground highlightColor highlightThickness insertWidth insertBackground insertOffTime insertOnTime insertWidth insertBorderWidth relief selectForeground selectBackground selectBorderWidth textVariable width\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBhscrollmode\fR \fBtextBackground\fR \fBtextFont\fR \fBvscrollmode\fR .fi .LP See the "scrolledlistbox" manual entry for details on the above inherited options. .LP .nf .ta 4c 8c 12c \fBshow\fR .fi .LP See the "entry" manual entry for details on the above inherited option. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBchildSitePos\fR \fBcommand\fR \fBfixed\fR \fBfocusCommand\fR \fBinvalid\fR \fBtextBackground\fR \fBtextFont\fR \fBvalidate\fR .fi .LP See the "entryfield" class manual entry for details on the inherited options. .LP .nf .ta 4c 8c 12c \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR \fBsticky\fR .fi .LP See the "labeledwidget" class manual entry for details on the inherited options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBarrowRelief\fR Class: \fBRelief\fR Command-Line Switch: \fB-arrowrelief\fR .fi .IP Specifies the relief style to use for a dropdown Combobox's arrow button in a normal (not depressed) state. Acceptable values are \fBraised\fR, \fBsunken\fR, \fBflat\fR, \fBridge\fR, and \fBgroove\fR. Sunken is discouraged as this is the relief used to indicate a depressed state. This option has no effect on simple Comboboxes. The default is raised. .LP .nf Name: \fBcompletion\fR Class: \fBCompletion\fR Command-Line Switch: \fB-completion\fR .fi .IP Boolean given in any of the forms acceptable to \fBTcl_GetBoolean\fR which determines whether insertions into the entry field, whether from the keyboard or programmatically via the \fBinsert\fR method, are automatically completed with the first matching item from the listbox. The default is true. .LP .nf Name: \fBdropdown\fR Class: \fBDropdown\fR Command-Line Switch: \fB-dropdown\fR .fi .IP Boolean describing the Combobox layout style given in any of the forms acceptable to \fBTcl_GetBoolean\fR. If true, the Combobox will be a dropdown style widget which displays an entry field and an arrow button which when activated will pop up a scrollable list of items. If false, a simple Combobox style will be used which has an entry field and a scrollable list beneath it which is always visible. Both styles allow an optional label for the entry field area. The default is true. .LP .nf Name: \fBeditable\fR Class: \fBEditable\fR Command-Line Switch: \fB-editable\fR .fi .IP Boolean describing whether or not the text entry area is editable by the user. If true the user can add items to the combobox by entering text into the entry area and then pressing Return. If false, the list of items is non-editable and can only be changed by calling the insert or delete methods. (The value in the entry field can still be modified by selecting from the list.) Given in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true. .LP .nf Name: \fBgrab\fR Class: \fBGrab\fR Command-Line Switch: \fB-grab\fR .fi .IP This option sets the grab scope for the appearance of the listbox in drop-down comboboxes. It can be either global or local. The default is local. .LP .nf Name: \fBlistHeight\fR Class: \fBHeight\fR Command-Line Switch: \fB-listheight\fR .fi .IP Height of the listbox specified in any of the forms acceptable to \fBTk_GetPixels\fR. The default is 150 pixels. .LP .nf Name: \fBmargin\fR Class: \fBMargin\fR Command-Line Switch: \fB-margin\fR .fi .IP Specifies the width in pixels between the entry component and the arrow button for a dropdown Combobox given in any of the forms acceptable to \fBTk_GetPixels\fR. This option has no effect on a simple Combobox. The default is 1. .LP .nf Name: \fBpopupCursor\fR Class: \fBCursor\fR Command-Line Switch: \fB-popupcursor\fR .fi .IP Specifies the cursor to be used for dropdown style listboxes. The value may have any of the forms acceptable to \fBTk_GetCursor\fR. The default is arrow. .LP .nf Name: \fBselectionCommand\fR Class: \fBSelectionCommand\fR Command-Line Switch: \fB-selectioncommand\fR .fi .IP Specifies a Tcl command procedure which is called when an item in the listbox area is selected. The item will be selected in the list, the listbox will be removed if it is a dropdown Combobox, and the selected item's text will be inserted into the entry field before the -selectioncommand proc is called. The default is {}. .LP .nf Name: \fBstate\fR Class: \fBState\fR Command-Line Switch: \fB-state\fR .fi .IP Specifies the overall state of the Combobox megawidget. Can be either normal or disabled. If the Combobox is disabled, no text can be entered into the entry field, no selection can be made in the listbox, and the arrowBtn component is disabled. The default is normal. .LP .nf Name: \fBunique\fR Class: \fBUnique\fR Command-Line Switch: \fB-unique\fR .fi .IP Boolean describing whether or not duplicate items are allowed in the combobox list. If true, then duplicates are not allowed to be inserted. If false, a duplicate entry causes selection of the item. Given in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true. .BE .SH DESCRIPTION .PP The \fBiwidgets::combobox\fR command creates an enhanced entry field widget with an optional associated label and a scrollable list. When an item is selected in the list area of a Combobox, its value is then displayed in the entry field text area. Functionally similar to an Optionmenu, the Combobox adds (optional) list scrolling and (optional) item editing and inserting capabilities. .PP There are two basic styles of Comboboxes (determined by the -dropdown option): dropdown and simple. The dropdown style adds an arrow button to the right of the entry field which when activated will pop up (and down) the scrolled listbox beneath the entry field. The simple (non-dropdown) Combobox permanently displays the listbox beneath the entry field and has no arrow button. Either style allows an optional entry field label. .SH "METHODS" .PP The \fBiwidgets::combobox\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for Combobox widgets: .SH "ASSOCIATED METHODS" .LP .nf .ta 4c 8c 12c \fBicursor\fR \fBscan\fR .fi .LP See the "entry" manual entries for details on the above associated methods. .LP .nf .ta 4c 8c 12c \fBcurselection\fR \fBindex\fR \fBsee\fR \fBsize\fR \fBxview\fR \fByview\fR .fi .LP See the "listbox" manual entries for details on the above associated methods. .LP .nf .ta 4c 8c 12c \fBgetcurselection\fR \fBjustify\fR \fBsort\fR .fi .LP See the "scrolledlistbox" manual entries for details on the above associated methods. .LP .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::combobox\fR command. .TP \fIpathName \fBclear\fR ?\fBcomponent\fR? Clears the contents from one or both components. Valid component values are \fBlist\fR, or \fBentry\fR. With no component specified, both are cleared. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::combobox\fR command. .TP \fIpathName \fBdelete \fIcomponent\fR \fIfirst\fR ?\fIlast\fR? Delete one or more elements from a given component, \fBlist\fR or \fBentry\fR. If a list item to be removed is currently selected (displayed in the entry field area), the entry field will be cleared. .TP \fIpathName \fBget ?\fIindex\fR? \fR With no arguments, returns the contents currently in the entry field area. With a single argument, returns the contents of the listbox item at the indicated index. .TP \fIpathName \fBinsert\fR \fIcomponent\fR \fIindex\fR \fIelement\fR ?\fIelement element ...\fR? Insert one or more new elements into the given component, \fBlist\fR or \fBentry\fR, just before the element given by \fIindex\fR. .TP \fIpathName \fBselection\fR \fIoption\fR \fIfirst\fR ?\fIlast\fR? Adjust the selection within the listbox component and updates the contents of the entry field component to the value of the selected item. See the "listbox" manual entry for more details on parameter options. .SH "COMPONENTS" .LP .nf Name: \fBentry\fR Class: \fBEntry\fR .fi .IP Text entry area where the current selection is displayed. If the Combobox is editable and its state is normal, the user can edit the contents of this item. .LP .nf Name: \fBlist\fR Class: \fBScrolledlistbox\fR .fi .IP Scrollable list which stores all the items which the user can select from. For dropdown Comboboxes, this component is hidden until the user pops it up by pressing on the arrow button to the right of the entry component. For simple Comboboxes this component is always visible just beneath the entry component. .SH "DEFAULT BINDINGS" .PP The Combobox generally has the same bindings as its primary component items - the Scrolledlistbox and Entryfield. However it also adds these: .PP [1] Button-1 mouse press on the arrow key of a dropdown Combobox causes the list to be popped up. If the combobox is non-editable, a Button-1 press on the entry field area will also pop up the list. .PP [2] Button-1 mouse press anywhere on the display removes a dropdown listbox which has been popped up, unless the keypress is upon one of the Combobox scrollbars which scrolls the list. If it is pressed upon an item in the list area, that item will be selected before the list is removed. .PP [3] Button-3 mouse press on the arrow key of a dropdown Combobox causes the next item to be selected. Shift-Button-3 causes the previous item to be selected. .PP [4] Escape keypress removes a dropdown list which has been popped up. .PP [5] The and keystrokes select the current item. They also remove the popped up list for dropdown comboboxes. .PP [6] Up and Down arrow keypresses from the entry field and arrow button component cause the previous and next items in the listbox to be selected respectively. Ctl-P and Ctl-N are similarly mapped for emacs emulation. .PP [7] Entry field and arrow button component Shift-Up and Shift-Down arrow keys pop up and down the listbox of a dropdown Combobox. The arrow button component also maps and similarly. .SH EXAMPLE .DS package require Iwidgets 4.0 proc selectCmd {} { puts stdout "[.cb2 getcurselection]" } # # Non-editable Dropdown Combobox # iwidgets::combobox .cb1 -labeltext Month: \\ -selectioncommand {puts "selected: [.cb1 getcurselection]"} \\ -editable false -listheight 185 -popupcursor hand1 .cb1 insert list end Jan Feb Mar Apr May June Jul Aug Sept Oct Nov Dec # # Editable Dropdown Combobox # iwidgets::combobox .cb2 -labeltext "Operating System:" -selectioncommand selectCmd .cb2 insert list end Linux HP-UX SunOS Solaris Irix .cb2 insert entry end L pack .cb1 -padx 10 -pady 10 -fill x pack .cb2 -padx 10 -pady 10 -fill x .DE .SH ORIGINAL AUTHOR John S. Sigler .SH CURRENT MAINTAINER Mitch Gorman (logain@erols.com) .SH KEYWORDS combobox, entryfield, scrolledlistbox, itk::Widget, entry, listbox, widget, iwidgets iwidgets-4.1.0/doc/dateentry.n0000644003604700454610000001236307476742024014672 0ustar dgp771div'\" '\" Copyright (c) 1997 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) dateentry.n 1.0 97/04/30 16:04:44 '\" .so man.macros .HS iwidgets::dateentry iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::dateentry \- Create and manipulate a dateentry widget .SH SYNOPSIS \fBiwidgets::dateentry\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::LabeledWidget <- iwidgets::Datefield <- iwidgets::Dateentry .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB background borderWidth cursor exportSelection foreground highlightColor highlightThickness insertBackground justify relief\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBdisabledForeground\fR \fBint\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR \fBstate\fR \fBsticky\fR .fi .LP See the "labeledwidget" class manual entry for details on these inherited options. .LP .nf .ta 4c 8c 12c \fBcommand\fR \fBiq\fR \fBstate\fR \fBtextBackground\fR \fBtextFont\fR .fi .LP See the "datefield" class manual entry for details on these inherited options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBbackwardImage\fR \fBbuttonForeground\fR \fBcommand\fR \fBcurrentDateFont\fR \fBdateFont\fR \fBdayFont\fR \fBdays\fR \fBforwardImage\fR \fBoutline\fR \fBselectColor\fR \fBselectThickness\fR \fBstartDay\fR \fBtitleFont\fR \fBweekdayBackground\fR \fBweekendBackground\fR .fi .LP See the "calendar" manual entry for details on the associated options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBgrab\fR Class: \fBGrab\fR Command-Line Switch: \fB-grab\fR .fi .IP Specifies the grab level, \fBlocal\fR or \fBglobal\fR, to be obtained before bringing up the popup calendar. The default is global. For more information concerning grab levels, consult the documentation for Tk's \fBgrab\fR command. .LP .nf Name: \fBicon\fR Class: \fBIcon\fR Command-Line Switch: \fB-icon\fR .fi .IP Specifies the calendar icon image to be used in the dateentry. This image must have been created previously with the \fBimage create\fR command. Should one not be provided, then one will be generated, pixmap if possible, bitmap otherwise. .LP .BE .SH DESCRIPTION .PP The \fBiwidgets::dateentry\fR command creates a quicken style date entry field with a popup calendar by combining the datefield and calendar widgets together. This allows a user to enter the date via the keyboard or by using the mouse and selecting the calendar icon which brings up a popup calendar. .DE .SH "METHODS" .PP The \fBiwidgets::dateentry\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for dateentry widgets: .SH "INHERITED METHODS" .LP .nf .ta 4c 8c 12c \fBget\fR \fBisvalid\fR \fBshow\fR .fi .LP See the "datefield" manual entry for details on the associated methods. .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::dateentry\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::dateentry\fR command. .SH "COMPONENTS" .LP .nf Name: \fBlabel\fR Class: \fBLabel\fR .fi .IP The label component provides a label component to used to identify the date. See the "label" widget manual entry for details on the label component item. .LP .nf Name: \fBiconbutton\fR Class: \fBLabel\fR .fi .IP The iconbutton component provides a labelbutton component to act as a lightweight button displaying the calendar icon. Upon pressing the labelbutton, the calendar appears. See the "label" widget manual entry for details on the labelbutton component item. .LP .nf Name: \fBdate\fR Class: \fBEntry\fR .fi .IP The date component provides the entry field for date input and display. See the "entry" widget manual entry for details on the date component item. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::dateentry .de pack .de .DE .SH AUTHOR Mark L. Ulferts .LP .SH KEYWORDS dateentry, widget iwidgets-4.1.0/doc/datefield.n0000644003604700454610000001514207476742024014612 0ustar dgp771div'\" '\" Copyright (c) 1997 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) datefield.n 1.0 97/04/30 16:04:44 '\" .so man.macros .HS iwidgets::datefield iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::datefield \- Create and manipulate a date field widget .SH SYNOPSIS \fBiwidgets::datefield\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::LabeledWidget <- iwidgets::Datefield .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB background borderWidth cursor exportSelection foreground highlightColor highlightThickness insertBackground justify relief\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBdisabledForeground\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR \fBstate\fR \fBsticky\fR .fi .LP See the "labeledwidget" class manual entry for details on the inherited options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBchildSitePos\fR Class: \fBPosition\fR Command-Line Switch: \fB-childsitepos\fR .fi .IP Specifies the position of the child site in the date field: \fBn\fR, \fBs\fR, \fBe\fR, or \fBw\fR. The default is e. .LP .nf Name: \fBcommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-command\fR .fi .IP Specifies a Tcl command to be executed upon detection of a Return key press event. .LP .nf Name: \fBgmt\fR Class: \fBGMT\fR Command-Line Switch: \fB-gmt\fR .fi .IP Determines whether the date is calculated relative to Greenwich Mean Time. Accepts a boolean value. The default is no. .LP .nf Name: \fBint\fR Class: \fBDateFormat\fR Command-Line Switch: \fB-int\fR .fi .IP Used to specify international date formats. This option must be a boolean value. When set to true, the date is formatted as YYYY-MM-DD. When set to false, it is formatted as MM/DD/YYYY. Note that this format is driven by the 'clock scan' command and that YYYY-MM-DD is supported in Tk 8.4 or later. The default is no. .LP .nf Name: \fBiq\fR Class: \fBIq\fR Command-Line Switch: \fB-iq\fR .fi .IP Specifies the level of intelligence to be shown in the actions taken by the datefield during the processing of keypress events. Valid settings include \fBhigh\fR, \fBaverage\fR, and \fBlow\fR. With a high iq,the date prevents the user from typing in an invalid date. For example, if the current date is 05/31/1997 and the user changes the month to 04, then the day will be instantly modified for them to be 30. In addition, leap years are fully taken into account. With average iq, the month is limited to the values of 01-12, but it is possible to type in an invalid day. A setting of low iq instructs the widget to do no validity checking at all during date entry. With both average and low iq levels, it is assumed that the validity will be determined at a later time using the date's \fBisvalid\fR command. .LP .nf Name: \fBstate\fR Class: \fBState\fR Command-Line Switch: \fB-state\fR .fi .IP Specifies one of two states for the datefield: \fBnormal\fR or \fBdisabled\fR. If the datefield is disabled then input is not accepted. The default is normal. .LP .nf Name: \fBtextBackground\fR Class: \fBBackground\fR Command-Line Switch: \fB-textbackground\fR .fi .IP Background color for inside textual portion of the entry field. The value may be given in any of the forms acceptable to \fBTk_GetColor\fR. .LP .nf Name: \fBtextFont\fR Class: \fBFont\fR Command-Line Switch: \fB-textfont\fR .fi .IP Name of font to use for display of text in datefield. The value may be given in any of the forms acceptable to \fBTk_GetFont\fR. .LP .BE .SH DESCRIPTION .PP The \fBiwidgets::datefield\fR command creates an enhanced text entry widget for the purpose of date entry with various degrees of built-in intelligence. .DE .SH "METHODS" .PP The \fBiwidgets::datefield\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for datefield widgets: .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::datefield\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::datefield\fR command. .TP \fIpathName \fBget\fR ?\fBformat\fR? Returns the current contents of the datefield in a format of string or as an integer clock value using the \fB-string\fR and \fB-clicks\fR format options respectively. The default is by string. Reference the clock command for more information on obtaining dates and their formats. .TP \fIpathName \fBisvalid\fR Returns a boolean indication of the validity of the currently displayed date value. For example, 03/03/1960 is valid whereas 02/29/1997 is invalid. .TP \fIpathName \fBshow\fR \fIdate\fR Changes the currently displayed date to be that of the date argument. The date may be specified either as a string, an integer clock value or the keyword "now". Reference the clock command for more information on obtaining dates and their formats. .SH "COMPONENTS" .LP .nf Name: \fBdate\fR Class: \fBEntry\fR .fi .IP The date component provides the entry field for date input and display. See the "entry" widget manual entry for details on the date component item. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 proc returnCmd {} { puts [.df get] } iwidgets::datefield .df -command returnCmd pack .df -fill x -expand yes -padx 10 -pady 10 .DE .SH AUTHOR Mark L. Ulferts .LP .SH KEYWORDS datefield, widget iwidgets-4.1.0/doc/dialog.n0000644003604700454610000001004107476742024014121 0ustar dgp771div'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) dialog.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::dialog iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::dialog \- Create and manipulate a dialog widget .SH SYNOPSIS \fBiwidgets::dialog\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Toplevel <- iwidgets::Shell <- iwidgets::Dialogshell <- iwidgets::Dialog .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fBbackground\fR \fBcursor\fR \fBforeground\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR \fBpadY\fR \fBseparator\fR \fBthickness\fR .fi .LP See the "dialogshell" manual entry for details on the above inherited options. .LP .nf .ta 4c 8c 12c \fBheight\fR \fBmaster\fR \fBmodality\fR \fBwidth\fR .fi .LP See the "shell" manual entry for details on the above inherited options. .LP .nf .ta 4c 8c 12c \fBtitle\fR .fi .LP See the "Toplevel" manual entry for details on the above inherited options. .BE .SH DESCRIPTION .PP The \fBiwidgets::dialog\fR command creates a dialog box providing standard buttons and a child site for use in derived classes. The buttons include ok, apply, cancel, and help. Methods and Options exist to configure the buttons and their containing box. .SH "METHODS" .PP The \fBiwidgets::dialog\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for dialog widgets: .SH "INHERITED METHODS" .LP .nf .ta 4c 8c 12c \fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR \fBindex\fR \fBinsert\fR \fBinvoke\fR \fBshow\fR .fi .LP See the "buttonbox" manual entry for details on the above inherited methods. .LP .nf .ta 4c 8c 12c \fBchildsite\fR .fi .LP See the "dialogshell" manual entry for details on the above inherited methods. .LP .nf .ta 4c 8c 12c \fBactivate\fR \fBcenter\fR \fBdeactivate\fR .fi .LP See the "shell" manual entry for details on the above inherited methods. .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::dialog\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::dialog\fR command. .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::dialog .d -modality global .d buttonconfigure OK -command {puts OK; .d deactivate 1} .d buttonconfigure Apply -command {puts Apply} .d buttonconfigure Cancel -command {puts Cancel; .d deactivate 0} .d buttonconfigure Help -command {puts Help} listbox [.d childsite].lb -relief sunken pack [.d childsite].lb -expand yes -fill both if {[.d activate]} { puts "Exit via OK button" } else { puts "Exit via Cancel button" } .DE .SH AUTHOR Mark L. Ulferts .DE Bret A. Schuhmacher .SH KEYWORDS dialog, dialogshell, shell, widget iwidgets-4.1.0/doc/dialogshell.n0000644003604700454610000001366007476742024015163 0ustar dgp771div'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) dialogshell.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::dialogshell iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::dialogshell \- Create and manipulate a dialog shell widget .SH SYNOPSIS \fBiwidgets::dialogshell\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Toplevel <- iwidgets::Shell <- iwidgets::Dialogshell .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fBbackground\fR \fBcursor\fR \fBforeground\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBheight\fR \fBmaster\fR \fBmodality\fR \fBwidth\fR .fi .LP See the "shell" manual entry for details on the above inherited options. .LP .nf .ta 4c 8c 12c \fBtitle\fR .fi .LP See the "Toplevel" manual entry for details on the above inherited options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBbuttonBoxPadX\fR Class: \fBPad\fR Command-Line Switch: \fB-buttonboxpadx\fR .fi .IP Specifies a non-negative padding distance to leave between the button group and the outer edge of the button box in the x direction. The value may be given in any of the forms accpetable to \fBTk_GetPixels\fR. The default is 5 pixels. .LP .nf Name: \fBbuttonBoxPadY\fR Class: \fBPad\fR Command-Line Switch: \fB-buttonboxpady\fR .fi .IP Specifies a non-negative padding distance to leave between the button group and the outer edge of the button box in the y direction. The value may be given in any of the forms accpetable to \fBTk_GetPixels\fR. The default is 5 pixels. .LP .nf Name: \fBbuttonBoxPos\fR Class: \fBPosition\fR Command-Line Switch: \fB-buttonboxpos\fR .fi .IP Attaches buttons to the given side of the dialog: \fBn\fR, \fBs\fR, \fBe\fR or \fBw\fR. The default is s. .LP .nf Name: \fBpadX\fR Class: \fBPad\fR Command-Line Switch: \fB-padx\fR .fi .IP Specifies a padding distance for the childsite in the X-direction in any of the forms acceptable to \fBTk_GetPixels\fR. The default is 10. .LP .nf Name: \fBpadY\fR Class: \fBPad\fR Command-Line Switch: \fB-pady\fR .fi .IP Specifies a padding distance for the childsite in the Y-direction in any of the forms acceptable to \fBTk_GetPixels\fR. The default is 10. .LP .nf Name: \fBseparator\fR Class: \fBSeparator\fR Command-Line Switch: \fB-separator\fR .fi .IP Specifies whether a line is drawn to separate the buttons from the dialog box contents in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true. .LP .nf Name: \fBthickness\fR Class: \fBThickness\fR Command-Line Switch: \fB-thickness\fR .fi .IP Specifies the thickness of the separator in any of the forms acceptable to \fBTk_GetPixels\fR. The default is 3 pixels. .BE .SH DESCRIPTION .PP The \fBiwidgets::dialogshell\fR command creates a dialog shell which is a top level widget composed of a button box, separator, and child site area. The class also has methods to control button construction. .SH "METHODS" .PP The \fBiwidgets::dialogshell\fR command create a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for dialogshell widgets: .SH "INHERITED METHODS" .LP .nf .ta 4c 8c 12c \fBactivate\fR \fBcenter\fR \fBdeactivate\fR .fi .LP See the "shell" manual entry for details on the above inherited methods. .SH "ASSOCIATED METHODS" .LP .nf .ta 4c 8c 12c \fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBdelete\fR \fBhide\fR \fBindex\fR \fBinsert\fR \fBinvoke\fR \fBshow\fR .fi .LP See the "buttonbox" manual entry for details on the associated methods. .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::dialogshell\fR command. .TP \fIpathName \fBchildsite\fR Returns the pathname of the child site widget. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::dialogshell\fR command. .SH "COMPONENTS" .LP .nf Name: \fBdschildsite\fR Class: \fBframe\fR .fi .IP The dschildsite component is the user child site for the dialog shell. See the "frame" widget manual entry for details on the dschildsite component item. .LP .nf Name: \fBseparator\fR Class: \fBframe\fR .fi .IP The separator component devides the area between the user child site and the button box. See the "frame" widget manual entry for details on the separator component item. .LP .nf Name: \fBbbox\fR Class: \fBButtonBox\fR .fi .IP The bbox component is the button box containing the buttons for the dialog shell. See the "ButtonBox" widget manual entry for details on the bbox component item. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::dialogshell .ds -modality none .ds add OK -text "OK" .ds add Cancel -text "Cancel" .ds default OK .ds activate .DE .SH AUTHOR Mark L. Ulferts .SH KEYWORDS dialogshell, dialog, shell, widget iwidgets-4.1.0/doc/disjointlistbox.n0000644003604700454610000002131107476742024016114 0ustar dgp771div'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) disjointlistbox.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::disjointlistbox iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::disjointlistbox \- Create and manipulate a disjointlistbox widget .SH SYNOPSIS \fBiwidgets::disjointlistbox\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::Disjointlistbox .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB activeBackground selectBorderWidth selectForeground activeForeground activeRelief background borderWidth buttonPlacement clientData cursor foreground highlightColor highlightThickness disabledForeground elementBorderWidth\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBlhsButtonLabel\fR \fBrhsButtonLabel\fR .fi .LP See the "button" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBlabelFont\fR \fBlhsLabelText\fR \fBrhsLabelText\fR .fi .LP See the "label" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBjump\fR \fBtroughColor\fR .fi .LP See the "scrollbar" widget class manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBtextBackground\fR \fBtextFont\fR \fBlhsItems\fR \fBrhsItems\fR .fi .LP See the "scrolledlistbox" widget manual entry for details on the above associated options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBbuttonPlacement\fR Class: \fBButtonPlacement\fR Command-Line Switch: \fB-buttonplacement\fR .fi .IP Specifies the placement of the insertion and removal buttons relative to the scrolledlistbox widgets\fBn\fR, \fBbottom\fR, or \fBcenter\fR. The default is bottom. .LP .nf Name: \fBlhsLabelText\fR Class: \fBLabelText\fR Command-Line Switch: \fB-lhslabeltext\fR .fi .IP Specifies the text for the label of the lhs scrolledlistbox. The default is "Available". .LP .nf Name: \fBrhsLabelText\fR Class: \fBLabelText\fR Command-Line Switch: \fB-rhslabeltext\fR .fi .IP Specifies the text for the label of the rhs scrolledlistbox. The default is "Available". .LP .nf Name: \fBlhsButtonLabel\fR Class: \fBLabelText\fR Command-Line Switch: \fB-lhsbuttonlabel\fR .fi .IP Specifies the text for the button of the lhs scrolledlistbox. The default is "Insert >>". .LP .nf Name: \fBrhsButtonLabel\fR Class: \fBLabelText\fR Command-Line Switch: \fB-rhsbuttonlabel\fR .fi .IP Specifies the text for the button of the rhs scrolledlistbox. The default is "<< Remove". .LP .nf Name: \fBlhsSortOption\fR Class: \fBLhsSortOption\fR Command-Line Switch: \fB-lhssortoption\fR .fi .IP Specifies the sort function to be applied to the lhs scrolledlistbox after items are inserted. Accepts the same sort options as the scrolledlistbox sort method (Tcl's lsort command). If "none" is specified, the inserted items are appended to the end of the list, and no sorting is performed. The default is "increasing". .LP .nf Name: \fBrhsSortOption\fR Class: \fBRhsSortOption\fR Command-Line Switch: \fB-rhssortoption\fR .fi .IP Specifies the sort function to be applied to the rhs scrolledlistbox after items are inserted. Accepts the same sort options as the scrolledlistbox sort method (Tcl's lsort command). If "none" is specified, the inserted items are appended to the end of the list, and no sorting is performed. The default is "increasing". .LP .BE .SH DESCRIPTION .PP The \fBiwidgets::disjointlistbox\fR command creates a disjoint pair of listboxs similar to the OSF/Motif "Book" printing dialog of the "FrameMaker" program. It is implementation constists of a two Scrolledlistboxs, 2 buttons, and 2 labels. The disjoint behavior of this widget exists between the interaction of the two Scrolledlistboxes with one another. That is, a given instance of a Disjointlistbox will never exist, without the aid of a hack magician, which has Scrolledlistbox widgets with items in common. That means the relationship between the two is maintained similar to that of disjoint sets. Users may transfer items between the two Listbox widgets using the the two buttons. Options exists which include the ability to configure the "items" displayed by the 2 Scrolledlistboxes and to control the placement of the insertion and removal buttons. .SH "METHODS" .PP The \fBiwidgets::disjointlistbox\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for disjointlistbox widgets: .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::disjointlistbox\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::disjointlistbox\fR command. .TP \fIpathName \fBsetlhs\fR Set the current contents of the left-most Scrolledlistbox with the input list of items. Removes all (if any) items from the right-most Scrolledlistbox which exist in the input list option to maintain the disjoint property between the two .TP \fIpathName \fBsetrhs\fR Set the current contents of the right-most Scrolledlistbox with the input list of items. Removes all (if any) items from the left-most Scrolledlistbox which exist in the input list option to maintain the disjoint property between the two .TP \fIpathName \fBgetlhs\fR Returns the current contents of the left-most Scrolledlistbox .TP \fIpathName \fBgetrhs\fR Returns the current contents of the right-most Scrolledlistbox .TP \fIpathName \fBinsertlhs\fR Add the input list of items to the current contents of the left-most Scrolledlistbox. Removes all (if any) items from the right-most Scrolledlistbox which exist in the input list option to maintain the disjoint property between the two .TP \fIpathName \fBinsertrhs\fR Add the input list of items to the current contents of the right-most Scrolledlistbox. Removes all (if any) items from the left-most Scrolledlistbox which exist in the input list option to maintain the disjoint property between the two. .TP .SH "COMPONENTS" .LP .nf Name: \fBlhs\fR Class: \fBScrolledlistbox\fR .fi .IP The lhs component is the scrolledlistbox for the rhs button. See the "scrolledlistbox" widget manual entry for details on the lhs component item. .LP .nf Name: \fBrhs\fR Class: \fBScrolledlistbox\fR .fi .IP The rhs component is the scrolledlistbox for the rhs button. See the "scrolledlistbox" widget manual entry for details on the rhs component item. .LP .nf Name: \fBlhsbutton\fR Class: \fButton\fR .fi .IP The lhsbutton component is the button for users to remove selected items from the lhs Scrolledlistbox. See the "button" widget manual entry for details on the lhs button component. .LP .nf Name: \fBrhsbutton\fR Class: \fBButton\fR .fi .IP The rhsbutton component is the button for users to remove selected items from the rhs Scrolledlistbox. See the "button" widget manual entry for details on the rhs button component. .LP .nf Name: \fBlhsCount\fR Class: \fBLabel\fR .fi .IP The lhsCount component is the label for displaying a count of the current items in the Scrolledlistbox. See the "Label" widget manual entry for details on the lhsCount label component. .LP .nf Name: \fBrhsCount\fR Class: \fBLabel\fR .fi .IP The rhsCount component is the label for displaying a count of the current items in the Scrolledlistbox. See the "Label" widget manual entry for details on the rhsCount label component. .fi .IP .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::disjointlistbox .dlb pack .dlb -padx 10 -pady 10 -fill both -expand yes .DE .SH AUTHOR(S) John A. Tucker .DE Anthony Parent .SH KEYWORDS disjointlistbox, widget iwidgets-4.1.0/doc/entryfield.n0000644003604700454610000002027407476742024015040 0ustar dgp771div'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) entryfield.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::entryfield iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::entryfield \- Create and manipulate a entry field widget .SH SYNOPSIS \fBiwidgets::entryfield\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::LabeledWidget <- iwidgets::Entryfield .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB background borderWidth cursor exportSelection foreground highlightColor highlightThickness insertBackground insertBorderWidth insertOffTime insertOnTime insertWidth justify relief selectBackground selectBorderWidth selectForeground textVariable width\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBshow\fR \fBstate\fR .fi .LP See the "entry" manual entry for details on the associated options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBdisabledForeground\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR \fBstate\fR \fBsticky\fR .fi .LP See the "labeledwidget" class manual entry for details on the inherited options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBchildSitePos\fR Class: \fBPosition\fR Command-Line Switch: \fB-childsitepos\fR .fi .IP Specifies the position of the child site in the entry field: \fBn\fR, \fBs\fR, \fBe\fR, or \fBw\fR. The default is e. .LP .nf Name: \fBcommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-command\fR .fi .IP Specifies a Tcl command to be executed upon detection of a Return key press event. .LP .nf Name: \fBfixed\fR Class: \fBFixed\fR Command-Line Switch: \fB-fixed\fR .fi .IP Restrict entry to the specified number of chars. A value of 0, which is the default, denotes no limit. The value is the maximum number of chars the user may type into the field, regardles of field width. For example, if the field width is set to 20 and the fixed value is 10, the user will only be able to type 10 characters into the field which is 20 characters long. .LP .nf Name: \fBfocusCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-focuscommand\fR .fi .IP Specifies a Tcl command to be executed upon reception of focus. .LP .nf Name: \fBinvalid\fR Class: \fBCommand\fR Command-Line Switch: \fB-invalid\fR .fi .IP Specifies a Tcl command to be executed upon determination of invalid input. The default is bell. .LP .nf Name: \fBtextBackground\fR Class: \fBBackground\fR Command-Line Switch: \fB-textbackground\fR .fi .IP Background color for inside textual portion of the entry field. The value may be given in any of the forms acceptable to \fBTk_GetColor\fR. .LP .nf Name: \fBtextFont\fR Class: \fBFont\fR Command-Line Switch: \fB-textfont\fR .fi .IP Name of font to use for display of text in entryfield. The value may be given in any of the forms acceptable to \fBTk_GetFont\fR. .LP .nf Name: \fBpasting\fR Class: \fBBehavior\fR Command-Line Switch: \fB-pasting\fR .fi .IP Option to enable/disable pasting into the entry component of the entryfield. Valid values are 0 (disabled) or 1 (enabled). Defaults to 1. .LP .nf Name: \fBvalidate\fR Class: \fBCommand\fR Command-Line Switch: \fB-validate\fR .fi .IP The validate option allows specification of a validation mechanism. Standard character validation such as \fBnumeric\fR, \fBalphabetic\fR, \fBinteger\fR, \fBhexidecimal\fR, \fBreal\fR, and \fBalphanumeric\fR can be handled through the use of keywords. Should more extensive validation be necessary, the value may contain the name of a command script. The script should return a boolean value. True for valid, false for invalid. If false is returned, then the procedure associated with the invalid option will be invoked. If the validation script contains any \fB%\fR characters, then the script will not be executed directly. Instead, a new script will be generated by replacing each \fB%\fR, and the character following it, with information from the entryfield. The replacement depends on the character following the \fB%\fR, as defined in the list below. .TP \fB%c\fR Replaced with the current input character. .TP \fB%P\fR Replaced with the contents of the entryfield modified to include the latest keystoke. This is equivalent to peeking at the future contents, enabling rejection prior to the update. .TP \fB%S\fR Replaced with the current contents of the entryfield prior to the latest keystroke being added. .TP \fB%W\fR Replaced with the entryfield widget pathname. .LP .BE .SH DESCRIPTION .PP The \fBiwidgets::entryfield\fR command creates an enhanced text entry widget with an optional associated label. Addtional options support validation and establishing a upper limit on the number of characters which may be entered in the field. .DE .SH "METHODS" .PP The \fBiwidgets::entryfield\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for entryfield widgets: .SH "ASSOCIATED METHODS" .LP .nf .ta 4c 8c 12c \fBdelete\fR \fBget\fR \fBicursor\fR \fBindex\fR \fBinsert\fR \fBscan\fR \fBselection\fR \fBxview\fR .fi .LP See the "entry" manual entry for details on the associated methods. .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::entryfield\fR command. .TP \fIpathName \fBchildsite\fR Returns the path name of the child site. .TP \fIpathName \fBclear\fR Clear entry widget .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::entryfield\fR command. .SH "COMPONENTS" .LP .nf Name: \fBefchildsite\fR Class: \fBframe\fR .fi .IP The efchildsite component is the user child site for the entry field. See the "frame" widget manual entry for details on the efchildsite component item. .LP .nf Name: \fBentry\fR Class: \fBentry\fR .fi .IP The entry component provides the entry field for user text input and display. See the "entry" widget manual entry for details on the entry component item. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 option add *textBackground white proc returnCmd {} { puts stdout "Return Pressed" } proc invalidCmd {} { puts stdout "Alphabetic contents invalid" } iwidgets::entryfield .ef -command returnCmd iwidgets::entryfield .fef -labeltext "Fixed:" -fixed 10 -width 12 iwidgets::entryfield .nef -labeltext "Numeric:" -validate numeric -width 12 iwidgets::entryfield .aef -labeltext "Alphabetic:" \\ -validate alphabetic -width 12 -invalid invalidCmd iwidgets::entryfield .pef -labeltext "Password:" \\ -show \267 -width 12 -command returnCmd iwidgets::Labeledwidget::alignlabels .ef .fef .nef .aef .pef pack .ef -fill x -expand yes -padx 10 -pady 5 pack .fef -fill x -expand yes -padx 10 -pady 5 pack .nef -fill x -expand yes -padx 10 -pady 5 pack .aef -fill x -expand yes -padx 10 -pady 5 pack .pef -fill x -expand yes -padx 10 -pady 5 .DE .SH AUTHOR Sue Yockey .DE Mark L. Ulferts .LP .SH KEYWORDS entryfield, widget iwidgets-4.1.0/doc/extbutton.n0000644003604700454610000001021307476742024014717 0ustar dgp771div'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) extbutton.n 1.21 01/04/23 16:04:44 '\" .so man.macros .HS iwidgets::extbutton iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::extbutton \- Extends the behavior of the Tk button by allowing a bitmap or image to coexist with text. .SH SYNOPSIS \fBiwidgets::extbutton\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::Extbutton .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB activebackground activeforeground bitmap background bd cursor disabledforeground font foreground image justify relief text\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "WIDGET-SPECIFIC OPTIONS" .ta 4c 8c 12c .LP .nf Name: \fBbitmapforeground\fR Class: \fBForeground\fR Command-Line Switch: \fB-bitmapforeground\fR .fi .IP Configures the foreground color of the bitmap. .LP .nf Name: \fBcommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-command\fR .fi .IP Associate a command with the extbutton. Simulates a Tk button's -command option. Invoked by either <1> events or by explicitly calling the public invoke() method. .LP .nf Name: \fBdefaultring\fR Class: \fBDefaultRing\fR Command-Line Switch: \fB-defaultring\fR .fi .IP Boolean describing whether the extbutton displays its default ring given in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is false. .LP .nf Name: \fBdefaultringpad\fR Class: \fBPad\fR Command-Line Switch: \fB-defaultringpad\fR .fi .IP Specifies the amount of space to be allocated to the indentation of the default ring ring given in any of the forms acceptable to \fBTcl_GetPixels\fR. The option has no effect if the defaultring option is set to false. The default is 4 pixels. .LP .nf Name: \fBimagePos\fR Class: \fBPosition\fR Command-Line Switch: \fB-imagepos\fR .fi .IP Specifies the image position relative to the message text: \fBn\fR, \fBne\fR, \fBnw\fR, \fBs\fR, \fBse\fR, \fBsw\fR, \fBw\fR, \fBwn\fR, \fBws\fR, \fBe\fR, \fBen\fR, or \fBes\fR. The default is w. .LP .nf Name: \fBringBackground\fR Class: \fBBackground\fR Command-Line Switch: \fB-ringbackground\fR .fi .IP Configures the background color of the default ring frame (if -defaultring is set to boolean true). .LP .BE .SH DESCRIPTION .PP The \fBextbutton\fR extends the behavior of the atomic Tk button by allowing text and an image or bitmap to coexist. The user may use the -image or -bitmap options to specify an image as well as the -imagepos option to specify image position relative to the text. Note that the extbutton is not intended to be used without an image/bitmap. There will be an emtpy space next to the text if no image/bitmap is specified. .SH "METHODS" .PP The \fBiwidgets::extbutton\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE .SH "INHERITED METHODS" Each of the following methods are inherited from itk::Archetype. See that man page for details. .DS C \fIpathName \fBcget\fR \fIpathName \fBcomponent\fR \fIpathName \fBconfig\fR \fIpathName \fBconfigure\fR .DE .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBinvoke\fR Evaluates the command fragment associated with the -command option. .TP \fIpathName \fBflash\fR Simulates the Tk button's flash command. .DE .SH EXAMPLES .DS package require Iwidgets 4.0 iwidgets::extbutton .eb -text "Bitmap example" -bitmap info \\ -background bisque -activeforeground red -bitmapforeground blue \\ -defaultring 1 -command {puts "Bisque is beautiful"} pack .eb -expand 1 iwidgets::extbutton .eb -text "Image example" -relief ridge -image \\ [image create photo -file $itk::library/../iwidgets/demos/images/clear.gif] \\ -font 9x15bold -background lightgreen -imagepos e \\ -activebackground lightyellow pack .eb -expand 1 .DE .SH AUTHOR Chad Smith .SH KEYWORDS button, pushbutton iwidgets-4.1.0/doc/extfileselectionbox.n0000644003604700454610000002426107476742024016752 0ustar dgp771div'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) extfileselectionbox.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::extfileselectionbox iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::extfileselectionbox \- Create and manipulate a file selection box widget .SH SYNOPSIS \fBiwidgets::extfileselectionbox\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::Extfileselectionbox .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB activeBackground background borderWidth cursor foreground highlightColor highlightThickness insertBackground insertBorderWidth insertOffTime insertOnTime insertWidth selectBackground selectBorderWidth selectForeground\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBpopupCursor\fR \fBtextBackground\fR \fBtextFont\fR .fi .LP See the "combobox" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBlabelFont\fR .fi .LP See the "labeledwidget" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBsashCursor\fR .fi .LP See the "panedwindow" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR .fi .LP See the "scrollbar" widget class manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBtextBackground\fR \fBtextFont\fR .fi .LP See the "scrolledlistbox" widget manual entry for details on the above associated options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBautomount\fR Class: \fBAutomount\fR Command-Line Switch: \fB-automount\fR .fi .IP Specifies a list of directory prefixes to ignore. Typically, this option would be used as follows: -automount {export tmp_mnt} .LP .nf Name: \fBchildSitePos\fR Class: \fBPosition\fR Command-Line Switch: \fB-childsitepos\fR .fi .IP Specifies the position of the child site in the extended fileselection box: \fBn\fR, \fBs\fR, \fBe\fR, \fBw\fR, \fBtop\fR, or \fBbottom\fR. The default is s. .LP .nf Name: \fBdirectory\fR Class: \fBDirectory\fR Command-Line Switch: \fB-directory\fR .fi .IP Specifies the initial default directory. The default is the present working directory. .LP .nf Name: \fBdirSearchCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-dirsearchcommand\fR .fi .IP Specifies a Tcl command to be executed to perform a directory search. The command will receive the current working directory and filter mask as arguments. The command should return a list of files which will be placed into the directory list. .LP .nf Name: \fBdirsLabel\fR Class: \fBText\fR Command-Line Switch: \fB-dirslabel\fR .fi .IP Specifies the text of the label for the directory list. The default is "Directories". .LP .nf Name: \fBdirsOn\fR Class: \fBDirsOn\fR Command-Line Switch: \fB-dirson\fR .fi .IP Specifies whether or not to display the directory list. The value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true. .LP .nf Name: \fBfileSearchCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-filesearchcommand\fR .fi .IP Specifies a Tcl command to be executed to perform a file search. The command will receive the current working directory and filter mask as arguments. The command should return a list of files which will be placed into the file list. .LP .nf Name: \fBfilesLabel\fR Class: \fBText\fR Command-Line Switch: \fB-fileslabel\fR .fi .IP Specifies the text of the label for the files list. The default is "Files". .LP .nf Name: \fBfilesOn\fR Class: \fBFilesOn\fR Command-Line Switch: \fB-fileson\fR .fi .IP Specifies whether or not to display the files list. The value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true. .LP .nf Name: \fBfileType\fR Class: \fBFileType\fR Command-Line Switch: \fB-filetype\fR .fi .IP Specify the type of files which may appear in the file list: \fBregular\fR, \fBdirectory\fR, or \fBany\fR. The default is regular. .LP .nf Name: \fBfilterCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-filtercommand\fR .fi .IP Specifies a Tcl command to be executed upon hitting the Return key in the filter combobox widget. .LP .nf Name: \fBfilterLabel\fR Class: \fBText\fR Command-Line Switch: \fB-filterlabel\fR .fi .IP Specifies the text of the label for the filter combobox. The default is "Filter". .LP .nf Name: \fBfilterOn\fR Class: \fBFilterOn\fR Command-Line Switch: \fB-filteron\fR .fi .IP Specifies whether or not to display the filter combobox. The value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true. .LP .nf Name: \fBheight\fR Class: \fBHeight\fR Command-Line Switch: \fB-height\fR .fi .IP Specifies the height of the selection box. The value may be specified in any of the forms acceptable to Tk_GetPixels. The default is 300 pixels. .LP .nf Name: \fBinvalid\fR Class: \fBCommand\fR Command-Line Switch: \fB-invalid\fR .fi .IP Command to be executed should the filter contents be proven invalid. The default is {bell}. .LP .nf Name: \fBmask\fR Class: \fBMask\fR Command-Line Switch: \fB-mask\fR .fi .IP Specifies the initial file mask string. The default is "*". .LP .nf Name: \fBnoMatchString\fR Class: \fBNoMatchString\fR Command-Line Switch: \fB-nomatchstring\fR .fi .IP Specifies the string to be displayed in the files list should no files match the mask. The default is "". .LP .nf Name: \fBselectDirCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-selectdirommand\fR .fi .IP Specifies a Tcl command to be executed following selection of a directory in the directory list. .LP .nf Name: \fBselectFileCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-selectfileommand\fR .fi .IP Specifies a Tcl command to be executed following selection of a file in the files list. .LP .nf Name: \fBselectionCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-selectioncommand\fR .fi .IP Specifies a Tcl command to be executed upon hitting the Return key in the selection combobox widget. .LP .nf Name: \fBselectionLabel\fR Class: \fBText\fR Command-Line Switch: \fB-selectionlabel\fR .fi .IP Specifies the text of the label for the selection combobox. The default is "Selection". .LP .nf Name: \fBselectionOn\fR Class: \fBSelectionOn\fR Command-Line Switch: \fB-selectionon\fR .fi .IP Specifies whether or not to display the selection combobox. The value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true. .LP .nf Name: \fBwidth\fR Class: \fBWidth\fR Command-Line Switch: \fB-width\fR .fi .IP Specifies the width of the selection box. The value may be specified in any of the forms acceptable to Tk_GetPixels. The default is 350 pixels. .LP .BE .SH DESCRIPTION .PP The \fBiwidgets::extfileselectionbox\fR command creates an extended file selection box which is slightly different than the fileselectionbox widget. The differences are mostly cosmetic in that the listboxes are within a panedwindow and the entryfields for the filter and selection have been replaced by comboboxes. Other than that the interface is practically the same. .SH "METHODS" .PP The \fBiwidgets::extfileselectionbox\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for extfileselectionbox widgets: .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::extfileselectionbox\fR command. .TP \fIpathName \fBchildsite\fR Returns the child site widget path name. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::extfileselectionbox\fR command. .TP \fIpathName \fBfilter\fR Update the current contents of the extended file selection box based on the current filter combobox value. .TP \fIpathName \fBget\fR Returns the current value of the selection combobox widget. .SH "COMPONENTS" .LP .nf Name: \fBdirs\fR Class: \fBScrolledlistbox\fR .fi .IP The dirs component is the directory list box for the extended fileselection box. See the "scrolledlistbox" widget manual entry for details on the dirs component item. .LP .nf Name: \fBfiles\fR Class: \fBScrolledlistbox\fR .fi .IP The files component is the file list box for the extended fileselection box. See the "scrolledlistbox" widget manual entry for details on the files component item. .LP .nf Name: \fBfilter\fR Class: \fBCombobox\fR .fi .IP The filter component is the field for user input of the filter value. See the "combobox" widget manual entry for details on the filter component item. .LP .nf Name: \fBselection\fR Class: \fBCombobox\fR .fi .IP The selection component is the field for user input of the currently selected file value. See the "combobox" widget manual entry for details on the selection component item. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::extfileselectionbox .fsb pack .fsb -padx 10 -pady 10 -fill both -expand yes .DE .SH AUTHOR(S) Mark L. Ulferts .DE Anthony Parent .SH KEYWORDS extfileselectionbox, widget iwidgets-4.1.0/doc/extfileselectiondialog.n0000644003604700454610000001437407340742600017413 0ustar dgp771div'\" '\" Copyright (c) 1997 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) extfileselectiondialog.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::extfileselectiondialog iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::extfileselectiondialog \- Create and manipulate a file selection dialog widget .SH SYNOPSIS \fBiwidgets::extfileselectiondialog\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Toplevel <- iwidgets::Shell <- iwidgets::Dialogshell <- iwidgets::Dialog <- iwidgets::Extfileselectiondialog .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB activeBackground background borderWidth cursor foreground highlightColor highlightThickness insertBackground insertBorderWidth insertOffTime insertOnTime insertWidth selectBackground selectBorderWidth selectForeground\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBpopupCursor\fR \fBtextBackground\fR \fBtextFont\fR .fi .LP See the "combobox" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBchildSitePos\fR \fBdirectory\fR \fBdirsLabel\fR \fBdirSearchCommand\fR \fBdirsOn\fR \fBfilesLabel\fR \fBfilesLabelOn\fR \fBfileSearchCommand\fR \fBfilesOn\fR \fBfileType\fR \fBfilterLabel\fR \fBfilterOn\fR \fBinvalid\fR \fBmask\fR \fBnoMatchString\fR \fBselectionLabel\fR \fBselectionOn\fR .fi .LP See the "extfileselectionbox" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBlabelFont\fR .fi .LP See the "labeledwidget" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBsashCursor\fR .fi .LP See the "panedwindow" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBlabelFont\fR .fi .LP See the "labeledwidget" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR .fi .LP See the "scrollbar" widget class manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBtextBackground\fR \fBtextFont\fR .fi .LP See the "scrolledlistbox" widget manual entry for details on the above associated options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR \fBpadY\fR \fBseparator\fR \fBthickness\fR .fi .LP See the "dialogshell" widget manual entry for details on the above inherited options. .LP .nf .ta 4c 8c 12c \fBheight\fR \fBmaster\fR \fBmodality\fR \fBwidth\fR .fi .LP See the "shell" widget manual entry for details on the above inherited options. .LP .nf .ta 4c 8c 12c \fBtitle\fR .fi .LP See the "Toplevel" widget manual entry for details on the above inherited options. .BE .SH DESCRIPTION .PP The \fBiwidgets::extfileselectiondialog\fR command creates an extended file selection dialog which is slightly different than the fileselectiondialog widget. The differences are mostly cosmetic in that the listboxes are within a panedwindow and the entryfields for the filter and selection have been replaced by comboboxes. Other than that the interface is practically the same. .SH "METHODS" .PP The \fBiwidgets::extfileselectiondialog\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for extfileselectiondialog widgets: .SH "ASSOCIATED METHODS" .LP .nf .ta 4c 8c 12c \fBget\fR \fBchildsite\fR \fBfilter\fR .fi .LP See the "fileselectionbox" class manual entry for details on the associated methods. .SH "INHERITED METHODS" .LP .nf .ta 4c 8c 12c \fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR \fBinsert\fR \fBinvoke\fR \fBshow\fR .fi .LP See the "buttonbox" widget manual entry for details on the above inherited methods. .LP .nf .ta 4c 8c 12c \fBactivate\fR \fBcenter\fR \fBdeactivate\fR .fi .LP See the "shell" widget manual entry for details on the above inherited methods. .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::extfileselectiondialog\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::extfileselectiondialog\fR command. .SH "COMPONENTS" .LP .nf Name: \fBfsb\fR Class: \fBFileselectionbox\fR .fi .IP The fsb component is the extfileselectionbox for the extfileselectiondialog. See the "extfileselectionbox" widget manual entry for details on the fsb component item. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 # # Non-modal example # proc okCallback {} { puts "You selected [.nmfsd get]" .nmfsd deactivate } iwidgets::extfileselectiondialog .nmfsd -title Non-Modal .nmfsd buttonconfigure OK -command okCallback .nmfsd activate # # Modal example # iwidgets::extfileselectiondialog .mfsd -modality application .mfsd center if {[.mfsd activate]} { puts "You selected [.mfsd get]" } else { puts "You cancelled the dialog" } .DE .SH AUTHOR Mark L. Ulferts .DE Anthony L. Parent .SH KEYWORDS extfileselectiondialog, extfileselectionbox, dialog, dialogshell, shell, widget iwidgets-4.1.0/doc/feedback.n0000644003604700454610000001060107476742024014410 0ustar dgp771div'\" '\" Copyright (c) 1996 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) feedback.n '\" .so man.macros .HS iwidgets::feedback iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::feedback \- Create and manipulate a feedback widget to display feedback on the current status of an ongoing operation to the user. .SH SYNOPSIS \fBiwidgets::feedback\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Feedback .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fBbackground\fR \fBcursor\fR \fBforeground\fR \fBhighlightColor\fR \fBhighlightThickness\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR \fBsticky\fR .fi .LP See the "labeledwidget" class manual entry for details on the inherited options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBbarcolor\fR Class: \fBBarColor\fR Command-Line Switch: \fB-barcolor\fR .fi .IP Specifies the color of the status bar, in any of the forms acceptable to \fBTk_GetColor\fR. The default is DodgerBlue. .LP .nf Name: \fBbarheight\fR Class: \fBBarHeight\fR Command-Line Switch: \fB-barheight\fR .fi .IP Specifies the height of the status bar, in any of the forms acceptable to \fBTk_GetPixels\fR. The default is 20. .LP .nf Name: \fBtroughColor\fR Class: \fBTroughColor\fR Command-Line Switch: \fB-troughcolor\fR .fi .IP Specifies the color of the frame in which the status bar sits, in any of the forms acceptable to \fBTk_GetColor\fR. The default is white. .LP .nf Name: \fBsteps\fR Class: \fBSteps\fR Command-Line Switch: \fB-steps\fR .fi .IP Specifies the total number of steps for the status bar. The default is 10. .LP .SH DESCRIPTION .PP The \fBiwidgets::feedback\fR command creates a widget to display feedback on the current status of an ongoing operation to the user. Display is given as a percentage and as a thermometer type bar. Options exist for adding a label and controlling its position. .SH "METHODS" .PP The \fBiwidgets::feedback\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for scrolledtext widgets: .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBscrolledhtml\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::feedback\fR command. .TP \fIpathName\fR \fBreset\fR Reset the current number of steps completed to 0, and configures the percentage complete label text to 0% .TP \fIpathName\fR \fBstep\fR ?\fIinc\fR? Increase the current number of steps completed by the amount specified by \fIinc\fR. \fIInc\fR defaults to 1. .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::feedback .fb -labeltext "Status" -steps 20 pack .fb -padx 10 -pady 10 -fill both -expand yes for {set i 0} {$i < 20} {incr i} { .fb step after 500 } .DE .SH ACKNOWLEDGEMENTS Sam Shen .IP This code is based largely on his feedback.tcl code from tk inspect. The original feedback code is copyright 1995 Lawrence Berkeley Laboratory. .LP .SH AUTHOR Kris Raney .SH KEYWORDS feedback, widget iwidgets-4.1.0/doc/fileselectionbox.n0000644003604700454610000002441307476742024016230 0ustar dgp771div'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) fileselectionbox.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::fileselectionbox iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::fileselectionbox \- Create and manipulate a file selection box widget .SH SYNOPSIS \fBiwidgets::fileselectionbox\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::Fileselectionbox .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB activeBackground background borderWidth cursor foreground highlightColor highlightThickness insertBackground insertBorderWidth insertOffTime insertOnTime insertWidth selectBackground selectBorderWidth selectForeground\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBtextBackground\fR \fBtextFont\fR .fi .LP See the "entryfield" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBlabelFont\fR .fi .LP See the "labeledwidget" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR .fi .LP See the "scrollbar" widget class manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBtextBackground\fR \fBtextFont\fR .fi .LP See the "scrolledlistbox" widget manual entry for details on the above associated options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBautomount\fR Class: \fBAutomount\fR Command-Line Switch: \fB-automount\fR .fi .IP Specifies a list of directory prefixes to ignore. Typically, this option would be used as follows: -automount {export tmp_mnt} .LP .nf Name: \fBchildSitePos\fR Class: \fBPosition\fR Command-Line Switch: \fB-childsitepos\fR .fi .IP Specifies the position of the child site in the selection box: \fBn\fR, \fBs\fR, \fBe\fR, \fBw\fR, \fBtop\fR, \fBbottom\fR, or \fBcenter\fR. The default is s. .fi .IP Specifies a Tcl command procedure which is called when an file list item is double clicked. Typically this occurs when mouse button 1 is double clicked over a file name. .LP .nf Name: \fBdirectory\fR Class: \fBDirectory\fR Command-Line Switch: \fB-directory\fR .fi .IP Specifies the initial default directory. The default is the present working directory. .LP .nf Name: \fBdirSearchCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-dirsearchcommand\fR .fi .IP Specifies a Tcl command to be executed to perform a directory search. The command will receive the current working directory and filter mask as arguments. The command should return a list of files which will be placed into the directory list. .LP .nf Name: \fBdirsLabel\fR Class: \fBText\fR Command-Line Switch: \fB-dirslabel\fR .fi .IP Specifies the text of the label for the directory list. The default is "Directories". .LP .nf Name: \fBdirsOn\fR Class: \fBDirsOn\fR Command-Line Switch: \fB-dirson\fR .fi .IP Specifies whether or not to display the directory list. The value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true. .LP .nf Name: \fBfileSearchCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-filesearchcommand\fR .fi .IP Specifies a Tcl command to be executed to perform a file search. The command will receive the current working directory and filter mask as arguments. The command should return a list of files which will be placed into the file list. .LP .nf Name: \fBfilesLabel\fR Class: \fBText\fR Command-Line Switch: \fB-fileslabel\fR .fi .IP Specifies the text of the label for the files list. The default is "Files". .LP .nf Name: \fBfilesOn\fR Class: \fBFilesOn\fR Command-Line Switch: \fB-fileson\fR .fi .IP Specifies whether or not to display the files list. The value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true. .LP .nf Name: \fBfileType\fR Class: \fBFileType\fR Command-Line Switch: \fB-filetype\fR .fi .IP Specify the type of files which may appear in the file list: \fBregular\fR, \fBdirectory\fR, or \fBany\fR. The default is regular. .LP .nf Name: \fBfilterCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-filtercommand\fR .fi .IP Specifies a Tcl command to be executed upon hitting the Return key in the filter entry widget. .LP .nf Name: \fBfilterLabel\fR Class: \fBText\fR Command-Line Switch: \fB-filterlabel\fR .fi .IP Specifies the text of the label for the filter entry field. The default is "Filter". .LP .nf Name: \fBfilterOn\fR Class: \fBFilterOn\fR Command-Line Switch: \fB-filteron\fR .fi .IP Specifies whether or not to display the filter entry. The value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true. .LP .nf Name: \fBheight\fR Class: \fBHeight\fR Command-Line Switch: \fB-height\fR .fi .IP Specifies the height of the selection box. The value may be specified in any of the forms acceptable to Tk_GetPixels. The default is 360 pixels. .LP .nf Name: \fBinvalid\fR Class: \fBCommand\fR Command-Line Switch: \fB-invalid\fR .fi .IP Command to be executed should the filter contents be proven invalid. The default is {bell}. .LP .nf Name: \fBmask\fR Class: \fBMask\fR Command-Line Switch: \fB-mask\fR .fi .IP Specifies the initial file mask string. The default is "*". .LP .nf Name: \fBnoMatchString\fR Class: \fBNoMatchString\fR Command-Line Switch: \fB-nomatchstring\fR .fi .IP Specifies the string to be displayed in the files list should no files match the mask. The default is "". .LP .nf Name: \fBselectDirCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-selectdirommand\fR .fi .IP Specifies a Tcl command to be executed following selection of a directory in the directory list. .LP .nf Name: \fBselectFileCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-selectfileommand\fR .fi .IP Specifies a Tcl command to be executed following selection of a file in the files list. .LP .nf Name: \fBselectionCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-selectioncommand\fR .fi .IP Specifies a Tcl command to be executed upon hitting the Return key in the selection entry widget. .LP .nf Name: \fBselectionLabel\fR Class: \fBText\fR Command-Line Switch: \fB-selectionlabel\fR .fi .IP Specifies the text of the label for the selection entry field. The default is "Selection". .LP .nf Name: \fBselectionOn\fR Class: \fBSelectionOn\fR Command-Line Switch: \fB-selectionon\fR .fi .IP Specifies whether or not to display the selection entry. The value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true. .LP .nf Name: \fBwidth\fR Class: \fBWidth\fR Command-Line Switch: \fB-width\fR .fi .IP Specifies the width of the selection box. The value may be specified in any of the forms acceptable to Tk_GetPixels. The default is 470 pixels. .LP .BE .SH DESCRIPTION .PP The \fBiwidgets::fileselectionbox\fR command creates a file selection box similar to the OSF/Motif standard Xmfileselectionbox composite widget. The fileselectionbox is composed of directory and file scrolled lists as well as filter and selection entry fields. Bindings are in place such that selection of a directory list item loads the filter entry field and selection of a file list item loads the selection entry field. Options exist to control the appearance and actions of the widget. .SH "METHODS" .PP The \fBiwidgets::fileselectionbox\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for fileselectionbox widgets: .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::fileselectionbox\fR command. .TP \fIpathName \fBchildsite\fR Returns the child site widget path name. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::fileselectionbox\fR command. .TP \fIpathName \fBfilter\fR Update the current contents of the file selection box based on the current filter entry field value. .TP \fIpathName \fBget\fR Returns the current value of the selection entry widget. .SH "COMPONENTS" .LP .nf Name: \fBdirs\fR Class: \fBScrolledlistbox\fR .fi .IP The dirs component is the directory list box for the file selection box. See the "scrolledlistbox" widget manual entry for details on the dirs component item. .LP .nf Name: \fBfiles\fR Class: \fBScrolledlistbox\fR .fi .IP The files component is the file list box for the file selection box. See the "scrolledlistbox" widget manual entry for details on the files component item. .LP .nf Name: \fBfilter\fR Class: \fBEntryfield\fR .fi .IP The filter component is the entry field for user input of the filter value. See the "entryfield" widget manual entry for details on the filter component item. .LP .nf Name: \fBselection\fR Class: \fBEntryfield\fR .fi .IP The selection component is the entry field for user input of the currently selected file value. See the "entryfield" widget manual entry for details on the selection component item. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::fileselectionbox .fsb pack .fsb -padx 10 -pady 10 -fill both -expand yes .DE .SH AUTHOR(S) Mark L. Ulferts .SH KEYWORDS fileselectionbox, widget iwidgets-4.1.0/doc/fileselectiondialog.n0000644003604700454610000001346707340742623016701 0ustar dgp771div'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) fileselectiondialog.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::fileselectiondialog iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::fileselectiondialog \- Create and manipulate a file selection dialog widget .SH SYNOPSIS \fBiwidgets::fileselectiondialog\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Toplevel <- iwidgets::Shell <- iwidgets::Dialogshell <- iwidgets::Dialog <- iwidgets::Fileselectiondialog .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB activeBackground background borderWidth cursor foreground highlightColor highlightThickness insertBackground insertBorderWidth insertOffTime insertOnTime insertWidth selectBackground selectBorderWidth selectForeground\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBtextBackground\fR \fBtextFont\fR .fi .LP See the "entryfield" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBchildSitePos\fR \fBdirectory\fR \fBdirsLabel\fR \fBdirSearchCommand\fR \fBdirsOn\fR \fBfilesLabel\fR \fBfilesLabelOn\fR \fBfileSearchCommand\fR \fBfilesOn\fR \fBfileType\fR \fBfilterLabel\fR \fBfilterOn\fR \fBinvalid\fR \fBmask\fR \fBnoMatchString\fR \fBselectionLabel\fR \fBselectionOn\fR .fi .LP See the "fileselectionbox" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBlabelFont\fR .fi .LP See the "labeledwidget" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBtextBackground\fR \fBtextFont\fR .fi .LP See the "scrolledlistbox" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR .fi .LP See the "scrollbar" widget class manual entry for details on the above associated options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR \fBpadY\fR \fBseparator\fR \fBthickness\fR .fi .LP See the "dialogshell" widget manual entry for details on the above inherited options. .LP .nf .ta 4c 8c 12c \fBheight\fR \fBmaster\fR \fBmodality\fR \fBwidth\fR .fi .LP See the "shell" widget manual entry for details on the above inherited options. .LP .nf .ta 4c 8c 12c \fBtitle\fR .fi .LP See the "Toplevel" widget manual entry for details on the above inherited options. .BE .SH DESCRIPTION .PP The \fBiwidgets::fileselectiondialog\fR command creates a file selection dialog similar to the OSF/Motif standard composite widget. The fileselectiondialog is derived from the Dialog class and is composed of a FileSelectionBox with attributes set to manipulate the dialog buttons. .SH "METHODS" .PP The \fBiwidgets::fileselectiondialog\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for fileselectiondialog widgets: .SH "ASSOCIATED METHODS" .LP .nf .ta 4c 8c 12c \fBget\fR \fBchildsite\fR \fBfilter\fR .fi .LP See the "fileselectionbox" class manual entry for details on the associated methods. .SH "INHERITED METHODS" .LP .nf .ta 4c 8c 12c \fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR \fBinsert\fR \fBinvoke\fR \fBshow\fR .fi .LP See the "buttonbox" widget manual entry for details on the above inherited methods. .LP .nf .ta 4c 8c 12c \fBactivate\fR \fBcenter\fR \fBdeactivate\fR .fi .LP See the "shell" widget manual entry for details on the above inherited methods. .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::fileselectiondialog\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::fileselectiondialog\fR command. .SH "COMPONENTS" .LP .nf Name: \fBfsb\fR Class: \fBFileselectionbox\fR .fi .IP The fsb component is the file selection box for the file selection dialog. See the "fileselectionbox" widget manual entry for details on the fsb component item. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 # # Non-modal example # proc okCallback {} { puts "You selected [.nmfsd get]" .nmfsd deactivate } iwidgets::fileselectiondialog .nmfsd -title Non-Modal .nmfsd buttonconfigure OK -command okCallback .nmfsd activate # # Modal example # iwidgets::fileselectiondialog .mfsd -modality application .mfsd center if {[.mfsd activate]} { puts "You selected [.mfsd get]" } else { puts "You cancelled the dialog" } .DE .SH AUTHOR Mark L. Ulferts .SH KEYWORDS fileselectiondialog, fileselectionbox, dialog, dialogshell, shell, widget iwidgets-4.1.0/doc/finddialog.n0000644003604700454610000002042707476742024014773 0ustar dgp771div'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) finddialog.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::finddialog iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::finddialog \- Create and manipulate a find dialog widget .SH SYNOPSIS \fBiwidgets::finddialog\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Toplevel <- iwidgets::Shell <- iwidgets::Dialogshell <- iwidgets::Finddialog .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB activeBackground activeForeground background borderWidth cursor disabledForeground font foreground highlightColor highlightThickness insertBackground insertBorderWidth insertOffTime insertOnTime insertWidth selectBackground selectBorderWidth selectColor selectForeground\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBselectColor\fR .fi .LP See the "checkbutton" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBselectColor\fR .fi .LP See the "entryfield" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBlabelFont\fR .fi .LP See the "labeledwidget" widget manual entry for details on the above associated options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR \fBpadY\fR \fBseparator\fR \fBthickness\fR .fi .LP See the "dialogshell" widget manual entry for details on the above inherited options. .LP .nf .ta 4c 8c 12c \fBheight\fR \fBmaster\fR \fBmodality\fR \fBwidth\fR .fi .LP See the "shell" widget manual entry for details on the above inherited options. .LP .nf .ta 4c 8c 12c \fBtitle\fR .fi .LP See the "Toplevel" widget manual entry for details on the above inherited options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBclearCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-clearcommand\fR .fi .IP Specifies a command to be invoked following a clear operation. The option is meant to be used as means of notification that the clear has taken place and allow other actions to take place such as disabling a find again menu. .LP .nf Name: \fBmatchCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-matchcommand\fR .fi .IP Specifies a command to be invoked following a find operation. The command is called with a match point as an argument which identifies where exactly where in the text or scrolledtext widget that the match is located. Should a match not be found the match point is {}. The option is meant to be used as a means of notification that the find operation has completed and allow other actions to take place such as disabling a find again menu option if the match point was {}. .LP .nf Name: \fBpatternBackground\fR Class: \fBBackground\fR Command-Line Switch: \fB-patternbackground\fR .fi .IP Specifies the background color of the text matching the search pattern. It may have any of the forms accepted by Tk_GetColor. The default is gray44. .LP .nf Name: \fBpatternForeground\fR Class: \fBBackground\fR Command-Line Switch: \fB-patternforeground\fR .fi .IP Specifies the foreground color of the text matching the search pattern. It may have any of the forms accepted by Tk_GetColor. The default is white. .LP .nf Name: \fBsearchBackground\fR Class: \fBBackground\fR Command-Line Switch: \fB-searchbackground\fR .fi .IP Specifies the background color of the line containing the matching the search pattern. It may have any of the forms accepted by Tk_GetColor. The default is gray77. .LP .nf Name: \fBsearchForeground\fR Class: \fBBackground\fR Command-Line Switch: \fB-searchforeground\fR .fi .IP Specifies the foreground color of the line containing the matching the search pattern. It may have any of the forms accepted by Tk_GetColor. The default is black. .LP .nf Name: \fBtextWidget\fR Class: \fBTextWidget\fR Command-Line Switch: \fB-textwidget\fR .fi .IP Specifies the text or scrolledtext widget to be searched. .BE .SH DESCRIPTION .PP The \fBiwidgets::finddialog\fR command creates a find dialog that works in conjunction with a text or scrolledtext widget to provide a means of performing search operations. The user is prompted for a text pattern to be found in the text or scrolledtext widget. The search can be for all occurances, by regular expression, considerate of the case, or backwards. .SH "METHODS" .PP The \fBiwidgets::finddialog\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for finddialog widgets: .SH "INHERITED METHODS" .LP .nf .ta 4c 8c 12c \fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR \fBinvoke\fR \fBshow\fR .fi .LP See the "buttonbox" widget manual entry for details on the above inherited methods. .LP .nf .ta 4c 8c 12c \fBactivate\fR \fBcenter\fR \fBdeactivate\fR .fi .LP See the "shell" widget manual entry for details on the above inherited methods. .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::finddialog\fR command. .TP \fIpathName \fBclear\fR Clears the pattern in the entry field and the pattern matchin indicators in the text or scrolledtext widget. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::finddialog\fR command. .TP \fIpathName \fBfind\fR Search for a specific text string in the text widget given by the -textwidget option. This method is the standard callback for the Find button. It is made available such that it can be bound to a find again action. .SH "COMPONENTS" .LP .nf Name: \fBall\fR Class: \fBCheckbutton\fR .fi .IP The all component specifies that all the matches of the pattern should be found when performing the search. See the "checkbutton" widget manual entry for details on the all component item. .LP .nf Name: \fBbackwards\fR Class: \fBCheckbutton\fR .fi .IP The backwards component specifies that the search should continue in a backwards direction towards the beginning of the text or scrolledtext widget. See the "checkbutton" widget manual entry for details on the backwards component item. .LP .nf Name: \fBcase\fR Class: \fBCheckbutton\fR .fi .IP The case component specifies that the case of the pattern should be taken into consideration when performing the search. See the "checkbutton" widget manual entry for details on the case component item. .LP .nf Name: \fBpattern\fR Class: \fBEntryfield\fR .fi .IP The pattern component provides the pattern entry field. See the "entryfield" widget manual entry for details on the pattern component item. .LP .nf Name: \fBregexp\fR Class: \fBCheckbutton\fR .fi .IP The regexp component specifies that the pattern is a regular expression. See the "checkbutton" widget manual entry for details on the regexp component item. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::scrolledtext .st pack .st .st insert end "Now is the time for all good men\\n" .st insert end "to come to the aid of their country" iwidgets::finddialog .fd -textwidget .st .fd center .st .fd activate .DE .SH AUTHOR Mark L. Ulferts .SH KEYWORDS finddialog, dialogshell, shell, widget iwidgets-4.1.0/doc/generateHtml.sh0000644003604700454610000000022406564065554015463 0ustar dgp771div#!/bin/ksh # manpages=`\ls *.n` for doc in $manpages do echo "Generating html/$doc.html" nroff -man $doc | rman -f html > html/$doc.html done iwidgets-4.1.0/doc/hierarchy.n0000644003604700454610000005140507476742024014651 0ustar dgp771div'\" '\" Copyright (c) 1997 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) hierarchy.n 1.21 94/12/17 16:04:44 '\" .so man.macros .HS iwidgets::hierarchy iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::hierarchy \- Create and manipulate a hierarchy widget .SH SYNOPSIS \fBiwidgets::hierarchy\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Scrolledwidget <- iwidgets::Hierarchy .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fB activeBackground activeForeground background borderWidth cursor disabledForeground foreground highlightColor highlightThickness relief selectBackground selectForeground\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR .fi .LP See the "scrollbar" widget manual entry for details on the above associated options. .LP .nf .ta 4c 8c 12c \fBspacing1\fR \fBspacing2\fR \fBspacing3\fR \fBtabs\fR .fi .LP See the "text" widget manual entry for details on the above associated options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR \fBsticky\fR .fi .LP See the "labeledwidget" class manual entry for details on the inherited options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBalwaysQuery\fR Class: \fBAlwaysQuery\fR Command-Line Switch: \fB-alwaysquery\fR .fi .IP Boolean flag which tells the hierarchy widget weather or not each refresh of the display should be via a new query using the command value of the -querycommand option or use the values previous found the last time the query was made. The default is no. .LP .nf Name: \fBclosedIcon\fR Class: \fBIcon\fR Command-Line Switch: \fB-closedicon\fR .fi .IP Specifies the name of an existing closed icon image to be used in the hierarchy before those nodes that are collapsed. Should one not be provided, then a folder icon will be generated, pixmap if possible, bitmap otherwise. .LP .nf Name: \fBdblClickCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-dblclickcommand\fR .fi .IP Specifies a command to be executed upon user double clicking via mouse button one of the text label of an entry. If this command contains "%n", it is replaced with the name of the selected node. Should it contain "%s" then a boolean indicator of the node's current selection status is substituted. .LP .nf Name: \fBexpanded\fR Class: \fBExpanded\fR Command-Line Switch: \fB-expanded\fR .fi .IP When true, the hierarchy will be completely expanded when it is first displayed. A fresh display can be triggered by resetting the -querycommand option. The default is false. .LP .nf Name: \fBfilter\fR Class: \fBFilter\fR Command-Line Switch: \fB-filter\fR .fi .IP When true only the branch nodes and selected items are displayed. This gives a compact view of important items. The default is false. .LP .nf Name: \fBheight\fR Class: \fBHeight\fR Command-Line Switch: \fB-height\fR .fi .IP Specifies the height of the hierarchy as an entire unit. The value may be specified in any of the forms acceptable to \fBTk_GetPixels\fR. Any additional space needed to display the other components such as labels, margins, and scrollbars force the hierarchy to be compressed. A value of zero along with the same value for the width causes the value given for the visibleitems option to be applied which administers geometry constraints in a different manner. The default height is zero. .LP .nf Name: \fBiconCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-iconcommand\fR .fi .IP Specifies a command to be executed upon user selection via mouse button one of any additional icons given in the values returned by the command associated with the -querycommand option. If this command contains "%n", it is replaced with the name of the node the icon belongs to. Should it contain "%i" then the icon name is substituted. .LP .nf Name: \fBiconDblCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-icondblcommand\fR .fi .IP Specifies a command to be executed upon user double clicking via mouse button one of the icon of an entry. If this command contains "%n", it is replaced with the name of the node the icon belongs to. Should it contain "%i" then the icon name is substituted. .LP .nf Name: \fBimageCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-imagecommand\fR .fi .IP Specifies a command to be executed upon user selecting an image of an entry. If this command contains "%n", it is replaced with the name of the selected node. Should it contain "%s" then a boolean indicator of the node's current selection status is substituted. .LP .nf Name: \fBimageDblCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-imagedblcommand\fR .fi .IP Specifies a command to be executed upon user double clicking via mouse button one of the image of an entry. If this command contains "%n", it is replaced with the name of the node the icon belongs to. Should it contain "%i" then the icon name is substituted. .LP .nf Name: \fBimageMenuLoadCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-imagemenuloadcommand\fR .fi .IP Specifies a command to be executed upon user selection via mouse button three, on the image or icon, that will dynamically load the itemMenu for the widget. .LP .nf Name: \fBmarkBackground\fR Class: \fBForeground\fR Command-Line Switch: \fB-markbackground\fR .fi .IP Specifies the background color to use when displaying marked nodes. .LP .nf Name: \fBmarkForeground\fR Class: \fBBackground\fR Command-Line Switch: \fB-markforeground\fR .fi .IP Specifies the foreground color to use when displaying marked nodes. .LP .nf Name: \fBmenuCursor\fR Class: \fBCursor\fR Command-Line Switch: \fB-menucursor\fR .fi .IP Specifies the mouse cursor to be used for the item and background menus. The value may have any of the forms accept able to Tk_GetCursor. .LP .nf Name: \fBnodeIcon\fR Class: \fBIcon\fR Command-Line Switch: \fB-nodeicon\fR .fi .IP Specifies the name of an existing node icon image to be used in the hierarchy before those nodes that are leafs. Should one not be provided, then a dog-eared page icon will be generated, pixmap if possible, bitmap otherwise. .LP .nf Name: \fBopenIcon\fR Class: \fBIcon\fR Command-Line Switch: \fB-openicon\fR .fi .IP Specifies the name of an existing open icon image to be used in the hierarchy before those nodes that are expanded. Should one not be provided, then an open folder icon will be generated, pixmap if possible, bitmap otherwise. .LP .nf Name: \fBqueryCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-querycommand\fR .fi .IP Specifies the command executed to query the contents of each node. If this command contains "%n", it is replaced with the name of the desired node. In its simpilest form it should return the children of the given node as a list which will be depicted in the display. Since the names of the children are used as tags in the underlying text widget, each child must be unique in the hierarchy. Due to the unique requirement, the nodes shall be reffered to as uids or uid in the singular sense. The format of returned list is .IP {uid [uid ...]} .IP where uid is a unique id and primary key for the hierarchy entry .IP Should the unique requirement pose a problem, the list returned can take on another more extended form which enables the association of text to be displayed with the uids. The uid must still be unique, but the text does not have to obey the unique rule. In addition, the format also allows the specification of additional tags to be used on the same entry in the hierarchy as the uid and additional icons to be displayed just before the node. The tags and icons are considered to be the property of the user in that the hierarchy widget will not depend on any of their values. The extended format is .IP {{uid [text [tags [icons]]]} {uid [text [tags [icons]]]} ...} .IP where uid is a unique id and primary key for the hierarchy entry text is the text to be displayed for this uid tags is a list of user tags to be applied to the entry icons is a list of icons to be displayed in front of the text .IP The hierarchy widget does a look ahead from each node to determine if the node has a children. This can be cost some performace with large hierarchies. User's can avoid this by providing a hint in the user tags. A tag of "leaf" or "branch" tells the hierarchy widget the information it needs to know thereby avoiding the look ahead operation. .LP .nf Name: \fBhscrollMode\fR Class: \fBScrollMode\fR Command-Line Switch: \fB-hscrollmode\fR .fi .IP Specifies the the display mode to be used for the horizontal scrollbar: \fBstatic, dynamic,\fR or \fBnone\fR. In static mode, the scroll bar is displayed at all times. Dynamic mode displays the scroll bar as required, and none disables the scroll bar display. The default is static. .LP .nf Name: \fBsbWidth\fR Class: \fBWidth\fR Command-Line Switch: \fB-sbwidth\fR .fi .IP Specifies the width of the scrollbar in any of the forms acceptable to \fBTk_GetPixels\fR. .LP .nf Name: \fBscrollMargin\fR Class: \fBMargin\fR Command-Line Switch: \fB-scrollmargin\fR .fi .IP Specifies the distance between the text portion of the hierarchy and the scrollbars in any of the forms acceptable to \fBTk_GetPixels\fR. The default is 3 pixels. .LP .nf Name: \fBselectCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-selectcommand\fR .fi .IP Specifies a Tcl command to be evaluated when you select a node in the hierarchy via left mouse click. If "%n" is included in the command, it is substituted with the node name. Similarly, "%s" is substituted with the node's current selection status: 1 for selected, 0 otherwise. .LP Name: \fBtextBackground\fR Class: \fBBackground\fR Command-Line Switch: \fB-textbackground\fR .fi .IP Specifies the background color for the text portion of the hierarchy in any of the forms acceptable to \fBTk_GetColor\fR. .LP .nf Name: \fBtextFont\fR Class: \fBFont\fR Command-Line Switch: \fB-textfont\fR .fi .IP Specifies the font to be used in the text portion of the hierarchy. .LP .nf Name: \fBtextMenuLoadCommand\fR Class: \fBCommand\fR Command-Line Switch: \fB-textmenuloadcommand\fR .fi .IP Specifies a command to be executed upon user selection via mouse button three, that will dynamically load the itemMenu for the widget. .LP .nf Name: \fBvisibleitems\fR Class: \fBVisibleItems\fR Command-Line Switch: \fB-visibleitems\fR .fi .IP Specifies the widthxheight in characters and lines for the hierarchy. This option is only administered if the width and height options are both set to zero, otherwise they take precedence. The default value is 80x24. With the visibleitems option engaged, geometry constraints are maintained only on the text portion of the hierarchy. The size of the other components such as labels, margins, and scroll bars, are additive and independent, effecting the overall size of the hierarchy. In contrast, should the width and height options have non zero values, they are applied to the hierarchy as a whole. The hierarchy is compressed or expanded to maintain the geometry constraints. .LP .nf Name: \fBvscrollMode\fR Class: \fBScrollMode\fR Command-Line Switch: \fB-vscrollmode\fR .fi .IP Specifies the the display mode to be used for the vertical scrollbar: \fBstatic, dynamic,\fR or \fBnone\fR. In static mode, the scroll bar is displayed at all times. Dynamic mode displays the scroll bar as required, and none disables the scroll bar display. The default is static. .LP .nf Name: \fBwidth\fR Class: \fBWidth\fR Command-Line Switch: \fB-width\fR .fi .IP Specifies the width of the hierarchy as an entire unit. The value may be specified in any of the forms acceptable to \fBTk_GetPixels\fR. Any additional space needed to display the other components such as labels, margins, and scrollbars force the text portion of the hierarchy to be compressed. A value of zero along with the same value for the height causes the value given for the visibleitems option to be applied which administers geometry constraints in a different manner. The default width is zero. .LP .BE .SH DESCRIPTION .PP The \fBiwidgets::hierarchy\fR command creates a hierarchical data view widget. It allows the graphical management of a a list of nodes that can be expanded or collapsed. Individual nodes can be highlighted. Clicking with the right mouse button on any item brings up a special item menu. Clicking on the background area brings up a different popup menu. Options exist to provide user control over the loading of the nodes and actions associated with node selection. Since the hierarchy is based on the scrolledtext widget, it includes options to control the method in which the scrollbars are displayed, i.e. statically or dynamically. Options also exist for adding a label to the hierarchy and controlling its position. .SH "METHODS" .PP The \fBiwidgets::hierarchy\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for hierarchy widgets: .SH "ASSOCIATED METHODS" .LP .nf .ta 4c 8c 12c \fBbbox\fR \fBcompare\fR \fBdebug\fR \fBdelete\fR \fBdlineinfo\fR \fBdump\fR \fBget\fR \fBindex\fR \fBinsert\fR \fBscan\fR \fBsearch\fR \fBsee\fR \fBtag\fR \fBwindow\fR \fBxview\fR \fByview\fR .fi .LP See the "text" manual entry for details on the standard methods. .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::hierarchy\fR command. .TP \fIpathName \fBclear\fR Removes all items from the hierarchy display including all tags and icons. The display will remain empty until the -filter or -querycommand options are set. .TP \fIpathName \fBcollapse\fR \fIuid\fR Collapses the hierarchy beneath the node with the specified unique id by one level. Since this can take a moment for large hierarchies, the cursor will be changed to a watch during the collapse. Also, if any of the nodes beneath the node being collapsed are selected, their status is changed to unselected. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::hierarchy\fR command. .TP \fIpathName \fBcurrent\fR Returns the tags for the node that was most recently selected by the right mouse button when the item menu was posted. Usually used by the code in the item menu to figure out what item is being manipulated. .TP \fIpathName \fBdraw\fR ?\fIwhen\fR? Performs a complete redraw of the entire hierarchy. When may be either -now or -eventually where the latter means the draw can be performed after idle. .TP \fIpathName \fBexpand\fR \fIuid\fR Expands the hierarchy beneath the node with the specified unique id by one level. Since this can take a moment for large hierarchies, the cursor will be changed to a watch during the expansion. .TP \fIpathName \fBexpanded\fR \fIuid\fR Returns the current state of expansion for the node with the specified unique id. .TP \fIpathName \fBexpState\fR Returns a list of all expanded nodes in the tree. .TP \fIpathName \fBmark\fR \fIoption ?arg arg ...?\fR This command is used to manipulate marks which is quite similar to selection, adding a secondary means of hilighting an item in the hierarchy. The exact behavior of the command depends on the \fIoption\fR argument that follows the \fBmark\fR argument. The following forms of the command are currently supported: .RS .TP \fIpathName \fBmark clear\fR Clears all the currently marked nodes in the hierarchy. .TP \fIpathName \fBmark add \fIuid \fR?\fIuid uid ...\fR? Marks the nodes with the specified uids in the hierarchy using the \fB-markbackground\fR and \fB-markforeground\fR options and without affecting the mark state of any other nodes that were already marked. .TP \fIpathName \fBmark remove \fIuid \fR?\fIuid uid ...\fR? Unmarks the nodes with the specified uids in the hierarchy without affecting the mark state of any other nodes that were already marked. .TP \fIpathName \fBmark get\fR Returns a list of the unique ids that are currently marked. .RE .TP \fIpathName \fBrefresh\fR \fIuid\fR Performs a redraw of a specific node that has the given uid. If the node is not currently visible or in other words already drawn on the text, then no action is taken. .TP \fIpathName \fBprune\fR \fIuid\fR Removes the node specified by the given uid from the hierarchy. Should the node have children, then all of its children will be removed as well. .TP \fIpathName \fBselection\fR \fIoption \fR?\fIarg arg ...\fR? This command is used to manipulate the selection of nodes in the hierarchy. The exact behavior of the command depends on the \fIoption\fR argument that follows the \fBselection\fR argument. The following forms of the command are currently supported: .RS .TP \fIpathName \fBselection clear\fR Clears all the currently selected nodes in the hierarchy. .TP \fIpathName \fBselection add \fIuid \fR?\fIuid uid ...\fR? Selects the nodes with the specified uids in the hierarchy using the \fB-selectionbackground\fR and \fB-selectionforeground\fR options and without affecting the selection state of any other nodes that were already selected. .TP \fIpathName \fBselection remove \fIuid \fR?\fIuid uid ...\fR? Deselects the nodes with the specified uids in the hierarchy without affecting the selection state of any other nodes that were already selected. .TP \fIpathName \fBselection get\fR Returns a list of the unique ids that are currently selected. .RE A nodes selection status is also dependent on it being visible. If a node is selected and its parent is then collapsed making the selected node not visible, then its selection status is changed to unselected. .TP \fIpathName \fBtoggle\fR \fIuid\fR Toggles the hierarchy beneath the node with the specified unique id. If the hierarchy is currently expanded, then it is collapsed, and vice-versa. .SH "COMPONENTS" .LP .nf Name: \fBlist\fR Class: \fBText\fR .fi .IP The list component is the text widget in which the hierarchy is displayed. See the "text" widget manual entry for details on the text component item. .LP .nf Name: \fBbgMenu\fR Class: \fBMenu\fR .fi .IP The bgMenu component is the popup menu which is displayed upon pressing the right mouse button in the background, i.e. not over a specific node. Menu items can be added along with their commands via the component command. See the "menu" widget manual entry for details on the bgMenu component item. .LP .nf Name: \fBhorizsb\fR Class: \fBScrollbar\fR .fi .IP The horizsb component is the horizontal scroll bar. See the "scrollbar" widget manual entry for details on the horizsb component item. .LP .nf Name: \fBitemMenu\fR Class: \fBMenu\fR .fi .IP The itemMenu component is the popup menu which is displayed upon selection of a hierarchy node with the right mouse button. Menu items can be added along with their commands via the component command. See the "menu" widget manual entry for details on the itemMenu component item. .LP .nf Name: \fBvertsb\fR Class: \fBScrollbar\fR .fi .IP The vertsb component is the vertical scroll bar. See the "scrollbar" widget manual entry for details on the vertsb component item. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 proc get_files {file} { global env if {$file == ""} { set dir $env(HOME) } else { set dir $file } if {[catch {cd $dir}] != 0} { return "" } set rlist "" foreach file [lsort [glob -nocomplain *]] { lappend rlist [list [file join $dir $file] $file] } return $rlist } iwidgets::hierarchy .h -querycommand "get_files %n" -visibleitems 30x15 \ -labeltext $env(HOME) pack .h -side left -expand yes -fill both .DE .SH AUTHOR Mark L. Ulferts .DE Michael J. McLennan .SH KEYWORDS hierarchy, text, widget iwidgets-4.1.0/doc/hyperhelp.n0000644003604700454610000001434607476742024014676 0ustar dgp771div'\" '\" Copyright (c) 1996 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) Hyperhelp.n '\" .so man.macros .HS iwidgets::hyperhelp iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::hyperhelp \- Create and manipulate a hyperhelp widget .SH SYNOPSIS \fBiwidgets::hyperhelp\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Toplevel <- iwidgets::Shell <- iwidgets::Hyperhelp .SH "STANDARD OPTIONS" .LP .nf .ta 5c 10c \fBactiveBackground\fR \fBbackground\fR \fBborderWidth\fR \fBclosecmd\fR \fBcursor\fR \fBexportSelection\fR \fBforeground\fR \fBhighlightColor\fR \fBhighlightThickness\fR \fBinsertBackground\fR \fBinsertBorderWidth \fBinsertOffTime\fR \fBinsertOnTime\fR \fBinsertWidth\fR \fBpadX\fR \fBpadY\fR \fBrelief\fR \fBrepeatDelay\fR \fBrepeatInterval\fR \fBselectBackground\fR \fBselectBorderWidth\fR \fBselectForeground\fR \fBsetGrid\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP .nf .ta 4c 8c 12c \fBhscrollmode\fR \fBvscrollmode\fR \fBtextbackground\fR \fBfontname\fR \fBfontsize\fR \fBfixedfont\fR \fBlink\fR \fBlinkhighlight\fR \fBwidth\fR \fBheight\fR \fBstate\fR \fBwrap\fR \fBunknownimage\fR .fi .LP See the "scrolledhtml" widget manual entry for details on the above associated options. .SH "INHERITED OPTIONS" .LP .nf .ta 4c 8c 12c \fBmodality\fR \fBtitle\fR .fi .LP See the "shell" manual entry for details on the above inherited options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBtopics\fR Class: \fBTopics\fR Command-Line Switch: \fB-topics\fR .fi .IP Specifies a list of help topics in the form {?\fItopic\fR? ... }. \fITopic\fR may either be a topic name, in which case the document associated with the topic should be in the file \fBhelpdir\fR/\fItopic\fR.html, or it may be of the form {\fIname\fR \fIfile\fR}. In the latter case, \fIname\fR is displayed in the topic menu, and selecting the name loads \fIfile\fR. If file has a relative path, it is assumed to be relative to helpdir. .LP .nf Name: \fBhelpdir\fR Class: \fBDirectory\fR Command-Line Switch: \fB-helpdir\fR .fi .IP Specifies the directory where help files are located. .LP .nf Name: \fBcloseCmd\fR Class: \fBCloseCmd\fR Command-Line Switch: \fB-closecmd\fR .fi .IP Specifies the tcl command to be executed when the close option is selected from the topics menu. .LP .nf Name: \fBmaxHistory\fR Class: \fBMaxHistory\fR Command-Line Switch: \fB-maxhistory\fR .fi .IP Specifies the maximum number of entries stored in the history list .LP .nf Name: \fBbeforelink\fR Class: \fBBeforeLink\fR Command-Line Switch: \fB-beforelink\fR .fi .IP Specifies a command to be eval'ed before a new link is displayed. The path of the link to be displayed is appended before evaling the command. A suggested use might be to busy the widget while a new page is being displayed. .LP .nf Name: \fBafterlink\fR Class: \fBAfterLink\fR Command-Line Switch: \fB-afterlink\fR .fi .IP Specifies a command to be eval'ed after a new link is completely displayed. The path of the link that was displayed is appended before evaling the command. .LP .BE .SH DESCRIPTION .PP The \fBiwidgets::hyperhelp\fR command creates a shell window with a pulldown menu showing a list of topics. The topics are displayed by importing a HTML formatted file named \fBhelpdir\fR/\fItopic\fR.html. For a list of supported HTML tags, see \fBscrolledhtml(n)\fR. .SH "METHODS" .PP The \fBiwidgets::hyperhelp\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for dialog widgets: .SH "INHERITED METHODS" .LP .nf .ta 4c 8c 12c \fBactivate\fR \fBcenter\fR \fBchildsite\fR \fBdeactivate\fR .fi .LP See the "shell" manual entry for details on the above inherited methods. .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::hyperhelp\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::hyperhelp\fR command. .TP \fIpathName\fR \fBshowtopic\fR \fItopic\fR Display html file \fBhelpdir\fR/\fItopic\fR.html. \fITopic\fR may optionally be of the form \fItopicname\fR#\fIanchorname\fR. In this form, either \fItopicname\fR or \fIanchorname\fR or both may be empty. If \fItopicname\fR is empty, the current topic is assumed. If \fIanchorname\fR is empty, the top of the document is assumed .TP \fIpathName\fR \fBfollowlink\fR \fIhref\fR Display html file \fIhref\fR. \fIHref\fR may be optionally be of the form \fIfilename\fR#\fIanchorname\fR. In this form, either \fIfilename\fR or \fIanchorname\fR or both may be empty. If \fIfilename\fR is empty, the current document is assumed. If \fIanchorname\fR is empty, the top of the document is assumed. .TP \fIpathName\fR \fBforward\fR Display html file one forward in history list, if applicable. .TP \fIpathName\fR \fBback\fR Display html file one back in history list, if applicable. .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::hyperhelp .h -topics { Intro Help } -helpdir ~/help .h showtopic Intro .DE .SH AUTHOR Kris Raney .SH KEYWORDS hyperhelp, html, help, shell, widget iwidgets-4.1.0/doc/iwidgets.ps0000644003604700454610000152714706576036250014710 0ustar dgp771div%!PS-Adobe-3.0 %%BoundingBox: (atend) %%Pages: (atend) %%PageOrder: (atend) %%DocumentFonts: (atend) %%Creator: Frame 4.0 %%DocumentData: Clean7Bit %%EndComments %%BeginProlog % % Frame ps_prolog 4.0, for use with Frame 4.0 products % This ps_prolog file is Copyright (c) 1986-1993 Frame Technology % Corporation. All rights reserved. This ps_prolog file may be % freely copied and distributed in conjunction with documents created % using FrameMaker, FrameBuilder and FrameViewer as long as this % copyright notice is preserved. % % Frame products normally print colors as their true color on a color printer % or as shades of gray, based on luminance, on a black-and white printer. The % following flag, if set to True, forces all non-white colors to print as pure % black. This has no effect on bitmap images. /FMPrintAllColorsAsBlack true def % % Frame products can either set their own line screens or use a printer's % default settings. Three flags below control this separately for no % separations, spot separations and process separations. If a flag % is true, then the default printer settings will not be changed. If it is % false, Frame products will use their own settings from a table based on % the printer's resolution. /FMUseDefaultNoSeparationScreen true def /FMUseDefaultSpotSeparationScreen true def /FMUseDefaultProcessSeparationScreen false def % % For any given PostScript printer resolution, Frame products have two sets of % screen angles and frequencies for printing process separations, which are % recomended by Adobe. The following variable chooses the higher frequencies % when set to true or the lower frequencies when set to false. This is only % effective if the appropriate FMUseDefault...SeparationScreen flag is false. /FMUseHighFrequencyScreens true def % % PostScript Level 2 printers contain an "Accurate Screens" feature which can % improve process separation rendering at the expense of compute time. This % flag is ignored by PostScript Level 1 printers. /FMUseAcccurateScreens true def % % The following PostScript procedure defines the spot function that Frame % products will use for process separations. You may un-comment-out one of % the alternative functions below, or use your own. % % Dot function /FMSpotFunction {abs exch abs 2 copy add 1 gt {1 sub dup mul exch 1 sub dup mul add 1 sub } {dup mul exch dup mul add 1 exch sub }ifelse } def % % Line function % /FMSpotFunction { pop } def % % Elipse function % /FMSpotFunction { dup 5 mul 8 div mul exch dup mul exch add % sqrt 1 exch sub } def % % /FMversion (4.0) def /FMLevel1 /languagelevel where {pop languagelevel} {1} ifelse 2 lt def /FMPColor FMLevel1 { false /colorimage where {pop pop true} if } { true } ifelse def /FrameDict 400 dict def systemdict /errordict known not {/errordict 10 dict def errordict /rangecheck {stop} put} if % The readline in PS 23.0 doesn't recognize cr's as nl's on AppleTalk FrameDict /tmprangecheck errordict /rangecheck get put errordict /rangecheck {FrameDict /bug true put} put FrameDict /bug false put mark % Some PS machines read past the CR, so keep the following 3 lines together! currentfile 5 string readline 00 0000000000 cleartomark errordict /rangecheck FrameDict /tmprangecheck get put FrameDict /bug get { /readline { /gstring exch def /gfile exch def /gindex 0 def { gfile read pop dup 10 eq {exit} if dup 13 eq {exit} if gstring exch gindex exch put /gindex gindex 1 add def } loop pop gstring 0 gindex getinterval true } bind def } if /FMshowpage /showpage load def /FMquit /quit load def /FMFAILURE { dup = flush FMshowpage /Helvetica findfont 12 scalefont setfont 72 200 moveto show FMshowpage FMquit } def /FMVERSION { FMversion ne { (Frame product version does not match ps_prolog!) FMFAILURE } if } def /FMBADEPSF { (PostScript Lang. Ref. Man., 2nd Ed., H.2.4 says EPS must not call X ) dup dup (X) search pop exch pop exch pop length 4 -1 roll putinterval FMFAILURE } def /FMLOCAL { FrameDict begin 0 def end } def /concatprocs { /proc2 exch cvlit def/proc1 exch cvlit def/newproc proc1 length proc2 length add array def newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval newproc cvx }def FrameDict begin /FMnone 0 def /FMcyan 1 def /FMmagenta 2 def /FMyellow 3 def /FMblack 4 def /FMcustom 5 def /FrameNegative false def /FrameSepIs FMnone def /FrameSepBlack 0 def /FrameSepYellow 0 def /FrameSepMagenta 0 def /FrameSepCyan 0 def /FrameSepRed 1 def /FrameSepGreen 1 def /FrameSepBlue 1 def /FrameCurGray 1 def /FrameCurPat null def /FrameCurColors [ 0 0 0 1 0 0 0 ] def /FrameColorEpsilon .001 def /eqepsilon { sub dup 0 lt {neg} if FrameColorEpsilon le } bind def /FrameCmpColorsCMYK { 2 copy 0 get exch 0 get eqepsilon { 2 copy 1 get exch 1 get eqepsilon { 2 copy 2 get exch 2 get eqepsilon { 3 get exch 3 get eqepsilon } {pop pop false} ifelse }{pop pop false} ifelse } {pop pop false} ifelse } bind def /FrameCmpColorsRGB { 2 copy 4 get exch 0 get eqepsilon { 2 copy 5 get exch 1 get eqepsilon { 6 get exch 2 get eqepsilon }{pop pop false} ifelse } {pop pop false} ifelse } bind def /RGBtoCMYK { 1 exch sub 3 1 roll 1 exch sub 3 1 roll 1 exch sub 3 1 roll 3 copy 2 copy le { pop } { exch pop } ifelse 2 copy le { pop } { exch pop } ifelse dup dup dup 6 1 roll 4 1 roll 7 1 roll sub 6 1 roll sub 5 1 roll sub 4 1 roll } bind def /CMYKtoRGB { dup dup 4 -1 roll add 5 1 roll 3 -1 roll add 4 1 roll add 1 exch sub dup 0 lt {pop 0} if 3 1 roll 1 exch sub dup 0 lt {pop 0} if exch 1 exch sub dup 0 lt {pop 0} if exch } bind def /FrameSepInit { 1.0 RealSetgray } bind def /FrameSetSepColor { /FrameSepBlue exch def /FrameSepGreen exch def /FrameSepRed exch def /FrameSepBlack exch def /FrameSepYellow exch def /FrameSepMagenta exch def /FrameSepCyan exch def /FrameSepIs FMcustom def setCurrentScreen } bind def /FrameSetCyan { /FrameSepBlue 1.0 def /FrameSepGreen 1.0 def /FrameSepRed 0.0 def /FrameSepBlack 0.0 def /FrameSepYellow 0.0 def /FrameSepMagenta 0.0 def /FrameSepCyan 1.0 def /FrameSepIs FMcyan def setCurrentScreen } bind def /FrameSetMagenta { /FrameSepBlue 1.0 def /FrameSepGreen 0.0 def /FrameSepRed 1.0 def /FrameSepBlack 0.0 def /FrameSepYellow 0.0 def /FrameSepMagenta 1.0 def /FrameSepCyan 0.0 def /FrameSepIs FMmagenta def setCurrentScreen } bind def /FrameSetYellow { /FrameSepBlue 0.0 def /FrameSepGreen 1.0 def /FrameSepRed 1.0 def /FrameSepBlack 0.0 def /FrameSepYellow 1.0 def /FrameSepMagenta 0.0 def /FrameSepCyan 0.0 def /FrameSepIs FMyellow def setCurrentScreen } bind def /FrameSetBlack { /FrameSepBlue 0.0 def /FrameSepGreen 0.0 def /FrameSepRed 0.0 def /FrameSepBlack 1.0 def /FrameSepYellow 0.0 def /FrameSepMagenta 0.0 def /FrameSepCyan 0.0 def /FrameSepIs FMblack def setCurrentScreen } bind def /FrameNoSep { /FrameSepIs FMnone def setCurrentScreen } bind def /FrameSetSepColors { FrameDict begin [ exch 1 add 1 roll ] /FrameSepColors exch def end } bind def /FrameColorInSepListCMYK { FrameSepColors { exch dup 3 -1 roll FrameCmpColorsCMYK { pop true exit } if } forall dup true ne {pop false} if } bind def /FrameColorInSepListRGB { FrameSepColors { exch dup 3 -1 roll FrameCmpColorsRGB { pop true exit } if } forall dup true ne {pop false} if } bind def /RealSetgray /setgray load def /RealSetrgbcolor /setrgbcolor load def /RealSethsbcolor /sethsbcolor load def end /setgray { FrameDict begin FrameSepIs FMnone eq { RealSetgray } { FrameSepIs FMblack eq { RealSetgray } { FrameSepIs FMcustom eq FrameSepRed 0 eq and FrameSepGreen 0 eq and FrameSepBlue 0 eq and { RealSetgray } { 1 RealSetgray pop } ifelse } ifelse } ifelse end } bind def /setrgbcolor { FrameDict begin FrameSepIs FMnone eq { RealSetrgbcolor } { 3 copy [ 4 1 roll ] FrameColorInSepListRGB { FrameSepBlue eq exch FrameSepGreen eq and exch FrameSepRed eq and { 0 } { 1 } ifelse } { FMPColor { RealSetrgbcolor currentcmykcolor } { RGBtoCMYK } ifelse FrameSepIs FMblack eq {1.0 exch sub 4 1 roll pop pop pop} { FrameSepIs FMyellow eq {pop 1.0 exch sub 3 1 roll pop pop} { FrameSepIs FMmagenta eq {pop pop 1.0 exch sub exch pop } { FrameSepIs FMcyan eq {pop pop pop 1.0 exch sub } {pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse } ifelse RealSetgray } ifelse end } bind def /sethsbcolor { FrameDict begin FrameSepIs FMnone eq { RealSethsbcolor } { RealSethsbcolor currentrgbcolor setrgbcolor } ifelse end } bind def FrameDict begin /setcmykcolor where { pop /RealSetcmykcolor /setcmykcolor load def } { /RealSetcmykcolor { 4 1 roll 3 { 3 index add 0 max 1 min 1 exch sub 3 1 roll} repeat setrgbcolor pop } bind def } ifelse userdict /setcmykcolor { FrameDict begin FrameSepIs FMnone eq { RealSetcmykcolor } { 4 copy [ 5 1 roll ] FrameColorInSepListCMYK { FrameSepBlack eq exch FrameSepYellow eq and exch FrameSepMagenta eq and exch FrameSepCyan eq and { 0 } { 1 } ifelse } { FrameSepIs FMblack eq {1.0 exch sub 4 1 roll pop pop pop} { FrameSepIs FMyellow eq {pop 1.0 exch sub 3 1 roll pop pop} { FrameSepIs FMmagenta eq {pop pop 1.0 exch sub exch pop } { FrameSepIs FMcyan eq {pop pop pop 1.0 exch sub } {pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse } ifelse RealSetgray } ifelse end } bind put FMLevel1 not { /patProcDict 5 dict dup begin <0f1e3c78f0e1c387> { 3 setlinewidth -1 -1 moveto 9 9 lineto stroke 4 -4 moveto 12 4 lineto stroke -4 4 moveto 4 12 lineto stroke} bind def <0f87c3e1f0783c1e> { 3 setlinewidth -1 9 moveto 9 -1 lineto stroke -4 4 moveto 4 -4 lineto stroke 4 12 moveto 12 4 lineto stroke} bind def <8142241818244281> { 1 setlinewidth -1 9 moveto 9 -1 lineto stroke -1 -1 moveto 9 9 lineto stroke } bind def <03060c183060c081> { 1 setlinewidth -1 -1 moveto 9 9 lineto stroke 4 -4 moveto 12 4 lineto stroke -4 4 moveto 4 12 lineto stroke} bind def <8040201008040201> { 1 setlinewidth -1 9 moveto 9 -1 lineto stroke -4 4 moveto 4 -4 lineto stroke 4 12 moveto 12 4 lineto stroke} bind def end def /patDict 15 dict dup begin /PatternType 1 def /PaintType 2 def /TilingType 3 def /BBox [ 0 0 8 8 ] def /XStep 8 def /YStep 8 def /PaintProc { begin patProcDict bstring known { patProcDict bstring get exec } { 8 8 true [1 0 0 -1 0 8] bstring imagemask } ifelse end } bind def end def } if /combineColor { FrameSepIs FMnone eq { graymode FMLevel1 or not { [/Pattern [/DeviceCMYK]] setcolorspace FrameCurColors 0 4 getinterval aload pop FrameCurPat setcolor } { FrameCurColors 3 get 1.0 ge { FrameCurGray RealSetgray } { FMPColor graymode and { 0 1 3 { FrameCurColors exch get 1 FrameCurGray sub mul } for RealSetcmykcolor } { 4 1 6 { FrameCurColors exch get graymode { 1 exch sub 1 FrameCurGray sub mul 1 exch sub } { 1.0 lt {FrameCurGray} {1} ifelse } ifelse } for RealSetrgbcolor } ifelse } ifelse } ifelse } { FrameCurColors 0 4 getinterval aload FrameColorInSepListCMYK { FrameSepBlack eq exch FrameSepYellow eq and exch FrameSepMagenta eq and exch FrameSepCyan eq and FrameSepIs FMcustom eq and { FrameCurGray } { 1 } ifelse } { FrameSepIs FMblack eq {FrameCurGray 1.0 exch sub mul 1.0 exch sub 4 1 roll pop pop pop} { FrameSepIs FMyellow eq {pop FrameCurGray 1.0 exch sub mul 1.0 exch sub 3 1 roll pop pop} { FrameSepIs FMmagenta eq {pop pop FrameCurGray 1.0 exch sub mul 1.0 exch sub exch pop } { FrameSepIs FMcyan eq {pop pop pop FrameCurGray 1.0 exch sub mul 1.0 exch sub } {pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse } ifelse graymode FMLevel1 or not { [/Pattern [/DeviceGray]] setcolorspace FrameCurPat setcolor } { graymode not FMLevel1 and { dup 1 lt {pop FrameCurGray} if } if RealSetgray } ifelse } ifelse } bind def /savematrix { orgmatrix currentmatrix pop } bind def /restorematrix { orgmatrix setmatrix } bind def /dmatrix matrix def /dpi 72 0 dmatrix defaultmatrix dtransform dup mul exch dup mul add sqrt def /freq dpi dup 72 div round dup 0 eq {pop 1} if 8 mul div def /sangle 1 0 dmatrix defaultmatrix dtransform exch atan def /dpiranges [ 2540 2400 1693 1270 1200 635 600 0 ] def /CMLowFreqs [ 100.402 94.8683 89.2289 100.402 94.8683 66.9349 63.2456 47.4342 ] def /YLowFreqs [ 95.25 90.0 84.65 95.25 90.0 70.5556 66.6667 50.0 ] def /KLowFreqs [ 89.8026 84.8528 79.8088 89.8026 84.8528 74.8355 70.7107 53.033 ] def /CLowAngles [ 71.5651 71.5651 71.5651 71.5651 71.5651 71.5651 71.5651 71.5651 ] def /MLowAngles [ 18.4349 18.4349 18.4349 18.4349 18.4349 18.4349 18.4349 18.4349 ] def /YLowTDot [ true true false true true false false false ] def /CMHighFreqs [ 133.87 126.491 133.843 108.503 102.523 100.402 94.8683 63.2456 ] def /YHighFreqs [ 127.0 120.0 126.975 115.455 109.091 95.25 90.0 60.0 ] def /KHighFreqs [ 119.737 113.137 119.713 128.289 121.218 89.8026 84.8528 63.6395 ] def /CHighAngles [ 71.5651 71.5651 71.5651 70.0169 70.0169 71.5651 71.5651 71.5651 ] def /MHighAngles [ 18.4349 18.4349 18.4349 19.9831 19.9831 18.4349 18.4349 18.4349 ] def /YHighTDot [ false false true false false true true false ] def /PatFreq [ 10.5833 10.0 9.4055 10.5833 10.0 10.5833 10.0 9.375 ] def /screenIndex { 0 1 dpiranges length 1 sub { dup dpiranges exch get 1 sub dpi le {exit} {pop} ifelse } for } bind def /getCyanScreen { FMUseHighFrequencyScreens { CHighAngles CMHighFreqs} {CLowAngles CMLowFreqs} ifelse screenIndex dup 3 1 roll get 3 1 roll get /FMSpotFunction load } bind def /getMagentaScreen { FMUseHighFrequencyScreens { MHighAngles CMHighFreqs } {MLowAngles CMLowFreqs} ifelse screenIndex dup 3 1 roll get 3 1 roll get /FMSpotFunction load } bind def /getYellowScreen { FMUseHighFrequencyScreens { YHighTDot YHighFreqs} { YLowTDot YLowFreqs } ifelse screenIndex dup 3 1 roll get 3 1 roll get { 3 div {2 { 1 add 2 div 3 mul dup floor sub 2 mul 1 sub exch} repeat FMSpotFunction } } {/FMSpotFunction load } ifelse 0.0 exch } bind def /getBlackScreen { FMUseHighFrequencyScreens { KHighFreqs } { KLowFreqs } ifelse screenIndex get 45.0 /FMSpotFunction load } bind def /getSpotScreen { getBlackScreen } bind def /getCompositeScreen { getBlackScreen } bind def /FMSetScreen FMLevel1 { /setscreen load }{ { 8 dict begin /HalftoneType 1 def /SpotFunction exch def /Angle exch def /Frequency exch def /AccurateScreens FMUseAcccurateScreens def currentdict end sethalftone } bind } ifelse def /setDefaultScreen { FMPColor { orgrxfer cvx orggxfer cvx orgbxfer cvx orgxfer cvx setcolortransfer } { orgxfer cvx settransfer } ifelse orgfreq organgle orgproc cvx setscreen } bind def /setCurrentScreen { FrameSepIs FMnone eq { FMUseDefaultNoSeparationScreen { setDefaultScreen } { getCompositeScreen FMSetScreen } ifelse } { FrameSepIs FMcustom eq { FMUseDefaultSpotSeparationScreen { setDefaultScreen } { getSpotScreen FMSetScreen } ifelse } { FMUseDefaultProcessSeparationScreen { setDefaultScreen } { FrameSepIs FMcyan eq { getCyanScreen FMSetScreen } { FrameSepIs FMmagenta eq { getMagentaScreen FMSetScreen } { FrameSepIs FMyellow eq { getYellowScreen FMSetScreen } { getBlackScreen FMSetScreen } ifelse } ifelse } ifelse } ifelse } ifelse } ifelse } bind def end /gstring FMLOCAL /gfile FMLOCAL /gindex FMLOCAL /orgrxfer FMLOCAL /orggxfer FMLOCAL /orgbxfer FMLOCAL /orgxfer FMLOCAL /orgproc FMLOCAL /orgrproc FMLOCAL /orggproc FMLOCAL /orgbproc FMLOCAL /organgle FMLOCAL /orgrangle FMLOCAL /orggangle FMLOCAL /orgbangle FMLOCAL /orgfreq FMLOCAL /orgrfreq FMLOCAL /orggfreq FMLOCAL /orgbfreq FMLOCAL /yscale FMLOCAL /xscale FMLOCAL /edown FMLOCAL /manualfeed FMLOCAL /paperheight FMLOCAL /paperwidth FMLOCAL /FMDOCUMENT { array /FMfonts exch def /#copies exch def FrameDict begin 0 ne /manualfeed exch def /paperheight exch def /paperwidth exch def 0 ne /FrameNegative exch def 0 ne /edown exch def /yscale exch def /xscale exch def FMLevel1 { manualfeed {setmanualfeed} if /FMdicttop countdictstack 1 add def /FMoptop count def setpapername manualfeed {true} {papersize} ifelse {manualpapersize} {false} ifelse {desperatepapersize} {false} ifelse { (Can't select requested paper size for Frame print job!) FMFAILURE } if count -1 FMoptop {pop pop} for countdictstack -1 FMdicttop {pop end} for } {{1 dict dup /PageSize [paperwidth paperheight]put setpagedevice}stopped { (Can't select requested paper size for Frame print job!) FMFAILURE } if {1 dict dup /ManualFeed manualfeed put setpagedevice } stopped pop } ifelse FMPColor { currentcolorscreen cvlit /orgproc exch def /organgle exch def /orgfreq exch def cvlit /orgbproc exch def /orgbangle exch def /orgbfreq exch def cvlit /orggproc exch def /orggangle exch def /orggfreq exch def cvlit /orgrproc exch def /orgrangle exch def /orgrfreq exch def currentcolortransfer FrameNegative { 1 1 4 { pop { 1 exch sub } concatprocs 4 1 roll } for 4 copy setcolortransfer } if cvlit /orgxfer exch def cvlit /orgbxfer exch def cvlit /orggxfer exch def cvlit /orgrxfer exch def } { currentscreen cvlit /orgproc exch def /organgle exch def /orgfreq exch def currenttransfer FrameNegative { { 1 exch sub } concatprocs dup settransfer } if cvlit /orgxfer exch def } ifelse end } def /pagesave FMLOCAL /orgmatrix FMLOCAL /landscape FMLOCAL /pwid FMLOCAL /FMBEGINPAGE { FrameDict begin /pagesave save def 3.86 setmiterlimit /landscape exch 0 ne def landscape { 90 rotate 0 exch dup /pwid exch def neg translate pop }{ pop /pwid exch def } ifelse edown { [-1 0 0 1 pwid 0] concat } if 0 0 moveto paperwidth 0 lineto paperwidth paperheight lineto 0 paperheight lineto 0 0 lineto 1 setgray fill xscale yscale scale /orgmatrix matrix def gsave } def /FMENDPAGE { grestore pagesave restore end showpage } def /FMFONTDEFINE { FrameDict begin findfont ReEncode 1 index exch definefont FMfonts 3 1 roll put end } def /FMFILLS { FrameDict begin dup array /fillvals exch def dict /patCache exch def end } def /FMFILL { FrameDict begin fillvals 3 1 roll put end } def /FMNORMALIZEGRAPHICS { newpath 0.0 0.0 moveto 1 setlinewidth 0 setlinecap 0 0 0 sethsbcolor 0 setgray } bind def /fx FMLOCAL /fy FMLOCAL /fh FMLOCAL /fw FMLOCAL /llx FMLOCAL /lly FMLOCAL /urx FMLOCAL /ury FMLOCAL /FMBEGINEPSF { end /FMEPSF save def /showpage {} def % See Adobe's "PostScript Language Reference Manual, 2nd Edition", page 714. % "...the following operators MUST NOT be used in an EPS file:" (emphasis ours) /banddevice {(banddevice) FMBADEPSF} def /clear {(clear) FMBADEPSF} def /cleardictstack {(cleardictstack) FMBADEPSF} def /copypage {(copypage) FMBADEPSF} def /erasepage {(erasepage) FMBADEPSF} def /exitserver {(exitserver) FMBADEPSF} def /framedevice {(framedevice) FMBADEPSF} def /grestoreall {(grestoreall) FMBADEPSF} def /initclip {(initclip) FMBADEPSF} def /initgraphics {(initgraphics) FMBADEPSF} def /initmatrix {(initmatrix) FMBADEPSF} def /quit {(quit) FMBADEPSF} def /renderbands {(renderbands) FMBADEPSF} def /setglobal {(setglobal) FMBADEPSF} def /setpagedevice {(setpagedevice) FMBADEPSF} def /setshared {(setshared) FMBADEPSF} def /startjob {(startjob) FMBADEPSF} def /lettertray {(lettertray) FMBADEPSF} def /letter {(letter) FMBADEPSF} def /lettersmall {(lettersmall) FMBADEPSF} def /11x17tray {(11x17tray) FMBADEPSF} def /11x17 {(11x17) FMBADEPSF} def /ledgertray {(ledgertray) FMBADEPSF} def /ledger {(ledger) FMBADEPSF} def /legaltray {(legaltray) FMBADEPSF} def /legal {(legal) FMBADEPSF} def /statementtray {(statementtray) FMBADEPSF} def /statement {(statement) FMBADEPSF} def /executivetray {(executivetray) FMBADEPSF} def /executive {(executive) FMBADEPSF} def /a3tray {(a3tray) FMBADEPSF} def /a3 {(a3) FMBADEPSF} def /a4tray {(a4tray) FMBADEPSF} def /a4 {(a4) FMBADEPSF} def /a4small {(a4small) FMBADEPSF} def /b4tray {(b4tray) FMBADEPSF} def /b4 {(b4) FMBADEPSF} def /b5tray {(b5tray) FMBADEPSF} def /b5 {(b5) FMBADEPSF} def FMNORMALIZEGRAPHICS [/fy /fx /fh /fw /ury /urx /lly /llx] {exch def} forall fx fw 2 div add fy fh 2 div add translate rotate fw 2 div neg fh 2 div neg translate fw urx llx sub div fh ury lly sub div scale llx neg lly neg translate /FMdicttop countdictstack 1 add def /FMoptop count def } bind def /FMENDEPSF { count -1 FMoptop {pop pop} for countdictstack -1 FMdicttop {pop end} for FMEPSF restore FrameDict begin } bind def FrameDict begin /setmanualfeed { %%BeginFeature *ManualFeed True statusdict /manualfeed true put %%EndFeature } bind def /max {2 copy lt {exch} if pop} bind def /min {2 copy gt {exch} if pop} bind def /inch {72 mul} def /pagedimen { paperheight sub abs 16 lt exch paperwidth sub abs 16 lt and {/papername exch def} {pop} ifelse } bind def /papersizedict FMLOCAL /setpapername { /papersizedict 14 dict def papersizedict begin /papername /unknown def /Letter 8.5 inch 11.0 inch pagedimen /LetterSmall 7.68 inch 10.16 inch pagedimen /Tabloid 11.0 inch 17.0 inch pagedimen /Ledger 17.0 inch 11.0 inch pagedimen /Legal 8.5 inch 14.0 inch pagedimen /Statement 5.5 inch 8.5 inch pagedimen /Executive 7.5 inch 10.0 inch pagedimen /A3 11.69 inch 16.5 inch pagedimen /A4 8.26 inch 11.69 inch pagedimen /A4Small 7.47 inch 10.85 inch pagedimen /B4 10.125 inch 14.33 inch pagedimen /B5 7.16 inch 10.125 inch pagedimen end } bind def /papersize { papersizedict begin /Letter {lettertray letter} def /LetterSmall {lettertray lettersmall} def /Tabloid {11x17tray 11x17} def /Ledger {ledgertray ledger} def /Legal {legaltray legal} def /Statement {statementtray statement} def /Executive {executivetray executive} def /A3 {a3tray a3} def /A4 {a4tray a4} def /A4Small {a4tray a4small} def /B4 {b4tray b4} def /B5 {b5tray b5} def /unknown {unknown} def papersizedict dup papername known {papername} {/unknown} ifelse get end statusdict begin stopped end } bind def /manualpapersize { papersizedict begin /Letter {letter} def /LetterSmall {lettersmall} def /Tabloid {11x17} def /Ledger {ledger} def /Legal {legal} def /Statement {statement} def /Executive {executive} def /A3 {a3} def /A4 {a4} def /A4Small {a4small} def /B4 {b4} def /B5 {b5} def /unknown {unknown} def papersizedict dup papername known {papername} {/unknown} ifelse get end stopped } bind def /desperatepapersize { statusdict /setpageparams known { paperwidth paperheight 0 1 statusdict begin {setpageparams} stopped end } {true} ifelse } bind def /DiacriticEncoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /grave /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /Adieresis /Aring /Ccedilla /Eacute /Ntilde /Odieresis /Udieresis /aacute /agrave /acircumflex /adieresis /atilde /aring /ccedilla /eacute /egrave /ecircumflex /edieresis /iacute /igrave /icircumflex /idieresis /ntilde /oacute /ograve /ocircumflex /odieresis /otilde /uacute /ugrave /ucircumflex /udieresis /dagger /.notdef /cent /sterling /section /bullet /paragraph /germandbls /registered /copyright /trademark /acute /dieresis /.notdef /AE /Oslash /.notdef /.notdef /.notdef /.notdef /yen /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /ordfeminine /ordmasculine /.notdef /ae /oslash /questiondown /exclamdown /logicalnot /.notdef /florin /.notdef /.notdef /guillemotleft /guillemotright /ellipsis /.notdef /Agrave /Atilde /Otilde /OE /oe /endash /emdash /quotedblleft /quotedblright /quoteleft /quoteright /.notdef /.notdef /ydieresis /Ydieresis /fraction /currency /guilsinglleft /guilsinglright /fi /fl /daggerdbl /periodcentered /quotesinglbase /quotedblbase /perthousand /Acircumflex /Ecircumflex /Aacute /Edieresis /Egrave /Iacute /Icircumflex /Idieresis /Igrave /Oacute /Ocircumflex /.notdef /Ograve /Uacute /Ucircumflex /Ugrave /dotlessi /circumflex /tilde /macron /breve /dotaccent /ring /cedilla /hungarumlaut /ogonek /caron ] def /ReEncode { dup length dict begin { 1 index /FID ne {def} {pop pop} ifelse } forall 0 eq {/Encoding DiacriticEncoding def} if currentdict end } bind def FMPColor { /BEGINBITMAPCOLOR { BITMAPCOLOR} def /BEGINBITMAPCOLORc { BITMAPGRAYc} def /BEGINBITMAPTRUECOLOR { BITMAPTRUECOLOR } def /BEGINBITMAPTRUECOLORc { BITMAPTRUECOLORc } def } { /BEGINBITMAPCOLOR { BITMAPGRAY} def /BEGINBITMAPCOLORc { BITMAPGRAYc} def /BEGINBITMAPTRUECOLOR { BITMAPTRUEGRAY } def /BEGINBITMAPTRUECOLORc { BITMAPTRUEGRAYc } def } ifelse /K { FMPrintAllColorsAsBlack { dup 1 eq 2 index 1 eq and 3 index 1 eq and not {7 {pop} repeat 0 0 0 1 0 0 0} if } if FrameCurColors astore pop combineColor } bind def /graymode true def /bwidth FMLOCAL /bpside FMLOCAL /bstring FMLOCAL /onbits FMLOCAL /offbits FMLOCAL /xindex FMLOCAL /yindex FMLOCAL /x FMLOCAL /y FMLOCAL /setPatternMode { FMLevel1 { /bwidth exch def /bpside exch def /bstring exch def /onbits 0 def /offbits 0 def freq sangle landscape {90 add} if {/y exch def /x exch def /xindex x 1 add 2 div bpside mul cvi def /yindex y 1 add 2 div bpside mul cvi def bstring yindex bwidth mul xindex 8 idiv add get 1 7 xindex 8 mod sub bitshift and 0 ne FrameNegative {not} if {/onbits onbits 1 add def 1} {/offbits offbits 1 add def 0} ifelse } setscreen offbits offbits onbits add div FrameNegative {1.0 exch sub} if /FrameCurGray exch def } { pop pop dup patCache exch known { patCache exch get } { dup patDict /bstring 3 -1 roll put patDict 9 PatFreq screenIndex get div dup matrix scale makepattern dup patCache 4 -1 roll 3 -1 roll put } ifelse /FrameCurGray 0 def /FrameCurPat exch def } ifelse /graymode false def combineColor } bind def /setGrayScaleMode { graymode not { /graymode true def FMLevel1 { setCurrentScreen } if } if /FrameCurGray exch def combineColor } bind def /normalize { transform round exch round exch itransform } bind def /dnormalize { dtransform round exch round exch idtransform } bind def /lnormalize { 0 dtransform exch cvi 2 idiv 2 mul 1 add exch idtransform pop } bind def /H { lnormalize setlinewidth } bind def /Z { setlinecap } bind def /PFill { graymode FMLevel1 or not { gsave 1 setgray eofill grestore } if } bind def /PStroke { graymode FMLevel1 or not { gsave 1 setgray stroke grestore } if stroke } bind def /fillvals FMLOCAL /X { fillvals exch get dup type /stringtype eq {8 1 setPatternMode} {setGrayScaleMode} ifelse } bind def /V { PFill gsave eofill grestore } bind def /Vclip { clip } bind def /Vstrk { currentlinewidth exch setlinewidth PStroke setlinewidth } bind def /N { PStroke } bind def /Nclip { strokepath clip newpath } bind def /Nstrk { currentlinewidth exch setlinewidth PStroke setlinewidth } bind def /M {newpath moveto} bind def /E {lineto} bind def /D {curveto} bind def /O {closepath} bind def /n FMLOCAL /L { /n exch def newpath normalize moveto 2 1 n {pop normalize lineto} for } bind def /Y { L closepath } bind def /x1 FMLOCAL /x2 FMLOCAL /y1 FMLOCAL /y2 FMLOCAL /R { /y2 exch def /x2 exch def /y1 exch def /x1 exch def x1 y1 x2 y1 x2 y2 x1 y2 4 Y } bind def /rad FMLOCAL /rarc {rad arcto } bind def /RR { /rad exch def normalize /y2 exch def /x2 exch def normalize /y1 exch def /x1 exch def mark newpath { x1 y1 rad add moveto x1 y2 x2 y2 rarc x2 y2 x2 y1 rarc x2 y1 x1 y1 rarc x1 y1 x1 y2 rarc closepath } stopped {x1 y1 x2 y2 R} if cleartomark } bind def /RRR { /rad exch def normalize /y4 exch def /x4 exch def normalize /y3 exch def /x3 exch def normalize /y2 exch def /x2 exch def normalize /y1 exch def /x1 exch def newpath normalize moveto mark { x2 y2 x3 y3 rarc x3 y3 x4 y4 rarc x4 y4 x1 y1 rarc x1 y1 x2 y2 rarc closepath } stopped {x1 y1 x2 y2 x3 y3 x4 y4 newpath moveto lineto lineto lineto closepath} if cleartomark } bind def /C { grestore gsave R clip setCurrentScreen } bind def /CP { grestore gsave Y clip setCurrentScreen } bind def /FMpointsize FMLOCAL /F { FMfonts exch get FMpointsize scalefont setfont } bind def /Q { /FMpointsize exch def F } bind def /T { moveto show } bind def /RF { rotate 0 ne {-1 1 scale} if } bind def /TF { gsave moveto RF show grestore } bind def /P { moveto 0 32 3 2 roll widthshow } bind def /PF { gsave moveto RF 0 32 3 2 roll widthshow grestore } bind def /S { moveto 0 exch ashow } bind def /SF { gsave moveto RF 0 exch ashow grestore } bind def /B { moveto 0 32 4 2 roll 0 exch awidthshow } bind def /BF { gsave moveto RF 0 32 4 2 roll 0 exch awidthshow grestore } bind def /G { gsave newpath normalize translate 0.0 0.0 moveto dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath PFill fill grestore } bind def /Gstrk { savematrix newpath 2 index 2 div add exch 3 index 2 div sub exch normalize 2 index 2 div sub exch 3 index 2 div add exch translate scale 0.0 0.0 1.0 5 3 roll arc restorematrix currentlinewidth exch setlinewidth PStroke setlinewidth } bind def /Gclip { newpath savematrix normalize translate 0.0 0.0 moveto dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath clip newpath restorematrix } bind def /GG { gsave newpath normalize translate 0.0 0.0 moveto rotate dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath PFill fill grestore } bind def /GGclip { savematrix newpath normalize translate 0.0 0.0 moveto rotate dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath clip newpath restorematrix } bind def /GGstrk { savematrix newpath normalize translate 0.0 0.0 moveto rotate dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath restorematrix currentlinewidth exch setlinewidth PStroke setlinewidth } bind def /A { gsave savematrix newpath 2 index 2 div add exch 3 index 2 div sub exch normalize 2 index 2 div sub exch 3 index 2 div add exch translate scale 0.0 0.0 1.0 5 3 roll arc restorematrix PStroke grestore } bind def /Aclip { newpath savematrix normalize translate 0.0 0.0 moveto dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath strokepath clip newpath restorematrix } bind def /Astrk { Gstrk } bind def /AA { gsave savematrix newpath 3 index 2 div add exch 4 index 2 div sub exch normalize 3 index 2 div sub exch 4 index 2 div add exch translate rotate scale 0.0 0.0 1.0 5 3 roll arc restorematrix PStroke grestore } bind def /AAclip { savematrix newpath normalize translate 0.0 0.0 moveto rotate dnormalize scale 0.0 0.0 1.0 5 3 roll arc closepath strokepath clip newpath restorematrix } bind def /AAstrk { GGstrk } bind def /x FMLOCAL /y FMLOCAL /w FMLOCAL /h FMLOCAL /xx FMLOCAL /yy FMLOCAL /ww FMLOCAL /hh FMLOCAL /FMsaveobject FMLOCAL /FMoptop FMLOCAL /FMdicttop FMLOCAL /BEGINPRINTCODE { /FMdicttop countdictstack 1 add def /FMoptop count 7 sub def /FMsaveobject save def userdict begin /showpage {} def FMNORMALIZEGRAPHICS 3 index neg 3 index neg translate } bind def /ENDPRINTCODE { count -1 FMoptop {pop pop} for countdictstack -1 FMdicttop {pop end} for FMsaveobject restore } bind def /gn { 0 { 46 mul cf read pop 32 sub dup 46 lt {exit} if 46 sub add } loop add } bind def /str FMLOCAL /cfs { /str sl string def 0 1 sl 1 sub {str exch val put} for str def } bind def /ic [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223 0 {0 hx} {1 hx} {2 hx} {3 hx} {4 hx} {5 hx} {6 hx} {7 hx} {8 hx} {9 hx} {10 hx} {11 hx} {12 hx} {13 hx} {14 hx} {15 hx} {16 hx} {17 hx} {18 hx} {19 hx} {gn hx} {0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {gn} {0 wh} {1 wh} {2 wh} {3 wh} {4 wh} {5 wh} {6 wh} {7 wh} {8 wh} {9 wh} {10 wh} {11 wh} {12 wh} {13 wh} {14 wh} {gn wh} {0 bl} {1 bl} {2 bl} {3 bl} {4 bl} {5 bl} {6 bl} {7 bl} {8 bl} {9 bl} {10 bl} {11 bl} {12 bl} {13 bl} {14 bl} {gn bl} {0 fl} {1 fl} {2 fl} {3 fl} {4 fl} {5 fl} {6 fl} {7 fl} {8 fl} {9 fl} {10 fl} {11 fl} {12 fl} {13 fl} {14 fl} {gn fl} ] def /sl FMLOCAL /val FMLOCAL /ws FMLOCAL /im FMLOCAL /bs FMLOCAL /cs FMLOCAL /len FMLOCAL /pos FMLOCAL /ms { /sl exch def /val 255 def /ws cfs /im cfs /val 0 def /bs cfs /cs cfs } bind def 400 ms /ip { is 0 cf cs readline pop { ic exch get exec add } forall pop } bind def /rip { bis ris copy pop is 0 cf cs readline pop { ic exch get exec add } forall pop pop ris gis copy pop dup is exch cf cs readline pop { ic exch get exec add } forall pop pop gis bis copy pop dup add is exch cf cs readline pop { ic exch get exec add } forall pop } bind def /wh { /len exch def /pos exch def ws 0 len getinterval im pos len getinterval copy pop pos len } bind def /bl { /len exch def /pos exch def bs 0 len getinterval im pos len getinterval copy pop pos len } bind def /s1 1 string def /fl { /len exch def /pos exch def /val cf s1 readhexstring pop 0 get def pos 1 pos len add 1 sub {im exch val put} for pos len } bind def /hx { 3 copy getinterval cf exch readhexstring pop pop } bind def /h FMLOCAL /w FMLOCAL /d FMLOCAL /lb FMLOCAL /bitmapsave FMLOCAL /is FMLOCAL /cf FMLOCAL /wbytes { dup dup 24 eq { pop pop 3 mul } { 8 eq {pop} {1 eq {7 add 8 idiv} {3 add 4 idiv} ifelse} ifelse } ifelse } bind def /BEGINBITMAPBWc { 1 {} COMMONBITMAPc } bind def /BEGINBITMAPGRAYc { 8 {} COMMONBITMAPc } bind def /BEGINBITMAP2BITc { 2 {} COMMONBITMAPc } bind def /COMMONBITMAPc { /r exch def /d exch def gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /lb w d wbytes def sl lb lt {lb ms} if /bitmapsave save def r /is im 0 lb getinterval def ws 0 lb getinterval is copy pop /cf currentfile def w h d [w 0 0 h neg 0 h] {ip} image bitmapsave restore grestore } bind def /BEGINBITMAPBW { 1 {} COMMONBITMAP } bind def /BEGINBITMAPGRAY { 8 {} COMMONBITMAP } bind def /BEGINBITMAP2BIT { 2 {} COMMONBITMAP } bind def /COMMONBITMAP { /r exch def /d exch def gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /bitmapsave save def r /is w d wbytes string def /cf currentfile def w h d [w 0 0 h neg 0 h] {cf is readhexstring pop} image bitmapsave restore grestore } bind def /ngrayt 256 array def /nredt 256 array def /nbluet 256 array def /ngreent 256 array def /gryt FMLOCAL /blut FMLOCAL /grnt FMLOCAL /redt FMLOCAL /indx FMLOCAL /cynu FMLOCAL /magu FMLOCAL /yelu FMLOCAL /k FMLOCAL /u FMLOCAL FMLevel1 { /colorsetup { currentcolortransfer /gryt exch def /blut exch def /grnt exch def /redt exch def 0 1 255 { /indx exch def /cynu 1 red indx get 255 div sub def /magu 1 green indx get 255 div sub def /yelu 1 blue indx get 255 div sub def /k cynu magu min yelu min def /u k currentundercolorremoval exec def % /u 0 def nredt indx 1 0 cynu u sub max sub redt exec put ngreent indx 1 0 magu u sub max sub grnt exec put nbluet indx 1 0 yelu u sub max sub blut exec put ngrayt indx 1 k currentblackgeneration exec sub gryt exec put } for {255 mul cvi nredt exch get} {255 mul cvi ngreent exch get} {255 mul cvi nbluet exch get} {255 mul cvi ngrayt exch get} setcolortransfer {pop 0} setundercolorremoval {} setblackgeneration } bind def } { /colorSetup2 { [ /Indexed /DeviceRGB 255 {dup red exch get 255 div exch dup green exch get 255 div exch blue exch get 255 div} ] setcolorspace } bind def } ifelse /tran FMLOCAL /fakecolorsetup { /tran 256 string def 0 1 255 {/indx exch def tran indx red indx get 77 mul green indx get 151 mul blue indx get 28 mul add add 256 idiv put} for currenttransfer {255 mul cvi tran exch get 255.0 div} exch concatprocs settransfer } bind def /BITMAPCOLOR { /d 8 def gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /bitmapsave save def FMLevel1 { colorsetup /is w d wbytes string def /cf currentfile def w h d [w 0 0 h neg 0 h] {cf is readhexstring pop} {is} {is} true 3 colorimage } { colorSetup2 /is w d wbytes string def /cf currentfile def 7 dict dup begin /ImageType 1 def /Width w def /Height h def /ImageMatrix [w 0 0 h neg 0 h] def /DataSource {cf is readhexstring pop} bind def /BitsPerComponent d def /Decode [0 255] def end image } ifelse bitmapsave restore grestore } bind def /BITMAPCOLORc { /d 8 def gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /lb w d wbytes def sl lb lt {lb ms} if /bitmapsave save def FMLevel1 { colorsetup /is im 0 lb getinterval def ws 0 lb getinterval is copy pop /cf currentfile def w h d [w 0 0 h neg 0 h] {ip} {is} {is} true 3 colorimage } { colorSetup2 /is im 0 lb getinterval def ws 0 lb getinterval is copy pop /cf currentfile def 7 dict dup begin /ImageType 1 def /Width w def /Height h def /ImageMatrix [w 0 0 h neg 0 h] def /DataSource {ip} bind def /BitsPerComponent d def /Decode [0 255] def end image } ifelse bitmapsave restore grestore } bind def /BITMAPTRUECOLORc { /d 24 def gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /lb w d wbytes def sl lb lt {lb ms} if /bitmapsave save def /is im 0 lb getinterval def /ris im 0 w getinterval def /gis im w w getinterval def /bis im w 2 mul w getinterval def ws 0 lb getinterval is copy pop /cf currentfile def w h 8 [w 0 0 h neg 0 h] {w rip pop ris} {gis} {bis} true 3 colorimage bitmapsave restore grestore } bind def /BITMAPTRUECOLOR { gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /bitmapsave save def /is w string def /gis w string def /bis w string def /cf currentfile def w h 8 [w 0 0 h neg 0 h] { cf is readhexstring pop } { cf gis readhexstring pop } { cf bis readhexstring pop } true 3 colorimage bitmapsave restore grestore } bind def /BITMAPTRUEGRAYc { /d 24 def gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /lb w d wbytes def sl lb lt {lb ms} if /bitmapsave save def /is im 0 lb getinterval def /ris im 0 w getinterval def /gis im w w getinterval def /bis im w 2 mul w getinterval def ws 0 lb getinterval is copy pop /cf currentfile def w h 8 [w 0 0 h neg 0 h] {w rip pop ris gis bis w gray} image bitmapsave restore grestore } bind def /ww FMLOCAL /r FMLOCAL /g FMLOCAL /b FMLOCAL /i FMLOCAL /gray { /ww exch def /b exch def /g exch def /r exch def 0 1 ww 1 sub { /i exch def r i get .299 mul g i get .587 mul b i get .114 mul add add r i 3 -1 roll floor cvi put } for r } bind def /BITMAPTRUEGRAY { gsave 3 index 2 div add exch 4 index 2 div add exch translate rotate 1 index 2 div neg 1 index 2 div neg translate scale /h exch def /w exch def /bitmapsave save def /is w string def /gis w string def /bis w string def /cf currentfile def w h 8 [w 0 0 h neg 0 h] { cf is readhexstring pop cf gis readhexstring pop cf bis readhexstring pop w gray} image bitmapsave restore grestore } bind def /BITMAPGRAY { 8 {fakecolorsetup} COMMONBITMAP } bind def /BITMAPGRAYc { 8 {fakecolorsetup} COMMONBITMAPc } bind def /ENDBITMAP { } bind def end /ALDsave FMLOCAL /ALDmatrix matrix def ALDmatrix currentmatrix pop /StartALD { /ALDsave save def savematrix ALDmatrix setmatrix } bind def /InALD { restorematrix } bind def /DoneALD { ALDsave restore } bind def /I { setdash } bind def /J { [] 0 setdash } bind def %%EndProlog %%BeginSetup (4.0) FMVERSION 1 1 0 0 612 792 0 1 10 FMDOCUMENT 0 0 /Times-Bold FMFONTDEFINE 1 0 /Times-Roman FMFONTDEFINE 2 0 /Times-BoldItalic FMFONTDEFINE 3 0 /Times-Italic FMFONTDEFINE 4 0 /Courier FMFONTDEFINE 5 0 /Courier-Bold FMFONTDEFINE 32 FMFILLS 0 0 FMFILL 1 0.1 FMFILL 2 0.3 FMFILL 3 0.5 FMFILL 4 0.7 FMFILL 5 0.9 FMFILL 6 0.97 FMFILL 7 1 FMFILL 8 <0f1e3c78f0e1c387> FMFILL 9 <0f87c3e1f0783c1e> FMFILL 10 FMFILL 11 FMFILL 12 <8142241818244281> FMFILL 13 <03060c183060c081> FMFILL 14 <8040201008040201> FMFILL 16 1 FMFILL 17 0.9 FMFILL 18 0.7 FMFILL 19 0.5 FMFILL 20 0.3 FMFILL 21 0.1 FMFILL 22 0.03 FMFILL 23 0 FMFILL 24 FMFILL 25 FMFILL 26 <3333333333333333> FMFILL 27 <0000ffff0000ffff> FMFILL 28 <7ebddbe7e7dbbd7e> FMFILL 29 FMFILL 30 <7fbfdfeff7fbfdfe> FMFILL %%EndSetup %%Page: "1" 1 %%BeginPaperSize: Letter %%EndPaperSize 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 7 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K J 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 12 Q 0 X 0 0 0 1 0 0 0 K (Intr) 151.94 469 T (oduction) 172.39 469 T 1 10 Q (T) 72 450.33 T (ypically) 77.41 450.33 T (, T) 108.98 450.33 T (cl/Tk application development leads to the) 119.39 450.33 T (redundant creation of widget combination patterns) 72 438.33 T (which can be singled out for replacement with higher) 72 426.33 T (level abstractions. For example, a label is usually asso-) 72 414.33 T (ciated with an entry widget, listboxes frequently have) 72 402.33 T (attached scrollbars, and dialogs require buttons and) 72 390.33 T (modality) 72 378.33 T (. This is due to the simplicity of the Tk widget) 106.91 378.33 T (set. Seasoned developers commonly package this code,) 72 366.33 T (attempting to create a composite widget in a set of pro-) 72 354.33 T (cedures which allows for consistent creation of the wid-) 72 342.33 T (get combination. This may provide centralization of) 72 330.33 T (logic, but the procedures lack the encapsulation of a) 72 318.33 T (pure widget and end up \337ooding global name space. At) 72 306.33 T (this point, some developers may resort to C code.) 72 294.33 T (What was really needed was the ability to combine Tk) 72 270.33 T (widgets together into abstract building blocks called) 72 258.33 T (\322Mega-W) 72 246.33 T (idgets\323 at the VHLL layer) 111.58 246.33 T (. The [incr T) 215.45 246.33 T (cl] [1]) 265.29 246.33 T (and [incr Tk] [2] extensions provide this capability) 72 234.33 T (,) 274.93 234.33 T (allowing mega-widget development in an object-ori-) 72 222.33 T (ented paradigm using T) 72 210.33 T (cl/Tk rather than C. The next) 166.01 210.33 T (step was to build a mega-widget set in these extensions) 72 198.33 T (which replaces the redundant widget combination pat-) 72 186.33 T -0.1 (terns and provides a foundation for future development.) 72 174.33 P ([incr W) 72 162.33 T (idgets] is one such extension.) 102.42 162.33 T ([incr W) 72 144.33 T (idgets] is an object-oriented, extensible set of) 102.42 144.33 T -0.6 (mega-widgets, delivering many general purpose widgets) 72 132.33 P (such as option menus, selection boxes, and dialogs) 72 120.33 T (whose counterparts are found in Motif. Since [incr W) 72 108.33 T (id-) 285.72 108.33 T (gets] is based on [incr Tk], the Tk framework of con\336g-) 72 96.33 T (uration options and widget commands is maintained. In) 72 84.33 T (other words, they look, act, and feel like Tk widgets.) 315 470.33 T ([incr W) 315 458.33 T (idgets] blends with the standard Tk widgets,) 345.42 458.33 T -0.28 (raising the level of programming and making it easier to) 315 446.33 P (consistently develop well styled applications.) 315 434.33 T (The idea of extending the basic Tk widget set is not) 315 410.33 T (original. Other mega-widget extensions exist such as) 315 398.33 T (T) 315 386.33 T (ix [3] and itcl-widgets [4]. V) 320.76 386.33 T (isually) 435.14 386.33 T (, [incr W) 461.16 386.33 T (idgets]) 496.58 386.33 T -0.03 (covers some of the same ground, successfully replacing) 315 374.33 P (many of the same typical combinations. [incr W) 315 362.33 T (idgets]) 507.35 362.33 T (dif) 315 350.33 T (fers in the degree of its reusability) 325.93 350.33 T (, extensibility) 461.92 350.33 T (, \337ex-) 515.72 350.33 T (ibility) 315 338.33 T (, and adherence to the Motif style guide.) 338.25 338.33 T (The [incr W) 315 314.33 T (idgets] mega-widget set is also distin-) 363.47 314.33 T (guished by its consistent use of style, built-in intelli-) 315 302.33 T (gence, high degree of \337exibility) 315 290.33 T (, ease of extending base) 441.83 290.33 T (level functionality) 315 278.33 T (, and its object-oriented implementa-) 387.4 278.33 T (tion. Its use has resulted in increased productivity) 315 266.33 T (, reli-) 512.66 266.33 T (ability) 315 254.33 T (, and style guide adherence. This paper) 339.91 254.33 T (concentrates on these unique aspects of the widget set) 315 242.33 T (and the presentation of its innovative concepts. A picto-) 315 230.33 T (rial tour with sample code segments will be given as an) 315 218.33 T (appendix.) 315 206.33 T 0 12 Q (Mega-W) 390.28 175 T (idgets) 434.72 175 T 1 10 Q (Mega-widgets has been a hot topic within the T) 315 150.33 T (cl/Tk) 504.83 150.33 T (community) 315 138.33 T (. The discussion centers on the bene\336ts,) 359.91 138.33 T (frameworks, mechanisms, and implementation tech-) 315 126.33 T (niques. It was McLennan [1] who originally coined the) 315 114.33 T (term in his work with [incr T) 315 102.33 T (cl], expanding on the con-) 430.4 102.33 T (cept with [incr Tk]. He proposes that mega-widgets) 315 90.33 T (should seamlessly extend the Tk widget set. They) 315 78.33 T 72 495 540 720 R 7 X V 0 14 Q 0 X ([incr W) 263.16 710.67 T (idgets]) 309.18 710.67 T (An Object Oriented Mega-W) 192.98 692.67 T (idget Set) 367.31 692.67 T 2 9 Q (Revised 10/31/95 - Originally present at USENIX T) 176.36 678 T (cl/Tk W) 365.8 678 T (orkshop 95) 394.38 678 T 1 12 Q (Mark L. Ulferts) 268.18 652 T 3 10 Q (DSC Communications Corporation) 235.16 637.33 T (mulferts@spd.dsccc.com) 256.13 623.33 T (http://www) 242.19 609.33 T (.wn.com/biz/iwidgets) 285.91 609.33 T 0 12 Q (Abstract) 283.67 576 T 3 10 Q (The intr) 72 551.33 T (oduction of [incr T) 103.58 551.33 T (cl] and [incr Tk] allows an object oriented appr) 178.5 551.33 T (oach to Tk widget construction. \322Mega-) 370.91 551.33 T (widgets\323 developed in these extensions seamlessly expand the Tk base widget set. Each of these object-oriented wid-) 72 539.33 T -0.03 (gets may themselves be extended, using either inheritance or composition. This paper pr) 72 527.33 P -0.03 (esents one such general pur-) 425.14 527.33 P (pose hierar) 72 515.33 T (chy called [incr W) 117.46 515.33 T (idgets] which maintains the Motif look-and-feel and establishes several new concepts,) 191.06 515.33 T (including extensible child sites and \337exible lar) 72 503.33 T (ge scale component con\336guration.) 257.73 503.33 T FMENDPAGE %%EndPage: "1" 1 %%Page: "2" 2 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 7 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 1 10 Q 0 X 0 0 0 1 0 0 0 K (should behave like standard Tk widgets, but are com-) 72 713.33 T (posed of many Tk widgets and possibly other mega-) 72 701.33 T (widgets as components. The implementation must) 72 689.33 T (ensure that users notice no signi\336cant dif) 72 677.33 T (ferences. Stan-) 235.69 677.33 T (dard commands such as \324con\336gure\325 and \324cget\325 must) 72 665.33 T (exist and options should be propagated to all compo-) 72 653.33 T (nents. Thus, con\336guration of a mega-widgets \322-back-) 72 641.33 T (ground\323 or \322-relief\323 option should have the expected) 72 629.33 T (results on its components.) 72 617.33 T -0.15 (The [incr T) 72 593.33 P -0.15 (cl] and [incr Tk] extensions fully address the) 116.55 593.33 P (issues of framework and mechanism for mega-widget) 72 581.33 T (production. They have established themselves as the) 72 569.33 T (defacto standard object-oriented extensions and have) 72 557.33 T (been chosen to provide the backbone for the [incr W) 72 545.33 T (id-) 281.82 545.33 T (gets] set. Using these extensions, each mega-widget) 72 533.33 T (becomes a \322class\323, de\336ning a unique type of widget) 72 521.33 T (object in a separate namespace. This ensures that data) 72 509.33 T (and commands associated with an object are encapsu-) 72 497.33 T (lated, eliminating global name space pollution.) 72 485.33 T 0 12 Q (Example) 161.83 454 T 1 10 Q -0.24 (At this point, an example of mega-widget usage can pro-) 72 429.33 P (vide a taste of [incr W) 72 417.33 T (idgets] capabilities and illustrate) 160.74 417.33 T (the bene\336ts. The example centers around the construc-) 72 405.33 T -0.17 (tion of a typical login screen which prompts the user for) 72 393.33 P (user name and password. New requirements will be) 72 381.33 T -0.03 (incremental, leading to the development of a new mega-) 72 369.33 P (widget which is implemented as an extension of an) 72 357.33 T (existing one.) 72 345.33 T -0.3 (A primitive login screen is composed of two \336elds, each) 72 321.33 P (having a label and entry widget. The T) 72 309.33 T (cl/Tk code) 226.27 309.33 T (required is shown in Figure 1. [incr W) 72 297.33 T (idgets] provides) 224.91 297.33 T (an Entry\336eld class which replaces this standard widget) 72 285.33 T (combination. This is shown in Figure 2. At this point,) 72 273.33 T (mega-widget usage is mostly a matter of convenience) 72 261.33 T (and minor savings in code, yet with a few additional) 72 249.33 T (requirements the bene\336ts begin to escalate.) 72 237.33 T (Now let\325) 72 213.33 T (s add new requirements which might be) 106.72 213.33 T (required for a normal login screen. First, the labels) 72 201.33 T (should be left aligned. Next, the user \336eld width should) 72 189.33 T (be limited to a maximum of 10 characters with input) 72 177.33 T (restricted to alphabetic characters and illegal character) 72 165.33 T (entry ringing the bell. As for the password, input must) 72 153.33 T -0.05 (be masked and the return key should invoke a login pro-) 72 141.33 P (cedure. W) 72 129.33 T (e\325ll also present a more aesthetic interface by) 112.29 129.33 T (varying the textual background in the mega-widget.) 72 117.33 T (Since this last requirement applies to both Entry\336elds,) 72 105.33 T -0.03 (the option database will be used. Figure 3 illustrates the) 72 93.33 P -0.48 (code needed to implement these new requirements using) 72 81.33 P ([incr W) 315 200.33 T (idgets]. Even without the presentation of com-) 345.42 200.33 T -0.18 (parative straight T) 315 188.33 P -0.18 (cl/Tk code, its safe to say that the ben-) 387.27 188.33 P (e\336ts have increased.) 315 176.33 T (This example gives just a sampling of the label control) 315 152.33 T (capabilities built into those classes based on the) 315 140.33 T (Labeledwidget class such as the Entry\336eld mega-wid-) 315 128.33 T -0.18 (get. The label\325) 315 116.33 P -0.18 (s position relative to its associated widget) 372.12 116.33 P -0.04 (may be speci\336ed using standard directions: nw) 315 104.33 P -0.04 (, n, ne, e,) 501.29 104.33 P -0.4 (se, s, sw) 315 92.33 P -0.4 (, and w) 346.88 92.33 P -0.4 (. The label need not be limited to text, the) 374.58 92.33 P (class supports both bitmaps and images as well. A mar-) 315 80.33 T 315 207 540 720 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 315 243 540 360 R 7 X 0 0 0 1 0 0 0 K V 0.5 H 2 Z 0 X N 315 396 540 720 R 7 X V 0 X N %%BeginBinary: 6824 251 117 129.09 60.17 0 365.92 648 /red < 72FFFFFFFFFFFFFFFFFFFFFFFFFF66F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080 8080808080808080808080808080808080808080404040404040404040404040 4040404040404040404040000000000000000000000000000000000039C069DD 00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A EFD39765E1A36FE700FF5500557FB22EB099FFFFB07AFFCC0087AFB4CD73E6A2 4DBF88F558D7439D50D080C0C080C0808060C000FFA000FFBE8BD28BD9B3FF72 20C0A040C040D060F0E010B499A0FF0019BF2FFF6223852F465F4770FF0000FF > store /green < 9F0000000000000000000000000099DEFFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B59765E1A36FE700FF1A006B7FB28B3099FFFFB094FFF700CEEEEE0073E6A2 4DBF88F558D74DB38080C0C080C080808060C08000A08040BE5BB477D9B3FF77 2070A0402040D0F0F0E010B489A0E4FF19264F00B641DE4F829E4780FF0000FF > store /blue < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B59765E1A36FE7BFCC8BEE2F7FB257606BFBB3B015322480FAEEB40073E6A2 4DBF88F558D756CAD050C080C08080C08060C080FF000040BE7A8C65D9B3E085 2070C0802040D06050E010B476A0C40070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7R4F6F76F6F7J" S3F78z8z8z 4F9R3F94F9 ;z" S*F7F6%?%9%J$ F9O/FEFEF9FEFEF9F9F9F95FEFEF9FEFEFEF9FEFEFEF9FEFEO6F9F9F9J"8$9(8(8$8"9"<08"808"9" OFEEEEEEEEEEEEEEEEEFEEEQCEEFFJ&:#;"A#J# EEFEEEEEEEEEFEEEQCEEFFJ-=#=#<#J# 4EEFEFEEEFEFEEEEEFEFEEEEEFEFEFEFEEEFEQCFFEEJ":.E#J# 7FEEEFEFEFEFEEEEEEEFEFEFEFEEEFEEEQCEEFFJ&9%9%8#:#<#J# 5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFEQCFFEEJ#J# O*FEEEQCEEFFJ#J# O*EEFEQCFFEEJ#J# O*FEEEQCEEFFJ5 O*QGEEFEEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEJ5 O*QGFEEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFJz O*QGEE J5 OJQ'FEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEJ5 OIQ(FEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEJ#z" OIEEFEQ%EEFFJ#J# OIFEEEQ$FFEEJ#J# OIEEFEQ$EEFFJ'J#@#J# 4FEFEFEFEFEFEO#FEFEFEEEQ$FFEEJ&J#J# 6EEEEEEFEFEO.EEFEQ$EEFFJ%9%9%8#8#8#8%8);#<#J# store /green < 9F0000000000000000000000000099DEFFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B59765E1A36FE700FF1A006B7FB28B3099FFFFB094FFF700CEEEEE0073E6A2 4DBF88F558D74DB38080C0C080C080808060C08000A08040BE5BB477D9B3FF77 2070A0402040D0F0F0E010B489A0E4FF19264F00B641DE4F829E4780FF0000FF > store /blue < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B59765E1A36FE7BFCC8BEE2F7FB257606BFBB3B015322480FAEEB40073E6A2 4DBF88F558D756CAD050C080C08080C08060C080FF000040BE7A8C65D9B3E085 2070C0802040D06050E010B476A0C40070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7R7F6F76F6F7J" S6F78z8z8z 4F9R6F94F9 ;z" S-F7F6%?%9%J$ F9O0FEFEF9FEFEF9F9F9F95FEFEF9FEFEFEF9FEFEFEF9FEFEO8F9F9F9J"8$9(8(8$8"9"<08"808"9" O=FEFEFEFEF9F9FEFEFEF9F9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEFEJs9$9";"x;':$8%:$:$8sJs O=F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9O=F7J&Jt P FEF9F9F9F9Q F9J( P F9FEFEFEFEFEF9=z8z8z8z /F7R%F7/F7/F7rF"J"F"F% F7F7R&F7F7F7F7F7F7'z& F6F6F6F6F6F7S,EEF6F6F6F6F68$J% F9F9F9S.F9F9F9F7 J5 OKQ(C3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEJ5 OKQ(FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3J#z" OKC3FEQ%C3FFJ#J# OKFEC3Q$FFC3J#9#J#F$<$J# 4FEFEFEFEO0C3FEFEFEFEFEFEFEP6C3FFJ#F#<%G"J# OKFEC3C3C3FEC3C3C3FEP$FFC3J%9%8)J#J# =FEFEFEFEFEFEFEFEFEFEEEFEFEEEFEFEGC3FEQ$C3FFJ.9"J)8#8#?&9$9&8&9$J# FEEEEEEEEEEEEEEEEEGC3FEC3C3FEC3FEC3FEC3C3C3C3FEC3C3C3FEC3C3C3FEC3FEC3C3C3C3FEC3C3C3FEC3C3C3FEOHC3FFJ&:#;"J#J$G&J# EEFEEEEEEEEEO"C3FE?C3C3C3C3C3C3C3FEOHC3FFJ-=#=#J#J"D$J# 4EEFEFEEEFEFEEEEEFEFEEEEEFEFEFEFEGFEC3BFEFEC3FEOLFFC3J":.J%;59&8%:,J# 7FEEEFEFEFEFEEEEEEEFEFEFEFEEEO"C3FEC3FE4FEC3C3FEFEFEC3FEC3FEFEFEFEFEFEC3FEFEFEFEC3FEFEFEC3FEFEFEFEC3FEFEFEC3C3C3FEFEFEC3OHC3FFJ&9%9%8#:#J"t8z:$9%;$9$J# 5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEGFEC31C3C3C3C3C3C3C3C3C3C3C3C3C3C3OIFFC3J#J# OKC3FEQ$C3FFJ#J# OKFEC3Q$FFC3J#J# OKC3FEQ$C3FFJ5 OKQ(FEC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3J5 OKQ(C3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFJz OKQ(EE Jz OIQ,FE J5 OKQ'C3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3J5 OKQ(FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3J#z" OKC3FEQ%C3FFJ#J#J# OKFEC3CFEFEP-FFC3J'J#B#J# 4FEFEFEFEFEFEO#FEFEC3FEQ$C3FFJ&J#J# 6EEEEEEFEFEO0FEC3Q$FFC3J%9%9%8#8#8#8%8);#>#J# #J# 6FEFEFEFEEEEEEEFEEEEEEEFEEEEEEEEEEEFEFEFEFEEEEEEEEEEEEEC3FEQ$C3FFJ%8$9&8&J"J#:"<"<"<"<"J# 6EEEEEEEEFEFEFEEEEEFEFEFEEEEEFEFEFE6EE4FEC3FEFEFEFEFEP1FFC3J%;"8"9"8"J#:"<"<"<"<"J# ;FEFEEEEEEEFEEEFEJC3FEC3C3C3C3C3P1C3FFJ%9%:)G":#>#J# BFEFEEEEEFEFEEEEEEEFEFEEEEEFEFEEEFEFEFEFEC3Q$FFC3J5B'<%D#J# ;4EEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEEEFEFEFEFEEEEEFEFEEEC3FEQ$C3FFJ##J# 4EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFEC3Q$FFC3J#J# OKC3FEQ$C3FFJ#J# OKFEC3Q$FFC3J#J#J# OKC3FECC3C3P-C3FFJ5 OKQ(FEC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3&J5C% F7F7F7F7F7OFQ(C3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFF7F7F7F7&JzC& F6F6F6F6F6OFQ(FEF6F6F6F6F68$J% F9F9F9S.F9F9F9F7Jz OIQ,EE store /green < 9F0000000000000000000000000099DEFFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B59765E1A36FE700FF1A006B7FB28B3099FFFFB094FFF700CEEEEE0073E6A2 4DBF88F558D74DB38080C0C080C080808060C08000A08040BE5BB477D9B3FF77 2070A0402040D0F0F0E010B489A0E4FF19264F00B641DE4F829E4780FF0000FF > store /blue < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B59765E1A36FE7BFCC8BEE2F7FB257606BFBB3B015322480FAEEB40073E6A2 4DBF88F558D756CAD050C080C08080C08060C080FF000040BE7A8C65D9B3E085 2070C0802040D06050E010B476A0C40070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7R7F6F76F6F7J" S6F78z8z8z 4F9R6F94F9 ;z" S-F7F6%?%9%J$ F9O0FEFEF9FEFEF9F9F9F95FEFEF9FEFEFEF9FEFEFEF9FEFEO8F9F9F9J"8$9(8(8$8"9"<08"808"9" O=FEFEFEFEF9F9FEFEFEF9F9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEFEJs9$9";"x;':$8%:$:$8sJs O=F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9O=F7J&Jt P FEF9F9F9F9Q F9J( P F9FEFEFEFEFEF9=z8z8z8z /F7R%F7/F7/F7rF"J"F"F% F7F7R&F7F7F7F7F7F7'z& F6F6F6F6F6F7S,EEF6F6F6F6F68$J% F9F9F9S.F9F9F9F7 Jz OKQ(A2J" S$FFJz" OMQ$C3FF J#9#J$<$ 4FEFEFEFEOBFEFEFEFEFEFEJ#<%G" P/C3C3FEC3C3C3FEJ%9%8) =FEFEFEFEFEFEFEFEFEFEEEFEFEEEFEFEJ.9"J&8#8#?&9$9&8&9$ FEEEEEEEEEEEEEEEEEJC3FEC3FEC3FEC3C3C3C3FEC3C3C3FEC3C3C3FEC3FEC3C3C3C3FEC3C3C3FEC3C3C3FEJ&:#;"J$G& EEFEEEEEEEEEOCC3C3C3C3C3C3C3FEJ-=#=#J"D$ 4EEFEFEEEFEFEEEEEFEFEEEEEFEFEFEFEO=FEFEC3FEJ":.J";59&8%:, 7FEEEFEFEFEFEEEEEEEFEFEFEFEEEO%FE4FEC3C3FEFEFEC3FEC3FEFEFEFEFEFEC3FEFEFEFEC3FEFEFEC3FEFEFEFEC3FEFEFEC3C3C3FEFEFEC3J&9%9%8#:#Jr8z:$9%;$9$ 5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEJC31C3C3C3C3C3C3C3C3C3C3C3C3C3C3 JZ OMQ$J" OLFFJz OKQ(EE Jz OIQ,FE Jz OKQ(A2J" S$FFJz" OMQ$C3FFJ# PBFEFEJ'J# 4FEFEFEFEFEFEO#FEFEJ& 6EEEEEEFEFEJ%9%9%8#8#8#8%8);# store /green < 9F0000000000000000000000000099DEFFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B59765E1A36FE700FF1A006B7FB28B3099FFFFB094FFF700CEEEEE0073E6A2 4DBF88F558D74DB38080C0C080C080808060C08000A08040BE5BB477D9B3FF77 2070A0402040D0F0F0E010B489A0E4FF19264F00B641DE4F829E4780FF0000FF > store /blue < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B59765E1A36FE7BFCC8BEE2F7FB257606BFBB3B015322480FAEEB40073E6A2 4DBF88F558D756CAD050C080C08080C08060C080FF000040BE7A8C65D9B3E085 2070C0802040D06050E010B476A0C40070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7Q+F6F76F6F7J" R*F78z8z8z 4F9Q*F94F9 ;z" R!F7F6F9F9F9FEFEFEFEFEF9FEFEFEF9FEFEF9F9FEFEArJ$A$ F9OEF9FEFEF9F9F9@sJ%G' F7ODFEFEF9F9F9FEFEFEFEF9@tJ$?"A$9& F9O:FEFEF9FEFEF9FEFEF9F9F9F9J"8&8"8'8$8*8& OGFEFEFEFEFEF9FEFEF9F9FEFEF9FEF9FEFEF9F9F9FEFEFEF9F9FEFEFEFEFEJr9%8v9$9";" OGF9F9F9F9F9F9F9F9F9F9FEJ& P=FEF9F9F9F9J( P=F9FEFEFEFEFEF9=z8z /F7Q;F7rF"J% F7F7Q$8%;( O'FFFEFEFEFFFFFEFE6FFFFFEFEFEFFFEFFFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFFJ"9$J$9"G"8$J$9$ O'FEFEFFFF;FFFFFEFEFEFFFFFF>FFFFFEFEFFFFJ#9#J" P4FEFEFFFFEFFJ$J$8"J$;" OHFFFFFE9FEFEFEFF:FFFFFEFEJ"8"JR P9FEFF;J"Jt P:FE=FE J$<"J$J"J& GFEFFFFFFEFEFFFF5FFAFFFEFEFFFFJ"<$J" P3FFFFFFFECFFJ$9$J$9"H":$G$9#8$:$ HFEFFFFFFFFFEFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFFFEJ(8"8"9"8"9#8#<#8#<'8"D);#8#>':) IFEFEFFFFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFFFFFFEFFFEFEFFFFFFFFFEFEFFFFFFFFFEFFFFFFFFFEFEFEFFFFFFFFFEFEJ$:%9%9'<'>rC"8%='?%=% KFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE Jz CPBEE store /green < 57D79F00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B59765E1A36FE700FF1A00B26B7F8BEEEE0073E6A24DBF00CE99FFFFF530B0 94FFF788BE5BB477D9B3FF774DB358D78080C0C080C080808060C08000A08040 2070A0402040D0F0F0E010B4A089E4FF19264F00B641DE4F829E4780FF0000FF > store /blue < 8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B59765E1A36FE7BFCC8BEEB22F7F57EEB40073E6A24DBF80FA6BFBB3F560B0 15322488BE7A8C65D9B3E08556CA58D7D050C080C08080C08060C080FF000040 2070C0802040D06050E010B4A076C40070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7R7F6F76F6F7J" S6F78z8z8z 4F9R6F94F9 ;z" S-F7F6%?%9% F9OAFEFEF9FEFEF9F9F9F95FEFEF9FEFEFEF9FEFEFEF9FEFEJ"8$9(8(8$8"9"<08"808"9" P FEFEFEFEF9F9FEFEFEF9F9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEFEJs9$9";"x;':$8%:$:$8s P F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9J& P1FEF9F9F9F9J( P1F9FEFEFEFEFEF9=z8z /F7RGF7rF"J% F7F7RHF7F7F7F7'z& F6F6F6F6F6F7S,EEF6F6F6F6F68$J% F9F9F9S.F9F9F9F7 J5 OKQ(BDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEJ5 OKQ(FEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDJ#z" OKBDFEQ%BDFFJ#J# OKFEBDQ$FFBDJ#9#J#F$<$J# 4FEFEFEFEO0BDFEFEFEFEFEFEFEP6BDFFJ#F#<%G"J# OKFEBDBDBDFEBDBDBDFEP$FFBDJ%9%8)J#J# =FEFEFEFEFEFEFEFEFEFEEEFEFEEEFEFEGBDFEQ$BDFFJ.9"J)8#8#?&9$9&8&9$J# FEEEEEEEEEEEEEEEEEGBDFEBDBDFEBDFEBDFEBDBDBDBDFEBDBDBDFEBDBDBDFEBDFEBDBDBDBDFEBDBDBDFEBDBDBDFEOHBDFFJ&:#;"J#J$G&J# EEFEEEEEEEEEO"BDFE?BDBDBDBDBDBDBDFEOHBDFFJ-=#=#J#J"D$J# 4EEFEFEEEFEFEEEEEFEFEEEEEFEFEFEFEGFEBDBFEFEBDFEOLFFBDJ":.J%;59&8%:,J# 7FEEEFEFEFEFEEEEEEEFEFEFEFEEEO"BDFEBDFE4FEBDBDFEFEFEBDFEBDFEFEFEFEFEFEBDFEFEFEFEBDFEFEFEBDFEFEFEFEBDFEFEFEBDBDBDFEFEFEBDOHBDFFJ&9%9%8#:#J"t8z:$9%;$9$J# 5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEGFEBD1BDBDBDBDBDBDBDBDBDBDBDBDBDBDOIFFBDJ#J# OKBDFEQ$BDFFJ#J# OKFEBDQ$FFBDJ#J# OKBDFEQ$BDFFJ5 OKQ(FEBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDJ5 OKQ(BDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFJz OKQ(EE Jz OIQ,FE J5 OKQ'BDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDJ5 OKQ(FEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDJ#z" OKBDFEQ%BDFFJ#J#J# OKFEBDCFEFEP-FFBDJ'J#B#J# 4FEFEFEFEFEFEO#FEFEBDFEQ$BDFFJ&J#J# 6EEEEEEFEFEO0FEBDQ$FFBDJ%9%9%8#8#8#8%8);#>#J# #J# 6FEFEFEFEEEEEEEFEEEEEEEFEEEEEEEEEEEFEFEFEFEEEEEEEEEEEEEBDFEQ$BDFFJ%8$9&8&J"J#:"<"<"<"<"J# 6EEEEEEEEFEFEFEEEEEFEFEFEEEEEFEFEFE6EE4FEBDFEFEFEFEFEP1FFBDJ%;"8"9"8"J#:"<"<"<"<"J# ;FEFEEEEEEEFEEEFEJBDFEBDBDBDBDBDP1BDFFJ%9%:)G":#>#J# BFEFEEEEEFEFEEEEEEEFEFEEEEEFEFEEEFEFEFEFEBDQ$FFBDJ5B'<%D#J# ;4EEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEEEFEFEFEFEEEEEFEFEEEBDFEQ$BDFFJ##J# 4EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFEBDQ$FFBDJ#J# OKBDFEQ$BDFFJ#J# OKFEBDQ$FFBDJ#J#J# OKBDFECBDBDP-BDFFJ5 OKQ(FEBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDJ5 OKQ(BDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFJz OKQ(FE Jz OIQ,EE FEFEEEOJFEFEEEEEFEFEFEEEFEFEEEFEFEEEEEFEFEEEFEFEEEEEFEFEJ#="># Q=EEEEEEEEEEJ$J$I# O>EEFEFEOKFEFEFEFEFEJ$J%I% O?EEFEFEOIFEFEEEEEEEEEEEEEJ$8$<$J$8#H#;# O2EEFEFEFEFEEEEEFEFEOAEEFEFEFEFEFEFEFEFEJ'>$J.=. O3EEFEFEFEFEEEEEFEFEOAEEFEFEFEFEEEEEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEJ%:#:#J%8s8#8%9%8# O4EEEEEEEEEEEEEEEEOBEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE &J% F7F7F7F7F7S-F7F7F7F7&JzJzJ& F6F6F6F6F6EO1EDKO1EDEF6F6F6F6F68$J"J"J% F9F9F9DEDP-EDP)F9F9F9F7JzJz HO5EEGO5EE JZ DO=J" CFFJz BOAEE store /green < 9F0000000000000000000000000099DEFFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B56B7F9765E1A36FE700FF1A00B28B3099FFFFB094FFF700CEEEEE8858D700 73E6A24DBFF54DB38080C0C080C080808060C08000A080402070A0402040D0F0 F0E010B4BE5BB477D9B3FF77A089E4FF194F2600B641DE4F829E4780FF0000FF > store /blue < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B52F7F9765E1A36FE7BFCC8BEEB257606BFBB3B015322480FAEEB48858D700 73E6A24DBFF556CAD050C080C08080C08060C080FF0000402070C0802040D060 50E010B4BE7A8C65D9B3E085A076C400704F2600FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7S#F6F76F6F7J" T"F78z8z8z 4F9S"F94F9 ;z" SGF7F6$@%J#F' O@FEFEFEFEF9FE;FEFEFEFEFEFEFEFEFE5FEFEFEFEFEFEF9FEJ'J"B"8"J' O?FEFEF9F9F9FEFF9F9F9FFEFEF9F9F9FEJ"J#J#8#J" ODF9$<"H%J":$9&J">%?%9% F9O-FEFEF9FEFEFEF9F9F95FEFEF9FEFEF9F9F9F95FEFEF9FEFEFEF9FEFEFEF9FEFEJ'9+8$8"9$8"8'8"9";"8$9(8(8$8"9"<08"808"9" O@F9FEFEFEFEF9F9FEFEF9F9F9F9FEFEF9FEF9FEFEFEF9FEFEFEFEFEF9F9FEFEFEFEFEFEFEF9F9FEFEFEF9F9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEFEJ';#:z8s;s9$9";"x;':$8%:$:$8s O?F9F9F9F9F9F9F9F99F9F9F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9J& Q-FEF9F9F9F9J"8"J( OFFEFEO1F9FEFEFEFEFEF9=z8z /F7S3F7rF"J% F7F7S4F7F7F7F7'z& F6F6F6F6F6F7SFEEF6F6F6F6F68$J% F9F9F9SHF9F9F9F7 J5 P7Q(C5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEJ5 P7Q(FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5J#z" P7C5FEQ%C5FFJ#J# P7FEC5Q$FFC5J#9#I#J#F$<$J# 4FEFEFEFEFEFEO5C5FEFEFEFEFEFEFEP6C5FFJ"J#F#<%G"J# 6FEP FEC5C5C5FEC5C5C5FEP$FFC5J%8*;#8+9#J#J# =FEFEFEFEFEEEFEFEFEEEFEFEFEFEFEFEFEEEFEFEEEFEFEFEFEFEFEO!C5FEQ$C5FFJ#:'8*9%9"8'J)8#8#?&9$9&8&9$J# 6EEFEFEFEEEEEFEFEFEEEEEFEFEEEEEFEFEFEEEFEFEFEFEFEEEEEFEFEO%FEC5C5FEFEFEC5FEFEFEFEFEFEFEFEFEFEFEFEFEFEC5FEFEFEFEFEFEFEFEFEFEFEOIFFC5J"=#>#J,9"@&8&8&8&8&J# O"EEEEEEEEEEO!C5FEC5C5FEC5FEC5FEC5C5C5C5FEC5C5C5FEC5C5C5FEC5FEC5C5C5C5FEC5C5C5FEC5C5C5FEOHC5FFJ#J":#J#J$G&J# 7EEFE>EEFEFEO'FEC5?FEFEFEC5FEFEFEC5OHFFC5J%J#J%G%J# O.EEEEEEEEO%C5FE?C5C5C5C5C5C5C5FEOHC5FFJ"J"C#8#J#J"D$J# 8EE7FEFEFEFEFEO!FEC5BFEFEC5FEOLFFC5J'D%<'J%;59&8%:,J# FEC5Q$FFC5J"B%=%@":#<#J#J# DEEEEEEEEEEFEEEEEEEEEEEEEEEEE:C5FEQ$C5FFJ"9$9&:#A$J#:"<"<"<"<"J# O"EEFEFEFEEEEEFEFEFEFEFEFEFEFE@FEC5FEFEFEFEFEP1FFC5J%;"8"9%>%J#:"<"<"<"<"J# O%FEFEEEEEEEFEEEEEEEEEFEFEEEEE@C5FEC5C5C5C5C5P1C5FFJ$8#H"B%=#F#J#J# 4EEFEFEFEFEFEFEFEEEEEFEFEFEFE:FEC5Q$FFC5J-?%;5>(J#J# 5EEFEFEFEFEEEEEFEFEFEFEEEEEFEFEEE4EEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEEEFEFEFEEEFEFE=C5FEQ$C5FFJ%8%8#8#9&:v9%8#8#8tJ#J# 6EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE:FEC5Q$FFC5J#J# P7C5FEQ$C5FFJ#J# P7FEC5Q$FFC5J#J#J# P7C5FECC5C5P-C5FFJ5 P7Q(FEC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5J5 P7Q(C5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFJz P7Q(FE Jz P5Q,EE store /green < 57D79F00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B59765E1A36FE700FF1A00B26B7F8BEEEE0073E6A24DBF00CE99FFFFF530B0 94FFF788BE5BB477D9B3FF774DB358D78080C0C080C080808060C08000A08040 2070A0402040D0F0F0E010B4A089E4FF19264F00B641DE4F829E4780FF0000FF > store /blue < 8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B59765E1A36FE7BFCC8BEEB22F7F57EEB40073E6A24DBF80FA6BFBB3F560B0 15322488BE7A8C65D9B3E08556CA58D7D050C080C08080C08060C080FF000040 2070C0802040D06050E010B4A076C40070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7QEF6F76F6F7J" RDF78z8z8z 4F9QDF94F9 ;z" R;F7F6$H" O>FEFEFEFE>FEFEFEFEF9FEFEFEFEFEJ"8"J'?"I" O>F9F9=FEFEF9F9F9FEF9FEJ" P6F9J$:$9'?#8"9$?$:$8"8#8$9' OEFEFEFEFEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFE@s"J18%<"9#8'<08,8" F6F7O0FEFEFEF9FEFEF9FEFEFEF9FEFEFEF9F9FEF9FEFEF9FEFEFEFEFEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9F9F9FEFEFEF9FEFEFEF9F9FEArJ%9$<"@#9":"A";%>$<$ F9O3F9F9F9F9F9F9F9F9F9F9FEFEFEF9F9F9F9F9F9F9F9F9F9@sJ"8#;%>% F7OMFEF9F9F9F9F9F9F9F9F9F9@tJ%9$G">%>%9%>$ F9O2FEF9FEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FEJ"838"9"<0808.8" O>FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9FEFEJ%9$:$9s;':$8%9$:$:#9$9% O>F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 =z8z /F7R'F7rF"J% F7F7R(F7F7F7F7'z& F6F6F6F6F6F7R:EEF6F6F6F6F68$J% F9F9F9R' 7EEFEFEFEFEEEEEEEFEFEFEFEEEEEFEFEFEFEEEJ#8%9%8#8#8% 4EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE H5=z Q6BDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFE3EDH5J" Q6FEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBD9FFH#z"?r"r" BDFEQ3BDFFE6EDE6FFH#J#E" FEBDQ2FFBDFFH&I#J#G" BDFEBDFEFEFEFEPHBDFFEDH%J"J#D" FEBDBDBD4BDPIFFBDFFH#J#F$ BDFEQ2BDFFEEEDEDH#9$:$8&:$J#C$ FEBDFEFEFEFEFEFEFEFEFEBDFEFEFEFEPEFFBDFFFFEEH#9%8-9%J#G$ BDFEBDBDBDFEFEBDBDBDFEBDBDFEBDFEBDFEBDBDBDFEPDBDFFEEEDEDH#J#B$ FEBDQ2FFBDFFFFEEH#J#H$ BDFEQ2BDFFEEEDEDH#J#A$ FEBDQ2FFBDFFFFEEH*8(;(J#I$ BDFEBDFEBDFEFEFEBDBDFEFEFEBDBDFEFEFEBDFEFEFEBDPDBDFFEEEDEDH"r:$8wJ#@$ FEBDBDBDBDBDPEFFBDFFFFEEH#J#J$ BDFEQ2BDFF4EEEDEDH#J#?#u FEBDQ2FFBDFFFFEDH#J#@"B" BDFEQ2BDFFEDEDH#J#?z FEBDQ2FFBD/E6H#J#?Z BDFEQ2BDFF/H#J#J" FEBDQ2FFBD7EDH#J#Av" BDFEQ2BDFFEEEDH#J# FEBDQ2FFBDH#J# BDFEQ2BDFFH#8$:$8&8&9&9$:$:$J# FEBDFEFEFEFEFEFEFEFEFEBDFEFEBDFEFEFEFEBDFEFEFEFEFEFEFEFEFEFEFEFEP*FFBDH)848&8&8&8&J# BDFEBDFEBDBDBDFEFEBDBDBDFEBDBDFEBDFEBDFEBDBDFEBDBDBDFEBDFEBDBDBDFEBDBDBDFEFEBDBDBDFEFEBDBDBDFEP)BDFFH#;"J$9&8&J# FEBDBD?FEFEFEBDFEFEFEBDBDFEFEFEBDP)FFBDH#J%9%9%J# BDFEEBDBDBDBDBDBDBDFEBDBDBDFEP)BDFFH#;"J"8"<"J# FEBDFEBFEFEFEP-FFBDH)8(;"8%8%9&8&8&J# BDFEBDBDFEFEFEBDBDFEFEFEBDBDFEFEFEFEFEBDFEFEFEFEBDFEFEFEBDBDFEFEFEBDBDFEFEFEBDP)BDFFH#8$:$8r8$9%:$:$:$J# FEBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDP*FFBDH#J# BDFEQ2BDFFH#J$J# FEBD5FEFEFEPHFFBDH#J$J# BDFE5BDBDBDPHBDFFH#J# FEBDQ2FFBDH5 Q6BDFEE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFBDFFH$z# FEBDFFQ1E6FFBDH$J$ BDFEE6Q0FEBDFFH$J$ FEBDFFQ0E6FFBDH$J$ BDFEE6Q0FEBDFFH(:$9&9$J$ FEBDFFE6FEFEFEFEFEFEFEE6FEFEFEFEFEFEPEE6FFBDH)8&8&8&J$ BDFEE6FEE6E6E6FEFEE6E6E6FEE6FEE6E6E6FEE6E6E6FEPDFEBDFFH$:"G$J$ FEBDFFE6FEFEFEPEE6FFBDH$J%J$ BDFEE66E6E6E6E6PDFEBDFFH$:"J"J$ FEBDFFFE4FEPDE6FFBDH)8&8%9&J$ BDFEE6E6FEFEFEE6E6FEFEFEE6FEFEFEFEE6FEFEFEE6PDFEBDFFH(:$9%:$J$ FEBDFFE6E6E6E6E6E6E6E6E6E6E6E6E6E6PEE6FFBDH$J$ BDFEE6Q0FEBDFFH$J$ FEBDFFQ0E6FFBDH$J$ BDFEE6Q0FEBDFFH5 Q6FEBDFFE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FFBDH#z" BDFEQ3BDFFH#J# FEBDQ2FFBDH#:#J# BDFEFEFEQ,BDFFH#:"J# FEBDBDQ-FFBDH#J# BDFEQ2BDFFH#8$:$:$J# FEBDFEFEFEFEFEFEFEFEFEPMFFBDH(9&8&J# BDFEBDFEBDBDBDFEBDBDBDFEFEBDBDBDFEPLBDFFH#>&<"J# FEBDBDFEFEFEBDBDPLFFBDH#?%J# BDFEBDBDBDFEQ%BDFFH#>"@"J# FEBDFEFEPLFFBDH08&J# BDFEBDBDFEFEFEBDFEBDBDFEFEFEBDBDFEFEFEBDPLBDFFH#8&8$:$J# FEBDBDBDBDBDBDBDBDBDBDBDBDPMFFBDH#J# BDFEQ2BDFFH#J# FEBDQ2FFBDH#J# BDFEQ2BDFFH#J# FEBDQ2FFBDH#J# BDFEQ2BDFFH#J# FEBDQ2FFBDH#J# BDFEQ2BDFFH#J# FEBDQ2FFBDH#J# BDFEQ2BDFFH#8$8&9%:$:$J# FEBDFEFEFEFEFEFEBDFEFEFEFEFEFEFEFEFEFEFEP?FFBDH08&8&8&J# BDFEBDFEBDBDBDFEBDBDFEBDFEBDFEBDBDBDBDFEFEBDBDBDFEFEBDBDBDFEP>BDFFH#8$A$="8&J# FEBDFEFEFEFEFEFEBDBDFEFEFEBDP>FFBDH#8%?%A%J# BDFEBDBDBDBDFEBDBDBDBDBDBDFEP>BDFFH#;"J"8"J# FEBDFE4FEFEPBFFBDH+;/8&J# BDFEBDBDFEFEFEBDBDFEFEBDBDFEFEFEBDFEBDBDFEFEFEBDBDFEFEFEBDP>BDFFH#8$8r8&8$:$J# FEBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDP?FFBDH#J# BDFEQ2BDFFH#J# FEBDQ2FFBDH#J# BDFEQ2BDFFH#J# FEBDQ2FFBDH#J# BDFEQ2BDFFH#J# FEBDQ2FFBDH&I#J#J# BDFEBDFEFEFEFE>FEFEP(BDFFH%J"J"J# FEBDBDBD4BD?BDP)FFBDH#J# BDFEQ2BDFFH#;#9$8(8$:$9%9&9$J# FEBDFEFEFEFEFEFEFEFEBDFEFEFEFEFEFEFEFEFEFEFEFEFEFEBDFEFEFEFEFEFEP)FFBDH#:$8.8%8&8&8&8%J# BDFEFEBDBDFEBDBDBDFEBDBDFEBDBDBDFEBDBDBDBDFEFEBDBDBDFEBDBDBDBDFEBDFEBDBDBDFEBDBDBDP)BDFFH#9#;$J$J# FEBDFEBDFEFEFE9FEFEFEP7FFBDH#9#;%8&F%J# BDFEBDFEBDBDBDBDBDFEBDFEBDFEBDBDBDP7BDFFH#:#=":"J# FEBDBDFEFEFEPMFFBDH%9*9$8'8&8,9'J#Av BDFEBDFEBDFEFEBDBDFEFEFEBDBDFEBDFEBDFEFEFEBDBDFEFEFEBDBDFEFEFEBDFEBDFEFEFEFEBDFEFEFEBDFEP'BDFFEDH&9#8$?&:$:u:&J#@" FEBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDP'FFBDEDH#J#?z BDFEQ2BDFF/E6H#F$J# FEBDFEFEBDPMFFBDH#F#J# BDFEBDBDQ BDFFH#J# FEBDQ2FFBDH#J# BDFEQ2BDFFH#J# FEBDQ2FFBDH#E$G#J# BDFEFEFEFEFEFEP;BDFFH#8"B#H"J# FEBDFEBDBDBDP" Q6FEBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFHz=z Q6EE3EE HZ R"J" R3EDJz" 4QLEEED J# P6FEFEJ"8" P5FEFEJ" P;FEJ& P8EEEEFEFEFEJ":" P8FEFEJ" P5EEJ"8":" P6EEFEFEJ">#:# P1FEEEEEFEFEJ$:"="8" P0FEFEFEEEFEFEJ"9" P7FEFEJ"<" P3FEFEJ";"<"9# P0EEFEEEEEEEJ"8" P>EEFEJ"?"8" P5FEEEFEJ"8#8# P0FEEEFEEEEEJ"C" P/FEFEJ"9#;";" P.FEEEFEEEFEJ#9"=" P1EEFEEEFEJ"=" P:EEEEJ"8"@$ P-FEEEEEEEEEJ#?" P6FEFEEEJ" P2EEJ"8# P0FEEEEEJ"=$ P-EEEEEEEEJ$ P8FEFEFEJ$<"9" P.EEEEEEFEFE J#=$ P5FEFEEEEEEEJ$ P2FEFEFEJ$ P/FEFEFEJ# P-FEFEJ" P;EEJ" P,FEJ" P:EEJ#D# P*FEFEFEFEJ#H" P(FEFEFEJ" P=FE J# P&FEFEJ#J$ P$FEFE8FEFEFEJ"J" P#FE=FE J" PBFE J#J" P#EEEE=EEJz P%=EE Jz 4QLEDI" EDHz R"EE J# 4FEFE J%9%8& 8FEFEFEFEFEFEFEFEFEFEEEFEFEJ.9% 7FEFEEEEEFEFEEEFEFEEEEEFEFEFEEEFEFEJ#@" ;EEEEEE J# ;FEFEJ. 7EEFEFEFEFEEEEEEEFEFEFEFEEEJ#8%9%8#8# 4EEEEEEEEEEEEEEEEEEEEEEEEEEEE H5 R!BDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDH5 R!FEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFFH#z# BDFEQKBDFFBDH#J# FEBDQKBDFFH#J# BDFEQKFFBDH#J# FEBDQKBDFFH#J# BDFEQKFFBDH#9$:$9&9$J# FEBDFEFEFEFEFEFEFEBDFEFEFEFEFEFEQ0BDFFH#8&8&8&8&J# BDFEFEBDBDBDFEFEBDBDBDFEBDFEBDBDBDFEBDBDBDFEQ/FFBDH#<"G$J# FEBDBDFEFEFEQ0BDFFH#J%J# BDFE8BDBDBDBDQ/FFBDH#<"J"J# FEBDFE4FEQ/BDFFH#8&8&8%9&J# BDFEBDFEFEFEBDBDFEFEFEBDFEFEFEFEBDFEFEFEBDQ/FFBDH#9$:$9%:$J# FEBDBDBDBDBDBDBDBDBDBDBDBDBDBDQ0BDFFH#J# BDFEQKFFBDH#J# FEBDQKBDFFH#J# BDFEQKFFBDH5 R!FEBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFH5 R!BDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDHz R!EE O3J"J" P#EDP"EDJz"Jz" AO/EEEDAO/EEED J%:#9#J%J# O+FEFEFEFEFEFEFEFEO8FEFEFEFE=FEFEJ'=$J' O*FEFEEEEEFEFEFEFEEEO7FEFEEEEEFEFEJ$8$;$J$8(8&9%9% O)FEFEEEEEFEFEFEFEEEO7FEFEEEEEEEEEFEFEFEFEFEFEEEFEFEFEFEFEFEFEFEFEFEJ$J'93 O5FEFEEEO?FEFEEEEEFEFEFEEEFEFEEEFEFEEEEEFEFEEEFEFEEEEEFEFEJ#="># Q)EEEEEEEEEEJ$J$I# O5EEFEFEO@FEFEFEFEFEJ$J%I% O6EEFEFEO>FEFEEEEEEEEEEEEEJ$8$<$J$8#H#;# O)EEFEFEFEFEEEEEFEFEO6EEFEFEFEFEFEFEFEFEJ'>$J.=. O*EEFEFEFEFEEEEEFEFEO6EEFEFEFEFEEEEEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEJ%:#:#J%8s8#8%9%8# O+EEEEEEEEEEEEEEEEO7EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE &J% F7F7F7F7F7R;F7F7F7F7&JzJzJ& F6F6F6F6F6O3EE JZ ;O;J" :FFJz 9O?EE store /green < 57D79F00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B56B7F9765E1A36FE700FF1A00B28BEEEE0073E6A24DBF00CEF599FFFFB094 FFF730884DB358D78080C0C080C080808060C08000A080402070A0402040D0F0 F0E010B4BE5BB477D9B3FF7789E4A0FF19264F00B641DE4F829E4780FF0000FF > store /blue < 8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B52F7F9765E1A36FE7BFCC8BEEB257EEB40073E6A24DBF80FAF56BFBB3B015 3224608856CA58D7D050C080C08080C08060C080FF0000402070C0802040D060 50E010B4BE7A8C65D9B3E08576C4A00070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7R=F6F76F6F7J" S$H" P#FEFEFEFE>FEFEFEFEF9FEFEFEFEFEJ"8"J'?"I" P#F9F9=FEFEF9F9F9FEF9FEJ" PIF9J$:$9'?#8"9$?$:$8"8#8$9' P*FEFEFEFEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFE@s"J18%<"9#8'<08,8" F6F7OCFEFEFEF9FEFEF9FEFEFEF9FEFEFEF9F9FEF9FEFEF9FEFEFEFEFEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9F9F9FEFEFEF9FEFEFEF9F9FEArJ%9$<"@#9":"A";%>$<$ F9OFF9F9F9F9F9F9F9F9F9F9FEFEFEF9F9F9F9F9F9F9F9F9F9@sJ"8#;%>% F7P2FEF9F9F9F9F9F9F9F9F9F9@tJ%9$G">%>%9%>$ F9OEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FEJ"838"9"<0808.8" P#FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9FEFEJ%9$:$9s;':$8%9$:$:#9$9% P#F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 =z8z /F7RMF7rF"J% F7F7S F7F7F7F7'z& F6F6F6F6F6F7S2EDF6F6F6F6F68$J% F9F9F9S4F9F9F9F7 HZ RHJ" S+ECJz" 4RDEDEC J# PJFEFEJ"8" PIFEFEJ" Q!FEJ& PLEDEDFEFEFEJ":" PLFEFEJ" PIEDJ"8":" PJEDFEFEJ">#:# PEFEEDEDFEFEJ$:"="8" PDFEFEFEEDFEFEJ"9" PKFEFEJ"<" PGFEFEJ";"<"9# PDEDFEEDEDEDJ"8" Q$EDFEJ"?"8" PIFEEDFEJ"8#8# PDFEEDFEEDEDJ"C" PCFEFEJ"9#;";" PBFEEDFEEDFEJ#9"=" PEEDFEEDFEJ"=" Q EDEDJ"8"@$ PAFEEDEDEDEDJ#?" PJFEFEEDJ" PFEDJ"8# PDFEEDEDJ"=$ PAEDEDEDEDJ$ PLFEFEFEJ$<"9" PBEDEDEDFEFE J#=$ PIFEFEEDEDEDJ$ PFFEFEFEJ$ PCFEFEFEJ# PAFEFEJ" Q!EDJ" P@FEJ" Q EDJ#D# P>FEFEFEFEJ#H" P' 7EDFEFEFEFEEDEDEDFEFEFEFEEDEDFEFEFEFEEDJ#8%9%8#8#8% 4EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED H5=z R.BAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFE3ECH5J" R.FEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBA9FFH#z"?r"r" BAFER+BAFFDEECDEFFH#J#E" FEBAR*FFBAFFH&I#J#G" BAFEBAFEFEFEFEQ@BAFFECH%J"J#D" FEBABABA4BAQAFFBAFFH#J#F$ BAFER*BAFFEDECECH#9$:$8&:$J#C$ FEBAFEFEFEFEFEFEFEFEFEBAFEFEFEFEQ=FFBAFFFFEDH#9%8-9%J#G$ BAFEBABABAFEFEBABABAFEBABAFEBAFEBAFEBABABAFEQ&<"J# FEBABAFEFEFEBABAQDFFBAH#?%J# BAFEBABABAFEQKBAFFH#>"@"J# FEBAFEFEQDFFBAH08&J# BAFEBABAFEFEFEBAFEBABAFEFEFEBABAFEFEFEBAQDBAFFH#8&8$:$J# FEBABABABABABABABABABABABAQEFFBAH#J# BAFER*BAFFH#J# FEBAR*FFBAH#J# BAFER*BAFFH#J# FEBAR*FFBAH#J# BAFER*BAFFH#J# FEBAR*FFBAH#J# BAFER*BAFFH#J# FEBAR*FFBAH#J# BAFER*BAFFH#8$8&9%:$:$J# FEBAFEFEFEFEFEFEBAFEFEFEFEFEFEFEFEFEFEFEQ7FFBAH08&8&8&J# BAFEBAFEBABABAFEBABAFEBAFEBAFEBABABABAFEFEBABABAFEFEBABABAFEQ6BAFFH#8$A$="8&J# FEBAFEFEFEFEFEFEBABAFEFEFEBAQ6FFBAH#8%?%A%J# BAFEBABABABAFEBABABABABABAFEQ6BAFFH#;"J"8"J# FEBAFE4FEFEQ:FFBAH+;/8&J# BAFEBABAFEFEFEBABAFEFEBABAFEFEFEBAFEBABAFEFEFEBABAFEFEFEBAQ6BAFFH#8$8r8&8$:$J# FEBABABABABABABABABABABABABABABABAQ7FFBAH#J# BAFER*BAFFH#J# FEBAR*FFBAH#J# BAFER*BAFFH#J# FEBAR*FFBAH#J# BAFER*BAFFH#J# FEBAR*FFBAH&I#J#J# BAFEBAFEFEFEFE>FEFEQ BAFFH%J"J"J# FEBABABA4BA?BAQ!FFBAH#J# BAFER*BAFFH#;#9$8(8$:$9%9&9$J# FEBAFEFEFEFEFEFEFEFEBAFEFEFEFEFEFEFEFEFEFEFEFEFEFEBAFEFEFEFEFEFEQ!FFBAH#:$8.8%8&8&8&8%J# BAFEFEBABAFEBABABAFEBABAFEBABABAFEBABABABAFEFEBABABAFEBABABABAFEBAFEBABABAFEBABABAQ!BAFFH#9#;$J$J# FEBAFEBAFEFEFE9FEFEFEQ/FFBAH#9#;%8&F%J# BAFEBAFEBABABABABAFEBAFEBAFEBABABAQ/BAFFH#:#=":"J# FEBABAFEFEFEQEFFBAH%9*9$8'8&8,9'J# BAFEBAFEBAFEFEBABAFEFEFEBABAFEBAFEBAFEFEFEBABAFEFEFEBABAFEFEFEBAFEBAFEFEFEFEBAFEFEFEBAFEPMBAFFH&9#8$?&:$:u:&J# FEBABABABABABABABABABABABABABABABABABABABABABABAPMFFBAH#J# BAFER*BAFFH#F$J# FEBAFEFEBAQEFFBAH#F#J# BAFEBABAQFBAFFH#J# FEBAR*FFBAH#J# BAFER*BAFFH#J# FEBAR*FFBAH#E$G#J# BAFEFEFEFEFEFEQ3BAFFH#8"B#H"J# FEBAFEBABABAQ4FFBAH#J# BAFER*BAFFH)9$A$8&;#:$8&:$J# FEBABAFEFEFEFEFEFEFEFEFEFEFEFEBAFEFEFEFEFEFEFEFEFEBAFEFEFEFEFEFEPIFFBAH)8&?-9%8-8&J# BAFEBABAFEBABABAFEBABABAFEFEBABABAFEBABAFEBABABAFEFEBABAFEFEBABABAFEBABAFEFEBABAFEFEBABABAFEPHBAFFH#?$A$A"C"<$J# FEBAFEFEFEFEFEFEBABAFEFEFEPIFFBAH#?%@%J%J# BAFEBABABABABABABABA?BABABABAPHBAFFH#<";"C"J"J# FEBAFEFEFEBFEPHFFBAH#8,8-959(J# BAFEBAFEFEFEBABABAFEFEFEBAFEFEFEFEFEFEBABAFEFEFEBA6FEFEFEBABAFEFEFEBAFEFEFEBABAFEFEFEBABAFEFEFEFEBABAFEFEFEBAPHBAFFH#9$9$9'8$:$8r8$8$8#8$J# FEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAPIFFBAH#J# BAFER*BAFFH#J$J# FEBA" R.BAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFFFHz=z R.ED3ED # P?EDEDEDFEFEEDFEFEEDO&EDEDEDEDEDJ$J#J$I# O(EDFEFEO-FEFEOBFEFEFEFEFEJ$J)H&J%I% O)EDFEFEO)FEFEEDEDEDEDFEFEEDFEFEFEEDO'FEFEEDEDEDEDEDEDJ$8$<$J"<"J$8#H#;# JEDFEFEFEFEEDEDFEFEO2FEFEO-EDFEFEFEFEFEFEFEFEJ'>$J%9%<"J.=. KEDFEFEFEFEEDEDFEFEO1EDFEFEEDEDFEFEEDEDO$EDFEFEFEFEEDEDFEFEFEEDFEFEEDFEFEFEFEEDEDEDFEFEFEFEEDJ%:#:#J#:#9#;#8#;"J%8s8#8%9%8# LEDEDEDEDEDEDEDEDO'EDEDEDEDEDEDEDEDEDEDEDO#EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDJ" Q"FEJ$ Q!FEFEEDJ#;#?# P=EDEDEDEDEDED &J% F7F7F7F7F7S3F7F7F7F7&HzJzJzH& F6F6F6F6F6O)EC8O)EC8O)ECF6F6F6F6F68$G"J"J"J% F9F9F9ECO@ECO@ECO store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000082D78AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000006DB675C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F6F7Q>F6F77F6F7J" R?F78z8z8z 5F9Q=F95F9 z8z /F9R F9 J'J'J"9# Oz8z /F7R F7sF"J& F7F7R!F7F7F7F7F7(z' F6F6F6F6F6F6F7R3D9F6F6F6F6F6F68%J& F9F9F9F9R5F9F9F9F9F7 Ju BFEJ- AFEFED9FED9FED9FED9FED9FEJ/ @FEFED9FED9FED9FED9FED9FED9FEJ&r% ?FEFED9FED9FED9FED9FEJ%=& @D9FED9FEFED9FED9FEJ$?% @FED9FEFED9FED9J$9$9%J#J% @D9FED9D9FED9D9FED9FEBFEFEO?FEFEFEFEJ$9$9&J"8"J' @FED9FEFED9FEFED9FED9FE@FEFEO=FEFED9D9FEFEJ$9$9'J#9+<#9#8%8#8#<%8#8. @D9FED9D9FED9D9FED9FED9FE@D9D9FEFED9FEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED9FEFED9FEFED9FEFEFEFEJ*9(J":"9"8'C'B'@"8'<' @FED9FED9FED9FED9FEFED9FED9FED9FE=FEFEFEFEFED9D9FEFEFEFED9D9FEFEFEFED9D9FEFEFEFEFED9D9FEFED9D9D9FEFED9J):(J#A(J%A#D$ @D9FED9FED9FED9FED9FED9FEFEFED9GD9D9D9FEFED9FEFED95FED9D9D9D9D9FEFED9J(:(J#;":#J&A":# @FED9FED9FED9FED9FED9FED9D9D9@FEFED9FEFEAD9D9FEFEFED9FEFEJ(:'J)=%<&J"8"E%># ?D9FEFED9FED9FED9FED9FED9FE?FEFED9D9D9D9FEFED9D9D9D9D9FEFEFED96D9FED9D9D9D9D9D9J'9(J#J"=%<"B#># @D9FEFED9FED9D9FED9FED9FED9O"FEFE7FEFEFED9D9FEFEFEFEFEJ&9'J'=";,=,>' AD9FEFED9FEFED9FED9FED9MD9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFED9D9FEFEFEFED9D9D9FEFED9D9FEFEFEFED9J.J#:%:%@":%9&<%9s:%?# BD9FEFED9FED9FED9FED9FED9FE@D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9J,J" DD9FED9FED9FED9FED9FED9O,FEJ+J$ DFED9FEFEFED9FED9D9D9O,FEFED9J#9$J# DD9FEFED9FEO.D9D9J#9$ DFED9D9FED9J+ BFEFED9FED9FED9FED9FEJ+ CD9FED9FED9FED9FED9FEJv BD9 =z R3D8>z" R1D9FF>Z R1=z R3D9 Jz BO1FE Jz DO-D9 Jz FO)D8J" P FFJz" HO%D9FF JZJZ LKJKJ"J" OHD8OFD8Jz"Jz" O GD9D8MGD9D8 J#:#J#9# O(FEFEFEFEOBFEFEFEFEJ" Q&FEJ$8)9%J% O(D9FEFEFEFED9D9FEFEFEFEFEFEFEFEO?FEFEFEFEJ.J#:' O0FEFED9D9FEFED9FEFED9D9FEFEO7D9FEFEFED9D9FEFEJ'@% O)D9FEFEFEFED9FED9D9D9J"8":#9&J# O*D9D9FEFED9D9FEFEFEO9D9FEJ%9"8" O2D9D9D9D9D9FEJ(J" O4FEFED9FEFED9D9O;D9J.J' O0D9FEFEFEFED9D9D9FEFEFEFED9O=D9FEFEFEFED9J#:%9%J#9#8% O+D9D9D9D9D9D9D9D9D9D9O6D9D9D9D9D9D9D9D9 'J& F7F7F7F7F7F7R4F7F7F7F7F7'JzJzJ' F6F6F6F6F6F6HGD8O GD8HF6F6F6F6F6F68%J"J"J& F9F9F9F9GD8OFD8OBF9F9F9F9F7JzJz LKD9JKD9 JZ HO%J" GFFJz FO)D9 Jz DO-FE Jz BO1D9 =z"z"z 0F6F7Q>F6F71F6F7 ENDBITMAP %%EndBinary %%BeginBinary: 4795 254 162 101.6 64.8 0 420.4 342.2 /red < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000008EEF9AFF2CAEB6CF71E7 A24DF70055BE928AB2D3FF0055F7DB7DB2002CFF6120822C455D4571FF0000FF > store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000082D78AE78AEFEF0071E7 A24DF70055BE827530B6FFFF69DFDB7DB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000006DB675C755EFB60071E7 A24DF77D55BE9265618EE3002CB2DB7DB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F6F7R5F6F77F6F7J" S6F78z8z8z 5F9R4F95F9 z8z /F9REF9 J'J'J"9# P FEFEFEFEF9FE4FEFEFEF9FEFE?FEFEFEJ'J$J" OMFEFEF9F9F9FE4FEFEF9BFEJ$9"J%J# OLFEFEF9F97F9F9F9F9CF9F9J$9'9"8&8-8#:%9"8&:$9' P)FEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEAs"J,8%8"8$:"8"8"8):%8"8$:*8% F6F7O?F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEF9F9F9F9F9FEF9FEF9FEFEFEF9FEFEF9F9FEFEF9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEBrJ$<"H$9"9"<$F$<" F9ODF9F9F9F9F9F9F9F9F9F9FEFEF9F9F9F9AsJ"J% F7O@FEO!FEFEF9F9AtJ$9":$J"F$ F9O8F9FEFEFEFEF9FELFEFEF9FEJ28"9$8$8$8"8"8"9"9'8"8&8,8"9" OMF9FEFEFEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEF9FEFEF9FEFEF9FEFEFEFEFEFEF9F9FEFEF9FEF9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEJ&:$9z8w8'9r9$9s P F9F9F9F9F9F9F9F97F9F9F9F9F9F9F9F9F9F9F9F9F9 >z8z /F7REF7sF"J& F7F7RFF7F7F7F7F7(z' F6F6F6F6F6F6F7S*D9F6F6F6F6F6F68%J& F9F9F9F9S,F9F9F9F9F7 Ju BFEJ- AFEFED9FED9FED9FED9FED9FEJ/ @FEFED9FED9FED9FED9FED9FED9FEJ&r% ?FEFED9FED9FED9FED9FEJ%=& @D9FED9FEFED9FED9FEJ$?% @FED9FEFED9FED9J$9$9%J#J&J% @D9FED9D9FED9D9FED9FEBFEFEO2FEFED9FEFEMFEFEFEFEJ$9$9&J"8"J' @FED9FEFED9FEFED9FED9FE@FEFEP4FEFED9D9FEFEJ$9$9'J#9+<#9#8%8#8#;+9%>#9#<%8#8. @D9FED9D9FED9D9FED9FED9FE@D9D9FEFED9FEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED9FEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED9FEFED9FEFED9FEFEFEFEJ*9(J":"9"8'C'D"8.I'@"8'<' @FED9FED9FED9FED9FEFED9FED9FED9FE=FEFEFEFEFED9D9FEFEFEFED9D9FEFEFEFEFED9D9FEFED9FEFED9D9FEFEFEFED9D9FEFEFEFEFED9D9FEFED9D9D9FEFED9J):(J#A(J#=#A(=%A#D$ @D9FED9FED9FED9FED9FED9FEFEFED9GD9D9D9FEFED9FEFED96D9D9D9D9D9FEFED9FEFED9FED9D9D9D9D9FEFED9J(:(J#;":#J":#:$J&A":# @FED9FED9FED9FED9FED9FED9D9D9@FEFED9FEFECD9FEFEFEFEFE5D9D9FEFEFED9FEFEJ(:'J)=%<&J*@&>"8"E%># ?D9FEFED9FED9FED9FED9FED9FE?FEFED9D9D9D9FEFED9D9D9D9D9FEFEFED9;D9D9D9D9D9FEFED9D9D9FEFEFED9D9FED9D9D9D9D9D9J'9(J#J"F#J%<"B#># @D9FEFED9FED9D9FED9FED9FED9O"FEFE7FEFEFE:FEFED9D9FEFEFEFEFEJ&9'J'=";,B/>"?,>' AD9FEFED9FEFED9FED9FED9MD9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFED9D9FEFEFEFED9D9D9FEFEFED9FEFED9D9FEFEFEFED9D9D9FEFED9D9FEFEFEFED9J.J#:%:%@":%9&;#:%9v;">%9s:%?# BD9FEFED9FED9FED9FED9FED9FE@D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9J,J"J" DD9FED9FED9FED9FED9FED9O,FEO$FEJ+J$J$ DFED9FEFEFED9FED9D9D9O,FEFED9O"FEFED9J#9$J#J# DD9FEFED9FEO.D9D9O#D9D9J#9$ DFED9D9FED9J+ BFEFED9FED9FED9FED9FEJ+ CD9FED9FED9FED9FED9FEJv BD9 =z S*D8>z" S(D9FF>Z S(=z S*D9 Jz O O1FE Jz O"O-D9 Jz O$O)D8J" P,FFJz" O&O%D9FF JZJZ O*KO)KJ"J" P&D8P%D8Jz"Jz" O,GD9D8O,GD9D8 J#:#J#9# O4FEFEFEFEP!FEFEFEFEJ" Q?FEJ$8)9%J% O4D9FEFEFEFED9D9FEFEFEFEFEFEFEFEOLFEFEFEFEJ.J#:' OD9D9D9D9D9FEJ(J" O@FEFED9FEFED9D9OHD9J.J' O store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000DF82D78AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000E36DB675C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F6F7T,F6F77F6F7J" U-F78z8z8z 5F9T+F95F9 z8z /F9Tz8z /F7TFEFED9J-J# P8FEFED9FED9FED9FED9FED9FEQ=D9D9J%r$ P7FEFED9FED9FED9FEJ'<% P6FEFED9FED9FED9FED9FEJ'<% P7D9FED9FED9FED9FED9FEJ(=# P7FED9D9D9FED9FEFED9J#8%<# P7D9FED9FED9FED9FEJ#9%;#Jz P7FED9D9FED9FEFED9PDO)D8J#:%:#J" P7D9FED9FED9FED9FEPCD8J#;%9#Jz P7FED9D9FED9FEFED9PBO-D9J#<) P7D9FED9FED9FEFEFED9FEJ%<( P6D9FED9FED9FED9FED9FED9J%=% P7D9FED9FEFED9FED9J$r$JZ P8D9FED9FED9FED9P@O5J,J" P9D9FED9FED9FED9FED9FED9P@FFJ*Jz P:D9FED9FED9FED9FED9P@O9D9Jr P;D9Jz S3O=FE Jz S1O@D9 J#9#E#;#C#J#F# O%FEFEFEFEFEFEFEFEFEFEO1FEFEFEFEJ# QHD9D9J&9%;#<%<"8"8%=%9%9%9%9%9%=#;%8#9&8%9% O-FEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFEJ,9%:';"8);5;%9'B.JZ O/FED9FEFED9FEFED9D9FEFEFED9FEFEFEFED9D9FEFED9D9D9FEFED9D9FEFEIFEFED9D9FEFED9FEFED9D9FEFED9FEFED9D9FEFED9FEFED9D9FEFED9FEFED9D9FEFED9FEFED9D9FEFEFEFED9FEFEFED9D9FEFEFEFED9D9FEFED9FEFED9D9FEFEO1O-J":#="J#?#;#@%9%>"@(>#J" O/D9D9D9D9BD9D9D9D9D9D9FED9D9D9FED9D9D9D9D9FEFED9FEFED9D9D9PDD8J$E#J$I#9&8&E#J#Jz" O5FEFEFEFEFE8FEFEFEFEFED9D9FEFEFED9D9FEFEFEFEFE7FEFEO5O)D9D8J%E%J%I%9"8"9"8"D%8&D% O4FEFED9D9D9D9D9D95FEFED9D9D9D9D9D9D9FED9FED9D9D9D9D9FEFEFED9D9D9D9D9J(G"A#?"J#;#;(9%@"=#F#;# O%D9FEFED9FEFED9FEFEFEFE6FEFEFEFEFEFED9FEFED9D9FEFED9D9FEFEFEFEFEFEFEJ"A(8%:'<+;5;%9'9$<. O(FED9FEFEFED9FEFED9FEFED9D9FEFEFEFED9D9FEFED9D9FEFEFEFED9ID9FEFEFED9FEFED9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFEFEFED9D9FEFED9D9FEFEFEFED9D9FED9D9FEFEFEFED9D9D9FEFEFEFED9J&8#8#8v8#8%>#8%=v9%9%9%9%=&8%;":#8%9% O&D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 J%J# SGFEFEFEFE=FEFEJ' SFFEFED9D9FEFEJ$8(8&9%9% SEFEFED9D9D9D9FEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFEJ'93 SLFEFED9D9FEFEFED9FEFED9FEFED9D9FEFED9FEFED9D9FEFEJ#="># SLD9D9D9D9D9J$I# SMFEFEFEFEFEJ%I% SLFEFED9D9D9D9D9D9J$8#H#;# SED9FEFEFEFEFEFEFEFEJ.=. SFD9FEFEFEFED9D9FEFEFED9FEFED9FEFEFEFED9D9D9FEFEFEFED9J%8s8#8%9%8# SGD9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 'J& F7F7F7F7F7F7U"F7F7F7F7F7'JzF' F6F6F6F6F6F6S7O)D8F6F6F6F6F6F68%J"J& F9F9F9F9S6D8O:F9F9F9F9F7Jz S;O-D9 J" S)FF=z"z"z 0F6F7T,F6F71F6 store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000086FFDF8AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000008EFFEF75C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F4F5OGF4F57F4F5J" PHF58z8z8z 5F8OFF85F8 z8z8z8z /F8O5F8/F8/F8 J#>$ O)FEFEFEFEFEJ"Js" O3F8O"F4F5J#Jr O)F8F8O,F8J09%;# JFEFEFEF8FEFEFEFEF8FEFEFEFEFEFEFEFEFEFEFEFEAs"J"9"8':%;%J$ F4F56F8F8F8F8F8FEF8F8FEF8F8F8FEF8FEFEz8z8z8z /F5O5F5/F5/F5sF"J"F"F& F5F5O6F5F5F5F5F5F5F5(z' F4F4F4F4F4F4F5PF8F8F8F8F5 Gz P(FE Gz P(D9 J% O"FEFEFEFEJ' O!FEFED9D9FEFEJ$8(8&8#9#8%9% O FEFED9D9D9D9FEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEJ'9%?. O'FEFED9D9FEFEFED9FEFEFEFED9D9FEFED9FEFED9D9FEFEJ#=":+=% O'D9D9D9D9FEFED9FEFED9D9D9D9FED9D9D9J$I$9& O(FEFEFEFEFEFED9D9FEFEFEJ%A&8%;"8" O'FEFED9D9D9FEFEFED9FEFED9D9D9FEJ$8#J% O D9FEFEFEFE=FEFED9D9'J.?$9.J& F5F5F5F5F5F5ID9FEFEFEFED9D9FEFEFED9FEFED9FED9D9FEFEFED9FEFED9FEFEFEFED9GF5F5F5F5F5'J%8s8#:";vJ' F4F4F4F4F4F4JD9D9D9D9D9D9D9D9D9HF4F4F4F4F4F48%J& F8F8F8F8P>F8F8F8F8F5 =z"z"z 0F4F5OGF4F51F4 store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000086FFDF8AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000008EFFEF75C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F4F5Q"F4F57F4F5J" R#F58z8z8z 5F8Q!F85F8 z8z8z8z /F8P>F8/F8/F8 J#>$ ODFEFEFEFEFEJ"Js" P F8O>F4F5J#Jr ODF8F8OHF8J09%;# O7FEFEFEF8FEFEFEFEF8FEFEFEFEFEFEFEFEFEFEFEFEAs"J"9"8':%;%J$ F4F5O#F8F8F8F8F8FEF8F8FEF8F8F8FEF8FEFEO*F4F4F5BrJ$9%=%:"J" F8O%F8FEFEFEF8FEF8FEFEFEF8F8O.F8AsJ"9"J# F5O5F8FEO2F5F5AtJ)=%J$ F8O%F8FEFEF8F8FEFEF8FEF8F8F8O3F8F8F8J"8"8'8"9" OCFEFEFEFEFEF8F8FEFEFEJ#8#9t8sJs O:F8F8F8F8F8F8O7F5Jt Q?F8 >z8z8z8z /F5P>F5/F5/F5sF"J"F"F& F5F5P?F5F5F5F5F5F5F5(z' F4F4F4F4F4F4F5QED9F4F4F4F4F4F48%J& F8F8F8F8QGF8F8F8F8F5 Gz P(FE J% PDFEFEFEFEJ' PCFEFED9D9FEFEJ$8(8&8#9#8%9% PBFEFED9D9D9D9FEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEJ'9%?. PIFEFED9D9FEFEFED9FEFEFEFED9D9FEFED9FEFED9D9FEFEJ#=":+=% PID9D9D9D9FEFED9FEFED9D9D9D9FED9D9D9J$I$9& PJFEFEFEFEFEFED9D9FEFEFEJ%A&8%;"8" PIFEFED9D9D9FEFEFED9FEFED9D9D9FEJ$8#J% PBD9FEFEFEFE=FEFED9D9J.?$9. PCD9FEFEFEFED9D9FEFEFED9FEFED9FED9D9FEFEFED9FEFED9FEFEFEFED9J%8s8#:";v PDD9D9D9D9D9D9D9D9D9 'J& F5F5F5F5F5F5QFF5F5F5F5F5'J' F4F4F4F4F4F4QFF4F4F4F4F4F48%J& F8F8F8F8QGF8F8F8F8F5 Gz P(D9 =z"z"z 0F4F5Q"F4F51F4 store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000086FFDF8AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000008EFFEF75C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F6F7OGF6F77F6F7J" PHF78z8z8z 5F9OFF95F9 z8z8z8z /F9O5F9/F9/F9 J#>$ O)FEFEFEFEFEJ"Js" O3F9O"F6F7J#Jr O)F9F9O,F9J09%;# JFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEAs"J"9"8':%;%J$ F6F76F9F9F9F9F9FEF9F9FEF9F9F9FEF9FEFEz8z8z8z /F7O5F7/F7/F7sF"J"F"F& F7F7O6F7F7F7F7F7F7F7(z' F6F6F6F6F6F6F7PF9F9F9F9F7 J% O"FEFEFEFEJ' O!FEFED9D9FEFEJ$8(8&8#9#8%9% O FEFED9D9D9D9FEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEJ'9%?. O'FEFED9D9FEFEFED9FEFEFEFED9D9FEFED9FEFED9D9FEFEJ#=":+=% O'D9D9D9D9FEFED9FEFED9D9D9D9FED9D9D9J$I$9& O(FEFEFEFEFEFED9D9FEFEFEJ%A&8%;"8" O'FEFED9D9D9FEFEFED9FEFED9D9D9FEJ$8#J% O D9FEFEFEFE=FEFED9D9J.?$9. O!D9FEFEFEFED9D9FEFEFED9FEFED9FED9D9FEFEFED9FEFED9FEFEFEFED9J%8s8#:";v O"D9D9D9D9D9D9D9D9D9 Gz P(FE 'J& F7F7F7F7F7F7P=F7F7F7F7F7'J' F6F6F6F6F6F6P=F6F6F6F6F6F68%J& F9F9F9F9P>F9F9F9F9F7 Gz P(D9 =z"z"z 0F6F7OGF6F71F6 store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000086FFDF8AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000008EFFEF75C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F4F5Q'F4F57F4F5J" R(F58z8z8z 5F8Q&F85F8 z8z8z8z /F8PCF8/F8/F8 J#>$ OGFEFEFEFEFEJ"Js" P#F8O@F4F5J#Jr OGF8F8OJF8J09%;# O:FEFEFEF8FEFEFEFEF8FEFEFEFEFEFEFEFEFEFEFEFEAs"J"9"8':%;%J$ F4F5O&F8F8F8F8F8FEF8F8FEF8F8F8FEF8FEFEO,F4F4F5BrJ$9%=%:"J" F8O(F8FEFEFEF8FEF8FEFEFEF8F8O0F8AsJ"9"J# F5O8F8FEO4F5F5AtJ)=%J$ F8O(F8FEFEF8F8FEFEF8FEF8F8F8O5F8F8F8J"8"8'8"9" OFFEFEFEFEFEF8F8FEFEFEJ#8#9t8sJs O=F8F8F8F8F8F8O9F5Jt QDF8 >z8z8z8z /F5PCF5/F5/F5sF"J"F"F& F5F5PDF5F5F5F5F5F5F5(z' F4F4F4F4F4F4F5QJD9F4F4F4F4F4F48%J& F8F8F8F8QLF8F8F8F8F5 Jz O?P(FE J% 7FEFEFEFEJ' 6FEFED9D9FEFEJ$8(8&8#9#8%9% 5FEFED9D9D9D9FEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEJ'9%?. store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000006DFFB669F7AE869A86FFDF8AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000005DDF9E71FFBA8E9A8EFFEF75C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F6F7S F6F77F6F7J" T!F78z8z8z 5F9RMF95F9 z8z8z8z /F9R">"8"B"E"I"J"Js" EF9F9F9F9FEF9F9F9F9F9F9F9F9F9F9F9O)FEFF6F7J"J"9#J%@#<#Jr KF9CF9F9F9O9FEF9FEFEF9F9FEFEOBF9J+9"80;"9$:$?#I%<#;$J$9-9'8#;$8'9"8# JFEF9F9F9FEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEF9F9FEFEFEF9FEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEAs"J#:"8%8"8$8":&9#8$:'<&I%:-B'>":)8%8"8)8)8%8"8#J$ F6F74FEFEF9FEF9FEFEF9F9F9F9FEF9F9F9FEF9FEFEF9F9F9FEFEFEF9FEFEFEFEFEF9FEF9F9FEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9F9F9FEFEF9FEFEF9F9FEFEF9F9FEF9FEFEF9FEF9FEFEFEF9FEFEFEFEFEF9FEFEF9F9FEF9FEFEF9F9F95F6F6F7BrJ#="C*:#B"@$H$<$<"E$J">"9">"<"J" F95F9F9F9F9F9F9F9FEFEF9FEF9F9F9FEF9F9F9F9FEFEF9F9F9FEFEFEFE9F9F9F9FEF9@F9AsJ$J"@%J'D%A)B'J%J# F77F9F9FEAF9F9F9F9F9:FEF9FEFEF9F9F9F9F9F9FEF9F9F9F9F9FEFEF9FEFEFEFEF99F9F9F9F9DF7F7AtJ"J%H%>$D";">";%J&J%J$ F97FE7F9FEFEF9FEF9FEFEFEF9FEFEFEFEFEF9FEFE?FEF9F9F9F9:FEF9FEFEDF9F9F9J"8$9"8"9"8&8"?"8";"8+8(8";"8$9%8"808";$9"8$8$8"8(8"9$8"9"9+8"9"8$ EFEFEFEFEFEFEFEF9FEFEF9FEFEFEFEFEFEF9F9F9FEFEFEF9F9FEFEF9F9F9FEFEF9FEFEFEFEFEF9FEFEF9FEF9FEFEFEF9F9F9F9F9FEFEFEF9F9FEFEFEFEFEFEFEF9FEFEF9FEFEFEFEFEFEFEF9FEFEFEF9FEFEFEFEF9F9F9FEFEFEF9F9FEFEFEF9FEFEJz9r;"9%;%9$8%9';s8w;$8%;$9z;"z9$8s9#Js E1F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F90F9FE5F9F9F9F9F9F9F9DF7J%J&Jt O3FEFEFEF9P-FEF9F9F9F9OBF9J"J( O5F9P.F9FEFEFEFEFEF9>z8z8z8z /F7RFFJZ P9Q% J#9# 5FEFEFEFEJ" 7FEJ%8*9%9# >FEFEFEFEFED9FEFEFED9FEFEFEFEFEFEFEFEFEJ#:'81 7D9FEFEFED9D9FEFEFED9D9FEFED9D9FEFED9FEFED9D9FEFEJ#J# =D9D98D9D9J#:$F# 8D9FEFEFEFEFEFEJ%F% =FEFED9D9D9D9D9D9J"J#8# 9D99FEFEFEFEJ(A' =D9FEFEFED9FEFED9FEFEFEFED9J#9#8s8#8#8%9# 5D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 J" P8FFJz P7Q(D9 Jz P7Q(D4J" S>FFJZ P9Q% J#=#;# 8FEFEFEFEFEFEJ"8" 7FEFEJ#:#;#:+9%9%9# 8D9D9FEFEFEFEFEFED9FEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEJ":'9%;"85 6FEFED9FEFED9FEFEFED9FEFE4FEFED9D9FEFED9FEFED9D9FEFED9FEFED9D9FEFEJ"<"<#?%9%8# @D9D9D9D9FED9D9D9FED9D9D9D9D9J#I":#9&8& 8FEFED9FEFED9D9FEFEFED9D9FEFEFEJ)J%9"8"9"8" 5FEFED9D9D9D9FEFE5D9D9D9D9D9FED9FEJ"<"B(9%:# @FEFEFEFED9FEFED9D9FEFED9D9FEFEJ%9%>5 =D9FEFED9D9FEFED94D9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFEFEFED9J#:s8s:%9%9%9# 5D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 J" P8FFJz P7Q(D9 Jz P7Q(D4J" S>FFJZ P9Q% J*J#9#I# 5FEFEFEFEFEFED9FEFE?FEFEFEFEFEFEJ&J" 7D9D9D9FEFECFEJ#9%8&9%E#8-;#9%8) ?FEFEFEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFED9FED9FEFEFED9FEFEFEFEFEFEFEFEFEFEFED9FEFED9FEFE'J,9,>#B*9,9"J& F7F7F7F7F7F78FED9FEFED9FEFED9D9FEFEFED9FEFED9FEFED9D9FEFED9FEFED9D9FEFED9D9FEFEFED9FEFED9FEFED9D9FEFEFEQ>F7F7F7F7F7'G&8"C"J"D&J' F6F6F6F6F6F6FEFEFEFED9D9D9LD9D9D9D9D9D9Q9F6F6F6F6F6F68%G%J#A#J#;"J& F9F9F9F9D9D9D9D98FEFED9FE>FEFED9Q?F9F9F9F9F7J%J% O%D9D9D9D9ID9D9D9D9J#@"<"F">#=# O'FEFED9FEFEFEFEFEFEJ'>'D%F, CD9FEFEFEFED9D9FEFEFEFED9D9FEFED9D9FEFED9D9D9FEFEFEFED9J#;#8#8%8#8#8%=#9#8s8#8s9%8#:# 5D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 J" P8FFJz P7Q(D9 =z"z"z 0F6F7S F6F71F6 store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000082D78AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000006DB675C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F4F5P&F4F57F4F5J" Q'F58z8z8z 5F8P%F85F8 z8z8z8z /F8OBF8/F8/F8 JrG$<'D":" :FEFEFEFEFEFEFEFEFEFEFEFEJ"8&F">"8%B":"Js" :F8F8F8F8FEFEF8F8F8F8FEFEFEFEKF4F5Jr PDF8J(9%;#B(8"8$8#8$9' CFEFEFEF8FEFEFEFEFEFEFEFEFEFEFEFEF8FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF8FEFEAs"A&9":%;%;%8"9":"8$8,8%A$ F4F5FEFEF8F8F8F8FEF8F8F8FEF8FEFEFEFEFEF8F8F8F8F8F8F8F8F8FEFEFEF8FEFEFEF8F8FEF8FEFEF4F4F5Br@%B%:">&J$<"E" F8FEFEFEF8FEFEFEF8F8F8F8F8FEFE6F8F8F8F8F8As@$B"9"J# F5F8F8F8F8FEO2F5F5AtI":%J"F$J$ F8FEFEF8F8F88FEFEF8FE5F8F8F8J"8"<%8"8'8"9$8&8%8"8$8.8"9" :FEFEF8FEFEF8FEFEFEFEF8F8FEFEFEF8FEFEFEFEFEF8F8FEFEF8FEF8FEFEF8FEFEF8F8F8FEFEFEF8F8F8FEFEFEJ%=v8z:'9#9#9$9sJs :F8F8F8F8F80F8F8F8F8F8F8F8F8F8F8F8F8F8F8F88F5Jt PCF8 >z8z8z8z /F5OBF5/F5/F5sF"J"F"F& F5F5OCF5F5F5F5F5F5F5(z' F4F4F4F4F4F4F5PID9F4F4F4F4F4F48%J& F8F8F8F8PKF8F8F8F8F5 Iz P1FE Jz 5P-D9 Jz 7P)D8J" P?FFJz" 9P%D9FF JZ =OKJ" P9D8Jz" ?OGD9D8 J'E#<'@#9# GFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEJ&J& ID9D9D9FEFE8D9D9D9FEFEJ#8#8%;#A#8%8$8"8%8& O FEFEFEFEFEFEFEFEFEFEFEFEFEFED9FEFED9FEFEFEFEFEFEFEFED9FEFEJ'9%G"8$8)9% O'FEFED9D9FEFEFED9FEFED9D9D9D9D9D9FEFED9D9FEFEFED9FEFEJ&?%9"=&J" IFEFEFEFED9FED9D9D9D9FEFEFEFED9;D9J%>&B& ID9D9D9D9D9D9FEFEFED9D9D9FEFEJ"8" O)D9FEJ"9%J"=":" O#FEFEFED9D96FEFEFEJ%9'A+:0 O D9FEFED9D9FEFEFEFED9FEFEFEFED9D9D9FEFED9D9FEFED9D9D9FEFED9D9FEFEFEFED9J#<&8%8#8#8'9&9#9#8%8#8# GD9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 Jz ?OGD8J" >D8Jz =OKD9 'IZH& F5F5F5F5F5F5P%F5F5F5F5F5'H"J' F4F4F4F4F4F4FFP7F4F4F4F4F4F48%GzG& F8F8F8F8P)D9F8F8F8F8F5 Jz 5P-FE Iz P1D9 =z"z"z 0F4F5P&F4F51F4 store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000082D78AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000006DB675C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F6F7R?F6F77F6F7J" S@F78z8z8z 5F9R>F95F9 z8z8z8z /F9R-F9/F9/F9 J&C"9#I%9% OFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEJ(A"J"?"Js" OEFEFEF9F9F9FEFEFE9F9F9P.F6F7J$9$E#Jr ODFEFEF9F9FEFEF9F9PMF9J'9"8&:$9';'<$8'9( OMFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEF9FEFEF9FEF9FEFEFEFEFEFEF9FEFEFEFEFEF9FEFEFEAs"J"8(8$:*8%D)8%8"9"J$ F6F7O9F9FEF9FEFEFEF9F9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEFEFEFEF9FEFEF9F9FEF9FEFEF9F9O8F6F6F7BrJ$E$<"J"<"J" F9O=F9F9F9F9F9F9F94FEF9OCF9AsJ%=%J# F7P3F9FEFEF9F9F9F9F9OGF7F7AtJ$9$9$E$J%D"J$ F9O0F9FEFEFEFEF9FEF9FEFEF9FE:FEF9FEFEFEO8F9F9F9J(:&8&8,8"9&:"8+8"9"8%8" OEF9FEFEFEFEFEF9F9FEFEF9F9F9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEF9FEFEFEFEFEF9F9F9FEFEFEF9F9FEFEFEF9FEFEF9FEJ&<#;r9$9z9$8s9'Js OFF9F9F9F9F9F9F9F9F9F9F94F9F9F9F9F9F9F9F9F9F9F9OCF7Jt S.F9J"8" OMFEFE>z8z8z8z /F7R-F7/F7/F7sF"J"F"F& F7F7R.F7F7F7F7F7F7F7(z' F6F6F6F6F6F6F7S4D9F6F6F6F6F6F68%J& F9F9F9F9S6F9F9F9F9F7 JZ Q'P*J" S0D8Jz" Q)P&D9D8 J%J#8#J&H#J#:# 7FEFEFEFE>FEFEFEFE5FEFEFEFEFEFEFEO*FEFEFEFEJ'J#J(J# 6FEFED9D9FEFEAD9D94FEFED9D9D9FEFEOCD9D9J$8*9%8+8"8+9&D#9#8%8"8"8%8*9%9#J)8#8&8#JW 5FEFED9D9FEFED9FEFED9FEFEFEFEFEFEFEFED9FEFED9FEFEFEFEFEFED9FEFED9FEFED9FEFEFEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED9FEFEFED9FEFEFEFEFEFEFEFEFE@FEFED9FEFED9FEFEFEFEFEFED9FEFEFEFE=J,9"8)8"<*>(?)8)81J%J" @FED9FEFED9FEFED9D9FEFEFEFEFED9D9FEFED9D9D9FED9FEFED9FEFED9FED9FEFEFED9D9D9FEFED9D9FEFED9D9D9D9FEFED9D9FEFEFED9D9FEFED9D9FEFED9FEFED9D9FEFEIFED9FEFEO(D8J"D%E"="?&8(9%J%8#J"A'Js" @D9D9D9D9D9D9D9D9D9FEFEFED9FEFED9FEFED9FED9D9D9:FED9D9D9D9D9ED9D9FEFEFEFED9?D9D8J#;"9$J"8"?&?#D&J"8" GFEFED9FEFEFEAD9FED9D9FEFEFEFEFED9D9FEFEFEO)D9D9J%<%J#8":&:"8">%D"8"J"8"Js GD9D9D9D9FEFED9D9>FEFED9D9FEFEFED9D9FED9D9D9D9D9FEO(FEFE@D8J$8$9">#G"C"J%=":#B%:#J"9'J" 5D9FEFEFEFED9FEFEFEFEFE8FEFED9D9FEFEFEFEFED9D9FEFEMFEFEFED9D9FEFE>D8'F':,<-@%>(9";'8+B'J%@%JwJ& F7F7F7F7F7F7D9FEFEFEFED9D9FEFED9D9D9FEFEFEFED9D9FEFEFED9FEFED9D9FEFED9D9FEFED9D9FEFEFEFEFED9D9D9FEFEFEFED9D9FEFED9D9FEFEFEFED9D9FEFEFEFED9@FEFEFEFED9FEFED9FD96F7F7F7F7F7'G%<#9%8#:'8s8#8#@&<":%:#8%8#8#8#8%9#Jv8#8s8#J' F6F6F6F6F6F6D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9:D9D9D9D9D9D9O1F6F6F6F6F6F68%J#J"J& F9F9F9F9O3FEFE4FEQ:F9F9F9F9F7J'E$ O9D9FEFEFEFED9FEFED9J#J%F# >D9D9HD9D9D9D9D9D9 Jz Q)P&D8J" Q(D8Jz Q'P*D9 =z"z"z 0F6F7R?F6F71F6F91F9 7z8z8z 6F7R>F75F7"J"J" F77F7R?F7 ENDBITMAP %%EndBinary 324 185 531 302 R 7 X V 4 8 Q 0 X (Optionmenu .om \134) 324 296.67 T ( -labeltext \322Operating Systems:\323 \134) 324 286.67 T ( -items {SunOS HP/UX AIX OS/2 Windows} \134) 324 276.67 T ( -command SelectProc) 324 266.67 T (pack .om -padx 10 -pady 10) 324 256.67 T (.om insert end Linux VMS) 324 236.67 T (.om disable DOS) 324 226.67 T (.om delete 1 2) 324 216.67 T (.om sort ascending) 324 206.67 T (.om select Linux) 324 196.67 T (.om conf) 324 186.67 T (igure -cyclicon true) 362.4 186.67 T 0 10 Q (FIGURE 18) 375.73 160.17 T 1 F ( - Optionmenu) 427.11 160.17 T 0 0 612 792 C FMENDPAGE %%EndPage: "11" 11 %%Page: "12" 12 612 792 0 FMBEGINPAGE [0 0 0 1 0 0 0] [ 0 1 1 0 1 0 0] [ 1 0 1 0 0 1 0] [ 1 1 0 0 0 0 1] [ 1 0 0 0 0 1 1] [ 0 1 0 0 1 0 1] [ 0 0 1 0 1 1 0] 7 FrameSetSepColors FrameNoSep 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 1 10 Q 0 X 0 0 0 1 0 0 0 K (by side, manner) 72 713.33 T (. A value may be entered into the entry) 135.05 713.33 T (area explicitly or the buttons may be pressed which) 72 701.33 T (cycle up and down through the choices. This latter) 72 689.33 T (behavior is one of spinning.) 72 677.33 T (The following code segment creates a month spinner) 72 653.33 T (based on the Spinner class. The months are stored in a) 72 641.33 T (list from which the spinMonth procedure cycles. The) 72 629.33 T (Spinner increment and decrement options invoke this) 72 617.33 T (procedure with a direction ar) 72 605.33 T (gument which is 1 or -1.) 187.34 605.33 T (The Spinner disables input by making the blockInput) 72 593.33 T (procedure the validation procedure which always) 72 581.33 T (returns invalid.) 72 569.33 T 72 167 297 566 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 72 206 297 548 R 7 X 0 0 0 1 0 0 0 K V 0.5 H 2 Z 0 X N %%BeginBinary: 3312 179 73 92.06 37.54 0 144 503 /red < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000096FB7DFFCF9A96FB69FBB29AFF2CAEB6CF71E7 A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF > store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000096FB6DFFB66996FB86FFDF8AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000009AFF5DDF9E719AFF8EFFEF75C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F6F7PFF6F77F6F7J" QGF78z8z8z 5F9PEF95F9 z8z8z8z /F9P4F9/F9/F9 J'@# O*FEFEFEFEF9FEFEFEJ'Js" O)FEFEF9F9F9FEP&F6F7J"A#Jr O.F9F9F9OHF9J#8(9$8'9';$8' O+FEFEF9FEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFEFEFEF9FEFEFEFEFEFEFEFEF9FEFEAs"J"9%8(:"8%8"8%8)8"J$ F6F7CF9FEFEF9F9FEF9FEFEFEF9F9F9FEF9FEFEF9FEF9FEFEFEFEFEF9FEFEF9F9FEHF6F6F7BrJ#9"9$A">">"<$J" F9EF9F9FEF9F9F9F9F9FEF9F9F9GF9AsJ"8#J%J# F7DFEF9F9DF9F9F9F9MF7F7AtJ">$J%J$ F9DFEFEF9FEz8z8z8z /F7P4F7/F7/F7sF"J"F"F& F7F7P5F7F7F7F7F7F7F7(z' F6F6F6F6F6F6F7Q;D9F6F6F6F6F6F68%J& F9F9F9F9Q=F9F9F9F9F7 Jz8U O:O>D3J"9s" Q)FFD9D8Jz"=" O%9'<$J"D& F7F7F7F7F7F79D9FEFEFEFED9D9FEFED9:D4FEFEFED4D4FEFEFED4FED4FEFED4D4FEFEFED4FED4FED4FD9F7F7F7F7F7'E#8"8#8%8#8#9&8#<#C$:r9"9%9rJ"I' F6F6F6F6F6F6D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D4D4D4D4D4D4D4D4D4D4HD9F6F6F6F6F6F68%J#J"F& F9F9F9F9P2FED4FD9F9F9F9F9F7J#J" P7FED4DD9J"J" P7D4GD9JZ>" OD9D9 =z"z"z 0F6F7PFF6F71F6 11} {set index 0}) 81 358.67 T ( .sm delete 0 end) 81 338.67 T ( .sm insert 0 [lindex $months $index]) 81 328.67 T (}) 81 318.67 T (spinner .sm \134) 81 298.67 T ( -labeltext \322Month : \322 \134) 81 288.67 T ( -width 10 -f) 81 278.67 T (ixed 10 \134) 157.8 278.67 T ( -validate blockInput \134) 81 268.67 T ( -decrement {spinMonth -1} \134) 81 258.67 T ( -increment {spinMonth 1}) 81 248.67 T (.sm insert 0 January) 81 238.67 T (pack .sm -padx 10 -pady 10) 81 228.67 T 0 10 Q (FIGURE 19) 143.17 181.17 T 1 F ( - Spinner) 194.56 181.17 T 0 0 612 792 C 0 12 Q 0 X 0 0 0 1 0 0 0 K (Spinint) 408.82 712 T 1 10 Q (The most common data type for which spinning behav-) 315 693.33 T (ior is useful is that of integers. The Spinint class of) 315 681.33 T (fers) 518.42 681.33 T (this capability by specializing the Spinner class. Addi-) 315 669.33 T -0.07 (tional options are provided which allow speci\336cation of) 315 657.33 P -0.25 (a step and range values which vary and limit the cycling.) 315 645.33 P ( The following example creates a water temperature) 315 621.33 T -0.54 (integer spinner widget labeled appropriately) 315 609.33 P -0.54 (. The widget) 488.84 609.33 P (options limit the range of values to between freezing) 315 597.33 T (and boiling, speci\336es a step value of two, enables wrap-) 315 585.33 T (ping, and orients the buttons in a side by side fashion.) 315 573.33 T 0 12 Q (Spindate) 404.83 394.71 T 1 10 Q (The spindate class creates a set of spinners for use in) 315 370.05 T -0.29 (date entry) 315 358.05 P -0.29 (. The set includes three spinners con\336gured to) 353.77 358.05 P (support day) 315 346.05 T (, month and year entry) 361.29 346.05 T (. Options allow con-) 450.9 346.05 T (trol over the display of each spinner) 315 334.05 T (, the format of the) 458.46 334.05 T (month, and the orientation.) 315 322.05 T 315 422.71 540 570 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 315 450.43 540 561 R 7 X 0 0 0 1 0 0 0 K V 0.5 H 2 Z 0 X N %%BeginBinary: 4730 255 73 131.14 37.54 0 363.14 513.86 /red < 3EC472FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080 8080808080808080808080808080808080808080404040404040404040404040 4040404040404040404040000000000000000000000000000000000039C069DD 00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A EFD39765E1A36FE700FF5500557FB22EAFB4CD73E6A24DBF99FFFFB07AFFB0CC F5008788439D58D750D080C0C080C0808060C000FFA000FF20C0A040C040D0BE 8BD28BD9B3FF7260F0E010B499FFA00019BF2FFF6223852F465F4770FF0000FF > store /green < 57D79F00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B59765E1A36FE700FF1A006B7FB28BEEEE0073E6A24DBF99FFFFB094FF30F7 F500CE884DB358D78080C0C080C080808060C08000A080402070A0402040D0BE 5BB477D9B3FF77F0F0E010B489E4A0FF19264F00B641DE4F829E4780FF0000FF > store /blue < 8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B59765E1A36FE7BFCC8BEE2F7FB257EEB40073E6A24DBF6BFBB3B015326024 F580FA8856CA58D7D050C080C08080C08060C080FF0000402070C0802040D0BE 7A8C65D9B3E0856050E010B476C4A00070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7R8F6F76F6F7J" S7F78z8z8z 4F9R7F94F9 ;z" S.F7F6'9"8# P$FEFEF9FEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFEFEFEF9FEFEFEFEFE@s"J"9%8(:"8%="8%8"8#J$ F6F7O=F9FEFEF9F9FEF9FEFEFEF9F9F9FEF9FEFEF9FEF9FEFEF9F9F9OAF6F6F7ArJ#9"9$A"C"J" F9O?F9F9FEF9F9F9F9F9OLF9@sJ"8#J# F7O>FEF9F9P?F7F7@tJ">$J$ F9O>FEFEF9FEP7F9F9F9J'9(8$8"9$8$8"9"8$ P#F9FEFEFEFEF9F9FEFEF9F9F9FEFEF9FEFEFEF9FEFEF9FEFEFEF9FEFEJ';#9z9#Js P"F9F9F9F9F9F9F9F9;F9F9F9P"F7Jt S&F9J"8" P)FEFE=z8z8z8z /F7R&F7/F7/F7rF"J"F"F% F7F7R'F7F7F7F7F7F7'z& F6F6F6F6F6F7S-EDF6F6F6F6F68$J% F9F9F9S/F9F9F9F7 J5=4;4 Q&IC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FFEDFFEDFFEDFFEDFFEDFFEDFFEDFFEDFFEDFFFFEDFFEDFFEDFFEDFFEDFFEDFFEDFFEDFFEDFFJ5<"r#u:"z$ Q&IFEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FFFFEDFEFEEDFF0FEEDEDEDJ#z#<"<"A":"H" Q&C0FEEC0FFC0EDFEFEEDFEJ#J#<"?">":"E"8" Q&FEC0EC0FFFFFEEDFFEDEDJ#J#<";"B":#G" Q&C0FEEFFC0EDFEFEEDEDFEI#8#8#>#HsJ#J#9$:$J#<"@"=":"D"9" FEFEFEFEFEFEFEFEFEMFEFE@FEC0FEFEFEFEFEFE8C0FFFFFEEDFFEDEDJ$8$J#8&8&J#<":"C":$F" O+EDEDEDEDEDEDOAC0FEFEC0C0C0FEFEC0C0C0FE7FFC0EDFEFEEDEDEDFEJ%8"8"8%8&C%8*8&9%8+8"8%8.9#>#8"<"J#<"A"<":"C":" >FEFEFEFEFEFEFEFEFEFEFEFEEDFEFEFEFEFEFEFEEDFEFEFEEDFEFEFEFEFEEDFEFEFEFEFEFEFEFEEDFEFEEDFEFEFEFEFEFEEDFEFEFEFEEDFEFEEDFEFEEDFEFEFEFEFEFEFEC0C0C0;C0FFFFFEEDFFEDEDI">*8)9"D'8*9,9"8)8"@"8'B#:$;#J#<"9"D":"8"E" EDEDFEFEEDEDFEFEEDEDEDEDFEFEEDEDFEFEFEFEFEEDEDFEFEFEEDEDFEFEEDEDFEFEFEEDFEFEEDFEFEEDEDFEFEFEFEFEEDEDFEFEEDEDEDFEFEFEEDEDFEFEC0FEFEFEC0FEC07FFC0EDFEFEEDEDFEJ":"8#J#J"D%J#>#>#:$:#J#<"B";":"B";" 5FEFEEDED4EDED@EDEDEDEDED4EDEDEDEDFEC0C0C0FEFEC08C0FFFFFEEDFFEDEDJ$@#;"F#J#;"9$G":#D#@#J#<"8"E":"9"D" >FEFEFEFEFEEDFEFE7FEFEEDFEFEFEEDFEFEC0FEFEC09FFC0EDFEFEEDEDFEJ.@%J%J%<%J%B#8"<#J#<"C":":"A"<" 4EDFEFEEDEDFEFEEDEDFEFEEDEDEDEDEDED4EDEDEDED5EDEDEDEDFEFEEDED6EDEDEDEDFEC0FEFEC0:C0FFFFFEEDFFEDEDJ":#J#D">#G"9"B#8#>#J#<$F":":"C" HFEFEFE6FEFEFEFEFEFEFEFEFEFEFEC0FEEFFC0EDEDFEFEEDEDFEJ3H'D,<1>'B#8&9%J#<"D"9":"@"=" =EDFEFEFEEDFEFEEDEDFEFEEDEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEEDEDEDFEFEFEFEEDEDFEFEFEEDFEFEEDEDFEFEEDEDFEFEEDEDFEFEFEFEEDFEC0C0FEFEFEC0FEFEFEFE7C0FFFFFEEDFFEDED&F#8#9'8#8%8#@#:%8#8#8#:#9%8#:'8#8s:%9#>#9$9&J#<#G":";"B"D% F7F7F7F7F7EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDC0FEC0C0C0C0C0C0C0C07FFC0EDFEFEEDEDFEF7F7F7F7&J#J#<"E"8":"?">"D& F6F6F6F6F6Q!FEC0EC0FFFFFEEDFFEDEDF6F6F6F6F68$J#J#<"H":"<"A"E% F9F9F9Q!C0FEEFFC0EDFEEDEDFEF9F9F9F7J#J#J#<"F$:">"?" OEEDEDO-FEC0EC0FFFFFEEDEDFFEDEDJ5 store /green < D79F0000000000000000000000000099DEFFFFFFBFBFBFBFBF80808080804040 4040000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFF FFFFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF80 808080804040400000000000FFFFFFBFBFBFBFBF808080408BEEEE0073E6A2F5 99FFFF30B094FFF700CE8858D74DB38080C0C080C0808060C08000A080402070 A020D0F0F0E010B489E4BE5B77D9FFFFA0404040400063E0B500996699FF0066 3399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69E3B5BF804040 9765E1A36FE700FF1A004DB2B477B39519264F00B641DE4F829E4780FF0000FF > store /blue < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF 8000BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF80 4000FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FF BF804000FFBF00FFBF804000BF8040FFBF804000FFBF40FF57EEB40073E6A2F5 6BFBB360B015322480FA8858D756CAD050C080C08080C060C080FF0000402070 C020D06050E010B476C4BE7A65D900E0A0BF8040004063E0B500FF3399FF8866 6666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69E3B5BF808040 9765E1A36FE7BFCC8BEE4DB28C85B3ED70264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7OMF6F76F6F7J" PLF78z8z8z 4F9OLF94F9 ;z" PCF7F6FF7FFFADFEFEADFEJ#J#:#:";":# O17FFE>7FFFADFFFEFEFEADJ#;#F#8#B#<"J#:#9"="9# 4FEFEFEFEFEFEFEFEFE7FFE7FF7FFFADFEFEADFEJ#J#:#8"?"8# O17FFE>7FFFADFFFEFEFEADJ"9":%8&8"8":#?#@$9%@#:#8v8# 6FEFEFEFEFEFEFEFEADFEFEFEFEFEFEFE7FFEFEFEFE7FFEFEFF7FFFADADADFEJ'9'8"9%>#?&9%?#:4 >FEFEADADFEFEFEADFEFEADADADFEADFEFE7FFEFE7F7F7FFEFE7F7FFE7FFFADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ$C"A"A#?"="B#:4 7FEADFEADADFE7F7F7FFF7FFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ"9"J#@$G#:4 6ADADD7FFEFEFEFE7FFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ"J#8"<%G#:4 8FEFFE7FFEFE7F7F7FFF7FFFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ$J"D#J#:#z# 7ADFEAD6FE7FFE>7FFFADFF/ADFEADJ'?%D#8&8'E#:#8v8# >ADFEFEFEFEADADFEFEADFE7F7FFEFEFE7F7FFEFEFE7FFEFF7FFFADFEADFEJ#8"8#8%8#8#9&8#>#9$:r9"?#:#8"?"8# 4ADADADADADADADADADADADADADADADADADADADAD7FFE7F7F7F7F7F7FFFADFFADADFEADJ#J#:#9"="9# O1FE7F>FF7FFFADADADADFEJ#J#:#:";":# O17FFE>7FFFADFFADADFEADJ#J#:#;"9";# O1FE7F>FF7FFFADADADADFEJ5:#<$<# O1B7FFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFADFFADFEADFEADJ5:#="=# O1BFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFADADADFEJz:4 O1BADADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ4 P)FFADFEADFEADFEADFEADFEADFEADFEADFEADFEJz P)3ADJ2 P*FFADFFADFFADFFADFFADFFADFFADFFADFFJ4 P)FFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ5:#z# O1B7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFEADFF/ADFEADJ5:#="=# O1BFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFFADFEADFEJ#z":#<$<# O17FFE?7FFFADFFFEFEFEFEADJ#J#:#;"9";# O1FE7F>FF7FFFADFEFEADFEJ#J#:#:";":# O17FFE>7FFFADFFFEFEFEADJ&J#:"J#:#9"="9# 4FEFEFEFEFEFFE7FFE9FF7FFFADFEFEADFEJ%J#8#J#:#8"?"8# 6ADADFEFEE7FFEFEFE:7FFFADFFFEFEFEADJ$8%8#9#J#8#J#:#8v8# 8ADFEFEFEFEFEFEFEFEFEFE5FE7F7F7F:FF7FFFADADADFEJ'J#J#:4 7FFFADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ#;(J#J#:4 FF7FFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ$J#J#:4 =FEFEFE?7FFE>7FFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ%:&J#J#:4 FF7FFFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ$J#J#:#z# 8FEFEADD7FFE>7FFFADFF/ADFEADJ%8(8"J#J#:#8v8# 6FEFEFEADADFEFEFEADFEFEAD9FE7F>FF7FFFADFEADFEJ&:':"J#:"J#:#8"?"8# 4ADADADADADADADADADADADAD77FFE7F97FFFADFFADADFEADJ"J#J#:#9"="9# EFE9FE7F>FF7FFFADADADADFEJ$J#J#:#:";":# DFEFEAD87FFE>7FFFADFFADADFEADJ#J#J#:#;"9";# DADAD9FE7F>FF7FFFADADADADFEJ5:#<$<# O1B7FFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFADFFADFEADFEADJ5:#="=# O1BFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFADADADFEJz:4 O1BADADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ4 P)FFADFEADFEADFEADFEADFEADFEADFEADFEADFEJz P)3ADJ2 P*FFADFFADFFADFFADFFADFFADFFADFFADFFJ4 P)FFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ5:#z# O1B7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFEADFF/ADFEADJ5:#="=# O1BFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFFADFEADFEJ#z":#<$<# O17FFE?7FFFADFFFEFEFEFEADJ#J#:#;"9";# O1FE7F>FF7FFFADFEFEADFEJ#J#:#:";":# O17FFE>7FFFADFFFEFEFEADI#:#J#9$9&F#:#9"="9# FEFEFEFEDFE7FFEFEFEFEFEFEFEFEFF7FFFADFEFEADFEJ#8&9%F#:#8"?"8# O17FFEFE7F7F7FFE7F7F7F7F7FFFADFFFEFEFEADI$8)9%8&G#J#:#8v8# ADFEFEFEFEADADFEFEFEFEFEFEFEFEFEFEADFEFEFE7F>FF7FFFADADADFEJ.9"I#@$G#:4 ;FEFEADADFEFEADFEFEADADFEFEFE7FFEFEFEFE7FFFADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ'>#>#G#8%9&F#:4 4ADFEFEFEFEADADADADADFE7F7FFEFEFE7F7F7F7FFEFF7FFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ"8":#:$;"I#9$J#:4 5ADADFEFEFEFEFEAD7FFE7F7F7F87FFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ*J#?"J#:4 =ADADADADADFEFEADAD9FE7FFE4FF7FFFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ#J#8"J#:#z# ?FEFE>7FFEFE;7FFFADFF/ADFEADJ/J#8&8&F#:#8v8# ;ADFEFEFEFEADADADFEFEFEADFEFE6FE7F7FFEFEFE7F7FFEFEFE7FFF7FFFADFEADFE&G#:%9sJ#9$:$G#:#8"?"8#B% F7F7F7F7F7ADADADADADADAD47FFE7F7F7F7F7F7F7FFFADFFADADFEADF7F7F7F7&J#J#:#9"="9#B& F6F6F6F6F6O,FE7F>FF7FFFADADADADFEF6F6F6F6F68$J#J#:#:";":#C% F9F9F9O,7FFE>7FFFADFFADADFEADF9F9F9F7J#J#:#;"9";# O1FE7F>FF7FFFADADADADFEJ5:#<$<# O1B7FFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFADFFADFEADFEADJ5:#="=# O1BFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFADADADFEJz:4 O1BADADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ4 P)FFADFEADFEADFEADFEADFEADFEADFEADFEADFEJz P)3AD store /green < D79F0000000000000000000000000099DEFFFFFFBFBFBFBFBF80808080804040 4040000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFF FFFFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF80 808080804040400000000000FFFFFFBFBFBFBFBF808080408BEEEE0073E6A2F5 99FFFF30B094FFF700CE8858D74DB38080C0C080C0808060C08000A080402070 A020D0F0F0E010B489E4BE5B77D9FFFFA0404040400063E0B500996699FF0066 3399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69E3B5BF804040 9765E1A36FE700FF1A004DB2B477B39519264F00B641DE4F829E4780FF0000FF > store /blue < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF 8000BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF80 4000FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FF BF804000FFBF00FFBF804000BF8040FFBF804000FFBF40FF57EEB40073E6A2F5 6BFBB360B015322480FA8858D756CAD050C080C08080C060C080FF0000402070 C020D06050E010B476C4BE7A65D900E0A0BF8040004063E0B500FF3399FF8866 6666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69E3B5BF808040 9765E1A36FE7BFCC8BEE4DB28C85B3ED70264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7OMF6F76F6F7J" PLF78z8z8z 4F9OLF94F9 ;z" PCF7F6"J" F9FEFEFEF9F9F9F9F9F9F9FE4F9@sC"9"J%G# F7F9FEO"F9F9F9F9F7F7@tB%:$J%G$ F9FEF9F9F9FEF9FEJFEF9FEFEF9F9F9J%9(8$8"9"8&8$8"9"9) @FEFEFEF9F9FEFEF9F9F9FEFEF9FEFEFEF9FEFEF9FEFEF9FEFEFEFEF9F9F9FEFEFEF9J%;#9x9z9$Js ?F9F9F9F9F9F9F94F9F9F9F9@F7Jt P;F9J"8" DFEFE=z8z8z8z /F7O;F7/F7/F7rF"J"F"F% F7F7OADADF7FFEFE7F7F7FFEFE7F7F7FFEFF7FADFFFEFEFEADJ"9"9)8#8%8"8%C#8"J#:#8v8# 6FEFEFEFEADFEFEADFEFEFEFEFEFEADFEFEFEFEFEFEFE7F7F47FFFFFADADADFEJ%>"8)B#:$F#:4 CFEADFEFEADADADFEFEADADFEFE7FFEFEFE7FFF7FADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ$?"J#:$F#:4 7FEADFEADBFE7F7F7FFE7FFFFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ"9"J#D#J#:4 6ADAD;FEFE7FFE7FF7FADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ"J%B#8"J#:4 8FE=ADADADADFE7FFE47FFFFFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ$G"=":#B#J#:#z# 7ADFEADFEFEFEFE7FFE7FF7FADFF/ADFEADJ%:+B#8&8&?#:#8v8# HADFEFEADADFEFEADADFEFEFEFEADFE7F7FFEFEFE7F7FFEFEFE7F7FFFFFADFEADFEJ#8"8s8#8&9#8%C#9$:$@#:#8"?"8# 4ADADADADADADADADADADADADADADADADAD7FFE7F7F7F7F7F7FFF7FADFFADADFEADJ#J#:#9"="9# O8FE7F77FFFFFADADADADFEJ#J#:#:";":# O87FFE7FF7FADFFADADFEADJ#J#:#;"9";# O8FE7F77FFFFFADADADADFEJ5:#<$<# O8;7FFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FADFFADFEADFEADJ5:#="=# O8;FE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFFFADADADFEJz:4 O8;ADADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ4 P)FFADFEADFEADFEADFEADFEADFEADFEADFEADFEJz P)3ADJ2 P*FFADFFADFFADFFADFFADFFADFFADFFADFFJ4 P)FFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ5:#z# O8;7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FADFF/ADFEADJ5:#="=# O8;FE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFFFFADFEADFEJ#z#:#<$<# O87FFE77FFF7FADFFFEFEFEFEADJ#J#:#;"9";# O8FE7F77FFFFFADFEFEADFEJ#J#:#:";":# O87FFE7FF7FADFFFEFEFEADJ&J#>#9$G#:#9"="9# 5FEFEFEFEFEBFEFEFE7FFEFEFE7FFFFFADFEFEADFEJ(J#8&F#:#8"?"8# 4FEFEADADADFEFEK7FFEFE7F7F7FFEFF7FADFFFEFEFEADJ%9%9%8&9#A#J#:#8v8# =FEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFE7F77FFFFFADADADFEJ59*@#J#:4 4%@#8&F#:#8v8# 4#9$G#:#8"?"8#B% F7F7F7F7F7ADADADADADADADADADADADADADADADADADADADADADADADADADAD7FFE7F7F7FFF7FADFFADADFEADF7F7F7F7&J#J#:#9"="9#B& F6F6F6F6F6O3FE7F77FFFFFADADADADFEF6F6F6F6F68$J#J#:#:";":#C% F9F9F9O37FFE7FF7FADFFADADFEADF9F9F9F7J#J#:#;"9";# O8FE7F77FFFFFADADADADFEJ5:#<$<# O8;7FFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FADFFADFEADFEADJ5:#="=# O8;FE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFFFADADADFEJz:4 O8;ADADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ4 P)FFADFEADFEADFEADFEADFEADFEADFEADFEADFEJz P)3AD store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000096FB6DFFB67DFFCF8AE78AEFEF0071E7 A24DF70055BE827530B6FFFF69DFDB7DB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000009AFF5DDF9E69FBB275C755EFB60071E7 A24DF77D55BE9265618EE3002CB2DB7DB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F6F7P1F6F77F6F7J" Q2F78z8z8z 5F9P0F95F9 z8z8z8z /F9OMF9/F9/F9 J#>$ O5FEFEFEFEFEJ"Js" O?F9O.F6F7J#Jr O5F9F9O8F9J09%;# O(FEFEFEF9FEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEAs"J"9"8':%;%J$ F6F7BF9F9F9F9F9FEF9F9FEF9F9F9FEF9FEFEHF6F6F7BrJ$9%=%:"J" F9DF9FEFEFEF9FEF9FEFEFEF9F9LF9AsJ"9"J# F7O&F9FEO"F7F7AtJ)=%J$ F9DF9FEFEF9F9FEFEF9FEF9F9F9O#F9F9F9J"8"8'8"9" O4FEFEFEFEFEF9F9FEFEFEJ#8#9t8sJs O+F9F9F9F9F9F9O'F7Jt Q F9 >z8z8z8z /F7OMF7/F7/F7sF"J"F"F& F7F7P F7F7F7F7F7F7F7(z' F6F6F6F6F6F6F7Q&D9F6F6F6F6F6F68%J& F9F9F9F9Q(F9F9F9F9F7 J# OJFEFE J#8#8#8%9%9#;% O-FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEJ39' O8FEFED9D9FEFED9FEFED9D9FEFED9FEFED9FEFEFED9D9FEFEJ$:$H";% O-D9FEFEFEFED9D9FED9D9D9J#;#@& O:FEFEFEFED9D9FEFEFEJ%9%@"8" O:D9D9D9D9D9D9D9D9D9FEJ)<#;#:"9% O.D9FEFED9D9FEFED9FEFEFEFEFEFEFED9D9J39' O8D9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFED9D9FEFEFEFED9J#8#:%9%9&8% O/D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 Gz P&D1 Iz=z P"D03D8J"J" P4FF9FFJz"@r"r" 5OLD6FFD7D8D7FFJzG" 6OKD7FFJ#J" JFEFEOHD8J$F"J" 7FEFEFED7OFFFJ&J$ 6FED7D7D7FEP*D9D8D8J&8%:$:,8%:$:$J$ =FED7FEFEFEFEFEFEFEFEFEFEFEFEFED7FED7FED7FEFEFEFEFEFEFEFEFEFEFEFEFELFFFFD9J"8&8&9%8-8&8&8&J$ :D7D7FED7D7D7D7D7D7D7FED7D7D7FEFED7D7D7FED7D7D7FED7D7D7D7D7D7D7FEFED7D7D7FEFED7D7D7FEO!D9D8D8J$J$9&8&J$ EFEFEFE9FEFEFED7FEFEFED7D7FEFEFED7JFFFFD9J"?%J%:%9%J$ :FEFED7D7D78FED7D7D7D7D7D7FED7D7D7FEO"D9D8D8J"<"J$ O9FEFEMFFFFD9J&8%9-8%9%9-8&J$ 6D7FEFEFED7FEFEFEFED7FEFEFED7FEFED7FEFEFED7D7FEFEFEFEFEFEFED7FEFEFED7FED7D7FEFEFED7D7FEFEFED7O#D9D8D8J$9%:u:$9%:&8$:$J$ 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7IFFFFD9J$ PID9D8D8J%J#u O%FEFEFED7O5FFFFD8J$J"B" O%D7D7D7O7D8D8Jz P>/D7JZ P>/J" PLD8J$:$<"Jv" EFEFEFEFEFEFEFEO8D9D8J&@#;#=" 6FEFEFEFEFED7D7D7D7D7J' 6D7FED7D7D7FEJ%G$;$:,8%:$:$ >FEFEFEFEFEFEFEFEFEFEFEFEFED7FED7FED7FEFEFEFEFEFEFEFEFEFEFEFEFEJ&F#;&8-8&8&8& >D7D7D7D7FED7D7FED7D7D7FEFED7D7D7FED7D7D7FED7D7D7D7D7D7D7FEFED7D7D7FEFED7D7D7FEJ$J&G$9&8& ?FEFEFE8D7FEFEFED7FEFEFED7FEFEFED7D7FEFEFED7J%J%F%:%9% >FED7D7D79D7D7D7FEFED7D7D7D7D7D7FED7D7D7FEJ"J"<" O,FE;FEFEJ'858&8%9%9-8& 6FEFEFEFEFED7:D7FEFEFED7FED7FEFEFEFEFEFED7FEFEFEFEFEFED7FEFEFEFEFED7FEFEFED7D7FEFEFEFEFEFEFED7FEFEFED7FED7D7FEFEFED7D7FEFEFED7J&:z9$:$9%:&8$:$ 6D7D7D7D7D79D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 J% O4FEFEFED7J$ O4D7D7D7Jz 6OKD5Jz 5OLD1 J#>"@#J# FEFEJ$8"?"@"J" 7FEFEFED1D1D1?D1J& 6FED1D1D1FEJ#9$;$<+8$:$:$ ?FEFEFEFEFEFEFEFEFEFED1FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEJ"9%8#;&:28&8% :D1FED1D1FED1D1FED1D1D1FEFED1D1D1D1FED1D1D1FED1D1FED1D1D1FEFED1D1D1FEFED1D1D1J"F"9#<";$:$ >D1D1FED1FEFEFEFEFEFEFEJ"J#B%9% :FE8D1FED1D1D1D1D1D1D1D1J":#9&<"<" O!FED1FED1FED1FED1FEFEJ48(9$>&8&8' 6D1FEFEFED1D1FEFEFED1FEFEFED1FEFEFEFEFED1FEFEFED1D1FED1FEFED1FEFEFED1D1FEFEFED1D1FEFEFED1FEJ$8x9$8#9#8$:$:$:& 7D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 Jz 5OLD6Jz 6OKD7J# CFEFEJ%>" 7FEFEFEFED7J% 7D7D7FED7J$;#8&:$:$8&:,8%:$:$ >FEFEFEFEFEFED7FEFEFEFEFEFEFEFEFEFED7FEFEFEFEFEFED7FED7FED7FEFEFEFEFEFEFEFEFEFEFEFEFEJ&9,8&8-8-8&8&8& =FED7D7D7FEFED7D7FED7D7FEFED7D7FEFED7D7D7FEFED7D7D7FED7D7FEFED7D7FEFED7D7D7FED7D7D7FED7D7D7D7D7D7D7FEFED7D7D7FEFED7D7D7FEJ"<";&@"J$9&8& ED7D7D7FEFEFED7D74FEFEFED7FEFEFED7D7FEFEFED7J"J%J%:%9% 6FEFED7D7D7D7D7D7FED7D7D7FEJ"J"<" O$FEIFEFEJ%919(8*9'9%9-8& 6D7FEFED7D7FEFEFED7D7FEFEFED7FEFEFEFEFEFEFED7D7FEFEFED7D7FEFEFED7D7FEFEFEFED7D7FEFEFEFEFEFEFED7FEFEFED7FED7D7FEFEFED7D7FEFEFED7J#;$8u8#8$:$8$8#8$9%:&8$:$ 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 J% O:FEFEFED7J$ O:D7D7D7Jz 6OKD5Jz 5OLD1 J" OCFEJ&H"J" 6FEFEFEFEFEFECD1J' 6D1FED1D1FEFEJ"8#8)9)8#8&9$8,9&:$ :D1FEFEFEFED1FED1FEFEFEFEFEFEFEFED1FEFEFEFEFED1FEFEFEFEFEFEFEFEFED1FEFEFED1FEFEFEFED1FEFEFEFEFEFEJ"8"9"8'8(9"9&81:'8& :FED1D1D1FEFED1D1FED1FED1D1D1D1D1D1D1FED1D1D1FED1D1D1FED1D1FED1D1D1FED1D1D1D1D1FEFED1D1FEFED1D1D1FEJ%@"J$H"<$ 8FEFEFED1D1;FEFEFED1FEFEFEJ$J%8&G% 8D1D1D1GD1D1D1D1D1FED1FED1D1D1D1D1J"I":"J" O#FEFEFE6FEJ%:*9"829&9$9*9( 6FEFEFEFED1FEFEFED1FEFEFEFEFED1FEFEFED1D1D1FEFEFED1FED1FEFEFEFED1FEFEFED1D1FED1FEFEFEFEFED1FEFEFEFED1D1FEFEFED1J%;s8#9$9u:$;":t8#8$ 6D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 Jv P@D8J" P?D8Jz P>/D7 J& O FEFED1FEFEJ%I"8" 7FEFEFEFED1D1J% 6FED1D1D1J"8%8&:$:$8#8#8& :D1FEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEJ#:-8%:'9"9& 7FEFED1D1D1D1FED1D1FEFED1D1FEFED1D1D1D1D1D1FED1D1D1D1FED1D1D1J&9$:" 6D1D1FEFEFEFEFEFED1J#9% 8D1D1FED1D1D1J" 6FEJ%8*9/8, 7FEFEFED1D1FEFEFED1FEFEFEFEFED1D1FEFEFED1FEFED1FEFEFED1D1FEFEFED1FED1FEFEFEFEJ%:s8#8u:u 6D1D1D1D1D1D1D1D1D1 JZ P>/J$J"C" 7FEFEFEP$D7D8J&Jt$ 6FED1D1D1FEP&D9D8D8D7J$:$:$:$:,8%:$:$J$ >FEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FED1FED1FEFEFEFEFEFEFEFEFEFEFEFEFEBD7FFFFJ"8&8&8&8&8-8&8&8&J$ :D1FED1D1D1FEFED1D1D1FEFED1D1D1FEFED1D1D1FEFED1D1D1FED1D1D1FED1D1D1D1D1D1D1FEFED1D1D1FEFED1D1D1FEKD8D8D7J#F&9$H$9&8&J$ 9FEFED1FEFEFED1FEFEFEFEFEFED1FEFEFED1D1FEFEFED1BD7FFFFJ"H%9%F%:%9%J$ 9D1D1D1D1FED1D1D1D1FED1D1D1D1D1D1FED1D1D1FEJD8D8D7J"@"J"<"J$ KFEFE7FEFEGD7FFFFJ&8&8&8&8&8%9%9-8&J$ 6D1FEFEFED1D1FEFEFED1D1FEFEFED1D1FEFEFED1D1FEFEFED1D1FEFEFEFEFEFEFED1FEFEFED1FED1D1FEFEFED1D1FEFEFED1ID8D8D7J$:$:$:$:$:$9%:&8$:$J$ 7D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1ED7FFFFJ$ PFD8D8D7J%J$ O,FEFEFED1O3D7FFD8J$J" O,D1D1D1O8D7J" PDD7J" PFD7JZAZ 5OL/J"J" 4FFP(FFIz=z P"D13D9 Gz P&D9 Iz P"D8J" P4FFJy#Z&x" 5D7FFD7O*D7D7D7FFFFD7FFJ$J";# AFFFFD8O*D8FFFFJ%:z"># ?FFFFFFD8O&D9D8FFFFJ#8"J#8# =FFFFD9O2D9D9FFFFJ#8#J#8# ;FFFFD9D9O5D9D9FFFFJ#8#J#8# 9FFFFD9D9O9D9D9FFFFJ#8#J#8# 7FFFFD9D9O=D9D9FFFFJ'J& 5D8D8D8D8D9D9OAD9D8D8D8D8J#8#J"9" 5D7D7D8D8OAD8D7J#8#J#8# 7D7D7D8D8O=D8D8D7D7J#8#J#8# 9D7D7D8D8O9D8D8D7D7'J#8#J#8#J& F7F7F7F7F7F75D7D7D8D8O5D8D8D7D7MF7F7F7F7F7'J#8"J#8#J' F6F6F6F6F6F67D7D7D8O2D8D8D7D7O!F6F6F6F6F6F68%J# store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000096FB6DFFB67DFFCF8AE78AEFEF0071E7 A24DF70055BE827530B6FFFF69DFDB7DB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000009AFF5DDF9E69FBB275C755EFB60071E7 A24DF77D55BE9265618EE3002CB2DB7DB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F6F7WHF6F77F6F7J" XIF78z8z8z 5F9WGF95F9 F7F6=z"z"z"z 0F6F7W7F6F70F6F70F6>z8z8z8z /F9W6F9/F9/F9 JrJ$"8$>"Js" R,F9F9F9F9FEFEO$F9F9F9F9F9F9R5F6F7J"9#Jr SGF9F9F9R9F9J%:%8r*8$9'8#D"9$?$ R6FEFEFEFEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEAs"J$9%8%8'9"8/8"8&A#8$?'J$ F6F7QKFEFEF9F9F9FEFEFEF9F9F9FEF9F9F9FEF9F9F9F9F9FEF9FEFEFEF9FEFEFEF9F9FEFEFEFEF9FEFEFEF9F9F9FEFEFEF9FEFEQKF6F6F7BrJ%9$;%8)9%9$<$8$A#G"J" F9QJFEFEFEF9F9FEFEFEFEFEF9FEFEFEF9F9F9FEFEFEF9FEF9F9F9F9F9F9F9F9F9F9F9F9FER F9AsJ$9%:"9$9"J"E%J# F7QJF9F9F9FEFEF9F9F9FEF9F9FELF9F9F9F9F9QKF7F7AtJ":%8%9):$A$J%J$ F9R$FEFEF9F9F9FEF9F9F9F9FEFEF9F9FEFEF9FEF9FEFEF9FE=FEF9FEFEQKF9F9F9J"8";%8"8%8%B*8"8&8";"8";"8$8) R,FEFEF9FEFEF9FEFEFEFEF9FEFEFEF9F9F9FEFEFEF9F9F9FEFEF9F9FEFEF9FEFEFEFEFEF9FEFEF9F9F9FEFEFEF9J%z8z8z8z /F7W6F7/F7/F7sF"J"F"F& F7F7W7F7F7F7F7F7F7F7(z' F6F6F6F6F6F6F7X=D9F6F6F6F6F6F68%J& F9F9F9F9X?F9F9F9F9F7 J#>#A#J# RAFEFEFEFEFEFEKFEFE J'8"8"8%;'9%9%9%8#8#8#8# RBD9D9FEFEFEFEFEFEFEFEFEFED9FEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEJ"8)8)8":5B% R@FEFEFED9D9FEFED9D9D9D9FEFED9D9FEFEFE9FED9FEFED9FEFED9D9FEFED9FEFED9D9FEFED9FEFED9D9FEFEFEFED9FEJ#=":#=%9):$:" S%D9D9D9D9D9FED9D9D9FED9D9D9D9D9FEFEFEFED9D9J"9#G"?$9&8& RAD9FEFED9FEFEFED9D9FEFEFED9D9FEFEFEJ%J%;"8"9"8" RED9D9D9D98FEFED9D9D9FED9FEJ"=#;":%;"A%9%:);" R?FEFEFEFEFEFED9FEFEFEFED9D9FEFED9D9D9FEFED9D9FEFED9FEJ'8+=5B% RCD9FEFEFEFED9D9FEFED9D9FEFEFEFED99D9FEFED9D9D9FEFEFED9FEFED9FEFEFEFED9D9D9FEFEFEFED9D9FEFED9J#9%:#8%8#;#9v9%:#8#:& R?D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 J# S,D9D9 Gz W=D1 Iz=z W9D03D8J"J" WKFF9FFJz"@r"r" 5W5D1FFD7D8D7FFJ" X-FFJ$J":&A"J#:"J$J"9$J":#J"E$:$J" 9FEFEFEGFEFEFEFEFEFEFEP4FEFEFEO3FEFEFE@FEFEFEFEFFJ#;"8#?#B#J&9-J$ O3D1D1D1FED1D1D1D1D1O5D1FED1D1D1D1D1FED1D1FED1FED1D1FEFET)D9D8D8J&8,@&J$8&:$8&8-:$8#8#9$B"D"A$9$:&9$:$9&9$9.A#:#:$8&:$<#8&8,C#9$:$8(:)8#8#J$ 7FEFEFEFEFEFEFEFEFEFED1FED1FEFEFEFEFEFEFEFEMFED1FEFED1FEFEFEFEFEFEFED1FEFEFEFEFEFED1FEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFED1FEFEFED1FEFEFEFED1FEFEFEFEFEFEFEFED1FEFEFEFEFED1FEFEFEFEFEFEFEFEFEFED1FED1FEFEFEFED1FEFEFEFEFEFEFEFEFED1FEFEFEFED1D1FED1FEFEFEFEFEFEFEOHFFFFD9J&8-:":&:"J"C"@'858(9"9&@"8$;":"@%9#;&8&8&8&8&8.9"B%8-8&?&8-:"A%9.=)9"J$ 7D1FED1D1D1D1FED1D1D1D1D1FED1D1D1FEFED1D1FED1D1FE4FEFED1FEFED1D1FE:FED1D1D1FED1D1FEFED1D1FED1D1FED1D1D1FED1D1FED1FED1FEFED1D1D1FED1D1D1FED1D1D1FEFED1D1D1D1FEFED1D1D1D1D1D1FED1D1D1FED1D1D1FEFED1D1D1FED1FED1D1D1FED1D1D1FED1FED1D1D1D1D1FED1D1D1FED1FEFED1D1FEFED1D1D1FED1D1FED1FED1FEFED1D1D1FED1FED1D1D1D1FED1D1D1D1D1FED1D1D1FEFEFED1D1D1FED1D1D1FED1D1FED1D1D1FED1D1FEFED1D1FED1D1D1OMD9D8D8J";$;"J"C":&9"C"J&@"C%J$="J"<#:"J$;#J"<#A$B#:"J$ O D1FED1FED14D1D1FEFEFEFEFED1D1AD1FEFEFED1D1FEFEFED1?FEFEFED1@D1FED1D14FEFEFEFED1:D1FED1FEFEFEFED1D1P#FFFFD9J$I#J$J&J%A"B$J%J&J%J%8&J$ O&D1D1D1FED19D1D1D18D1FED1FED18D1D1D1FED1D1D1D1@D1D1D1D1>D1FED1FED1FD1D1D1D1O&D1D1D1D1D1FED1FED1P4D9D8D8J"J"J"J"<"="G"B#J"9#F"F#E":";#J$ CFEP"FE9FEO4FEFEFEFEFED1=FEFED1FEFED1FEFEFED1P(FFFFD9J%:&8%:"C":&A":&:"9+9,9"8$8";(8->%:+A-8%9&8&9,8%:$;"@0;(?%:&8%:"A-9$?$95J$ 7FEFEFEFED1FEFEFED1FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFED1D1FEFEFED1D1FEFEFEFED1FED1FEFED1D1FEFEFED1D1FEFEFED1FED1D1FEFEFED1FEFEFEFEFEFEFEFEFED1FEFEFEFED1FEFEFED1FED1FEFEFEFEFEFEFEFEFED1FEFEFED1D1FEFEFED1D1FEFEFED1D1D1FEFEFED1FEFEFEFED1FED1FEFEFEFED1FEFEFED1D1FEFEFED1D1FEFED1D1FEFEFED1FEFEFEFED1FEFEFED1FEFEFED1FED1FEFEFED1FED1D1FEFEFED1D1FED1FEFEFE6FED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFEFEFEO?D9D8D8J%;$9$;"C":&:"<":&:"9u8#8$8$8#=r8$:&8$?%:uBv8%:$:$;$9$9%B":#:r8$8r8$9#;%;$9$;":#<&8$;":#:$8#8zJ$ 7D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D13D1O6FFFFD9J"J"J"J"J$ SFD1BD1BD1;D1P3D9D8D8J$J$J$J$J#u DFEFEFEOKFEFED1P?FEFED1O4FEFEFEQ#FFFFD8J$J#J#J$J"B" DD1D1D1OKD1D1P@D1D1O5D1D1D1Q$D8D8J"J#J";$B"J"J#J":$A$<"J"C":#J"E$:$Jz HFE4FEFEGFEFEFEFEFE'8&8#J#;&8&?&8&848&:"C"A%9.=)9" 6D1FED1FED1FED1D1D1D1FED1D1D1FED1D1D1FED1FED1D1D1FED1D1D1FED1D1D1FED1D1FED1FED1FEFED1D1D1D1FED1FEFEFED1FEFED1FED1D1D1D1D1FED1D1D1FED1D1D1FED1FED1D1D1FED1D1D1FED1D1D1FED1D1FED1FED1FEFED1D1D1FED1FED1FED1FED1D1D1D1FED1D1:D1D1FED1D1D1FED1FED1D1D1FED1D1D1FEFED1D1D1FED1FED1D1D1D1D1FED1D1D1FED1D1FED1D1D1FED1FED1D1D1FEFEFED1D1D1FED1D1D1FED1D1FED1D1D1FED1D1FEFED1D1FED1D1D1J$J";$;"A&:"C"B$J$J&F&9$H$B"<#;"<#A$B#:" ?FEFEFEO!D1D1FED1D1FED1D1D1FED1D1FEFEFEO5FEFEFEFD1FEFEFED1D1FEFEFED1FEFEFEFEFEFED1FED1D1FED1FEFEFEFED1D1J%J$J%J%J%G%9%?&9%J%8& >FED1D1D1O'FED1FEO&FED1D1D1O4FED1D1D1GD1D1D1FED1D1D1FED1D1D1D1D1FED1FED1D1D1D1D1MD1D1D1D1D1FED1FED1J&J"J"A">"@"A">"G#B#E":";# OHFED1D1D1FEO D1P8FEFEFEFEFEFEFED1FED1FEFEFED1J";)>&8%9/;"9"9";"9":&8&:":&:"9/>&8%9/;(>";/8'>-8&9&>&8&8%:$9&8%;"C"A-9$?$95 6FEFED1D1FEFEFED1FED1FEFEFED1FEFEFEFED1FEFEFED1FED1D1FEFEFED1D1FEFEFEFEFEFEFEFEFEFEFED1FEFEFED1FEFEFEFEFEFEFEFEFEFED1FEFEFED1D1FEFEFED1FED1FEFEFED1FEFEFEFED1FEFEFED1FED1D1FEFEFED1D1FEFED1D1FEFEFED1FEFED1D1FEFEFED1FED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFED1FEFEFED1D1FEFEFED1D1FEFEFED1D1FEFEFED1FEFEFEFED1FED1D1FEFEFED1FEFEFEFEFEFED1FEFEFED1FED1D1FEFEFED1D1FED1FEFEFE6FED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFEFEFEJr8&?$9%:&8$8r9"9#9#9":&9$;":&:"9r8&?$9%:&8$8r8$?r8v8'>w9$;$@$:$9%;";$9%;":#=":#<&8$;":#:$8#8z 6D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1FED1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D13D1J"C"J" U"D1D1;D1J%J% EFEFEFED1P0FEFEFED1J$J$ ED1D1D1P1D1D1D1J";$B"J$J"C":#J"E$:$ O5FEFEFEFEFEO FEFEFEO,FEFEFEFE5FEFEFEFEFEFEFEJ"A#;&?#A#9#J#J#B#:"J#E#;# O'FEFEFEFED1D1D1FEFEFEFEFEFEFE=D1D1O,FED1FED1D15FED1D1D1D1D1J#I#A( O3D1D1D1D1D1FEFED1FEFED1J&9%8&@&J%8&8#8#8%F&9%:&8$:$C#B#9$:$8(:)8#8# 6FEFEFED1FEFEFEFEFEFED1FEFEFEFEFEFEFEFEO%FEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFED1FED1FEFEFEFEFEFEFEFEFED1FEFEFEFED1D1FED1FEFEFEFEFEFEFEJ'8-:":&:"J"C";$9/9"9&E'8&8-8&:"C"A%9.=)9" 6D1FED1FED1FED1D1D1D1FED1D1FEFED1D1FEFED1D1FED1D1FE4FEFED1FED1D1D1D1D1FED1D1FEFED1D1FED1D1D1D1D1D1D1FED1FED1D1D1FED1D1D1D1FEFED1D1D1FED1D1FED1D1D1FEFED1D1D1FEFEFEFED1D1D1FED1D1D1FED1D1FED1D1D1FED1D1FEFED1D1FED1D1D1J$:"=";$;"A%;"C"B$:"C$J$A$9&:"<#;"<#A$B#:" ?FEFEFED1D1FED1FED1D1FEFEFED1D1FEFEFED1FEFEFE9FEFEFEFEFEFED1FEFEFED1D1FED1D1FED1FEFEFEFED1D1J%H$H$J%G%J%A%9%J%8& >FED1D1D1D1D1D1D1D1D1?FED1D1D1FED1D1D18FED1D1D1D1D1D1D1D1D1D1FEFD1D1D1D1D1FED1FED1J#J"J"8"D#B#E":";# O=FED19D1O9FEFEFED1FED1FEFEFED1J";,9"9"C":&8%;":&:"9295?%8,9&8&:"C"A-9$?$95 6FEFED1D1FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFED1FEFEFED1D1FEFEFED1FEFEFEFE6FED1D1FEFEFED1FED1D1FEFEFED1FED1FEFEFEFEFEFEFEFEFED1D1FEFEFED1FED1D1FEFEFED1FEFEFED1D1FEFEFED1FEFED1FEFEFED1FED1D1FEFEFED1D1FED1FEFEFE6FED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFEFEFEJr8s8#9"C":&8$<":&:"9r8s8#8&8w?$:&8$:$:$;":#=":#<&8$;":#:$8#8z 6D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1FED1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D13D1J"C"J" R'D1D1;D1J$C% Q*FEFEFEFEFEFED1J$C$ Q*D1D1D1D1D1D1J&9$:$A$J$J"J$>"F$I# O:FEFEFEFEFEFEFEFEFEFEFEFEFEFEP5FEFEFE@FEO"FEFEFEFEFEFEFEFEFEJ"J%8&8&?&J"J"F$J#J"F$?"E$J" O&FE4D1D1D1D1FED1D1D1FEFED1D1D1FEFED1D1D1FEFFEO)FEFED1D1@FED1>FEFED1D1D1FED1D14D1 J(8#9$:$9&J(8#9$:$9&?%:$:$:$8#8)9&B#:#:$8&:$<#9(8#9$:$9&B#9$9$9&<#9$9%:$;# 8FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEO-FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FED1FEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFED1FEFEFEFEFED1FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFED1FEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEJ(9"9&8&8&:"<";$I"C":(9"9&8&8&?&8&8&8(9"8'8&:"B%8-8&?(9"9&8&8&:"B%8#:'@%8&8&9% 7FED1D1D1FED1D1D1FED1D1D1FEFED1D1D1FED1FED1D1D1FEFEFEFEFEFEFEFED1D1D1FED1D1D1FED1D1D1FEFED1D1D1FED1FED1D1D1D1D1D1D1FEFED1D1D1FEFED1D1D1FEFED1D1D1FED1D1D1D1FEFED1D1FED1FED1D1D1FEFED1D1FEFED1D1D1FED1D1FED1FED1FEFED1D1D1FEFED1D1D1FED1D1D1FED1D1D1FEFED1D1D1FED1FED1D1D1FED1D1D1FED1D1D1FEFED1D1FED1D1D1FED1D1D1D1FEFED1D1D1FEFED1D1FEJ$9&A"<":&H"C"I$9&G$="<"G"D"<#:"J$;#H$9&A"<#H"=#A$9&9" FFEFEFED1FEFEFED1D1D1D1D1D1D1FED1D1FEFEFED1FEFEFED1FEFEFED1D1D1D1FED1D14FEFEFEFED1FEFEFED1FEFEFED1D1FED1D1FED1FEFEFED1FEFEFED1D1J%9%J%9%F%J%J%9%J%:% FD1D1D1D1D1D1D1FEOBD1D1D1D1D1D1D1FEFED1D1D1OCD1D1D1D18D1D1D1D1D1D1D1FEO,FED1D1D1D1D1D1FEJ"8"A"D"J"8"A"I"<"J"?#J"9#J"8"A"?#J#H" IFEFEFEFEO.FEFEFEFEFE-8&8&8*9"8&9"@0;(?%9-8&9&9"@'8*9"='85 7D1FEFEFED1FEFEFED1FED1D1FEFEFED1D1FEFEFED1D1FEFEFED1FEFED1FEFEFEFED1D1FEFEFED1D1FEFEFED1FED1FEFEFED1FED1FEFEFED1FEFEFED1FED1D1FEFEFED1D1FEFEFED1D1FEFEFED1D1FEFEFED1FED1D1FEFEFED1D1FEFEFED1D1FEFEFED1D1FEFEFED1FEFEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1FEFEFED1D1FEFED1D1FEFEFED1D1FEFEFED1FEFEFED1FED1D1FEFEFED1D1FEFEFED1D1FEFEFED1FEFED1FEFEFED1FEFEFEFEFED1FEFEFEFEFED1FEFEFED14D1FEFEFED1FED1D1FEFEFED1D1FEFEFED1FEFEFEJ$:&8$:$;$:"<":%:$:$;";$;";$:&8$:$;$@&8$:$:$:s8#9$:":#:r8$8r8$9#<$:&8$:$;$:":#:&9t8&:&:&8$8r 8D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1D1D1D1D1D1J"J"J"J" R"F$I#J" 6FEFEFEFEFEFEFEFEO FEFEFEFEFEFEFEFEFEFEFEFEFEFEO-FEFEFEFEFEFEJFEFEFE@FEFEFEFEFEFEFEFEFEJFEFEFEFEFEFEFEFEFEO:D8J"D#<%G"J#;&8&?#;&8&>'J+<%G"J$J$D#<%G"J$?"E$J"Jv" 6D1D1D1FED1D1D1FE:FEFEFED1D1D1FEFED1D1D1FEFEFEFED1D1D1FEFED1D1D1FEFEFEFED1FEFEDFEFEFED1FEFEFED1D1D1FED1D1D1FE7FED1D1@FED1D1D1D1FED1D1D1FE7FED1D1D1FED1D14D1O/D9D8J#J#J$8"J( P!D1D1:D1D19D1FED1D1DD1FED1D1D1FED1J&8#?&9$9&8&9$J#9%9&9$8&J&9$9&8&9$C#:#:$8&:$<#;&8#?&9$9&8&9$C#9$9$9&<#9$9%:$;# :FEFED1FEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEO=FED1FEFEFEFEFED1FEFEFEFEFEFEFED1FEFEFE8FEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFED1FEFEFEFEFED1FEFED1FEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFED1FEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEJ&9"@&8&8&8&8&:"<"J"J";#:&8&8-J&8&8&8&8&:"B%8-8&A&9"@&8&8&8&8&:"B%8#:'@%8&8&9% 9FED1D1D1D1D1D1FED1D1D1FED1D1D1FED1FED1D1D1D1FED1D1D1FED1D1D1FEFEFE;FE;FEFED1D1D1D1D1FED1FED1D1D1FED1D1D1FED1D1FEFED1D1FE7D1FED1D1D1FED1D1D1FED1FED1D1D1D1FED1D1D1FED1D1D1FEFEFED1D1FEFED1D1D1FED1D1FED1FED1FEFED1D1D1FEFED1D1D1D1D1D1FED1D1D1FED1D1D1FED1FED1D1D1D1FED1D1D1FED1D1D1FEFED1D1D1FED1D1D1FEFED1D1FED1D1D1FED1D1D1D1FEFED1D1D1FEFED1D1FEJ#J$G&:"<"J"J"<";$A$:"J$G&:"<#:"J$;#:#J$G&:"<#H"=#A$9&9" 8FED1:FEFEFED1FEFEFED1D1D1;D1;D1FEFEFEFEFEFEFED1BFEFEFED1FEFEFED1D1FED1D14FEFEFEFED1FED1:FEFEFED1FEFEFED1D1FED1D1FED1FEFEFED1FEFEFED1D1J#J%G%J$9%A%J%G%J%@#J%G%J%:% 8D1FE:D1D1D1D1D1D1D1FEO;D1D1FEFED1D1D1D1D1D1D1FD1D1D1D1D1D1D1FEFD1D1D1D1D1FE:D1D1D1D1D1D1D1FEO%FED1D1D1D1D1D1FEJ#J"D$J#J"G$J"D$D#J"9#<#J"D$D#J#H" 9D1FE&8,9&8%:,:"@0;(>"959&8%:,:"@'8*9"='85 6FE6D1FEFED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1D1FEFEFED1FEFEFEFEFEFEFED1FEFEFED1D1FEFEFED1FEFEFEFEFEFED1FEFEFED1D1FEFEFED1FEFEFEFEFED1D1FEFEFED1FED1FEFEFEFED1FEFEFED1D1FEFEFEFED1FEFEFED1FEFEFEFEFEFED1FEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1D1FEFEFED1FEFEFEFED1FEFEFED1D1FEFEFED1D1FEFED1D1FEFEFED1FE6D1FEFED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1D1FEFEFED1FEFED1FEFEFED1FEFEFEFEFED1FEFEFEFEFED1FEFEFED14D1FEFEFED1FED1D1FEFEFED1D1FEFEFED1FEFEFEJ#9#8z:$9%;$9$;"<":&9$:$;":&9$:$;"9$8#8u:$8$8#?$9v:$9%;$9$;":#:r8$8r8$9#:#9#8z:$9%;$9$;":#:&9t8&:&:&8$8r 6D1D1D1D11D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1FED1D1D1D1D11D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1D1D1D1D1D1J"J"J"J" S1D1BD1O7D1;D1Jv X)D8J" X(D8J$<$J";$;"C";$:$J#J$<$J$J"E$<$J$>"F$I#Jz EFEFEFEFEFEFEO FEFEFEFEFEFEFEFEFEFEFEFE>FEFE4FEFEFEFEFEFEJFEFEFE@FEFEFEFEFEFEFEJFEFEFEFEFEFEFEFEFEO3/D7J#<%G"J#;&8#B#;&8&>#9#D"C+<%G"J$J#E#<%G"J$?"E$J"JZ ED1D1FED1D1D1FE:FEFEFED1D1D1FEFEFEFEFEFED1D1D1FEFED1D1D1FEFEFEFEFED1FEFEFED1FEFEFED1D1D1FED1D1D1FE7FED1D1@FED1D1D1FED1D1D1FE7FED1D1D1FED1D14D1O4/J#B#B#J(J(J"C" P!D1D1D1D1D1D19D1FEFED1FEFED1)9"@&8&8&8&8&:"B%8#:'@%8&8&9%J$ 6D1FED1FED1FED1D1D1D1FED1D1D1FED1D1D1FED1FED1D1D1D1FED1D1D1FED1D1D1FEFEFE;FE;FED1FED1D1D1D1D1FED1FED1D1D1FED1D17D1FED1D1D1FED1D1D1FED1FED1D1D1D1FED1D1D1FED1D1D1FEFEFED1D1FEFED1D1D1FED1D1FED1FED1FEFED1D1D1FED1FED1FED1FED1D1D1D1FED1D1D1FED1D1D1FED1FED1D1D1D1FED1D1D1FED1D1D1FEFED1D1D1FED1D1D1FEFED1D1FED1D1D1FED1D1D1D1FEFED1D1D1FEFED1D1FEO0D7FFFFJ$G&:"<"J"J"B$A#J$G&:"<#:"J$;#J$G&:"<#H"=#A$9&9"J$ O&FEFEFED1FEFEFED1D1D1;D1;D1FEFEFEFED1AFEFEFED1FEFEFED1D1FED1D14FEFEFEFED1@FEFEFED1FEFEFED1D1FED1D1FED1FEFEFED1FEFEFED1D1O=D8D8D7J%G%J%A#J%G%J%J%G%J%:%J$ O&D1D1D1D1D1D1D1FEOAFED1D1D1D1FEAD1D1D1D1D1D1D1FEFD1D1D1D1FD1D1D1D1D1D1D1FEO%FED1D1D1D1D1D1FEO8D7FFFFJ"D$J"J#A$J"D$D#J"9#J"D$D#J#H"J$ O)FEFED1FEO@D14D1FEFED1FE5FEFED1FEFED1=FEFED1DFEFED1FEFED1:FED1FEODD8D8D7J";59&8%:,:"<":&8&8&:":&8&8&:"948"9$>&8,9&8%:,:"@0;(>";59&8%:,:"@'8*9"='85J$ 6FE4FED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1D1FEFEFED1FEFEFEFEFEFEFED1FEFEFED1FEFEFEFEFEFEFEFEFEFEFED1FEFEFED1D1FEFEFED1FEFEFEFED1FEFEFED1D1FEFEFED1FED1FEFEFEFEFED1FEFED1FEFEFED1FEFEFEFEFEFED1FEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1D1FEFEFED1FEFEFEFED1FEFEFED1D1FEFEFED1D1FEFED1D1FEFEFED1FE4FED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1D1FEFEFED1FEFED1FEFEFED1FEFEFEFEFED1FEFEFEFEFED1FEFEFED14D1FEFEFED1FED1D1FEFEFED1D1FEFEFED1FEFEFEO1D7FFFFJr8z:$9%;$9$;"<":&9$9&:":&9$:$;"9r8u8#9#?$9v:$9%;$9$;":#:r8$8r8$9#:r8z:$9%;$9$;":#:&9t8&:&:&8$8rJ$ 6D11D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1FED1D11D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1D1D1D1D1D1O7D8D8D7J"J"J"J"J$ S*D1BD1O7D1;D1P%D7FFFFJ$ X/D8D8D7J$ X,D7FFD8J" X0D7J" X-D7J" X/D7JZAZ 5W5/J"J" 4FFW?FFIz=z W9D13D9 Gz W=D9 Iz W9D8J" WKFFJy#Z$x" 5D7FFD7VCD7FFFFD7FFJ$J"9# AFFFFD8VCD8FFFFJ%:z"<# ?FFFFFFD8V?D9D8FFFFJ#8"J#8# =FFFFD9VID9D9FFFFJ#8#J#8# ;FFFFD9D9VLD9D9FFFFJ#8#J#8# 9FFFFD9D9W"D9D9FFFFJ#8#J#8# 7FFFFD9D9W&D9D9FFFFJ'J& 5D8D8D8D8D9D9W*D9D8D8D8D8J#8#J"9" 5D7D7D8D8W*D8D7J#8#J#8# 7D7D7D8D8W&D8D8D7D7J#8#J#8# 9D7D7D8D8W"D8D8D7D7'J#8#J#8#J& F7F7F7F7F7F75D7D7D8D8VLD8D8D7D7MF7F7F7F7F7'J#8"J#8#J' F6F6F6F6F6F67D7D7D8VID8D8D7D7O!F6F6F6F6F6F68%J# store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000096FB6DFFB669F7AE86FFDF8AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000009AFF5DDF9E71FFBA8EFFEF75C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F4F5W:F4F57F4F5J" X;F58z8z8z 5F8W9F85F8 z8z8z8z /F8W(F8/F8/F8 J'J$8$C$8s R$FEFEFEFEF8FE6FEFEFEFEFEFEFEFEFEFEJ'J":"E":"8$Js" R#FEFEF8F8F8FE7F8F8F8F8F8F8F8REF4F5J"J"Jr R(F8O)F8REF8J#8"9$8'8$E$:#@"9,9'8#;$ R%FEFEF8FEFEFEFEFEFEF8FEFEFEFEFEFEFEFEFEFEFEFEFEFEF8FEFEF8FEFEFEFEFEFEFEF8FEFEFEFEFEFEFEAs"J"9#8)8"8(A-=#8$8":%8"8)8'J$ F4F5Q=F8FEFEFEFEFEF8FEFEF8F8FEFEFEFEF8FEFEFEFEFEFEF8FEFEF8FEFEFEF8FEFEFEF8F8F8FEF8F8FEFEF8FEF8FEFEFEF8FEFEFEFEFEF8FEFEQAF4F4F5BrJ#9"9%:$8$F";$=#=(="9">"J" F8Q?F8F8FEF8F8F8F8F8F8F8F8F8F8FEF8F8F8F8F8F8F8F8F8F8FEFEF8F8FEQDF8AsJ"8#J%E"?%I%J# F5Q>FEF8F8DF8F8F8F8F8FEFEF8F8F8F8F8F8QAF5F5AtJ">%?$E%9$J"I%J$ F8Q>FEFEF8FEFEFEF8FEFEF8FEFEFEF8FE6FEFEF8FEFEQAF8F8F8J08"8*8$8/8$8";"8"8%8$8"9"9) R$F8FEFEFEFEF8F8F8F8FEFEFEF8F8FEFEF8F8FEFEFEF8F8F8FEFEF8FEFEF8F8F8FEFEFEF8F8F8F8FEFEF8FEF8FEFEFEFEF8FEFEF8FEF8FEFEFEFEF8F8F8FEFEFEF8J':$8%:$9t9$:v;%9z9$Js R#F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F83F8F8F8F8R"F5Jt X)F8 >z8z8z8z /F5W(F5/F5/F5sF"J"F"F& F5F5W)F5F5F5F5F5F5F5(z$z' F4F4F4F4F4F4F5WGD8D9D9D93CFF4F4F4F4F4F48%J"J( F8F8F8F8WGFF5D0F4F8F8F8F8F5?z"QHCD3CFD9D8J"J"J"J" R1FF5D0R7FF5D0Jz"D9RMD9J(J( R;FFFFD9D9D9D8D8RGFFFFD9D9D9D8D8J"J" R:FFRMFFJ"9$J"9$ R$J">$ R9D1D8D8D1RBD1D8D8D1J"="J"=" R;FFD1REFFD1J"<"J"<" R:D1D8RFD1D8J"9$J"9$ RQHD93D9 JzJz 8QHCFO&QHCFJ"J" R1D0RMD0Jw"z#v"Jw"z#v" :D1FFQ*D1FFFFD1D0O)D1FFQ*D1FFFFD1D0J$Z8#J$Z8# DFFFFD8Q*FFFFO=FFFFD8Q*FFFFJ$J":"J$J":" CFFFFD8Q*D8FFO;FFFFD8Q*D8FFJ%:z"9&J%:z"9& AFFFFFFD9Q&D9D8D9D9FFFFFFO7FFFFFFD9Q&D9D8D9D9FFFFFFJ&J&J&J& ?FFFFFFD9D9Q1D9D9FFFFFFO3FFFFFFD9D9Q1D9D9FFFFFFJ"8"J"8"J"8"J"8" >FFD9Q5D9FFO1FFD9Q5D9FFJ&J&J&J& D1D8Q5D8D1O1D1D8Q5D8D1J&J&J&J& ?D1D1D8D8D8Q1D8D8D8D1D1O3D1D1D8D8D8Q1D8D8D8D1D1J%:z:&J%:z:& AD1D1D8D8Q&D8D8D8D8D1D1O7D1D1D8D8Q&D8D8D8D8D1D1J":"J"J":"J" CD1D8Q,D1O;D1D8Q,D1J$z%J$z% DD1D1D8Q*D1FFD8D1D1O=D1D1D8Q*D1FFD8D1D1JzJz :QDD0O*QDD0J"J" 9D0RMD0JzJz 8QHD9O&QHD9 Jz9zJz9z 8QHCD3CF>QHCD3CFJ"J"J"J" R1FF5D0R7FF5D0Jz"D9RMD9J(J( R;FFFFD9D9D9D8D8RGFFFFD9D9D9D8D8J"J" R:FFRMFFJ"9$J"9$ R$ X'D1D8D8D1J"=" X)FFD1J"<" X(D1D8J"9$ X*FFD8D8D1J" X)D1J& X+FFD9D8D8D1J& X*D1FFD8D8D1 J$ X+D1D8D1?Z8Q8Z8Q8Z=z R'RD2/D0>"J" FFWID0=z9z WGD93D9 =z WGCF'J"J& F5F5F5F5F5F5WGD06F5F5F5F5F5'9w"z#v"J' F4F4F4F4F4F4D1FFW)D1FFFFD1D07F4F4F4F4F4F48%C$ZA#J& F8F8F8F8FFFFD8W FFFFBF8F8F8F8F5H$J"C" FFFFD8W D8FFF%:z"B& FFFFFFD9VJD9D8D9D9FFFFFFD&J& FFFFFFD9D9W0D9D9FFFFFFC"8"J"8" FFD9W4D9FFA&J& FFFFFFD9D9W6D9D9FFFFFF?&J% D8D8D8D9D9W:D9D8D8D8?&J"8" D1D1D8D8D8W:D8D1A&J& D1D1D8D8D8W6D8D8D8D1D1C"8"J"8" D1D8W4D8D1D&J& D1D1D8D8D8W0D8D8D8D1D1F%:zC& D1D1D8D8VJD8D8D8D8D1D1H":"J" D1D8W+D1I$z@$ D1D1D8W D1D8D1D1?z WCD0>" D0=z"z"z 0F4F5W:F4F51F4 store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000082D78AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000006DB675C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F6F7R?F6F77F6F7J" S@F78z8z8z 5F9R>F95F9 z8z8z8z /F9R-F9/F9/F9 J'D":"I' OJFEFEFEFEFEFEFEFEFEFEFEFEFEFEJ"8%B":"J"8%Js" OJF9F9F9FEFEFEFE4F9F9F9FEFEP,F6F7Jr S/F9J(8"8$8#8$9'D$9( P%FEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFEAs"J%8"9":"8$8,8%;%8*9$J$ F6F7O9FEFEFEF9F9F9F9F9F9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEFEFEFEF9FEFEFEF9FEFEFEF9F9F9FEF9O;F6F6F7BrJ&J$<">&9$:&J" F9O:F9F9F9FEFE6F9F9F9F9F9F9F9FEFEF9F9F9F9FEFEFEF9O=F9AsJ# F7R;F7F7AtJ"F$J$:&J$ F9OCFEFEF9FE7FEF9FEFEF9F9FEFEOz8z8z8z /F7R-F7/F7/F7sF"J"F"F& F7F7R.F7F7F7F7F7F7F7(z' F6F6F6F6F6F6F7S4D9F6F6F6F6F6F68%J& F9F9F9F9S6F9F9F9F9F7 Bz OBFE Dz O>D9 Fz O:D8J" OIFFHz" O6D9FF JZJZJZ 6O.4O.4O.J"J"J" OCD8OAD8OAD8Jz"Jz"Jz" 8O*D9D87O*D9D87O*D9D8 J#:#J#9#J#;#F# HFEFEFEFEO>FEFEFEFEO/FEFEFEFEFEFEJ" PBFEJ$8)9%J%J"9":%8#9#:#9% HD9FEFEFEFED9D9FEFEFEFEFEFEFEFEO;FEFEFEFEO+FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEJ.J#:'J'A, O"FEFED9D9FEFED9FEFED9D9FEFEO3D9FEFEFED9D9FEFEO2FEFED9D9FEFEFED9FEFED9FEFED9D9FEFEJ'@%J$:#;(9" ID9FEFEFEFED9FED9D9D9PJFED9FED9D9D9FEFED9FEFED9D9J"8":#9&J#J"9":$J# JD9D9FEFED9D9FEFEFEO5D9FEO3D9D9FEFEFE4FEFEJ%9"8"J";%:&A% O$D9D9D9D9D9FEPKFEFEFED9D9D9FEFEFED9D9D9D9D9J(J"J$J"># O&FEFED9FEFED9D9O7D9O4D9FED95FEFEFEJ.J'J(8"=, O"D9FEFEFEFED9D9D9FEFEFEFED9O9D9FEFEFEFED9O2D9FEFEFED9FEFED9D9FEFED9D9D9FEFEFEFED9J#:%9%J#9#8%J#8"8#8':"9&9% KD9D9D9D9D9D9D9D9D9D9O2D9D9D9D9D9D9D9D9O)D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9J" R;FEJ$ R:FEFED9J# R:D9D9 'J& F7F7F7F7F7F7S5F7F7F7F7F7'HzJzJzG' F6F6F6F6F6F6O*D88O*D88O*D8F6F6F6F6F6F68%G"J"J"J& F9F9F9F9D8OAD8OAD8OFE Bz OBD9 =z"z"z 0F6F7R?F6F71F6F91F9 7z8z8z 6F7R>F75F7"J"J" F77F7R?F7 ENDBITMAP %%EndBinary 351 567 513 648 R 7 X V 4 8 Q 0 X (buttonbox .bb -padx 10 -pady 10) 351 642.67 T (.bb add Yes -text Yes) 351 622.67 T (.bb add No -text No) 351 612.67 T (.bb add Maybe -text Maybe) 351 602.67 T (.bb default Yes) 351 592.67 T (pack .bb -expand yes -f) 351 572.67 T (ill both) 461.4 572.67 T 0 10 Q (FIGURE 26) 376.52 542.16 T 1 F (- Buttonbox) 430.42 542.16 T 0 0 612 792 C 315 135.14 540 505.86 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 315 170.71 540 494.43 R 7 X 0 0 0 1 0 0 0 K V 0.5 H 2 Z 0 X N %%BeginBinary: 5963 314 531 94.2 159.3 0 427.8 323.98 /red < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000007D96FB7DFFCF8AFFE79AFF2CAEB6CF71E7 A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF > store /green < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000006D96FB6DFFB67DFFCF8AE78AEFEF0071E7 A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF > store /blue < 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000005D9AFF5DDF9E69FBB275C755EFB60071E7 A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF > store BEGINBITMAPCOLORc z"z"z" 7F6F7SCF6F77F6F7J" TDF78z8z8z 5F9SBF95F9 z8z8z8z /F9S1F9/F9/F9 JrJ$8.8#E$ P'FE>FEFEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEFEFEJ"8&J":"8$8&I"Js" P'F9F9F9F9FEFE=F9F9F9F9F9F9F9F9FEF9F9Pz8z8z8z /F7S1F7/F7/F7sF"J"F"F& F7F7S2F7F7F7F7F7F7F7(z' F6F6F6F6F6F6F7T8D9F6F6F6F6F6F68%J& F9F9F9F9T:F9F9F9F9F7 Ez SFFGz=z S8D13D9 Ez SD9D8FFFFJ#8"J#8# ;FFFFD9RHD9D9FFFFJ#8#J#8# 9FFFFD9D9RKD9D9FFFFJ#8#J#8# 7FFFFD9D9S!D9D9FFFFJ#8#J#8# 5FFFFD9D9S%D9D9FFFFI'J& D8D8D8D8D9D9S)D9D8D8D8D8I#8#J"9" D7D7D8D8S)D8D7J#8#J#8# 5D7D7D8D8S%D8D8D7D7J#8#J#8# 7D7D7D8D8S!D8D8D7D7J#8#J#8# 9D7D7D8D8RKD8D8D7D7J#8"J#8# ;D7D7D8RHD8D8D7D7J#D8D7D7J#9"J$ ?D7D7D8RBD8D7D7IZ S4H" FFGz S8D9 JU T+J" T4D8J( T-D9D9D9D9D9D9D8 =z@u T$D8D8>z@t" T#D9D9FF>Z@T T#=z@u T$D9D9J' T-D8D8D8D8D8D8J" T,D8Ju T+D9 Ez SFFGz=z S8D13D9 Ez SD9D8FFFFJ#8"J#8# ;FFFFD9RHD9D9FFFFJ#8#J#8# 9FFFFD9D9RKD9D9FFFFJ#8#J#8# 7FFFFD9D9S!D9D9FFFFJ#8#J#8# 5FFFFD9D9S%D9D9FFFFI'J& D8D8D8D8D9D9S)D9D8D8D8D8I#8#J"9" D7D7D8D8S)D8D7J#8#J#8# 5D7D7D8D8S%D8D8D7D7J#8#J#8# 7D7D7D8D8S!D8D8D7D7J#8#J#8# 9D7D7D8D8RKD8D8D7D7J#8"J#8# ;D7D7D8RHD8D8D7D7J#D8D7D7J#9"J$ ?D7D7D8RBD8D7D7IZ S4H" FFGz S8D9 JU T+J" T4D8J( T-D9D9D9D9D9D9D8 =z@u T$D8D8>z@t" T#D9D9FF>Z@T T#=z@u T$D9D9J' T-D8D8D8D8D8D8J" T,D8Ju T+D9 Ez SFFGz=z S8D13D9 Ez SD9D8FFFFJ#8"J#8# ;FFFFD9RHD9D9FFFFJ#8#J#8# 9FFFFD9D9RKD9D9FFFFJ#8#J#8# 7FFFFD9D9S!D9D9FFFFJ#8#J#8# 5FFFFD9D9S%D9D9FFFFI'J& D8D8D8D8D9D9S)D9D8D8D8D8I#8#J"9" D7D7D8D8S)D8D7'E#8#J#8#J& F7F7F7F7F7F7D7D7D8D8S%D8D8D7D7GF7F7F7F7F7'G#8#J#8#J' F6F6F6F6F6F6D7D7D8D8S!D8D8D7D7IF6F6F6F6F6F68%I#8#J#8#J& F9F9F9F9D7D7D8D8RKD8D8D7D7LF9F9F9F9F7J#8"J#8# ;D7D7D8RHD8D8D7D7J#D8D7D7J#9"J$ ?D7D7D8RBD8D7D7IZ S4H" FFGz S8D9 =z"z"z 0F6F7SCF6F71F6 store /green < D79F0000000000000000000000000099DEFFFFFFBFBFBFBFBF80808080804040 4040000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFF FFFFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF80 808080804040400000000000FFFFFFBFBFBFBFBF808080408BEEEE0073E6A2F5 99FFFF30B094FFF700CE8858D74DB38080C0C080C0808060C08000A080402070 A020D0F0F0E010B489E4BE5B77D9FFFFA0404040400063E0B500996699FF0066 3399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69E3B5BF804040 9765E1A36FE700FF1A004DB2B477B39519264F00B641DE4F829E4780FF0000FF > store /blue < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF 8000BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF80 4000FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FF BF804000FFBF00FFBF804000BF8040FFBF804000FFBF40FF57EEB40073E6A2F5 6BFBB360B015322480FA8858D756CAD050C080C08080C060C080FF0000402070 C020D06050E010B476C4BE7A65D900E0A0BF8040004063E0B500FF3399FF8866 6666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69E3B5BF808040 9765E1A36FE7BFCC8BEE4DB28C85B3ED70264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7T&F6F76F6F7J" U%F78z8z8z 4F9T%F94F9 ;z" TJF7F6F9F9FEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEFEF9FEFEFEF9F9F9F9F9FEFEFEF9F9F9FEFEFEF9F9F9F9F9FEFEFEF9F9F9FEFEFEFEJ$:$9z;$9&;$9rJs P@F9F9F9F9F9F92F9F9F9F9F9F9F9F9F9F9F9F9F9P=F7Jt TBF9 =z8z8z8z /F7SBF7/F7/F7rF"J"F"F% F7F7SCF7F7F7F7F7F7'z& F6F6F6F6F6F7TIADF6F6F6F6F68$J% F9F9F9TKF9F9F9F7 J5=4 O6RAFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEFFADFFADFFADFFADFFADFFADFFADFFADFFADFFJ5<5 O5RBFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEAD4FFADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ#z"<#z" O5ADFER?ADFFADFF1ADFEJ#J#<#F# O5FEADR>FFADFFADFEADJ#J#<#F# O5ADFER>ADFFADFFADFEJ#;#F#8#F#<"J#<#9u9# 4FEFEFEFEFEFEFEFEFEADFER7FFADFFADFEFEADJ#J#<#9"B# O5ADFER>ADFFADFFADADFEJ"9":%8&8"8":#9#>#?"9"8%:$J#<#B"9# 6FEFEFEFEFEFEFEFEADFEFEFEFEFEFEFEFEFEADFEFEFEADFEFEFEFEFER#FFADFFADADFEADJ'9'8"9%B#G%8&J#<#:"A# >FEFEADADFEFEFEADFEFEADADADFEADFEFEADFEFEADADFEFEADADADFER"ADFFADFFADADFEJ$C"A";#>#G"J#<#A":# 7FEADFEADADADADFEADADR,FFADFFADADFEADJ"9"J#J$J#<#;"@# 6ADADHADFE8FEFEFER#ADFFADFFADADFEJ"J#8"J%J#<#@";# 8FEJFEADFE5ADADADADR"FFADFFADADFEADJ$J">#>#B"D"J#<#<"?# 7ADFEAD6FEFEFEADFEFEFER"ADFFADFFADADFEJ'?%H#8&8%@&J#<#?"<# >ADFEFEFEFEADADFEFEADFEADADFEFEFEADADFEFEADADFEFEFEADR"FFADFFADADFEADJ#8"8#8%8#8#9&8#8#>#9$:%8"9"9$J#<#="># 4ADADADADADADADADADADADADADADADADADADADADADADADFEADADADADADADADADADADADADR#ADFFADFFADADFEJ#J#<#>"=# O5FEADR>FFADFFADADFEADJ#J#<#F# O5ADFER>ADFFADFFADFEJ#J#<#F# O5FEADR>FFADFFADFEADJ5<5 O5RBADFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFF4ADFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ5<5 O5RBFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFAD4FFADFEADFEADFEADFEADFEADFEADFEADFEADFEADJz=z O5RAAD3AD J5=4 Q"Q'FEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEFFADFFADFFADFFADFFADFFADFFADFFADFFADFFJ5<5 Q!Q(FEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEAD4FFADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ#z"<#z" Q!ADFEQ%ADFFADFF1ADFEJ#J#<#F# Q!FEADQ$FFADFFADFEADJ#J#<#F# Q!ADFEQ$ADFFADFFADFEJ%J#8#J&H#J#8"<"J#<#9u9# 6FEFEFEFE>FEFEFEFE5FEFEFEFEFEFEFE?FEADFEFEPHFFADFFADFEFEADJ'J#J(J#?"J#<#9"B# 5FEFEADADFEFEAADAD4FEFEADADADFEFEO$ADFEADPHADFFADFFADADFEJ$8*9%8+8"8+9&D#9#8%8"8"8%8*9#>#?"8%9"9$:"J#<#B"9# 4FEFEADADFEFEADFEFEADFEFEFEFEFEFEFEFEADFEFEADFEFEFEFEFEFEADFEFEADFEFEADFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEADFEFEFEFEFEFEADFEFEADFEFEFEFEADFEFEP3FFADFFADADFEADJ,9"8)8"<*>(?)8)8*B#C%>#8#J#<#:"A# ?FEADFEFEADFEFEADADFEFEFEFEFEADADFEFEADADADFEADFEFEADFEFEADFEADFEFEFEADADADFEFEADADFEFEADADADADFEFEADADFEFEFEADADFEFEADADFEFEADFEFEADADFEADFEFEADP3ADFFADFFADADFEJ"D%E"="?&8(9%J#>#C"B%J#<#A":# ?ADADADADADADADADADFEFEFEADFEFEADFEFEADFEADADAD9ADADFEADADADFEFEADP4FFADFFADADFEADJ#;"9$J"8"?&?#J#J#<#;"@# FFEFEADFEFEFEAADFEADADFEFEFEFEFE9ADFEQ$ADFFADFFADADFEJ%<%J#8":&:"8">%J#J%J#<#@";# FADADADADFEFEADAD>FEFEADADFEFEFEADADFEADADADAD7FEAD:FEADADFEP4FFADFFADADFEADJ$8$9">#G"C"J%=":#C#>#J"8#8#J#<#<"?# 4ADFEFEFEFEADFEFEFEFEFE8FEFEADADFEFEFEFEFEADFE6FEFEADADFEP3ADFFADFFADADFEJ':,<-@%>(9";'8+J#9%B%J#<#?"<# 5ADFEFEFEFEADADFEFEADADADFEFEFEFEADADFEFEFEADFEFEADADFEFEADADFEFEADADFEFEFEFEFEADADADFEFEFEFEADADFEFEADADFEFEFEFEAD7FEADFEFEFEFEADFEFEADP;FFADFFADADFEADJ%<#9%8#:'8s8#8#@&<":%:#8%8#8#8#8#>#8&8"8"9"9':"J#<#="># 6ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADFEADADADADADADADADADADADADADADADP3ADFFADFFADADFEJ#J"J#J#<#>"=# O8FEFE4FEO FEADQ$FFADFFADADFEADJ'E$J#J#<#F# O8ADFEFEFEFEADFEFEADMADFEQ$ADFFADFFADFEJ#J%F#J#J#<#F# =ADADHADADADADADADO FEADQ$FFADFFADFEADJ5<5 Q!Q(ADFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFF4ADFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ5<5 Q!Q(FEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFAD4FFADFEADFEADFEADFEADFEADFEADFEADFEADFEADJz=z Q!Q'AD3AD Js$ 4FEADFEFEJ' 6ADADADADADADJ#;%9%9# :FEFEFEFEFEFEFEFEFEFEFEFEJ. @FEFEADADFEFEADFEFEADADFEFEJ$F%8# 6FEFEFEFEADADADADADJ$?#9& 6ADADADFEFEADADFEFEFEJ%9"8" BADADADADADFEJ(:# DFEFEADFEFEADADFEFEJ. @ADFEFEFEFEADADADFEFEFEFEADJ#:&8%9%9# 4ADADADADADADADADADADADADADADADADAD I5 T/FEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEH5 T0FEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADH#z" ADFET-ADFFH#J# FEADT,FFADH#J# ADFET,ADFFH#J# FEADT,FFADH#J# ADFET,ADFFH#J# FEADT,FFADH#J# ADFET,ADFFH#J# FEADT,FFADH#J# ADFET,ADFFH#J# FEADT,FFADH#J# ADFET,ADFFH#J# FEADT,FFADH#J# ADFET,ADFFH#J# FEADT,FFADH#J# ADFET,ADFFH#J# FEADT,FFADH5 T0ADFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFH5 T0FEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADHz T/AD I5?2 SCFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEFEADFEADFEADFEADFEADFEADFEADFEADFEH5=4 SEFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFFFEADFEADFEADFEADFEADFEADFEADFEADFEADFFH#z#=#r"r# ADFESAADFFADADFE98FE98FFADH#J#=#<#=# FEADSAADFFFEADFFADADFFH#J#=#<$<# ADFESAFFADADFEADFEADFFADH#J"?"J"J"C"<"J"I$B$C";$:$C"8#=#;%<# FEAD4FEFEO FE5FEFEFEO-FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFFFEADADFFADFEADFFH#J"J&@&@#;&8&@#9#=#;&;# ADFEO?ADP=FEADADADFEFEADADADFEFEFEFEADADADFEFEADADADFEFEFEFFADADFEFFADADADFEFFADH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#J#9#=#:#8#;# FEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFEO&ADAD;ADADADFFFEADFFADFEADADFFH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J#=#:#8$:# ADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEOGFFADADFEADFFADFEADFFADH#?"?"A"J"G"C"A"H"J"C"9"8":"J#=#9$9#:# FEADADADAD8ADADADADAD;ADADADADADOKADFFFEADADFFADADFEADFFH):$J$9&J$=&J&@&J$<&9&@&@&J&>#=#9#;#9# ADFEADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE8FEFEFEFEFEFFADADFEFFADADFEFFADH"r9%J%8&J%<&J&@&J%<&9&@&@&J&>#=#8#<#9# FEADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADADADADADADADADADADAD8ADADADADADADFFFEADFFADFEADADFFH#I"A"?"D"B"D"E"H"J#=#8#<$8# ADFEFEFEFEFEFEFEFEFEQ%FFADADFEADFFADFEADFFADH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&@&G&8&E#='=#8# FEADADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE4ADFEFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFFFEAD98ADFFADADFEADFFH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rI$B$C";$:$C"8#=&?& ADFEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADFFADADFE98FFADADFE98FFADH#J#=4 FEADSAADFFFEADFFADFEADFEADFEADFEADFEADFEAD98ADFFH#J#=4 ADFESAFFADADFEADFEADFEADFEADFEADFEADFEADFEADFFADH#J#=#z# FEADSAADFFFEAD/98ADFFH#J#=4 ADFESAFFADADFEADFFADFFADFFADFFADFFADFFADFFADFFADH#J#=4 FEADSAADFFFEADFFADFFADFFADFFADFFADFFADFFADFEADFFH#J#=%v% ADFESAFFADADFEADFFADFEADFFADH#J#=4 FEADSAADFFFEADFFADFEADFEADFEADFEADFEADFEADFEADFFH#J"?"J"J"C"<"J"I$B$A&8&@&8(=4 ADFE4FEFEO FE5FEFEFEO-FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFADADFEADFEADFEADFEADFEADFEADFEADFEADFFADH#J"J&@&@%:%@%:'=#z# FEADO?ADP=FEADADADFEFEADADADFEADADADADADADADADADADADADADADADADADFFFEAD/98ADFFH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#J#=#=#E# ADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFEO)FEAD4FEADFFADADFEFFADH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J$I'=#E# FEADFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEO-FEFEFEFEFEFEADADFFFEADADFFH#?"?"A"J"G"C"A"H"J"C"9"8":"J#9&B#9(=#E# ADFEADADAD8ADADADADAD;ADADADADADO+FEADADADADADFEFEADADADADADFEFFADADFEFFADH):$J$9&J$=&J&@&J$<&9&@&@&G&E#=#E# FEADADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFFFEADADFFH)9%J%8&J%<&J&@&J%<&9&@&@&@"<&@":#=#E# ADFEADADADADADADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADADADADADADADADADADADFEADADADADADFEFFADADFEFFADH#I"A"?"D"B"D"E"H"J#J#?#=#E# FEADFEFEFEFEFEFEFEFEP2FEAD4FEADADFFFEADADFFH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&@&G&G(=#E# ADFEADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE4ADFEFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFFADADFEFFADH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rI$B$B"<$B"<'=#E# FEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J"?"J"J"C"<"J"J";$C";$:$A&8)=#E# FEAD4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADADFFFEADADFFH#J"J#;&@#;&8&@%:(=#E# ADFEO?ADP=FEFEFEADADADFEFEFEFEADADADFEFEADADADFEADADADADADADADADADFFADADFEFFADH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#J#J#>#=#E# FEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADAD4ADAD>FEADADFFFEADADFFH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J$8#=#E# ADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEOBFEFEFEFFADADFEFFADH#?"?"A"J"G"C"A"H"J"C"9"8":"J#9)=#E# FEADADADAD8ADADADADAD;ADADADADADO@FEADADADADADFEADADFFFEADADFFH):$J$9&J$=&J&@&J$<&9&G&J&F#=#E# ADFEADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE8FEFEFEFEFEFFADADFEFFADH"r9%J%8&J%<&J&@&J%<&9&G&J&@";#=#E# FEADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADADADADADAD8ADADADADADFEADFFFEADADFFH#I"A"?"D"B"D"E"H"J#@#=#E# ADFEFEFEFEFEFEFEFEFEPGFEADFFADADFEFFADH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&G&8&G)=#E# FEADADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE;ADFEFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADADFFFEADADFFH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ";$C";$:$B"<$8#=#E# ADFEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADADADADADFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J"?"J"J"C"<"J"J"<"C$:$C";$:$8#=#E# ADFE4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFADADFEFFADH#J"J#;#C&8&@#;&8)=#E# FEADO?ADP=FEFEFEFEFEADADADFEFEADADADFEFEFEFEADADADFEFEADADADFEADADFFFEADADFFH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#;#J#H#=#E# ADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADADADADCADADFFADADFEFFADH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J&J#=#E# FEADFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEKADFEFEFEADEADFFFEADADFFH#?"?"A"J"G"C"A"H"J"C"9"8":"J&J#=#E# ADFEADADAD8ADADADADAD;ADADADADADO!FEADADADFEEFFADADFEFFADH):$J$9&J$=&J&@&J$<&9&G&G&J#=#E# FEADADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE7ADFFFEADADFFH)9%J%8&J%<&J&@&J%<&9&G&G&J#=#E# ADFEADADADADADADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADADADADADADADADADADAD7FFADADFEFFADH#I"A"?"D"B"D"E"H"J#=#E# FEADFEFEFEFEFEFEFEFEQ%ADFFFEADADFFH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&8&G&8)=#E# ADFEADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFEJADFEFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFFADADFEFFADH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ"<"C$:$C";$:$8#=#E# FEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADADADADADADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J"?"J"J"C"<"J"J";$C";$:$A&8)=#E# FEAD4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADADFFFEADADFFH#J"J#;&@#;&8&@%:(=#E# ADFEO?ADP=FEFEFEADADADFEFEFEFEADADADFEFEADADADFEADADADADADADADADADFFADADFEFFADH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#;"D#;"J#>#=#E# FEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADADADADADAD8FEADADFFFEADADFFH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J#J#J$8#=#E# ADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFE?FEAD4FEAD9FEFEFEFFADADFEFFADH#?"?"A"J"G"C"A"H"J"C"9"8":"J#J#J#9)=#E# FEADADADAD8ADADADADAD;ADADADADADBFEAD4FEAD4FEADADADADADFEADADFFFEADADFFH):$J$9&J$=&J&@&J$<&9&A#:&A#A&F#=#E# ADFEADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEFEFEFEFEFFADADFEFFADH"r9%J%8&J%<&J&@&J%<&9&@#;&@#B&@";#=#E# FEADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADFEADADADADADADFEADADADADADADFEADFFFEADADFFH#I"A"?"D"B"D"E"H"J#@#=#E# ADFEFEFEFEFEFEFEFEFEPGFEADFFADADFEFFADH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J%H%8&G)=#E# FEADADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFEFEADADADADADADADADADADADADADFEFEFEFEFEADADADADAD8ADADADADADFFADADFEFFADH#I"A"?"D"B"D"E"H"J'J#=#E# FEADFEFEFEFEFEFEFEFEOGADADADADFEADO&ADFFFEADADFFH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&8&G)=#E# ADFEADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFEO#ADFEFEFEADADFEFEFEADADFEFEFEADADFFADADFEFFADH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ"="C";$:$C";$8#=#E# FEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADADADADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J"?"J"J"C"<"J"J"="C"=":$A&8)=#E# FEAD4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADADFFFEADADFFH#J"J#="B#=":&@%:(=#E# ADFEO?ADP=FEFEFEFEFEFEFEADADADFEADADADADADADADADADFFADADFEFFADH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#<#B#<#J#>#=#E# FEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADADFEADADADFEAD6FEADADFFFEADADFFH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J$8#=#E# ADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEOBFEFEFEFFADADFEFFADH#?"?"A"J"G"C"A"H"J"C"9"8":"J#J#J#9)=#E# FEADADADAD8ADADADADAD;ADADADADAD@FEAD4FEAD6FEADADADADADFEADADFFFEADADFFH):$J$9&J$=&J&@&J$<&9&?#<&?#C&F#=#E# ADFEADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEFEFEFEFEFFADADFEFFADH"r9%J%8&J%<&J&@&J%<&9&@&8&@&?&@";#=#E# FEADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADFEFEFEFEFEADADADADADFEFEFEFEFEADADADADADFEADFFFEADADFFH#I"A"?"D"B"D"E"H"J'F'H#@#=#E# ADFEFEFEFEFEFEFEFEFEOGADADADADFEADADADADADFEADFEADFFADADFEFFADH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&G)=#E# FEADADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFEO*ADFEFEFEADADFEFEFEADADADFFFEADADFFH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ"="C"=":$B"<$8#=#E# ADFEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J"?"J"J"C"<"J"J":&B";$:$C";$8#=#E# ADFE4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFADADFEFFADH#J"J#;%A#;&8&@#;)=#E# FEADO?ADP=FEFEADADADADFEFEFEADADADFEFEADADADFEFEFEFEADADADFEADADFFFEADADFFH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#>#@#;"J#A#=#E# ADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADADFEADADADAD5ADADFFADADFEFFADH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J#J#=#E# FEADFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEO'FEAD>ADFFFEADADFFH#?"?"A"J"G"C"A"H"J"C"9"8":"J#J#J#=#E# ADFEADADAD8ADADADADAD;ADADADADADBFEAD4FEAD?FFADADFEFFADH):$J$9&J$=&J&@&J$<&9&G&A#A&F#=#E# FEADADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEADFFFEADADFFH)9%J%8&J%<&J&@&J%<&9&G&@#B&F#=#E# ADFEADADADADADADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADADADADADADFEADADADADADADFFADADFEFFADH#I"A"?"D"B"D"E"H"J#J#=#E# FEADFEFEFEFEFEFEFEFEOIFEADO(ADFFFEADADFFH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J%8&G)=#E# ADFEADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFEO$FEFEFEFEADFEFEFEADADFEFEFEADADFFADADFEFFADH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ";"E":&9$C";$8#=#E# FEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADADADADADADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J"?"J"J"C"<"J"J";$C";$:$A&8)=#E# FEAD4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADADFFFEADADFFH#J"J#;&@#;&8&@%:(=#E# ADFEO?ADP=FEFEFEADADADFEFEFEFEADADADFEFEADADADFEADADADADADADADADADFFADADFEFFADH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#J#J#>#=#E# FEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADAD4ADAD>FEADADFFFEADADFFH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J&G&J$8#=#E# ADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEFEADADADADADADADADADADADADADADADADADAD8ADADADADADFEADFFFEADADFFH#I"A"?"D"B"D"E"H"J#@#=#E# ADFEFEFEFEFEFEFEFEFEPGFEADFFADADFEFFADH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&G&8&G)=#E# FEADADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE;ADFEFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADADFFFEADADFFH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ";$C";$:$B"<$8#=#E# ADFEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADADADADADFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J"?"J"J"C"<"J"I$:$C"=":$C";$8#=#E# ADFE4FEFEO FE5FEFEFEO-FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFADADFEFFADH#J"J&8&@#=":&@#;)=#E# FEADO?ADP=FEADADADFEFEADADADFEFEFEFEFEADADADFEFEFEFEADADADFEADADFFFEADADFFH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J"J#<#I#A#=#E# ADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6AD5ADADFEADADADFFADADFEFFADH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J#J#=#E# FEADFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFE8FEADO-ADFFFEADADFFH#?"?"A"J"G"C"A"H"J"C"9"8":"J#J#J#=#E# ADFEADADAD8ADADADADAD;ADADADADAD;FEAD9FEADAFFADADFEFFADH):$J$9&J$=&J&@&J$<&9&:#A&?#C&F#=#E# FEADADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEFEFEFEFEADFFFEADADFFH)9%J%8&J%<&J&@&J%<&9&9#B&@&?&F#=#E# ADFEADADADADADADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADFEADADADADADADFEFEFEFEFEADADADADADFFADADFEFFADH#I"A"?"D"B"D"E"H"J'J#=#E# FEADFEFEFEFEFEFEFEFEP/ADADADADFEAD>ADFFFEADADFFH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J%8&J&G)=#E# ADFEADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE5FEFEFEFEADFEFEFEAD8ADFEFEFEADADFEFEFEADADFFADADFEFFADH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rH&9$C"=":$C";$8#=#E# FEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=#E# FEADSAADFFFEADADFFH#J#=#E# ADFESAFFADADFEFFADH#J#=4 FEADSAADFFFEADFFADFFADFFADFFADFFADFFADFFADFFADFFH#J#=4 ADFESAFFADADFE98FFADFFADFFADFFADFFADFFADFFADFFADH#J"?"J"J"C"<"J"I$<"B$<":$A&8)=&t& FEAD4FEFEO FE5FEFEFEO-FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADADFFFEAD98ADFFADFEAD98ADFFH#J"J&:"B&:":&@%:(='>& ADFEO?ADP=FEADADADFEFEFEADADADFEFEFEADADADFEADADADADADADADADADFFADADFE9898ADFFADFE98FFADH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J"=#B"=#J#>#=#8#>& FEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADFEADADFEAD6FEADADFFFEADFFADFE9898ADFFH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J#J#J$8#=#8#=#8# ADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFE8FEAD4FEAD@FEFEFEFFADADFE98FFFEADFFADH#?"?"A"J"G"C"A"H"J"C"9"8":"J#9#E#9#J#9)=#9#;$8# FEADADADAD8ADADADADAD;ADADADADAD;FEADFEADFEADFEAD6FEADADADADADFEADADFFFEADADFFFEAD98ADFFH):$J$9&J$=&J&@&J$<&9&:#9#<&:#9#C&F#=#9$:#9# ADFEADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEFEADFEADFEFEFEFEFEFFADADFE98ADFFADFEFFADH"r9%J%8&J%<&J&@&J%<&9&9#;&8&9#;&?&@";#=#:#:#9# FEADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADFEADFEFEFEFEFEADADADADADFEADFEFEFEFEFEADADADADADFEADFFFEADFFADFE98ADFFH#I"A"?"D"B"D"E"H"J'F'H#@#=#:#9#:# ADFEFEFEFEFEFEFEFEFEOGADADADADFEADADADADADFEADFEADFFADADFE98FFFEADFFADH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J%H%?&G)=#;':# FEADADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE5FEFEFEFEFEFEFEFEADFEFEFEADADFEFEFEADADADFFFEADADFFADFEAD98ADFFH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rH&;"A&;":$B"<$8#=#;&;# ADFEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADFFADADFE98ADFEADFEFFADH#J#=#<%;# FEADSAADFFFEADFFADFE98ADFFH#J#=#<$<# ADFESAFFADADFE98FEADFFADH#J#=#=#<# FEADSAADFFFEADAD98ADFFH5=4 SEADFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADADFEADFFADFFADFFADFFADFFADFFADFFADFFADH5=4 SEFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFFEADFFADFFADFFADFFADFFADFFADFFADFFADFFHz=z SEAD3AD I5 SCFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEH5 SEFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFFH#y5z#x# ADFE98PAAD98ADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADP198ADFF98FFADH#B5J%A# FEADPCFFADFE98FFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFEP1FFADFFADADFFH#@)z#J'?# ADFEADFFADFEAD98ADFFP;ADFEADP1ADFFADFFADFFFFADH#>+J#J)=# FEADFFADFFADADADFE98FFADP;ADFEP1FFADADADFFADFFADADFFH#<&8&J#J#8';# ADFEADFFADFFADFEAD98ADFFP;FEADP1ADFFADADADFFADFFFFADH#:'9&J#J#;&9# FEADFFADFFADADADADFE98FFADP;ADFEP1FFADADFFADFFADADFFH#8&<&J#J#<* ADFEADFFADFFADFEAD98ADFFP;FEADP1ADFFADADADFFADFF98FFADH)=&J#J#?' FEADFEADFEADADADADFE98FFADP;ADFEP1FFADADFEADFEADFFH)=&J#J#?' ADFE9898ADFEADFEFEAD98ADFFP;FEADP1ADFFFEADFE98FFADH#8&<&J#J#<* FEAD9898FEADFEADFE98FFADP;ADFEP1FFADFEADFEAD989898ADFFH#:'9&J#J#;&9# ADFE9898ADFEADFEFEAD98ADFFP;FEADP1ADFFFEADFE9898FFAD&C#<&8&J#J#8';#J% F7F7F7F7F7FEAD9898FEADFEADFE98FFADP;ADFEP1FFADFEADFEAD9898ADFFFF7F7F7F7&C#>+J#J)=#J& F6F6F6F6F6ADFE9898ADFEADFEAD98ADFFP;FEADP1ADFFADFEADFE9898FFADFF6F6F6F6F68$C#@5J'?#J% F9F9F9FEADPE9898FEADFE98FFADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEP1FFADFEAD9898ADFFGF9F9F9F7H#B5J%A# ADFEPC9898AD98ADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADP1ADFE9898FFADH5 SEFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFH5 SEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADIz SCAD store /green < 9F99DE00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B59765E1A36FE7006B7FFF1A00B28B99FFFFB094FF30F700CEEEEE0073E6A2 4DBF88F54DB358D78080C0C080C080808060C08000A080402070A0402040D0F0 F0E010B489E4A0BE5BB477D9B3FF77FF19264F00B641DE4F829E4780FF0000FF > store /blue < FFFFB3FFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B59765E1A36FE7BF2F7FCC8BEEB2576BFBB3B01532602480FAEEB40073E6A2 4DBF88F556CA58D7D050C080C08080C08060C080FF0000402070C0802040D060 50E010B476C4A0BE7A8C65D9B3E0850070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7QIF6F76F6F7J" RHF78z8z8z 4F9QHF94F9 ;z" R?F7F6$H"9#I' O0FEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEJ'?"I"J"8%Js" O/FEFEF9F9F9FEF9FE9F9F9F9FEFEO@F6F7J"J#Jr O4F9BF9F9P-F9J#8"9$?$:$8"8&:$9'D$9( O1FEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFE@s"J"9#8'<08$:*8%;%8*9$J$ F6F7JF9FEFEFEFEFEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEFEFEFEF9FEFEFEF9FEFEFEF9F9F9FEF9O!F6F6F7ArJ#9":"A";%C$<">&9$:&J" F9LF9F9FEFEFEF9F9F9F9F9F9F9F9F9F9F9FEFEF9F9F9F9FEFEFEF9O#F9@sJ"8#;%>%J# F7KFEF9F9F9F9F9F9F9F9F9F9P.F7F7@tJ">%>%9%C$J$:&J$ F9KFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FE7FEF9FEFEF9F9FEFEO"F9F9F9J0808&8,8"9$829" O0F9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEF9FEFEFEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEFEJ':$8%9$:$:r9$9z:$9rJs O/F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F90F9F9F9F9F9O/F7Jt R7F9 =z8z8z8z /F7Q7F7/F7/F7rF"J"F"F% F7F7Q8F7F7F7F7F7F7'z& F6F6F6F6F6F7R>E5F6F6F6F6F68$J% F9F9F9R@F9F9F9F7 J#8# 4FEFEFEFE J"8"8%8*9% 7FEFEFEFEFEFEFEE5FEFEFEE5FEFEFEFEFEFEFEJ"8)81 7E5E5E5FEFEE5E5FEFEFEE5E5FEFEE5E5FEFEE5FEFEE5E5FEFEJ% O"FEE5E5E5J#D& >FEFEE5E5FEFEFEJ%D"8" >E5E5E5E5E5FEJ":#B% ;FEFEFEFEFEE5E5J+B' 8E5FEFEE5E5FEFEFEFEE5E5FEFEFEFEE5J#9#8%8#8#8#8% 4E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 H5>2 Q:C3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEH5=4 Q:FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFH#z"=#r"r# C3FEQ7C3FFE5FEDEFEDEFFE5H#J#=#<#=# FEC3Q6FFC3FEE5FFE5E5FFH#J#=#<$<# C3FEQ6C3FFE5FEE5FEE5FFE5H#J#=#;%<# FEC3Q6FFC3FEE5E5FFE5FEE5FFH#J#=#;&;# C3FEQ6C3FFE5FEFFE5E5E5FEFFE5H#J#=#:#8#;# FEC3Q6FFC3FEE5FFE5FEE5E5FFH#J#=#:#8$:# C3FEQ6C3FFE5FEE5FFE5FEE5FFE5H#J#=#9$9#:# FEC3Q6FFC3FEE5E5FFE5E5FEE5FFH#J#=#9#;#9# C3FEQ6C3FFE5FEFFE5E5FEFFE5H#J#=#8#<#9# FEC3Q6FFC3FEE5FFE5FEE5E5FFH#J#=#8#<$8# C3FEQ6C3FFE5FEE5FFE5FEE5FFE5H#J#='=#8# FEC3Q6FFC3FEE5DEE5FFE5E5FEE5FFH#J#=&?& C3FEQ6C3FFE5FEDEFFE5E5FEDEFFE5H#J#=4 FEC3Q6FFC3FEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5DEE5FFH#J#=4 C3FEQ6C3FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5H#J#=#z# FEC3Q6FFC3FEE5/DEE5FFH#J#=4 C3FEQ6C3FFE5FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5H#J#=4 FEC3Q6FFC3FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFH#J#=%v% C3FEQ6C3FFE5FEE5FFE5FEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A% FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A% C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=4 FEC3Q6FFC3FEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFH#J#=4 C3FEQ6C3FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5H#J#=#z# FEC3Q6FFC3FEE5/DEE5FFH#J#=4 C3FEQ6C3FFE5FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5H#J#=4 FEC3Q6FFC3FEE5DEE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFH#J#=%v% C3FEQ6C3FFE5FEDEFFE5FEDEFFE5H#J#=&?& FEC3Q6FFC3FEE5DEDEFFFEE5DEE5FFH#J#=#8#=' C3FEQ6C3FFE5FEE5FFFEE5DEDEFFE5H#J#=#8$<#8# FEC3Q6FFC3FEE5DEE5FFE5FEE5FFH#J#=#9#<#8# C3FEQ6C3FFE5FEFFE5FEDEFFE5H#J#=#9#;#9# FEC3Q6FFC3FEE5DEFFFEE5E5FFH#J#=#:#9$9# C3FEQ6C3FFE5FEE5FFFEE5DEFFE5H#J#=#:$8#:# FEC3Q6FFC3FEE5DEE5FFE5FEE5FFH#J#=#;#8#:# C3FEQ6C3FFE5FEFFE5FEDEFFE5H#J#=#;&;# FEC3Q6FFC3FEE5DEFFE5FEE5E5FFH#J#=#<%;# C3FEQ6C3FFE5FEE5FEE5DEFFE5H#J#=#<$<# FEC3Q6FFC3FEE5DEE5FEE5FFH#J#=#=#<# C3FEQ6C3FFE5FEFEDEFFE5H5=4 Q:FEC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFH5=4 Q:C3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5Hz>z Q:E51E5 J&?#F#8# 5FEFEFEFEFEFEFEFEFEFEFEJ(J# 4FEFEE5E5E5FEFE>E5E5J%<%9%8"8%8%8& =FEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEE5FEFEJ/:08":'9% 4E5FEFEFEE5E5E5E5FEFEE5E5FEFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5FEFEE5E5FEFEFEE5FEFEJ&J#H" 5E5E5FEFEFE7E5E5E5J"8"9#># 7E5FEFEFEFEFEJ#8";%<% 4FEFEE5E5E5E5E5E5E5E5E5J#>#;#;" @FEFEFEFEFEFEFEJ/:.8%9' 4E5FEFEFEFEFEE5E5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5J&9%8#8%9%:&8%8#8# 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 H5 R%C3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3H5 R%FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FFH#z# C3FER!C3FFC3H#J# FEC3R!C3FFH#J# C3FER!FFC3H#J# FEC3R!C3FFH#J# C3FER!FFC3H#J# FEC3R!C3FFH#J# C3FER!FFC3H#J# FEC3R!C3FFH#J# C3FER!FFC3H#J# FEC3R!C3FFH#J# C3FER!FFC3&C#J#C% F7F7F7F7F7FEC3R!C3FFF7F7F7F7&C#J#C& F6F6F6F6F6C3FER!FFC3F6F6F6F6F68$C#J#D% F9F9F9FEC3R!C3FFF9F9F9F7H#J# C3FER!FFC3H5 R%FEC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFH5 R%C3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3Hz R%E5 store /green < 9F99DE00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B59765E1A36FE7006B7FFF1A00B28B99FFFFB094FF30F700CEEEEE0073E6A2 4DBF88F54DB358D78080C0C080C080808060C08000A080402070A0402040D0F0 F0E010B489E4A0BE5BB477D9B3FF77FF19264F00B641DE4F829E4780FF0000FF > store /blue < FFFFB3FFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B59765E1A36FE7BF2F7FCC8BEEB2576BFBB3B01532602480FAEEB40073E6A2 4DBF88F556CA58D7D050C080C08080C08060C080FF0000402070C0802040D060 50E010B476C4A0BE7A8C65D9B3E0850070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7TJF6F76F6F7J" UIF78z8z8z 4F9TIF94F9 ;z" U@F7F6$H"9#I' P:FEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEJ"8$>"A'?"I"J"8%Js" P:F9F9F9F9F9FEFEF9F9F9FEF9FE9F9F9F9FEFEPJF6F7J"9#I"J#Jr P@F9F9F9F9BF9F9Q7F9J"9$?$:#8"9$?$:$8"8&:$9'D$9( P?FEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFE@s"J#8$?)9#8'<08$:*8%;%8*9$J$ F6F7P*FEFEF9F9F9FEFEFEF9FEFEF9F9FEFEFEFEFEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEFEFEFEF9FEFEFEF9FEFEFEF9F9F9FEF9P+F6F6F7ArJ#G":#9":"A";%C$<">&9$:&J" F9P+F9F9FEF9F9FEFEFEF9F9F9F9F9F9F9F9F9F9F9FEFEF9F9F9F9FEFEFEF9P-F9@sJ"E'8#;%>%J# F7P-F9F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9Q8F7F7@tJ%8">%>%9%C$J$:&J$ F9P"E$<$J"J"J"9"C"=#J"B$8#A":#J" FFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECFEBFEO"FEFEFEFEFEGFEFEFEFEFEFEFEFEFECFEH#8#<%8&<#E#<%G"F#J#J#9"C"="H"I#B(A#:"J#9" FEFFFEFEFFFFFFFFFEFFFFFFFEFEFFFFFFFEFFFFFFFEFEFFAFEFFO!FEFFFFFFFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFFEH#8#J# FFFEFFFFS&FFFFH#J)8#8#?&9$9&8&9$<):$9&9$<#9$:$8&8&:$8&<#8$9,;$:&8$9&9$J$<#9$:$8&:$:$<#8& FEFF:FEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFFFEFEFEFEFEFFFEFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEH#@$9"8#>)9"@&8&8&8&8&>'8&8&8&?&848-?#:+;%9-8&8&J%?%9-8&8&?& FFFEFEFEFEFFFEFFFFFEFFFEFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFEFFFEFEFFFFFFFEFFFEFFFFFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFEFFFEFFFEFFFFFEFFFEFFFEFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFFEFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFFFEFFFFH#?&:#;#J$G&:#A$D":#="J"=#B"J$@&8&J#A$G&:#:$ FEFFFFFFFFFFFEFEFFFEFF@FEFEFEFFFEFEFEFFFEFFFEFEFEFFFEFFFF?FFFEFFFE:FEFEFEFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFFEFFFEH#G#J%G%G%J%@%8PJ%G%@$ FFFEFEFFHFFFFFFFFFFFFFFFEFFFFFFFFP0FFFFFFFFFFFFFFFEMFFFFFFFFFFFFFFFEFFFFFFH#>"=#8"9#J"D$=#E"C"9#>"J#A&J"=$J#E"F"=# FEFFFEFEFFFEFEFFDFEFEFFFEFEFFFEFEFEFFFEFFEFFFFFEFFFEFF;FEFEFFFEJFEFFFEFEFEFFH#8-9$?";59&8%:,>";(8%9&?&8(;#;,9">&?&8,9&9,?&9";-?/;(8& FFFEFEFEFEFEFEFFFFFEFEFEFEFFFEFEFEFE4FEFFFFFEFEFEFFFEFFFEFEFEFEFEFEFFFEFEFEFEFFFEFEFEFFFEFEFEFEFFFEFEFEFFFFFFFEFEFEFFFEFEFFFFFEFEFEFFFEFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFH#8P8%9P8#:R8Z:$9%;$9$9#:R8$9%:$9#<$:$8Y8$8$8&;P9$9P9P8$:$;$9$@P9"<$8P9#FEE5FEFEJ%8#J#J' 6E5E5FEFEE5E5EE5E5P@E5E5E5E5E5E5J29%8"8"8%8(8%9%J#;%9% 8E5FEFEE5FEFEE5FEFEE5FEFEE5FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEFEFEFEFEP7FEFEFEFEFEFEFEFEFEFEJ"808)9";.J. AFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5E5FEFEE5E5FEFEFEFEFEE5E5FEFEE5FEFEE5E5FEFEPE5E5E5E5E5FEP>E5E5E5E5E5FEJ$C#;#;"I(J( 8FEFEE5FEFEFEFEFEFEFEE5FEFEE5E5PBFEFEE5FEFEE5E5J%@.8+?.J. 6FEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5P2C5>2 PIFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEPHFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEH5>4B5=4 PHFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFPHFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFH5?#r"r#B#Z>#r"r# PGFFFEDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEE5FEDEFEDEFFE5FFFEPEE5FEDEFEDEFFE5H#z"?#<#=#B#J#<#=# FEFFPDDEFEFEE5FFE5E5FFFEFFPMFEE5FFE5E5FFH#J"B$8#A":#J"J"?#<$<#B#J"J#<$<# FFFE8FEFEFEFEFEFEFEFEFECFE>DEE5FEE5FEE5FFE5FFFE4FEP8E5FEE5FEE5FFE5H#8"I#B(A#:"J#J"?#;%<#B#I(A"<"H&J#;%<# FEFFFEFEFEFEDEDEDEFEDEDEFEDEDECFEDE>FEFEE5E5FFE5FEE5FFFEFFFEFFFEFEFEFEFEFEFEFEFEFEFEFEO7FEE5E5FFE5FEE5FFH#J#J"?#;&;#B#J'J'J#;&;# FFFE6DEDEP,DEE5FEFFE5E5E5FEFFE5FFFE5FFFEFFFFFFFEDFFFEFFFFFFFEO6E5FEFFE5E5E5FEFFE5H)9$J$<#9$:$8&:$:$<#J"?#:#8#;#B#8$:$<#>#8#8&8&9$8&A$8(J#:#8#;# FEFFDEFEFEFEFEFEFEFEFE@FEFEFEFEDEFEFEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEDE?FEFEE5FFE5FEE5E5FFFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEO'FEE5FFE5FEE5E5FFH)8&J%?%9-8&8&J"?#:#8$:#B)8&@'9"9&8&8-9%8)9#J#:#8$:# FFFEDEDEFEDEDEDEFEDEDEDEFE?DEDEDEFEFEDEDEDEFEDEDEDEFEDEDEFEDEFEDEFEFEDEDEDEFEFEDEDEDEFEFDEE5FEE5FFE5FEE5FFE5FFFEFFFEFFFFFFFEFEFFFFFFFEFEFEFEFFFFFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFEFEFEFFFEFFFFFFFEFFFFFFFFFFO'E5FEE5FFE5FEE5FFE5H#>&8&J#A$G&:#J"?#9$9#:#B#>&:#:%J"<%@$J#9$9#:# FEFFDEFEFEFEDEFEFEFEFEFE@FEDEFEFEFEDEFEFEFEDEFEDE@FEFEE5E5FFE5E5FEE5FFFEFFFFFEFEFEFFFEFFFFFFFFFE?FFFFFFFFFEFFFEFFO)FEE5E5FFE5E5FEE5FFH#?%8&J%G%J"?#9#;#9#B#?%J$J#9#;#9# FFFEDEDEDEFEDEDEDEDEDEMDEDEDEDEDEDEDEFEFDEE5FEFFE5E5FEFFE5FFFEFFFFFFFEO4FEFFFEO)E5FEFFE5E5FEFFE5H#<$J#E"F"=#J"?#8#<#9#B#>"=#J"<"J&J#8#<#9# FEFFFEDEFEJFEDEFEFEFEDEAFEFEE5FFE5FEE5E5FFFEFFFEFEFF7FEFE=FEFFFFFFFEO(FEE5FFE5FEE5E5FFH#8,?&9";-?/;(8&@"J"?#8#<$8#B)8&>'8'8&809(8(;"J#8#<$8# FFFEDEFEFEFEDEDEDEFEFEFEDEFEFEFEFEFEFEDEFEFEFEDEDEFEDEFEFEFEDEDEFEFEFEDEFEDEDEFEFEFEDEDEFEFEDEDEFEFEFEDEDEFEFEFEDEFE;DEE5FEE5FFE5FEE5FFE5FFFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFFFEFEFEFFFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEO'E5FEE5FFE5FEE5FFE5H#9$9$@&9"<$8&9#<&8$8r8$:$9#<"J"?'=#8#B#8$:$9#:P:P9$:$9$8$8R:$8#9#J'=#8# FEFFDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEFEDEDE;FEFEE5DEE5FFE5E5FEE5FFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFO'FEE5DEE5FFE5E5FEE5FFH#J"J"J"?&?&B#E"J&?& FFFEO$DEIDECDEE5FEDEFFE5E5FEDEFFE5FFFEFFP=E5FEDEFFE5E5FEDEFFE5H#J"?4B#J4 FEFFPDFEFEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5DEE5FFFEFFPMFEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5DEE5FFH#J"?4B#J4 FFFEPDDEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5FFFEPME5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5H5?#z#B#J#z# PGFEFFFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEFEE5/DEE5FFFEFFPMFEE5/DEE5FFH#Z?4B#J4 FFFEPEE5FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFFEPME5FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5H#J4B#J4 FEFFQ FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFFEFFPMFEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFH#J"B$8#A":#J"J%v%B#J"@"A$J%v% FFFE8FEFEFEFEFEFEFEFEFECFEHE5FEE5FFE5FEE5FFE5FFFE4FEFEFEFEFEOME5FEE5FFE5FEE5FFE5H#8"I#B(A#:"J#J%A%B#I(;"A#J%A% FEFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFHFEE5FFE5E5FEE5FFFEFFFEFFFEFEFEFEFEFFFFFFP FEE5FFE5E5FEE5FFH#J#J%A%B#J'J%A% FFFE6FFFFP6E5FEE5FFFEE5FFE5FFFE5FFFEFFFFFFFEP2E5FEE5FFFEE5FFE5H)9$J$<#9$:$8&:$:$<#J%A%B#8$:$<#?$:%A$:&J%A% FEFFFFFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFIFEE5FFE5E5FEE5FFFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEO&8&J#A$G&:#J%A%B#>&:#H$J%A% FEFFFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFJFEE5FFE5E5FEE5FFFEFFFFFEFEFEFFFEFFFEFEFEP%FEE5FFE5E5FEE5FFH#?%8PJ%G%J%A%B#?%J%J%A% FFFEFFFFFFFEMFFFFFFFFFFFFFFFEO"E5FEE5FFFEE5FFE5FFFEFFFFFFFE7FEFFFFFFP%E5FEE5FFFEE5FFE5H#<$J#E"F"=#J%A%B#>"=#J%A% FEFFFEFFFEJFEFFFEFEFEFFKFEE5FFE5E5FEE5FFFEFFFEFEFFP;FEE5FFE5E5FEE5FFH#8,?&9";-?/;(8&@"<"J%A%B)8&>'8&848%J%A% FFFEFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFE>E5FEE5FFFEE5FFE5FFFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEO>E5FEE5FFFEE5FFE5H#9$9$@P9"<$8P9#FEE5FFE5E5FEE5FFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFO>FEE5FFE5E5FEE5FFH#J"J"J%A%B#E"J%A% FFFEO$FFIFFME5FEE5FFFEE5FFE5FFFEFFP=E5FEE5FFFEE5FFE5H#J%A%B#J%J%A% FEFFQ FEE5FFE5E5FEE5FFFEFFO,FEFEFEFFO=FEE5FFE5E5FEE5FFH#J%A%B#J$J%A% FFFEQ E5FEE5FFFEE5FFE5FFFEO,FFFFFFO>E5FEE5FFFEE5FFE5H#J%A%B#J%A% FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5FFE5E5FEE5FFH#J%A%B#J%A% FFFEQ E5FEE5FFFEE5FFE5FFFEPME5FEE5FFFEE5FFE5H#J%A%B#J%A% FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5FFE5E5FEE5FFH#J"B$8#A":#J"J%A%B#J"@"A$J#C$:$J%A% FFFE8FEFEFEFEFEFEFEFEFECFEHE5FEE5FFFEE5FFE5FFFE4FEFEFEFEFE8FEFEFEFEFEFEFEFEJE5FEE5FFFEE5FFE5H#8"I#B(A#:"J#8$8(8%J%A%B#I(;"A#J'D#;#J%A% FEFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFE4FEE5FFE5E5FEE5FFFEFFFEFFFEFEFEFEFEFFFFFF4FEFEFEFEFFFFFFFFFFFFKFEE5FFE5E5FEE5FFH#J#J3J%A%B#J'J%J%A% FFFE6FFFFO=FEFFFFFFFEFFFFFEFFFFFFFEFFFFFEFFFFFF5E5FEE5FFFEE5FFE5FFFE5FFFEFFFFFFFEEFEFFFFFFO7E5FEE5FFFEE5FFE5H)9$J$<#9$:$8&:$:$<#J"J%A%B#8$:$<#?$:%A$:&;":#:$J%A% FEFFFFFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFF4FF4FEE5FFE5E5FEE5FFFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFFFEFEFEFEFEO)FEE5FFE5E5FEE5FFH)8&J%?%9-8&8&C"9$:#J%A%B)8&F#;&?&8'8#;%8&J%A% FFFEFFFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFEFEFE6E5FEE5FFFEE5FFE5FFFEFFFEFFFFFFFEFEFFFFFFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFEFEFEFFFFFEFEFFFFFFFEO(E5FEE5FFFEE5FFE5H#>&8&J#A$G&:#@"9"8&J%A%B#>&:#H$J&9"<$J%A% FEFFFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFFFFFFFFFFEFEFE4FEE5FFE5E5FEE5FFFEFFFFFEFEFEFFFEFFFEFEFE8FFFFFEFEFEFFFEFEFEO)FEE5FFE5E5FEE5FFH#?%8PJ%G%C"A#J%A%B#?%J%J#A%J4 FFFEFFFFFFFEMFFFFFFFFFFFFFFFEFEFFFF5E5FEE5FFFEE5FFE5FFFEFFFFFFFE7FEFFFFFF:FFFFFFFFFFFFO(E5FEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5H#<$J#E"F"=#C":"J%A%B#>"=#J"G"J4 FEFFFEFFFEJFEFFFEFEFEFFFEFE8FEE5FFE5E5FEE5FFFEFFFEFEFFO FEFEO(FEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFH#8,?&9";-?/;(8&?&9$:%J%A%B)8&>'8&848%:38.J#z# FFFEFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFFFEFEFEFF4E5FEE5FFFEE5FFE5FFFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEGE5FE/DEFFE5H#9$9$@P9"<$8P9#E5FEFFE5H#J%A%B#J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5E5FFH#J%A%B#J#E# FFFEQ E5FEE5FFFEE5FFE5FFFEPME5FEFFE5H#J%A%B#J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5E5FFH#J%A%B#J"J"A$=#J#E# FFFEQ E5FEE5FFFEE5FFE5FFFE4FEMFEFEFEFEFEFEO!E5FEFFE5H#J%A%B#I)@"H':"A#>"J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFO"FEE5E5FFH#J%A%B#J&J&J#E# FFFEQ E5FEE5FFFEE5FFE5FFFE5FFFEFFFFFF>FFFEFFFFFFO>E5FEFFE5H#J%A%B#8$:$<#:*9&8.9":$;$A$J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFFEFEFEFEFEFEFEFFFEFFFFFFFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEO"FEE5E5FFH#J%A%B)8&@":'8&8#P'8"8"8#;&?%J#E# FFFEQ E5FEE5FFFEE5FFE5FFFEFFFEFFFFFFFEFEFFFFFFFEFEFFFEFEFFFFFEFFFEFFFFFFFFFEFEFFFFFFFEFFFEFFFFFFFEFFFFFFFEFEFFFFFFO"E5FEFFE5H#J%A%B#>&:#:"<"J"C$J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFFFFEFEFEFFFEFFFFFF;FFFEFEFEO0FEE5E5FFH#J%A%B#?%A"J&:"B%J#E# FFFEQ E5FEE5FFFEE5FFE5FFFEFFFFFFFEFF9FFFEFFFEFFFFFFFFFFFFO/E5FEFFE5H#J%A%B#>"=#>"D"@"J"J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFFEFEFFFEFEFE6FEO/FEE5E5FFH#J%A%B)8&>&8$9"8+:$8%:&8&8.J#E# FFFEQ E5FEE5FFFEE5FFE5FFFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFFFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFEO E5FEFFE5H#J%A%B#8$:$9#:U8#9$8%?%:P9$9Q8PJ#E# FEFFQ FEE5FFE5E5FEE5FFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFO FEE5E5FFH#J%A%B#E"J#E# FFFEQ E5FEE5FFFEE5FFE5FFFEFFP=E5FEFFE5H#J%A%B#J$J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFO$FEFEFFOFFEE5E5FFH#J%A%B#J#J#E# FFFEQ E5FEE5FFFEE5FFE5FFFEO$FFFFOGE5FEFFE5H#J%A%B#J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5E5FFH#J%A%B5@#E# FFFEQ E5FEE5FFFEE5FFE5PEFFFEDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEE5FEFFE5H#J%A%B#z?#E# FEFFQ FEE5FFE5E5FEE5FFFEFFPDDEFEE5E5FFH#J%A%B#J"@":$J$J"J#E# FFFEQ E5FEE5FFFEE5FFE5FFFE4FEFEFEFEFE9FEFEFE;FEJE5FEFFE5H#J%A%B#I):":#C%?#J"="G&J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFFEDEFEFEFEFEFEFEDEDEDEFEFEFEFEDEDE4FEDEFEFEFEFEFE4FEE5E5FFH#J%A%B#J&J%J'I#E# FFFEQ E5FEE5FFFEE5FFE5FFFE5DEFEDEDEDE8FEDEDEDEO,DEFEDEDEDEFEE5FEFFE5H#J%A%B#8$:$<#:":$B$="9$A$:$9&8$;$8&A$8#?#E# FEFFQ FEE5FFE5E5FEE5FFFEFFFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEFEE5E5FFH#J%A%B)8&@"8"8#B&9#:&?&8&8&8#;-9%8)?#E# FFFEQ E5FEE5FFFEE5FFE5FFFEDEFEDEDEDEFEFEDEDEDEFEFEDEDEDEFEDEDEDEFEFEFEFEDEDEDEFEFEDEDEDEFEFEDEDEDEFEDEFEDEDEDEDEDEFEDEDEDEFEDEDEFEFEDEDEFEFEFEFEDEFEDEDEDEFEDEDEDEE5FEFFE5H#J%A%B#>&:#:"J$9&9$A$="J"<%I#E# FEFFQ FEE5FFE5E5FEE5FFFEFFDEFEFEFEDEFEDEDE4FEFEFEDEDEFEFEFEFEFEFEFEFEFEDE8DEDEDEDEFEFEE5E5FFH#J%A%B#?%A"I%:#:%@%J#E# FFFEQ E5FEE5FFFEE5FFE5FFFEDEDEDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEO/E5FEFFE5H#J%A%B#>"=#J"8"@"C"<"="J"?#E# FEFFQ FEE5FFE5E5FEE5FFFEFFFEFEDE=FEFEFEFEFEFEDFEFEE5E5FFH#J%A%B)8&>%:&8-9%8&8-8&9,8*9(8(@#E# FFFEQ E5FEE5FFFEE5FFE5FFFEDEDEFEFEFEDEDEFEFEFEDEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDEDEFEFEFEDEFEFEFEDEDEFEFEFEDEFEFEFEFEFEFEDEDEFEFEFEDEDEFEFEFEDEDEFEFEFEDEDEFEFEFEFEFEDEFEFEFEDEDEFEFEFEFEFEFEFEFEFEDEDEFEFEFEDEDEFEE5FEFFE5H#J%A%B#8$:$9#:%:&8'8$9%:$9'8$:$;$8&9$8$8r:$8#?#E# FEFFQ FEE5FFE5E5FEE5FFFEFFDEDEDEDEDEDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEFEE5E5FFH#J%A%B#E"J#E# FFFEQ E5FEE5FFFEE5FFE5FFFEDEP=E5FEFFE5H#J%A%B#J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5E5FFH#J%A%B#J#E# FFFEQ E5FEE5FFFEE5FFE5FFFEPME5FEFFE5H#J%A%B5@#E# FEFFQ FEE5FFE5E5FEE5FFPEFEFFFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEFEE5E5FFH#J%A%B#Z?#E# FFFEQ E5FEE5FFFEE5FFE5FFFEPDE5FEFFE5H#J%A%B#J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5E5FFH#J%A%B#J"@":$J$J"J"D#E# FFFEQ E5FEE5FFFEE5FFE5FFFE4FEFEFEFEFE9FEFEFE;FE;FEE5FEFFE5H#J%A%B#I):":#C%?#J"="G&;"D#E# FEFFQ FEE5FFE5E5FEE5FFFEFFFEFFFEFEFEFEFEFEFFFFFFFEFEFEFEFFFF4FEFFFEFEFEFEFEFFFEE5E5FFH#J%A%B#J&J%J'I#E# FFFEQ E5FEE5FFFEE5FFE5FFFE5FFFEFFFFFF8FEFFFFFFO,FFFEFFFFFFFEE5FEFFE5H#J%A%B#8$:$<#:":$B$="9$A$:$9&8$;$8&@$:"?#E# FEFFQ FEE5FFE5E5FEE5FFFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEE5E5FFH#J%A%B)8&@"8"8#B&9#:&?&8&8&8#;-?#;"?#E# FFFEQ E5FEE5FFFEE5FFE5FFFEFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFEFEFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFFFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFE5FEFFE5H#J%A%B#>&:#:"J$9&9$A$="J"J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFFFFEFEFEFFFEFFFF4FEFEFEFFFFFEFEFEFEFEFEFEFEFEFF8FF=FEE5E5FFH#J%A%B#?%A"I%:#:%@%J"?#E# FFFEQ E5FEE5FFFEE5FFE5FFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFO%FEE5FEFFE5H#J%A%B#>"=#J"8"@"C"<"="J#E# FEFFQ FEE5FFE5E5FEE5FFFEFFFEFEFF=FEFEFEFEFEFEO FEE5E5FFH#J%A%B)8&>%:&8-9%8&8-8&9,8*9(8&8"?#E# FFFEQ E5FEE5FFFEE5FFE5FFFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFFE5FEFFE5H#J4B#8$:$9#:%:P8Q8$9%:$9Q8$:$;$8P9$8$8R9PB#E# FEFFQ FEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE5E5FFH#J4B#E"J#E# FFFEQ E5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5FFFEFFP=E5FEFFE5H#J#z#B#J#E# FEFFQ FEE5/DEE5FFFEFFPMFEE5E5FFH#J4B#J4 FFFEQ E5FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFFEPME5FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5H#J4B#J4 FEFFQ FEE5DEE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFFEFFPMFEE5DEE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFH#J%v%B#J%v% FFFEQ E5FEDEFFE5FEDEFFE5FFFEPME5FEDEFFE5FEDEFFE5H#J&?&B#J&?& FEFFQ FEE5DEDEFFFEE5DEE5FFFEFFPMFEE5DEDEFFFEE5DEE5FFH#J#8#='B#J"D#C$D#A"=#J#8#=' FFFEQ E5FEE5FFFEE5DEDEFFE5FFFE4FEFEFEFEFEFEFEFEFEFEFEO!E5FEE5FFFEE5DEDEFFE5H#J#8$<#8#B#I&A"D#E"8(9"="H"J#8$<#8# FEFFQ FEE5DEE5FFE5FEE5FFFEFFFEFFFEFEFEFFFFFFFFFEFEFEFFFEFEFEFFFFFE=FEE5DEE5FFE5FEE5FFH#J#9#<#8#B#J$J(J#9#<#8# FFFEQ E5FEFFE5FEDEFFE5FFFE5FFFEFFO FFFEFFFFFFFEFFO.E5FEFFE5FEDEFFE5H#J#9#;#9#B#8$:$<#?%:$:$A$:$;":$;$:&8$9&J#9#;#9# FEFFQ FEE5DEFFFEE5E5FFFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFE:FEE5DEFFFEE5E5FFH#J#:#9$9#B)8&F&9%8&?&8%@#;%9-8&J#:#9$9# FFFEQ E5FEE5FFFEE5DEFFE5FFFEFFFEFFFFFFFEFEFFFFFFFEFFFFFFFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFF:E5FEE5FFFEE5DEFFE5H#J#:$8#:#B#>&:#A$A$A$J$J#:$8#:# FEFFQ FEE5DEE5FFE5FEE5FFFEFFFFFEFEFEFFFEFFFEFEFEFEFEFEFEFEFEGFEFEFEBFEE5DEE5FFE5FEE5FFH#J#;#8#:#B#?%C"8%A%@%@$J%J#;#8#:# FFFEQ E5FEFFE5FEDEFFE5FFFEFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFEFFFE9FFFFFFFFAE5FEFFE5FEDEFFE5H#J#;&;#B#>"=#J"C"?"9"J"="J#;&;# FEFFQ FEE5DEFFE5FEE5E5FFFEFFFEFEFF=FEFEFFFF;FEFE9FEE5DEFFE5FEE5E5FFH#J#<%;#B)8&>&9-8&8-8'>&8,9&9&J#<%;# FFFEQ E5FEE5FEE5DEFFE5FFFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFF9E5FEE5FEE5DEFFE5H#J#<$<#B#8$:$9#:Q9U:$9Q8$:P8$9P9P8$:$;$J#<$<# FEFFQ FEE5DEE5FEE5FFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FEE5DEE5FEE5FFH#J#=#<#B#E"J#=#<# FFFEQ E5FEFEDEFFE5FFFEFFP=E5FEFEDEFFE5H#J4B#J"J4 FEFFQ FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFFEFFP$FFHFEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFH"J4B"J4 FFQ!E5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFQ E5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5Hz>zCz>z PIE51E5PHE51E5 I5J5 PGFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEHPGFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEH5J5 PIFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFFPHFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5H#y"z5x#J#y"z5x# E5FEDEE5O:DE=FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5DEE5FFDEFFE5FE5FEDEE5O9DE=E5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5DEDEDEDEDEDEFFE5DEE5FFH#B$J5A#J#B$J5<%A# FEE5FFE5FEO:?E5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FEDEFFE5FFE5E5FFFFEE5FFE5FEO95FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFE5FFFFE5H#@&J"z*?#J#@&J#z#<'?# E5FEE5FFE5FEE5O:FF7E5FEE5DEE5FFE5FFE5FFFFE5FE5FEE5FFE5FEE5O9E5FF1E5FEE5FFE5FFE5FFE5E5FFH#>(J#J,=#J#>(J#G#<)=# FEE5FFE5FFE5E5E5FEO:E5FF6E5FEDEFFE5E5E5FFE5FFE5E5FFFFEE5FFE5FFE5E5E5FEO9FFE5E5FEE5FFE5E5E5FFE5FFFFE5H#<&8#J#J&8';#J#<&8#J#G#<#9&;# E5FEE5FFE5FFE5FEE5O:FFE56FEE5DEE5FFE5E5E5FFE5FFFFE5FE5FEE5FFE5FFE5FEE5O9E5FFFEE5FFE5E5FFE5FFE5E5FFH#:'9#J#J&;&9#J#:'9#J#G#<#:'9# FEE5FFE5FFE5E5E5E5FEO:E5FF6E5FEDEFFE5E5FFE5FFE5E5FFFFEE5FFE5FFE5E5E5E5FEO9FFE5E5FEE5FFE5E5E5FFE5FFFFE5H#8&<#J#J&<*J#8&<#J#G#<#=) E5FEE5FFE5FFE5FEE5O:FFE56FEE5DEE5FFE5E5E5FFE5FFDEFFE5FE5FEE5FFE5FFE5FEE5O9E5FFFEE5FFE5E5FFE5FFE5DEE5FFH)=#J#J&?'J)=#J#G#<#>( FEE5FEE5FEE5E5E5E5FEO:E5FF6E5FEDEFFE5E5FEE5FEE5FFFFEE5FEE5FEE5E5E5E5FEO9FFE5E5FEE5FFE5FEE5FEE5FFE5H)=#J#J&?'J)=#J#G#<#>( E5FEDEDEE5FEE5FEFEE5O:FFE56FEE5DEE5FFFEE5FEDEFFE5FE5FEDEDEE5FEE5FEFEE5O9E5FFFEE5FFE5FEE5FEE5DEE5FFH#8&<#J#J&<*J#8&<#J#G#<#=) FEE5DEDEFEE5FEE5FEO:E5FF6E5FEDEFFE5FEE5FEE5DEDEDEE5FFFFEE5DEDEFEE5FEE5FEO9FFE5E5FEE5FFFEE5FEDEDEDEFFE5H#:'9#J#J&;&9#J#:'9#J#G#<#:'9# E5FEDEDEE5FEE5FEFEE5O:FFE56FEE5DEE5FFFEE5FEDEDEFFE5FE5FEDEDEE5FEE5FEFEE5O9E5FFFEE5FFE5FEE5FEE5DEDEE5FFH#<&8#J#J&8';#J#<&8#J#G#<#9&;# FEE5DEDEFEE5FEE5FEO:E5FF6E5FEDEFFE5FEE5FEE5DEDEE5FFFFEE5DEDEFEE5FEE5FEO9FFE5E5FEE5FFFEE5FEDEDEFFE5H#>(J#J,=#J#>(J#G#<)=# E5FEDEDEE5FEE5FEE5O:FFE56FEE5DEE5FFE5FEE5FEDEDEFFE5FE5FEDEDEE5FEE5FEE5O9E5FFFEE5FFE5FEE5FEE5DEDEE5FFH#@&J5?#J#@&J5<'?# FEE5DEDEFEE5FEO:AE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEDEFFE5FEE5DEDEE5FFFFEE5DEDEFEE5FEO95FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5FEDEDEFFE5H#B$J5A#J#B$J5<%A# E5FEDEDEE5O:?FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5DEE5FEDEDEFFE5FE5FEDEDEE5O95E5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5DEDEE5FFH5J5 PIFEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFFPHFEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5H5J5 PIE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FPHE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFIzJz PGE5HPGE5 J&?#F#8# 5FEFEFEFEFEFEFEFEFEFEFEJ(J# 4FEFEE5E5E5FEFE>E5E5J%<%9%8"8%8%8& =FEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEE5FEFEJ/:08":'9% 4E5FEFEFEE5E5E5E5FEFEE5E5FEFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5FEFEE5E5FEFEFEE5FEFEJ&J#H" 5E5E5FEFEFE7E5E5E5J"8"9#># 7E5FEFEFEFEFEJ#8";%<% 4FEFEE5E5E5E5E5E5E5E5E5J#>#;#;" @FEFEFEFEFEFEFEJ/:.8%9' 4E5FEFEFEFEFEE5E5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5J&9%8#8%9%:&8%8#8# 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 Fz U*FE H5 U%FFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH5 U&FEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH#Z FFFEU#H#J# FEFFO1FEFEH#J"J"9"C"=#J"B$8#A":#J"@":$J$J" FFFE5FEO"FEFEFEFEFEGFEFEFEFEFEFEFEFEFECFEFEFEFEFE9FEFEFE;FEH#J#J#9"C"="H"I#B(A#:"J):":#C%?#J"="G& FEFF4FEFFO!FEFFFFFFFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFFEFEFEFEFEFEFFFFFFFEFEFEFEFFFF4FEFFFEFEFEFEFEH#J#J&J%J' FFFEPKFFFFO"J#A&J"=$J#E"F"=#J"8"@"C"<"="J& FEFFFEFEFFFEFFEFFFFFEFFFEFF;FEFEFFFEJFEFFFEFEFEFF=FEFEFEFEFEFEDFEFFFFFFFEH#8%9&?&8(;#;,B&?&8,9&9,?&9";-?/;(8&>%:&8-9%8&8-8&9,8*9(8(;" FFFEFEFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFFFEFE&C#8%:$9#<$:$8Y8$8$8"8#;P9$9P9P8$:$;$9$@P9"<$8P9# store /green < 57D79F00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B56B7F9765E1A36FE700FF1A00B28BEEEE0073E6A24DBF00CEF599FFFFB094 FFF730884DB358D78080C0C080C080808060C08000A080402070A0402040D0F0 F0E010B4BE5BB477D9B3FF7789E4A0FF19264F00B641DE4F829E4780FF0000FF > store /blue < 8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B52F7F9765E1A36FE7BFCC8BEEB257EEB40073E6A24DBF80FAF56BFBB3B015 3224608856CA58D7D050C080C08080C08060C080FF0000402070C0802040D060 50E010B4BE7A8C65D9B3E08576C4A00070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7TMF6F76F6F7J" ULF78z8z8z 4F9TLF94F9 ;z" UCF7F6" Q8FEFEFEFEF9FE?FEFEFEFEFEFEJ'J"?" Q7FEFEF9F9F9FEKF9FEJ$9"J#<# Q6FEFEF9F9@F9F9FEFEJ$8'829&;#9"8# QAFEFEFEFEFEFEF9FEFEFEFEFEFEF9FEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEF9FEFEFEFEFE@s"J+8'8'8"8":':%8"8# F6F7Q*F9F9FEFEFEF9FEFEFEF9FEF9FEFEFEF9F9F9F9FEF9F9FEF9FEFEF9F9FEFEFEF9FEFEF9F9F9ArJ$;$9':$E" F9Q/F9F9F9F9F9F9F9FEFEF9FEF9F9F9F9F9@sJ"J' F7Q+FECF9FEFEFEFEF9@tJ$9":$;$:%C& F9Q#F9FEFEFEFEF9FEFEF9FEF9FEFEF9FEF9F9F9F9J09&>"8"8"8"8(8"9"8$ Q7F9FEFEFEFEFEF9F9F9F9FEFEFEF9F9F9FEFEF9F9FEFEFEFEFEFEFEFEFEF9FEFEFEF9FEFEJ&:$<#<"9%8';"s9# Q8F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FEF9F9F9J%E& R FEFEFEF9FEF9F9F9F9J"8"<"F( QFFEFEF9F9FEFEFEFEFEF9=z8z /F7U/F7rF"J% F7F7U0F7F7F7F7'z& F6F6F6F6F6F7UBEDF6F6F6F6F68$J% F9F9F9UDF9F9F9F7 J"9"9"9" R$FEFEFEFEJzJz R 5FEO7;FEJ"9z8"J%J%J'J' O'FEEFEFEOEFEFEFEFE5FEFEFEFEO-FEFEFEFEFEFE;FEFEFEFEFEFEJrJzJ$J&J$J& O$FEE/FEO6FEFEFE=FEFEFEFEFEO%FEFEFEGFEFEFEFEFEJ'J#J"J$J% P1FEFEFEFEFEFEO.FEFEEFEO!FEFEFEO!FEFEFEFEJ"J%J"J$J% O#FEO3FEFEFEFEO)FEOFFEFEFEO(FEFEFEFEJ%J#AwJ$HzJ" P;FEFEFEFEO#FEFEEDO-FEFEFE1ED:FEJ"J$J"@$B%D"J#F&G%J" O"FEO"J"C"J" O,EDO(EDEDEDFEFEHEDFEEDO.EDJ"F#J"B"J" PBEDFEEDP!FEEDO7FEJ"F"J"J"B"J" PCEDFEO4ED9FEEDO1EDJ"J"J"H"B" Q'FE:EDLFEFEEDJ#F"D"J":"G"B"J" PDEDEDFEFEO$EDEDFEEDO4EDJ"F"J" PFEDFEOHFEJ"F"J"J"8"J"J" PGEDFE7FEHEDED>EDO6EDJ"J#G"B" PHEDOCEDEDFEEDJ"E"J" PIEDFEODFEJ"F"J" PIFEFEP"EDJ#J"B"J":" PIEDEDP$FEEDO:EDFEJ"E#J"J"J" PKEDFEFE4FEO*FEOMEDJ"J"J% Q.EDOLEDOFEJ" QDFEJ"E"J"J"C" PMEDFE5FEO&FEEDJ" PMFEJ#E"<"D"J"C" PMEDEDFEEDFEO$FEEDJ" QGFEJ" QHFEJ"E"<"F"J" Q!EDFEEDFEO FEJ"J" QJFEO-EDJ" QKFEJ"E"<"H$J" Q"EDFEEDFEFEFEHFEJ" Q:EDJ#J" R!FEFEO&EDJ"J" Q;ED5FEJ"J#J#J" Q#ED7FEED5FEFEBFEJ"J$ Q;ED8FEEDFEJ"J" Q=ED7FEJ"@"J# Q3FEED8FEFEJ"J" Q?ED9FEJ"J# Q@ED9FEFEJ"J"J$J" Q$EDED;FEJ"J"J$ Q$ED?ED;FEFEFEJ# QEEDEDJ#J" QGEDED:FEJ"J$ QIED:FEEDFEJ"J# QKED9FEEDJ"J$J# Q$FEEEDEDED9FEFEJ"J#J" Q$EDHEDED:FEJ"J"J# Q$FEJED8FEEDJ#J" R"EDED7FEJ"J"J"@" Q3ED>ED7FEEDJ#J" R%EDED6FEJ" R'EDJ"J"J" R)ED4FE8FEJ$J" R(EDEDED4FEJ"J# Q2EDFEDEDJ"J" Q#FEO)EDJ"G"=" R.EDFEEDJ"J" R/EDHFEJ"J"F" Q1EDLEDFEJ"J" Q"FEO.EDJ#J"E" R1FEED6EDFEJ"J"F" Q0EDO EDFEJ" R3EDJ"J"E" Q!FEOHEDFEJ"J" Q/EDO$EDJ"J"E" R4FE6EDFEJ"C"J# Q FEEDO%EDEDJ" RLEDJ"C":#J" PMFEEDFEFEOHFEJ"8"J"E"J" Q1FEFEO8EDFEO>FEJ"C">"J% PLFEEDFEQ7FEFEFEFEJ"C"J"E"J" PKFEEDOBEDFEO;FEJ" R6EDJ"C"A#J"E"J" PJFEEDFEFEO7EDFEO9FEJ"C"J"A"C"E" Q)EDEDLFEEDEDFEJ"B#C"J"J"E"J";" PIFEEDFEFELED:EDFEO6FEEDJ"D"="J" PHFEEDEDO$FEJ"C"F"J"E"J" PGFEEDFEO9EDFEO4FEJ"C"J"G"E"J" PFFEEDO:EDEDFEO2FEJ"C"I"J"E"J" PEFEEDFEO:EDFEO8EDJ"J"C"J"E"J" OFEMFEEDEDEDFEFEEDJ&Jr8":tG"8"J#G#A"J#H%J$ O#FEFEFEFEFE?FEFEFEEDEDO!FEFEFEFEEDJEDEDFEFEFEFE7FEFEFEJ$JrJ&J%?%A"J#J&C&J" O FEFEFEKFE7EDEDEDEDEDO%FEFEFEFEFEFEFEFEEDO EDED4FEFEFEFEFEFEFEFEFEFE4EDJ#J$JtD$J$JxJ$ P;EDEDFEDEDED4FEEDEDEDO!EDEDED6FE6EDEDEDJ"J$8"J"J#J$J$ O EDO7EDEDEDEDHEDHEDEDO'EDEDEDO%EDEDEDJ&J%J#J$J$ P3EDEDEDEDEDO!EDEDEDEDBEDEDO,EDEDEDMEDEDEDJ"JrJ$J$J%J& O!EDO*EDO*EDEDED%>&=%>&<$=&=$=%B%9#C"Bw>&A#9$A&=$>( O&FEFEEDFEFEFEFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDFEFEFEJ%:"A%9%@"9"@">"D">"9"<$="C"="D%9%A$C$9%>"9"?%9&?"C"=$8"8" O$FEFEFEEDEDFEFEEDEDEDEDFEFEEDFEEDEDEDEDEDEDFEEDEDEDEDFEFEEDEDEDEDFEFEFEFEFEEDEDEDEDEDEDEDEDEDFEFEEDEDEDEDFEFEFEEDEDFEFEEDEDFEJ"8"<"?$=$J"J"<"J%="J"@#I"?"8"C"J$ O#FEEDEDFEFEEDEDFEFE4FEO0FEED6FEFEFEEDED;EDEDEDFEEDFEFE6EDFEEDJ"8">"="C"C"<"F";#8"J"9"J"J"J"J"9"J" O"FEEDEDFEFEFEEDFEFEEDFE?EDFEHED9EDBED5EDFE6EDJ"8"?"J"B"J"9":"J"8"J"9"J"A"8"@"9"C"8" OBEDFEED7EDED@EDFEFE5FEED4FEFEJFEEDFEEDFEFEFEJ"J"J"9#E"8"9#J"9"9"J"J"J"F"9# O!FE6ED:FEFEEDEDFEFEEDEEDFEEDO EDO!ED8EDEDFEFEJ"F"J"J"J"J$8"J"J"8"C":# O$EDFE:EDCFEBEDO&EDEDEDFEKFE9EDFEEDFEFEJ":"J"8"J"J"J"8"C";" P)EDFEO-EDFEO!FEO#ED:EDFEEDFEJ"F"J"8$;"B"8%J":"8"J$J"J"C#:" O$FEED;EDFEEDFEEDEDFEEDFEEDDFEEDFEO!FEFEFEO FE>FEEDEDFEJ"J"J"J"J">#J'8"J"9"D# O!ED6FE"="8"J"<"J"="<"8"J"8">"I"A"<" O"EDFEFEEDFEOLFEEDEFEFEEDFEGEDFEFEEDFEEDJ"I"?"8"J#H"J"8"="?"J"B"H"A";$ O#EDEDFEEDO5FEEDED8EDFEFEEDO#EDEDEDFEFEFEEDJ%;"@%:%?";$E";$F"8";"J"J"8";$<"A"J$<$A"J" O$EDFEFEFEFEEDFEFEFEFEFEEDEDFEEDFEEDFEEDFEEDEDFEFE5ED8EDFEFEFEEDFEFEHEDFEFEFEFEEDFE4FEJ%8%@*@"8#9"9#9"<"8#9":"9"?+?"8"G#9"@+<"8#:":">#9#?#9"@+?#8"="?"8' O%EDEDFEFEFEFEFEEDEDEDFEFEFEFEFEEDEDFEFEFEEDFEFEFEFEFEFEEDFEFEEDEDFEFEFEFEFEFEEDEDFEFEFEFEFEEDEDEDFEFEEDFEFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEEDEDFEFEFEFEFEFEEDEDFEFEFEEDEDFEFEFEFEEDEDJ#8$C&B&='<&>&A'A%>#='C'=&:'>r?'B'A&>#>' O'EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED J%J#>#<#>#:%9%9&<&;&;%>%J#F#8#J%J#8# IFEFEFEFE%9(9'<'J#J#J'J# HFEFEEDEDFEFE;EDED8FEFEFEFEEDEDFEFEEDFEFEEDEDFEFEEDEDEDEDEDFEFEFEFEEDEDEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEKEDED4EDEDFEFEEDED;EDFELFEFEEDEDJ$8#?"J"D"A#;#J$A$8#;$8#J"G#B"G%>$8#D"J" GEDFEFEFEFEFE7FEFEFEFEFEFE5FEFEEDEDFEFEFEFEEDFEFEFEFE@FEFEFEFEFEFEEDEDEDFEFEFEFEFE;FEJ-9%9"C%A%A5>%9(9'<-J%C49'>'=->,<-9' HEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEEDEDEDFEFEEDEDFEFEED4EDFEFEFEFEEDEDEDFEFEFEFEEDEDEDFEFEFEFEEDFEFEFEEDEDFEFEFEFEFEEDEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEFEFEED7EDFEFEEDEDFEFEFEFEEDEDEDFEFEFEEDFEFEEDEDFEFEEDEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEEDEDEDFEFEFEFEEDEDFEFEFEEDFEFEEDEDFEFEEDEDFEFEFEFEEDJ%8%;#<"9#9#8#:#8#9#=#:%9%9%=&;&;%>%8%8#8#8&8#8#8s8&8%9'8&8%8#8#8%?%8%8#<#9%8#:'8&8%8#8# IEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDJ"C# O0FEFEFEJ$B' O/FEFEEDEDFEFEFEFEEDJ#<#D%J# O'EDEDEDEDEDEDEDEDR1EDED J#9&@#>#<#J# PJFEFEFEFEEDFEFEFEFEFEFEFEFEO1FEFEJ"8"G# PIFEFEEDEDJ#C(8&:#8"8"8%<+9%9%8(9#8%9# PJEDEDFEFEEDFEFEFEFEFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEEDFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEJ":"C";%;'8)="859"@, PHFEFEFEFEFEEDFEFEEDFEFEEDEDEDEDFEFEEDEDFEFEFE4FEFEEDEDFEFEEDFEFEEDEDFEFEEDFEFEEDEDFEFEFEFEFEEDEDFEFEEDFEFEEDFEJ#<";"A%>#?%A*A" Q.EDEDEDEDFEEDEDEDEDEDFEEDEDEDEDEDEDFEFEEDFEFEEDEDJ#E"J&>":#9&:#;"B# PJFEFEED8EDEDFEFEFEEDFEFEEDEDFEFEFEFEFEEDFEFEJ)J"8"B%9"8"9%=&:% PGFEFEEDEDEDEDFEFEGEDFEEDEDEDEDEDFEEDEDEDEDEDFEFEFEEDEDEDEDEDJ"D&F(=#H#:" Q6FEFEFEFEEDEDFEFEEDFEFEEDEDFEFEFEFEFEJ%A+@5>$9, Q3EDFEFEEDEDFEFEEDEDFEFEFEFEED4EDFEFEFEFEEDEDEDFEFEFEFEEDEDEDFEFEFEFEEDEDFEEDEDFEFEFEFEEDEDEDFEFEEDJ#:r;#9#8#:#8#9#8%<#:%9%9%8#<";%9& PGEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDJ# Q3FEFEJ' Q3EDFEFEFEFEEDJ% Q4EDEDEDED $ QEEDFEFEFEFEEDEDFEFEJ%:#:# QFEDEDEDEDEDEDEDED &J% F7F7F7F7F7UCF7F7F7F7&JzJ& F6F6F6F6F6Q3KECQ3F6F6F6F6F68$J"J% F9F9F9Q2ECR1F9F9F9F7Jz Q6O!ED JZ Q2O)J" Q1FFJz Q0O-ED store /green < 9F99DE00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B59765E1A36FE7006B7FFF1A00B28B99FFFFB094FF30F700CEEEEE0073E6A2 4DBF88F54DB358D78080C0C080C080808060C08000A080402070A0402040D0F0 F0E010B489E4A0BE5BB477D9B3FF77FF19264F00B641DE4F829E4780FF0000FF > store /blue < FFFFB3FFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B59765E1A36FE7BF2F7FCC8BEEB2576BFBB3B01532602480FAEEB40073E6A2 4DBF88F556CA58D7D050C080C08080C08060C080FF0000402070C0802040D060 50E010B476C4A0BE7A8C65D9B3E0850070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7S&F6F76F6F7J" T%F78z8z8z 4F9S%F94F9 ;z" SJF7F6E5E5J%<%9%8"8%8%8& =FEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEE5FEFEJ/:08":'9% 4E5FEFEFEE5E5E5E5FEFEE5E5FEFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5FEFEE5E5FEFEFEE5FEFEJ&J#H" 5E5E5FEFEFE7E5E5E5J"8"9#># 7E5FEFEFEFEFEJ#8";%<% 4FEFEE5E5E5E5E5E5E5E5E5J#>#;#;" @FEFEFEFEFEFEFEJ/:.8%9' 4E5FEFEFEFEFEE5E5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5J&9%8#8%9%:&8%8#8# 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 Hz S0A2J" SAFFJZ 4S- I" FFHz S0E5 # O!FEFEFEFEFEFEFEFEO0FEFEFEFE=FEFEO*FEFEFEFEFEFEJ'=$J' O FEFEE5E5FEFEFEFEE5O/FEFEE5E5FEFEJ$8$;$J$8(8&9%9%J%;& MFEFEE5E5FEFEFEFEE5O/FEFEE5E5E5E5FEFEFEFEFEFEE5FEFEFEFEFEFEFEFEFEFEO7FEFEFEFEFEFEE5FEFEJ$J'93J'<% O+FEFEE5O7FEFEE5E5FEFEFEE5FEFEE5FEFEE5E5FEFEE5FEFEE5E5FEFEO5FEFEE5E5FEFEFEE5FEFEJ#=">#J$E" PEE5E5E5E5E5O6FEFEFEE5J$J$I#J$;# O+E5FEFEO8FEFEFEFEFEO1E5E5E5FEFEJ$J%I%J% O,E5FEFEO6FEFEE5E5E5E5E5E5O7E5E5E5E5J$8$<$J$8#H#;#J#<" ME5FEFEFEFEE5E5FEFEO.E5FEFEFEFEFEFEFEFEO9FEFEFEJ'>$J.=.J'<% O E5FEFEFEFEE5E5FEFEO.E5FEFEFEFEE5E5FEFEFEE5FEFEE5FEFEFEFEE5E5E5FEFEFEFEE5O5E5FEFEFEFEE5E5FEFEE5J%:#:#J%8s8#8%9%8#J#9#8%8#:# O!E5E5E5E5E5E5E5E5O/E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5O*E5E5E5E5E5E5E5E5E5E5E5E5 J# S#E5E5 &J% F7F7F7F7F7SJF7F7F7F7&HzJzJzG& F6F6F6F6F6O1E48O1E48O1E4F6F6F6F6F68$G"J"J"J% F9F9F9E4OHE4OHE4OCF9F9F9F7JzJzJz 5O5E54O5E54O5E5 GZ O=F" FFEz OAE5 store /green < 9F99DE00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B59765E1A36FE7006B7FFF1A00B28B99FFFFB094FF30F700CEEEEE0073E6A2 4DBF88F54DB358D78080C0C080C080808060C08000A080402070A0402040D0F0 F0E010B489E4A0BE5BB477D9B3FF77FF19264F00B641DE4F829E4780FF0000FF > store /blue < FFFFB3FFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B59765E1A36FE7BF2F7FCC8BEEB2576BFBB3B01532602480FAEEB40073E6A2 4DBF88F556CA58D7D050C080C08080C08060C080FF0000402070C0802040D060 50E010B476C4A0BE7A8C65D9B3E0850070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7R?F6F76F6F7J" S>F78z8z8z 4F9R>F94F9 ;z" S5F7F6$H"9#Jr:#@$ OHFEFEFEFEF9FEFEFEFEFEFEFE7FEFEFEFEFEFEJ'?"I"J"8&E" OGFEFEF9F9F9FEF9FE=F9F9F9F9FEFEF9J"J#J$8#J# OLF9BF9F9=F9FEFEF9F9;FEFEJ#8"9$?$:$8"8&:$9'G$9%@$:& OIFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9@s"J"9#8'<08$:*8%F"<%=/ F6F7O4F9FEFEFEFEFEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEF9F9F9FEFEFEFEFEF9FEFEFEF9FEFEF9F9FEFEArJ#9":"A";%C$<"J$A$ F9O6F9F9FEFEFEF9F9F9F9F9F9F9F99F9FEFEF9F9F9@sJ"8#;%>%J%G' F7O5FEF9F9F9F9F9F9F9F9F9F9O(FEFEF9F9F9FEFEFEFEF9@tJ">%>%9%C$J$?"A$9& F9O5FEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FE6FEFEF9FEFEF9FEFEF9F9F9F9J0808&8,8"9";"8&8"8'8$8*8& OHF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEFEFEFEFEFEF9FEFEF9F9FEFEF9FEF9FEFEF9F9F9FEFEFEF9F9FEFEFEFEFEJ':$8%9$:$:r9$9s;r9%8v9$9";" OGF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FEJ& R"FEF9F9F9F9J( R"F9FEFEFEFEFEF9=z8z /F7S!F7rF"J% F7F7S"F7F7F7F7'z& F6F6F6F6F6F7S4E5F6F6F6F6F68$J% F9F9F9S6F9F9F9F7 J#8# 4FEFEFEFE J"8"8%8*9% 7FEFEFEFEFEFEFEE5FEFEFEE5FEFEFEFEFEFEFEJ"8)81 7E5E5E5FEFEE5E5FEFEFEE5E5FEFEE5E5FEFEE5FEFEE5E5FEFEJ% O"FEE5E5E5J#D& >FEFEE5E5FEFEFEJ%D"8" >E5E5E5E5E5FEJ":#B% ;FEFEFEFEFEE5E5J+B' 8E5FEFEE5E5FEFEFEFEE5E5FEFEFEFEE5J#9#8%8#8#8#8% 4E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 Hz=z R0A23E4J"J" RAFF9FFJZ@r"r" 4R-DEE4DEFFJ" S#FFJ" S%E4J" S"FFJ$ S$E5E4E4J$ S!FFFFE5J$ S%E5E4E4J$ S FFFFE5J$ S&E5E4E4J$ RMFFFFE5J$ S'E5E4E4J$ RLFFFFE5J$ S(E5E4E4J#u RKFFFFE4J"B" RLE4E4Jz RK/DEJZ RK/J" S+E4Jv" RME5E4 Jv RME4J" RLE4Jz RK/DEJZ RK/J"C" RKDEE4Jt$ S E5E4E4DEJ$ RLDEFFFFJ$ S(E4E4DEJ$ RMDEFFFFJ$ S'E4E4DEJ$ S DEFFFFJ$ S&E4E4DEJ$ S!DEFFFFJ$ S%E4E4DEJ$ S"DEFFE4J" S&DEJ" S#DEJ" S%DEJZ RK/I"J" FFR6FFHz=z R0E53E5 J&?#F#8# 5FEFEFEFEFEFEFEFEFEFEFEJ(J# 4FEFEE5E5E5FEFE>E5E5J%<%9%8"8%8%8& =FEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEE5FEFEJ/:08":'9% 4E5FEFEFEE5E5E5E5FEFEE5E5FEFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5FEFEE5E5FEFEFEE5FEFEJ&J#H" 5E5E5FEFEFE7E5E5E5J"8"9#># 7E5FEFEFEFEFEJ#8";%<% 4FEFEE5E5E5E5E5E5E5E5E5J#>#;#;" @FEFEFEFEFEFEFEJ/:.8%9' 4E5FEFEFEFEFEE5E5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5J&9%8#8%9%:&8%8#8# 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 Hz RIA2J" S,FFJZ 4RF I" FFHz RIE5 # KFEFEFEFEFEFEFEFEO)FEFEFEFE=FEFEO$FEFEFEFEFEFEJ'=$J' JFEFEE5E5FEFEFEFEE5O(FEFEE5E5FEFEJ$8$;$J$8(8&9%9%J%;& IFEFEE5E5FEFEFEFEE5O(FEFEE5E5E5E5FEFEFEFEFEFEE5FEFEFEFEFEFEFEFEFEFEO1FEFEFEFEFEFEE5FEFEJ$J'93J'<% O'FEFEE5O0FEFEE5E5FEFEFEE5FEFEE5FEFEE5E5FEFEE5FEFEE5E5FEFEO/FEFEE5E5FEFEFEE5FEFEJ#=">#J$E" P:E5E5E5E5E5O0FEFEFEE5J$J$I#J$;# O'E5FEFEO1FEFEFEFEFEO+E5E5E5FEFEJ$J%I%J% O(E5FEFEO/FEFEE5E5E5E5E5E5O1E5E5E5E5J$8$<$J$8#H#;#J#<" IE5FEFEFEFEE5E5FEFEO'E5FEFEFEFEFEFEFEFEO3FEFEFEJ'>$J.=.J'<% JE5FEFEFEFEE5E5FEFEO'E5FEFEFEFEE5E5FEFEFEE5FEFEE5FEFEFEFEE5E5E5FEFEFEFEE5O/E5FEFEFEFEE5E5FEFEE5J%:#:#J%8s8#8%9%8#J#9#8%8#:# KE5E5E5E5E5E5E5E5O(E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5O$E5E5E5E5E5E5E5E5E5E5E5E5 J# R@E5E5 &J% F7F7F7F7F7S5F7F7F7F7&HzJzJzG& F6F6F6F6F6O*E48O*E48O*E4F6F6F6F6F68$G"J"J"J% F9F9F9E4OAE4OAE4OF91F9 7z8z8z 5F7R>F74F7"J"J" F76F7R?F7 ENDBITMAP %%EndBinary 135 480 243 498 R 7 X V 4 8 Q 0 X (selectiondialog .sd) 135 492.67 T (.sd activate) 135 482.67 T 0 10 Q (FIGURE 33) 123.53 453.1 T 1 F ( - Selectiondialog) 174.92 453.1 T 72 377.72 297 720 C 0 0 612 792 C 0 12 Q 0 X 0 0 0 1 0 0 0 K (Fileselectiondialog) 380.17 712 T 1 10 Q (The Fileselectiondialog is a dialog based Fileselection-) 315 687.33 T (box.) 315 675.33 T 315 406.97 540 672 C 0 0 0 1 0 0 0 K 0 0 0 1 0 0 0 K 315 438 540 663 R 7 X 0 0 0 1 0 0 0 K V 0.5 H 2 Z 0 X N %%BeginBinary: 33477 462 429 184.8 171.6 0 337.2 482.4 /red < 7266F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080 8080808080808080808080808080808080808080404040404040404040404040 4040404040404040404040000000000000000000000000000000000039C069DD 00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A EFD39765E1A36FE700557FFF5500B22E99FFFFB07AFFB0CC0087AFB4CD73E6A2 4DBF88F5439D58D750D080C0C080C0808060C000FFA000FF20C0A040C040D060 F0E010B499FFA0BE8BD28BD9B3FF720019BF2FFF6223852F465F4770FF0000FF > store /green < 9F99DE00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040 40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080 8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500 996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69 E3B59765E1A36FE7006B7FFF1A00B28B99FFFFB094FF30F700CEEEEE0073E6A2 4DBF88F54DB358D78080C0C080C080808060C08000A080402070A0402040D0F0 F0E010B489E4A0BE5BB477D9B3FF77FF19264F00B641DE4F829E4780FF0000FF > store /blue < FFFFB3FFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80 00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040 00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF 804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500 FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69 E3B59765E1A36FE7BF2F7FCC8BEEB2576BFBB3B01532602480FAEEB40073E6A2 4DBF88F556CA58D7D050C080C08080C08060C080FF0000402070C0802040D060 50E010B476C4A0BE7A8C65D9B3E0850070264F00FC5AE050B4A0FF9000FF00FF > store BEGINBITMAPCOLORc z"z"z" 6F6F7W!F6F76F6F7J" X F78z8z8z 4F9W F94F9 ;z" WEF7F6$H"9#Jr:#@$ Q@FEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFE7FEFEFEFEFEFEJ"8$>"E'?"I"J"8&E" Q@F9F9F9F9F9FEFEF9F9F9FEF9FE=F9F9F9F9FEFEF9J"9#J"J#J$8#J# QFF9F9F97F9BF9F9=F9FEFEF9F9;FEFEJ"9$?$>#8"9$?$:$8"8&:$9'G$9%@$:& QEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9@s"J#8$?';"9#8'<08$:*8%F"<%=/ F6F7Q0FEFEF9F9F9FEFEFEF9FEFEF9FEFEFEFEFEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEF9F9F9FEFEFEFEFEF9FEFEFEF9FEFEF9F9FEFEArJ#G">#9":"A";%C$<"J$A$ F9Q1F9F9FEF9F9FEFEFEF9F9F9F9F9F9F9F99F9FEFEF9F9F9@sJ"E%;"8#;%>%J%G' F7Q3F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9O(FEFEF9F9F9FEFEFEFEF9@tJ%<">%>%9%C$J$?"A$9& F9QBFEF9FEFEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FE6FEFEF9FEFEF9FEFEF9F9F9F9J"8";"8$8)<0808&8,8"9";"8&8"8'8$8*8& Q@FEFEFEFEF9FEFEF9F9F9FEFEFEF9F9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEFEFEFEFEFEF9FEFEF9F9FEFEF9FEF9FEFEF9F9F9FEFEFEF9F9FEFEFEFEFEJ%;t9$<':$8%9$:$:r9$9s;r9%8v9$9";" Q@F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FEJ& T9FEF9F9F9F9J( T9F9FEFEFEFEFEF9=z8z /F7W1F7rF"J% F7F7W2F7F7F7F7'z& F6F6F6F6F6F7WDE5F6F6F6F6F68$J% F9F9F9WFF9F9F9F7 Js$8# 4FEE5FEFEFEFEJ' 6E5E5E5E5E5E5J#:"8"8%8& :FEFEFEFEFEFEFEFEFEFEE5FEFEJ"8)9" @E5E5E5FEFEE5E5FEFEFEJ$J# 6FEFEFE6E5E5J$D#;" 6E5E5E5FEFEE5J% GE5E5E5E5J":# DFEFEFEJ+ AE5FEFEE5E5FEFEFEFEE5J#:&9#8%8# 4E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 H5 W+FFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH5 W*FEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH#Z FFFEW'H# FEFFH#J$J"J":&9$>"E$<$J"J"J"9"C"=#J"B$8#A":#J" FFFECFEFEFE@FE8FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECFEBFEO"FEFEFEFEFEGFEFEFEFEFEFEFEFEFECFEH#J"?$J#J#<%8&<#E#<%G"F#J#J#9"C"="H"I#B(A#:"J#9" FEFF8FEFEFFFF@FEFF6FEFEFFFFFFFFFEFFFFFFFEFEFFFFFFFEFFFFFFFEFEFFAFEFFO!FEFFFFFFFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFFEH#J#J# FFFEP!FFFFS&FFFFH#>&8&9&;#:#:$8&:$<#9$8#8)J)8#8#?&9$9&8&9$<):$9&9$<#9$:$8&8&:$8&<#8$9,;$:&8$9&9$J$<#9$:$8&:$:$<#8& FEFFFEFEFEFFFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFFFEFEFE;FEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFFFEFEFEFEFEFFFEFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEH#>.8&@%8-8&?(9"8'@$9"8#>)9"@&8&8&8&8&>'8&8&8&?&848-?#:+;%9-8&8&J%?%9-8&8&?& FFFEFFFEFFFEFFFEFFFFFEFEFFFFFEFFFEFFFFFFFEFFFFFEFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFFFEFEFFFFFEFEFEFEFFFEFFFFFEFFFEFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFEFFFEFEFFFFFFFEFFFEFFFFFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFEFFFEFFFEFFFFFEFFFEFFFEFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFFEFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFFFEFFFFH#G"D#:"J$;#9&@"B&:#;#J$G&:#A$D":#="J"=#B"J$@&8&J#A$G&:#:$ FEFFFFFEFFFF4FEFEFEFEFFFFFEFEFEFFFFFFFFFFFFFEFEFFFEFF@FEFEFEFFFEFEFEFFFEFFFEFEFEFFFEFFFF?FFFEFFFE:FEFEFEFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFFEFFFEH#J%@%J#J%G%G%J%@%8PJ%G%@$ FFFEO-FFFFFFFFFFFFFFFE?FEFFHFFFFFFFFFFFFFFFEFFFFFFFFP0FFFFFFFFFFFFFFFEMFFFFFFFFFFFFFFFEFFFFFFH#J"8#J"9#:"J"=#8"9#J"D$=#E"C"9#>"J#A&J"=$J#E"F"=# FEFF";%9"8&=0;(?&8*9/9$?";59&8%:,>";(8%9&?&8(;#;,9">&?&8,9&9,?&9";-?/;(8& FFFEFEFEFEFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFFFFFEFEFEFEFFFEFEFEFE4FEFFFFFEFEFEFFFEFFFEFEFEFEFEFEFFFEFEFEFEFFFEFEFEFFFEFEFEFEFFFEFEFEFFFFFFFEFEFEFFFEFEFFFFFEFEFEFFFEFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFH#>U8#9$8#:R8$8R8$9#<$:S8S8%9P8#:R8Z:$9%;$9$9#:R8$9%:$9#<$:$8Y8$8$8&;P9$9P9P8$:$;$9$@P9"<$8P9#FFBFFO"FFO0FFBFFO"FFP%FFIFFH$rJ% FEFFFFFET-FEFEFEFFH#SJ$ FFFET-FFFFFFH# FEFFH" FFHz W+E5 J&9#J#D#Js$ 4FEFEFEFEFEFEFE5FEFEFEFEQ@FEE5FEFEJ%8#J#J' 6E5E5FEFEE5E5EE5E5QBE5E5E5E5E5E5J29%8"8"8%8(8%9%J#;%9% 8E5FEFEE5FEFEE5FEFEE5FEFEE5FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEFEFEFEFEQ9FEFEFEFEFEFEFEFEFEFEJ"808)9";.J. AFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5E5FEFEE5E5FEFEFEFEFEE5E5FEFEE5FEFEE5E5FEFEQ>FEFEE5E5FEFEE5FEFEE5E5FEFEJ#A#F#B%J$F% BE5E5E5E5E5E5FEE5E5E5Q4FEFEFEFEE5E5E5J":#J"=#9&J$?#9& AE5FEFE8E5FEFEE5E5FEFEFEQ5E5E5E5FEFEE5E5FEFEFEJ%J%9"8"J%9"8" FE5E5E5E5>E5E5E5E5E5FEQ@E5E5E5E5E5FEJ$C#;#;"I(J( 8FEFEE5FEFEFEFEFEFEFEE5FEFEE5E5QDFEFEE5FEFEE5E5J%@.8+?.J. 6FEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5Q>E5FEFEFEFEE5E5E5FEFEFEFEE5J&9&:%9%:#8%8#9#8%9%J#:&8%9% 4E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5Q3E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 H5=zB5=z QKFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFF3E4QKFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFF3E4H5J"B5J" QJFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFF:FFQJFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFF:FFH5Ar"r"C#ZAr"r" QIFFFEDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEDEE4DEFFFFFEQGDEE4DEFFH#z"G"J#J" FEFFQFDEFEFF6FEFFR*FFH#<"9"C"=#J"B$8#A":#J"J"I"J#J"J" FFFEFEFEFEFEFEGFEFEFEFEFEFEFEFEFECFE=DEE44FFFEBFEQ7E4H#;#9"C"="H"I#B(A#:"J#J"F"J#J(A"<"H&J" FEFFFEDEDEDEDEFEFEFEFEDEDEDEFEDEDEFEDEDECFEDE=FEFF7FEFFAFEFFFEFEFEFEFEFEFEFEFEFEFEFEP3FFH#J#J"H$I#J'J'J$ FFFEO9DEDEP+DEE5E4E4FFFECFFFEFFFFFFFEDFFFEFFFFFFFEP4E5E4E4H#:#8$9,;$:&8$9&9$J$<#9$:$8&:$:$<#J"E$J#8$8&:$:$<#>#8#8&8&9$8&A$8(J$ FEFFFEDEFEFEFEFEFEFEDEFEFEFEDEFEFEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEFEFEFEFE@FEFEFEFEDEFEFEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEDE>FEFFFFE56FEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEP"FFFFE5H#>#:+;%9-8&8&J%?%9-8&8&J"I$H08&8&@'9"9&8&8-9%8)9#J$ FFFEDEDEDEFEDEDEDEFEDEDEDEDEFEDEDEDEFEDEDEDEFEDEDEFEDEDEDEFEDEFEDEDEDEFEDEDEDEFE?DEDEDEFEFEDEDEDEFEDEDEDEFEDEDEFEDEFEDEFEFEDEDEDEFEFEDEDEDEFEEDEE5E4E4FFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFEFEFEFFFFFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFEFEFEFFFEFFFFFFFEFFFFFFFFFFP&E5E4E4H#9#B"J$@&8&J#A$G&:#J"D$J#8$G&:#:%J"<%@$J$ FEFFFEDEFE:FEFEFEDEFEFEFEDEFEFEFEFEFE@FEDEFEFEFEDEFEFEFEDEFEDE?FEFFFFE57FEFFFEFEFEFFFEFEFEFFFEFFFFFFFFFE?FFFFFFFFFEFFFEFFP#FFFFE5H#J%@%8&J%G%J"J$G#8%G%J$J$ FFFELDEDEDEDEDEDEDEFEDEDEDEDEDEMDEDEDEDEDEDEDEFEEDE4E5E4E4FFFEFFFFFFFFFFFFFFFEO4FEFFFEP)E5E4E4H#8#A&J"=$J#E"F"=#J"C$J#;"F"=#J"<"J&J$ FEFFFEDEDEFEDEFEDE;FEFEDEFEJFEDEFEFEFEDE@FEFFFFE58FEFFFEFEFEFF7FEFE=FEFFFFFFFEP!FFFFE5H#>&?&8,9&9,?&9";-?/;(8&@"J"J$F+;(8&>'8'8&809(8(;"J$ FFFEFEFEFEFEFEFEFEFEFEFEDEFEFEFEDEFEDEDEFEFEFEDEFEFEFEDEDEFEFEFEDEDEDEFEFEFEDEFEFEFEFEFEFEDEFEFEFEDEDEFEDEFEFEFEDEDEFEFEFEDEFEDEDEFEFEFEDEDEFEFEDEDEFEFEFEDEDEFEFEFEDEFE:DE5E5E4E4FFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFFFEFEFEFFFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEP(E5E4E4H&;&9$9&9&8$:$;$9$@&9"<$8&9#<&8$8r8$:$9#<"J"B$J#8$8R8$:$9#:P:P9$:$9$8$8R:$8#9#J$ FEFFDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEFEDEDE:FEFFFFE59FEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFOMFFFFE5H%J"J"J"J$E#J"J$ FFFEDEDEP%DEIDEBDE6E5E4E4FFFE=FFQ?E5E4E4H#J%J"A#uG#J#u FEFFEFEFEFEDEPKFEFFFFE4FEFFR$FFFFE4H#J$J"B"B"D#J"B" FFFEEDEDEDEPLDEE4E4FFFER%E4E4H5AzD#Jz QIFEFFFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFE/DEFEFFR$/DEH#ZAZD#JZ FFFEQG/FFFER$/H#J"D#J" FEFFR2E4FEFFR2E4H#<"9"C"=#J"B$8#A":#J"Jv"E#J"@"A$Jv" FFFEFEFEFEFEFEGFEFEFEFEFEFEFEFEFECFEKE5E4FFFEBFEFEFEFEFEPFE5E4H#;#9"C"="H"I#B(A#:"J#J#J(;"A# FEFFFEFFFFFFFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFO8FEFFAFEFFFEFEFEFEFEFFFFFFH#J#J#J' FFFEO9FFFFQ&FFFECFFFEFFFFFFFEH#:#8$9,;$:&8$9&9$J$<#9$:$8&:$:$<#J#8$8&:$:$<#?$:%A$:& FEFFFEFFFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFO9FEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEH#>#:+;%9-8&8&J%?%9-8&8&J08&8&F#;&?&8' FFFEFFFFFFFEFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEO@FFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFH#9#B"J$@&8&J#A$G&:#J#8$G&:#H$ FEFFFEFFFE:FEFEFEFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFO:FEFFFEFEFEFFFEFEFEFFFEFFFEFEFEH#J%@%8PJ%G%J#8%G%J% FFFELFFFFFFFFFFFFFFFEMFFFFFFFFFFFFFFFEO@FFFEFFFFFFFFFFFFFFFE7FEFFFFFFH#8#A&J"=$J#E"F"=#J#;"F"=# FEFFFEFFFFFEFFFEFF;FEFEFFFEJFEFFFEFEFEFFO;FEFFFEFEFEFFH#>&?&8,9&9,?&9";-?/;(8&@"<"J+;(8&>'8&848% FFFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEO.FFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEH&;P9$9P9P8$:$;$9$@P9"<$8P9##:+;%9-8&8&J%?%9-8&8&C"9$:#J08&8&F#;&?&8'8#;%8& FFFEFFFFFFFEFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFEFEFEO&FFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFEFEFEFFFFFEFEFFFFFFFEH#9#B"J$@&8&J#A$G&:#@"9"8&J#8$G&:#H$J&9"<$ FEFFFEFFFE:FEFEFEFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFFFFFFFFFFEFEFEO$FEFFFEFEFEFFFEFEFEFFFEFFFEFEFE8FFFFFEFEFEFFFEFEFEH#J%@%8PJ%G%C"A#J#8%G%J%J#A% FFFELFFFFFFFFFFFFFFFEMFFFFFFFFFFFFFFFEFEFFFFO%FFFEFFFFFFFFFFFFFFFE7FEFFFFFF:FFFFFFFFFFFFH#8#A&J"=$J#E"F"=#C":"J#;"F"=#J"G" FEFFFEFFFFFEFFFEFF;FEFEFFFEJFEFFFEFEFEFFFEFEO(FEFFFEFEFEFFO FEFEH#>&?&8,9&9,?&9";-?/;(8&?&9$:%J+;(8&>'8&848%:38. FFFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFFFEFEFEFFO$FFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEH&;P9$9P9P8$:$;$9$@P9"<$8P9#" FEFFRAFEFFAFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFH#J#J&J& FFFERAFFFECFFFEFFFFFF>FFFEFFFFFFH#J#8$8&:$:$<#:*9&8.9":$;$A$ FEFFRAFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFFFFFFFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEH#J08&8&@":'8&8#P'8"8"8#;&?% FFFERAFFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFEFFFEFEFFFFFEFFFEFFFFFFFFFEFEFFFFFFFEFFFEFFFFFFFEFFFFFFFEFEFFFFFFH#J#8$G&:#:"<"J"C$ FEFFRAFEFFFEFEFEFFFEFEFEFFFEFFFFFF;FFFEFEFEH#J#8%G%A"J&:"B% FFFERAFFFEFFFFFFFFFFFFFFFEFF9FFFEFFFEFFFFFFFFFFFFH#J#;"F"=#>"D"@"J" FEFFRAFEFFFEFEFEFFFEFEFE6FEH#J+;(8&>&8$9"8+:$8%:&8&8. FFFERAFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFFFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFEH#J#8$8R8$:$9#:U8#9$8%?%:P9$9Q8P FEFFRAFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFH#J#J" FFFERAFFFE=FFH#J#J$ FEFFRAFEFFO2FEFEFFH#J#J# FFFERAFFFEO2FFFFH#J# FEFFRAFEFFH#J# FFFERAFFFEH#J# FEFFRAFEFFH#J#J"@":$J$J" FFFERAFFFEBFEFEFEFEFE9FEFEFE;FEH#J#J):":#C%?#J"="G& FEFFRAFEFFAFEFFFEFEFEFEFEFEFFFFFFFEFEFEFEFFFF4FEFFFEFEFEFEFEH#J#J&J%J' FFFERAFFFECFFFEFFFFFF8FEFFFFFFO,FFFEFFFFFFFEH#J#8$8&:$:$<#:":$B$="9$A$:$9&8$;$8&A$8( FEFFRAFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEH#J08&8&@"8"8#B&9#:&?&8&8&8#;-9%8)9# FFFERAFFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFEFEFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFFFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFEFEFEFFFEFFFFFFFEFFFFFFFFFFH#J#8$G&:#:"J$9&9$A$="J"<%@$ FEFFRAFEFFFEFEFEFFFEFEFEFFFEFFFF4FEFEFEFFFFFEFEFEFEFEFEFEFEFEFF8FFFFFFFFFEFFFEFFH#J#8%G%A"I%:#:%@%J$ FFFERAFFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFO&FEFFFEH#J#;"F"=#J"8"@"C"<"="J& FEFFRAFEFFFEFEFEFF=FEFEFEFEFEFEDFEFFFFFFFEH#J+;(8&>%:&8-9%8&8-8&9,8*9(8(;" FFFERAFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEH#J#8$8R8$:$9#:%:P8Q8$9%:$9Q8$:$;$8P9$8$8R:$8#9# FEFFRAFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFH#J#J" FFFERAFFFE=FFH#J# FEFFRAFEFFH#J#Jv FFFERAFFFER&E4H#J#J" FEFFRAFEFFR%E4H#J5Az FFFERAQIFFFEDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDE/DEH#J#z" FEFFRAFEFFQFDEFEH#J#J"@":$J$J"J"A$J" FFFERAFFFEBFEFEFEFEFE9FEFEFE;FE;FEFEFEFE9DEH#J#J):":#C%?#J"="G&;"A#J" FEFFRAFEFFAFEDEFEFEFEFEFEFEDEDEDEFEFEFEFEDEDE4FEDEFEFEFEFEFEDEDEDE:FEH#J#J&J%J'J" FFFERAFFFECDEFEDEDEDE8FEDEDEDEO,DEFEDEDEDEFELDEH#J#8$8&:$:$<#:":$B$="9$A$:$9&8$;$8&@$:%A$:&>" FEFFRAFEFFFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDEFEFEH#J08&8&@"8"8#B&9#:&?&8&8&8#;-?#;&?&8'>" FFFERAFFFEDEFEDEDEDEFEDEDEFEDEFEDEFEFEDEDEDEFEFEDEDEDEFEFEDEDEDEFEDEDEDEFEFEFEFEDEDEDEFEFEDEDEDEFEFEDEDEDEFEDEFEDEDEDEDEDEFEDEDEDEFEDEDEFEFEDEDEFEDEDEDEDEDEDEFEFEDEDEDEFEFEDEDEDEFEDEDEH#J#8$G&:#:"J$9&9$A$="J"J$J" FEFFRAFEFFFEFEFEDEFEFEFEDEFEDEDE4FEFEFEDEDEFEFEFEFEFEFEFEFEFEDE8DE4FEFEFE?FEH#J#8%G%A"I%:#:%@%J%J" FFFERAFFFEDEDEDEDEDEDEDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEO%FEDEDEDE?DEH#J#;"F"=#J"8"@"C"<"="J" FEFFRAFEFFFEFEFEDE=FEFEFEFEFEFEO9FEH#J+;(8&>%:&8-9%8&8-8&9,8*9(8&848%@" FFFERAFFFEDEDEFEFEFEDEDEFEFEDEDEFEFEFEDEDEFEFEFEDEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDEDEFEFEFEDEFEFEFEDEDEFEFEFEDEFEFEFEFEFEFEDEDEFEFEFEDEDEFEFEFEDEDEFEFEFEDEDEFEFEFEFEFEDEFEFEFEDEDEFEFEFEFEFEFEFEFEFEDEFEFEFEFEFEDEFEFEFEDEFEDEFEFEFEFEFEFEDEDEFEFEFEDEDEFEFEFEDEH#J#8$8r8$:$9#:%:&8'8$9%:$9'8$:$;$8&9$8$8r9&9w8$:$@" FEFFRAFEFFDEDEDEDEDEDEDEDEDEDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEFEH#J#J"J" FFFERAFFFE=DEQ(DEH#J#J%?" FEFFRAFEFFQ9FEFEFEDEFEH#J#J$@" FFFERAFFFEQ9DEDEDEDEH#J5 FEFFRAQIFEFFFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEH#J#Z FFFERAFFFEQGH#J# FEFFRAFEFFH#J#J"D#C$D#A"=# FFFERAFFFEBFEFEFEFEFEFEFEFEFEFEFEH#J#J&A"D#E"8(9"="H" FEFFRAFEFFAFEFFFEFEFEFFFFFFFFFEFEFEFFFEFEFEFFFFFEH#J#J$J( FFFERAFFFECFFFEFFO FFFEFFFFFFFEFFH#J#8$8&:$:$<#?%:$:$A$:$;":$;$:&8$9& FEFFRAFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEH#J08&8&F&9%8&?&8%@#;%9-8& FFFERAFFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFH#J#8$G&:#A$A$A$J$ FEFFRAFEFFFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFEFEFEGFEFEFEH#J#8%G%C"8%A%@%@$J% FFFERAFFFEFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFEFFFE9FFFFFFFFH#J#;"F"=#J"C"?"9"J"=" FEFFRAFEFFFEFEFEFF=FEFEFFFF;FEFEH#J+;(8&>&9-8&8-8'>&8,9&9& FFFERAFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFH#J#8$8R8$:$9#:Q9U:$9Q8$:P8$9P9P8$:$;$ FEFFRAFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFH#J#J" FFFERAFFFE=FFH#J#J% FEFFRAFEFFP/FEFEFEFFH#J#J$ FFFERAFFFEP/FFFFFFH#J# FEFFRAFEFFH#J# FFFERAFFFEH#J# FEFFRAFEFFH#J#J"J"A$ FFFERAFFFEBFEO-FEFEFEFEH#J#J%9#J&;"A# FEFFRAFEFFAFEFFFEFEFEFEJFEFEFEFEFEFFFFFFH#J#J(J' FFFERAFFFECFFFEFEFFFEFEFFJFFFEFFFFFFFEH#J#8$8&:$:$<#@$:$:$9%:&8$@$:%A$:& FEFFRAFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEH#J08&8&@$9&8&8&8&8-?#;&?&8' FFFERAFFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFFFEFEFFFFFFFEFFFFFEFFFFFFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFH#J#8$G&:#A$9&8&9$A$H$ FEFFRAFEFFFEFEFEFFFEFEFEFFFEFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEH#J#8%G%G%9%9%8%A%F% FFFERAFFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFEFFFFFFFEFEFFFFFFFFFFFFFFFEFFFFFFH#J#;"F"=#<">"8"<"J" FEFFRAFEFFFEFEFEFFFFFEFEFE8FEH#J+;(8&>.8&8&8,9-8&848% FFFERAFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEH#J#8$8R8$:$9#:R8$:$:$:P8$:$8P9P9W8$:$ FEFFRAFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFH#J#J" FFFERAFFFE=FFH#J#J%J% FEFFRAFEFFO:FEFEFEFFMFEFEFEFFH#J#J$J$ FFFERAFFFEO:FFFFFFO FFFFFFH#J# FEFFRAFEFFH#J# FFFERAFFFEH#J# FEFFRAFEFFH#J#J"J" FFFERAFFFEBFE8FEH#J#J#8$A"="G#9# FEFFRAFEFFAFEFFFEFEFEFEFFFEFEFEFEH#J#J&J( FFFERAFFFEDFEFFFFFFFEDFFFEFEFFFEFEFFH#J#8$8&:$:$<#>&9&8$;$8&A$8&8#8# FEFFRAFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEH#J08&8&E'8&8#;-9$9/9" FFFERAFFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFFFFFEFFFEFFFFFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFFFEFFFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFH#J#8$G&:#J"C$:" FEFFRAFEFFFEFEFEFFFEFEFEFFFEFFGFFFEFEFEFFH#J#8%G%J% FFFERAFFFEFFFFFFFFFFFFFFFEO-FFFFFFFFH#J#;"F"=#J"J">" FEFFRAFEFFFEFEFEFF7FE8FFFEH#J+;(8&?&9%9,8*939) FFFERAFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFFFFFEFEFEFFFEH#J#8$8R8$:$9#<$:$;$8P9$8$8T8$8$8#8P FEFFRAFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFH#J#J" FFFERAFFFE=FFH#J#J$ FEFFRAFEFFJFEFEFEH#JvF#J$ FFFER&E4FFFEJFFFFFFH#J"J# FEFFR%E4;FEFFH#JzD# FFFER$/DEFFFEH#JZD#JZ FEFFR$/FEFFR$/H#J"C"D#J"J#A"D#J"C" FFFER$DEE4FFFEBFE@FEFEFEFEFEOMDEE4H#Jt$D#J(J"8(9"D"Jt$ FEFFR'E5E4E4DEFEFFAFEFFFEFEFEFEFE;FFFEFEFEFFFEFEFEFFFFP#E5E4E4DEH#J$J#J'J(J$ FFFER%DEFFFF9FFFECFFFEFFFFFEFE=FFFEFFFFFFFEFFP4DEFFFFH#J$E#8$8&:$:$<#;"9%8&:$:$;":$9&:$:$8(J$ FEFFR/E4E4DEFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFFFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEOIE4E4DEH#J$J08&8&B"9-8&8%@#:'8%9.J$ FFFER&DEFFFF8FFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFFFEFFFFFEFEFFFFFEFEFFFFFFFEFEFFFFFFFFFFFFFEFEFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFO@DEFFFFH#J$F#8$G&:#:%9$:"<$J"J"J$ FEFFR.E4E4DEFEFFFEFEFEFFFEFEFEFFFEFFFEFEFEFFFEFEFEFFFEFEFE9FF5FEOKE4E4DEH#J$J#8%G%@$9%A%@$J$ FFFER'DEFFFF7FFFEFFFFFFFFFFFFFFFEFFFFFFFEFFFFFFFFFFFFFFFEFFFEP8DEFFFFH#J$G#;"F"=#J"?"9"J&J$ FEFFR-E4E4DEFEFFFEFEFEFF=FEFFFF>FFFEFFFEFFOHE4E4DEH#J$J+;(8&>%:*9(8'>*9/J$ FFFER(DEFFFF6FFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFFFEFEFEFFFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFOJDEFFFFH#J$H#8$8R8$:$9#:%;S8#8$:P8$9T8#8P8$:$J$ FEFFR,E4E4DEFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFOHE4E4DEH#J$J#J"J$ FFFER)DEFFE45FFFE=FFQ9DEFFE4H#J"I#J" FEFFR-DEFEFFR-DEH#J"J#J" FFFER*DE6FFFER*DEH#J"J#J" FEFFR,DE4FEFFR,DEH#JZD#JZ FFFER$/FFFER$/H#J"J#J" FEFFR#FF=FEFFR#FFHz=zBz=z QKE53E5QKE53E5 HzJz QKE4FQKE4J"J" R.FFRBFFJy"zZ$x"Jy"zZ$x" 4DEFFP DEO(DEFFFFDEFFIDEFFP+DEKDEFFFFDEFFJ$J"9#J$J"9# @FFFFE4Q'E4FFFFO3FFFFE4Q'E4FFFFJ%Jz"<#J%Jz"<# >FFFFFFE4P#O$E5E4FFFFO/FFFFFFE4P.GE5E4FFFFJ#8"J#8#J#8"J#8# DEDEP%O$E4DEDEO/DEDEP0GE4DEDEJ#J"J$J#J"J$ @DEDEP"E4O(E4DEDEO3DEDEP-E4KE4DEDEJZJZ 4QGJQGI"J" FFRBFFHzJz QKE5FQKE5 J&?#F#8# 5FEFEFEFEFEFEFEFEFEFEFEJ(J# 4FEFEE5E5E5FEFE>E5E5J%<%9%8"8%8%8& =FEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEE5FEFEJ/:08":'9% 4E5FEFEFEE5E5E5E5FEFEE5E5FEFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5FEFEE5E5FEFEFEE5FEFEJ&J#H" 5E5E5FEFEFE7E5E5E5J"8"9#># 7E5FEFEFEFEFEJ#8";%<% 4FEFEE5E5E5E5E5E5E5E5E5J#>#;#;" @FEFEFEFEFEFEFEJ/:.8%9' 4E5FEFEFEFEFEE5E5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5J&9%8#8%9%:&8%8#8# 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 Fz W/FE H5 W+FFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH5 W*FEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH#Z FFFEW'H#J# FEFFVMFEFEH#?$<$J"J"J"9"C"=#J"B$8#A":#J"@":$J$J"J"A$ FFFEFEFEFEFEFEFECFEBFEO"FEFEFEFEFEGFEFEFEFEFEFEFEFEFECFEFEFEFEFE9FEFEFE;FE;FEFEFEFEH#?#<%G"F#J#J#9"C"="H"I#B(A#:"J):":#C%?#J"="G&;"A# FEFFFFFFFEFFFFFFFEFEFFAFEFFO!FEFFFFFFFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFFEFEFEFEFEFEFFFFFFFEFEFEFEFFFF4FEFFFEFEFEFEFEFFFFFFH#J#J&J%J' FFFER5FFFFO'8&8&8&?&848-?#:+;%9-8&8&J%?%9-8&8&@"8"8#B&9#:&?&8&8&8#;-?#;&?&8& FFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFEFFFEFEFFFFFFFEFFFEFFFFFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFEFFFEFFFEFFFFFEFFFEFFFEFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFFEFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFEFEFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFFFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFEH#J$G&:#A$D":#="J"=#B"J$@&8&J#A$G&:#:"J$9&9$A$="J"J$ FEFF8FEFEFEFFFEFEFEFFFEFFFEFEFEFFFEFFFF?FFFEFFFE:FEFEFEFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFFF4FEFEFEFFFFFEFEFEFEFEFEFEFEFEFF8FF4FEFEFEH#J%G%G%J%@%8PJ%G%A"I%:#:%@%J% FFFE8FFFFFFFFFFFFFFFEFFFFFFFFP0FFFFFFFFFFFFFFFEMFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFO%FEFFFFFFH#J"D$=#E"C"9#>"J#A&J"=$J#E"F"=#J"8"@"C"<"=" FEFF;FEFEFFFEFEFFFEFEFEFFFEFFEFFFFFEFFFEFF;FEFEFFFEJFEFFFEFEFEFF=FEFEFEFEFEFEH#839&8%:,>";(8%9&?&8(;#;,9">&?&8,9&9,?&9";-?/;(8&>%:&8-9%8&8-8&9,8*9(8&848% FFFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFEFEFEFEFFFEFEFEFFFEFEFEFEFFFEFEFEFFFFFFFEFEFEFFFEFEFFFFFEFEFEFFFEFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEH#9Z:$9%;$9$9#:R8$9%:$9#<$:$8Y8$8$8&;P9$9P9P8$:$;$9$@P9"<$8P9## O3FEFEFEFEFEFEFEFEODFEE5FEFEFEFEOJFEFEFEFE=FEFEO#J$E" Q:FEFEFE6E5E5OAE5E5E5E5E5OHFEFEFEE5J$J$D#;"J$I#J$;# O=E5FEFEOHE5E5E5FEFEE5ODFEFEFEFEFEOCE5E5E5FEFEJ$J%J%I%J% O>E5FEFEP*E5E5E5E5OGFEFEE5E5E5E5E5E5OIE5E5E5E5J$8$<$J":#J$8#H#;#J#<" O1E5FEFEFEFEE5E5FEFEP&FEFEFEO@E5FEFEFEFEFEFEFEFEOKFEFEFEJ'>$J+J.=.J'<% O2E5FEFEFEFEE5E5FEFEP"E5FEFEE5E5FEFEFEFEE5OAE5FEFEFEFEE5E5FEFEFEE5FEFEE5FEFEFEFEE5E5E5FEFEFEFEE5OGE5FEFEFEFEE5E5FEFEE5J%:#:#J#:&9#8%8#J%8s8#8%9%8#J#9#8%8#:# O3E5E5E5E5E5E5E5E5OCE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5O?E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5O
  • /^\.IP */ { if ( inIP > 0 ) { print "" } inIP = 1 print "
      " match($0, /".*"/ ) if ( RSTART > 0 ) { arg = substr( $0, RSTART+1, RLENGTH-2) print arg "
      " } else if ( length( $2 ) > 0 ) { print $2 "
      " } next } $0 ~ /^\.[a-zA-Z]*/ && inIP > 0 { inIP = 0 print "
    " } # Convert # .TP # Line1 # line 2 - n # .Any # # to #
    #
    Line1 #
    lines 2 - n #
    /^\.TP */ { if ( inTP > 0 ) { print "
    " } inTP = 1 print "
    " next } inTP == 1 && $1 !~ /\.[a-zA-Z]*/ { print "
    " $0 inTP = 2 next } inTP == 2 && $1 !~ /\.[a-zA-Z]*/{ print "" # Belt and suspenders print "
    " $0 inTP = 3 next } $0 ~ /^\.[a-zA-Z]*/ && inTP > 0 { inTP = 0 print "
    " } $1 == ".AP" { $1="" print "
    " print "
    " $2 "\t\t" $3 "\t\t("$4")" inTP = 2 next } # make a blank line $1 == ".sp" { print "
    " next # print "
    " } $1 == ".ta" { next } # try and make links ( tk ) # "See the .* manual entry" /"options"/ { if ( $0 ~ /^See the .*/ ) sub("\"options\"", " \"options\" ") } /"entry"/ { if ( $0 ~ /^See the .*/ ) sub("\"entry\"", " \"entry\" ") } /"button"/ { if ( $0 ~ /^See the .*/ ) sub("\"button\"", " \"button\" ") } /"scrollbar"/ { if ( $0 ~ /^See the .*/ ) sub("\"scrollbar\"", " \"scrollbar\" ") } /"listbox"/ { if ( $0 ~ /^See the .*/ ) sub("\"listbox\"", " \"listbox\" ") } /"canvas"/ { if ( $0 ~ /^See the .*/ ) sub("\"canvas\"", " \"canvas\" ") } /"text"/ { if ( $0 ~ /^See the .*/ ) sub("\"text\"", " \"text\" ") } /"license.terms"/ { if ( $0 ~ /^See the .*/ ) sub("\"license\".terms", " license.\"terms\" ") } /"buttonbox"/ { if ( $0 ~ /^See the .*/ ) sub("\"buttonbox\"", " \"buttonbox\" ") } /"combobox"/ { if ( $0 ~ /^See the .*/ ) sub("\"combobox\"", " \"combobox\" ") } /"dialog"/ { if ( $0 ~ /^See the .*/ ) sub("\"dialog\"", " \"dialog\" ") } /"dialogshell"/ { if ( $0 ~ /^See the .*/ ) sub("\"dialogshell\"", " \"dialogshell\" ") } /"entryfield"/ { if ( $0 ~ /^See the .*/ ) sub("\"entryfield\"", " \"entryfield\" ") } /"fileselectionbox"/ { if ( $0 ~ /^See the .*/ ) sub("\"fileselectionbox\"", " \"fileselectionbox\" ") } /"fileselectiondialog"/ { if ( $0 ~ /^See the .*/ ) sub("\"fileselectiondialog\"", " \"fileselectiondialog\" ") } /"labeledwidget"/ { if ( $0 ~ /^See the .*/ ) sub("\"labeledwidget\"", " \"labeledwidget\" ") } /"messagedialog"/ { if ( $0 ~ /^See the .*/ ) sub("\"messagedialog\"", " \"messagedialog\" ") } /"optionmenu"/ { if ( $0 ~ /^See the .*/ ) sub("\"optionmenu\"", " \"optionmenu\" ") } /"panedwindow"/ { if ( $0 ~ /^See the .*/ ) sub("\"panedwindow\"", " \"panedwindow\" ") } /"promptdialog"/ { if ( $0 ~ /^See the .*/ ) sub("\"promptdialog\"", " \"promptdialog\" ") } /"pushbutton"/ { if ( $0 ~ /^See the .*/ ) sub("\"pushbutton\"", " \"pushbutton\" ") } /"scrolledcanvas"/ { if ( $0 ~ /^See the .*/ ) sub("\"scrolledcanvas\"", " \"scrolledcanvas\" ") } /"scrolledframe"/ { if ( $0 ~ /^See the .*/ ) sub("\"scrolledframe\"", " \"scrolledframe\" ") } /"scrolledlistbox"/ { if ( $0 ~ /^See the .*/ ) sub("\"scrolledlistbox\"", " \"scrolledlistbox\" ") } /"scrolledtext"/ { if ( $0 ~ /^See the .*/ ) sub("\"scrolledtext\"", " \"scrolledtext\" ") } /"selectionbox"/ { if ( $0 ~ /^See the .*/ ) sub("\"selectionbox\"", " \"selectionbox\" ") } /"selectiondialog"/ { if ( $0 ~ /^See the .*/ ) sub("\"selectiondialog\"", " \"selectiondialog\" ") } /"spindate"/ { if ( $0 ~ /^See the .*/ ) sub("\"spindate\"", " \"spindate\" ") } /"spinint"/ { if ( $0 ~ /^See the .*/ ) sub("\"spinint\"", " \"spinint\" ") } /"spinner"/ { if ( $0 ~ /^See the .*/ ) sub("\"spinner\"", " \"spinner\" ") } /"spintime"/ { if ( $0 ~ /^See the .*/ ) sub("\"spintime\"", " \"spintime\" ") } /^Name: */ { print $1 " " $2 next } /^Class: */ { print $1 " " $2 next } /^Bret A. Schuhmacher*/ { print "" $0 "" next } /^John S. Sigler*/ { print "" $0 "" next } /^Mark L. Ulferts*/ { print "" $0 "" next } /^Alfredo Jahn*/ { print "" $0 "" next } /^Sue Yockey*/ { print "" $0 "" next } # just pass everything else on { print $0 } iwidgets-4.1.0/doc/tk2html.perl0000644003604700454610000002244606557146036014770 0ustar dgp771div#!/usr/local/bin/perl # Lightly modified man2html to make html equivs of tk/tcl man pages # probably a dead end soln since works on output after troff processing # Set the man path array to the paths to search... @manpath = ('/usr/share/man','/usr/gnu/man','/usr/local/man'); #@manpath = ('/s/usr/hops/src/ftp/tcl/tk3.4/docs'); # There has to be a blank line after this... #print "Content-type:text/html\n\n"; if (!$ARGV[0]) { print "\n"; chop($os = `uname`); chop($ver = `uname -r`); print " $os $ver Manual Pages

    $os $ver Manual Pages

    Enter the name of the man page, optionally surrounded by parenthesis with the number. For example:

    • stat to find one or more man pages for ls
    • stat(2) for the system call stat
    This converter is still in development. I intend to improve the handling of multiple matches, and add a interface to apropos (or man -k (or whatis...))

    Brooks Cutter "; exit(0); } $_ = $ARGV[0]; $manpages[0] = $_; if ((/^-$/)) { $manpages[0] = $_; } elsif ((m!^/!)) { $manpages[0] = $_; #} elsif (($name, $sect) = /(\S+)\((\d.*)\)/) { # @manpages = &findman($name, $sect, @manpath); #} elsif (($name, $sect) = /(\S+)<(\d.*)>/) { # @manpages = &findman($name, $sect, @manpath); #} elsif (($name, $sect) = /(\S+)\[(\d.*)\]/) { # @manpages = &findman($name, $sect, @manpath); #} else { # @manpages = &findman($_, '', @manpath); } if (!scalar @manpages) { print "Sorry, I was unable to find a match for $_\n"; exit(0); } elsif (scalar @manpages > 1) { &which_manpage(@manpages); } else { if (!-e $manpages[0]) { die "man2html: Error, Can't locate file '$manpages[0]'\n"; } chop($type=`file -L $manpages[0]`); if ($type =~ /roff/i) { $manpages[0] = "nroff -man $manpages[0]|col -b|"; } elsif ($type =~ /text/i) { # #$manpages[0] = $manpages[0]; # ; # NOP (No Operation) $manpages[0] = "nroff -man $manpages[0]| col -b|"; } else { print " Man2HTML: An Error has occurred

    Man2HTML: An Error has occurred

    man2html found the following match for your query: $manpages[0]

    When 'file -L $manpages[0]' was run (which should follow symbolic links) it returned the following value '$type'

    "; if ($type =~ /link/i) { print " This problem appears to be that there is a symbolic link for a man page that is pointing to a file that doesn't exist.

    "; } print " Please report this problem to someone who can do something about it. (Assuming you aren't that person...) If you don't know who that is, try emailing 'root' or 'postmaster'.

    There was only one match for your query - and it can't currently be accessed. "; exit(0); #die "Unknown type '$type' for manpage '$manpages[0]'"; } &print_manpage($manpages[0]); } exit(0); sub findman { # Take a argument like 'ls' or 'vi(1)' or 'tip(1c)' and return # a list of one or more manpages. # Arguments 2- are the directories to search in local($lookfor) = shift(@_); local($section) = shift(@_); local($file, @files, @return, $return); local(%men,%man); die "lookfor($lookfor) is null\n" unless($lookfor); for (@_) { # I'm... too lazy... for... opendir()... too lazy for readdir()... # too lazy for closedir() ... I'm too lazy! if (!$section) { @files = `/bin/ls $_/*/$lookfor.* 2> /dev/null`; } else { # if the section is like '1b' then just search *1b # otherwise if '1' search *1* (to catch all sub-sections) # Reason for wildcards: ($_/*$section*/$lookfor.*) # (given $section = '2') # 1st: So it catches cat2 and man2 # 2nd: So it catches man2 and man2v # (This should make it compatiable with HP/UX's man2.Z - not tested) # 3rd: So it catches stat.2 and stat.2v # if (length($section) == 1) { @files = `/bin/ls $_/*$section*/$lookfor.* 2> /dev/null`; } else { local($section_num) = substr($section, 0, 1); # Just the number... @files = `/bin/ls $_/*$section_num*/$lookfor.* $_/*$section/$lookfor.* 2> /dev/null`; } } next if (!scalar @files); # This part checks the files that were found... for $file (@files) { chop($file); local(@dirs) = split(/\//,$file); local($fn) = pop(@dirs); local($catman) = pop(@dirs); local($dir) = join('/',@dirs); local($key) = "$dir/$fn"; next if ($man{$key}); # forces unique if (!$men{$key}) { $men{$key} = $catman; $man{$key} = $file; } else { # pre-formatted man pages always take precedence unless zero bytes... next if (($men{$key} =~ /^cat/i) && (!(-z $man{$key}))); $men{$key} = $catman; $man{$key} = $file; } } } return(values %man); } sub which_manpage { # Print a list of manpages... print " There were multiple matches for the argument '$ARGV[0]'. Below are the fully qualified pathnames of the matches, please click on the appropriate one.

      "; for (@_) { print "
    • $_\n"; } print "
    \n"; return; } sub print_manpage { local($page) = @_; local($label, $before, $after, $begtag, $endtag, $blanks, $begtag2, $endtag2); local($pre); local($standard_indent) = 0; if ($page eq '-') { open(MAN, '-'); } elsif (index($page,'|') == length($page)) { # A Pipe local($eval) = 'open(MAN, "'.$page.'") || die "Can'."'t open pipe to '$page' for reading: ".'$!";'; eval($eval); die "Eval error line $. : '$eval' returned '$@' : $!\n"; } else { open(MAN, $page) || die "Can't open '$page' for reading: $!"; } while () { s/\|\|*[ ]*$//; # Delete trailing change bars if (/^\s*$/) { $blanks++; #if ($pre) { print "\n"; $pre = 0; } if (($. != 1) && ($blanks == 1)) { if (($pre) || ($section_pre)) { print "\n"; } else { print "

    \n"; } } next; } #next if (!/^[A-Z]{2,}\(.*\).*/); if (//) { s/.//g; } # Escape & < and > s/&/\&/g; s//\>/g; # if (/^(\w+.*)\s*$/) { $label = $1; $next_action = ''; if (/^[A-Z ]{2,}\s*$/) { if (($pre) || ($section_pre)) { print "\n"; } $pre = $section_pre = $section_fmt = 0; if (!$standard_indent) { $next_action = 'check_indent'; } } if ($label eq 'NAME') { $begtag = ''; $endtag = ''; $begtag2 = '

    '; $endtag2 = '

    '; $next_action = 'check_indent'; next; } if ($label eq 'SYNOPSIS') { $section_fmt = 1; } if ($label eq 'SEE ALSO') { $next_action = 'create_links'; } if (($label =~ /OPTIONS$/) || ($label eq 'FILES')) { $section_pre = 1; print "\n"; # print "\n"; } elsif (/^[A-Z ]+\s*$/) { print "\n" if (($pre) || ($section_pre)); $section_pre = 0; } print "..$label..\n"; if (/^[-A-Z ]+\s*$/) { print "

    $label

    \n"; $blanks = 0; print "
    \n" if ($section_pre);
            next;
          }
          next;
        }
        if ($section_fmt) { print; $blanks = 0; next; }
        if ($next_action eq 'create_links') {
          # Parse see also looking for man page links.  Make it
          # call this program.  use '+' notation for spaces
          local($page);
          local($first) = 1;
          for $page (split(/,/)) {
            $page =~ tr/\x00-\x20//d; # Delete all control chars, spaces
            if ($page =~ /.+\(\d.*\).*$/) {
              $url_page = $page;
              $url_page =~ tr/()/[]/;
              print "," if (!$first);
              $first = 0;
              print "$page\n";
            } else {
              print "," if (!$first);
              $first = 0;
              print "$page";
            }
          }
          next;
        }
        # This is to detect preformatted blocks.  I look at the first
        # line after header 'DESCRIPTION' and count the leading white
        # space as the "standard indent".  If I encounter a line with
        # a indent greater than the value of standard_indent then
        # surround it with 
     and 
    if ($next_action eq 'check_indent') { if (/^(\s+)\S+.*/) { $standard_indent = length($1); $next_action = ''; } } # $before = length($_); $saved = $_; s/^[ ][ ]*//; # Delete leading whitespace $after = length($_); s/[ ][ ]*$//; # Delete trailing whitespace if ($begtag) { chop; print "$begtag$_$endtag\n"; print "$begtag2$_$endtag2\n" if ($begtag2); $blanks = 0; $begtag2 = $endtag2 = $begtag = $endtag = ''; next; } if ((!$section_fmt) && (!$section_pre) && ($standard_indent)) { if (($blanks == 1) && (!$pre) && ($after + $standard_indent) < $before) { $pre = 1; print "
    \n";
          } elsif (($pre) && ($after + $standard_indent) >= $before) {
            $pre = 0;
            print "
    \n"; } } if (($section_pre) || ($pre)) { print "$saved"; $blanks = 0; next; } # Handle word cont- # inuations if ($prefix) { print $prefix; $prefix = ''; } if (/^(.+)\s+(\w+)\-\s*$/) { $prefix = $2; print "$1\n"; $blanks = 0; next; } print; $blanks = 0; } close(MAN); } # EOF iwidgets-4.1.0/doc/tk2html2.awk0000644003604700454610000000216606557146037014670 0ustar dgp771div#!/bin/nawk # cleans up any leading crap before line in stream from tk2html /^<TITLE>/ { go = 1 } /^<table>*/ { getline ln numf = split (ln, spln) if ( ln !~ "Name: *" ) { ind = 0 inc = 4 print "<table cellpadding=5>" while ( ln !~ "^</table>" ) { for (i = 1; i <= numf; i++) { tablns[ind] = spln[i] ind++ } getline ln numf = split (ln, spln) } for (i = 0; i < inc; i++) { print "<td valign=top>" for (j = i; j < ind; j += inc) print tablns[j] "<br>" print "</td>" } print "</table>" } else { print "<pre>" while ( ln !~ "^</table>" ) { print ln getline ln } print "</pre>" } next } go == 1 { print $0 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/doc/toolbar.n������������������������������������������������������������������������0000644�0036047�0045461�00000031001�07476742024�014323� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" toolbar.n '\" .so man.macros .HS iwidgets::toolbar iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME \fBiwidgets::toolbar\fR \- Create and manipulate a tool bar .SH SYNOPSIS \fBiwidgets::toolbar\fR \fIpathName\fR ?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::Toolbar .SH STANDARD OPTIONS .LP .nf .ta 4c 8c 12c \fB activeBackground activeForeground background borderWidth cursor disabledForeground font foreground highlightBackground highlightColor highlightThickness insertBackground insertForeground orient selectBackground selectBorderWidth selectForeground state troughColor\fR .fi .LP See the "options" manual entry for details on the standard options. For widgets added to the toolbar, these options will be propogated if the widget supports the option. For example, all widgets that support a font option will be changed if the the toolbar's font option is configured. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBballoonBackground\fR Class: \fBBalloonBackground\fR Command-Line Switch: \fB-ballooonbackground\fR .fi .IP Specifies the background color of the balloon help displayed at the bottom center of a widget on the toolbar that has a non empty string for its balloonStr option. The default color is yellow. .LP .nf Name: \fBballoonDelay1\fR Class: \fBBalloonDelay1\fR Command-Line Switch: \fB-balloondelay1\fR .fi .IP Specifies the length of time (in milliseconds) to wait before initially posting a balloon help hint window. This delay is in effect whenever 1) the mouse leaves the toolbar, or 2) a toolbar item is selected with the mouse button. .LP .nf Name: \fBballoonDelay2\fR Class: \fBBalloonDelay2\fR Command-Line Switch: \fB-balloondelay2\fR .fi .IP Specifies the length of time (in milliseconds) to wait before continuing to post balloon help hint windows. This delay is in effect after the first time a balloon hint window is activated. It remains in effect until 1) the mouse leaves the toolbar, or 2) a toolbar item is selected with the mouse button. .LP .nf Name: \fBballoonFont\fR Class: \fBBalloonFont\fR Command-Line Switch: \fB-balloonfont\fR .fi .IP Specifies the font of the balloon help text displayed at the bottom center of a widget on the toolbar that has a non empty string for its balloonStr option. The default font is 6x10. .LP .nf Name: \fBballoonForeground\fR Class: \fBBalloonForeground\fR Command-Line Switch: \fB-ballooonforeground\fR .fi .IP Specifies the foreground color of the balloon help displayed at the bottom center of a widget on the toolbar that has a non empty string for its balloonStr option. The default color is black. .LP .nf Name: \fBhelpVariable\fR Class: \fBHelpVariable\fR Command-Line Switch: \fB-helpvariable\fR .fi .IP Specifies the global variable to update whenever the mouse is in motion over a toolbar widget. This global variable is updated with the current value of the active widget's helpStr. Other widgets can "watch" this variable with the trace command, or as is the case with entry or label widgets, they can set their textVariable to the same global variable. This allows for a simple implementation of a help status bar. Whenever the mouse leaves a menu entry, the helpVariable is set to the empty string {}. .LP .nf Name: \fBorient\fR Class: \fBOrient\fR Command-Line Switch: \fB-orient\fR .fi .IP Specifies the orientation of the toolbar. Must be either horizontal or vertical. .BE .SH DESCRIPTION The \fBiwidgets::toolbar\fR command creates a new window (given by the pathName argument) and makes it into a \fBtoolbar\fR widget. Additional options, described above may be specified on the command line or in the option database to configure aspects of the toolbar such as its colors, font, and orientation. The \fBiwidgets::toolbar\fR command returns its pathName argument. At the time this command is invoked, there must not exist a window named pathName, but pathName's parent must exist. .PP A \fBtoolbar\fR is a widget that displays a collection of widgets arranged either in a row or a column (depending on the value of the -orient option). This collection of widgets is usually for user convenience to give access to a set of commands or settings. Any widget may be placed on a toolbar. However, command or value-oriented widgets (such as button, radiobutton, etc.) are usually the most useful kind of widgets to appear on a toolbar. .PP In addition, the toolbar adds two new options to all widgets that are added to it. These are the \fBhelpStr\fR and \fBballoonStr\fR options. See the discussion for the widget command add below. .SH "WIDGET-SPECIFIC METHODS" .PP The iwidgets::toolbar command creates a new Tcl command whose name is pathName. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName\fR \fIoption\fR \fI?arg arg ...?\fR .DE Option and args determine the exact behavior of the command. .PP Many of the widget commands for a toolbar take as one argument an indicator of which widget item of the toolbar to operate on. The indicator is called an \fBindex\fR and may be specified in any of the following forms: .TP \fInumber\fR Specifies the widget numerically, where 0 corresponds to the first widget in the notebook, 1 to the second, and so on. (For horizontal, 0 is the leftmost; for vertical, 0 is the topmost). .TP \fBend\fR Specifes the last widget in the toolbar's index. If the toolbar is empty this will return -1. .TP \fBlast\fR Same as end. .TP \fIpattern\fR If the index doesn't satisfy any of the above forms, then this form is used. Pattern is pattern-matched against the widgetName of each widget in the toolbar, in order from the first to the last widget, until a matching entry is found. An exact match must occur. .PP The following commands are possible for toolbar widgets: .TP \fIpathName\fR \fBadd\fR \fIwidgetCommand\fR \fIwidgetName\fR \fI?option value?\fR Adds a widget with the command widgetCommand whose name is widgetName to the toolbar. If widgetCommand is radiobutton or checkbutton, its packing is slightly padded to match the geometry of button widgets. In addition, the indicatorOn option is false by default and the selectColor is that of the toolbar background by default. This allows Radiobutton and Checkbutton widgets to be added as icons by simply setting their bitmap or image options. If additional arguments are present, they are the set of available options that the widget type of \fIwidgetCommand\fR supports. In addition they may also be one of the following options: .RS .TP \fB-helpstr\fR \fIvalue\fR Specifes the help string to associate with the widget. When the mouse moves over the widget, the variable denoted by \fBhelpVariable\fR is set to \fBhelpStr\fR. Another widget can bind to the helpVariable and thus track status help. .TP \fB-balloonstr\fR \fIvalue\fR Specifes the string to display in a balloon window for this widget. A balloon window is a small popup window centered at the bottom of the widget. Usually the \fBballoonStr\fR value is the name of the item on the toolbar. It is sometimes known as a hint window. .IP When the mouse moves into an item on the toolbar, a timer is set based on the value of \fBballoonDelay1\fR. If the mouse stays inside the item for \fBballoonDelay1\fR, the balloon window will pop up displaying the \fBballoonStr\fR value. Once the balloon window is posted, a new timer based on \fBballoonDelay2\fR is set. This is typically a shorter timer. If the mouse is moved to another item, the window is unposted and a new window will be posted over the item if the shorter delay time is satisfied. .IP While the balloon window is posted, it can also be unposted if the item is selected. In this case the timer is reset to \fBballoonDelay1\fR. Whenever the mouse leaves the toolbar, the timer is also reset to \fBballoonDelay1\fR. .IP This window posting/unposting model is the same model used in the Windows95 environment. .RE .TP \fIpathName\fR \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR \fIvalue\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for pathName (see Tk_ConfigureInfo for information on the format of this list). If \fIoption\fR is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. .TP \fIpathName\fR \fBdelete\fR \fIindex\fR ?\fIindex2\fR? This command deletes all items between \fIindex\fR and \fIindex2\fR inclusive. If \fIindex2\fR is omitted then it defaults to \fIindex\fR. Returns an empty string. .TP \fIpathName\fR \fBindex\fR \fIindex\fR Returns the widget's numerical index for the entry corresponding to \fIindex\fR. If \fIindex\fR is not found, -1 is returned. .TP \fIpathName\fR \fBinsert\fR \fIbeforeIndex\fR \fIwidgetCommand\fR \fIwidgetName\fR \fI?option value?\fR .TP Insert a new item named \fIwidgetName\fR with the command \fIwidgetCommand\fR before the item specified by \fIbeforeIndex\fR. If \fIwidgetCommand\fR is \fBradiobutton\fR or \fBcheckbutton\fR, its packing is slightly padded to match the geometry of button widgets. In addition, the \fBindicatorOn\fR option is \fBfalse\fR by default and the \fBselectColor\fR is that of the toolbar background by default. This allows \fBRadiobutton\fR and \fBCheckbutton\fR widgets to be added as icons by simply setting their \fBbitmap\fR or \fBimage\fR options. The set of available options is the same as specified in the \fBad\fR command. .TP \fIpathName\fR \fBitemcget\fR \fIindex\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR for index. The item type of \fIindex\fR determines the valid available options. .TP \fIpathName\fR \fBitemconfigure\fR \fIindex\fR \fI?option value?\fR Query or modify the configuration options of the widget of the toolbar specified by \fIindex\fR. If no option is specified, returns a list describing all of the available options for \fIindex\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. The item type of \fIindex\fR determines the valid available options. The set of available options is the same as specified in the \fBad\fR command. .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::toolbar .tb -helpvariable statusVar .tb add button item1 \\ -helpstr "Save It" -bitmap @./icons/Tool_32_box.xbm \\ -balloonstr "Save" -command {puts 1} .tb add button item2 \\ -helpstr "Save It" -bitmap @./icons/Tool_32_brush.xbm \\ -balloonstr "Save" -command {puts 1} .tb add button item3 \\ -helpstr "Save It" -bitmap @./icons/Tool_32_cut.xbm \\ -balloonstr "Save" -command {puts 1} .tb add button item4 \\ -helpstr "Save It" -bitmap @./icons/Tool_32_draw.xbm \\ -balloonstr "Save" -command {puts 1} .tb add button item5 \\ -bitmap @./icons/Tool_32_erase.xbm -helpstr "Play It" \\ -command {puts 2} .tb add frame filler \\ -borderwidth 1 -width 10 -height 10 .tb add radiobutton item6 \\ -bitmap @./icons/Tool_32_oval.xbm -command {puts 4} \\ -variable result -value OPEN -helpstr "Radio Button # 1" \\ -balloonstr "Radio" .tb add radiobutton item7 \\ -bitmap @./icons/Tool_32_line.xbm -command {puts 5} \\ -variable result -value CLOSED .tb add checkbutton item8 \\ -bitmap @./icons/Tool_32_text.xbm -command {puts 6} \\ -variable checkit -onvalue yes -offvalue no .tb add checkbutton check2 \\ -bitmap @./icons/Tool_32_points.xbm -command {puts 7} \\ -variable checkit2 -onvalue yes -offvalue no pack .tb -side top -anchor nw .DE .SH AUTHOR Bill Scott .SH KEYWORDS toolbar, button, radiobutton, checkbutton, iwidgets, widget �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/doc/watch.n��������������������������������������������������������������������������0000644�0036047�0045461�00000017133�07340743271�013774� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������'\" '\" Copyright (c) 1995 DSC Technologies Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" '\" @(#) watch.n '\" .so man.macros .HS iwidgets::watch iwid .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME iwidgets::watch \- Create and manipulate time with a watch widgets .SH SYNOPSIS \fBiwidgets::watch\fI \fIpathName \fR?\fIoptions\fR? .SH "INHERITANCE" itk::Widget <- iwidgets::Watch .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c \fBbackground\fR \fBcursor\fR \fBforeground\fR \fBrelief\fR .fi .LP See the "options" manual entry for details on the standard options. .SH "ASSOCIATED OPTIONS" .LP See the "Canvas" manual entry for details on the above associated options. .SH "WIDGET-SPECIFIC OPTIONS" .LP .nf Name: \fBclockColor\fR Class: \fBColorfR Command-Line Switch: \fB-clockcolor\fR .fi .IP Fill color for the main oval encapsulating the watch, in any of the forms acceptable to \fBTk_GetColor\fR. The default is "White". .nf .LP Name: \fBclockStipple\fR Class: \fBBitmapfR Command-Line Switch: \fB-clockstipple\fR .fi .IP Bitmap for the main oval encapsulating the watch, in any of the forms acceptable to \fBTk_GetBitmap\fR. The default is "". .LP .nf Name: \fBheight\fR Class: \fBHeight\fR Command-Line Switch: \fB-height\fR .fi .IP Specifies the height of the watch widget in any of the forms acceptable to \fBTk_GetPixels\fR. The default height is 175 pixels. .LP .nf Name: \fBhourColor\fR Class: \fBColorfR Command-Line Switch: \fB-hourcolor\fR .fi .IP Fill color for the hour hand, in any of the forms acceptable to \fBTk_GetColor\fR. The default is "Red". .LP .nf Name: \fBhourRadius\fR Class: \fBRadius\fR Command-Line Switch: \fB-hourradius\fR .fi .IP Specifies the radius of the hour hand as a percentage of the radius from the center to the out perimeter of the clock. The value must be a fraction <= 1. The default is ".5". .LP .nf Name: \fBminuteColor\fR Class: \fBColorfR Command-Line Switch: \fB-minutecolor\fR .fi .IP Fill color for the minute hand, in any of the forms acceptable to \fBTk_GetColor\fR. The default is "Yellow". .LP .nf Name: \fBminuteRadius\fR Class: \fBRadius\fR Command-Line Switch: \fB-minuteradius\fR .fi .IP Specifies the radius of the minute hand as a percentage of the radius from the center to the out perimeter of the clock. The value must be a fraction <= 1. The default is ".8". .LP .nf Name: \fBpivotColor\fR Class: \fBColorfR Command-Line Switch: \fB-pivotcolor\fR .fi .IP Fill color for the circle in which the watch hands rotate in any of the forms acceptable to \fBTk_GetColor\fR. The default is "White". .LP .nf Name: \fBpivotRadius\fR Class: \fBRadius\fR Command-Line Switch: \fB-pivotradius\fR .fi .IP Specifies the radius of the circle in which the watch hands rotate as a percentage of the radius. The value must be a fraction <= 1. The default is ".1". .LP .nf Name: \fBsecondColor\fR Class: \fBColorfR Command-Line Switch: \fB-secondcolor\fR .fi .IP Fill color for the second hand, in any of the forms acceptable to \fBTk_GetColor\fR. The default is "Black". .LP .nf Name: \fBsecondRadius\fR Class: \fBRadius\fR Command-Line Switch: \fB-secondradius\fR .fi .IP Specifies the radius of the second hand as a percentage of the radius from the center to the out perimeter of the clock. The value must be a fraction <= 1. The default is ".9". .LP .nf Name: \fBshowAmPm\fR Class: \fBShosAmPm\fR Command-Line Switch: \fB-showampm\fR .fi .IP Specifies whether the AM/PM radiobuttons should be displayed, in any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is yes. .LP .nf Name: \fBstate\fR Class: \fBState\fR Command-Line Switch: \fB-state\fR .fi .IP Specifies the editable state for the hands on the watch. In a normal state, the user can select and move the hands via mouse button 1. The valid values are \fBnormal\fR, and \fBdisabled\fR. The defult is normal. .LP .nf Name: \fBtickColor\fR Class: \fBColorfR Command-Line Switch: \fB-tickcolor\fR .fi .IP Fill color for the 60 ticks around the perimeter of the watch, in any of the forms acceptable to \fBTk_GetColor\fR. The default is "Black". .LP .nf Name: \fBwidth\fR Class: \fBWidth\fR Command-Line Switch: \fB-width\fR .fi .IP Specifies the width of the watch widget in any of the forms acceptable to \fBTk_GetPixels\fR. The default height is 155 pixels. .BE .SH DESCRIPTION .PP The \fBiwidgets::watch\fR command creates a watch with hour, minute, and second hands modifying the time value. .SH "METHODS" .PP The \fBiwidgets::watch\fR command creates a new Tcl command whose name is \fIpathName\fR. This command may be used to invoke various operations on the widget. It has the following general form: .DS C \fIpathName option \fR?\fIarg arg ...\fR? .DE \fIOption\fR and the \fIarg\fRs determine the exact behavior of the command. The following commands are possible for watch widgets: .SH "WIDGET-SPECIFIC METHODS" .TP \fIpathName \fBcget\fR \fIoption\fR Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBiwidgets::watch\fR command. .TP \fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR? Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no \fIvalue\fR, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no \fIoption\fR is specified). If one or more \fIoption\-value\fR pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. \fIOption\fR may have any of the values accepted by the \fBiwidgets::watch\fR command. .TP \fIpathName \fBget\fR ?\fBformat\fR? Returns the current time of the watch in a format of string or as an integer clock value using the \fB-string\fR and \fB-clicks\fR format options respectively. The default is by string. Reference the clock command for more information on obtaining time and its formats. .TP \fIpathName \fBshow\fR \fItime\fR Changes the currently displayed time to be that of the time argument. The time may be specified either as a string, an integer clock value or the keyword "now". Reference the clock command for more information on obtaining time and its format. .TP \fIpathName \fBwatch\fR ?\fBargs\fR? Evaluates the specifieds \fBargs\fR against the canvas component. .ta 4c .SH "COMPONENTS" .LP .nf Name: \fBcanvas\fR Class: \fBCanvas\fR .fi .IP The canvas component is the where the clock is drawn. See the Canvas widget manual entry for details. .LP .nf Name: \fBframe\fR Class: \fBFrame\fR .fi .IP The frame component is the where the "AM" and "PM" radiobuttons are displayed. See the Frame widget manual entry for details. .LP .nf Name: \fBam\fR Class: \fBRadiobutton\fR .fi .IP The am component indicates whether on not the time is relative to "AM". See the Radiobutton widget manual entry for details. .LP .nf Name: \fBpm\fR Class: \fBRadiobutton\fR .fi .IP The pm component indicates whether on not the time is relative to "PM". See the Radiobutton widget manual entry for details. .fi .SH EXAMPLE .DS package require Iwidgets 4.0 iwidgets::watch .w -state disabled -showampm no -width 155 -height 155 pack .w -padx 10 -pady 10 -fill both -expand yes while {1} { after 1000 .w show update } .DE .SH AUTHOR John Tucker .DE Mark L. Ulferts .SH KEYWORDS watch, hand, ticks, pivot, widget �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/�����������������������������������������������������������������������������0000755�0036047�0045461�00000000000�13136712367�013353� 5����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/buttonbox.itk����������������������������������������������������������������0000644�0036047�0045461�00000043531�07336537735�016127� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Buttonbox # ---------------------------------------------------------------------- # Manages a framed area with Motif style buttons. The button box can # be configured either horizontally or vertically. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # Bret A. Schuhmacher EMAIL: bas@wn.com # # @(#) $Id: buttonbox.itk,v 1.3 2001/08/15 18:30:53 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Buttonbox { keep -background -cursor -foreground } # ------------------------------------------------------------------ # BUTTONBOX # ------------------------------------------------------------------ itcl::class iwidgets::Buttonbox { inherit itk::Widget constructor {args} {} destructor {} itk_option define -pady padY Pad 5 itk_option define -padx padX Pad 5 itk_option define -orient orient Orient "horizontal" itk_option define -foreground foreground Foreground black public method index {args} public method add {args} public method insert {args} public method delete {args} public method default {args} public method hide {args} public method show {args} public method invoke {args} public method buttonconfigure {args} public method buttoncget {index option} private method _positionButtons {} private method _setBoxSize {{when later}} private method _getMaxWidth {} private method _getMaxHeight {} private variable _resizeFlag {} ;# Flag for resize needed. private variable _buttonList {} ;# List of all buttons in box. private variable _displayList {} ;# List of displayed buttons. private variable _unique 0 ;# Counter for button widget ids. } namespace eval iwidgets::Buttonbox { # # Set up some class level bindings for map and configure events. # bind bbox-map <Map> [itcl::code %W _setBoxSize] bind bbox-config <Configure> [itcl::code %W _positionButtons] } # # Provide a lowercased access method for the Buttonbox class. # proc ::iwidgets::buttonbox {pathName args} { uplevel ::iwidgets::Buttonbox $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::constructor {args} { # # Add Configure bindings for geometry management. # bindtags $itk_component(hull) \ [linsert [bindtags $itk_component(hull)] 0 bbox-map] bindtags $itk_component(hull) \ [linsert [bindtags $itk_component(hull)] 1 bbox-config] pack propagate $itk_component(hull) no # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::destructor {} { if {$_resizeFlag != ""} {after cancel $_resizeFlag} } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -pady # # Pad the y space between the button box frame and the hull. # ------------------------------------------------------------------ itcl::configbody iwidgets::Buttonbox::pady { _setBoxSize } # ------------------------------------------------------------------ # OPTION: -padx # # Pad the x space between the button box frame and the hull. # ------------------------------------------------------------------ itcl::configbody iwidgets::Buttonbox::padx { _setBoxSize } # ------------------------------------------------------------------ # OPTION: -orient # # Position buttons either horizontally or vertically. # ------------------------------------------------------------------ itcl::configbody iwidgets::Buttonbox::orient { switch $itk_option(-orient) { "horizontal" - "vertical" { _setBoxSize } default { error "bad orientation option \"$itk_option(-orient)\",\ should be either horizontal or vertical" } } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: index index # # Searches the buttons in the box for the one with the requested tag, # numerical index, keyword "end" or "default". Returns the button's # tag if found, otherwise error. # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::index {index} { if {[llength $_buttonList] > 0} { if {[regexp {(^[0-9]+$)} $index]} { if {$index < [llength $_buttonList]} { return $index } else { error "Buttonbox index \"$index\" is out of range" } } elseif {$index == "end"} { return [expr {[llength $_buttonList] - 1}] } elseif {$index == "default"} { foreach knownButton $_buttonList { if {[$itk_component($knownButton) cget -defaultring]} { return [lsearch -exact $_buttonList $knownButton] } } error "Buttonbox \"$itk_component(hull)\" has no default" } else { if {[set idx [lsearch $_buttonList $index]] != -1} { return $idx } error "bad Buttonbox index \"$index\": must be number, end,\ default, or pattern" } } else { error "Buttonbox \"$itk_component(hull)\" has no buttons" } } # ------------------------------------------------------------------ # METHOD: add tag ?option value option value ...? # # Add the specified button to the button box. All PushButton options # are allowed. New buttons are added to the list of buttons and the # list of displayed buttons. The PushButton path name is returned. # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::add {tag args} { itk_component add $tag { iwidgets::Pushbutton $itk_component(hull).[incr _unique] } { usual rename -highlightbackground -background background Background } if {$args != ""} { uplevel $itk_component($tag) configure $args } lappend _buttonList $tag lappend _displayList $tag _setBoxSize } # ------------------------------------------------------------------ # METHOD: insert index tag ?option value option value ...? # # Insert the specified button in the button box just before the one # given by index. All PushButton options are allowed. New buttons # are added to the list of buttons and the list of displayed buttons. # The PushButton path name is returned. # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::insert {index tag args} { itk_component add $tag { iwidgets::Pushbutton $itk_component(hull).[incr _unique] } { usual rename -highlightbackground -background background Background } if {$args != ""} { uplevel $itk_component($tag) configure $args } set index [index $index] set _buttonList [linsert $_buttonList $index $tag] set _displayList [linsert $_displayList $index $tag] _setBoxSize } # ------------------------------------------------------------------ # METHOD: delete index # # Delete the specified button from the button box. # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::delete {index} { set index [index $index] set tag [lindex $_buttonList $index] destroy $itk_component($tag) set _buttonList [lreplace $_buttonList $index $index] if {[set dind [lsearch $_displayList $tag]] != -1} { set _displayList [lreplace $_displayList $dind $dind] } _setBoxSize update idletasks } # ------------------------------------------------------------------ # METHOD: default index # # Sets the default to the push button given by index. # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::default {index} { set index [index $index] set defbtn [lindex $_buttonList $index] foreach knownButton $_displayList { if {$knownButton == $defbtn} { $itk_component($knownButton) configure -defaultring yes } else { $itk_component($knownButton) configure -defaultring no } } } # ------------------------------------------------------------------ # METHOD: hide index # # Hide the push button given by index. This doesn't remove the button # permanently from the display list, just inhibits its display. # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::hide {index} { set index [index $index] set tag [lindex $_buttonList $index] if {[set dind [lsearch $_displayList $tag]] != -1} { place forget $itk_component($tag) set _displayList [lreplace $_displayList $dind $dind] _setBoxSize } } # ------------------------------------------------------------------ # METHOD: show index # # Displays a previously hidden push button given by index. Check if # the button is already in the display list. If not then add it back # at it's original location and redisplay. # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::show {index} { set index [index $index] set tag [lindex $_buttonList $index] if {[lsearch $_displayList $tag] == -1} { set _displayList [linsert $_displayList $index $tag] _setBoxSize } } # ------------------------------------------------------------------ # METHOD: invoke ?index? # # Invoke the command associated with a push button. If no arguments # are given then the default button is invoked, otherwise the argument # is expected to be a button index. # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::invoke {args} { if {[llength $args] == 0} { $itk_component([lindex $_buttonList [index default]]) invoke } else { $itk_component([lindex $_buttonList [index [lindex $args 0]]]) \ invoke } } # ------------------------------------------------------------------ # METHOD: buttonconfigure index ?option? ?value option value ...? # # Configure a push button given by index. This method allows # configuration of pushbuttons from the Buttonbox level. The options # may have any of the values accepted by the add method. # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::buttonconfigure {index args} { set tag [lindex $_buttonList [index $index]] set retstr [uplevel $itk_component($tag) configure $args] _setBoxSize return $retstr } # ------------------------------------------------------------------ # METHOD: buttonccget index option # # Return value of option for push button given by index. Option may # have any of the values accepted by the add method. # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::buttoncget {index option} { set tag [lindex $_buttonList [index $index]] set retstr [uplevel $itk_component($tag) cget [list $option]] return $retstr } # ----------------------------------------------------------------- # PRIVATE METHOD: _getMaxWidth # # Returns the required width of the largest button. # ----------------------------------------------------------------- itcl::body iwidgets::Buttonbox::_getMaxWidth {} { set max 0 foreach tag $_displayList { set w [winfo reqwidth $itk_component($tag)] if {$w > $max} { set max $w } } return $max } # ----------------------------------------------------------------- # PRIVATE METHOD: _getMaxHeight # # Returns the required height of the largest button. # ----------------------------------------------------------------- itcl::body iwidgets::Buttonbox::_getMaxHeight {} { set max 0 foreach tag $_displayList { set h [winfo reqheight $itk_component($tag)] if {$h > $max} { set max $h } } return $max } # ------------------------------------------------------------------ # METHOD: _setBoxSize ?when? # # Sets the proper size of the frame surrounding all the buttons. # If "when" is "now", the change is applied immediately. If it is # "later" or it is not specified, then the change is applied later, # when the application is idle. # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::_setBoxSize {{when later}} { if {[winfo ismapped $itk_component(hull)]} { if {$when == "later"} { if {$_resizeFlag == ""} { set _resizeFlag [after idle [itcl::code $this _setBoxSize now]] } return } elseif {$when != "now"} { error "bad option \"$when\": should be now or later" } set _resizeFlag "" set numBtns [llength $_displayList] if {$itk_option(-orient) == "horizontal"} { set minw [expr {$numBtns * [_getMaxWidth] \ + ($numBtns+1) * $itk_option(-padx)}] set minh [expr {[_getMaxHeight] + 2 * $itk_option(-pady)}] } else { set minw [expr {[_getMaxWidth] + 2 * $itk_option(-padx)}] set minh [expr {$numBtns * [_getMaxHeight] \ + ($numBtns+1) * $itk_option(-pady)}] } # # Remove the configure event bindings on the hull while we adjust the # width/height and re-position the buttons. Once we're through, we'll # update and reinstall them. This prevents double calls to position # the buttons. # set tags [bindtags $itk_component(hull)] if {[set i [lsearch $tags bbox-config]] != -1} { set tags [lreplace $tags $i $i] bindtags $itk_component(hull) $tags } component hull configure -width $minw -height $minh update idletasks _positionButtons bindtags $itk_component(hull) [linsert $tags 0 bbox-config] } } # ------------------------------------------------------------------ # METHOD: _positionButtons # # This method is responsible setting the width/height of all the # displayed buttons to the same value and for placing all the buttons # in equidistant locations. # ------------------------------------------------------------------ itcl::body iwidgets::Buttonbox::_positionButtons {} { set bf $itk_component(hull) set numBtns [llength $_displayList] # # First, determine the common width and height for all the # displayed buttons. # if {$numBtns > 0} { set bfWidth [winfo width $itk_component(hull)] set bfHeight [winfo height $itk_component(hull)] if {$bfWidth >= [winfo reqwidth $itk_component(hull)]} { set _btnWidth [_getMaxWidth] } else { if {$itk_option(-orient) == "horizontal"} { set _btnWidth [expr {$bfWidth / $numBtns}] } else { set _btnWidth $bfWidth } } if {$bfHeight >= [winfo reqheight $itk_component(hull)]} { set _btnHeight [_getMaxHeight] } else { if {$itk_option(-orient) == "vertical"} { set _btnHeight [expr {$bfHeight / $numBtns}] } else { set _btnHeight $bfHeight } } } # # Place the buttons at the proper locations. # if {$numBtns > 0} { if {$itk_option(-orient) == "horizontal"} { set leftover [expr {[winfo width $bf] \ - 2 * $itk_option(-padx) - $_btnWidth * $numBtns}] if {$numBtns > 0} { set offset [expr {$leftover / ($numBtns + 1)}] } else { set offset 0 } if {$offset < 0} {set offset 0} set xDist [expr {$itk_option(-padx) + $offset}] set incrAmount [expr {$_btnWidth + $offset}] foreach button $_displayList { place $itk_component($button) -anchor w \ -x $xDist -rely .5 -y 0 -relx 0 \ -width $_btnWidth -height $_btnHeight set xDist [expr {$xDist + $incrAmount}] } } else { set leftover [expr {[winfo height $bf] \ - 2 * $itk_option(-pady) - $_btnHeight * $numBtns}] if {$numBtns > 0} { set offset [expr {$leftover / ($numBtns + 1)}] } else { set offset 0 } if {$offset < 0} {set offset 0} set yDist [expr {$itk_option(-pady) + $offset}] set incrAmount [expr {$_btnHeight + $offset}] foreach button $_displayList { place $itk_component($button) -anchor n \ -y $yDist -relx .5 -x 0 -rely 0 \ -width $_btnWidth -height $_btnHeight set yDist [expr {$yDist + $incrAmount}] } } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/calendar.itk�����������������������������������������������������������������0000644�0036047�0045461�00000100301�10625412176�015623� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Calendar # ---------------------------------------------------------------------- # Implements a calendar widget for the selection of a date. It displays # a single month at a time. Buttons exist on the top to change the # month in effect turning th pages of a calendar. As a page is turned, # the dates for the month are modified. Selection of a date visually # marks that date. The selected value can be monitored via the # -command option or just retrieved using the get method. Methods also # exist to select a date and show a particular month. The option set # allows the calendars appearance to take on many forms. # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts E-mail: mulferts@austin.dsccc.com # # ACKNOWLEDGEMENTS: Michael McLennan E-mail: mmclennan@lucent.com # # This code is an [incr Tk] port of the calendar code shown in Michael # J. McLennan's book "Effective Tcl" from Addison Wesley. Small # modificiations were made to the logic here and there to make it a # mega-widget and the command and option interface was expanded to make # it even more configurable, but the underlying logic is the same. # # @(#) $Id: calendar.itk,v 1.9 2007/05/24 22:41:02 hobbs Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Calendar { keep -background -cursor } # ------------------------------------------------------------------ # CALENDAR # ------------------------------------------------------------------ itcl::class iwidgets::Calendar { inherit itk::Widget constructor {args} {} itk_option define -days days Days {Su Mo Tu We Th Fr Sa} itk_option define -command command Command {} itk_option define -forwardimage forwardImage Image {} itk_option define -backwardimage backwardImage Image {} itk_option define -weekdaybackground weekdayBackground Background \#d9d9d9 itk_option define -weekendbackground weekendBackground Background \#d9d9d9 itk_option define -outline outline Outline \#d9d9d9 itk_option define -buttonforeground buttonForeground Foreground blue itk_option define -foreground foreground Foreground black itk_option define -selectcolor selectColor Foreground red itk_option define -selectthickness selectThickness SelectThickness 3 itk_option define -titlefont titleFont Font \ -*-helvetica-bold-r-normal--*-140-* itk_option define -dayfont dayFont Font \ -*-helvetica-medium-r-normal--*-120-* itk_option define -datefont dateFont Font \ -*-helvetica-medium-r-normal--*-120-* itk_option define -currentdatefont currentDateFont Font \ -*-helvetica-bold-r-normal--*-120-* itk_option define -startday startDay Day sunday itk_option define -int int DateFormat no public method get {{format "-string"}} ;# Returns the selected date public method select {{date_ "now"}} ;# Selects date, moving select ring public method show {{date_ "now"}} ;# Displays a specific date protected method _drawtext {canvas_ day_ date_ now_ x0_ y0_ x1_ y1_} private method _change {delta_} private method _configureHandler {} private method _redraw {} private method _days {{wmax {}}} private method _layout {time_} private method _select {date_} private method _selectEvent {date_} private method _adjustday {day_} private method _percentSubst {pattern_ string_ subst_} private variable _time {} private variable _selected {} private variable _initialized 0 private variable _offset 0 private variable _format {} } # # Provide a lowercased access method for the Calendar class. # proc ::iwidgets::calendar {pathName args} { uplevel ::iwidgets::Calendar $pathName $args } # # Use option database to override default resources of base classes. # option add *Calendar.width 200 widgetDefault option add *Calendar.height 165 widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::constructor {args} { # # Create the canvas which displays each page of the calendar. # itk_component add page { canvas $itk_interior.page } { keep -background -cursor -width -height } pack $itk_component(page) -expand yes -fill both # # Create the forward and backward buttons. Rather than pack # them directly in the hull, we'll waittill later and make # them canvas window items. # itk_component add backward { button $itk_component(page).backward \ -command [itcl::code $this _change -1] } { keep -background -cursor } itk_component add forward { button $itk_component(page).forward \ -command [itcl::code $this _change +1] } { keep -background -cursor } # # Set the initial time to now. # set _time [clock seconds] # # Bind to the configure event which will be used to redraw # the calendar and display the month. # bind $itk_component(page) <Configure> [itcl::code $this _configureHandler] # # Evaluate the option arguments. # eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -int # # Added by Mark Alston 2001/10/21 # # Allows for the use of dates in "international" format: YYYY-MM-DD. # It must be a boolean value. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::int { switch $itk_option(-int) { 1 - yes - true - on { set itk_option(-int) yes } 0 - no - false - off { set itk_option(-int) no } default { error "bad int option \"$itk_option(-int)\": should be boolean" } } } # ------------------------------------------------------------------ # OPTION: -command # # Sets the selection command for the calendar. When the user # selects a date on the calendar, the date is substituted in # place of "%d" in this command, and the command is executed. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::command {} # ------------------------------------------------------------------ # OPTION: -days # # The days option takes a list of values to set the text used to display the # days of the week header above the dates. The default value is # {Su Mo Tu We Th Fr Sa}. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::days { if {$_initialized} { if {[$itk_component(page) find withtag days] != {}} { $itk_component(page) delete days _days } } } # ------------------------------------------------------------------ # OPTION: -backwardimage # # Specifies a image to be displayed on the backwards calendar # button. If none is specified, a default is provided. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::backwardimage { # # If no image is given, then we'll use the default image. # if {$itk_option(-backwardimage) == {}} { # # If the default image hasn't yet been created, then we # need to create it. # if {[lsearch [image names] $this-backward] == -1} { image create bitmap $this-backward \ -foreground $itk_option(-buttonforeground) -data { #define back_width 16 #define back_height 16 static unsigned char back_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0xe0, 0x38, 0xf0, 0x3c, 0xf8, 0x3e, 0xfc, 0x3f, 0xfc, 0x3f, 0xf8, 0x3e, 0xf0, 0x3c, 0xe0, 0x38, 0xc0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; } } # # Configure the button to use the default image. # $itk_component(backward) configure -image $this-backward # # Else, an image has been specified. First, we'll need to make sure # the image really exists before configuring the button to use it. # If it doesn't generate an error. # } else { if {[lsearch [image names] $itk_option(-backwardimage)] != -1} { $itk_component(backward) configure \ -image $itk_option(-backwardimage) } else { error "bad image name \"$itk_option(-backwardimage)\":\ image does not exist" } # # If we previously created a default image, we'll just remove it. # if {[lsearch [image names] $this-backward] != -1} { image delete $this-backward } } } # ------------------------------------------------------------------ # OPTION: -forwardimage # # Specifies a image to be displayed on the forwards calendar # button. If none is specified, a default is provided. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::forwardimage { # # If no image is given, then we'll use the default image. # if {$itk_option(-forwardimage) == {}} { # # If the default image hasn't yet been created, then we # need to create it. # if {[lsearch [image names] $this-forward] == -1} { image create bitmap $this-forward \ -foreground $itk_option(-buttonforeground) -data { #define fwd_width 16 #define fwd_height 16 static unsigned char fwd_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x1c, 0x07, 0x3c, 0x0f, 0x7c, 0x1f, 0xfc, 0x3f, 0xfc, 0x3f, 0x7c, 0x1f, 0x3c, 0x0f, 0x1c, 0x07, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; } } # # Configure the button to use the default image. # $itk_component(forward) configure -image $this-forward # # Else, an image has been specified. First, we'll need to make sure # the image really exists before configuring the button to use it. # If it doesn't generate an error. # } else { if {[lsearch [image names] $itk_option(-forwardimage)] != -1} { $itk_component(forward) configure \ -image $itk_option(-forwardimage) } else { error "bad image name \"$itk_option(-forwardimage)\":\ image does not exist" } # # If we previously created a default image, we'll just remove it. # if {[lsearch [image names] $this-forward] != -1} { image delete $this-forward } } } # ------------------------------------------------------------------ # OPTION: -weekdaybackground # # Specifies the background for the weekdays which allows it to # be visually distinguished from the weekend. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::weekdaybackground { if {$_initialized} { $itk_component(page) itemconfigure weekday \ -fill $itk_option(-weekdaybackground) } } # ------------------------------------------------------------------ # OPTION: -weekendbackground # # Specifies the background for the weekdays which allows it to # be visually distinguished from the weekdays. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::weekendbackground { if {$_initialized} { $itk_component(page) itemconfigure weekend \ -fill $itk_option(-weekendbackground) } } # ------------------------------------------------------------------ # OPTION: -foreground # # Specifies the foreground color for the textual items, buttons, # and divider on the calendar. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::foreground { if {$_initialized} { $itk_component(page) itemconfigure text \ -fill $itk_option(-foreground) $itk_component(page) itemconfigure line \ -fill $itk_option(-foreground) } } # ------------------------------------------------------------------ # OPTION: -outline # # Specifies the outline color used to surround the date text. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::outline { if {$_initialized} { $itk_component(page) itemconfigure square \ -outline $itk_option(-outline) } } # ------------------------------------------------------------------ # OPTION: -buttonforeground # # Specifies the foreground color of the forward and backward buttons. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::buttonforeground { if {$_initialized} { if {$itk_option(-forwardimage) == {}} { if {[lsearch [image names] $this-forward] != -1} { $this-forward configure \ -foreground $itk_option(-buttonforeground) } } else { $itk_component(forward) configure \ -foreground $itk_option(-buttonforeground) } if {$itk_option(-backwardimage) == {}} { if {[lsearch [image names] $this-backward] != -1} { $this-backward configure \ -foreground $itk_option(-buttonforeground) } } else { $itk_component(-backward) configure \ -foreground $itk_option(-buttonforeground) } } } # ------------------------------------------------------------------ # OPTION: -selectcolor # # Specifies the color of the ring displayed that distinguishes the # currently selected date. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::selectcolor { if {$_initialized} { $itk_component(page) itemconfigure $_selected-sensor \ -outline $itk_option(-selectcolor) } } # ------------------------------------------------------------------ # OPTION: -selectthickness # # Specifies the thickness of the ring displayed that distinguishes # the currently selected date. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::selectthickness { if {$_initialized} { $itk_component(page) itemconfigure $_selected-sensor \ -width $itk_option(-selectthickness) } } # ------------------------------------------------------------------ # OPTION: -titlefont # # Specifies the font used for the title text that consists of the # month and year. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::titlefont { if {$_initialized} { $itk_component(page) itemconfigure title \ -font $itk_option(-titlefont) } } # ------------------------------------------------------------------ # OPTION: -datefont # # Specifies the font used for the date text that consists of the # day of the month. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::datefont { if {$_initialized} { $itk_component(page) itemconfigure date \ -font $itk_option(-datefont) } } # ------------------------------------------------------------------ # OPTION: -currentdatefont # # Specifies the font used for the current date text. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::currentdatefont { if {$_initialized} { $itk_component(page) itemconfigure now \ -font $itk_option(-currentdatefont) } } # ------------------------------------------------------------------ # OPTION: -dayfont # # Specifies the font used for the day of the week text. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::dayfont { if {$_initialized} { $itk_component(page) itemconfigure days \ -font $itk_option(-dayfont) } } # ------------------------------------------------------------------ # OPTION: -startday # # Specifies the starting day for the week. The value must be a day of the # week: sunday, monday, tuesday, wednesday, thursday, friday, or # saturday. The default is sunday. # ------------------------------------------------------------------ itcl::configbody iwidgets::Calendar::startday { set day [string tolower $itk_option(-startday)] switch $day { sunday {set _offset 0} monday {set _offset 1} tuesday {set _offset 2} wednesday {set _offset 3} thursday {set _offset 4} friday {set _offset 5} saturday {set _offset 6} default { error "bad startday option \"$itk_option(-startday)\":\ should be sunday, monday, tuesday, wednesday,\ thursday, friday, or saturday" } } if {$_initialized} { $itk_component(page) delete all-page _redraw } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # PUBLIC METHOD: get ?format? # # Returns the currently selected date in one of two formats, string # or as an integer clock value using the -string and -clicks # options respectively. The default is by string. Reference the # clock command for more information on obtaining dates and their # formats. # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::get {{format "-string"}} { switch -- $format { "-string" { return $_selected } "-clicks" { return [clock scan $_selected] } default { error "bad format option \"$format\":\ should be -string or -clicks" } } } # ------------------------------------------------------------------ # PUBLIC METHOD: select date_ # # Changes the currently selected date to the value specified. # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::select {{date_ "now"}} { if {$date_ == "now"} { set time [clock seconds] } else { if {[catch {clock format $date_}] == 0} { set time $date_ } elseif {[catch {set time [clock scan $date_]}] != 0} { error "bad date: \"$date_\", must be a valid date string, clock clicks value or the keyword now" } } switch $itk_option(-int) { yes { set _format "%Y-%m-%d" } no { set _format "%m/%d/%Y" } } _select [clock format $time -format "$_format"] } # ------------------------------------------------------------------ # PUBLIC METHOD: show date_ # # Changes the currently display month to be that of the specified # date. # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::show {{date_ "now"}} { if {$date_ == "now"} { set _time [clock seconds] } else { if {[catch {clock format $date_}] == 0} { set _time $date_ } elseif {[catch {set _time [clock scan $date_]}] != 0} { error "bad date: \"$date_\", must be a valid date string, clock clicks value or the keyword now" } } $itk_component(page) delete all-page _redraw } # ------------------------------------------------------------------ # PROTECTED METHOD: _drawtext canvas_ day_ date_ now_ # x0_ y0_ x1_ y1_ # # Draws the text in the date square. The method is protected such that # it can be overridden in derived classes that may wish to add their # own unique text. The method receives the day to draw along with # the coordinates of the square. # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::_drawtext {canvas_ day_ date_ now_ x0_ y0_ x1_ y1_} { set item [$canvas_ create text \ [expr {(($x1_ - $x0_) / 2) + $x0_}] \ [expr {(($y1_ -$y0_) / 2) + $y0_ + 1}] \ -anchor center -text "$day_" \ -fill $itk_option(-foreground)] if {$date_ == $now_} { $canvas_ itemconfigure $item \ -font $itk_option(-currentdatefont) \ -tags [list all-page date $date_-date text now] } else { $canvas_ itemconfigure $item \ -font $itk_option(-datefont) \ -tags [list all-page date $date_-date text] } } # ------------------------------------------------------------------ # PRIVATE METHOD: _configureHandler # # Processes a configure event received on the canvas. The method # deletes all the current canvas items and forces a redraw. # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::_configureHandler {} { set _initialized 1 $itk_component(page) delete all _redraw } # ------------------------------------------------------------------ # PRIVATE METHOD: _change delta_ # # Changes the current month displayed in the calendar, moving # forward or backward by <delta_> months where <delta_> is +/- # some number. # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::_change {delta_} { set dir [expr {($delta_ > 0) ? 1 : -1}] set month [clock format $_time -format "%m"] set month [string trimleft $month 0] set year [clock format $_time -format "%Y"] for {set i 0} {$i < abs($delta_)} {incr i} { incr month $dir if {$month < 1} { set month 12 incr year -1 } elseif {$month > 12} { set month 1 incr year 1 } } if {[catch {set _time [clock scan "$month/1/$year"]}]} { bell } else { _redraw } } # ------------------------------------------------------------------ # PRIVATE METHOD: _redraw # # Redraws the calendar. This method is invoked whenever the # calendar changes size or we need to effect a change such as draw # it with a new month. # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::_redraw {} { # # Set the format based on the option -int # switch $itk_option(-int) { yes { set _format "%Y-%m-%d" } no { set _format "%m/%d/%Y" } } # # Remove all the items that typically change per redraw request # such as the title and dates. Also, get the maximum width and # height of the page. # $itk_component(page) delete all-page set wmax [winfo width $itk_component(page)] set hmax [winfo height $itk_component(page)] # # If we haven't yet created the forward and backwards buttons, # then dot it; otherwise, skip it. # if {[$itk_component(page) find withtag button] == {}} { $itk_component(page) create window 3 3 -anchor nw \ -window $itk_component(backward) -tags button $itk_component(page) create window [expr {$wmax-3}] 3 -anchor ne \ -window $itk_component(forward) -tags button } # # Create the title centered between the buttons. # foreach {x0 y0 x1 y1} [$itk_component(page) bbox button] { set x [expr {(($x1-$x0)/2)+$x0}] set y [expr {(($y1-$y0)/2)+$y0}] } set title [clock format $_time -format "%B %Y"] $itk_component(page) create text $x $y -anchor center \ -text $title -font $itk_option(-titlefont) \ -fill $itk_option(-foreground) \ -tags [list title text all-page] # # Add the days of the week labels if they haven't yet been created. # if {[$itk_component(page) find withtag days] == {}} { _days $wmax } # # Add a line between the calendar header and the dates if needed. # set bottom [expr {[lindex [$itk_component(page) bbox all] 3] + 3}] if {[$itk_component(page) find withtag line] == {}} { $itk_component(page) create line 0 $bottom $wmax $bottom \ -width 2 -tags line } incr bottom 3 # # Get the layout for the time value and create the date squares. # This includes the surrounding date rectangle, the date text, # and the sensor. Bind selection to the sensor. # set current "" set now [clock format [clock seconds] -format "$_format"] set layout [_layout $_time] set weeks [expr {[lindex $layout end] + 1}] foreach {day date kind dcol wrow} $layout { set x0 [expr {$dcol*($wmax-7)/7+3}] set y0 [expr {$wrow*($hmax-$bottom-4)/$weeks+$bottom}] set x1 [expr {($dcol+1)*($wmax-7)/7+3}] set y1 [expr {($wrow+1)*($hmax-$bottom-4)/$weeks+$bottom}] if {$date == $_selected} { set current $date } # # Create the rectangle that surrounds the date and configure # its background based on the wheather it is a weekday or # a weekend. # set item [$itk_component(page) create rectangle $x0 $y0 $x1 $y1 \ -outline $itk_option(-outline)] if {$kind == "weekend"} { $itk_component(page) itemconfigure $item \ -fill $itk_option(-weekendbackground) \ -tags [list all-page square weekend] } else { $itk_component(page) itemconfigure $item \ -fill $itk_option(-weekdaybackground) \ -tags [list all-page square weekday] } # # Create the date text and configure its font based on the # wheather or not it is the current date. # _drawtext $itk_component(page) $day $date $now $x0 $y0 $x1 $y1 # # Create a sensor area to detect selections. Bind the # sensor and pass the date to the bind script. # $itk_component(page) create rectangle $x0 $y0 $x1 $y1 \ -outline "" -fill "" \ -tags [list $date-sensor all-sensor all-page] $itk_component(page) bind $date-sensor <ButtonPress-1> \ [itcl::code $this _selectEvent $date] $itk_component(page) bind $date-date <ButtonPress-1> \ [itcl::code $this _selectEvent $date] } # # Highlight the selected date if it is on this page. # if {$current != ""} { $itk_component(page) itemconfigure $current-sensor \ -outline $itk_option(-selectcolor) \ -width $itk_option(-selectthickness) $itk_component(page) raise $current-sensor } elseif {$_selected == ""} { set date [clock format $_time -format "$_format"] _select $date } } # ------------------------------------------------------------------ # PRIVATE METHOD: _days # # Used to rewite the days of the week label just below the month # title string. The days are given in the -days option. # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::_days {{wmax {}}} { if {$wmax == {}} { set wmax [winfo width $itk_component(page)] } set col 0 set bottom [expr {[lindex [$itk_component(page) bbox title buttons] 3] + 7}] foreach dayoweek $itk_option(-days) { set x0 [expr {$col*($wmax/7)}] set x1 [expr {($col+1)*($wmax/7)}] $itk_component(page) create text \ [expr {(($x1 - $x0) / 2) + $x0}] $bottom \ -anchor n -text "$dayoweek" \ -fill $itk_option(-foreground) \ -font $itk_option(-dayfont) \ -tags [list days text] incr col } } # ------------------------------------------------------------------ # PRIVATE METHOD: _layout time_ # # Used whenever the calendar is redrawn. Finds the month containing # a <time_> in seconds, and returns a list for all of the days in # that month. The list looks like this: # # {day1 date1 kind1 c1 r1 day2 date2 kind2 c2 r2 ...} # # where dayN is a day number like 1,2,3,..., dateN is the date for # dayN, kindN is the day type of weekday or weekend, and cN,rN # are the column/row indices for the square containing that date. # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::_layout {time_} { switch $itk_option(-int) { yes { set _format "%Y-%m-%d" } no { set _format "%m/%d/%Y" } } set month [clock format $time_ -format "%m"] set year [clock format $time_ -format "%Y"] if {[info tclversion] >= 8.5} { set startOfMonth [clock scan "$year-$month-01" -format %Y-%m-%d] set lastday [clock format [clock add $startOfMonth 1 month -1 day] -format %d] } else { foreach lastday {31 30 29 28} { if {[catch {clock scan "$month/$lastday/$year"}] == 0} { break } } } set seconds [clock scan "$month/1/$year"] set firstday [_adjustday [clock format $seconds -format %w]] set weeks [expr {ceil(double($lastday+$firstday)/7)}] set rlist "" for {set day 1} {$day <= $lastday} {incr day} { set seconds [clock scan "$month/$day/$year"] set date [clock format $seconds -format "$_format"] set dayoweek [clock format $seconds -format %w] if {$dayoweek == 0 || $dayoweek == 6} { set kind "weekend" } else { set kind "weekday" } set daycol [_adjustday $dayoweek] set weekrow [expr {($firstday+$day-1)/7}] lappend rlist $day $date $kind $daycol $weekrow } return $rlist } # ------------------------------------------------------------------ # PRIVATE METHOD: _adjustday day_ # # Modifies the day to be in accordance with the startday option. # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::_adjustday {day_} { set retday [expr {$day_ - $_offset}] if {$retday < 0} { set retday [expr {$retday + 7}] } return $retday } # ------------------------------------------------------------------ # PRIVATE METHOD: _select date_ # # Selects the current <date_> on the calendar. Highlights the date # on the calendar, and executes the command associated with the # calendar, with the selected date substituted in place of "%d". # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::_select {date_} { switch $itk_option(-int) { yes { set _format "%Y-%m-%d" } no { set _format "%m/%d/%Y" } } set time [clock scan $date_] set date [clock format $time -format "$_format"] set _selected $date set current [clock format $_time -format "%m %Y"] set selected [clock format $time -format "%m %Y"] if {$current == $selected} { $itk_component(page) itemconfigure all-sensor \ -outline "" -width 1 $itk_component(page) itemconfigure $date-sensor \ -outline $itk_option(-selectcolor) \ -width $itk_option(-selectthickness) $itk_component(page) raise $date-sensor } else { set _time $time _redraw } } # ------------------------------------------------------------------ # PRIVATE METHOD: _selectEvent date_ # # Selects the current <date_> on the calendar. Highlights the date # on the calendar, and executes the command associated with the # calendar, with the selected date substituted in place of "%d". # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::_selectEvent {date_} { _select $date_ if {[string trim $itk_option(-command)] != ""} { set cmd $itk_option(-command) set cmd [_percentSubst %d $cmd [get]] uplevel #0 $cmd } } # ------------------------------------------------------------------ # PRIVATE METHOD: _percentSubst pattern_ string_ subst_ # # This command is a "safe" version of regsub, for substituting # each occurance of <%pattern_> in <string_> with <subst_>. The # usual Tcl "regsub" command does the same thing, but also # converts characters like "&" and "\0", "\1", etc. that may # be present in the <subst_> string. # # Returns <string_> with <subst_> substituted in place of each # <%pattern_>. # ------------------------------------------------------------------ itcl::body iwidgets::Calendar::_percentSubst {pattern_ string_ subst_} { if {![string match %* $pattern_]} { error "bad pattern \"$pattern_\": should be %something" } set rval "" while {[regexp "(.*)${pattern_}(.*)" $string_ all head tail]} { set rval "$subst_$tail$rval" set string_ $head } set rval "$string_$rval" } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/canvasprintbox.itk�����������������������������������������������������������0000644�0036047�0045461�00000076752�07535747337�017161� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # CanvasPrintBox v1.5 # ---------------------------------------------------------------------- # Implements a print box for printing the contents of a canvas widget # to a printer or a file. It is possible to specify page orientation, the # number of pages to print the image on and if the output should be # stretched to fit the page. # # CanvasPrintBox is a "super-widget" that can be used as an # element in ones own GUIs. It is used to print the contents # of a canvas (called the source hereafter) to a printer or a # file. Possible settings include: portrait and landscape orientation # of the output, stretching the output to fit the page while maintaining # a proper aspect-ratio and posterizing to enlarge the output to fit on # multiple pages. A stamp-sized copy of the source will be shown (called # the stamp hereafter) at all times to reflect the effect of changing # the settings will have on the output. # # ---------------------------------------------------------------------- # AUTHOR: Tako Schotanus EMAIL: Tako.Schotanus@bouw.tno.nl # ---------------------------------------------------------------------- # Copyright (c) 1995 Tako Schotanus # ====================================================================== # Permission is hereby granted, without written agreement and without # license or royalty fees, to use, copy, modify, and distribute this # software and its documentation for any purpose, provided that the # above copyright notice and the following two paragraphs appear in # all copies of this software. # # IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES # ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN # IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH # DAMAGE. # # THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND # FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS # ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO # PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. # ====================================================================== # # Default resources. # option add *Canvasprintbox.filename "canvas.ps" widgetDefault option add *Canvasprintbox.hPageCnt 1 widgetDefault option add *Canvasprintbox.orient landscape widgetDefault option add *Canvasprintbox.output printer widgetDefault option add *Canvasprintbox.pageSize A4 widgetDefault option add *Canvasprintbox.posterize 0 widgetDefault option add *Canvasprintbox.printCmd lpr widgetDefault option add *Canvasprintbox.printRegion "" widgetDefault option add *Canvasprintbox.vPageCnt 1 widgetDefault # # Usual options. # itk::usual Canvasprintbox { keep -background -cursor -textbackground -foreground } #< # # CanvasPrintBox is a "super-widget" that can be used as an # element in ones own GUIs. It is used to print the contents # of a canvas (called the source hereafter) to a printer or a # file. Possible settings include: portrait and landscape orientation # of the output, stretching the output to fit the page while maintaining # a proper aspect-ratio and posterizing to enlarge the output to fit on # multiple pages. A stamp-sized copy of the source will be shown (called # the stamp hereafter) at all times to reflect the effect of changing # the settings will have on the output. # #> itcl::class iwidgets::Canvasprintbox { inherit itk::Widget # # Holds the current state for all check- and radiobuttons. # itk_option define -filename filename FileName "canvas.ps" itk_option define -hpagecnt hPageCnt PageCnt 1 itk_option define -orient orient Orient "landscape" itk_option define -output output Output "printer" itk_option define -pagesize pageSize PageSize "A4" itk_option define -posterize posterize Posterize 0 itk_option define -printcmd printCmd PrintCmd "" itk_option define -printregion printRegion PrintRegion "" itk_option define -stretch stretch Stretch 0 itk_option define -vpagecnt vPageCnt PageCnt 1 constructor {args} {} destructor {} # --------------------------------------------------------------- # PUBLIC #---------------------------------------------------------------- public { method getoutput {} method print {} method refresh {} method setcanvas {canv} method stop {} } # --------------------------------------------------------------- # PROTECTED #---------------------------------------------------------------- protected { # # Just holds the names of some widgets/objects. "win" is used to # determine if the object is fully constructed and initialized. # variable win "" variable canvw "" # # The canvas we want to print. # variable canvas "" # # Boolean indicating if the attribute "orient" is set # to landscape or not. # variable rotate 1 # # Holds the configure options that were used to create this object. # variable init_opts "" # # The following attributes hold a list of lines that are # currently drawn on the "stamp" to show how the page(s) is/are # oriented. The first holds the vertical dividing lines and the # second the horizontal ones. # variable hlines "" variable vlines "" # # Updating is set when the thumbnail is being drawn. Settings # this to 0 while drawing is still busy will terminate the # proces. # Restart_update can be set to 1 when the thumbnail is being # drawn to force a redraw. # variable _reposition "" variable _update_attr_id "" method _calc_poster_size {} method _calc_print_region {} method _calc_print_scale {} method _mapEventHandler {} method _update_attr {{when later}} method _update_canvas {{when later}} common _globVar proc ezPaperInfo {size {attr ""} \ {orient "portrait"} {window ""}} {} } } # # Provide a lowercased access method for the Canvasprintbox class. # proc ::iwidgets::canvasprintbox {args} { uplevel ::iwidgets::Canvasprintbox $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ #< # A list of four coordinates specifying which part of the canvas to print. # An empty list means that the canvas' entire scrollregion should be # printed. Any change to this attribute will automatically update the "stamp". # Defaults to an empty list. #> itcl::configbody iwidgets::Canvasprintbox::printregion { if {$itk_option(-printregion) != "" && [llength $itk_option(-printregion)] != 4} { error {bad option "printregion": should contain 4 coordinates} } _update_canvas } #< # Specifies where the postscript output should go: to the printer # or to a file. Can take on the values "printer" or "file". # The corresponding entry-widget will reflect the contents of # either the printcmd attribute or the filename attribute. #> itcl::configbody iwidgets::Canvasprintbox::output { switch $itk_option(-output) { file - printer { set _globVar($this,output) $itk_option(-output) } default { error {bad output option \"$itk_option(-output)\":\ should be file or printer} } } _update_attr } #< # The command to execute when printing the postscript output. # The command will get the postscript directed to its standard # input. (Only when output is set to "printer") #> itcl::configbody iwidgets::Canvasprintbox::printcmd { set _globVar($this,printeref) $itk_option(-printcmd) _update_attr } #< # The file to write the postscript output to (Only when output # is set to "file"). If posterizing is turned on and hpagecnt # and/or vpagecnt is more than 1, x.y is appended to the filename # where x is the horizontal page number and y the vertical page number. #> itcl::configbody iwidgets::Canvasprintbox::filename { set _globVar($this,fileef) $itk_option(-filename) _update_attr } #< # The pagesize the printer supports. Changes to this attribute # will be reflected immediately in the "stamp". #> itcl::configbody iwidgets::Canvasprintbox::pagesize { set opt [string tolower $itk_option(-pagesize)] set lst [string tolower [ezPaperInfo types]] if {[lsearch $lst $opt] == -1} { error "bad option \"pagesize\": should be one of: [ezPaperInfo types]" } $itk_component(paperom) select "*[string range $opt 1 end]" _update_canvas } #< # Determines the orientation of the output to the printer (or file). # It can take the value "portrait" or "landscape" (default). Changes # to this attribute will be reflected immediately in the "stamp". #> itcl::configbody iwidgets::Canvasprintbox::orient { switch $itk_option(-orient) { "portrait" - "landscape" { $itk_component(orientom) select $itk_option(-orient) _update_canvas } default { error "bad orient option \"$itk_option(-orient)\":\ should be portrait or landscape" } } } #< # Determines if the output should be stretched to fill the # page (as defined by the attribute pagesize) as large as # possible. The aspect-ratio of the output will be retained # and the output will never fall outside of the boundaries # of the page. #> itcl::configbody iwidgets::Canvasprintbox::stretch { if {$itk_option(-stretch) != 0 && $itk_option(-stretch) != 1} { error {bad option "stretch": should be a boolean} } set _globVar($this,stretchcb) $itk_option(-stretch) _update_attr } #< # Indicates if posterizing is turned on or not. Posterizing # the output means that it is possible to distribute the # output over more than one page. This way it is possible to # print a canvas/region which is larger than the specified # pagesize without stretching. If used in combination with # stretching it can be used to "blow up" the contents of a # canvas to as large as size as you want (See attributes: # hpagecnt end vpagecnt). Any change to this attribute will # automatically update the "stamp". #> itcl::configbody iwidgets::Canvasprintbox::posterize { if {$itk_option(-posterize) != "0" && $itk_option(-posterize) != "1"} { error "expected boolean but got \"$itk_option(-posterize)\"" } set _globVar($this,postercb) $itk_option(-posterize) _update_canvas } #< # Is used in combination with "posterize" to determine over # how many pages the output should be distributed. This # attribute specifies how many pages should be used horizontaly. # Any change to this attribute will automatically update the "stamp". #> itcl::configbody iwidgets::Canvasprintbox::hpagecnt { set _globVar($this,hpc) $itk_option(-hpagecnt) _update_canvas } #< # Is used in combination with "posterize" to determine over # how many pages the output should be distributed. This # attribute specifies how many pages should be used verticaly. # Any change to this attribute will automatically update the "stamp". #> itcl::configbody iwidgets::Canvasprintbox::vpagecnt { set _globVar($this,vpc) $itk_option(-vpagecnt) _update_canvas } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Canvasprintbox::constructor {args} { set _globVar($this,output) printer set _globVar($this,printeref) "" set _globVar($this,fileef) "canvas.ps" set _globVar($this,hpc) 1 set _globVar($this,vpc) 1 set _globVar($this,postercb) 0 set _globVar($this,stretchcb) 0 itk_component add canvasframe { frame $itk_interior.f18 -bd 2 } itk_component add canvas { canvas $itk_component(canvasframe).c1 \ -bd 2 -relief sunken \ -scrollregion {0c 0c 10c 10c} \ -width 250 } pack $itk_component(canvas) -expand 1 -fill both itk_component add outputom { iwidgets::Labeledframe $itk_interior.outputom \ -labelpos nw \ -labeltext "Output to" } set cs [$itk_component(outputom) childsite] itk_component add printerrb { radiobutton $cs.printerrb \ -text Printer \ -variable [itcl::scope _globVar($this,output)] \ -anchor w \ -justify left \ -value printer \ -command [itcl::code $this _update_attr] } { usual rename -font -labelfont labelFont Font } itk_component add printeref { iwidgets::entryfield $cs.printeref \ -labeltext "command:" \ -state normal \ -labelpos w \ -textvariable [itcl::scope _globVar($this,printeref)] } itk_component add filerb { radiobutton $cs.filerb \ -text File \ -justify left \ -anchor w \ -variable [itcl::scope _globVar($this,output)] \ -value file \ -command [itcl::code $this _update_attr] } { usual rename -font -labelfont labelFont Font } itk_component add fileef { iwidgets::entryfield $cs.fileef \ -labeltext "filename:" \ -state disabled \ -labelpos w \ -textvariable [itcl::scope _globVar($this,fileef)] } itk_component add propsframe { iwidgets::Labeledframe $itk_interior.propsframe \ -labelpos nw \ -labeltext "Properties" } set cs [$itk_component(propsframe) childsite] itk_component add paperom { iwidgets::optionmenu $cs.paperom \ -labelpos w -cyclicon 1 \ -labeltext "Paper size:" \ -command [itcl::code $this refresh] } { usual rename -font -labelfont labelFont Font } eval $itk_component(paperom) insert end [ezPaperInfo types] $itk_component(paperom) select A4 itk_component add orientom { iwidgets::radiobox $itk_interior.orientom \ -labeltext "Orientation" -command [itcl::code $this refresh] } $itk_component(orientom) add landscape -text Landscape $itk_component(orientom) add portrait -text Portrait $itk_component(orientom) select 0 itk_component add stretchcb { checkbutton $cs.stretchcb \ -relief flat \ -text {Stretch to fit} \ -justify left \ -anchor w \ -variable [itcl::scope _globVar($this,stretchcb)] \ -command [itcl::code $this refresh] } { usual rename -font -labelfont labelFont Font } itk_component add postercb { checkbutton $cs.postercb \ -relief flat \ -text Posterize \ -justify left \ -anchor w \ -variable [itcl::scope _globVar($this,postercb)] \ -command [itcl::code $this refresh] } { usual rename -font -labelfont labelFont Font } itk_component add hpcnt { iwidgets::entryfield $cs.hpcnt \ -labeltext on \ -textvariable [itcl::scope _globVar($this,hpc)] \ -validate integer -width 3 \ -command [itcl::code $this refresh] } itk_component add vpcnt { iwidgets::entryfield $cs.vpcnt \ -labeltext by \ -textvariable [itcl::scope _globVar($this,vpc)] \ -validate integer -width 3 \ -command [itcl::code $this refresh] } itk_component add pages { label $cs.pages -text pages. } { usual rename -font -labelfont labelFont Font } set init_opts $args grid $itk_component(canvasframe) -row 0 -column 0 -rowspan 4 -sticky nsew grid $itk_component(propsframe) -row 0 -column 1 -sticky nsew grid $itk_component(outputom) -row 1 -column 1 -sticky nsew grid $itk_component(orientom) -row 2 -column 1 -sticky nsew grid columnconfigure $itk_interior 0 -weight 1 grid rowconfigure $itk_interior 3 -weight 1 grid $itk_component(printerrb) -row 0 -column 0 -sticky nsw grid $itk_component(printeref) -row 0 -column 1 -sticky nsw grid $itk_component(filerb) -row 1 -column 0 -sticky nsw grid $itk_component(fileef) -row 1 -column 1 -sticky nsw iwidgets::Labeledwidget::alignlabels $itk_component(printeref) $itk_component(fileef) grid columnconfigure $itk_component(outputom) 1 -weight 1 grid $itk_component(paperom) -row 0 -column 0 -columnspan 2 -sticky nsw grid $itk_component(stretchcb) -row 1 -column 0 -sticky nsw grid $itk_component(postercb) -row 2 -column 0 -sticky nsw grid $itk_component(hpcnt) -row 2 -column 1 -sticky nsw grid $itk_component(vpcnt) -row 2 -column 2 -sticky nsw grid $itk_component(pages) -row 2 -column 3 -sticky nsw grid columnconfigure $itk_component(propsframe) 3 -weight 1 eval itk_initialize $args bind $itk_component(pages) <Map> +[itcl::code $this _mapEventHandler] bind $itk_component(canvas) <Configure> +[itcl::code $this refresh] } # --------------------------------------------------------------- # PUBLIC METHODS #---------------------------------------------------------------- #< # This is used to set the canvas that has to be printed. # A stamp-sized copy will automatically be drawn to show how the # output would look with the current settings. # # In: canv - The canvas to be printed # Out: canvas (attrib) - Holds the canvas to be printed #> itcl::body iwidgets::Canvasprintbox::setcanvas {canv} { set canvas $canv _update_canvas } #< # Returns the value of the -printercmd or -filename option # depending on the current setting of -output. # # In: itk_option (attrib) # Out: The value of -printercmd or -filename #> itcl::body iwidgets::Canvasprintbox::getoutput {} { switch $_globVar($this,output) { "file" { return $_globVar($this,fileef) } "printer" { return $_globVar($this,printeref) } } return "" } #< # Perfrom the actual printing of the canvas using the current settings of # all the attributes. # # In: itk_option, rotate (attrib) # Out: A boolean indicating wether printing was successful #> itcl::body iwidgets::Canvasprintbox::print {} { global env tcl_platform stop if {$itk_option(-output) == "file"} { set nm $_globVar($this,fileef) if {[string range $nm 0 1] == "~/"} { set nm "$env(HOME)/[string range $nm 2 end]" } } else { set nm "/tmp/xge[winfo id $canvas]" } set pr [_calc_print_region] set x1 [lindex $pr 0] set y1 [lindex $pr 1] set x2 [lindex $pr 2] set y2 [lindex $pr 3] set cx [expr {int(($x2 + $x1) / 2)}] set cy [expr {int(($y2 + $y1) / 2)}] if {!$itk_option(-stretch)} { set ps [_calc_poster_size] set pshw [expr {int([lindex $ps 0] / 2)}] set pshh [expr {int([lindex $ps 1] / 2)}] set x [expr {$cx - $pshw}] set y [expr {$cy - $pshh}] set w [ezPaperInfo $itk_option(-pagesize) pwidth $itk_option(-orient) $win] set h [ezPaperInfo $itk_option(-pagesize) pheight $itk_option(-orient) $win] } else { set x $x1 set y $y1 set w [expr {($x2-$x1) / $_globVar($this,hpc)}] set h [expr {($y2-$y1) / $_globVar($this,vpc)}] } set i 0 set px $x while {$i < $_globVar($this,hpc)} { set j 0 set py $y while {$j < $_globVar($this,vpc)} { set nm2 [expr {$_globVar($this,hpc) > 1 || $_globVar($this,vpc) > 1 ? "$nm$i.$j" : $nm}] if {$itk_option(-stretch)} { $canvas postscript \ -file $nm2 \ -rotate $rotate \ -x $px -y $py \ -width $w \ -height $h \ -pagex [ezPaperInfo $itk_option(-pagesize) centerx] \ -pagey [ezPaperInfo $itk_option(-pagesize) centery] \ -pagewidth [ezPaperInfo $itk_option(-pagesize) pwidth $itk_option(-orient)] \ -pageheight [ezPaperInfo $itk_option(-pagesize) pheight $itk_option(-orient)] } else { $canvas postscript \ -file $nm2 \ -rotate $rotate \ -x $px -y $py \ -width $w \ -height $h \ -pagex [ezPaperInfo $itk_option(-pagesize) centerx] \ -pagey [ezPaperInfo $itk_option(-pagesize) centery] } if {$itk_option(-output) == "printer"} { set cmd "$itk_option(-printcmd) < $nm2" if {[catch {eval exec $cmd &}]} { return 0 } } set py [expr {$py + $h}] incr j } set px [expr {$px + $w}] incr i } return 1 } #< # Retrieves the current value for all edit fields and updates # the stamp accordingly. Is useful for Apply-buttons. #> itcl::body iwidgets::Canvasprintbox::refresh {} { stop _update_canvas return } #< # Stops the drawing of the "stamp". I'm currently unable to detect # when a Canvasprintbox gets withdrawn. It's therefore advised # that you perform a stop before you do something like that. #> itcl::body iwidgets::Canvasprintbox::stop {} { if {$_reposition != ""} { after cancel $_reposition set _reposition "" } if {$_update_attr_id != ""} { after cancel $_update_attr_id set _update_attr_id "" } return } # --------------------------------------------------------------- # PROTECTED METHODS #---------------------------------------------------------------- # # Calculate the total size the output would be with the current # settings for "pagesize" and "posterize" (and "hpagecnt" and # "vpagecnt"). This size will be the size of the printable area, # some space has been substracted to take into account that a # page should have borders because most printers can't print on # the very edge of the paper. # # In: posterize, hpagecnt, vpagecnt, pagesize, orient (attrib) # Out: A list of two numbers indicating the width and the height # of the total paper area which will be used for printing # in pixels. # itcl::body iwidgets::Canvasprintbox::_calc_poster_size {} { set tpw [expr {[ezPaperInfo $itk_option(-pagesize) \ pwidth $itk_option(-orient) $win]*$_globVar($this,hpc)}] set tph [expr {[ezPaperInfo $itk_option(-pagesize) \ pheight $itk_option(-orient) $win]*$_globVar($this,vpc)}] return "$tpw $tph" } # # Determine which area of the "source" canvas will be printed. # If "printregion" was set by the "user" this will be used and # converted to pixel-coordinates. If the user didn't set it # the bounding box that contains all canvas-items will be used # instead. # # In: printregion, canvas (attrib) # Out: Four floats specifying the region to be printed in # pixel-coordinates (topleft & bottomright). # itcl::body iwidgets::Canvasprintbox::_calc_print_region {} { set printreg [expr {$itk_option(-printregion) != "" ? $itk_option(-printregion) : [$canvas bbox all]}] if {$printreg != ""} { set prx1 [winfo fpixels $canvas [lindex $printreg 0]] set pry1 [winfo fpixels $canvas [lindex $printreg 1]] set prx2 [winfo fpixels $canvas [lindex $printreg 2]] set pry2 [winfo fpixels $canvas [lindex $printreg 3]] set res "$prx1 $pry1 $prx2 $pry2" } else { set res "0 0 0 0" } return $res } # # Calculate the scaling factor needed if the output was # to be stretched to fit exactly on the page (or pages). # If stretching is turned off this will always return 1.0. # # In: stretch (attrib) # Out: A float specifying the scaling factor. # itcl::body iwidgets::Canvasprintbox::_calc_print_scale {} { if {$itk_option(-stretch)} { set pr [_calc_print_region] set prw [expr {[lindex $pr 2] - [lindex $pr 0]}] set prh [expr {[lindex $pr 3] - [lindex $pr 1]}] set ps [_calc_poster_size] set psw [lindex $ps 0] set psh [lindex $ps 1] set sfx [expr {$psw / $prw}] set sfy [expr {$psh / $prh}] set sf [expr {$sfx < $sfy ? $sfx : $sfy}] return $sf } else { return 1.0 } } # # Schedule the thread that makes a copy of the "source" # canvas to the "stamp". # # In: win, canvas (attrib) # Out: - # itcl::body iwidgets::Canvasprintbox::_update_canvas {{when later}} { if {$win == "" || $canvas == "" || [$canvas find all] == ""} { return } if {$when == "later"} { if {$_reposition == ""} { set _reposition [after idle [itcl::code $this _update_canvas now]] } return } _update_attr now # # Make a copy of the "source" canvas to the "stamp". # if {$_globVar($this,hpc) == [llength $vlines] && $_globVar($this,vpc) == [llength $hlines]} { stop return } $canvw delete all set width [winfo width $canvw] set height [winfo height $canvw] set ps [_calc_poster_size] # # Calculate the scaling factor that would be needed to fit the # whole "source" into the "stamp". This takes into account the # total amount of "paper" that would be needed to print the # contents of the "source". # set xsf [expr {$width/[lindex $ps 0]}] set ysf [expr {$height/[lindex $ps 1]}] set sf [expr {$xsf < $ysf ? $xsf : $ysf}] set w [expr {[lindex $ps 0]*$sf}] set h [expr {[lindex $ps 1]*$sf}] set x1 [expr {($width-$w)/2}] set y1 [expr {($height-$h)/2}] set x2 [expr {$x1+$w}] set y2 [expr {$y1+$h}] set cx [expr {($x2+$x1)/ 2}] set cy [expr {($y2+$y1)/ 2}] set printreg [_calc_print_region] set prx1 [lindex $printreg 0] set pry1 [lindex $printreg 1] set prx2 [lindex $printreg 2] set pry2 [lindex $printreg 3] set prcx [expr {($prx2+$prx1)/2}] set prcy [expr {($pry2+$pry1)/2}] set psf [_calc_print_scale] # # Copy all items from the "real" canvas to the canvas # showing what we'll send to the printer. Bitmaps and # texts are not copied because they can't be scaled, # a rectangle will be created instead. # set tsf [expr {$sf * $psf}] set dx [expr {$cx-($prcx*$tsf)}] set dy [expr {$cy-($prcy*$tsf)}] $canvw create rectangle \ [expr {$x1+0}] \ [expr {$y1+0}] \ [expr {$x2-0}] \ [expr {$y2-0}] -fill white set items [eval "$canvas find overlapping $printreg"] set itemCount [llength $items] for {set cnt 0} {$cnt < $itemCount} {incr cnt} { # # Determine the item's type and coordinates # set i [lindex $items $cnt] set t [$canvas type $i] set crds [$canvas coords $i] # # Ask for the item's configuration settings and strip # it to leave only a list of option names and values. # set cfg [$canvas itemconfigure $i] set cfg2 "" foreach c $cfg { if {[llength $c] == 5} { lappend cfg2 [lindex $c 0] [lindex $c 4] } } # # Handle texts and bitmaps differently: they will # be represented as rectangles. # if {$t == "text" || $t == "bitmap" || $t == "window"} { set t "rectangle" set crds [$canvas bbox $i] set cfg2 "-outline {} -fill gray" } # # Remove the arrows from a line item when the scale # factor drops below 1/3rd of the original size. # This to prevent the arrowheads from dominating the # display. # if {$t == "line" && $tsf < 0.33} { lappend cfg2 -arrow none } # # Create a copy of the item on the "printing" canvas. # set i2 [eval "$canvw create $t $crds $cfg2"] $canvw scale $i2 0 0 $tsf $tsf $canvw move $i2 $dx $dy if {($cnt%25) == 0} { update } if {$_reposition == ""} { return } } set p $x1 set i 1 set vlines {} while {$i < $_globVar($this,hpc)} { set p [expr {$p + ($w/$_globVar($this,hpc))}] set l [$canvw create line $p $y1 $p $y2] lappend vlines $l incr i } set p $y1 set i 1 set vlines {} while {$i < $_globVar($this,vpc)} { set p [expr {$p + ($h/$_globVar($this,vpc))}] set l [$canvw create line $x1 $p $x2 $p] lappend vlines $l incr i } set _reposition "" } # # Update the attributes to reflect changes made in the user- # interface. # # In: itk_option (attrib) - the attributes to update # itk_component (attrib) - the widgets # _globVar (common) - the global var holding the state # of all radiobuttons and checkboxes. # Out: - # itcl::body iwidgets::Canvasprintbox::_update_attr {{when "later"}} { if {$when != "now"} { if {$_update_attr_id == ""} { set _update_attr_id [after idle [itcl::code $this _update_attr now]] } return } set itk_option(-printcmd) $_globVar($this,printeref) set itk_option(-filename) $_globVar($this,fileef) set itk_option(-output) $_globVar($this,output) set itk_option(-pagesize) [string tolower [$itk_component(paperom) get]] set itk_option(-stretch) $_globVar($this,stretchcb) set itk_option(-posterize) $_globVar($this,postercb) set itk_option(-vpagecnt) $_globVar($this,vpc) set itk_option(-hpagecnt) $_globVar($this,hpc) set itk_option(-orient) [$itk_component(orientom) get] set rotate [expr {$itk_option(-orient) == "landscape"}] if {$_globVar($this,output) == "file"} { $itk_component(fileef) configure \ -state normal -foreground $itk_option(-foreground) $itk_component(printeref) configure \ -state disabled -foreground $itk_option(-disabledforeground) } else { $itk_component(fileef) configure \ -state disabled -foreground $itk_option(-disabledforeground) $itk_component(printeref) configure \ -state normal -foreground $itk_option(-foreground) } set fg [expr {$_globVar($this,postercb) \ ? $itk_option(-foreground) : $itk_option(-disabledforeground)}] $itk_component(vpcnt) configure -foreground $fg $itk_component(hpcnt) configure -foreground $fg $itk_component(pages) configure -foreground $fg # # Update dependencies among widgets. (For example: disabling # an entry-widget when its associated checkbox-button is used # to turn of the option (the entry's value is not needed # anymore and this should be reflected in the fact that it # isn't possible to change it anymore). # # former method:_update_widgets/_update_UI # set state [expr {$itk_option(-posterize) ? "normal" : "disabled"}] $itk_component(vpcnt) configure -state $state $itk_component(hpcnt) configure -state $state $itk_component(paperom) select "*[string range $itk_option(-pagesize) 1 end]" set _update_attr_id "" } # # Gets called when the CanvasPrintBox-widget gets mapped. # itcl::body iwidgets::Canvasprintbox::_mapEventHandler {} { set win $itk_interior set canvw $itk_component(canvas) if {$canvas != ""} { setcanvas $canvas } _update_attr } # # Destroy this object and its associated widgets. # itcl::body iwidgets::Canvasprintbox::destructor {} { stop } # # Hold the information about common paper sizes. A bit of a hack, but it # should be possible to add your own if you take a look at it. # itcl::body iwidgets::Canvasprintbox::ezPaperInfo {size {attr ""} \ {orient "portrait"} {window ""}} { set size [string tolower $size] set attr [string tolower $attr] set orient [string tolower $orient] case $size in { types { return "A5 A4 A3 A2 A1 Legal Letter" } a5 { set paper(x1) "1.0c" set paper(y1) "1.0c" set paper(x2) "13.85c" set paper(y2) "20.0c" set paper(pheight) "19.0c" set paper(pwidth) "12.85c" set paper(height) "21.0c" set paper(width) "14.85c" set paper(centerx) "7.425c" set paper(centery) "10.5c" } a4 { set paper(x1) "1.0c" set paper(y1) "1.0c" set paper(x2) "20.0c" set paper(y2) "28.7c" set paper(pheight) "27.7c" set paper(pwidth) "19.0c" set paper(height) "29.7c" set paper(width) "21.0c" set paper(centerx) "10.5c" set paper(centery) "14.85c" } a3 { set paper(x1) "1.0c" set paper(y1) "1.0c" set paper(x2) "28.7c" set paper(y2) "41.0c" set paper(pheight) "40.0c" set paper(pwidth) "27.7c" set paper(height) "42.0c" set paper(width) "29.7c" set paper(centerx) "14.85c" set paper(centery) "21.0c" } a2 { set paper(x1) "1.0c" set paper(y1) "1.0c" set paper(x2) "41.0c" set paper(y2) "58.4c" set paper(pheight) "57.4c" set paper(pwidth) "40.0c" set paper(height) "59.4c" set paper(width) "42.0c" set paper(centerx) "21.0c" set paper(centery) "29.7c" } a1 { set paper(x1) "1.0c" set paper(y1) "1.0c" set paper(x2) "58.4c" set paper(y2) "83.0c" set paper(pheight) "82.0c" set paper(pwidth) "57.4c" set paper(height) "84.0c" set paper(width) "59.4c" set paper(centerx) "29.7c" set paper(centery) "42.0c" } legal { set paper(x1) "0.2i" set paper(y1) "0.2i" set paper(x2) "8.3i" set paper(y2) "13.8i" set paper(pheight) "13.6i" set paper(pwidth) "8.1i" set paper(height) "14.0i" set paper(width) "8.5i" set paper(centerx) "4.25i" set paper(centery) "7.0i" } letter { set paper(x1) "0.2i" set paper(y1) "0.2i" set paper(x2) "8.3i" set paper(y2) "10.8i" set paper(pheight) "10.6i" set paper(pwidth) "8.1i" set paper(height) "11.0i" set paper(width) "8.5i" set paper(centerx) "4.25i" set paper(centery) "5.5i" } default { error "ezPaperInfo: Unknown paper type ($type)" } } set inv(x1) "y1" set inv(x2) "y2" set inv(y1) "x1" set inv(y2) "x2" set inv(pwidth) "pheight" set inv(pheight) "pwidth" set inv(width) "height" set inv(height) "width" set inv(centerx) "centery" set inv(centery) "centerx" case $orient in { landscape { set res $paper($inv($attr)) } portrait { set res $paper($attr) } default { error "ezPaperInfo: orientation should be\ portrait or landscape (not $orient)" } } if {$window != ""} { set res [winfo fpixels $window $res] } return $res } ����������������������iwidgets-4.1.0/generic/canvasprintdialog.itk��������������������������������������������������������0000644�0036047�0045461�00000013002�07334043777�017575� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # CanvasPrintDialog v1.5 # ---------------------------------------------------------------------- # Implements a print dialog for printing the contents of a canvas widget # to a printer or a file. It is possible to specify page orientation, the # number of pages to print the image on and if the output should be # stretched to fit the page. The CanvasPrintDialog is derived from the # Dialog class and is composed of a CanvasPrintBox with attributes set to # manipulate the dialog buttons. # # ---------------------------------------------------------------------- # AUTHOR: Tako Schotanus EMAIL: Tako.Schotanus@bouw.tno.nl # ---------------------------------------------------------------------- # Copyright (c) 1995 Tako Schotanus # ====================================================================== # Permission is hereby granted, without written agreement and without # license or royalty fees, to use, copy, modify, and distribute this # software and its documentation for any purpose, provided that the # above copyright notice and the following two paragraphs appear in # all copies of this software. # # IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES # ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN # IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH # DAMAGE. # # THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND # FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS # ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO # PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. # ====================================================================== # # Option database default resources: # option add *Canvasprintdialog.filename "canvas.ps" widgetDefault option add *Canvasprintdialog.hPageCnt 1 widgetDefault option add *Canvasprintdialog.orient landscape widgetDefault option add *Canvasprintdialog.output printer widgetDefault option add *Canvasprintdialog.pageSize A4 widgetDefault option add *Canvasprintdialog.posterize 0 widgetDefault option add *Canvasprintdialog.printCmd lpr widgetDefault option add *Canvasprintdialog.printRegion "" widgetDefault option add *Canvasprintdialog.vPageCnt 1 widgetDefault option add *Canvasprintdialog.title "Canvas Print Dialog" widgetDefault option add *Canvasprintdialog.master "." widgetDefault # # Usual options. # itk::usual Canvasprintdialog { keep -background -cursor -foreground -modality } # ------------------------------------------------------------------ # CANVASPRINTDIALOG # ------------------------------------------------------------------ itcl::class iwidgets::Canvasprintdialog { inherit iwidgets::Dialog constructor {args} {} destructor {} method deactivate {args} {} method getoutput {} {} method setcanvas {canv} {} method refresh {} {} method print {} {} } # # Provide a lowercased access method for the Canvasprintdialog class. # proc ::iwidgets::canvasprintdialog {args} { uplevel ::iwidgets::Canvasprintdialog $args } # ------------------------------------------------------------------ # CONSTRUCTOR # # Create new file selection dialog. # ------------------------------------------------------------------ itcl::body iwidgets::Canvasprintdialog::constructor {args} { component hull configure -borderwidth 0 # # Instantiate a file selection box widget. # itk_component add cpb { iwidgets::Canvasprintbox $itk_interior.cpb } { usual keep -printregion -output -printcmd -filename -pagesize \ -orient -stretch -posterize -hpagecnt -vpagecnt } pack $itk_component(cpb) -fill both -expand yes # # Hide the apply and help buttons. # buttonconfigure OK -text Print buttonconfigure Apply -command [itcl::code $this refresh] -text Refresh hide Help eval itk_initialize $args } # ------------------------------------------------------------------ # METHOD: deactivate # # Redefines method of dialog shell class. Stops the drawing of the # thumbnail (when busy) upon deactivation of the dialog. # ------------------------------------------------------------------ itcl::body iwidgets::Canvasprintdialog::deactivate {args} { $itk_component(cpb) stop return [eval Shell::deactivate $args] } # ------------------------------------------------------------------ # METHOD: getoutput # # Thinwrapped method of canvas print box class. # ------------------------------------------------------------------ itcl::body iwidgets::Canvasprintdialog::getoutput {} { return [$itk_component(cpb) getoutput] } # ------------------------------------------------------------------ # METHOD: setcanvas # # Thinwrapped method of canvas print box class. # ------------------------------------------------------------------ itcl::body iwidgets::Canvasprintdialog::setcanvas {canv} { return [$itk_component(cpb) setcanvas $canv] } # ------------------------------------------------------------------ # METHOD: refresh # # Thinwrapped method of canvas print box class. # ------------------------------------------------------------------ itcl::body iwidgets::Canvasprintdialog::refresh {} { return [$itk_component(cpb) refresh] } # ------------------------------------------------------------------ # METHOD: print # # Thinwrapped method of canvas print box class. # ------------------------------------------------------------------ itcl::body iwidgets::Canvasprintdialog::print {} { return [$itk_component(cpb) print] } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/checkbox.itk�����������������������������������������������������������������0000644�0036047�0045461�00000027403�07336537776�015676� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Checkbox # ---------------------------------------------------------------------- # Implements a checkbuttonbox. Supports adding, inserting, deleting, # selecting, and deselecting of checkbuttons by tag and index. # # ---------------------------------------------------------------------- # AUTHOR: John A. Tucker EMAIL: jatucker@spd.dsccc.com # # ---------------------------------------------------------------------- # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Use option database to override default resources of base classes. # option add *Checkbox.labelMargin 10 widgetDefault option add *Checkbox.labelFont \ "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*" widgetDefault option add *Checkbox.labelPos nw widgetDefault option add *Checkbox.borderWidth 2 widgetDefault option add *Checkbox.relief groove widgetDefault # # Usual options. # itk::usual Checkbox { keep -background -borderwidth -cursor -foreground -labelfont } # ------------------------------------------------------------------ # CHECKBOX # ------------------------------------------------------------------ itcl::class iwidgets::Checkbox { inherit iwidgets::Labeledframe constructor {args} {} itk_option define -orient orient Orient vertical public { method add {tag args} method insert {index tag args} method delete {index} method get {{index ""}} method index {index} method select {index} method deselect {index} method flash {index} method toggle {index} method buttonconfigure {index args} } private { method gettag {index} ;# Get the tag of the checkbutton associated ;# with a numeric index variable _unique 0 ;# Unique id for choice creation. variable _buttons {} ;# List of checkbutton tags. common buttonVar ;# Array of checkbutton "-variables" } } # # Provide a lowercased access method for the Checkbox class. # proc ::iwidgets::checkbox {pathName args} { uplevel ::iwidgets::Checkbox $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Checkbox::constructor {args} { eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -orient # # Allows the user to orient the checkbuttons either horizontally # or vertically. Added by Chad Smith (csmith@adc.com) 3/10/00. # ------------------------------------------------------------------ itcl::configbody iwidgets::Checkbox::orient { if {$itk_option(-orient) == "horizontal"} { foreach tag $_buttons { pack $itk_component($tag) -side left -anchor nw -padx 4 -expand 1 } } elseif {$itk_option(-orient) == "vertical"} { foreach tag $_buttons { pack $itk_component($tag) -side top -anchor w -padx 4 -expand 0 } } else { error "Bad orientation: $itk_option(-orient). Should be\ \"horizontal\" or \"vertical\"." } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: index index # # Searches the checkbutton tags in the checkbox for the one with the # requested tag, numerical index, or keyword "end". Returns the # choices's numerical index if found, otherwise error. # ------------------------------------------------------------------ itcl::body iwidgets::Checkbox::index {index} { if {[llength $_buttons] > 0} { if {[regexp {(^[0-9]+$)} $index]} { if {$index < [llength $_buttons]} { return $index } else { error "Checkbox index \"$index\" is out of range" } } elseif {$index == "end"} { return [expr {[llength $_buttons] - 1}] } else { if {[set idx [lsearch $_buttons $index]] != -1} { return $idx } error "bad Checkbox index \"$index\": must be number, end,\ or pattern" } } else { error "Checkbox \"$itk_component(hull)\" has no checkbuttons" } } # ------------------------------------------------------------------ # METHOD: add tag ?option value option value ...? # # Add a new tagged checkbutton to the checkbox at the end. The method # takes additional options which are passed on to the checkbutton # constructor. These include most of the typical checkbutton # options. The tag is returned. # ------------------------------------------------------------------ itcl::body iwidgets::Checkbox::add {tag args} { itk_component add $tag { eval checkbutton $itk_component(childsite).cb[incr _unique] \ -variable [list [itcl::scope buttonVar($this,$tag)]] \ -anchor w \ -justify left \ -highlightthickness 0 \ $args } { usual keep -command -disabledforeground -selectcolor -state ignore -highlightthickness -highlightcolor rename -font -labelfont labelFont Font } # Redraw the buttons with the proper orientation. if {$itk_option(-orient) == "vertical"} { pack $itk_component($tag) -side top -anchor w -padx 4 -expand 0 } else { pack $itk_component($tag) -side left -anchor nw -expand 1 } lappend _buttons $tag return $tag } # ------------------------------------------------------------------ # METHOD: insert index tag ?option value option value ...? # # Insert the tagged checkbutton in the checkbox just before the # one given by index. Any additional options are passed on to the # checkbutton constructor. These include the typical checkbutton # options. The tag is returned. # ------------------------------------------------------------------ itcl::body iwidgets::Checkbox::insert {index tag args} { itk_component add $tag { eval checkbutton $itk_component(childsite).cb[incr _unique] \ -variable [list [itcl::scope buttonVar($this,$tag)]] \ -anchor w \ -justify left \ -highlightthickness 0 \ $args } { usual ignore -highlightthickness -highlightcolor rename -font -labelfont labelFont Font } set index [index $index] set before [lindex $_buttons $index] set _buttons [linsert $_buttons $index $tag] pack $itk_component($tag) -anchor w -padx 4 -before $itk_component($before) return $tag } # ------------------------------------------------------------------ # METHOD: delete index # # Delete the specified checkbutton. # ------------------------------------------------------------------ itcl::body iwidgets::Checkbox::delete {index} { set tag [gettag $index] set index [index $index] destroy $itk_component($tag) set _buttons [lreplace $_buttons $index $index] if { [info exists buttonVar($this,$tag)] == 1 } { unset buttonVar($this,$tag) } } # ------------------------------------------------------------------ # METHOD: select index # # Select the specified checkbutton. # ------------------------------------------------------------------ itcl::body iwidgets::Checkbox::select {index} { set tag [gettag $index] #----------------------------------------------------------- # BUG FIX: csmith (Chad Smith: csmith@adc.com), 3/30/99 #----------------------------------------------------------- # This method should only invoke the checkbutton if it's not # already selected. Check its associated variable, and if # it's set, then just ignore and return. #----------------------------------------------------------- if {[set [itcl::scope buttonVar($this,$tag)]] == [[component $tag] cget -onvalue]} { return } $itk_component($tag) invoke } # ------------------------------------------------------------------ # METHOD: toggle index # # Toggle a specified checkbutton between selected and unselected # ------------------------------------------------------------------ itcl::body iwidgets::Checkbox::toggle {index} { set tag [gettag $index] $itk_component($tag) toggle } # ------------------------------------------------------------------ # METHOD: get # # Return the value of the checkbutton with the given index, or a # list of all checkbutton values in increasing order by index. # ------------------------------------------------------------------ itcl::body iwidgets::Checkbox::get {{index ""}} { set result {} if {$index == ""} { foreach tag $_buttons { if {$buttonVar($this,$tag)} { lappend result $tag } } } else { set tag [gettag $index] set result $buttonVar($this,$tag) } return $result } # ------------------------------------------------------------------ # METHOD: deselect index # # Deselect the specified checkbutton. # ------------------------------------------------------------------ itcl::body iwidgets::Checkbox::deselect {index} { set tag [gettag $index] $itk_component($tag) deselect } # ------------------------------------------------------------------ # METHOD: flash index # # Flash the specified checkbutton. # ------------------------------------------------------------------ itcl::body iwidgets::Checkbox::flash {index} { set tag [gettag $index] $itk_component($tag) flash } # ------------------------------------------------------------------ # METHOD: buttonconfigure index ?option? ?value option value ...? # # Configure a specified checkbutton. This method allows configuration # of checkbuttons from the Checkbox level. The options may have any # of the values accepted by the add method. # ------------------------------------------------------------------ itcl::body iwidgets::Checkbox::buttonconfigure {index args} { set tag [gettag $index] eval $itk_component($tag) configure $args } # ------------------------------------------------------------------ # METHOD: gettag index # # Return the tag of the checkbutton associated with a specified # numeric index # ------------------------------------------------------------------ itcl::body iwidgets::Checkbox::gettag {index} { return [lindex $_buttons [index $index]] } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/colors.itcl������������������������������������������������������������������0000644�0036047�0045461�00000016172�07336540223�015533� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # colors # ---------------------------------------------------------------------- # The colors class encapsulates several color related utility functions. # Class level scope resolution must be used inorder to access the static # member functions. # # USAGE: # set hsb [colors::rgbToHsb [winfo rgb . bisque]] # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com # # @(#) $Id: colors.itcl,v 1.2 2001/08/15 18:33:55 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 Mark L. Ulferts # ====================================================================== # Permission is hereby granted, without written agreement and without # license or royalty fees, to use, copy, modify, and distribute this # software and its documentation for any purpose, provided that the # above copyright notice and the following two paragraphs appear in # all copies of this software. # # IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES # ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN # IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH # DAMAGE. # # THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND # FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS # ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO # PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. # ====================================================================== namespace eval iwidgets::colors { # ------------------------------------------------------------------ # PROCEDURE: rgbToNumeric # # Returns the numeric value for a list of red, green, and blue. # ------------------------------------------------------------------ proc rgbToNumeric {rgb} { if {[llength $rgb] != 3} { error "bad arg: \"$rgb\", should be list of red, green, and blue" } return [format "#%04x%04x%04x" \ [lindex $rgb 0] [lindex $rgb 1] [lindex $rgb 2]] } # ------------------------------------------------------------------ # PROCEDURE: rgbToHsb # # The procedure below converts an RGB value to HSB. It takes red, # green, and blue components (0-65535) as arguments, and returns a # list containing HSB components (floating-point, 0-1) as result. # The code here is a copy of the code on page 615 of "Fundamentals # of Interactive Computer Graphics" by Foley and Van Dam. # ------------------------------------------------------------------ proc rgbToHsb {rgb} { if {[llength $rgb] != 3} { error "bad arg: \"$rgb\", should be list of red, green, and blue" } set r [expr {[lindex $rgb 0]/65535.0}] set g [expr {[lindex $rgb 1]/65535.0}] set b [expr {[lindex $rgb 2]/65535.0}] set max 0 if {$r > $max} {set max $r} if {$g > $max} {set max $g} if {$b > $max} {set max $b} set min 65535 if {$r < $min} {set min $r} if {$g < $min} {set min $g} if {$b < $min} {set min $b} if {$max != 0} { set sat [expr {($max-$min)/$max}] } else { set sat 0 } if {$sat == 0} { set hue 0 } else { set rc [expr {($max-$r)/($max-$min)}] set gc [expr {($max-$g)/($max-$min)}] set bc [expr {($max-$b)/($max-$min)}] if {$r == $max} { set hue [expr {$bc-$gc}] } elseif {$g == $max} { set hue [expr {2+$rc-$bc}] } elseif {$b == $max} { set hue [expr {4+$gc-$rc}] } set hue [expr {$hue*0.1666667}] if {$hue < 0} {set hue [expr {$hue+1.0}]} } return [list $hue $sat $max] } # ------------------------------------------------------------------ # PROCEDURE: hsbToRgb # # The procedure below converts an HSB value to RGB. It takes hue, # saturation, and value components (floating-point, 0-1.0) as # arguments, and returns a list containing RGB components (integers, # 0-65535) as result. The code here is a copy of the code on page # 616 of "Fundamentals of Interactive Computer Graphics" by Foley # and Van Dam. # ------------------------------------------------------------------ proc hsbToRgb {hsb} { if {[llength $hsb] != 3} { error "bad arg: \"$hsb\", should be list of hue, saturation, and brightness" } set hue [lindex $hsb 0] set sat [lindex $hsb 1] set value [lindex $hsb 2] set v [format %.0f [expr {65535.0*$value}]] if {$sat == 0} { return "$v $v $v" } else { set hue [expr {$hue*6.0}] if {$hue >= 6.0} { set hue 0.0 } scan $hue. %d i set f [expr {$hue-$i}] set p [format %.0f [expr {65535.0*$value*(1 - $sat)}]] set q [format %.0f [expr {65535.0*$value*(1 - ($sat*$f))}]] set t [format %.0f [expr {65535.0*$value*(1 - ($sat*(1 - $f)))}]] case $i \ 0 {return "$v $t $p"} \ 1 {return "$q $v $p"} \ 2 {return "$p $v $t"} \ 3 {return "$p $q $v"} \ 4 {return "$t $p $v"} \ 5 {return "$v $p $q"} error "i value $i is out of range" } } # ------------------------------------------------------------------ # # PROCEDURE: topShadow bgColor # # This method computes a lighter shadow variant of bgColor. # It wants to decrease the saturation to 25%. But if there is # no saturation (as in gray colors) it tries to turn the # brightness up by 10%. It maxes the brightness at 1.0 to # avoid bogus colors... # # bgColor is converted to HSB where the calculations are # made. Then converted back to an rgb color number (hex fmt) # # ------------------------------------------------------------------ proc topShadow { bgColor } { set hsb [rgbToHsb [winfo rgb . $bgColor]] set saturation [lindex $hsb 1] set brightness [lindex $hsb 2] if { $brightness < 0.9 } { # try turning the brightness up first. set brightness [expr {$brightness * 1.1}] } else { # otherwise fiddle with saturation set saturation [expr {$saturation * 0.25}] } set hsb [lreplace $hsb 1 1 [set saturation]] set hsb [lreplace $hsb 2 2 [set brightness]] set rgb [hsbToRgb $hsb] set color [rgbToNumeric $rgb] return $color } # ------------------------------------------------------------------ # # PROC: bottomShadow bgColor # # # This method computes a darker shadow variant of bg color. # It takes the brightness and decreases it to 80% of its # original value. # # bgColor is converted to HSB where the calculations are # made. Then converted back to an rgb color number (hex fmt) # # ------------------------------------------------------------------ proc bottomShadow { bgColor } { set hsb [rgbToHsb [winfo rgb . $bgColor]] set hsb [lreplace $hsb 2 2 [expr {[lindex $hsb 2] * 0.8}]] set rgb [hsbToRgb $hsb] set color [rgbToNumeric $rgb] return $color } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/combobox.itk�����������������������������������������������������������������0000644�0036047�0045461�00000132077�13124774030�015676� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Combobox # ---------------------------------------------------------------------- # Implements a Combobox widget. A Combobox has 2 basic styles: simple and # dropdown. Dropdowns display an entry field with an arrow button to the # right of it. When the arrow button is pressed a selectable list of # items is popped up. A simple Combobox displays an entry field and a listbox # just beneath it which is always displayed. In both types, if the user # selects an item in the listbox, the contents of the entry field are # replaced with the text from the selected item. If the Combobox is # editable, the user can type in the entry field and when <Return> is # pressed the item will be inserted into the list. # # WISH LIST: # This section lists possible future enhancements. # # Combobox 1.x: # - convert bindings to bindtags. # # ---------------------------------------------------------------------- # ORIGINAL AUTHOR: John S. Sigler # ---------------------------------------------------------------------- # CURRENT MAINTAINER: Chad Smith EMAIL: csmith@adc.com, itclguy@yahoo.com # # Copyright (c) 1995 John S. Sigler # Copyright (c) 1997 Mitch Gorman # ====================================================================== # Permission is hereby granted, without written agreement and without # license or royalty fees, to use, copy, modify, and distribute this # software and its documentation for any purpose, provided that the # above copyright notice and the following two paragraphs appear in # all copies of this software. # # IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES # ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN # IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH # DAMAGE. # # THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND # FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS # ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO # PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. # ====================================================================== # # Default resources. # option add *Combobox.borderWidth 2 widgetDefault option add *Combobox.labelPos wn widgetDefault option add *Combobox.listHeight 150 widgetDefault option add *Combobox.hscrollMode dynamic widgetDefault option add *Combobox.vscrollMode dynamic widgetDefault # # Usual options. # itk::usual Combobox { keep -background -borderwidth -cursor -foreground -highlightcolor \ -highlightthickness -insertbackground -insertborderwidth \ -insertofftime -insertontime -insertwidth -labelfont -popupcursor \ -selectbackground -selectborderwidth -selectforeground \ -textbackground -textfont } # ------------------------------------------------------------------ # COMBOBOX # ------------------------------------------------------------------ itcl::class iwidgets::Combobox { inherit iwidgets::Entryfield constructor {args} {} destructor {} itk_option define -arrowrelief arrowRelief Relief raised itk_option define -completion completion Completion true itk_option define -dropdown dropdown Dropdown true itk_option define -editable editable Editable true itk_option define -grab grab Grab local itk_option define -listheight listHeight Height 150 itk_option define -margin margin Margin 1 itk_option define -popupcursor popupCursor Cursor arrow itk_option define -selectioncommand selectionCommand SelectionCommand {} itk_option define -state state State normal itk_option define -unique unique Unique true public method clear {{component all}} public method curselection {} public method delete {component first {last {}}} public method get {{index {}}} public method getcurselection {} public method insert {component index args} public method invoke {} public method justify {direction} public method see {index} public method selection {option first {last {}}} public method size {} public method sort {{mode ascending}} public method xview {args} public method yview {args} protected method _addToList {} protected method _createComponents {} protected method _deleteList {first {last {}}} protected method _deleteText {first {last {}}} protected method _doLayout {{when later}} protected method _drawArrow {} protected method _dropdownBtnRelease {{window {}} {x 1} {y 1}} protected method _ignoreNextBtnRelease {ignore} protected method _next {} protected method _packComponents {{when later}} protected method _positionList {} protected method _postList {} protected method _previous {} protected method _resizeArrow {} protected method _selectCmd {} protected method _toggleList {} protected method _unpostList {} protected method _commonBindings {} protected method _dropdownBindings {} protected method _simpleBindings {} protected method _listShowing {{val ""}} private method _bs {} private method _lookup {key} private method _slbListbox {} private method _stateSelect {} private variable _doit 0; private variable _inbs 0; private variable _inlookup 0; private variable _currItem {}; ;# current selected item. private variable _ignoreRelease false ;# next button release ignored. private variable _isPosted false; ;# is the dropdown popped up. private variable _repacking {} ;# non-null => _packComponents pending. private variable _grab ;# used to restore grabs private variable _next_prevFLAG 0 ;# Used in _lookup to fix SF Bug 501300 private common _listShowing private common count 0 } # # Provide a lowercase access method for the Combobox class. # proc ::iwidgets::combobox {pathName args} { uplevel ::iwidgets::Combobox $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Combobox::constructor {args} { set _listShowing($this) 0 set _grab(window) "" set _grab(status) "" # combobox is different as all components are created # after determining what the dropdown style is... # configure args eval itk_initialize $args # create components that are dependent on options # (Scrolledlistbox, arrow button) and pack them. if {$count == 0} { image create bitmap downarrow -data { #define down_width 16 #define down_height 16 static unsigned char down_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0xf8, 0x3f, 0xf0, 0x1f, 0xe0, 0x0f, 0xc0, 0x07, 0x80, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; } image create bitmap uparrow -data { #define up_width 16 #define up_height 16 static unsigned char up_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x01, 0xe0, 0x03, 0xf0, 0x07, 0xf8, 0x0f, 0xfc, 0x1f, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; } } incr count _doLayout } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Combobox::destructor {} { # catch any repacking that may be waiting for idle time if {$_repacking != ""} { after cancel $_repacking } incr count -1 if {$count == 0} { image delete uparrow image delete downarrow } } # ================================================================ # OPTIONS # ================================================================ # -------------------------------------------------------------------- # OPTION: -arrowrelief # # Relief style used on the arrow button. # -------------------------------------------------------------------- itcl::configbody iwidgets::Combobox::arrowrelief {} # -------------------------------------------------------------------- # OPTION: -completion # # Relief style used on the arrow button. # -------------------------------------------------------------------- itcl::configbody iwidgets::Combobox::completion { switch -- $itk_option(-completion) { 0 - no - false - off { } 1 - yes - true - on { } default { error "bad completion option \"$itk_option(-completion)\":\ should be boolean" } } } # -------------------------------------------------------------------- # OPTION: -dropdown # # Boolean which determines the Combobox style: dropdown or simple. # Because the two style's lists reside in different toplevel widgets # this is more complicated than it should be. # -------------------------------------------------------------------- itcl::configbody iwidgets::Combobox::dropdown { switch -- $itk_option(-dropdown) { 1 - yes - true - on { if {[winfo exists $itk_interior.list]} { set vals [$itk_component(list) get 0 end] destroy $itk_component(list) _doLayout if [llength $vals] { eval insert list end $vals } } } 0 - no - false - off { if {[winfo exists $itk_interior.popup.list]} { set vals [$itk_component(list) get 0 end] catch {destroy $itk_component(arrowBtn)} destroy $itk_component(popup) ;# this deletes the list too _doLayout if [llength $vals] { eval insert list end $vals } } } default { error "bad dropdown option \"$itk_option(-dropdown)\":\ should be boolean" } } } # -------------------------------------------------------------------- # OPTION: -editable # # Boolean which allows/disallows user input to the entry field area. # -------------------------------------------------------------------- itcl::configbody iwidgets::Combobox::editable { switch -- $itk_option(-editable) { 1 - true - yes - on { switch -- $itk_option(-state) { normal { $itk_component(entry) configure -state normal } } } 0 - false - no - off { $itk_component(entry) configure -state readonly } default { error "bad editable option \"$itk_option(-editable)\":\ should be boolean" } } } # -------------------------------------------------------------------- # OPTION: -grab # # grab-state of megawidget # -------------------------------------------------------------------- itcl::configbody iwidgets::Combobox::grab { switch -- $itk_option(-grab) { local { } global { } default { error "bad grab value \"$itk_option(-grab)\":\ must be global or local" } } } # -------------------------------------------------------------------- # OPTION: -listheight # # Listbox height in pixels. (Need to integrate the scrolledlistbox # -visibleitems option here - at least for simple listbox.) # -------------------------------------------------------------------- itcl::configbody iwidgets::Combobox::listheight {} # -------------------------------------------------------------------- # OPTION: -margin # # Spacer between the entry field and arrow button of dropdown style # Comboboxes. # -------------------------------------------------------------------- itcl::configbody iwidgets::Combobox::margin { grid columnconfigure $itk_interior 0 -minsize $itk_option(-margin) } # -------------------------------------------------------------------- # OPTION: -popupcursor # # Set the cursor for the popup list. # -------------------------------------------------------------------- itcl::configbody iwidgets::Combobox::popupcursor {} # -------------------------------------------------------------------- # OPTION: -selectioncommand # # Defines the proc to be called when an item is selected in the list. # -------------------------------------------------------------------- itcl::configbody iwidgets::Combobox::selectioncommand {} # -------------------------------------------------------------------- # OPTION: -state # # overall state of megawidget # -------------------------------------------------------------------- itcl::configbody iwidgets::Combobox::state { switch -- $itk_option(-state) { disabled { $itk_component(entry) configure -state disabled } normal { switch -- $itk_option(-editable) { 1 - true - yes - on { $itk_component(entry) configure -state normal } 0 - false - no - off { $itk_component(entry) configure -state readonly } } } readonly { $itk_component(entry) configure -state readonly } default { error "bad state value \"$itk_option(-state)\":\ must be normal or disabled" } } if {[info exists itk_component(arrowBtn)]} { $itk_component(arrowBtn) configure -state $itk_option(-state) } } # -------------------------------------------------------------------- # OPTION: -unique # # Boolean which disallows/allows adding duplicate items to the listbox. # -------------------------------------------------------------------- itcl::configbody iwidgets::Combobox::unique { # boolean error check switch -- $itk_option(-unique) { 1 - true - yes - on { } 0 - false - no - off { } default { error "bad unique value \"$itk_option(-unique)\":\ should be boolean" } } } # ================================================================= # METHODS # ================================================================= # ------------------------------------------------------ # PUBLIC METHOD: clear ?component? # # Remove all elements from the listbox, all contents # from the entry component, or both (if all). # # ------------------------------------------------------ itcl::body iwidgets::Combobox::clear {{component all}} { switch -- $component { entry { iwidgets::Entryfield::clear } list { delete list 0 end } all { delete list 0 end iwidgets::Entryfield::clear } default { error "bad Combobox component \"$component\":\ must be entry, list, or all." } } return } # ------------------------------------------------------ # PUBLIC METHOD: curselection # # Return the current selection index. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::curselection {} { return [$itk_component(list) curselection] } # ------------------------------------------------------ # PUBLIC METHOD: delete component first ?last? # # Delete an item or items from the listbox OR delete # text from the entry field. First argument determines # which component deletion occurs in - valid values are # entry or list. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::delete {component first {last {}}} { switch -- $component { entry { if {$last == {}} { set last [expr {$first + 1}] } iwidgets::Entryfield::delete $first $last } list { _deleteList $first $last } default { error "bad Combobox component \"$component\":\ must be entry or list." } } } # ------------------------------------------------------ # PUBLIC METHOD: get ?index? # # # Retrieve entry contents if no args OR use args as list # index and retrieve list item at index . # # ------------------------------------------------------ itcl::body iwidgets::Combobox::get {{index {}}} { # no args means to get the current text in the entry field area if {$index == {}} { iwidgets::Entryfield::get } else { eval $itk_component(list) get $index } } # ------------------------------------------------------ # PUBLIC METHOD: getcurselection # # Return currently selected item in the listbox. Shortcut # version of get curselection command combination. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::getcurselection {} { return [$itk_component(list) getcurselection] } # ------------------------------------------------------------------ # PUBLIC METHOD: invoke # # Pops up or down a dropdown combobox. # # ------------------------------------------------------------------ itcl::body iwidgets::Combobox::invoke {} { if {$itk_option(-dropdown)} { return [_toggleList] } return } # ------------------------------------------------------------ # PUBLIC METHOD: insert comonent index string ?string ...? # # Insert an item into the listbox OR text into the entry area. # Valid component names are entry or list. # # ------------------------------------------------------------ itcl::body iwidgets::Combobox::insert {component index args} { set nargs [llength $args] if {$nargs == 0} { error "no value given for parameter \"string\" in function\ \"Combobox::insert\"" } switch -- $component { entry { if { $nargs > 1} { error "called function \"Combobox::insert entry\"\ with too many arguments" } else { if {$itk_option(-state) == "normal"} { eval iwidgets::Entryfield::insert $index $args eval [itcl::code $this _lookup ""] } } } list { if {$itk_option(-state) == "normal"} { eval $itk_component(list) insert $index $args } } default { error "bad Combobox component \"$component\": must\ be entry or list." } } } # ------------------------------------------------------ # PUBLIC METHOD: justify direction # # Wrapper for justifying the listbox items in one of # 4 directions: top, bottom, left, or right. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::justify {direction} { return [$itk_component(list) justify $direction] } # ------------------------------------------------------------------ # PUBLIC METHOD: see index # # Adjusts the view such that the element given by index is visible. # ------------------------------------------------------------------ itcl::body iwidgets::Combobox::see {index} { return [$itk_component(list) see $index] } # ------------------------------------------------------------------ # PUBLIC METHOD: selection option first ?last? # # Adjusts the selection within the listbox and changes the contents # of the entry component to be the value of the selected list item. # ------------------------------------------------------------------ itcl::body iwidgets::Combobox::selection {option first {last {}}} { # thin wrap if {$option == "set"} { $itk_component(list) selection clear 0 end $itk_component(list) selection set $first set rtn "" } else { set rtn [eval $itk_component(list) selection $option $first $last] } set _currItem $first # combobox additions set theText [getcurselection] if {$theText != [$itk_component(entry) get]} { clear entry if {$theText != ""} { insert entry 0 $theText } } return $rtn } # ------------------------------------------------------------------ # PUBLIC METHOD: size # # Returns a decimal string indicating the total number of elements # in the listbox. # ------------------------------------------------------------------ itcl::body iwidgets::Combobox::size {} { return [$itk_component(list) size] } # ------------------------------------------------------ # PUBLIC METHOD: sort ?mode? # # Sort the current list in either "ascending" or "descending" order. # # jss: how should i handle selected items? # # ------------------------------------------------------ itcl::body iwidgets::Combobox::sort {{mode ascending}} { $itk_component(list) sort $mode # return [$itk_component(list) sort $mode] } # ------------------------------------------------------------------ # PUBLIC METHOD: xview ?arg arg ...? # # Change or query the vertical position of the text in the list box. # ------------------------------------------------------------------ itcl::body iwidgets::Combobox::xview {args} { return [eval $itk_component(list) xview $args] } # ------------------------------------------------------------------ # PUBLIC METHOD: yview ?arg arg ...? # # Change or query the horizontal position of the text in the list box. # ------------------------------------------------------------------ itcl::body iwidgets::Combobox::yview {args} { return [eval $itk_component(list) yview $args] } # ------------------------------------------------------ # PROTECTED METHOD: _addToList # # Add the current item in the entry to the listbox. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_addToList {} { set input [get] if {$input != ""} { if {$itk_option(-unique)} { # if item is already in list, select it and exit set item [lsearch -exact [$itk_component(list) get 0 end] $input] if {$item != -1} { selection clear 0 end if {$item != {}} { selection set $item $item set _currItem $item } return } } # add the item to end of list selection clear 0 end insert list end $input selection set end end } } # ------------------------------------------------------ # PROTECTED METHOD: _createComponents # # Create deferred combobox components and add bindings. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_createComponents {} { if {$itk_option(-dropdown)} { # --- build a dropdown combobox --- # make the arrow childsite be on the right hand side #------------------------------------------------------------- # BUG FIX: csmith (Chad Smith: csmith@adc.com), 3/4/99 #------------------------------------------------------------- # The following commented line of code overwrites the -command # option when passed into the constructor. The order of calls # in the constructor is: # 1) eval itk_initalize $args (initializes -command) # 2) _doLayout # 3) _createComponents (overwrites -command) # The solution is to only set the -command option if it hasn't # already been set. The following 4 lines of code do this. #------------------------------------------------------------- # ** configure -childsitepos e -command [code $this _addToList] #------------------------------------------------------------- configure -childsitepos e if ![llength [cget -command]] { configure -command [itcl::code $this _addToList] } # arrow button to popup the list itk_component add arrowBtn { button $itk_interior.arrowBtn -borderwidth 2 \ -width 15 -height 15 -image downarrow \ -command [itcl::code $this _toggleList] -state $itk_option(-state) } { keep -background -borderwidth -cursor -state \ -highlightcolor -highlightthickness rename -relief -arrowrelief arrowRelief Relief rename -highlightbackground -background background Background } # popup list container itk_component add popup { toplevel $itk_interior.popup } { keep -background -cursor } wm withdraw $itk_interior.popup # the listbox itk_component add list { iwidgets::Scrolledlistbox $itk_interior.popup.list -exportselection no \ -vscrollmode dynamic -hscrollmode dynamic -selectmode browse } { keep -background -borderwidth -cursor -foreground \ -highlightcolor -highlightthickness \ -hscrollmode -selectbackground \ -selectborderwidth -selectforeground -textbackground \ -textfont -vscrollmode rename -height -listheight listHeight Height rename -cursor -popupcursor popupCursor Cursor } # mode specific bindings _dropdownBindings # Ugly hack to avoid tk buglet revealed in _dropdownBtnRelease where # relief is used but not set in scrollbar.tcl. global tkPriv set tkPriv(relief) raise } else { # --- build a simple combobox --- configure -childsitepos s itk_component add list { iwidgets::Scrolledlistbox $itk_interior.list -exportselection no \ -vscrollmode dynamic -hscrollmode dynamic } { keep -background -borderwidth -cursor -foreground \ -highlightcolor -highlightthickness \ -hscrollmode -selectbackground \ -selectborderwidth -selectforeground -textbackground \ -textfont -visibleitems -vscrollmode rename -height -listheight listHeight Height } # add mode specific bindings _simpleBindings } # popup cursor applies only to the list within the combobox configure -popupcursor $itk_option(-popupcursor) # add mode independent bindings _commonBindings } # ------------------------------------------------------ # PROTECTED METHOD: _deleteList first ?last? # # Delete an item or items from the listbox. Called via # "delete list args". # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_deleteList {first {last {}}} { if {$last == {}} { set last $first } $itk_component(list) delete $first $last # remove the item if it is no longer in the list set text [$this get] if {$text != ""} { set index [lsearch -exact [$itk_component(list) get 0 end] $text ] if {$index == -1} { clear entry } } return } # ------------------------------------------------------ # PROTECTED METHOD: _deleteText first ?last? # # Renamed Entryfield delete method. Called via "delete entry args". # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_deleteText {first {last {}}} { $itk_component(entry) configure -state normal set rtrn [delete $first $last] switch -- $itk_option(-editable) { 0 - false - no - off { $itk_component(entry) configure -state readonly } } return $rtrn } # ------------------------------------------------------ # PROTECTED METHOD: _doLayout ?when? # # Call methods to create and pack the Combobox components. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_doLayout {{when later}} { _createComponents _packComponents $when } # ------------------------------------------------------ # PROTECTED METHOD: _drawArrow # # Draw the arrow button. Determines packing according to # -labelpos. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_drawArrow {} { set flip false set relief "" set fg [cget -foreground] if {$_isPosted} { set flip true set relief "-relief sunken" } else { set relief "-relief $itk_option(-arrowrelief)" } if {$flip} { # # draw up arrow # eval $itk_component(arrowBtn) configure -image uparrow $relief } else { # # draw down arrow # eval $itk_component(arrowBtn) configure -image downarrow $relief } } # ------------------------------------------------------ # PROTECTED METHOD: _dropdownBtnRelease window x y # # Event handler for button releases while a dropdown list # is posted. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_dropdownBtnRelease {{window {}} {x 1} {y 1}} { # if it's a scrollbar then ignore the release if {($window == [$itk_component(list) component vertsb]) || ($window == [$itk_component(list) component horizsb])} { return } # 1st release allows list to stay up unless we are in listbox if {$_ignoreRelease} { _ignoreNextBtnRelease false return } # should I use just the listbox or also include the scrollbars if { ($x >= 0) && ($x < [winfo width [_slbListbox]]) && ($y >= 0) && ($y < [winfo height [_slbListbox]])} { _stateSelect } _unpostList # execute user command if {$itk_option(-selectioncommand) != ""} { uplevel #0 $itk_option(-selectioncommand) } } # ------------------------------------------------------ # PROTECTED METHOD: _ignoreNextBtnRelease ignore # # Set private variable _ignoreRelease. If this variable # is true then the next button release will not remove # a dropdown list. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_ignoreNextBtnRelease {ignore} { set _ignoreRelease $ignore } # ------------------------------------------------------ # PROTECTED METHOD: _next # # Select the next item in the list. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_next {} { set _next_prevFLAG 1 if {[size] <= 1} { return } set i [curselection] if {($i == {}) || ($i == ([size]-1)) } { set i 0 } else { incr i } selection clear 0 end selection set $i $i see $i set _currItem $i } # ------------------------------------------------------ # PROTECTED METHOD: _packComponents ?when? # # Pack the components of the combobox and add bindings. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_packComponents {{when later}} { if {$when == "later"} { if {$_repacking == ""} { set _repacking [after idle [itcl::code $this _packComponents now]] return } } elseif {$when != "now"} { error "bad option \"$when\": should be now or later" } if {$itk_option(-dropdown)} { grid configure $itk_component(list) -row 1 -column 0 -sticky news _resizeArrow grid config $itk_component(arrowBtn) -row 0 -column 1 -sticky nsew } else { # size and pack list hack grid configure $itk_component(entry) -row 0 -column 0 -sticky ew grid configure $itk_component(efchildsite) -row 1 -column 0 -sticky nsew grid configure $itk_component(list) -row 0 -column 0 -sticky nsew grid rowconfigure $itk_component(efchildsite) 1 -weight 1 grid columnconfigure $itk_component(efchildsite) 0 -weight 1 } set _repacking "" } # ------------------------------------------------------ # PROTECTED METHOD: _positionList # # Determine the position (geometry) for the popped up list # and map it to the screen. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_positionList {} { set x [winfo rootx $itk_component(entry) ] set y [expr {[winfo rooty $itk_component(entry) ] + \ [winfo height $itk_component(entry) ]}] set w [winfo width $itk_component(entry) ] set h [winfo height [_slbListbox] ] set sh [winfo screenheight .] if {(($y+$h) > $sh) && ($y > ($sh/2))} { set y [expr {[winfo rooty $itk_component(entry) ] - $h}] } $itk_component(list) configure -width $w wm overrideredirect $itk_component(popup) 0 wm geometry $itk_component(popup) +$x+$y wm overrideredirect $itk_component(popup) 1 } # ------------------------------------------------------ # PROTECTED METHOD: _postList # # Pop up the list in a dropdown style Combobox. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_postList {} { if {[$itk_component(list) size] == ""} { return } set _isPosted true _positionList # map window and do a grab wm deiconify $itk_component(popup) _listShowing -wait # Added by csmith, 12/19/00. Thanks to Erik Leunissen for # finding this problem. We need to restore any previous # grabs after the dropdown listbox is withdrawn. To do this, # save the currently grabbed window. It is then restored in # the _unpostList method. set _grab(window) [::grab current] if {$_grab(window) != ""} { set _grab(status) [::grab status $_grab(window)] } # Now grab the dropdown listbox. if {$itk_option(-grab) == "global"} { ::grab -global $itk_component(popup) } else { ::grab $itk_component(popup) } raise $itk_component(popup) focus $itk_component(popup) _drawArrow # Added by csmith, 10/26/00. This binding keeps the listbox # from staying mapped if the window in which the combobox # is packed is iconified. bind $itk_component(entry) <Unmap> [itcl::code $this _unpostList] } # ------------------------------------------------------ # PROTECTED METHOD: _previous # # Select the previous item in the list. Wraps at front # and end of list. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_previous {} { set _next_prevFLAG 1 if {[size] <= 1} { return } set i [curselection] if {$i == "" || $i == 0} { set i [expr {[size] - 1}] } else { incr i -1 } selection clear 0 end selection set $i $i see $i set _currItem $i } # ------------------------------------------------------ # PROTECTED METHOD: _resizeArrow # # Recalculate the arrow button size and then redraw it. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_resizeArrow {} { set bw [expr {[$itk_component(arrowBtn) cget -borderwidth]+ \ [$itk_component(arrowBtn) cget -highlightthickness]}] set newHeight [expr {[winfo reqheight $itk_component(entry)]-(2*$bw) - 2}] $itk_component(arrowBtn) configure -width $newHeight -height $newHeight _drawArrow } # ------------------------------------------------------ # PROTECTED METHOD: _selectCmd # # Called when list item is selected to insert new text # in entry, and call user -command callback if defined. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_selectCmd {} { $itk_component(entry) configure -state normal set _currItem [$itk_component(list) curselection] set item [$itk_component(list) getcurselection] clear entry $itk_component(entry) insert 0 $item switch -- $itk_option(-editable) { 0 - false - no - off { $itk_component(entry) configure -state readonly } } } # ------------------------------------------------------ # PROTECTED METHOD: _toggleList # # Post or unpost the dropdown listbox (toggle). # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_toggleList {} { if {[winfo ismapped $itk_component(popup)] } { _unpostList } else { _postList } } # ------------------------------------------------------ # PROTECTED METHOD: _unpostList # # Unmap the listbox (pop it down). # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_unpostList {} { # Determine if event occured in the scrolledlistbox and, if it did, # don't unpost it. (A selection in the list unposts it correctly and # in the scrollbar we don't want to unpost it.) set x [winfo x $itk_component(list)] set y [winfo y $itk_component(list)] set w [winfo width $itk_component(list)] set h [winfo height $itk_component(list)] wm withdraw $itk_component(popup) ::grab release $itk_component(popup) # Added by csmith, 12/19/00. Thanks to Erik Leunissen for finding # this problem. We need to restore any previous grabs when the # dropdown listbox is unmapped. if {$_grab(window) != ""} { if {$_grab(status) == "global"} { ::grab -global $_grab(window) } else { ::grab $_grab(window) } set _grab(window) "" set _grab(status) "" } # Added by csmith, 10/26/00. This binding resets the binding # created in _postList - see that method for further details. bind $itk_component(entry) <Unmap> {} set _isPosted false $itk_component(list) selection clear 0 end if {$_currItem != {}} { $itk_component(list) selection set $_currItem $_currItem $itk_component(list) activate $_currItem } switch -- $itk_option(-editable) { 1 - true - yes - on { $itk_component(entry) configure -state normal } 0 - false - no - off { $itk_component(entry) configure -state readonly } } _drawArrow update } # ------------------------------------------------------ # PROTECTED METHOD: _commonBindings # # Bindings that are used by both simple and dropdown # style Comboboxes. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_commonBindings {} { bind $itk_component(entry) <KeyPress-BackSpace> [itcl::code $this _bs] bind $itk_component(entry) <KeyRelease> [itcl::code $this _lookup %K] bind $itk_component(entry) <Down> [itcl::code $this _next] bind $itk_component(entry) <Up> [itcl::code $this _previous] bind $itk_component(entry) <Control-n> [itcl::code $this _next] bind $itk_component(entry) <Control-p> [itcl::code $this _previous] bind [_slbListbox] <Control-n> [itcl::code $this _next] bind [_slbListbox] <Control-p> [itcl::code $this _previous] } # ------------------------------------------------------ # PROTECTED METHOD: _dropdownBindings # # Bindings used only by the dropdown type Combobox. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_dropdownBindings {} { bind $itk_component(popup) <Escape> [itcl::code $this _unpostList] bind $itk_component(popup) <space> \ "[itcl::code $this _stateSelect]; [itcl::code $this _unpostList]" bind $itk_component(popup) <Return> \ "[itcl::code $this _stateSelect]; [itcl::code $this _unpostList]" bind $itk_component(popup) <ButtonRelease-1> \ [itcl::code $this _dropdownBtnRelease %W %x %y] bind $itk_component(list) <Map> \ [itcl::code $this _listShowing 1] bind $itk_component(list) <Unmap> \ [itcl::code $this _listShowing 0] # once in the listbox, we drop on the next release (unless in scrollbar) bind [_slbListbox] <Enter> \ [itcl::code $this _ignoreNextBtnRelease false] bind $itk_component(arrowBtn) <3> [itcl::code $this _next] bind $itk_component(arrowBtn) <Shift-3> [itcl::code $this _previous] bind $itk_component(arrowBtn) <Down> [itcl::code $this _next] bind $itk_component(arrowBtn) <Up> [itcl::code $this _previous] bind $itk_component(arrowBtn) <Control-n> [itcl::code $this _next] bind $itk_component(arrowBtn) <Control-p> [itcl::code $this _previous] bind $itk_component(arrowBtn) <Shift-Down> [itcl::code $this _toggleList] bind $itk_component(arrowBtn) <Shift-Up> [itcl::code $this _toggleList] bind $itk_component(arrowBtn) <Return> [itcl::code $this _toggleList] bind $itk_component(arrowBtn) <space> [itcl::code $this _toggleList] bind $itk_component(entry) <Configure> [itcl::code $this _resizeArrow] bind $itk_component(entry) <Shift-Down> [itcl::code $this _toggleList] bind $itk_component(entry) <Shift-Up> [itcl::code $this _toggleList] } # ------------------------------------------------------ # PROTECTED METHOD: _simpleBindings # # Bindings used only by the simple type Comboboxes. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_simpleBindings {} { bind [_slbListbox] <ButtonRelease-1> [itcl::code $this _stateSelect] bind [_slbListbox] <space> [itcl::code $this _stateSelect] bind [_slbListbox] <Return> [itcl::code $this _stateSelect] bind $itk_component(entry) <Escape> "" bind $itk_component(entry) <Shift-Down> "" bind $itk_component(entry) <Shift-Up> "" bind $itk_component(entry) <Configure> "" } # ------------------------------------------------------ # PROTECTED METHOD: _listShowing ?val? # # Used instead of "tkwait visibility" to make sure that # the dropdown list is visible. Whenever the list gets # mapped or unmapped, this method is called to keep # track of it. When it is called with the value "-wait", # it waits for the list to be mapped. # ------------------------------------------------------ itcl::body iwidgets::Combobox::_listShowing {{val ""}} { if {$val == ""} { return $_listShowing($this) } elseif {$val == "-wait"} { while {!$_listShowing($this)} { tkwait variable [itcl::scope _listShowing($this)] } return } set _listShowing($this) $val } # ------------------------------------------------------ # PRIVATE METHOD: _slbListbox # # Access the tk listbox window out of the scrolledlistbox. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_slbListbox {} { return [$itk_component(list) component listbox] } # ------------------------------------------------------ # PRIVATE METHOD: _stateSelect # # only allows a B1 release in the listbox to have an effect if -state is # normal. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_stateSelect {} { switch -- $itk_option(-state) { normal { [itcl::code $this _selectCmd] } } } # ------------------------------------------------------ # PRIVATE METHOD: _bs # # A part of the auto-completion code, this function sets a flag when the # Backspace key is hit and there is a selection in the entry field. # Note that it's probably buggy to assume that a selection being present # means that that selection came from auto-completion. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_bs {} { # # exit if completion is turned off # switch -- $itk_option(-completion) { 0 - no - false - off { return } } # # critical section flag. it ain't perfect, but for most usage it'll # keep us from being in this code "twice" at the same time # (auto-repeated keystrokes are a pain!) # if {$_inbs} { return } else { set _inbs 1 } # # set the _doit flag if there is a selection set in the entry field # set _doit 0 if [$itk_component(entry) selection present] { set _doit 1 } # # clear the semaphore and return # set _inbs 0 } # ------------------------------------------------------ # PRIVATE METHOD: _lookup # # handles auto-completion of text typed (or insert'd) into the entry field. # # ------------------------------------------------------ itcl::body iwidgets::Combobox::_lookup {key} { # # Don't process auto-completion stuff if navigation key was released # Fixes SF bug 501300 # if {$_next_prevFLAG} { set _next_prevFLAG 0 return } # # exit if completion is turned off # switch -- $itk_option(-completion) { 0 - no - false - off { return } } # # critical section flag. it ain't perfect, but for most usage it'll # keep us from being in this code "twice" at the same time # (auto-repeated keystrokes are a pain!) # if {$_inlookup} { return } else { set _inlookup 1 } # # if state of megawidget is disabled, or the entry is not editable, # clear the semaphore and exit # if {$itk_option(-state) == "disabled" \ || [lsearch {on 1 true yes} $itk_option(-editable)] == -1} { set _inlookup 0 return } # # okay, *now* we can get to work # the _bs function is called on keyPRESS of BackSpace, and will set # the _doit flag if there's a selection set in the entryfield. If # there is, we're assuming that it's generated by completion itself # (this is probably a Bad Assumption), so we'll want to whack the # selected text, as well as the character immediately preceding the # insertion cursor. # if {$key == "BackSpace"} { if {$_doit} { set first [expr {[$itk_component(entry) index insert] -1}] $itk_component(entry) delete $first end $itk_component(entry) icursor $first } } # # get the text left in the entry field, and its length. if # zero-length, clear the selection in the listbox, clear the # semaphore, and boogie. # set text [get] set len [string length $text] if {$len == 0} { $itk_component(list) selection clear 0 end set _inlookup 0 return } # No need to do lookups for Shift keys or Arrows. The up/down # arrow keys should walk up/down the listbox entries. switch $key { Shift_L - Shift_R - Up - Down - Left - Right { set _inlookup 0 return } default { } } # Added by csmith 12/11/01 to resolve SF ticket #474817. It's an unusual # circumstance, but we need to make sure the character passed into this # method matches the last character in the entry's text string. It's # possible to type fast enough that the _lookup method gets invoked # *after* multiple characters have been typed and *before* the first # character has been processed. For example, you can type "bl" very # quickly, and by the time the interpreter processes "b", the "l" has # already been placed in the entry field. This causes problems as noted # in the SF ticket. # # Thus, if the character currently being processed does not match the # last character in the entry field, reset the _inlookup flag and return. # Also, note that we're only concerned with single characters here, not # keys such as backspace, delete, etc. if {$key != [string range $text end end] && [string match ? $key]} { set _inlookup 0 return } # # okay, so we have to do a lookup. find the first match in the # listbox to the text we've got in the entry field (glob). # if one exists, clear the current listbox selection, and set it to # the one we just found, making that one visible in the listbox. # then, pick off the text from the listbox entry that hadn't yet been # entered into the entry field. we need to tack that text onto the # end of the entry field, select it, and then set the insertion cursor # back to just before the point where we just added that text. # if one didn't exist, then just clear the listbox selection # set item [lsearch [$itk_component(list) get 0 end] "$text*" ] if {$item != -1} { $itk_component(list) selection clear 0 end $itk_component(list) selection set $item $item see $item set remainder [string range [$itk_component(list) get $item] $len end] $itk_component(entry) insert end $remainder $itk_component(entry) selection range $len end $itk_component(entry) icursor $len } else { $itk_component(list) selection clear 0 end } # # clear the semaphore and return # set _inlookup 0 return } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/dateentry.itk����������������������������������������������������������������0000644�0036047�0045461�00000036652�07616310545�016075� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Dateentry # ---------------------------------------------------------------------- # Implements a quicken style date entry field with a popup calendar # by combining the datefield and calendar widgets together. This # allows a user to enter the date via the keyboard or by using the # mouse by selecting the calendar icon which brings up a popup calendar. # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts E-mail: mulferts@austin.dsccc.com # # @(#) $Id: dateentry.itk,v 1.7 2003/01/30 20:56:05 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # ---------------------------------------------------------------------- # # Modified 2001-10-23 by Mark Alston to pass options to the datefield # constructor. Needed to allow use of new option -int which lets the # user use dates in YYYY-MM-DD format as well as MM/DD/YYYY format. # # option -int yes sets dates to YYYY-MM-DD format # -int no sets dates to MM/DD/YYYY format. # # ---------------------------------------------------------------------- # # Usual options. # itk::usual Dateentry { keep -background -borderwidth -currentdatefont -cursor \ -datefont -dayfont -foreground -highlightcolor \ -highlightthickness -labelfont -textbackground -textfont \ -titlefont -int } # ------------------------------------------------------------------ # DATEENTRY # ------------------------------------------------------------------ itcl::class iwidgets::Dateentry { inherit iwidgets::Datefield constructor {args} { eval Datefield::constructor $args } {} itk_option define -grab grab Grab "global" itk_option define -icon icon Icon {} # # The calendar widget isn't created until needed, yet we need # its options to be available upon creation of a dateentry widget. # So, we'll define them in these class now so they can just be # propagated onto the calendar later. # itk_option define -days days Days {Su Mo Tu We Th Fr Sa} itk_option define -forwardimage forwardImage Image {} itk_option define -backwardimage backwardImage Image {} itk_option define -weekdaybackground weekdayBackground Background \#d9d9d9 itk_option define -weekendbackground weekendBackground Background \#d9d9d9 itk_option define -outline outline Outline \#d9d9d9 itk_option define -buttonforeground buttonForeground Foreground blue itk_option define -foreground foreground Foreground black itk_option define -selectcolor selectColor Foreground red itk_option define -selectthickness selectThickness SelectThickness 3 itk_option define -titlefont titleFont Font \ -*-helvetica-bold-r-normal--*-140-* itk_option define -dayfont dayFont Font \ -*-helvetica-medium-r-normal--*-120-* itk_option define -datefont dateFont Font \ -*-helvetica-medium-r-normal--*-120-* itk_option define -currentdatefont currentDateFont Font \ -*-helvetica-bold-r-normal--*-120-* itk_option define -startday startDay Day sunday itk_option define -height height Height 165 itk_option define -width width Width 200 itk_option define -state state State normal protected { method _getPopupDate {date} method _releaseGrab {} method _releaseGrabCheck {rootx rooty} method _popup {} method _getDefaultIcon {} common _defaultIcon "" } } # # Provide a lowercased access method for the dateentry class. # proc ::iwidgets::dateentry {pathName args} { uplevel ::iwidgets::Dateentry $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Dateentry::constructor {args} { # # Create an icon label to act as a button to bring up the # calendar popup. # itk_component add iconbutton { label $itk_interior.iconbutton -relief raised } { keep -borderwidth -cursor -foreground } grid $itk_component(iconbutton) -row 0 -column 0 -sticky ns # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -icon # # Specifies the calendar icon image to be used in the date. # Should one not be provided, then a default pixmap will be used # if possible, bitmap otherwise. # ------------------------------------------------------------------ itcl::configbody iwidgets::Dateentry::icon { if {$itk_option(-icon) == {}} { $itk_component(iconbutton) configure -image [_getDefaultIcon] } else { if {[lsearch [image names] $itk_option(-icon)] == -1} { error "bad icon option \"$itk_option(-icon)\":\ should be an existing image" } else { $itk_component(iconbutton) configure -image $itk_option(-icon) } } } # ------------------------------------------------------------------ # OPTION: -grab # # Specifies the grab level, local or global, to be obtained when # bringing up the popup calendar. The default is global. # ------------------------------------------------------------------ itcl::configbody iwidgets::Dateentry::grab { switch -- $itk_option(-grab) { "local" - "global" {} default { error "bad grab option \"$itk_option(-grab)\":\ should be local or global" } } } # ------------------------------------------------------------------ # OPTION: -state # # Specifies the state of the widget which may be disabled or # normal. A disabled state prevents selection of the date field # or date icon button. # ------------------------------------------------------------------ itcl::configbody iwidgets::Dateentry::state { switch -- $itk_option(-state) { normal { bind $itk_component(iconbutton) <Button-1> [itcl::code $this _popup] } disabled { bind $itk_component(iconbutton) <Button-1> {} } } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # PROTECTED METHOD: _getDefaultIcon # # This method is invoked uto retrieve the name of the default icon # image displayed in the icon button. # ------------------------------------------------------------------ itcl::body iwidgets::Dateentry::_getDefaultIcon {} { if {[lsearch [image types] pixmap] != -1} { set _defaultIcon [image create pixmap -data { /* XPM */ static char *calendar[] = { /* width height num_colors chars_per_pixel */ " 25 20 6 1", /* colors */ ". c #808080", "# c #040404", "a c #848484", "b c #fc0404", "c c #fcfcfc", "d c #c0c0c0", /* pixels */ "d##########d###########dd", "d#ccccccccc##ccccccccca#d", "##ccccccccc.#ccccccccc..#", "##cccbbcccca#cccbbbccca.#", "##cccbbcccc.#ccbbbbbcc..#", "##cccbbccc####ccccbbcc..#", "##cccbbcccca#ccccbbbcca.#", "##cccbbcccc.#cccbbbccc..#", "##cccbbcccca#ccbbbcccca.#", "##cccbbbccc.#ccbbbbbcc..#", "##ccccccccc.#ccccccccc..#", "##ccccccccca#ccccccccca.#", "##cc#####c#cd#c#####cc..#", "##cccccccc####cccccccca.#", "##cc#####cc.#cc#####cc..#", "##ccccccccc.#ccccccccc..#", "##ccccccccc.#ccccccccc..#", "##..........#...........#", "###..........#..........#", "#########################" }; }] } else { set _defaultIcon [image create bitmap -data { #define calendr2_width 25 #define calendr2_height 20 static char calendr2_bits[] = { 0xfe,0xf7,0x7f,0xfe,0x02,0x18,0xc0,0xfe,0x03, 0x18,0x80,0xff,0x63,0x10,0x47,0xff,0x43,0x98, 0x8a,0xff,0x63,0x3c,0x4c,0xff,0x43,0x10,0x8a, 0xff,0x63,0x18,0x47,0xff,0x23,0x90,0x81,0xff, 0xe3,0x98,0x4e,0xff,0x03,0x10,0x80,0xff,0x03, 0x10,0x40,0xff,0xf3,0xa5,0x8f,0xff,0x03,0x3c, 0x40,0xff,0xf3,0x99,0x8f,0xff,0x03,0x10,0x40, 0xff,0x03,0x18,0x80,0xff,0x57,0x55,0x55,0xff, 0x57,0xb5,0xaa,0xff,0xff,0xff,0xff,0xff}; }] } # # Since this image will only need to be created once, we redefine # this method to just return the image name for subsequent calls. # itcl::body ::iwidgets::Dateentry::_getDefaultIcon {} { return $_defaultIcon } return $_defaultIcon } # ------------------------------------------------------------------ # PROTECTED METHOD: _popup # # This method is invoked upon selection of the icon button. It # creates a calendar widget within a toplevel popup, calculates # the position at which to display the calendar, performs a grab # and displays the calendar. # ------------------------------------------------------------------ itcl::body iwidgets::Dateentry::_popup {} { # # First, let's nullify the icon binding so that any another # selections are ignored until were done with this one. Next, # change the relief of the icon. # bind $itk_component(iconbutton) <Button-1> {} $itk_component(iconbutton) configure -relief sunken # # Create a withdrawn toplevel widget and remove the window # decoration via override redirect. # itk_component add -private popup { toplevel $itk_interior.popup } $itk_component(popup) configure -borderwidth 2 -background black wm withdraw $itk_component(popup) wm overrideredirect $itk_component(popup) 1 # # Add a binding to button 1 events in order to detect mouse # clicks off the calendar in which case we'll release the grab. # Also add a binding for Escape to always release. # bind $itk_component(popup) <1> [itcl::code $this _releaseGrabCheck %X %Y] bind $itk_component(popup) <KeyPress-Escape> [itcl::code $this _releaseGrab] # # Create the calendar widget and set its cursor properly. # itk_component add calendar { iwidgets::Calendar $itk_component(popup).calendar \ -command [itcl::code $this _getPopupDate %d] \ -int $itk_option(-int) } { usual keep -days -forwardimage -backwardimage -weekdaybackground \ -weekendbackground -outline -buttonforeground -selectcolor \ -selectthickness -titlefont -dayfont -datefont \ -currentdatefont -startday -width -height } grid $itk_component(calendar) -row 0 -column 0 $itk_component(calendar) configure -cursor top_left_arrow # # The icon button will be used as the basis for the position of the # popup on the screen. We'll always attempt to locate the popup # off the lower right corner of the button. If that would put # the popup off the screen, then we'll put above the upper left. # set rootx [winfo rootx $itk_component(iconbutton)] set rooty [winfo rooty $itk_component(iconbutton)] set popupwidth [winfo reqwidth $itk_component(popup)] set popupheight [winfo reqheight $itk_component(popup)] set popupx [expr {$rootx + 3 + \ [winfo width $itk_component(iconbutton)]}] set popupy [expr {$rooty + 3 + \ [winfo height $itk_component(iconbutton)]}] if {(($popupx + $popupwidth) > [winfo screenwidth .]) || \ (($popupy + $popupheight) > [winfo screenheight .])} { set popupx [expr {$rootx - 3 - $popupwidth}] set popupy [expr {$rooty - 3 - $popupheight}] } # # Get the current date from the datefield widget and both # show and select it on the calendar. # # Added catch for bad dates. Calendar then shows current date. if [catch "$itk_component(calendar) show [get]" err] { $itk_component(calendar) show now $itk_component(calendar) select now } else { $itk_component(calendar) select [get] } # # Display the popup at the calculated position. # wm geometry $itk_component(popup) +$popupx+$popupy wm deiconify $itk_component(popup) tkwait visibility $itk_component(popup) # # Perform either a local or global grab based on the -grab option. # if {$itk_option(-grab) == "local"} { ::grab $itk_component(popup) } else { ::grab -global $itk_component(popup) } # # Make sure the widget is above all others and give it focus. # raise $itk_component(popup) focus $itk_component(calendar) } # ------------------------------------------------------------------ # PROTECTED METHOD: _popupGetDate # # This method is the callback for selection of a date on the # calendar. It releases the grab and sets the date in the # datefield widget. # ------------------------------------------------------------------ itcl::body iwidgets::Dateentry::_getPopupDate {date} { _releaseGrab show $date } # ------------------------------------------------------------------ # PROTECTED METHOD: _releaseGrabCheck rootx rooty # # This method handles mouse button 1 events. If the selection # occured within the bounds of the calendar, then return normally # and let the calendar handle the event. Otherwise, we'll drop # the calendar and release the grab. # ------------------------------------------------------------------ itcl::body iwidgets::Dateentry::_releaseGrabCheck {rootx rooty} { set calx [winfo rootx $itk_component(calendar)] set caly [winfo rooty $itk_component(calendar)] set calwidth [winfo reqwidth $itk_component(calendar)] set calheight [winfo reqheight $itk_component(calendar)] if {($rootx < $calx) || ($rootx > ($calx + $calwidth)) || \ ($rooty < $caly) || ($rooty > ($caly + $calheight))} { _releaseGrab return -code break } } # ------------------------------------------------------------------ # PROTECTED METHOD: _releaseGrab # # This method releases the grab, destroys the popup, changes the # relief of the button back to raised and reapplies the binding # to the icon button that engages the popup action. # ------------------------------------------------------------------ itcl::body iwidgets::Dateentry::_releaseGrab {} { ::grab release $itk_component(popup) $itk_component(iconbutton) configure -relief raised destroy $itk_component(popup) bind $itk_component(iconbutton) <Button-1> [itcl::code $this _popup] } ��������������������������������������������������������������������������������������iwidgets-4.1.0/generic/datefield.itk����������������������������������������������������������������0000644�0036047�0045461�00000105012�13112077712�015774� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Datefield # ---------------------------------------------------------------------- # Implements a date entry field with adjustable built-in intelligence # levels. # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts E-mail: mulferts@austin.dsccc.com # # @(#) $Id: datefield.itk,v 1.7 2017/05/26 19:19:38 dgp Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Datefield { keep -background -borderwidth -cursor -foreground -highlightcolor \ -highlightthickness -labelfont -textbackground -textfont } # ------------------------------------------------------------------ # DATEFIELD # ------------------------------------------------------------------ itcl::class iwidgets::Datefield { inherit iwidgets::Labeledwidget constructor {args} {} itk_option define -childsitepos childSitePos Position e itk_option define -command command Command {} itk_option define -iq iq Iq high itk_option define -gmt gmt GMT no itk_option define -int int DateFormat no public method get {{format "-string"}} public method isvalid {} public method show {{date now}} protected method _backward {} protected method _focusIn {} protected method _forward {} protected method _keyPress {char sym state} protected method _lastDay {month year} protected method _moveField {direction} protected method _setField {field} protected method _whichField {} protected variable _cfield "month" protected variable _fields {month day year} } # # Provide a lowercased access method for the datefield class. # proc ::iwidgets::datefield {pathName args} { uplevel ::iwidgets::Datefield $pathName $args } # # Use option database to override default resources of base classes. # option add *Datefield.justify center widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Datefield::constructor {args} { component hull configure -borderwidth 0 # # Create an entry field for entering the date. # itk_component add date { entry $itk_interior.date -width 10 } { keep -borderwidth -cursor -exportselection \ -foreground -highlightcolor -highlightthickness \ -insertbackground -justify -relief -state rename -font -textfont textFont Font rename -highlightbackground -background background Background rename -background -textbackground textBackground Background } # # Create the child site widget. # itk_component add -protected dfchildsite { frame $itk_interior.dfchildsite } set itk_interior $itk_component(dfchildsite) # # Add datefield event bindings for focus in and keypress events. # bind $itk_component(date) <FocusIn> [itcl::code $this _focusIn] bind $itk_component(date) <KeyPress> [itcl::code $this _keyPress %A %K %s] # # Disable some mouse button event bindings: # Button Motion # Double-Clicks # Triple-Clicks # Button2 # bind $itk_component(date) <Button1-Motion> break bind $itk_component(date) <Button2-Motion> break bind $itk_component(date) <Double-Button> break bind $itk_component(date) <Triple-Button> break bind $itk_component(date) <2> break # # Initialize the widget based on the command line options. # eval itk_initialize $args # # Initialize the date to the current date. # $itk_component(date) delete 0 end show now } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -childsitepos # # Specifies the position of the child site in the widget. Valid # locations are n, s, e, and w. # ------------------------------------------------------------------ itcl::configbody iwidgets::Datefield::childsitepos { set parent [winfo parent $itk_component(date)] switch $itk_option(-childsitepos) { n { grid $itk_component(dfchildsite) -row 0 -column 0 -sticky ew grid $itk_component(date) -row 1 -column 0 -sticky nsew grid rowconfigure $parent 0 -weight 0 grid rowconfigure $parent 1 -weight 1 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 } e { grid $itk_component(dfchildsite) -row 0 -column 1 -sticky ns grid $itk_component(date) -row 0 -column 0 -sticky nsew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 } s { grid $itk_component(dfchildsite) -row 1 -column 0 -sticky ew grid $itk_component(date) -row 0 -column 0 -sticky nsew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 } w { grid $itk_component(dfchildsite) -row 0 -column 0 -sticky ns grid $itk_component(date) -row 0 -column 1 -sticky nsew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid columnconfigure $parent 0 -weight 0 grid columnconfigure $parent 1 -weight 1 } default { error "bad childsite option\ \"$itk_option(-childsitepos)\":\ should be n, e, s, or w" } } } # ------------------------------------------------------------------ # OPTION: -command # # Command invoked upon detection of return key press event. # ------------------------------------------------------------------ itcl::configbody iwidgets::Datefield::command {} # ------------------------------------------------------------------ # OPTION: -iq # # Specifies the level of intelligence to be shown in the actions # taken by the date field during the processing of keypress events. # Valid settings include high, average, and low. With a high iq, # the date prevents the user from typing in an invalid date. For # example, if the current date is 05/31/1997 and the user changes # the month to 04, then the day will be instantly modified for them # to be 30. In addition, leap years are fully taken into account. # With average iq, the month is limited to the values of 01-12, but # it is possible to type in an invalid day. A setting of low iq # instructs the widget to do no validity checking at all during # date entry. With both average and low iq levels, it is assumed # that the validity will be determined at a later time using the # date's isvalid command. # ------------------------------------------------------------------ itcl::configbody iwidgets::Datefield::iq { switch $itk_option(-iq) { high - average - low { } default { error "bad iq option \"$itk_option(-iq)\":\ should be high, average or low" } } } # ------------------------------------------------------------------ # OPTION: -int # # Added by Mark Alston 2001/10/21 # # Allows for the use of dates in "international" format: YYYY-MM-DD. # It must be a boolean value. # ------------------------------------------------------------------ itcl::configbody iwidgets::Datefield::int { switch $itk_option(-int) { 1 - yes - true - on { set _cfield "year" set _fields {year month day} } 0 - no - false - off { } default { error "bad int option \"$itk_option(-int)\": should be boolean" } } show [get] } # ------------------------------------------------------------------ # OPTION: -gmt # # This option is used for GMT time. Must be a boolean value. # ------------------------------------------------------------------ itcl::configbody iwidgets::Datefield::gmt { switch $itk_option(-gmt) { 0 - no - false - off { } 1 - yes - true - on { } default { error "bad gmt option \"$itk_option(-gmt)\": should be boolean" } } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # PUBLIC METHOD: get ?format? # # Return the current contents of the datefield in one of two formats # string or as an integer clock value using the -string and -clicks # options respectively. The default is by string. Reference the # clock command for more information on obtaining dates and their # formats. # ------------------------------------------------------------------ itcl::body iwidgets::Datefield::get {{format "-string"}} { set datestr [$itk_component(date) get] switch -- $format { "-string" { return $datestr } "-clicks" { return [clock scan $datestr] } default { error "bad format option \"$format\":\ should be -string or -clicks" } } } # ------------------------------------------------------------------ # PUBLIC METHOD: show date # # Changes the currently displayed date to be that of the date # argument. The date may be specified either as a string or an # integer clock value. Reference the clock command for more # information on obtaining dates and their formats. # ------------------------------------------------------------------ itcl::body iwidgets::Datefield::show {{date "now"}} { $itk_component(date) delete 0 end if {$itk_option(-int)} { set format {%Y-%m-%d} } else { set format {%m/%d/%Y} } if {$date == "now"} { set seconds [::clock seconds] $itk_component(date) insert end \ [clock format $seconds -format "$format" -gmt $itk_option(-gmt)] } elseif { $itk_option(-iq) != "low" } { if {[catch {::clock format $date}] == 0} { set seconds $date } elseif {[catch {set seconds [::clock scan $date -gmt \ $itk_option(-gmt)]}] != 0} { error "bad date: \"$date\", must be a valid date\ string, clock clicks value or the keyword now" } $itk_component(date) insert end \ [clock format $seconds -format "$format" -gmt $itk_option(-gmt)] } else { # Note that it doesn't matter what -int is set to. $itk_component(date) insert end $date } if {$itk_option(-int)} { _setField year } else { _setField month } return } # ------------------------------------------------------------------ # PUBLIC METHOD: isvalid # # Returns a boolean indication of the validity of the currently # displayed date value. For example, 3/3/1960 is valid whereas # 02/29/1997 is invalid. # ------------------------------------------------------------------ itcl::body iwidgets::Datefield::isvalid {} { set date [$itk_component(date) get] if {[package vsatisfies [package provide Tcl] 8.5]} { if {$itk_option(-int)} { set format {%Y-%m-%d} } else { set format {%m/%d/%Y} } return [string equal $date \ [clock format [clock scan $date -format $format] -format $format]] } return [expr {![catch {clock scan $date}]}] } # ------------------------------------------------------------------ # PROTECTED METHOD: _focusIn # # This method is bound to the <FocusIn> event. It resets the # insert cursor and field settings to be back to their last known # positions. # ------------------------------------------------------------------ itcl::body iwidgets::Datefield::_focusIn {} { _setField $_cfield } # ------------------------------------------------------------------ # PROTECTED METHOD: _keyPress # # This method is the workhorse of the class. It is bound to the # <KeyPress> event and controls the processing of all key strokes. # ------------------------------------------------------------------ itcl::body iwidgets::Datefield::_keyPress {char sym state} { # # Determine which field we are in currently. This is needed # since the user may have moved to this position via a mouse # selection and so it would not be in the position we last # knew it to be. # _whichField # # If we are using an international date the split char is "-" # otherwise it is "/". # if {$itk_option(-int)} { set split_char "-" } else { set split_char "/" } # # Set up a few basic variables we'll be needing throughout the # rest of the method such as the position of the insert cursor # and the currently displayed day, month, and year. # set icursor [$itk_component(date) index insert] set splist [split [$itk_component(date) get] "$split_char"] # A bunch of added variables to allow for the use of int dates if {$itk_option(-int)} { set order {year month day} set year [lindex $splist 0] set month [lindex $splist 1] set day [lindex $splist 2] set year_start_pos 0 set year_second_pos 1 set year_third_pos 2 set year_fourth_pos 3 set year_end_pos 4 set month_start_pos 5 set month_second_pos 6 set month_end_pos 7 set day_start_pos 8 set day_second_pos 9 set day_end_pos 10 } else { set order {month day year} set month [lindex $splist 0] set day [lindex $splist 1] set year [lindex $splist 2] set month_start_pos 0 set month_second_pos 1 set month_end_pos 2 set day_start_pos 3 set day_second_pos 4 set day_end_pos 5 set year_start_pos 6 set year_second_pos 7 set year_third_pos 8 set year_fourth_pos 9 set year_end_pos 10 } # # Process numeric keystrokes. This involes a fair amount of # processing with step one being to check and make sure we # aren't attempting to insert more that 10 characters. If # so ring the bell and break. # if {[string match {[0-9]} $char]} { if {[$itk_component(date) index insert] == 10} { bell return -code break } # # If we are currently in the month field then we process the # number entered based on the cursor position. If we are at # at the first position and our iq is low, then accept any # input. # if {$_cfield == "month"} { if {[$itk_component(date) index insert] == $month_start_pos} { if {$itk_option(-iq) == "low"} { $itk_component(date) delete $month_start_pos $itk_component(date) insert $month_start_pos $char } else { # # Otherwise, we're slightly smarter. If the number # is less than two insert it at position zero. If # this makes the month greater than twelve, set the # number at position one to zero which makes in # effect puts the month back in range. # regsub {([0-9])([0-9])} $month "$char\\2" month2b if {$char < 2} { $itk_component(date) delete $month_start_pos $itk_component(date) insert $month_start_pos $char if {$month2b > 12} { $itk_component(date) delete $month_second_pos $itk_component(date) insert $month_second_pos 0 $itk_component(date) icursor $month_second_pos } elseif {$month2b == "00"} { $itk_component(date) delete $month_second_pos $itk_component(date) insert $month_second_pos 1 $itk_component(date) icursor $month_second_pos } # # Finally, if the number is greater than one we'll # assume that they really mean to be entering a zero # followed by their number, do so for them, and # proceed to skip to the next field which is the # day field. # } else { $itk_component(date) delete $month_start_pos $month_end_pos $itk_component(date) insert $month_start_pos 0$char _setField day } } # # Else, we're at the second month position. Again, if we aren't # too smart, let them enter anything. Otherwise, if the # number makes the month exceed twelve, set the month to # zero followed by their number to get it back into range. # } else { regsub {([0-9])([0-9])} $month "\\1$char" month2b if {$itk_option(-iq) == "low"} { $itk_component(date) delete $month_second_pos $itk_component(date) insert $month_second_pos $char } else { if {$month2b > 12} { $itk_component(date) delete $month_start_pos $month_end_pos $itk_component(date) insert $month_start_pos 0$char } elseif {$month2b == "00"} { bell return -code break } else { $itk_component(date) delete $month_second_pos $itk_component(date) insert $month_second_pos $char } } _setField day } # # Now, the month processing is complete and if we're of a # high level of intelligence, then we'll make sure that the # current value for the day is valid for this month. If # it is beyond the last day for this month, change it to # be the last day of the new month. # if {$itk_option(-iq) == "high"} { set splist [split [$itk_component(date) get] "$split_char"] set month [lindex $splist [lsearch $order month]] if {$day > [set endday [_lastDay $month $year]]} { set icursor [$itk_component(date) index insert] $itk_component(date) delete $day_start_pos $day_end_pos $itk_component(date) insert $day_start_pos $endday $itk_component(date) icursor $icursor } } # # Finally, return with a code of break to stop any normal # processing in that we've done all that is necessary. # return -code break } # # This next block of code is for processing of the day field # which is quite similar is strategy to that of the month. # if {$_cfield == "day"} { if {$itk_option(-iq) == "high"} { set endofMonth [_lastDay $month $year] } else { set endofMonth 31 } # # If we are at the first cursor position for the day # we are processing # the first character of the day field. If we have an iq # of low accept any input. # if {[$itk_component(date) index insert] == $day_start_pos} { if {$itk_option(-iq) == "low"} { $itk_component(date) delete $day_start_pos $itk_component(date) insert $day_start_pos $char } else { # # If the day to be is double zero, then make the # day be the first. # regsub {([0-9])([0-9])} $day "$char\\2" day2b if {$day2b == "00"} { $itk_component(date) delete $day_start_pos $day_end_pos $itk_component(date) insert $day_start_pos 01 $itk_component(date) icursor $day_second_pos # # Otherwise, if the character is less than four # and the month is not Feburary, insert the number # and if this makes the day be beyond the valid # range for this month, than set to be back in # range. # } elseif {($char < 4) && ($month != "02")} { $itk_component(date) delete $day_start_pos $itk_component(date) insert $day_start_pos $char if {$day2b > $endofMonth} { $itk_component(date) delete $day_second_pos $itk_component(date) insert $day_second_pos 0 $itk_component(date) icursor $day_second_pos } # # For Feburary with a number to be entered of # less than three, make sure the number doesn't # make the day be greater than the correct range # and if so adjust the input. # } elseif {$char < 3} { $itk_component(date) delete $day_start_pos $itk_component(date) insert $day_start_pos $char if {$day2b > $endofMonth} { $itk_component(date) delete $day_start_pos $day_end_pos $itk_component(date) insert $day_start_pos $endofMonth $itk_component(date) icursor $day_second_pos } # # Finally, if the number is greater than three, # set the day to be zero followed by the number # entered and proceed to the year field or end. # } else { $itk_component(date) delete $day_start_pos $day_end_pos $itk_component(date) insert $day_start_pos 0$char $itk_component(date) icursor $day_end_pos if {!$itk_option(-int)} { _setField year } } } # # Else, we're dealing with the second number in the day # field. If we're not too bright accept anything, otherwise # if the day is beyond the range for this month or equal to # zero then ring the bell. # } else { regsub {([0-9])([0-9])} $day "\\1$char" day2b if {($itk_option(-iq) != "low") && \ (($day2b > $endofMonth) || ($day2b == "00"))} { bell } else { $itk_component(date) delete $day_second_pos $itk_component(date) insert $day_second_pos $char $itk_component(date) icursor $day_end_pos if {!$itk_option(-int)} { _setField year } } } # # Return with a code of break to prevent normal processing. # return -code break } # # This month and day we're tough, the code for the year is # comparitively simple. Accept any input and if we are really # sharp, then make sure the day is correct for the month # given the year. In short, handle leap years. # if {$_cfield == "year"} { if {$itk_option(-iq) == "low"} { $itk_component(date) delete $icursor $itk_component(date) insert $icursor $char } else { set prevdate [get] if {[$itk_component(date) index insert] == $year_start_pos} { set yrdgt [lindex [split [lindex \ [split $prevdate "$split_char"] [lsearch $order year]] ""] 0] if {$char != $yrdgt} { if {$char == 1} { $itk_component(date) delete $icursor $year_end_pos $itk_component(date) insert $icursor 1999 } elseif {$char == 2} { $itk_component(date) delete $icursor $year_end_pos $itk_component(date) insert $icursor 2000 } else { bell return -code break } } $itk_component(date) icursor $year_second_pos return -code break } $itk_component(date) delete $icursor $itk_component(date) insert $icursor $char if {[catch {clock scan [get]}] != 0} { $itk_component(date) delete $year_start_pos $year_end_pos $itk_component(date) insert $year_start_pos \ [lindex [split $prevdate "$split_char"] [lsearch $order year]] $itk_component(date) icursor $icursor bell return -code break } if {$itk_option(-iq) == "high"} { set splist [split [$itk_component(date) get] "$split_char"] set year [lindex $splist [lsearch $order year]] if {$day > [set endday [_lastDay $month $year]]} { set icursor [$itk_component(date) index insert] $itk_component(date) delete $day_start_pos $day_end_pos $itk_component(date) insert $day_start_pos $endday $itk_component(date) icursor $icursor } } } if {$itk_option(-int)} { if {$icursor == $year_fourth_pos } { _setField month } } return -code break } # # Process the plus and the up arrow keys. They both yeild the same # effect, they increment the day by one. # } elseif {($sym == "plus") || ($sym == "Up")} { if {[catch {show [clock scan "1 day" -base [get -clicks]]}] != 0} { bell } return -code break # # Process the minus and the down arrow keys which decrement the day. # } elseif {($sym == "minus") || ($sym == "Down")} { if {[catch {show [clock scan "-1 day" -base [get -clicks]]}] != 0} { bell } return -code break # # A tab key moves the day/month/year (or year/month/day) field # forward by one unless # the current field is the last field. In that case we'll let tab # do what is supposed to and pass the focus onto the next widget. # } elseif {($sym == "Tab") && ($state == 0)} { if {$_cfield != "[lindex $order 2]"} { _moveField forward return -code break } else { _setField "[lindex $order 0]" return -code continue } # # A ctrl-tab key moves the day/month/year field backwards by one # unless the current field is the the first field. In that case we'll # let tab take the focus to a previous widget. # } elseif {($sym == "Tab") && ($state == 4)} { if {$_cfield != "[lindex $order 0]"} { _moveField backward return -code break } else { set _cfield "[lindex $order 0]" return -code continue } # # A right arrow key moves the insert cursor to the right one. # } elseif {$sym == "Right"} { _forward return -code break # # A left arrow, backspace, or delete key moves the insert cursor # to the left one. This is what you expect for the left arrow # and since the whole widget always operates in overstrike mode, # it makes the most sense for backspace and delete to do the same. # } elseif {$sym == "Left" || $sym == "BackSpace" || $sym == "Delete"} { _backward return -code break } elseif {($sym == "Control_L") || ($sym == "Shift_L") || \ ($sym == "Control_R") || ($sym == "Shift_R")} { return -code break # # A Return key invokes the optionally specified command option. # } elseif {$sym == "Return"} { uplevel #0 $itk_option(-command) return -code break } else { bell return -code break } } # ------------------------------------------------------------------ # PROTECTED METHOD: _setField field # # Internal method which adjusts the field to be that of the # argument, setting the insert cursor appropriately. # ------------------------------------------------------------------ itcl::body iwidgets::Datefield::_setField {field} { set _cfield $field if {$itk_option(-int)} { set year_pos 2 set month_pos 5 set day_pos 8 } else { set month_pos 0 set day_pos 3 set year_pos 8 } switch $field { "month" { $itk_component(date) icursor $month_pos } "day" { $itk_component(date) icursor $day_pos } "year" { $itk_component(date) icursor $year_pos } default { error "bad field: \"$field\", must be month, day or year" } } } # ------------------------------------------------------------------ # PROTECTED METHOD: _moveField # # Internal method for moving the field forward or backward by one. # ------------------------------------------------------------------ itcl::body iwidgets::Datefield::_moveField {direction} { set index [lsearch $_fields $_cfield] if {$direction == "forward"} { set newIndex [expr {$index + 1}] } else { set newIndex [expr {$index - 1}] } if {$newIndex == [llength $_fields]} { set newIndex 0 } if {$newIndex < 0} { set newIndex [expr {[llength $_fields] - 1}] } _setField [lindex $_fields $newIndex] return } # ------------------------------------------------------------------ # PROTECTED METHOD: _whichField # # Internal method which returns the current field that the cursor # is currently within. # ------------------------------------------------------------------ itcl::body iwidgets::Datefield::_whichField {} { set icursor [$itk_component(date) index insert] if {$itk_option(-int)} { switch $icursor { 0 - 1 - 2 - 3 { set _cfield "year" } 5 - 6 { set _cfield "month" } 8 - 9 { set _cfield "day" } } } else { switch $icursor { 0 - 1 { set _cfield "month" } 3 - 4 { set _cfield "day" } 6 - 7 - 8 - 9 { set _cfield "year" } } } } # ------------------------------------------------------------------ # PROTECTED METHOD: _forward # # Internal method which moves the cursor forward by one character # jumping over the slashes and wrapping. # ------------------------------------------------------------------ itcl::body iwidgets::Datefield::_forward {} { set icursor [$itk_component(date) index insert] if {$itk_option(-int)} { switch $icursor { 3 { _setField month } 6 { _setField day } 9 - 10 { _setField year } default { $itk_component(date) icursor [expr {$icursor + 1}] } } } else { switch $icursor { 1 { _setField day } 4 { _setField year } 9 - 10 { _setField month } default { $itk_component(date) icursor [expr {$icursor + 1}] } } } } # ------------------------------------------------------------------ # PROTECTED METHOD: _backward # # Internal method which moves the cursor backward by one character # jumping over the slashes and wrapping. # ------------------------------------------------------------------ itcl::body iwidgets::Datefield::_backward {} { set icursor [$itk_component(date) index insert] if {$itk_option(-int)} { switch $icursor { 8 { _setField month } 5 { _setField year } 0 { _setField day } default { $itk_component(date) icursor [expr {$icursor -1}] } } } else { switch $icursor { 6 { _setField day } 3 { _setField month } 0 { _setField year } default { $itk_component(date) icursor [expr {$icursor -1}] } } } } # ------------------------------------------------------------------ # PROTECTED METHOD: _lastDay month year # # Internal method which determines the last day of the month for # the given month and year. # ------------------------------------------------------------------ itcl::body iwidgets::Datefield::_lastDay {month year} { scan $month %d month scan $year %d year incr year [expr {$month/12}] incr month return [clock format \ [clock scan "-1 day" -base [clock scan $month/1/$year]] -format %d] } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/dialog.itk�������������������������������������������������������������������0000644�0036047�0045461�00000006773�07334043777�015345� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Dialog # ---------------------------------------------------------------------- # Implements a standard dialog box providing standard buttons and a # child site for use in derived classes. The buttons include ok, apply, # cancel, and help. Options exist to configure the buttons. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: dialog.itk,v 1.2 2001/08/07 19:56:47 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Dialog { keep -background -cursor -foreground -modality } # ------------------------------------------------------------------ # DIALOG # ------------------------------------------------------------------ itcl::class iwidgets::Dialog { inherit iwidgets::Dialogshell constructor {args} {} } # # Provide a lowercased access method for the Dialog class. # proc ::iwidgets::dialog {pathName args} { uplevel ::iwidgets::Dialog $pathName $args } # # Use option database to override default resources of base classes. # option add *Dialog.master "." widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Dialog::constructor {args} { # # Add the standard buttons: OK, Apply, Cancel, and Help, making # OK be the default button. # add OK -text OK -command [itcl::code $this deactivate 1] add Apply -text Apply add Cancel -text Cancel -command [itcl::code $this deactivate 0] add Help -text Help default OK # # Bind the window manager delete protocol to invocation of the # cancel button. This can be overridden by the user via the # execution of a similar command outside the class. # wm protocol $itk_component(hull) WM_DELETE_WINDOW \ [itcl::code $this invoke Cancel] # # Initialize the widget based on the command line options. # eval itk_initialize $args } �����iwidgets-4.1.0/generic/dialogshell.itk��������������������������������������������������������������0000644�0036047�0045461�00000030716�07336540042�016354� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Dialogshell # ---------------------------------------------------------------------- # This class is implements a dialog shell which is a top level widget # composed of a button box, separator, and child site area. The class # also has methods to control button construction. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: dialogshell.itk,v 1.3 2001/08/15 18:32:02 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Dialogshell { keep -background -cursor -foreground -modality } # ------------------------------------------------------------------ # DIALOGSHELL # ------------------------------------------------------------------ itcl::class iwidgets::Dialogshell { inherit iwidgets::Shell constructor {args} {} itk_option define -thickness thickness Thickness 3 itk_option define -buttonboxpos buttonBoxPos Position s itk_option define -separator separator Separator on itk_option define -padx padX Pad 10 itk_option define -pady padY Pad 10 public method childsite {} public method index {args} public method add {args} public method insert {args} public method delete {args} public method hide {args} public method show {args} public method default {args} public method invoke {args} public method buttonconfigure {args} public method buttoncget {index option} } # # Provide a lowercased access method for the Dialogshell class. # proc ::iwidgets::dialogshell {pathName args} { uplevel ::iwidgets::Dialogshell $pathName $args } # # Use option database to override default resources of base classes. # option add *Dialogshell.master "." widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Dialogshell::constructor {args} { itk_option remove iwidgets::Shell::padx iwidgets::Shell::pady # # Create the user child site, separator, and button box, # itk_component add -protected dschildsite { frame $itk_interior.dschildsite } itk_component add separator { frame $itk_interior.separator -relief sunken } itk_component add bbox { iwidgets::Buttonbox $itk_interior.bbox } { usual rename -padx -buttonboxpadx buttonBoxPadX Pad rename -pady -buttonboxpady buttonBoxPadY Pad } # # Set the itk_interior variable to be the childsite for derived # classes. # set itk_interior $itk_component(dschildsite) # # Set up the default button so that if <Return> is pressed in # any widget, it will invoke the default button. # bind $itk_component(hull) <Return> [itcl::code $this invoke] # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -thickness # # Specifies the thickness of the separator. It sets the width and # height of the separator to the thickness value and the borderwidth # to half the thickness. # ------------------------------------------------------------------ itcl::configbody iwidgets::Dialogshell::thickness { $itk_component(separator) config -height $itk_option(-thickness) $itk_component(separator) config -width $itk_option(-thickness) $itk_component(separator) config \ -borderwidth [expr {$itk_option(-thickness) / 2}] } # ------------------------------------------------------------------ # OPTION: -buttonboxpos # # Specifies the position of the button box relative to the child site. # The separator appears between the child site and button box. # ------------------------------------------------------------------ itcl::configbody iwidgets::Dialogshell::buttonboxpos { set parent [winfo parent $itk_component(bbox)] switch $itk_option(-buttonboxpos) { n { $itk_component(bbox) configure -orient horizontal grid $itk_component(bbox) -row 0 -column 0 -sticky ew grid $itk_component(separator) -row 1 -column 0 -sticky ew grid $itk_component(dschildsite) -row 2 -column 0 -sticky nsew grid rowconfigure $parent 0 -weight 0 grid rowconfigure $parent 1 -weight 0 grid rowconfigure $parent 2 -weight 1 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 grid columnconfigure $parent 2 -weight 0 } s { $itk_component(bbox) configure -orient horizontal grid $itk_component(dschildsite) -row 0 -column 0 -sticky nsew grid $itk_component(separator) -row 1 -column 0 -sticky ew grid $itk_component(bbox) -row 2 -column 0 -sticky ew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid rowconfigure $parent 2 -weight 0 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 grid columnconfigure $parent 2 -weight 0 } w { $itk_component(bbox) configure -orient vertical grid $itk_component(bbox) -row 0 -column 0 -sticky ns grid $itk_component(separator) -row 0 -column 1 -sticky ns grid $itk_component(dschildsite) -row 0 -column 2 -sticky nsew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid rowconfigure $parent 2 -weight 0 grid columnconfigure $parent 0 -weight 0 grid columnconfigure $parent 1 -weight 0 grid columnconfigure $parent 2 -weight 1 } e { $itk_component(bbox) configure -orient vertical grid $itk_component(dschildsite) -row 0 -column 0 -sticky nsew grid $itk_component(separator) -row 0 -column 1 -sticky ns grid $itk_component(bbox) -row 0 -column 2 -sticky ns grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid rowconfigure $parent 2 -weight 0 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 grid columnconfigure $parent 2 -weight 0 } default { error "bad buttonboxpos option\ \"$itk_option(-buttonboxpos)\": should be n,\ s, e, or w" } } } # ------------------------------------------------------------------ # OPTION: -separator # # Boolean option indicating wheather to display the separator. # ------------------------------------------------------------------ itcl::configbody iwidgets::Dialogshell::separator { if {$itk_option(-separator)} { $itk_component(separator) configure -relief sunken } else { $itk_component(separator) configure -relief flat } } # ------------------------------------------------------------------ # OPTION: -padx # # Specifies a padding distance for the childsite in the X-direction. # ------------------------------------------------------------------ itcl::configbody iwidgets::Dialogshell::padx { grid configure $itk_component(dschildsite) -padx $itk_option(-padx) } # ------------------------------------------------------------------ # OPTION: -pady # # Specifies a padding distance for the childsite in the Y-direction. # ------------------------------------------------------------------ itcl::configbody iwidgets::Dialogshell::pady { grid configure $itk_component(dschildsite) -pady $itk_option(-pady) } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Return the pathname of the user accessible area. # ------------------------------------------------------------------ itcl::body iwidgets::Dialogshell::childsite {} { return $itk_component(dschildsite) } # ------------------------------------------------------------------ # METHOD: index index # # Thin wrapper of Buttonbox's index method. # ------------------------------------------------------------------ itcl::body iwidgets::Dialogshell::index {args} { uplevel $itk_component(bbox) index $args } # ------------------------------------------------------------------ # METHOD: add tag ?option value ...? # # Thin wrapper of Buttonbox's add method. # ------------------------------------------------------------------ itcl::body iwidgets::Dialogshell::add {args} { uplevel $itk_component(bbox) add $args } # ------------------------------------------------------------------ # METHOD: insert index tag ?option value ...? # # Thin wrapper of Buttonbox's insert method. # ------------------------------------------------------------------ itcl::body iwidgets::Dialogshell::insert {args} { uplevel $itk_component(bbox) insert $args } # ------------------------------------------------------------------ # METHOD: delete tag # # Thin wrapper of Buttonbox's delete method. # ------------------------------------------------------------------ itcl::body iwidgets::Dialogshell::delete {args} { uplevel $itk_component(bbox) delete $args } # ------------------------------------------------------------------ # METHOD: hide index # # Thin wrapper of Buttonbox's hide method. # ------------------------------------------------------------------ itcl::body iwidgets::Dialogshell::hide {args} { uplevel $itk_component(bbox) hide $args } # ------------------------------------------------------------------ # METHOD: show index # # Thin wrapper of Buttonbox's show method. # ------------------------------------------------------------------ itcl::body iwidgets::Dialogshell::show {args} { uplevel $itk_component(bbox) show $args } # ------------------------------------------------------------------ # METHOD: default index # # Thin wrapper of Buttonbox's default method. # ------------------------------------------------------------------ itcl::body iwidgets::Dialogshell::default {args} { uplevel $itk_component(bbox) default $args } # ------------------------------------------------------------------ # METHOD: invoke ?index? # # Thin wrapper of Buttonbox's invoke method. # ------------------------------------------------------------------ itcl::body iwidgets::Dialogshell::invoke {args} { uplevel $itk_component(bbox) invoke $args } # ------------------------------------------------------------------ # METHOD: buttonconfigure index ?option? ?value option value ...? # # Thin wrapper of Buttonbox's buttonconfigure method. # ------------------------------------------------------------------ itcl::body iwidgets::Dialogshell::buttonconfigure {args} { uplevel $itk_component(bbox) buttonconfigure $args } # ------------------------------------------------------------------ # METHOD: buttoncget index option # # Thin wrapper of Buttonbox's buttoncget method. # ------------------------------------------------------------------ itcl::body iwidgets::Dialogshell::buttoncget {index option} { uplevel $itk_component(bbox) buttoncget [list $index] \ [list $option] } ��������������������������������������������������iwidgets-4.1.0/generic/disjointlistbox.itk����������������������������������������������������������0000644�0036047�0045461�00000040033�11053123635�017302� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # ::iwidgets::Disjointlistbox # ---------------------------------------------------------------------- # Implements a widget which maintains a disjoint relationship between # the items displayed by two listboxes. The disjointlistbox is composed # of 2 Scrolledlistboxes, 2 Pushbuttons, and 2 labels. # # The disjoint behavior of this widget exists between the two Listboxes, # That is, a given instance of a ::iwidgets::Disjointlistbox will never # exist which has Listbox widgets with items in common. # # Users may transfer items between the two Listbox widgets using the # the two Pushbuttons. # # The options include the ability to configure the "items" displayed by # either of the two Listboxes and to control the placement of the insertion # and removal buttons. # # The following depicts the allowable "-buttonplacement" option values # and their associated layout: # # "-buttonplacement" => center # # -------------------------- # |listbox| |listbox| # | |________| | # | (LHS) | button | (RHS) | # | |========| | # | | button | | # |_______|--------|_______| # | count | | count | # -------------------------- # # "-buttonplacement" => bottom # # --------------------- # | listbox | listbox | # | (LHS) | (RHS) | # |_________|_________| # | button | button | # |---------|---------| # | count | count | # --------------------- # # ---------------------------------------------------------------------- # AUTHOR: John A. Tucker EMAIL: jatucker@spd.dsccc.com # # ====================================================================== # # Default resources. # option add *Disjointlistbox.lhsLabelText Available widgetDefault option add *Disjointlistbox.rhsLabelText Current widgetDefault option add *Disjointlistbox.lhsButtonLabel {Insert >>} widgetDefault option add *Disjointlistbox.rhsButtonLabel {<< Remove} widgetDefault option add *Disjointlistbox.vscrollMode static widgetDefault option add *Disjointlistbox.hscrollMode static widgetDefault option add *Disjointlistbox.selectMode multiple widgetDefault option add *Disjointlistbox.labelPos nw widgetDefault option add *Disjointlistbox.buttonPlacement bottom widgetDefault option add *Disjointlistbox.lhsSortOption increasing widgetDefault option add *Disjointlistbox.rhsSortOption increasing widgetDefault # # Usual options. # itk::usual Disjointlistbox { keep -background -textbackground -cursor \ -foreground -textfont -labelfont } # ---------------------------------------------------------------------- # ::iwidgets::Disjointlistbox # ---------------------------------------------------------------------- itcl::class ::iwidgets::Disjointlistbox { inherit itk::Widget # # options # itk_option define -buttonplacement buttonPlacement ButtonPlacement bottom itk_option define -lhsbuttonlabel lhsButtonLabel LabelText {Insert >>} itk_option define -rhsbuttonlabel rhsButtonLabel LabelText {<< Remove} itk_option define -lhssortoption lhsSortOption LhsSortOption increasing itk_option define -rhssortoption rhsSortOption RhsSortOption increasing constructor {args} {} # # PUBLIC # public { method clear {} method getlhs {{first 0} {last end}} method getrhs {{first 0} {last end}} method lhs {args} method insertlhs {items} method insertrhs {items} method setlhs {items} method setrhs {items} method rhs {args} } # # PROTECTED # protected { method insert {theListbox items} method listboxClick {clickSide otherSide} method listboxDblClick {clickSide otherSide} method remove {theListbox items} method showCount {} method transfer {} variable sourceListbox {} variable destinationListbox {} } } # # Provide a lowercased access method for the ::iwidgets::Disjointlistbox class. # proc ::iwidgets::disjointlistbox {pathName args} { uplevel ::iwidgets::Disjointlistbox $pathName $args } # ------------------------------------------------------------------ # # Method: Constructor # # Purpose: # itcl::body ::iwidgets::Disjointlistbox::constructor {args} { # # Create the left-most Listbox # itk_component add lhs { iwidgets::Scrolledlistbox $itk_interior.lhs \ -selectioncommand [itcl::code $this listboxClick lhs rhs] \ -dblclickcommand [itcl::code $this listboxDblClick lhs rhs] } { usual keep -selectmode -vscrollmode -hscrollmode rename -labeltext -lhslabeltext lhsLabelText LabelText } # # Create the right-most Listbox # itk_component add rhs { iwidgets::Scrolledlistbox $itk_interior.rhs \ -selectioncommand [itcl::code $this listboxClick rhs lhs] \ -dblclickcommand [itcl::code $this listboxDblClick rhs lhs] } { usual keep -selectmode -vscrollmode -hscrollmode rename -labeltext -rhslabeltext rhsLabelText LabelText } # # Create the left-most item count Label # itk_component add lhsCount { label $itk_interior.lhscount } { usual rename -font -labelfont labelFont Font } # # Create the right-most item count Label # itk_component add rhsCount { label $itk_interior.rhscount } { usual rename -font -labelfont labelFont Font } set sourceListbox $itk_component(lhs) set destinationListbox $itk_component(rhs) # # Bind the "showCount" method to the Map event of one of the labels # to keep the diplayed item count current. # bind $itk_component(lhsCount) <Map> [itcl::code $this showCount] grid $itk_component(lhs) -row 0 -column 0 -sticky nsew grid $itk_component(rhs) -row 0 -column 2 -sticky nsew grid rowconfigure $itk_interior 0 -weight 1 grid columnconfigure $itk_interior 0 -weight 1 grid columnconfigure $itk_interior 2 -weight 1 eval itk_initialize $args } # ------------------------------------------------------------------ # Method: listboxClick # # Purpose: Evaluate a single click make in the specified Listbox. # itcl::body ::iwidgets::Disjointlistbox::listboxClick {clickSide otherSide} { set button "button" $itk_component($clickSide$button) configure -state active $itk_component($otherSide$button) configure -state disabled set sourceListbox $clickSide set destinationListbox $otherSide } # ------------------------------------------------------------------ # Method: listboxDblClick # # Purpose: Evaluate a double click in the specified Listbox. # itcl::body ::iwidgets::Disjointlistbox::listboxDblClick {clickSide otherSide} { listboxClick $clickSide $otherSide transfer } # ------------------------------------------------------------------ # Method: transfer # # Purpose: Transfer source Listbox items to destination Listbox # itcl::body ::iwidgets::Disjointlistbox::transfer {} { if {[$sourceListbox selecteditemcount] == 0} { return } set selectedindices [lsort -integer -decreasing [$sourceListbox curselection]] set selecteditems [$sourceListbox getcurselection] foreach index $selectedindices { $sourceListbox delete $index } foreach item $selecteditems { $destinationListbox insert end $item } if {![string equal $itk_option(-${destinationListbox}sortoption) "none"]} { $destinationListbox sort $itk_option(-${destinationListbox}sortoption) } showCount } # ------------------------------------------------------------------ # Method: getlhs # # Purpose: Retrieve the items of the left Listbox widget # itcl::body ::iwidgets::Disjointlistbox::getlhs {{first 0} {last end}} { return [lhs get $first $last] } # ------------------------------------------------------------------ # Method: getrhs # # Purpose: Retrieve the items of the right Listbox widget # itcl::body ::iwidgets::Disjointlistbox::getrhs {{first 0} {last end}} { return [rhs get $first $last] } # ------------------------------------------------------------------ # Method: insertrhs # # Purpose: Insert items into the right Listbox widget # itcl::body ::iwidgets::Disjointlistbox::insertrhs {items} { remove $itk_component(lhs) $items insert rhs $items } # ------------------------------------------------------------------ # Method: insertlhs # # Purpose: Insert items into the left Listbox widget # itcl::body ::iwidgets::Disjointlistbox::insertlhs {items} { remove $itk_component(rhs) $items insert lhs $items } # ------------------------------------------------------------------ # Method: clear # # Purpose: Remove the items from the Listbox widgets and set the item count # Labels text to 0 # itcl::body ::iwidgets::Disjointlistbox::clear {} { lhs clear rhs clear showCount } # ------------------------------------------------------------------ # Method: insert # # Purpose: Insert the input items into the input Listbox widget while # maintaining the disjoint property between them. # itcl::body ::iwidgets::Disjointlistbox::insert {theListbox items} { set curritems [$theListbox get 0 end] foreach item $items { # # if the item is not already present in the Listbox then insert it # if {[lsearch -exact $curritems $item] == -1} { $theListbox insert end $item } } if {![string equal $itk_option(-${theListbox}sortoption) "none"]} { $theListbox sort $itk_option(-${theListbox}sortoption) } showCount } # ------------------------------------------------------------------ # Method: remove # # Purpose: Remove the input items from the input Listbox widget while # maintaining the disjoint property between them. # itcl::body ::iwidgets::Disjointlistbox::remove {theListbox items} { set indexes {} set curritems [$theListbox get 0 end] foreach item $items { # # if the item is in the listbox then add its index to the index list # if {[set index [lsearch -exact $curritems $item]] != -1} { lappend indexes $index } } foreach index [lsort -integer -decreasing $indexes] { $theListbox delete $index } showCount } # ------------------------------------------------------------------ # Method: showCount # # Purpose: Set the text of the item count Labels. # itcl::body ::iwidgets::Disjointlistbox::showCount {} { $itk_component(lhsCount) config -text "item count: [lhs size]" $itk_component(rhsCount) config -text "item count: [rhs size]" } # ------------------------------------------------------------------ # METHOD: setlhs # # Set the items of the left-most Listbox with the input list # option. Remove all (if any) items from the right-most Listbox # which exist in the input list option to maintain the disjoint # property between the two # itcl::body ::iwidgets::Disjointlistbox::setlhs {items} { lhs clear insertlhs $items } # ------------------------------------------------------------------ # METHOD: setrhs # # Set the items of the right-most Listbox with the input list # option. Remove all (if any) items from the left-most Listbox # which exist in the input list option to maintain the disjoint # property between the two # itcl::body ::iwidgets::Disjointlistbox::setrhs {items} { rhs clear insertrhs $items } # ------------------------------------------------------------------ # Method: lhs # # Purpose: Evaluates the specified arguments against the lhs Listbox # itcl::body ::iwidgets::Disjointlistbox::lhs {args} { return [eval $itk_component(lhs) $args] } # ------------------------------------------------------------------ # Method: rhs # # Purpose: Evaluates the specified arguments against the rhs Listbox # itcl::body ::iwidgets::Disjointlistbox::rhs {args} { return [eval $itk_component(rhs) $args] } # ------------------------------------------------------------------ # OPTION: buttonplacement # # Configure the placement of the buttons to be either between or below # the two list boxes. # itcl::configbody ::iwidgets::Disjointlistbox::buttonplacement { if {$itk_option(-buttonplacement) != ""} { if { [lsearch [component] lhsbutton] != -1 } { eval destroy $itk_component(rhsbutton) $itk_component(lhsbutton) } if { [lsearch [component] bbox] != -1 } { destroy $itk_component(bbox) } set where $itk_option(-buttonplacement) switch $where { center { # # Create the button box frame # itk_component add bbox { frame $itk_interior.bbox } itk_component add lhsbutton { button $itk_component(bbox).lhsbutton -command [itcl::code \ $this transfer] } { usual rename -text -lhsbuttonlabel lhsButtonLabel LabelText rename -font -labelfont labelFont Font } itk_component add rhsbutton { button $itk_component(bbox).rhsbutton -command [itcl::code \ $this transfer] } { usual rename -text -rhsbuttonlabel rhsButtonLabel LabelText rename -font -labelfont labelFont Font } grid configure $itk_component(lhsCount) -row 1 -column 0 \ -sticky ew grid configure $itk_component(rhsCount) -row 1 -column 2 \ -sticky ew grid configure $itk_component(bbox) \ -in $itk_interior -row 0 -column 1 -columnspan 1 \ -sticky nsew # Tk8.5: enforce compatibility to previous versions # see Tk-ticket 2062394 catch {grid anchor $itk_component(bbox) center} grid configure $itk_component(rhsbutton) \ -in $itk_component(bbox) -row 0 -column 0 -sticky ew grid configure $itk_component(lhsbutton) \ -in $itk_component(bbox) -row 1 -column 0 -sticky ew } bottom { itk_component add lhsbutton { button $itk_interior.lhsbutton -command [itcl::code $this \ transfer] } { usual rename -text -lhsbuttonlabel lhsButtonLabel LabelText rename -font -labelfont labelFont Font } itk_component add rhsbutton { button $itk_interior.rhsbutton -command [itcl::code $this \ transfer] } { usual rename -text -rhsbuttonlabel rhsButtonLabel LabelText rename -font -labelfont labelFont Font } grid $itk_component(lhsCount) -row 2 -column 0 -sticky ew grid $itk_component(rhsCount) -row 2 -column 2 -sticky ew grid $itk_component(lhsbutton) -row 1 -column 0 -sticky ew grid $itk_component(rhsbutton) -row 1 -column 2 -sticky ew } default { error "bad buttonplacement option\"$where\": should be center\ or bottom" } } } } # ------------------------------------------------------------------ # OPTION: lhssortoption # # Configure the sort option to use for the left side # itcl::configbody ::iwidgets::Disjointlistbox::lhssortoption { if {![string equal $itk_option(-lhssortoption) "none"]} { $itk_component(lhs) sort $itk_option(-lhssortoption) } } # ------------------------------------------------------------------ # OPTION: rhssortoption # # Configure the sort option to use for the right side # itcl::configbody ::iwidgets::Disjointlistbox::rhssortoption { if {![string equal $itk_option(-rhssortoption) "none"]} { $itk_component(rhs) sort $itk_option(-rhssortoption) } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/entryfield.itk���������������������������������������������������������������0000644�0036047�0045461�00000052537�07543521116�016240� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Entryfield # ---------------------------------------------------------------------- # Implements an enhanced text entry widget. # # ---------------------------------------------------------------------- # AUTHOR: Sue Yockey E-mail: yockey@acm.org # Mark L. Ulferts E-mail: mulferts@austin.dsccc.com # # @(#) $Id: entryfield.itk,v 1.7 2002/09/23 05:10:38 mgbacke Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Entryfield { keep -background -borderwidth -cursor -foreground -highlightcolor \ -highlightthickness -insertbackground -insertborderwidth \ -insertofftime -insertontime -insertwidth -labelfont \ -selectbackground -selectborderwidth -selectforeground \ -textbackground -textfont } # ------------------------------------------------------------------ # ENTRYFIELD # ------------------------------------------------------------------ itcl::class iwidgets::Entryfield { inherit iwidgets::Labeledwidget constructor {args} {} itk_option define -childsitepos childSitePos Position e itk_option define -command command Command {} itk_option define -fixed fixed Fixed 0 itk_option define -focuscommand focusCommand Command {} itk_option define -invalid invalid Command {bell} itk_option define -pasting pasting Behavior 1 itk_option define -validate validate Command {} public { method childsite {} method get {} method delete {args} method icursor {args} method index {args} method insert {args} method scan {args} method selection {args} method xview {args} method clear {} } proc numeric {char} {} proc integer {string} {} proc alphabetic {char} {} proc alphanumeric {char} {} proc hexidecimal {string} {} proc real {string} {} protected { method _focusCommand {} method _keyPress {char sym state} } private method _peek {char} private method _checkLength {} } # # Provide a lowercased access method for the Entryfield class. # proc ::iwidgets::entryfield {pathName args} { uplevel ::iwidgets::Entryfield $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::constructor {args} { component hull configure -borderwidth 0 itk_component add entry { entry $itk_interior.entry } { keep -borderwidth -cursor -exportselection \ -foreground -highlightcolor \ -highlightthickness -insertbackground -insertborderwidth \ -insertofftime -insertontime -insertwidth -justify \ -relief -selectbackground -selectborderwidth \ -selectforeground -show -state -textvariable -width rename -font -textfont textFont Font rename -highlightbackground -background background Background rename -background -textbackground textBackground Background } # # Create the child site widget. # itk_component add -protected efchildsite { frame $itk_interior.efchildsite } set itk_interior $itk_component(efchildsite) # # Entryfield instance bindings. # bind $itk_component(entry) <KeyPress> [itcl::code $this _keyPress %A %K %s] bind $itk_component(entry) <FocusIn> [itcl::code $this _focusCommand] # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -command # # Command associated upon detection of Return key press event # ------------------------------------------------------------------ itcl::configbody iwidgets::Entryfield::command {} # ------------------------------------------------------------------ # OPTION: -focuscommand # # Command associated upon detection of focus. # ------------------------------------------------------------------ itcl::configbody iwidgets::Entryfield::focuscommand {} # ------------------------------------------------------------------ # OPTION: -validate # # Specify a command to executed for the validation of Entryfields. # ------------------------------------------------------------------ itcl::configbody iwidgets::Entryfield::validate { switch $itk_option(-validate) { {} { set itk_option(-validate) {} } numeric { set itk_option(-validate) "::iwidgets::Entryfield::numeric %c" } integer { set itk_option(-validate) "::iwidgets::Entryfield::integer %P" } hexidecimal { set itk_option(-validate) "::iwidgets::Entryfield::hexidecimal %P" } real { set itk_option(-validate) "::iwidgets::Entryfield::real %P" } alphabetic { set itk_option(-validate) "::iwidgets::Entryfield::alphabetic %c" } alphanumeric { set itk_option(-validate) "::iwidgets::Entryfield::alphanumeric %c" } } } # ------------------------------------------------------------------ # OPTION: -invalid # # Specify a command to executed should the current Entryfield contents # be proven invalid. # ------------------------------------------------------------------ itcl::configbody iwidgets::Entryfield::invalid {} # ------------------------------------------------------------------ # OPTION: -pasting # # Allows the developer to enable and disable pasting into the entry # component of the entryfield. This is done to avoid potential stack # dumps when using the -validate configuration option. Plus, it's just # a good idea to have complete control over what you allow the user # to enter into the entryfield. # ------------------------------------------------------------------ itcl::configbody iwidgets::Entryfield::pasting { set oldtags [bindtags $itk_component(entry)] if {[lindex $oldtags 0] != "pastetag"} { bindtags $itk_component(entry) [linsert $oldtags 0 pastetag] } if {($itk_option(-pasting))} { bind pastetag <ButtonRelease-2> [itcl::code $this _checkLength] bind pastetag <Control-v> [itcl::code $this _checkLength] bind pastetag <Insert> [itcl::code $this _checkLength] bind pastetag <KeyPress> {} } else { bind pastetag <ButtonRelease-2> {break} bind pastetag <Control-v> {break} bind pastetag <Insert> {break} bind pastetag <KeyPress> { # Disable function keys > F9. if {[regexp {^F[1,2][0-9]+$} "%K"]} { break } } } } # ------------------------------------------------------------------ # OPTION: -fixed # # Restrict entry to 0 (unlimited) chars. The value is the maximum # number of chars the user may type into the field, regardles of # field width, i.e. the field width may be 20, but the user will # only be able to type -fixed number of characters into it (or # unlimited if -fixed = 0). # ------------------------------------------------------------------ itcl::configbody iwidgets::Entryfield::fixed { if {[regexp {[^0-9]} $itk_option(-fixed)] || \ ($itk_option(-fixed) < 0)} { error "bad fixed option \"$itk_option(-fixed)\",\ should be positive integer" } } # ------------------------------------------------------------------ # OPTION: -childsitepos # # Specifies the position of the child site in the widget. # ------------------------------------------------------------------ itcl::configbody iwidgets::Entryfield::childsitepos { set parent [winfo parent $itk_component(entry)] switch $itk_option(-childsitepos) { n { grid $itk_component(efchildsite) -row 0 -column 0 -sticky ew grid $itk_component(entry) -row 1 -column 0 -sticky nsew grid rowconfigure $parent 0 -weight 0 grid rowconfigure $parent 1 -weight 1 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 } e { grid $itk_component(efchildsite) -row 0 -column 1 -sticky ns grid $itk_component(entry) -row 0 -column 0 -sticky nsew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 } s { grid $itk_component(efchildsite) -row 1 -column 0 -sticky ew grid $itk_component(entry) -row 0 -column 0 -sticky nsew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 } w { grid $itk_component(efchildsite) -row 0 -column 0 -sticky ns grid $itk_component(entry) -row 0 -column 1 -sticky nsew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid columnconfigure $parent 0 -weight 0 grid columnconfigure $parent 1 -weight 1 } default { error "bad childsite option\ \"$itk_option(-childsitepos)\":\ should be n, e, s, or w" } } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Returns the path name of the child site widget. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::childsite {} { return $itk_component(efchildsite) } # ------------------------------------------------------------------ # METHOD: get # # Thin wrap of the standard entry widget get method. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::get {} { return [$itk_component(entry) get] } # ------------------------------------------------------------------ # METHOD: delete # # Thin wrap of the standard entry widget delete method. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::delete {args} { return [eval $itk_component(entry) delete $args] } # ------------------------------------------------------------------ # METHOD: icursor # # Thin wrap of the standard entry widget icursor method. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::icursor {args} { return [eval $itk_component(entry) icursor $args] } # ------------------------------------------------------------------ # METHOD: index # # Thin wrap of the standard entry widget index method. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::index {args} { return [eval $itk_component(entry) index $args] } # ------------------------------------------------------------------ # METHOD: insert # # Thin wrap of the standard entry widget index method. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::insert {args} { return [eval $itk_component(entry) insert $args] } # ------------------------------------------------------------------ # METHOD: scan # # Thin wrap of the standard entry widget scan method. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::scan {args} { return [eval $itk_component(entry) scan $args] } # ------------------------------------------------------------------ # METHOD: selection # # Thin wrap of the standard entry widget selection method. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::selection {args} { return [eval $itk_component(entry) selection $args] } # ------------------------------------------------------------------ # METHOD: xview # # Thin wrap of the standard entry widget xview method. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::xview {args} { return [eval $itk_component(entry) xview $args] } # ------------------------------------------------------------------ # METHOD: clear # # Delete the current entry contents. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::clear {} { $itk_component(entry) delete 0 end icursor 0 } # ------------------------------------------------------------------ # PROCEDURE: numeric char # # The numeric procedure validates character input for a given # Entryfield to be numeric and returns the result. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::numeric {char} { return [regexp {[0-9]} $char] } # ------------------------------------------------------------------ # PROCEDURE: integer string # # The integer procedure validates character input for a given # Entryfield to be integer and returns the result. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::integer {string} { return [regexp {^[-+]?[0-9]*$} $string] } # ------------------------------------------------------------------ # PROCEDURE: alphabetic char # # The alphabetic procedure validates character input for a given # Entryfield to be alphabetic and returns the result. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::alphabetic {char} { return [regexp -nocase {[a-z]} $char] } # ------------------------------------------------------------------ # PROCEDURE: alphanumeric char # # The alphanumeric procedure validates character input for a given # Entryfield to be alphanumeric and returns the result. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::alphanumeric {char} { return [regexp -nocase {[0-9a-z]} $char] } # ------------------------------------------------------------------ # PROCEDURE: hexadecimal string # # The hexidecimal procedure validates character input for a given # Entryfield to be hexidecimal and returns the result. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::hexidecimal {string} { return [regexp {^(0x)?[0-9a-fA-F]*$} $string] } # ------------------------------------------------------------------ # PROCEDURE: real string # # The real procedure validates character input for a given Entryfield # to be real and returns the result. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::real {string} { return [regexp {^[-+]?[0-9]*\.?[0-9]*([0-9]\.?[eE][-+]?[0-9]*)?$} $string] } # ------------------------------------------------------------------ # PRIVATE METHOD: _peek char # # The peek procedure returns the value of the Entryfield with the # char inserted at the insert position. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::_peek {char} { set str [get] set insertPos [index insert] set firstPart [string range $str 0 [expr {$insertPos - 1}]] set lastPart [string range $str $insertPos end] regsub -all {\\} "$char" {\\\\} char append rtnVal $firstPart $char $lastPart return $rtnVal } # ------------------------------------------------------------------ # PROTECTED METHOD: _focusCommand # # Method bound to focus event which evaluates the current command # specified in the focuscommand option # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::_focusCommand {} { uplevel #0 $itk_option(-focuscommand) } # ------------------------------------------------------------------ # PROTECTED METHOD: _keyPress # # Monitor the key press event checking for return keys, fixed width # specification, and optional validation procedures. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::_keyPress {char sym state} { # # A Return key invokes the optionally specified command option. # if {$sym == "Return"} { if {$itk_option(-command) == ""} { # # Allow <Return> to propagate to parent if the -command option # isn't defined. # return -code continue 1 } uplevel #0 $itk_option(-command) return -code break 1 } # # Tabs, BackSpace, and Delete are passed on for other bindings. # if {($sym == "Tab") || ($sym == "BackSpace") || ($sym == "Delete")} { return -code continue 1 } # # Character is not printable or the state is greater than one which # means a modifier was used such as a control, meta key, or control # or meta key with numlock down. # #----------------------------------------------------------- # BUG FIX: csmith (Chad Smith: csmith@adc.com), 3/15/99 #----------------------------------------------------------- # The following conditional used to hardcode specific state values, such # as "4" and "8". These values are used to detect <Ctrl>, <Shift>, etc. # key combinations. On the windows platform, the <Alt> key is state # 16, and on the unix platform, the <Alt> key is state 8. All <Ctrl> # and <Alt> combinations should be masked out, regardless of the # <NumLock> or <CapsLock> status, and regardless of platform. #----------------------------------------------------------- set CTRL 4 global tcl_platform if {$tcl_platform(platform) == "unix"} { set ALT 8 } elseif {$tcl_platform(platform) == "windows"} { set ALT 16 } else { # This is something other than UNIX or WINDOWS. Default to the # old behavior (UNIX). set ALT 8 } # Thanks to Rolf Schroedter for the following elegant conditional. This # masks out all <Ctrl> and <Alt> key combinations. if {($char == "") || ($state & ($CTRL | $ALT))} { return -code continue 1 } # # If the fixed length option is not zero, then verify that the # current length plus one will not exceed the limit. If so then # invoke the invalid command procedure. # if {$itk_option(-fixed) != 0} { if {[string length [get]] >= $itk_option(-fixed)} { uplevel #0 $itk_option(-invalid) return -code break 0 } } # # The validate option may contain a keyword (numeric, alphabetic), # the name of a procedure, or nothing. The numeric and alphabetic # keywords engage typical base level checks. If a command procedure # is specified, then invoke it with the object and character passed # as arguments. If the validate procedure returns false, then the # invalid procedure is called. # if {$itk_option(-validate) != {}} { set cmd $itk_option(-validate) regsub -all "%W" "$cmd" $itk_component(hull) cmd regsub -all "%P" "$cmd" [list [_peek $char]] cmd regsub -all "%S" "$cmd" [list [get]] cmd regsub -all "%c" "$cmd" [list $char] cmd regsub -all {\\} "$cmd" {\\\\} cmd set valid [uplevel #0 $cmd] if {($valid == "") || ([regexp 0|false|off|no $valid])} { uplevel #0 $itk_option(-invalid) return -code break 0 } } return -code continue 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _checkLength # # This method was added by csmith for SF ticket 227912. We need to # to check the clipboard content before allowing any pasting into # the entryfield to disallow text that is longer than the value # specified by the -fixed option. # ------------------------------------------------------------------ itcl::body iwidgets::Entryfield::_checkLength {} { if {$itk_option(-fixed) != 0} { if {[catch {::selection get -selection CLIPBOARD} pending]} { # Nothing in the clipboard. Check the primary selection. if {[catch {::selection get -selection PRIMARY} pending]} { # Nothing here either. Goodbye. return } } set len [expr {[string length $pending] + [string length [get]]}] if {$len > $itk_option(-fixed)} { uplevel #0 $itk_option(-invalid) return -code break 0 } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/extbutton.itk����������������������������������������������������������������0000644�0036047�0045461�00000035222�07334044000�016105� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#------------------------------------------------------------------------------- # Extbutton #------------------------------------------------------------------------------- # This [incr Widget] is pretty simple - it just extends the behavior of # the Tk button by allowing the user to add a bitmap or an image, which # can be placed at various locations relative to the text via the -imagepos # configuration option. # #------------------------------------------------------------------------------- # IMPORTANT NOTE: This [incr Widget] will only work with Tk 8.4 or later. # #------------------------------------------------------------------------------- # AUTHOR: Chad Smith E-mail: csmith@adc.com, itclguy@yahoo.com #------------------------------------------------------------------------------- # Permission to use, copy, modify, distribute, and license this software # and its documentation for any purpose is hereby granted as long as this # comment block remains intact. #------------------------------------------------------------------------------- # # Default resources # option add *Extbutton.borderwidth 2 widgetDefault option add *Extbutton.relief raised widgetDefault # # Usual options # itk::usual Extbutton { keep -cursor -font } itcl::class iwidgets::Extbutton { inherit itk::Widget constructor {args} {} itk_option define -activebackground activeBackground Foreground #ececec itk_option define -bd borderwidth BorderWidth 2 itk_option define -bitmap bitmap Bitmap {} itk_option define -command command Command {} itk_option define -defaultring defaultring DefaultRing 0 itk_option define -defaultringpad defaultringpad Pad 4 itk_option define -image image Image {} itk_option define -imagepos imagePos Position w itk_option define -relief relief Relief raised itk_option define -state state State normal itk_option define -text text Text {} public method invoke {} {eval $itk_option(-command)} public method flash {} private method changeColor {event_} private method sink {} private method raise {} {configure -relief $_oldValues(-relief)} private variable _oldValues } # # Provide the usual lowercase access command. # proc iwidgets::extbutton {path_ args} { uplevel iwidgets::Extbutton $path_ $args } #------------------------------------------------------------------------------- # OPTION: -bd # # DESCRIPTION: This isn't a new option. Similar to -image, we just need to # repack the frame when the borderwidth changes. This option is kept by # the private reliefframe component. #------------------------------------------------------------------------------- itcl::configbody iwidgets::Extbutton::bd { pack $itk_component(frame) -padx 4 -pady 4 } #------------------------------------------------------------------------------- # OPTION: -bitmap # # DESCRIPTION: This isn't a new option - we just need to reset the -image option # so that the user can toggle back and forth between images and bitmaps. # Otherwise, the image will take precedence and the user will be unable to # change to a bitmap without manually setting the label component's -image to # an empty string. This option is kept by the image component. #------------------------------------------------------------------------------- itcl::configbody iwidgets::Extbutton::bitmap { if {$itk_option(-bitmap) == ""} { return } if {$itk_option(-image) != ""} { configure -image {} } pack $itk_component(frame) -padx 4 -pady 4 } #------------------------------------------------------------------------------- # OPTION: -command # # DESCRIPTION: Invoke the given command to simulate the Tk button's -command # option. The command is invoked on <ButtonRelease-1> events only or by # direct calls to the public invoke() method. #------------------------------------------------------------------------------- itcl::configbody iwidgets::Extbutton::command { if {$itk_option(-command) == ""} { return } # Only create the tag binding if the button is operable. if {$itk_option(-state) == "normal"} { bind $this-commandtag <ButtonRelease-1> [itcl::code $this invoke] } # Associate the tag with each component if it's not already done. if {[lsearch [bindtags $itk_interior] $this-commandtag] == -1} { foreach component [component] { bindtags [component $component] \ [linsert [bindtags [component $component]] end $this-commandtag] } } } #------------------------------------------------------------------------------- # OPTION: -defaultring # # DESCRIPTION: Controls display of the sunken frame surrounding the button. # This option simulates the pushbutton iwidget -defaultring option. #------------------------------------------------------------------------------- itcl::configbody iwidgets::Extbutton::defaultring { switch -- $itk_option(-defaultring) { 1 {set ring 1} 0 {set ring 0} default { error "Invalid option for -defaultring: \"$itk_option(-defaultring)\". \ Should be 1 or 0." } } if ($ring) { $itk_component(ring) configure -borderwidth 2 pack $itk_component(reliefframe) -padx $itk_option(-defaultringpad) \ -pady $itk_option(-defaultringpad) } else { $itk_component(ring) configure -borderwidth 0 pack $itk_component(reliefframe) -padx 0 -pady 0 } } #------------------------------------------------------------------------------- # OPTION: -defaultringpad # # DESCRIPTION: The pad distance between the ring and the button. #------------------------------------------------------------------------------- itcl::configbody iwidgets::Extbutton::defaultringpad { # Must be an integer. if ![string is integer $itk_option(-defaultringpad)] { error "Invalid value specified for -defaultringpad:\ \"$itk_option(-defaultringpad)\". Must be an integer." } # Let's go ahead and make the maximum padding 20 pixels. Surely no one # will want more than that. if {$itk_option(-defaultringpad) < 0 || $itk_option(-defaultringpad) > 20} { error "Value for -defaultringpad must be between 0 and 20." } # If the ring is displayed, repack it according to the new padding amount. if {$itk_option(-defaultring)} { pack $itk_component(reliefframe) -padx $itk_option(-defaultringpad) \ -pady $itk_option(-defaultringpad) } } #------------------------------------------------------------------------------- # OPTION: -image # # DESCRIPTION: This isn't a new option - we just need to repack the frame after # the image is changed in case the size is different than the previous one. # This option is kept by the image component. #------------------------------------------------------------------------------- itcl::configbody iwidgets::Extbutton::image { pack $itk_component(frame) -padx 4 -pady 4 } #------------------------------------------------------------------------------- # OPTION: -imagepos # # DESCRIPTION: Allows the user to move the image to different locations areound # the text. Valid options are n, nw, ne, s, sw, se e, en, es, w, wn or ws. #------------------------------------------------------------------------------- itcl::configbody iwidgets::Extbutton::imagepos { switch -- $itk_option(-imagepos) { n {set side top; set anchor center} ne {set side top; set anchor e} nw {set side top; set anchor w} s {set side bottom; set anchor center} se {set side bottom; set anchor e} sw {set side bottom; set anchor w} w {set side left; set anchor center} wn {set side left; set anchor n} ws {set side left; set anchor s} e {set side right; set anchor center} en {set side right; set anchor n} es {set side right; set anchor s} default { error "Invalid option: \"$itk_option(-imagepos)\". \ Must be n, nw, ne, s, sw, se e, en, es, w, wn or ws." } } pack $itk_component(image) -side $side -anchor $anchor pack $itk_component(frame) -padx 4 -pady 4 } #------------------------------------------------------------------------------- # OPTION: -relief # # DESCRIPTION: Move the frame component according to the relief to simulate # the text in a Tk button when its relief is changed. #------------------------------------------------------------------------------- itcl::configbody iwidgets::Extbutton::relief { update idletasks switch -- $itk_option(-relief) { flat - ridge - groove { place $itk_component(frame) -x 5 -y 5 } raised { place $itk_component(frame) -x 4 -y 4 } sunken { place $itk_component(frame) -x 6 -y 6 } default { error "Invalid option: \"$itk_option(-relief)\". \ Must be flat, ridge, groove, raised, or sunken." } } } #------------------------------------------------------------------------------- # OPTION: -state # # DESCRIPTION: Simulate the button's -state option. #------------------------------------------------------------------------------- itcl::configbody iwidgets::Extbutton::state { switch -- $itk_option(-state) { disabled { bind $itk_interior <Enter> { } bind $itk_interior <Leave> { } bind $this-sunkentag <1> { } bind $this-raisedtag <ButtonRelease-1> { } bind $this-commandtag <ButtonRelease-1> { } set _oldValues(-fg) [cget -foreground] set _oldValues(-cursor) [cget -cursor] configure -foreground $itk_option(-disabledforeground) configure -cursor "X_cursor red black" } normal { bind $itk_interior <Enter> [itcl::code $this changeColor enter] bind $itk_interior <Leave> [itcl::code $this changeColor leave] bind $this-sunkentag <1> [itcl::code $this sink] bind $this-raisedtag <ButtonRelease-1> [itcl::code $this raise] bind $this-commandtag <ButtonRelease-1> [itcl::code $this invoke] configure -foreground $_oldValues(-fg) configure -cursor $_oldValues(-cursor) } default { error "Bad option for -state: \"$itk_option(-state)\". Should be\ normal or disabled." } } } #------------------------------------------------------------------------------- # OPTION: -text # # DESCRIPTION: This isn't a new option. Similar to -image, we just need to # repack the frame when the text changes. #------------------------------------------------------------------------------- itcl::configbody iwidgets::Extbutton::text { pack $itk_component(frame) -padx 4 -pady 4 } #------------------------------------------------------------------------------- # CONSTRUCTOR #------------------------------------------------------------------------------- itcl::body iwidgets::Extbutton::constructor {args} { # Extbutton will not work with versions of Tk less than 8.4 (the # -activeforeground option was added to the Tk label widget in 8.4, for # example). So disallow its use unless the right wish is being used. if {$::tk_version < 8.4} { error "The extbutton \[incr Widget\] can only be used with versions of\ Tk greater than 8.3.\nYou're currently using version $::tk_version." } # This frame is optionally displayed as a "default ring" around the button. itk_component add ring { frame $itk_interior.ring -relief sunken } { rename -background -ringbackground ringBackground Background } # Add an outer frame for the widget's relief. Ideally we could just keep # the hull's -relief, but it's too tricky to handle relief changes. itk_component add -private reliefframe { frame $itk_component(ring).f } { rename -borderwidth -bd borderwidth BorderWidth keep -relief usual } # This frame contains the image and text. It will be moved slightly to # simulate the text in a Tk button when the button is depressed/raised. itk_component add frame { frame $itk_component(reliefframe).f -borderwidth 0 } itk_component add image { label $itk_component(frame).img -borderwidth 0 } { keep -bitmap -background -image rename -foreground -bitmapforeground foreground Foreground } itk_component add label { label $itk_component(frame).txt -borderwidth 0 } { keep -activeforeground -background -disabledforeground keep -font -foreground -justify -text } pack $itk_component(image) $itk_component(label) -side left -padx 6 -pady 4 pack $itk_component(frame) -padx 4 -pady 4 pack $itk_component(reliefframe) -fill both pack $itk_component(ring) -fill both # Create a couple of binding tags for handling relief changes. Then # add these tags to each component. foreach component [component] { bindtags [component $component] \ [linsert [bindtags [component $component]] end $this-sunkentag] bindtags [component $component] \ [linsert [bindtags [component $component]] end $this-raisedtag] } set _oldValues(-fg) [cget -foreground] set _oldValues(-cursor) [cget -cursor] eval itk_initialize $args } #------------------------------------------------------------------------------- # METHOD: flash # # ACCESS: public # # DESCRIPTION: Simulate the Tk button flash command. # # ARGUMENTS: none #------------------------------------------------------------------------------- itcl::body iwidgets::Extbutton::flash {} { set oldbg [cget -background] config -background $itk_option(-activebackground) update idletasks after 50; config -background $oldbg; update idletasks after 50; config -background $itk_option(-activebackground); update idletasks after 50; config -background $oldbg } #------------------------------------------------------------------------------- # METHOD: changeColor # # ACCESS: private # # DESCRIPTION: This method is invoked by <Enter> and <Leave> events to change # the background and foreground colors of the widget. # # ARGUMENTS: event_ --> either "enter" or "leave" #------------------------------------------------------------------------------- itcl::body iwidgets::Extbutton::changeColor {event_} { switch -- $event_ { enter { set _oldValues(-bg) [cget -background] set _oldValues(-fg) [cget -foreground] configure -background $itk_option(-activebackground) configure -foreground $itk_option(-activeforeground) } leave { configure -background $_oldValues(-bg) configure -foreground $_oldValues(-fg) } } } #------------------------------------------------------------------------------- # METHOD: sink # # ACCESS: private # # DESCRIPTION: This method is invoked on <1> mouse events. It saves the # current relief for later restoral and configures the relief to sunken if # it isn't already sunken. # # ARGUMENTS: none #------------------------------------------------------------------------------- itcl::body iwidgets::Extbutton::sink {} { set _oldValues(-relief) [cget -relief] if {$_oldValues(-relief) == "sunken"} { return } configure -relief sunken } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/extfileselectionbox.itk������������������������������������������������������0000644�0036047�0045461�00000116465�10417004216�020142� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Extfileselectionbox # ---------------------------------------------------------------------- # Implements a file selection box that is a slightly extended version # of the OSF/Motif standard XmExtfileselectionbox composite widget. # The Extfileselectionbox differs from the Motif standard in that the # filter and selection fields are comboboxes and the files and directory # lists are in a paned window. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com # Anthony L. Parent tony.parent@symbios.com # # @(#) $Id: extfileselectionbox.itk,v 1.6 2006/04/11 19:50:38 hobbs Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Extfileselectionbox { keep -activebackground -activerelief -background -borderwidth -cursor \ -elementborderwidth -foreground -highlightcolor -highlightthickness \ -insertbackground -insertborderwidth -insertofftime -insertontime \ -insertwidth -jump -labelfont -selectbackground -selectborderwidth \ -textbackground -textfont -troughcolor } # ------------------------------------------------------------------ # EXTFILESELECTIONBOX # ------------------------------------------------------------------ itcl::class iwidgets::Extfileselectionbox { inherit itk::Widget constructor {args} {} destructor {} itk_option define -childsitepos childSitePos Position s itk_option define -fileson filesOn FilesOn true itk_option define -dirson dirsOn DirsOn true itk_option define -selectionon selectionOn SelectionOn true itk_option define -filteron filterOn FilterOn true itk_option define -mask mask Mask {*} itk_option define -directory directory Directory {} itk_option define -automount automount Automount {} itk_option define -nomatchstring noMatchString NoMatchString {} itk_option define -dirsearchcommand dirSearchCommand Command {} itk_option define -filesearchcommand fileSearchCommand Command {} itk_option define -selectioncommand selectionCommand Command {} itk_option define -filtercommand filterCommand Command {} itk_option define -selectdircommand selectDirCommand Command {} itk_option define -selectfilecommand selectFileCommand Command {} itk_option define -invalid invalid Command {bell} itk_option define -filetype fileType FileType {regular} itk_option define -width width Width 350 itk_option define -height height Height 300 public { method childsite {} method get {} method filter {} } protected { method _packComponents {{when later}} method _updateLists {{when later}} } private { method _selectDir {} method _dblSelectDir {} method _selectFile {} method _selectSelection {} method _selectFilter {} method _setFilter {} method _setSelection {} method _setDirList {} method _setFileList {} method _nPos {} method _sPos {} method _ePos {} method _wPos {} method _topPos {} method _bottomPos {} variable _packToken "" ;# non-null => _packComponents pending variable _updateToken "" ;# non-null => _updateLists pending variable _pwd "." ;# present working dir variable _interior ;# original interior setting } } # # Provide a lowercased access method for the Extfileselectionbox class. # proc ::iwidgets::extfileselectionbox {pathName args} { uplevel ::iwidgets::Extfileselectionbox $pathName $args } # # Use option database to override default resources of base classes. # option add *Extfileselectionbox.borderWidth 2 widgetDefault option add *Extfileselectionbox.filterLabel Filter widgetDefault option add *Extfileselectionbox.dirsLabel Directories widgetDefault option add *Extfileselectionbox.filesLabel Files widgetDefault option add *Extfileselectionbox.selectionLabel Selection widgetDefault option add *Extfileselectionbox.width 350 widgetDefault option add *Extfileselectionbox.height 300 widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::constructor {args} { # # Add back to the hull width and height options and make the # borderwidth zero since we don't need it. # itk_option add hull.width hull.height component hull configure -borderwidth 0 set _interior $itk_interior # # Create the filter entry. # itk_component add filter { iwidgets::Combobox $itk_interior.filter -unique true \ -command [itcl::code $this _selectFilter] -exportselection 0 \ -labelpos nw -completion 0 } { usual rename -labeltext -filterlabel filterLabel Text } set cmd [$itk_component(filter) cget -command] set cmd "$cmd;[itcl::code $this _selectFilter]" $itk_component(filter) configure -command "$cmd" -selectioncommand "$cmd"; # # Create a paned window for the directory and file lists. # itk_component add listpane { iwidgets::Panedwindow $itk_interior.listpane -orient vertical } $itk_component(listpane) add dirs -margin 5 $itk_component(listpane) add files -margin 5 # # Create the directory list. # itk_component add dirs { iwidgets::Scrolledlistbox [$itk_component(listpane) childsite dirs].dirs \ -selectioncommand [itcl::code $this _selectDir] \ -selectmode single -exportselection 0 \ -visibleitems 1x1 -labelpos nw \ -hscrollmode static -vscrollmode static \ -dblclickcommand [itcl::code $this _dblSelectDir] } { usual rename -labeltext -dirslabel dirsLabel Text } grid $itk_component(dirs) -sticky nsew grid rowconfigure [$itk_component(listpane) childsite dirs] 0 -weight 1 grid columnconfigure [$itk_component(listpane) childsite dirs] 0 -weight 1 # # Create the files list. # itk_component add files { iwidgets::Scrolledlistbox [$itk_component(listpane) childsite files].files \ -selectioncommand [itcl::code $this _selectFile] \ -selectmode single -exportselection 0 \ -visibleitems 1x1 -labelpos nw \ -hscrollmode static -vscrollmode static } { usual rename -labeltext -fileslabel filesLabel Text } grid $itk_component(files) -sticky nsew grid rowconfigure [$itk_component(listpane) childsite files] 0 -weight 1 grid columnconfigure [$itk_component(listpane) childsite files] 0 -weight 1 # # Create the selection entry. # itk_component add selection { iwidgets::Combobox $itk_interior.selection -unique true \ -command [itcl::code $this _selectSelection] -exportselection 0 \ -labelpos nw -completion 0 } { usual rename -labeltext -selectionlabel selectionLabel Text } # # Create the child site widget. # itk_component add -protected childsite { frame $itk_interior.fsbchildsite } # # Set the interior variable to the childsite for derived classes. # set itk_interior $itk_component(childsite) # # Explicitly handle configs that may have been ignored earlier. # eval itk_initialize $args # # When idle, pack the childsite and update the lists. # _packComponents _updateLists } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::destructor {} { if {$_packToken != ""} {after cancel $_packToken} if {$_updateToken != ""} {after cancel $_updateToken} } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -childsitepos # # Specifies the position of the child site in the selection box. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::childsitepos { _packComponents } # ------------------------------------------------------------------ # OPTION: -fileson # # Specifies whether or not to display the files list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::fileson { if {$itk_option(-fileson)} { $itk_component(listpane) show files _updateLists } else { $itk_component(listpane) hide files } } # ------------------------------------------------------------------ # OPTION: -dirson # # Specifies whether or not to display the dirs list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::dirson { if {$itk_option(-dirson)} { $itk_component(listpane) show dirs _updateLists } else { $itk_component(listpane) hide dirs } } # ------------------------------------------------------------------ # OPTION: -selectionon # # Specifies whether or not to display the selection entry widget. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::selectionon { _packComponents } # ------------------------------------------------------------------ # OPTION: -filteron # # Specifies whether or not to display the filter entry widget. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::filteron { _packComponents } # ------------------------------------------------------------------ # OPTION: -mask # # Specifies the initial file mask string. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::mask { global tcl_platform set prefix $_pwd # # Remove automounter paths. # if {$tcl_platform(platform) == "unix"} { if {$itk_option(-automount) != {}} { foreach autoDir $itk_option(-automount) { # Use catch because we can't be sure exactly what strings # were passed into the -automount option catch { if {[regsub ^/$autoDir $prefix {} prefix] != 0} { break } } } } } set curFilter $itk_option(-mask); $itk_component(filter) delete entry 0 end $itk_component(filter) insert entry 0 [file join "$_pwd" $itk_option(-mask)] # # Make sure the right most text is visable. # [$itk_component(filter) component entry] xview moveto 1 } # ------------------------------------------------------------------ # OPTION: -directory # # Specifies the initial default directory. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::directory { if {$itk_option(-directory) != {}} { if {! [file exists $itk_option(-directory)]} { error "bad directory option \"$itk_option(-directory)\":\ directory does not exist" } set olddir [pwd] cd $itk_option(-directory) set _pwd [pwd] cd $olddir configure -mask $itk_option(-mask) _selectFilter } } # ------------------------------------------------------------------ # OPTION: -automount # # Specifies list of directory prefixes to ignore. Typically, this # option would be used with values such as: # -automount {export tmp_mnt} # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::automount { } # ------------------------------------------------------------------ # OPTION: -nomatchstring # # Specifies the string to be displayed in the files list should # not regular files exist in the directory. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::nomatchstring { } # ------------------------------------------------------------------ # OPTION: -dirsearchcommand # # Specifies a command to be executed to perform a directory search. # The command will receive the current working directory and filter # mask as arguments. The command should return a list of files which # will be placed into the directory list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::dirsearchcommand { } # ------------------------------------------------------------------ # OPTION: -filesearchcommand # # Specifies a command to be executed to perform a file search. # The command will receive the current working directory and filter # mask as arguments. The command should return a list of files which # will be placed into the file list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::filesearchcommand { } # ------------------------------------------------------------------ # OPTION: -selectioncommand # # Specifies a command to be executed upon pressing return in the # selection entry widget. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::selectioncommand { } # ------------------------------------------------------------------ # OPTION: -filtercommand # # Specifies a command to be executed upon pressing return in the # filter entry widget. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::filtercommand { } # ------------------------------------------------------------------ # OPTION: -selectdircommand # # Specifies a command to be executed following selection of a # directory in the directory list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::selectdircommand { } # ------------------------------------------------------------------ # OPTION: -selectfilecommand # # Specifies a command to be executed following selection of a # file in the files list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::selectfilecommand { } # ------------------------------------------------------------------ # OPTION: -invalid # # Specify a command to executed should the filter contents be # proven invalid. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::invalid { } # ------------------------------------------------------------------ # OPTION: -filetype # # Specify the type of files which may appear in the file list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::filetype { switch $itk_option(-filetype) { regular - directory - any { } default { error "bad filetype option \"$itk_option(-filetype)\":\ should be regular, directory, or any" } } _updateLists } # ------------------------------------------------------------------ # OPTION: -width # # Specifies the width of the file selection box. The value may be # specified in any of the forms acceptable to Tk_GetPixels. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::width { # # The width option was added to the hull in the constructor. # So, any width value given is passed automatically to the # hull. All we have to do is play with the propagation. # if {$itk_option(-width) != 0} { set propagate 0 } else { set propagate 1 } # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $itk_component(hull)] != $propagate} { grid propagate $itk_component(hull) $propagate } } # ------------------------------------------------------------------ # OPTION: -height # # Specifies the height of the file selection box. The value may be # specified in any of the forms acceptable to Tk_GetPixels. # ------------------------------------------------------------------ itcl::configbody iwidgets::Extfileselectionbox::height { # # The height option was added to the hull in the constructor. # So, any height value given is passed automatically to the # hull. All we have to do is play with the propagation. # if {$itk_option(-height) != 0} { set propagate 0 } else { set propagate 1 } # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $itk_component(hull)] != $propagate} { grid propagate $itk_component(hull) $propagate } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Returns the path name of the child site widget. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::childsite {} { return $itk_component(childsite) } # ------------------------------------------------------------------ # METHOD: get # # Returns the current selection. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::get {} { return [$itk_component(selection) get] } # ------------------------------------------------------------------ # METHOD: filter # # The user has pressed Return in the filter. Make sure the contents # contain a valid directory before setting default to directory. # Use the invalid option to warn the user of any problems. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::filter {} { set newdir [file dirname [$itk_component(filter) get]] if {! [file exists $newdir]} { uplevel #0 "$itk_option(-invalid)" return } set _pwd $newdir; if {$_pwd == "."} {set _pwd [pwd]}; _updateLists } # ------------------------------------------------------------------ # PRIVATE METHOD: _updateLists ?now? # # Updates the contents of both the file and directory lists, as well # resets the positions of the filter, and lists. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_updateLists {{when "later"}} { switch -- $when { later { if {$_updateToken == ""} { set _updateToken [after idle [itcl::code $this _updateLists now]] } } now { if {$itk_option(-dirson)} {_setDirList} if {$itk_option(-fileson)} {_setFileList} if {$itk_option(-filteron)} { _setFilter } if {$itk_option(-selectionon)} { $itk_component(selection) icursor end } if {$itk_option(-dirson)} { $itk_component(dirs) justify left } if {$itk_option(-fileson)} { $itk_component(files) justify left } set _updateToken "" } default { error "bad option \"$when\": should be later or now" } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _setFilter # # Set the filter to the current selection in the directory list plus # any existing mask in the filter. Translate the two special cases # of '.', and '..' directory names to full path names.. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_setFilter {} { global tcl_platform set prefix [$itk_component(dirs) getcurselection] set curFilter [file tail [$itk_component(filter) get]] while {[regexp {\.$} $prefix]} { if {[file tail $prefix] == "."} { if {$prefix == "."} { if {$_pwd == "."} { set _pwd [pwd] } elseif {$_pwd == ".."} { set _pwd [file dirname [pwd]] } set prefix $_pwd } else { set prefix [file dirname $prefix] } } elseif {[file tail $prefix] == ".."} { if {$prefix != ".."} { set prefix [file dirname [file dirname $prefix]] } else { if {$_pwd == "."} { set _pwd [pwd] } elseif {$_pwd == ".."} { set _pwd [file dirname [pwd]] } set prefix [file dirname "$_pwd"] } } else { break } } if { [file pathtype $prefix] != "absolute" } { set prefix [file join "$_pwd" $prefix] } # # Remove automounter paths. # if {$tcl_platform(platform) == "unix"} { if {$itk_option(-automount) != {}} { foreach autoDir $itk_option(-automount) { # Use catch because we can't be sure exactly what strings # were passed into the -automount option catch { if {[regsub ^/$autoDir $prefix {} prefix] != 0} { break } } } } } $itk_component(filter) delete entry 0 end $itk_component(filter) insert entry 0 [file join $prefix $curFilter] if {[info level -1] != "_selectDir"} { $itk_component(filter) insert list 0 [file join $prefix $curFilter] } # # Make sure insertion cursor is at the end. # $itk_component(filter) icursor end # # Make sure the right most text is visable. # [$itk_component(filter) component entry] xview moveto 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _setSelection # # Set the contents of the selection entry to either the current # selection of the file or directory list dependent on which lists # are currently mapped. For the file list, avoid seleciton of the # no match string. As for the directory list, translate file names. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_setSelection {} { global tcl_platform $itk_component(selection) delete entry 0 end if {$itk_option(-fileson)} { set selection [$itk_component(files) getcurselection] if {$selection != $itk_option(-nomatchstring)} { if {[file pathtype $selection] != "absolute"} { set selection [file join "$_pwd" $selection] } # # Remove automounter paths. # if {$tcl_platform(platform) == "unix"} { if {$itk_option(-automount) != {}} { foreach autoDir $itk_option(-automount) { # Use catch because we can't be sure exactly what strings # were passed into the -automount option catch { if {[regsub ^/$autoDir $selection {} selection] != 0} { break } } } } } $itk_component(selection) insert entry 0 $selection } else { $itk_component(files) selection clear 0 end } } else { set selection [$itk_component(dirs) getcurselection] if {[file tail $selection] == "."} { if {$selection != "."} { set selection [file dirname $selection] } else { set selection "$_pwd" } } elseif {[file tail $selection] == ".."} { if {$selection != ".."} { set selection [file dirname [file dirname $selection]] } else { set selection [file join "$_pwd" ..] } } else { set selection [file join "$_pwd" $selection] } # # Remove automounter paths. # if {$tcl_platform(platform) == "unix"} { if {$itk_option(-automount) != {}} { foreach autoDir $itk_option(-automount) { # Use catch because we can't be sure exactly what strings # were passed into the -automount option catch { if {[regsub ^/$autoDir $selection {} selection] != 0} { break } } } } } $itk_component(selection) insert entry 0 $selection } $itk_component(selection) insert list 0 $selection $itk_component(selection) icursor end # # Make sure the right most text is visable. # [$itk_component(selection) component entry] xview moveto 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _setDirList # # Clear the directory list and dependent on whether the user has # defined their own search procedure or not fill the list with their # results or those of a glob. Select the first element if it exists. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_setDirList {} { $itk_component(dirs) clear set currentIndex "" if {$itk_option(-dirsearchcommand) == {}} { set cwd "$_pwd" set counter 0 foreach i [lsort [glob -nocomplain \ [file join $cwd .*] [file join $cwd *]]] { if {[file isdirectory $i]} { set insert "[file tail $i]" if {$insert == "."} { set currentIndex $counter } $itk_component(dirs) insert end "$insert" incr counter } } } else { set mask [file tail [$itk_component(filter) get]] foreach file [uplevel #0 $itk_option(-dirsearchcommand) "$_pwd" $mask] { $itk_component(dirs) insert end $file } } if {[$itk_component(dirs) size]} { $itk_component(dirs) selection clear 0 end if {$currentIndex != ""} { $itk_component(dirs) selection set $currentIndex } else { $itk_component(dirs) selection set 0 } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _setFileList # # Clear the file list and dependent on whether the user has defined # their own search procedure or not fill the list with their results # or those of a 'glob'. If the files list has no contents, then set # the files list to the 'nomatchstring'. Clear all selections. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_setFileList {} { $itk_component(files) clear set mask [file tail [$itk_component(filter) get]] if {$itk_option(-filesearchcommand) == {}} { if {$mask == "*"} { set files [lsort [glob -nocomplain \ [file join "$_pwd" .*] [file join "$_pwd" *]]] } else { set files [lsort [glob -nocomplain [file join "$_pwd" $mask]]] } foreach i $files { if {($itk_option(-filetype) == "regular" && \ ! [file isdirectory $i]) || \ ($itk_option(-filetype) == "directory" && \ [file isdirectory $i]) || \ ($itk_option(-filetype) == "any")} { set insert "[file tail $i]" $itk_component(files) insert end "$insert" } } } else { foreach file [uplevel #0 $itk_option(-filesearchcommand) "$_pwd" $mask] { $itk_component(files) insert end $file } } if {[$itk_component(files) size] == 0} { if {$itk_option(-nomatchstring) != {}} { $itk_component(files) insert end $itk_option(-nomatchstring) } } $itk_component(files) selection clear 0 end } # ------------------------------------------------------------------ # PRIVATE METHOD: _selectDir # # For a selection in the directory list, set the filter and possibly # the selection entry based on the fileson option. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_selectDir {} { _setFilter if {$itk_option(-fileson)} {} { _setSelection } if {$itk_option(-selectdircommand) != {}} { uplevel #0 $itk_option(-selectdircommand) } } # ------------------------------------------------------------------ # PRIVATE METHOD: _dblSelectDir # # For a double click event in the directory list, select the # directory, set the default to the selection, and update both the # file and directory lists. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_dblSelectDir {} { filter } # ------------------------------------------------------------------ # PRIVATE METHOD: _selectFile # # The user has selected a file. Put the current selection in the # file list in the selection entry widget. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_selectFile {} { _setSelection if {$itk_option(-selectfilecommand) != {}} { uplevel #0 $itk_option(-selectfilecommand) } } # ------------------------------------------------------------------ # PRIVATE METHOD: _selectSelection # # The user has pressed Return in the selection entry widget. Call # the defined selection command if it exists. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_selectSelection {} { if {$itk_option(-selectioncommand) != {}} { uplevel #0 $itk_option(-selectioncommand) } } # ------------------------------------------------------------------ # PRIVATE METHOD: _selectFilter # # The user has pressed Return in the filter entry widget. Call the # defined selection command if it exists, otherwise just filter. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_selectFilter {} { if {$itk_option(-filtercommand) != {}} { uplevel #0 $itk_option(-filtercommand) } else { filter } } # ------------------------------------------------------------------ # PRIVATE METHOD: _packComponents # # Pack the selection, items, and child site widgets based on options. # Using the -in option of pack, put the childsite around the frame # in the hull for n, s, e, and w positions. Make sure and raise # the child site since using the 'in' option may obscure the site. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_packComponents {{when "later"}} { if {$when == "later"} { if {$_packToken == ""} { set _packToken [after idle [itcl::code $this _packComponents now]] } return } elseif {$when != "now"} { error "bad option \"$when\": should be now or later" } set _packToken "" # # Forget about any previous placements via the grid and # reset all the possible minsizes and weights for all # the rows and columns. # foreach component {childsite listpane filter selection} { grid forget $itk_component($component) } for {set row 0} {$row < 6} {incr row} { grid rowconfigure $_interior $row -minsize 0 -weight 0 } for {set col 0} {$col < 3} {incr col} { grid columnconfigure $_interior $col -minsize 0 -weight 0 } # # Place all the components based on the childsite poisition # option. # switch $itk_option(-childsitepos) { n { _nPos } w { _wPos } s { _sPos } e { _ePos } top { _topPos } bottom { _bottomPos } default { error "bad childsitepos option \"$itk_option(-childsitepos)\":\ should be n, e, s, w, top, or bottom" } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _nPos # # Position the childsite to the north and all the other components # appropriately based on the individual "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_nPos {} { grid $itk_component(childsite) -row 0 -column 0 \ -columnspan 1 -rowspan 1 -sticky nsew -padx 5 if {$itk_option(-filteron)} { grid $itk_component(filter) -row 1 -column 0 \ -columnspan 1 -sticky ew -padx 5 grid rowconfigure $_interior 2 -minsize 7 } grid $itk_component(listpane) -row 3 -column 0 \ -columnspan 1 -sticky nsew grid rowconfigure $_interior 3 -weight 1 if {$itk_option(-selectionon)} { grid rowconfigure $_interior 4 -minsize 7 grid $itk_component(selection) -row 5 -column 0 \ -columnspan 1 -sticky ew -padx 5 } grid columnconfigure $_interior 0 -weight 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _sPos # # Position the childsite to the south and all the other components # appropriately based on the individual "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_sPos {} { if {$itk_option(-filteron)} { grid $itk_component(filter) -row 0 -column 0 \ -columnspan 1 -sticky ew -padx 5 grid rowconfigure $_interior 1 -minsize 7 } grid $itk_component(listpane) -row 2 -column 0 \ -columnspan 1 -sticky nsew grid rowconfigure $_interior 2 -weight 1 if {$itk_option(-selectionon)} { grid rowconfigure $_interior 3 -minsize 7 grid $itk_component(selection) -row 4 -column 0 \ -columnspan 1 -sticky ew -padx 5 } grid $itk_component(childsite) -row 5 -column 0 \ -columnspan 1 -rowspan 1 -sticky nsew -padx 5 grid columnconfigure $_interior 0 -weight 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _ePos # # Position the childsite to the east and all the other components # appropriately based on the individual "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_ePos {} { if {$itk_option(-filteron)} { grid $itk_component(filter) -row 0 -column 0 \ -columnspan 1 -sticky ew -padx 5 grid rowconfigure $_interior 1 -minsize 7 } grid $itk_component(listpane) -row 2 -column 0 \ -columnspan 1 -sticky nsew grid rowconfigure $_interior 2 -weight 1 if {$itk_option(-selectionon)} { grid rowconfigure $_interior 3 -minsize 7 grid $itk_component(selection) -row 4 -column 0 \ -columnspan 1 -sticky ew -padx 5 } grid $itk_component(childsite) -row 0 -column 1 \ -rowspan 5 -columnspan 1 -sticky nsew grid columnconfigure $_interior 0 -weight 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _wPos # # Position the childsite to the west and all the other components # appropriately based on the individual "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_wPos {} { grid $itk_component(childsite) -row 0 -column 0 \ -rowspan 5 -columnspan 1 -sticky nsew if {$itk_option(-filteron)} { grid $itk_component(filter) -row 0 -column 1 \ -columnspan 1 -sticky ew -padx 5 grid rowconfigure $_interior 1 -minsize 7 } grid $itk_component(listpane) -row 2 -column 1 \ -columnspan 1 -sticky nsew grid rowconfigure $_interior 2 -weight 1 if {$itk_option(-selectionon)} { grid rowconfigure $_interior 3 -minsize 7 grid $itk_component(selection) -row 4 -column 1 \ -columnspan 1 -sticky ew -padx 5 } grid columnconfigure $_interior 1 -weight 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _topPos # # Position the childsite below the filter but above the lists and # all the other components appropriately based on the individual # "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_topPos {} { if {$itk_option(-filteron)} { grid $itk_component(filter) -row 0 -column 0 \ -columnspan 1 -sticky ew -padx 5 } grid $itk_component(childsite) -row 1 -column 0 \ -columnspan 1 -rowspan 1 -sticky nsew -padx 5 grid $itk_component(listpane) -row 2 -column 0 -sticky nsew grid rowconfigure $_interior 2 -weight 1 if {$itk_option(-selectionon)} { grid rowconfigure $_interior 3 -minsize 7 grid $itk_component(selection) -row 4 -column 0 \ -columnspan 1 -sticky ew -padx 5 } grid columnconfigure $_interior 0 -weight 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _bottomPos # # Position the childsite below the lists and above the selection # and all the other components appropriately based on the individual # "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectionbox::_bottomPos {} { if {$itk_option(-filteron)} { grid $itk_component(filter) -row 0 -column 0 \ -columnspan 1 -sticky ew -padx 5 grid rowconfigure $_interior 1 -minsize 7 } grid $itk_component(listpane) -row 2 -column 0 -sticky nsew grid rowconfigure $_interior 2 -weight 1 grid $itk_component(childsite) -row 3 -column 0 \ -columnspan 1 -rowspan 1 -sticky nsew -padx 5 if {$itk_option(-selectionon)} { grid $itk_component(selection) -row 4 -column 0 \ -columnspan 1 -sticky ew -padx 5 } grid columnconfigure $_interior 0 -weight 1 } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/extfileselectiondialog.itk���������������������������������������������������0000644�0036047�0045461�00000015467�07437100166�020622� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Extfileselectiondialog # ---------------------------------------------------------------------- # Implements a file selection dialog that is a slightly extended version # of the OSF/Motif standard composite widget. The Extfileselectionbox # differs from the Motif standard in that the filter and selection # fields are comboboxes and the files and directory lists are in a # paned window. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com # # @(#) $Id: extfileselectiondialog.itk,v 1.3 2002/02/27 06:45:10 mgbacke Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Extfileselectiondialog { keep -activebackground -activerelief -background -borderwidth -cursor \ -elementborderwidth -foreground -highlightcolor -highlightthickness \ -insertbackground -insertborderwidth -insertofftime -insertontime \ -insertwidth -jump -labelfont -modality -selectbackground \ -selectborderwidth -textbackground -textfont } # ------------------------------------------------------------------ # EXTFILESELECTIONDIALOG # ------------------------------------------------------------------ itcl::class iwidgets::Extfileselectiondialog { inherit iwidgets::Dialog constructor {args} {} public { method childsite {} method get {} method filter {} } protected method _dbldir {} } # # Provide a lowercased access method for the Extfileselectiondialog class. # proc ::iwidgets::extfileselectiondialog {pathName args} { uplevel ::iwidgets::Extfileselectiondialog $pathName $args } # # Use option database to override default resources of base classes. # option add *Extfileselectiondialog.borderWidth 2 widgetDefault option add *Extfileselectiondialog.title "File Selection Dialog" widgetDefault option add *Extfileselectiondialog.width 350 widgetDefault option add *Extfileselectiondialog.height 400 widgetDefault option add *Extfileselectiondialog.master "." widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectiondialog::constructor {args} { component hull configure -borderwidth 0 itk_option add hull.width hull.height # # Turn off pack propagation for the hull widget so the width # and height options become active. # pack propagate $itk_component(hull) no # # Instantiate a file selection box widget. # itk_component add fsb { iwidgets::Extfileselectionbox $itk_interior.fsb -width 150 -height 150 \ -selectioncommand [itcl::code $this invoke] \ -selectdircommand [itcl::code $this default Apply] \ -selectfilecommand [itcl::code $this default OK] } { usual keep -labelfont -childsitepos -directory -dirslabel \ -dirsearchcommand -dirson -fileslabel -fileson \ -filesearchcommand -filterlabel -filteron \ -filetype -invalid -mask -nomatchstring \ -selectionlabel -selectionon -sashcursor } grid $itk_component(fsb) -sticky nsew grid rowconfigure $itk_interior 0 -weight 1 grid columnconfigure $itk_interior 0 -weight 1 $itk_component(fsb) component filter configure \ -focuscommand [itcl::code $this default Apply] $itk_component(fsb) component selection configure \ -focuscommand [itcl::code $this default OK] $itk_component(fsb) component dirs configure \ -dblclickcommand [itcl::code $this _dbldir] $itk_component(fsb) component files configure \ -dblclickcommand [itcl::code $this invoke] buttonconfigure Apply -text "Filter" \ -command [itcl::code $itk_component(fsb) filter] set itk_interior [$itk_component(fsb) childsite] hide Help eval itk_initialize $args } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Thinwrapped method of file selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectiondialog::childsite {} { return [$itk_component(fsb) childsite] } # ------------------------------------------------------------------ # METHOD: get # # Thinwrapped method of file selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectiondialog::get {} { return [$itk_component(fsb) get] } # ------------------------------------------------------------------ # METHOD: filter # # Thinwrapped method of file selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectiondialog::filter {} { return [$itk_component(fsb) filter] } # ------------------------------------------------------------------ # PROTECTED METHOD: _dbldir # # Double select in directory list. If the files list is on then # make the default button the filter and invoke. If not, just invoke. # ------------------------------------------------------------------ itcl::body iwidgets::Extfileselectiondialog::_dbldir {} { if {$itk_option(-fileson)} { default Apply } invoke } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/feedback.itk�����������������������������������������������������������������0000644�0036047�0045461�00000017126�07336540062�015613� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Feedback # ---------------------------------------------------------------------- # Implements a Feedback widget, to display feedback on the status of an # process to the user. Display is given as a percentage and as a # thermometer type bar. Options exist for adding a label and controlling its # position. # # ---------------------------------------------------------------------- # AUTHOR: Kris Raney EMAIL: kraney@spd.dsccc.com # # @(#) $Id: feedback.itk,v 1.5 2001/08/15 18:32:18 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1996 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # Acknowledgements: # # Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his # feedback.tcl code from tk inspect. The original code is copyright 1995 # Lawrence Berkeley Laboratory. # # This software is copyright (C) 1994 by the Lawrence Berkeley Laboratory. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that: (1) source code distributions # retain the above copyright notice and this paragraph in its entirety, (2) # distributions including binary code include the above copyright notice and # this paragraph in its entirety in the documentation or other materials # provided with the distribution, and (3) all advertising materials mentioning # features or use of this software display the following acknowledgement: # ``This product includes software developed by the University of California, # Lawrence Berkeley Laboratory and its contributors.'' Neither the name of # the University nor the names of its contributors may be used to endorse # or promote products derived from this software without specific prior # written permission. # # THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. # # Default resources. # option add *Feedback.borderWidth 2 widgetDefault option add *Feedback.labelPos n widgetDefault option add *Feedback.barHeight 20 widgetDefault option add *Feedback.troughColor White widgetDefault option add *Feedback.barColor Blue widgetDefault # # Usual options. # itk::usual Feedback { keep -background -cursor -foreground } # ------------------------------------------------------------------ # FEEDBACK # ------------------------------------------------------------------ itcl::class iwidgets::Feedback { inherit iwidgets::Labeledwidget constructor {args} {} destructor {} itk_option define -steps steps Steps 10 public { method reset {} method step {{inc 1}} } private { method _display variable _barwidth 0 variable _stepval 0 } } # # Provide a lowercased access method for the Dialogshell class. # proc ::iwidgets::feedback {pathName args} { uplevel ::iwidgets::Feedback $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Feedback::constructor {args} { itk_component add trough { frame $itk_interior.trough -relief sunken } { usual keep -borderwidth rename -background -troughcolor troughColor TroughColor rename -height -barheight barHeight Height } itk_component add bar { frame $itk_component(trough).bar -relief raised } { usual keep -borderwidth rename -background -barcolor barColor BarColor rename -height -barheight barHeight Height } pack $itk_component(bar) -side left -fill y -anchor w itk_component add percentage { label $itk_interior.percentage -text "0%" } grid $itk_component(trough) -row 1 -column 0 -sticky sew -padx 2 -pady 2 grid $itk_component(percentage) -row 2 -column 0 -sticky nsew -padx 2 -pady 2 grid rowconfigure $itk_interior 0 -weight 1 grid rowconfigure $itk_interior 1 -weight 1 grid columnconfigure $itk_interior 0 -weight 1 bind $itk_component(hull) <Configure> [itcl::code $this _display] eval itk_initialize $args } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Feedback::destructor {} { } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -steps # # Set the total number of steps. # ------------------------------------------------------------------ itcl::configbody iwidgets::Feedback::steps { step 0 } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ----------------------------------------------------------------------------- # PROTECTED METHOD: _display # # Displays the bar in the trough with the width set using the current number # of steps. # ----------------------------------------------------------------------------- itcl::body iwidgets::Feedback::_display {} { update idletasks set troughwidth [winfo width $itk_component(trough)] set _barwidth [expr { (1.0*$troughwidth-(2.0*[$itk_component(trough) cget -borderwidth])) / $itk_option(-steps)}] set fraction [expr {int((1.0*$_stepval)/$itk_option(-steps)*100.0)}] $itk_component(percentage) config -text "$fraction%" $itk_component(bar) config -width [expr {$_barwidth*$_stepval}] update } # ------------------------------------------------------------------ # METHOD: reset # # Resets the status bar to 0 # ------------------------------------------------------------------ itcl::body iwidgets::Feedback::reset {} { set _stepval 0 _display } # ------------------------------------------------------------------ # METHOD: step ?inc? # # Increase the value of the status bar by inc. Default to 1 # ------------------------------------------------------------------ itcl::body iwidgets::Feedback::step {{inc 1}} { if {$_stepval >= $itk_option(-steps)} { return } incr _stepval $inc _display } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/fileselectionbox.itk���������������������������������������������������������0000644�0036047�0045461�00000121440�07334044000�017405� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Fileselectionbox # ---------------------------------------------------------------------- # Implements a file selection box in a style similar to the OSF/Motif # standard XmFileselectionbox composite widget. The Fileselectionbox # is composed of directory and file scrolled lists as well as filter # and selection entry fields. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com # # @(#) $Id: fileselectionbox.itk,v 1.3 2001/08/07 19:56:48 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Fileselectionbox { keep -activebackground -activerelief -background -borderwidth -cursor \ -elementborderwidth -foreground -highlightcolor -highlightthickness \ -insertbackground -insertborderwidth -insertofftime -insertontime \ -insertwidth -jump -labelfont -selectbackground -selectborderwidth \ -textbackground -textfont -troughcolor } # ------------------------------------------------------------------ # FILESELECTIONBOX # ------------------------------------------------------------------ itcl::class iwidgets::Fileselectionbox { inherit itk::Widget constructor {args} {} destructor {} itk_option define -childsitepos childSitePos Position s itk_option define -fileson filesOn FilesOn true itk_option define -dirson dirsOn DirsOn true itk_option define -selectionon selectionOn SelectionOn true itk_option define -filteron filterOn FilterOn true itk_option define -mask mask Mask {*} itk_option define -directory directory Directory {} itk_option define -automount automount Automount {} itk_option define -nomatchstring noMatchString NoMatchString {} itk_option define -dirsearchcommand dirSearchCommand Command {} itk_option define -filesearchcommand fileSearchCommand Command {} itk_option define -selectioncommand selectionCommand Command {} itk_option define -filtercommand filterCommand Command {} itk_option define -selectdircommand selectDirCommand Command {} itk_option define -selectfilecommand selectFileCommand Command {} itk_option define -invalid invalid Command {bell} itk_option define -filetype fileType FileType {regular} itk_option define -width width Width 350 itk_option define -height height Height 300 public { method childsite {} method get {} method filter {} } public { method _selectDir {} method _dblSelectDir {} method _selectFile {} method _selectSelection {} method _selectFilter {} } protected { method _packComponents {{when later}} method _updateLists {{when later}} } private { method _setFilter {} method _setSelection {} method _setDirList {} method _setFileList {} method _nPos {} method _sPos {} method _ePos {} method _wPos {} method _topPos {} method _centerPos {} method _bottomPos {} variable _packToken "" ;# non-null => _packComponents pending variable _updateToken "" ;# non-null => _updateLists pending variable _pwd "." ;# present working dir variable _interior ;# original interior setting } } # # Provide a lowercased access method for the Fileselectionbox class. # proc ::iwidgets::fileselectionbox {pathName args} { uplevel ::iwidgets::Fileselectionbox $pathName $args } # # Use option database to override default resources of base classes. # option add *Fileselectionbox.borderWidth 2 widgetDefault option add *Fileselectionbox.filterLabel Filter widgetDefault option add *Fileselectionbox.dirsLabel Directories widgetDefault option add *Fileselectionbox.filesLabel Files widgetDefault option add *Fileselectionbox.selectionLabel Selection widgetDefault option add *Fileselectionbox.width 350 widgetDefault option add *Fileselectionbox.height 300 widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::constructor {args} { # # Add back to the hull width and height options and make the # borderwidth zero since we don't need it. # itk_option add hull.width hull.height component hull configure -borderwidth 0 set _interior $itk_interior # # Create the filter entry. # itk_component add filter { iwidgets::Entryfield $itk_interior.filter -labelpos nw \ -command [itcl::code $this _selectFilter] -exportselection 0 } { usual rename -labeltext -filterlabel filterLabel Text } # # Create the directory list. # itk_component add dirs { iwidgets::Scrolledlistbox $itk_interior.dirs \ -selectioncommand [itcl::code $this _selectDir] \ -selectmode single -exportselection 0 \ -visibleitems 1x1 -labelpos nw \ -hscrollmode static -vscrollmode static \ -dblclickcommand [itcl::code $this _dblSelectDir] } { usual rename -labeltext -dirslabel dirsLabel Text } # # Create the files list. # itk_component add files { iwidgets::Scrolledlistbox $itk_interior.files \ -selectioncommand [itcl::code $this _selectFile] \ -selectmode single -exportselection 0 \ -visibleitems 1x1 -labelpos nw \ -hscrollmode static -vscrollmode static } { usual rename -labeltext -fileslabel filesLabel Text } # # Create the selection entry. # itk_component add selection { iwidgets::Entryfield $itk_interior.selection -labelpos nw \ -command [itcl::code $this _selectSelection] -exportselection 0 } { usual rename -labeltext -selectionlabel selectionLabel Text } # # Create the child site widget. # itk_component add -protected childsite { frame $itk_interior.fsbchildsite } # # Set the interior variable to the childsite for derived classes. # set itk_interior $itk_component(childsite) # # Explicitly handle configs that may have been ignored earlier. # eval itk_initialize $args # # When idle, pack the childsite and update the lists. # _packComponents _updateLists } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::destructor {} { if {$_packToken != ""} {after cancel $_packToken} if {$_updateToken != ""} {after cancel $_updateToken} } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -childsitepos # # Specifies the position of the child site in the selection box. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::childsitepos { _packComponents } # ------------------------------------------------------------------ # OPTION: -fileson # # Specifies whether or not to display the files list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::fileson { _packComponents } # ------------------------------------------------------------------ # OPTION: -dirson # # Specifies whether or not to display the dirs list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::dirson { _packComponents } # ------------------------------------------------------------------ # OPTION: -selectionon # # Specifies whether or not to display the selection entry widget. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::selectionon { _packComponents } # ------------------------------------------------------------------ # OPTION: -filteron # # Specifies whether or not to display the filter entry widget. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::filteron { _packComponents } # ------------------------------------------------------------------ # OPTION: -mask # # Specifies the initial file mask string. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::mask { global tcl_platform set prefix $_pwd # # Remove automounter paths. # if {$tcl_platform(platform) == "unix"} { if {$itk_option(-automount) != {}} { foreach autoDir $itk_option(-automount) { # Use catch because we can't be sure exactly what strings # were passed into the -automount option catch { if {[regsub ^/$autoDir $prefix {} prefix] != 0} { break } } } } } set curFilter $itk_option(-mask); $itk_component(filter) delete 0 end $itk_component(filter) insert 0 [file join $_pwd $itk_option(-mask)] # # Make sure the right most text is visable. # $itk_component(filter) xview moveto 1 } # ------------------------------------------------------------------ # OPTION: -directory # # Specifies the initial default directory. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::directory { if {$itk_option(-directory) != {}} { if {! [file exists $itk_option(-directory)]} { error "bad directory option \"$itk_option(-directory)\":\ directory does not exist" } set olddir [pwd] cd $itk_option(-directory) set _pwd [pwd] cd $olddir configure -mask $itk_option(-mask) _selectFilter } } # ------------------------------------------------------------------ # OPTION: -automount # # Specifies list of directory prefixes to ignore. Typically, this # option would be used with values such as: # -automount {export tmp_mnt} # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::automount { } # ------------------------------------------------------------------ # OPTION: -nomatchstring # # Specifies the string to be displayed in the files list should # not regular files exist in the directory. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::nomatchstring { } # ------------------------------------------------------------------ # OPTION: -dirsearchcommand # # Specifies a command to be executed to perform a directory search. # The command will receive the current working directory and filter # mask as arguments. The command should return a list of files which # will be placed into the directory list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::dirsearchcommand { } # ------------------------------------------------------------------ # OPTION: -filesearchcommand # # Specifies a command to be executed to perform a file search. # The command will receive the current working directory and filter # mask as arguments. The command should return a list of files which # will be placed into the file list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::filesearchcommand { } # ------------------------------------------------------------------ # OPTION: -selectioncommand # # Specifies a command to be executed upon pressing return in the # selection entry widget. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::selectioncommand { } # ------------------------------------------------------------------ # OPTION: -filtercommand # # Specifies a command to be executed upon pressing return in the # filter entry widget. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::filtercommand { } # ------------------------------------------------------------------ # OPTION: -selectdircommand # # Specifies a command to be executed following selection of a # directory in the directory list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::selectdircommand { } # ------------------------------------------------------------------ # OPTION: -selectfilecommand # # Specifies a command to be executed following selection of a # file in the files list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::selectfilecommand { } # ------------------------------------------------------------------ # OPTION: -invalid # # Specify a command to executed should the filter contents be # proven invalid. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::invalid { } # ------------------------------------------------------------------ # OPTION: -filetype # # Specify the type of files which may appear in the file list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::filetype { switch $itk_option(-filetype) { regular - directory - any { } default { error "bad filetype option \"$itk_option(-filetype)\":\ should be regular, directory, or any" } } _updateLists } # ------------------------------------------------------------------ # OPTION: -width # # Specifies the width of the file selection box. The value may be # specified in any of the forms acceptable to Tk_GetPixels. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::width { # # The width option was added to the hull in the constructor. # So, any width value given is passed automatically to the # hull. All we have to do is play with the propagation. # if {$itk_option(-width) != 0} { set propagate 0 } else { set propagate 1 } # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $itk_component(hull)] != $propagate} { grid propagate $itk_component(hull) $propagate } } # ------------------------------------------------------------------ # OPTION: -height # # Specifies the height of the file selection box. The value may be # specified in any of the forms acceptable to Tk_GetPixels. # ------------------------------------------------------------------ itcl::configbody iwidgets::Fileselectionbox::height { # # The height option was added to the hull in the constructor. # So, any height value given is passed automatically to the # hull. All we have to do is play with the propagation. # if {$itk_option(-height) != 0} { set propagate 0 } else { set propagate 1 } # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $itk_component(hull)] != $propagate} { grid propagate $itk_component(hull) $propagate } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Returns the path name of the child site widget. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::childsite {} { return $itk_component(childsite) } # ------------------------------------------------------------------ # METHOD: get # # Returns the current selection. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::get {} { return [$itk_component(selection) get] } # ------------------------------------------------------------------ # METHOD: filter # # The user has pressed Return in the filter. Make sure the contents # contain a valid directory before setting default to directory. # Use the invalid option to warn the user of any problems. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::filter {} { set newdir [file dirname [$itk_component(filter) get]] if {! [file exists $newdir]} { uplevel #0 "$itk_option(-invalid)" return } set _pwd $newdir; if {$_pwd == "."} {set _pwd [pwd]}; _updateLists } # ------------------------------------------------------------------ # PRIVATE METHOD: _updateLists ?now? # # Updates the contents of both the file and directory lists, as well # resets the positions of the filter, and lists. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_updateLists {{when "later"}} { switch -- $when { later { if {$_updateToken == ""} { set _updateToken [after idle [itcl::code $this _updateLists now]] } } now { if {$itk_option(-dirson)} {_setDirList} if {$itk_option(-fileson)} {_setFileList} if {$itk_option(-filteron)} { _setFilter } if {$itk_option(-selectionon)} { $itk_component(selection) icursor end } if {$itk_option(-dirson)} { $itk_component(dirs) justify left } if {$itk_option(-fileson)} { $itk_component(files) justify left } set _updateToken "" } default { error "bad option \"$when\": should be later or now" } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _setFilter # # Set the filter to the current selection in the directory list plus # any existing mask in the filter. Translate the two special cases # of '.', and '..' directory names to full path names.. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_setFilter {} { global tcl_platform set prefix [$itk_component(dirs) getcurselection] set curFilter [file tail [$itk_component(filter) get]] while {[regexp {\.$} $prefix]} { if {[file tail $prefix] == "."} { if {$prefix == "."} { if {$_pwd == "."} { set _pwd [pwd] } elseif {$_pwd == ".."} { set _pwd [file dirname [pwd]] } set prefix $_pwd } else { set prefix [file dirname $prefix] } } elseif {[file tail $prefix] == ".."} { if {$prefix != ".."} { set prefix [file dirname [file dirname $prefix]] } else { if {$_pwd == "."} { set _pwd [pwd] } elseif {$_pwd == ".."} { set _pwd [file dirname [pwd]] } set prefix [file dirname $_pwd] } } else { break } } if { [file pathtype $prefix] != "absolute" } { set prefix [file join $_pwd $prefix] } # # Remove automounter paths. # if {$tcl_platform(platform) == "unix"} { if {$itk_option(-automount) != {}} { foreach autoDir $itk_option(-automount) { # Use catch because we can't be sure exactly what strings # were passed into the -automount option catch { if {[regsub ^/$autoDir $prefix {} prefix] != 0} { break } } } } } $itk_component(filter) delete 0 end $itk_component(filter) insert 0 [file join $prefix $curFilter] # # Make sure insertion cursor is at the end. # $itk_component(filter) icursor end # # Make sure the right most text is visable. # $itk_component(filter) xview moveto 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _setSelection # # Set the contents of the selection entry to either the current # selection of the file or directory list dependent on which lists # are currently mapped. For the file list, avoid seleciton of the # no match string. As for the directory list, translate file names. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_setSelection {} { global tcl_platform $itk_component(selection) delete 0 end if {$itk_option(-fileson)} { set selection [$itk_component(files) getcurselection] if {$selection != $itk_option(-nomatchstring)} { if {[file pathtype $selection] != "absolute"} { set selection [file join $_pwd $selection] } # # Remove automounter paths. # if {$tcl_platform(platform) == "unix"} { if {$itk_option(-automount) != {}} { foreach autoDir $itk_option(-automount) { # Use catch because we can't be sure exactly what strings # were passed into the -automount option catch { if {[regsub ^/$autoDir $selection {} selection] != 0} { break } } } } } $itk_component(selection) insert 0 $selection } else { $itk_component(files) selection clear 0 end } } else { set selection [$itk_component(dirs) getcurselection] if {[file tail $selection] == "."} { if {$selection != "."} { set selection [file dirname $selection] } else { set selection $_pwd } } elseif {[file tail $selection] == ".."} { if {$selection != ".."} { set selection [file dirname [file dirname $selection]] } else { set selection [file join $_pwd ..] } } else { set selection [file join $_pwd $selection] } # # Remove automounter paths. # if {$tcl_platform(platform) == "unix"} { if {$itk_option(-automount) != {}} { foreach autoDir $itk_option(-automount) { # Use catch because we can't be sure exactly what strings # were passed into the -automount option catch { if {[regsub ^/$autoDir $selection {} selection] != 0} { break } } } } } $itk_component(selection) delete 0 end $itk_component(selection) insert 0 $selection } $itk_component(selection) icursor end # # Make sure the right most text is visable. # $itk_component(selection) xview moveto 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _setDirList # # Clear the directory list and dependent on whether the user has # defined their own search procedure or not fill the list with their # results or those of a glob. Select the first element if it exists. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_setDirList {} { $itk_component(dirs) clear if {$itk_option(-dirsearchcommand) == {}} { foreach i [lsort [glob -nocomplain \ [file join $_pwd .*] [file join $_pwd *]]] { if {[file isdirectory $i]} { $itk_component(dirs) insert end [file tail "$i"] } } } else { set mask [file tail [$itk_component(filter) get]] foreach file [uplevel #0 $itk_option(-dirsearchcommand) $_pwd $mask] { $itk_component(dirs) insert end $file } } if {[$itk_component(dirs) size]} { $itk_component(dirs) selection clear 0 end $itk_component(dirs) selection set 0 } } # ------------------------------------------------------------------ # PRIVATE METHOD: _setFileList # # Clear the file list and dependent on whether the user has defined # their own search procedure or not fill the list with their results # or those of a 'glob'. If the files list has no contents, then set # the files list to the 'nomatchstring'. Clear all selections. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_setFileList {} { $itk_component(files) clear set mask [file tail [$itk_component(filter) get]] if {$itk_option(-filesearchcommand) == {}} { if {$mask == "*"} { set files [lsort [glob -nocomplain \ [file join $_pwd .*] [file join $_pwd *]]] } else { set files [lsort [glob -nocomplain [file join $_pwd $mask]]] } foreach i $files { if {($itk_option(-filetype) == "regular" && \ ! [file isdirectory $i]) || \ ($itk_option(-filetype) == "directory" && \ [file isdirectory $i]) || \ ($itk_option(-filetype) == "any")} { $itk_component(files) insert end [file tail "$i"] } } } else { foreach file [uplevel #0 $itk_option(-filesearchcommand) $_pwd $mask] { $itk_component(files) insert end $file } } if {[$itk_component(files) size] == 0} { if {$itk_option(-nomatchstring) != {}} { $itk_component(files) insert end $itk_option(-nomatchstring) } } $itk_component(files) selection clear 0 end } # ------------------------------------------------------------------ # PRIVATE METHOD: _selectDir # # For a selection in the directory list, set the filter and possibly # the selection entry based on the fileson option. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_selectDir {} { _setFilter if {$itk_option(-fileson)} {} { _setSelection } if {$itk_option(-selectdircommand) != {}} { uplevel #0 $itk_option(-selectdircommand) } } # ------------------------------------------------------------------ # PRIVATE METHOD: _dblSelectDir # # For a double click event in the directory list, select the # directory, set the default to the selection, and update both the # file and directory lists. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_dblSelectDir {} { filter } # ------------------------------------------------------------------ # PRIVATE METHOD: _selectFile # # The user has selected a file. Put the current selection in the # file list in the selection entry widget. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_selectFile {} { _setSelection if {$itk_option(-selectfilecommand) != {}} { uplevel #0 $itk_option(-selectfilecommand) } } # ------------------------------------------------------------------ # PRIVATE METHOD: _selectSelection # # The user has pressed Return in the selection entry widget. Call # the defined selection command if it exists. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_selectSelection {} { if {$itk_option(-selectioncommand) != {}} { uplevel #0 $itk_option(-selectioncommand) } } # ------------------------------------------------------------------ # PRIVATE METHOD: _selectFilter # # The user has pressed Return in the filter entry widget. Call the # defined selection command if it exists, otherwise just filter. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_selectFilter {} { if {$itk_option(-filtercommand) != {}} { uplevel #0 $itk_option(-filtercommand) } else { filter } } # ------------------------------------------------------------------ # PRIVATE METHOD: _packComponents # # Pack the selection, items, and child site widgets based on options. # Using the -in option of pack, put the childsite around the frame # in the hull for n, s, e, and w positions. Make sure and raise # the child site since using the 'in' option may obscure the site. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_packComponents {{when "later"}} { if {$when == "later"} { if {$_packToken == ""} { set _packToken [after idle [itcl::code $this _packComponents now]] } return } elseif {$when != "now"} { error "bad option \"$when\": should be now or later" } set _packToken "" # # Forget about any previous placements via the grid and # reset all the possible minsizes and weights for all # the rows and columns. # foreach component {childsite filter dirs files selection} { grid forget $itk_component($component) } for {set row 0} {$row < 6} {incr row} { grid rowconfigure $_interior $row -minsize 0 -weight 0 } for {set col 0} {$col < 4} {incr col} { grid columnconfigure $_interior $col -minsize 0 -weight 0 } # # Place all the components based on the childsite poisition # option. # switch $itk_option(-childsitepos) { n { _nPos } w { _wPos } s { _sPos } e { _ePos } center { _centerPos } top { _topPos } bottom { _bottomPos } default { error "bad childsitepos option \"$itk_option(-childsitepos)\":\ should be n, e, s, w, center, top, or bottom" } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _nPos # # Position the childsite to the north and all the other components # appropriately based on the individual "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_nPos {} { grid $itk_component(childsite) -row 0 -column 0 \ -columnspan 3 -rowspan 1 -sticky nsew if {$itk_option(-filteron)} { grid $itk_component(filter) -row 1 -column 0 \ -columnspan 3 -sticky ew grid rowconfigure $_interior 2 -minsize 7 } if {$itk_option(-dirson)} { grid $itk_component(dirs) -row 3 -column 0 \ -columnspan 1 -sticky nsew } if {$itk_option(-fileson)} { grid $itk_component(files) -row 3 -column 2 \ -columnspan 1 -sticky nsew } if {$itk_option(-dirson)} { if {$itk_option(-fileson)} { grid columnconfigure $_interior 1 -minsize 7 } else { grid configure $itk_component(dirs) -columnspan 3 -column 0 } } else { if {$itk_option(-fileson)} { grid configure $itk_component(files) -columnspan 3 -column 0 } } grid rowconfigure $_interior 3 -weight 1 if {$itk_option(-selectionon)} { grid rowconfigure $_interior 4 -minsize 7 grid $itk_component(selection) -row 5 -column 0 \ -columnspan 3 -sticky ew } grid columnconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 2 -weight 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _sPos # # Position the childsite to the south and all the other components # appropriately based on the individual "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_sPos {} { if {$itk_option(-filteron)} { grid $itk_component(filter) -row 0 -column 0 \ -columnspan 3 -sticky ew grid rowconfigure $_interior 1 -minsize 7 } if {$itk_option(-dirson)} { grid $itk_component(dirs) -row 2 -column 0 \ -columnspan 1 -sticky nsew } if {$itk_option(-fileson)} { grid $itk_component(files) -row 2 -column 2 \ -columnspan 1 -sticky nsew } if {$itk_option(-dirson)} { if {$itk_option(-fileson)} { grid columnconfigure $_interior 1 -minsize 7 } else { grid configure $itk_component(dirs) -columnspan 3 -column 0 } } else { if {$itk_option(-fileson)} { grid configure $itk_component(files) -columnspan 3 -column 0 } } grid rowconfigure $_interior 2 -weight 1 if {$itk_option(-selectionon)} { grid rowconfigure $_interior 3 -minsize 7 grid $itk_component(selection) -row 4 -column 0 \ -columnspan 3 -sticky ew } grid $itk_component(childsite) -row 5 -column 0 \ -columnspan 3 -rowspan 1 -sticky nsew grid columnconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 2 -weight 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _ePos # # Position the childsite to the east and all the other components # appropriately based on the individual "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_ePos {} { if {$itk_option(-filteron)} { grid $itk_component(filter) -row 0 -column 0 \ -columnspan 3 -sticky ew grid rowconfigure $_interior 1 -minsize 7 } if {$itk_option(-dirson)} { grid $itk_component(dirs) -row 2 -column 0 \ -columnspan 1 -sticky nsew } if {$itk_option(-fileson)} { grid $itk_component(files) -row 2 -column 2 \ -columnspan 1 -sticky nsew } if {$itk_option(-dirson)} { if {$itk_option(-fileson)} { grid columnconfigure $_interior 1 -minsize 7 } else { grid configure $itk_component(dirs) -columnspan 3 -column 0 } } else { if {$itk_option(-fileson)} { grid configure $itk_component(files) -columnspan 3 -column 0 } } grid rowconfigure $_interior 2 -weight 1 if {$itk_option(-selectionon)} { grid rowconfigure $_interior 3 -minsize 7 grid $itk_component(selection) -row 4 -column 0 \ -columnspan 3 -sticky ew } grid $itk_component(childsite) -row 0 -column 3 \ -rowspan 5 -columnspan 1 -sticky nsew grid columnconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 2 -weight 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _wPos # # Position the childsite to the west and all the other components # appropriately based on the individual "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_wPos {} { grid $itk_component(childsite) -row 0 -column 0 \ -rowspan 5 -columnspan 1 -sticky nsew if {$itk_option(-filteron)} { grid $itk_component(filter) -row 0 -column 1 \ -columnspan 3 -sticky ew grid rowconfigure $_interior 1 -minsize 7 } if {$itk_option(-dirson)} { grid $itk_component(dirs) -row 2 -column 1 \ -columnspan 1 -sticky nsew } if {$itk_option(-fileson)} { grid $itk_component(files) -row 2 -column 3 \ -columnspan 1 -sticky nsew } if {$itk_option(-dirson)} { if {$itk_option(-fileson)} { grid columnconfigure $_interior 2 -minsize 7 } else { grid configure $itk_component(dirs) -columnspan 3 -column 1 } } else { if {$itk_option(-fileson)} { grid configure $itk_component(files) -columnspan 3 -column 1 } } grid rowconfigure $_interior 2 -weight 1 if {$itk_option(-selectionon)} { grid rowconfigure $_interior 3 -minsize 7 grid $itk_component(selection) -row 4 -column 1 \ -columnspan 3 -sticky ew } grid columnconfigure $_interior 1 -weight 1 grid columnconfigure $_interior 3 -weight 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _topPos # # Position the childsite below the filter but above the lists and # all the other components appropriately based on the individual # "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_topPos {} { if {$itk_option(-filteron)} { grid $itk_component(filter) -row 0 -column 0 \ -columnspan 3 -sticky ew } grid $itk_component(childsite) -row 1 -column 0 \ -columnspan 3 -rowspan 1 -sticky nsew if {$itk_option(-dirson)} { grid $itk_component(dirs) -row 2 -column 0 -sticky nsew } if {$itk_option(-fileson)} { grid $itk_component(files) -row 2 -column 2 -sticky nsew } if {$itk_option(-dirson)} { if {$itk_option(-fileson)} { grid columnconfigure $_interior 1 -minsize 7 } else { grid configure $itk_component(dirs) -columnspan 3 -column 0 } } else { if {$itk_option(-fileson)} { grid configure $itk_component(files) -columnspan 3 -column 0 } } grid rowconfigure $_interior 2 -weight 1 if {$itk_option(-selectionon)} { grid rowconfigure $_interior 3 -minsize 7 grid $itk_component(selection) -row 4 -column 0 \ -columnspan 3 -sticky ew } grid columnconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 2 -weight 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _centerPos # # Position the childsite between the lists and all the other # components appropriately based on the individual "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_centerPos {} { if {$itk_option(-filteron)} { grid $itk_component(filter) -row 0 -column 0 \ -columnspan 3 -sticky ew grid rowconfigure $_interior 1 -minsize 7 } if {$itk_option(-dirson)} { grid $itk_component(dirs) -row 2 -column 0 \ -columnspan 1 -sticky nsew } if {$itk_option(-fileson)} { grid $itk_component(files) -row 2 -column 2 \ -columnspan 1 -sticky nsew } grid $itk_component(childsite) -row 2 \ -columnspan 1 -rowspan 1 -sticky nsew if {$itk_option(-dirson)} { if {$itk_option(-fileson)} { grid configure $itk_component(childsite) -column 1 grid columnconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 2 -weight 1 } else { grid configure $itk_component(dirs) -columnspan 2 -column 0 grid configure $itk_component(childsite) -column 2 grid columnconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 1 -weight 1 } } else { grid configure $itk_component(childsite) -column 0 if {$itk_option(-fileson)} { grid configure $itk_component(files) -columnspan 2 \ -column 1 grid columnconfigure $_interior 1 -weight 1 grid columnconfigure $_interior 2 -weight 1 } else { grid columnconfigure $_interior 0 -weight 1 } } grid rowconfigure $_interior 2 -weight 1 if {$itk_option(-selectionon)} { grid rowconfigure $_interior 3 -minsize 7 grid $itk_component(selection) -row 4 -column 0 \ -columnspan 3 -sticky ew } } # ------------------------------------------------------------------ # PRIVATE METHOD: _bottomPos # # Position the childsite below the lists and above the selection # and all the other components appropriately based on the individual # "on" options. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectionbox::_bottomPos {} { if {$itk_option(-filteron)} { grid $itk_component(filter) -row 0 -column 0 \ -columnspan 3 -sticky ew grid rowconfigure $_interior 1 -minsize 7 } if {$itk_option(-dirson)} { grid $itk_component(dirs) -row 2 -column 0 -sticky nsew } if {$itk_option(-fileson)} { grid $itk_component(files) -row 2 -column 2 -sticky nsew } if {$itk_option(-dirson)} { if {$itk_option(-fileson)} { grid columnconfigure $_interior 1 -minsize 7 } else { grid configure $itk_component(dirs) -columnspan 3 -column 0 } } else { if {$itk_option(-fileson)} { grid configure $itk_component(files) -columnspan 3 -column 0 } } grid rowconfigure $_interior 2 -weight 1 grid $itk_component(childsite) -row 3 -column 0 \ -columnspan 3 -rowspan 1 -sticky nsew if {$itk_option(-selectionon)} { grid $itk_component(selection) -row 4 -column 0 \ -columnspan 3 -sticky ew } grid columnconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 2 -weight 1 } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/fileselectiondialog.itk������������������������������������������������������0000644�0036047�0045461�00000015203�07334044000�020053� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Fileselectiondialog # ---------------------------------------------------------------------- # Implements a file selection box similar to the OSF/Motif standard # file selection dialog composite widget. The Fileselectiondialog is # derived from the Dialog class and is composed of a FileSelectionBox # with attributes set to manipulate the dialog buttons. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com # # @(#) $Id: fileselectiondialog.itk,v 1.2 2001/08/07 19:56:48 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Fileselectiondialog { keep -activebackground -activerelief -background -borderwidth -cursor \ -elementborderwidth -foreground -highlightcolor -highlightthickness \ -insertbackground -insertborderwidth -insertofftime -insertontime \ -insertwidth -jump -labelfont -modality -selectbackground \ -selectborderwidth -textbackground -textfont } # ------------------------------------------------------------------ # FILESELECTIONDIALOG # ------------------------------------------------------------------ itcl::class iwidgets::Fileselectiondialog { inherit iwidgets::Dialog constructor {args} {} public { method childsite {} method get {} method filter {} } protected method _dbldir {} } # # Provide a lowercased access method for the Fileselectiondialog class. # proc ::iwidgets::fileselectiondialog {pathName args} { uplevel ::iwidgets::Fileselectiondialog $pathName $args } # # Use option database to override default resources of base classes. # option add *Fileselectiondialog.borderWidth 2 widgetDefault option add *Fileselectiondialog.title "File Selection Dialog" widgetDefault option add *Fileselectiondialog.width 350 widgetDefault option add *Fileselectiondialog.height 400 widgetDefault option add *Fileselectiondialog.master "." widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectiondialog::constructor {args} { component hull configure -borderwidth 0 itk_option add hull.width hull.height # # Turn off pack propagation for the hull widget so the width # and height options become active. # pack propagate $itk_component(hull) no # # Instantiate a file selection box widget. # itk_component add fsb { iwidgets::Fileselectionbox $itk_interior.fsb -width 150 -height 150 \ -selectioncommand [itcl::code $this invoke] \ -selectdircommand [itcl::code $this default Apply] \ -selectfilecommand [itcl::code $this default OK] } { usual keep -labelfont -childsitepos -directory -dirslabel \ -dirsearchcommand -dirson -fileslabel -fileson \ -filesearchcommand -filterlabel -filteron \ -filetype -invalid -mask -nomatchstring \ -selectionlabel -selectionon } grid $itk_component(fsb) -sticky nsew grid rowconfigure $itk_interior 0 -weight 1 grid columnconfigure $itk_interior 0 -weight 1 $itk_component(fsb) component filter configure \ -focuscommand [itcl::code $this default Apply] $itk_component(fsb) component selection configure \ -focuscommand [itcl::code $this default OK] $itk_component(fsb) component dirs configure \ -dblclickcommand [itcl::code $this _dbldir] $itk_component(fsb) component files configure \ -dblclickcommand [itcl::code $this invoke] buttonconfigure Apply -text "Filter" \ -command [itcl::code $itk_component(fsb) filter] set itk_interior [$itk_component(fsb) childsite] hide Help eval itk_initialize $args } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Thinwrapped method of file selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectiondialog::childsite {} { return [$itk_component(fsb) childsite] } # ------------------------------------------------------------------ # METHOD: get # # Thinwrapped method of file selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectiondialog::get {} { return [$itk_component(fsb) get] } # ------------------------------------------------------------------ # METHOD: filter # # Thinwrapped method of file selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectiondialog::filter {} { return [$itk_component(fsb) filter] } # ------------------------------------------------------------------ # PROTECTED METHOD: _dbldir # # Double select in directory list. If the files list is on then # make the default button the filter and invoke. If not, just invoke. # ------------------------------------------------------------------ itcl::body iwidgets::Fileselectiondialog::_dbldir {} { if {$itk_option(-fileson)} { default Apply } invoke } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/finddialog.itk���������������������������������������������������������������0000644�0036047�0045461�00000040072�07334044000�016150� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Finddialog # ---------------------------------------------------------------------- # This class implements a dialog for searching text. It prompts the # user for a search string and the method of searching which includes # case sensitive, regular expressions, backwards, and all. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) RCS: $Id: finddialog.itk,v 1.3 2001/08/07 19:56:48 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1996 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Finddialog { keep -background -cursor -foreground -selectcolor } # ------------------------------------------------------------------ # IPRFINDDIALOG # ------------------------------------------------------------------ itcl::class ::iwidgets::Finddialog { inherit iwidgets::Dialogshell constructor {args} {} itk_option define -selectcolor selectColor Background {} itk_option define -clearcommand clearCommand Command {} itk_option define -matchcommand matchCommand Command {} itk_option define -patternbackground patternBackground Background \#707070 itk_option define -patternforeground patternForeground Foreground White itk_option define -searchbackground searchBackground Background \#c4c4c4 itk_option define -searchforeground searchForeground Foreground Black itk_option define -textwidget textWidget TextWidget {} public { method clear {} method find {} } protected { method _get {setting} method _textExists {} common _optionValues ;# Current settings of check buttons. common _searchPoint ;# Starting location for searches common _matchLen ;# Matching pattern string length } } # # Provide a lowercased access method for the ::finddialog class. # proc ::iwidgets::finddialog {pathName args} { uplevel ::iwidgets::Finddialog $pathName $args } # # Use option database to override default resources of base classes. # option add *Finddialog.title "Find" widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body ::iwidgets::Finddialog::constructor {args} { # # Add the find pattern entryfield. # itk_component add pattern { iwidgets::Entryfield $itk_interior.pattern -labeltext "Find:" } bind [$itk_component(pattern) component entry] \ <Return> "[itcl::code $this invoke]; break" # # Add the find all checkbutton. # itk_component add all { checkbutton $itk_interior.all \ -variable [itcl::scope _optionValues($this-all)] \ -text "All" } # # Add the case consideration checkbutton. # itk_component add case { checkbutton $itk_interior.case \ -variable [itcl::scope _optionValues($this-case)] \ -text "Consider Case" } # # Add the regular expression checkbutton. # itk_component add regexp { checkbutton $itk_interior.regexp \ -variable [itcl::scope _optionValues($this-regexp)] \ -text "Use Regular Expression" } # # Add the find backwards checkbutton. # itk_component add backwards { checkbutton $itk_interior.backwards \ -variable [itcl::scope _optionValues($this-backwards)] \ -text "Find Backwards" } # # Add the find, clear, and close buttons, making find be the default. # add Find -text Find -command [itcl::code $this find] add Clear -text Clear -command [itcl::code $this clear] add Close -text Close -command [itcl::code $this deactivate 0] default Find # # Use the grid to layout the components. # grid $itk_component(pattern) -row 0 -column 0 \ -padx 10 -pady 10 -columnspan 4 -sticky ew grid $itk_component(all) -row 1 -column 0 grid $itk_component(case) -row 1 -column 1 grid $itk_component(regexp) -row 1 -column 2 grid $itk_component(backwards) -row 1 -column 3 grid columnconfigure $itk_interior 0 -weight 1 grid columnconfigure $itk_interior 1 -weight 1 grid columnconfigure $itk_interior 2 -weight 1 grid columnconfigure $itk_interior 3 -weight 1 # # Initialize all the configuration options. # eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -clearcommand # # Specifies a command to be invoked following a clear operation. # The command is meant to be a means of notification that the # clear has taken place and allow other actions to take place such # as disabling a find again menu. # ------------------------------------------------------------------ itcl::configbody iwidgets::Finddialog::clearcommand {} # ------------------------------------------------------------------ # OPTION: -matchcommand # # Specifies a command to be invoked following a find operation. # The command is called with a match point as an argument. Should # a match not be found the match point is {}. # ------------------------------------------------------------------ itcl::configbody iwidgets::Finddialog::matchcommand {} # ------------------------------------------------------------------ # OPTION: -patternbackground # # Specifies the background color of the text matching the search # pattern. It may have any of the forms accepted by Tk_GetColor. # ------------------------------------------------------------------ itcl::configbody iwidgets::Finddialog::patternbackground {} # ------------------------------------------------------------------ # OPTION: -patternforeground # # Specifies the foreground color of the pattern matching a search # operation. It may have any of the forms accepted by Tk_GetColor. # ------------------------------------------------------------------ itcl::configbody iwidgets::Finddialog::patternforeground {} # ------------------------------------------------------------------ # OPTION: -searchforeground # # Specifies the foreground color of the line containing the matching # pattern from a search operation. It may have any of the forms # accepted by Tk_GetColor. # ------------------------------------------------------------------ itcl::configbody iwidgets::Finddialog::searchforeground {} # ------------------------------------------------------------------ # OPTION: -searchbackground # # Specifies the background color of the line containing the matching # pattern from a search operation. It may have any of the forms # accepted by Tk_GetColor. # ------------------------------------------------------------------ itcl::configbody iwidgets::Finddialog::searchbackground {} # ------------------------------------------------------------------ # OPTION: -textwidget # # Specifies the scrolledtext or text widget to be searched. # ------------------------------------------------------------------ itcl::configbody iwidgets::Finddialog::textwidget { if {$itk_option(-textwidget) != {}} { set _searchPoint($itk_option(-textwidget)) 1.0 } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # PUBLIC METHOD: clear # # Clear the pattern entryfield and the indicators. # ------------------------------------------------------------------ itcl::body ::iwidgets::Finddialog::clear {} { $itk_component(pattern) clear if {[_textExists]} { set _searchPoint($itk_option(-textwidget)) 1.0 $itk_option(-textwidget) tag remove search-line 1.0 end $itk_option(-textwidget) tag remove search-pattern 1.0 end } if {$itk_option(-clearcommand) != {}} { eval $itk_option(-clearcommand) } } # ------------------------------------------------------------------ # PUBLIC METHOD: find # # Search for a specific text string in the text widget given by # the -textwidget option. Should this option not be set to an # existing widget, then a quick exit is made. # ------------------------------------------------------------------ itcl::body ::iwidgets::Finddialog::find {} { if {! [_textExists]} { return } # # Clear any existing indicators in the text widget. # $itk_option(-textwidget) tag remove search-line 1.0 end $itk_option(-textwidget) tag remove search-pattern 1.0 end # # Make sure the search pattern isn't just blank. If so, skip this. # set pattern [_get pattern] if {[string trim $pattern] == ""} { return } # # After clearing out any old highlight indicators from a previous # search, we'll be building our search command piece-meal based on # the current settings of the checkbuttons in the find dialog. The # first we'll add is a variable to catch the count of the length # of the string matching the pattern. # set precmd "$itk_option(-textwidget) search \ -count [list [itcl::scope _matchLen($this)]]" if {! [_get case]} { append precmd " -nocase" } if {[_get regexp]} { append precmd " -regexp" } else { append precmd " -exact" } # # If we are going to find all matches, then the start point for # the search will be the beginning of the text; otherwise, we'll # use the last known starting point +/- a character depending on # the direction. # if {[_get all]} { set _searchPoint($itk_option(-textwidget)) 1.0 } else { if {[_get backwards]} { append precmd " -backwards" } else { append precmd " -forwards" } } # # Get the pattern to be matched and add it to the search command. # Since it may contain embedded spaces, we'll wrap it in a list. # append precmd " [list $pattern]" # # If the search is for all matches, then we'll be performing the # search until no more matches are found; otherwise, we'll break # out of the loop after one search. # while {1} { if {[_get all]} { set postcmd " $_searchPoint($itk_option(-textwidget)) end" } else { set postcmd " $_searchPoint($itk_option(-textwidget))" } # # Create the final search command out of the pre and post parts # and evaluate it which returns the location of the matching string. # set cmd {} append cmd $precmd $postcmd if {[catch {eval $cmd} matchPoint] != 0} { set _searchPoint($itk_option(-textwidget)) 1.0 return {} } # # If a match exists, then we'll make this spot be the new starting # position. Then we'll tag the line and the pattern in the line. # The foreground and background settings will lite these positions # in the text widget up. # if {$matchPoint != {}} { set _searchPoint($itk_option(-textwidget)) $matchPoint $itk_option(-textwidget) tag add search-line \ "$_searchPoint($itk_option(-textwidget)) linestart" \ "$_searchPoint($itk_option(-textwidget))" $itk_option(-textwidget) tag add search-line \ "$_searchPoint($itk_option(-textwidget)) + \ $_matchLen($this) chars" \ "$_searchPoint($itk_option(-textwidget)) lineend" $itk_option(-textwidget) tag add search-pattern \ $_searchPoint($itk_option(-textwidget)) \ "$_searchPoint($itk_option(-textwidget)) + \ $_matchLen($this) chars" } # # Set the search point for the next time through to be one # character more or less from the current search point based # on the direction. # if {[_get all] || ! [_get backwards]} { set _searchPoint($itk_option(-textwidget)) \ [$itk_option(-textwidget) index \ "$_searchPoint($itk_option(-textwidget)) + 1c"] } else { set _searchPoint($itk_option(-textwidget)) \ [$itk_option(-textwidget) index \ "$_searchPoint($itk_option(-textwidget)) - 1c"] } # # If this isn't a find all operation or we didn't get a match, exit. # if {(! [_get all]) || ($matchPoint == {})} { break } } # # Configure the colors for the search-line and search-pattern. # $itk_option(-textwidget) tag configure search-line \ -foreground $itk_option(-searchforeground) $itk_option(-textwidget) tag configure search-line \ -background $itk_option(-searchbackground) $itk_option(-textwidget) tag configure search-pattern \ -background $itk_option(-patternbackground) $itk_option(-textwidget) tag configure search-pattern \ -foreground $itk_option(-patternforeground) # # Adjust the view to be the last matched position. # if {$matchPoint != {}} { $itk_option(-textwidget) see $matchPoint } # # There may be multiple matches of the pattern on a single line, # so we'll set the tag priorities such that the pattern tag is higher. # $itk_option(-textwidget) tag raise search-pattern search-line # # If a match command is defined, then call it with the match point. # if {$itk_option(-matchcommand) != {}} { [subst $itk_option(-matchcommand)] $matchPoint } # # Return the match point to the caller so they know if we found # anything and if so where # return $matchPoint } # ------------------------------------------------------------------ # PROTECTED METHOD: _get setting # # Get the current value for the pattern, case, regexp, or backwards. # ------------------------------------------------------------------ itcl::body ::iwidgets::Finddialog::_get {setting} { switch $setting { pattern { return [$itk_component(pattern) get] } case { return $_optionValues($this-case) } regexp { return $_optionValues($this-regexp) } backwards { return $_optionValues($this-backwards) } all { return $_optionValues($this-all) } default { error "bad get setting: \"$setting\", should be pattern,\ case, regexp, backwards, or all" } } } # ------------------------------------------------------------------ # PROTECTED METHOD: _textExists # # Check the validity of the text widget option. Does it exist and # is it of the class Text or Scrolledtext. # ------------------------------------------------------------------ itcl::body ::iwidgets::Finddialog::_textExists {} { if {$itk_option(-textwidget) == {}} { return 0 } if {! [winfo exists $itk_option(-textwidget)]} { error "bad finddialog text widget value: \"$itk_option(-textwidget)\",\ the widget doesn't exist" } if {([winfo class $itk_option(-textwidget)] != "Text") && ([itcl::find objects -isa iwidgets::Scrolledtext *::$itk_option(-textwidget)] == "")} { error "bad finddialog text widget value: \"$itk_option(-textwidget)\",\ must be of the class Text or based on Scrolledtext" } return 1 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/hierarchy.itk����������������������������������������������������������������0000644�0036047�0045461�00000203007�13124774350�016041� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Hierarchy # ---------------------------------------------------------------------- # Hierarchical data viewer. Manages a list of nodes that can be # expanded or collapsed. Individual nodes can be highlighted. # Clicking with the right mouse button on any item brings up a # special item menu. Clicking on the background area brings up # a different popup menu. # ---------------------------------------------------------------------- # AUTHOR: Michael J. McLennan # Bell Labs Innovations for Lucent Technologies # mmclennan@lucent.com # # Mark L. Ulferts # DSC Communications # mulferts@austin.dsccc.com # # RCS: $Id: hierarchy.itk,v 1.10 2017/06/28 18:43:52 dgp Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1996 Lucent Technologies # ====================================================================== # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies and that # both that the copyright notice and warranty disclaimer appear in # supporting documentation, and that the names of Lucent Technologies # any of their entities not be used in advertising or publicity # pertaining to distribution of the software without specific, written # prior permission. # # Lucent Technologies disclaims all warranties with regard to this # software, including all implied warranties of merchantability and # fitness. In no event shall Lucent Technologies be liable for any # special, indirect or consequential damages or any damages whatsoever # resulting from loss of use, data or profits, whether in an action of # contract, negligence or other tortuous action, arising out of or in # connection with the use or performance of this software. # # ---------------------------------------------------------------------- # Copyright (c) 1996 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Hierarchy { keep -cursor -textfont -font keep -background -foreground -textbackground keep -selectbackground -selectforeground } # ------------------------------------------------------------------ # HIERARCHY # ------------------------------------------------------------------ itcl::class iwidgets::Hierarchy { inherit iwidgets::Scrolledwidget constructor {args} {} destructor {} itk_option define -alwaysquery alwaysQuery AlwaysQuery 0 itk_option define -closedicon closedIcon Icon {} itk_option define -dblclickcommand dblClickCommand Command {} itk_option define -expanded expanded Expanded 0 itk_option define -filter filter Filter 0 itk_option define -font font Font \ -*-Courier-Medium-R-Normal--*-120-*-*-*-*-*-* itk_option define -height height Height 0 itk_option define -iconcommand iconCommand Command {} itk_option define -icondblcommand iconDblCommand Command {} itk_option define -imagecommand imageCommand Command {} itk_option define -imagedblcommand imageDblCommand Command {} itk_option define -imagemenuloadcommand imageMenuLoadCommand Command {} itk_option define -markbackground markBackground Foreground #a0a0a0 itk_option define -markforeground markForeground Background Black itk_option define -nodeicon nodeIcon Icon {} itk_option define -openicon openIcon Icon {} itk_option define -querycommand queryCommand Command {} itk_option define -selectcommand selectCommand Command {} itk_option define -selectbackground selectBackground Foreground #c3c3c3 itk_option define -selectforeground selectForeground Background Black itk_option define -textmenuloadcommand textMenuLoadCommand Command {} itk_option define -visibleitems visibleItems VisibleItems 80x24 itk_option define -width width Width 0 public { method clear {} method collapse {node} method current {} method draw {{when -now}} method expand {node} method expanded {node} method expState { } method mark {op args} method prune {node} method refresh {node} method selection {op args} method toggle {node} method bbox {index} method compare {index1 op index2} method debug {args} {eval $args} method delete {first {last {}}} method dlineinfo {index} method dump {args} method get {index1 {index2 {}}} method index {index} method insert {args} method scan {option args} method search {args} method see {index} method tag {op args} method window {option args} method xview {args} method yview {args} } protected { method _contents {uid} method _post {x y} method _drawLevel {node indent} method _select {x y} method _deselectSubNodes {uid} method _deleteNodeInfo {uid} method _getParent {uid} method _getHeritage {uid} method _isInternalTag {tag} method _iconSelect {node icon} method _iconDblSelect {node icon} method _imageSelect {node} method _imageDblClick {node} method _imagePost {node image type x y} method _double {x y} } private { method _configureTags {} variable _filterCode "" ;# Compact view flag. variable _hcounter 0 ;# Counter for hierarchy icons variable _icons ;# Array of user icons by uid variable _images ;# Array of our icons by uid variable _indents ;# Array of indentation by uid variable _marked ;# Array of marked nodes by uid variable _markers "" ;# List of markers for level being drawn variable _nodes ;# Array of subnodes by uid variable _pending "" ;# Pending draw flag variable _posted "" ;# List of tags at posted menu position variable _selected ;# Array of selected nodes by uid variable _tags ;# Array of user tags by uid variable _text ;# Array of displayed text by uid variable _states ;# Array of selection state by uid variable _ucounter 0 ;# Counter for user icons } } # # Provide a lowercased access method for the Hierarchy class. # proc ::iwidgets::hierarchy {pathName args} { uplevel ::iwidgets::Hierarchy $pathName $args } # # Use option database to override default resources of base classes. # option add *Hierarchy.menuCursor arrow widgetDefault option add *Hierarchy.labelPos n widgetDefault option add *Hierarchy.tabs 30 widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::constructor {args} { itk_option remove iwidgets::Labeledwidget::state # # Our -width and -height options are slightly different than # those implemented by our base class, so we're going to # remove them and redefine our own. # itk_option remove iwidgets::Scrolledwidget::width itk_option remove iwidgets::Scrolledwidget::height # # Create a clipping frame which will provide the border for # relief display. # itk_component add clipper { frame $itk_interior.clipper } { usual keep -borderwidth -relief -highlightthickness -highlightcolor rename -highlightbackground -background background Background } grid $itk_component(clipper) -row 0 -column 0 -sticky nsew grid rowconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 0 -weight 1 # # Create a text widget for displaying our hierarchy. # itk_component add list { text $itk_component(clipper).list -wrap none -cursor center_ptr \ -state disabled -width 1 -height 1 \ -xscrollcommand \ [itcl::code $this _scrollWidget $itk_interior.horizsb] \ -yscrollcommand \ [itcl::code $this _scrollWidget $itk_interior.vertsb] \ -borderwidth 0 -highlightthickness 0 } { usual keep -spacing1 -spacing2 -spacing3 -tabs rename -font -textfont textFont Font rename -background -textbackground textBackground Background ignore -highlightthickness -highlightcolor ignore -insertbackground -insertborderwidth ignore -insertontime -insertofftime -insertwidth ignore -selectborderwidth ignore -borderwidth } grid $itk_component(list) -row 0 -column 0 -sticky nsew grid rowconfigure $itk_component(clipper) 0 -weight 1 grid columnconfigure $itk_component(clipper) 0 -weight 1 # # Configure the command on the vertical scroll bar in the base class. # $itk_component(vertsb) configure \ -command [itcl::code $itk_component(list) yview] # # Configure the command on the horizontal scroll bar in the base class. # $itk_component(horizsb) configure \ -command [itcl::code $itk_component(list) xview] # # Configure our text component's tab settings for twenty levels. # set tabs "" for {set i 1} {$i < 20} {incr i} { lappend tabs [expr {$i*12+4}] } $itk_component(list) configure -tabs $tabs # # Add popup menus that can be configured by the user to add # new functionality. # itk_component add itemMenu { menu $itk_component(list).itemmenu -tearoff 0 } { usual ignore -tearoff rename -cursor -menucursor menuCursor Cursor } itk_component add bgMenu { menu $itk_component(list).bgmenu -tearoff 0 } { usual ignore -tearoff rename -cursor -menucursor menuCursor Cursor } # # Adjust the bind tags to remove the class bindings. Also, add # bindings for mouse button 1 to do selection and button 3 to # display a popup. # set tags [bindtags $itk_component(list)] set idx [lsearch -exact $tags Text] bindtags $itk_component(list) [lreplace $tags $idx $idx] bind $itk_component(list) <ButtonPress-1> \ [itcl::code $this _select %x %y] bind $itk_component(list) <Double-1> \ [itcl::code $this _double %x %y] bind $itk_component(list) <ButtonPress-3> \ [itcl::code $this _post %x %y] # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::destructor {} { if {$_pending != ""} { after cancel $_pending } } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -font # # Font used for text in the list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::font { $itk_component(list) tag configure info \ -font $itk_option(-font) -spacing1 6 } # ------------------------------------------------------------------ # OPTION: -selectbackground # # Background color scheme for selected nodes. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::selectbackground { $itk_component(list) tag configure hilite \ -background $itk_option(-selectbackground) } # ------------------------------------------------------------------ # OPTION: -selectforeground # # Foreground color scheme for selected nodes. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::selectforeground { $itk_component(list) tag configure hilite \ -foreground $itk_option(-selectforeground) } # ------------------------------------------------------------------ # OPTION: -markbackground # # Background color scheme for marked nodes. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::markbackground { $itk_component(list) tag configure lowlite \ -background $itk_option(-markbackground) } # ------------------------------------------------------------------ # OPTION: -markforeground # # Foreground color scheme for marked nodes. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::markforeground { $itk_component(list) tag configure lowlite \ -foreground $itk_option(-markforeground) } # ------------------------------------------------------------------ # OPTION: -querycommand # # Command executed to query the contents of each node. If this # command contains "%n", it is replaced with the name of the desired # node. In its simpilest form it should return the children of the # given node as a list which will be depicted in the display. # # Since the names of the children are used as tags in the underlying # text widget, each child must be unique in the hierarchy. Due to # the unique requirement, the nodes shall be reffered to as uids # or uid in the singular sense. # # {uid [uid ...]} # # where uid is a unique id and primary key for the hierarchy entry # # Should the unique requirement pose a problem, the list returned # can take on another more extended form which enables the # association of text to be displayed with the uids. The uid must # still be unique, but the text does not have to obey the unique # rule. In addition, the format also allows the specification of # additional tags to be used on the same entry in the hierarchy # as the uid and additional icons to be displayed just before # the node. The tags and icons are considered to be the property of # the user in that the hierarchy widget will not depend on any of # their values. # # {{uid [text [tags [icons]]]} {uid [text [tags [icons]]]} ...} # # where uid is a unique id and primary key for the hierarchy entry # text is the text to be displayed for this uid # tags is a list of user tags to be applied to the entry # icons is a list of icons to be displayed in front of the text # # The hierarchy widget does a look ahead from each node to determine # if the node has a children. This can be cost some performace with # large hierarchies. User's can avoid this by providing a hint in # the user tags. A tag of "leaf" or "branch" tells the hierarchy # widget the information it needs to know thereby avoiding the look # ahead operation. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::querycommand { clear draw -eventually # Added for SF ticket #596111 _configureTags } # ------------------------------------------------------------------ # OPTION: -selectcommand # # Command executed to select an item in the list. If this command # contains "%n", it is replaced with the name of the selected node. # If it contains a "%s", it is replaced with a boolean indicator of # the node's current selection status, where a value of 1 denotes # that the node is currently selected and 0 that it is not. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::selectcommand { } # ------------------------------------------------------------------ # OPTION: -dblclickcommand # # Command executed to double click an item in the list. If this command # contains "%n", it is replaced with the name of the selected node. # If it contains a "%s", it is replaced with a boolean indicator of # the node's current selection status, where a value of 1 denotes # that the node is currently selected and 0 that it is not. # # Douglas R. Howard, Jr. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::dblclickcommand { } # ------------------------------------------------------------------ # OPTION: -iconcommand # # Command executed upon selection of user icons. If this command # contains "%n", it is replaced with the name of the node the icon # belongs to. Should it contain "%i" then the icon name is # substituted. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::iconcommand { } # ------------------------------------------------------------------ # OPTION: -icondblcommand # # Command executed upon double selection of user icons. If this command # contains "%n", it is replaced with the name of the node the icon # belongs to. Should it contain "%i" then the icon name is # substituted. # # Douglas R. Howard, Jr. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::icondblcommand { } # ------------------------------------------------------------------ # OPTION: -imagecommand # # Command executed upon selection of image icons. If this command # contains "%n", it is replaced with the name of the node the icon # belongs to. Should it contain "%i" then the icon name is # substituted. # # Douglas R. Howard, Jr. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::imagecommand { } # ------------------------------------------------------------------ # OPTION: -imagedblcommand # # Command executed upon double selection of user icons. If this command # contains "%n", it is replaced with the name of the node the icon # belongs to. # # Douglas R. Howard, Jr. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::imagedblcommand { } # ------------------------------------------------------------------ # OPTION: -alwaysquery # # Boolean flag which tells the hierarchy widget weather or not # each refresh of the display should be via a new query using # the -querycommand option or use the values previous found the # last time the query was made. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::alwaysquery { switch -- $itk_option(-alwaysquery) { 1 - true - yes - on { ;# okay } 0 - false - no - off { ;# okay } default { error "bad alwaysquery option \"$itk_option(-alwaysquery)\":\ should be boolean" } } } # ------------------------------------------------------------------ # OPTION: -filter # # When true only the branch nodes and selected items are displayed. # This gives a compact view of important items. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::filter { switch -- $itk_option(-filter) { 1 - true - yes - on { set newCode {set display [info exists _selected($child)]} } 0 - false - no - off { set newCode {set display 1} } default { error "bad filter option \"$itk_option(-filter)\":\ should be boolean" } } if {$newCode != $_filterCode} { set _filterCode $newCode draw -eventually } } # ------------------------------------------------------------------ # OPTION: -expanded # # When true, the hierarchy will be completely expanded when it # is first displayed. A fresh display can be triggered by # resetting the -querycommand option. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::expanded { switch -- $itk_option(-expanded) { 1 - true - yes - on { ;# okay } 0 - false - no - off { ;# okay } default { error "bad expanded option \"$itk_option(-expanded)\":\ should be boolean" } } } # ------------------------------------------------------------------ # OPTION: -openicon # # Specifies the open icon image to be used in the hierarchy. Should # one not be provided, then one will be generated, pixmap if # possible, bitmap otherwise. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::openicon { if {$itk_option(-openicon) == {}} { if {[lsearch [image names] openFolder] == -1} { if {[lsearch [image types] pixmap] != -1} { image create pixmap openFolder -data { /* XPM */ static char * dir_opened [] = { "16 16 4 1", /* colors */ ". c grey85 m white g4 grey90", "b c black m black g4 black", "y c yellow m white g4 grey80", "g c grey70 m white g4 grey70", /* pixels */ "................", "................", "................", "..bbbb..........", ".bggggb.........", "bggggggbbbbbbb..", "bggggggggggggb..", "bgbbbbbbbbbbbbbb", "bgbyyyyyyyyyyybb", "bbyyyyyyyyyyyyb.", "bbyyyyyyyyyyybb.", "byyyyyyyyyyyyb..", "bbbbbbbbbbbbbb..", "................", "................", "................"}; } } else { image create bitmap openFolder -data { #define open_width 16 #define open_height 16 static char open_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x81, 0x3f, 0x01, 0x20, 0xf9, 0xff, 0x0d, 0xc0, 0x07, 0x40, 0x03, 0x60, 0x01, 0x20, 0x01, 0x30, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; } } } set itk_option(-openicon) openFolder } else { if {[lsearch [image names] $itk_option(-openicon)] == -1} { error "bad openicon option \"$itk_option(-openicon)\":\ should be an existing image" } } } # ------------------------------------------------------------------ # OPTION: -closedicon # # Specifies the closed icon image to be used in the hierarchy. # Should one not be provided, then one will be generated, pixmap if # possible, bitmap otherwise. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::closedicon { if {$itk_option(-closedicon) == {}} { if {[lsearch [image names] closedFolder] == -1} { if {[lsearch [image types] pixmap] != -1} { image create pixmap closedFolder -data { /* XPM */ static char *dir_closed[] = { "16 16 3 1", ". c grey85 m white g4 grey90", "b c black m black g4 black", "y c yellow m white g4 grey80", "................", "................", "................", "..bbbb..........", ".byyyyb.........", "bbbbbbbbbbbbbb..", "byyyyyyyyyyyyb..", "byyyyyyyyyyyyb..", "byyyyyyyyyyyyb..", "byyyyyyyyyyyyb..", "byyyyyyyyyyyyb..", "byyyyyyyyyyyyb..", "bbbbbbbbbbbbbb..", "................", "................", "................"}; } } else { image create bitmap closedFolder -data { #define closed_width 16 #define closed_height 16 static char closed_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0xfe, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; } } } set itk_option(-closedicon) closedFolder } else { if {[lsearch [image names] $itk_option(-closedicon)] == -1} { error "bad closedicon option \"$itk_option(-closedicon)\":\ should be an existing image" } } } # ------------------------------------------------------------------ # OPTION: -nodeicon # # Specifies the node icon image to be used in the hierarchy. Should # one not be provided, then one will be generated, pixmap if # possible, bitmap otherwise. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::nodeicon { if {$itk_option(-nodeicon) == {}} { if {[lsearch [image names] nodeFolder] == -1} { if {[lsearch [image types] pixmap] != -1} { image create pixmap nodeFolder -data { /* XPM */ static char *dir_node[] = { "16 16 3 1", ". c grey85 m white g4 grey90", "b c black m black g4 black", "y c yellow m white g4 grey80", "................", "................", "................", "...bbbbbbbbbbb..", "..bybyyyyyyyyb..", ".byybyyyyyyyyb..", "byyybyyyyyyyyb..", "bbbbbyyyyyyyyb..", "byyyyyyyyyyyyb..", "byyyyyyyyyyyyb..", "byyyyyyyyyyyyb..", "byyyyyyyyyyyyb..", "bbbbbbbbbbbbbb..", "................", "................", "................"}; } } else { image create bitmap nodeFolder -data { #define node_width 16 #define node_height 16 static char node_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x50, 0x40, 0x48, 0x40, 0x44, 0x40, 0x42, 0x40, 0x7e, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; } } } set itk_option(-nodeicon) nodeFolder } else { if {[lsearch [image names] $itk_option(-nodeicon)] == -1} { error "bad nodeicon option \"$itk_option(-nodeicon)\":\ should be an existing image" } } } # ------------------------------------------------------------------ # OPTION: -width # # Specifies the width of the hierarchy widget as an entire unit. # The value may be specified in any of the forms acceptable to # Tk_GetPixels. Any additional space needed to display the other # components such as labels, margins, and scrollbars force the text # to be compressed. A value of zero along with the same value for # the height causes the value given for the visibleitems option # to be applied which administers geometry constraints in a different # manner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::width { if {$itk_option(-width) != 0} { set shell [lindex [grid info $itk_component(clipper)] 1] # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $shell]} { grid propagate $shell no } $itk_component(list) configure -width 1 $shell configure \ -width [winfo pixels $shell $itk_option(-width)] } else { configure -visibleitems $itk_option(-visibleitems) } } # ------------------------------------------------------------------ # OPTION: -height # # Specifies the height of the hierarchy widget as an entire unit. # The value may be specified in any of the forms acceptable to # Tk_GetPixels. Any additional space needed to display the other # components such as labels, margins, and scrollbars force the text # to be compressed. A value of zero along with the same value for # the width causes the value given for the visibleitems option # to be applied which administers geometry constraints in a different # manner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::height { if {$itk_option(-height) != 0} { set shell [lindex [grid info $itk_component(clipper)] 1] # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $shell]} { grid propagate $shell no } $itk_component(list) configure -height 1 $shell configure \ -height [winfo pixels $shell $itk_option(-height)] } else { configure -visibleitems $itk_option(-visibleitems) } } # ------------------------------------------------------------------ # OPTION: -visibleitems # # Specified the widthxheight in characters and lines for the text. # This option is only administered if the width and height options # are both set to zero, otherwise they take precedence. With the # visibleitems option engaged, geometry constraints are maintained # only on the text. The size of the other components such as # labels, margins, and scroll bars, are additive and independent, # effecting the overall size of the scrolled text. In contrast, # should the width and height options have non zero values, they # are applied to the scrolled text as a whole. The text is # compressed or expanded to maintain the geometry constraints. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::visibleitems { if {[regexp {^[0-9]+x[0-9]+$} $itk_option(-visibleitems)]} { if {($itk_option(-width) == 0) && \ ($itk_option(-height) == 0)} { set chars [lindex [split $itk_option(-visibleitems) x] 0] set lines [lindex [split $itk_option(-visibleitems) x] 1] set shell [lindex [grid info $itk_component(clipper)] 1] # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {! [grid propagate $shell]} { grid propagate $shell yes } $itk_component(list) configure -width $chars -height $lines } } else { error "bad visibleitems option\ \"$itk_option(-visibleitems)\": should be\ widthxheight" } } # ------------------------------------------------------------------ # OPTION: -textmenuloadcommand # # Dynamically loads the popup menu based on what was selected. # # Douglas R. Howard, Jr. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::textmenuloadcommand {} # ------------------------------------------------------------------ # OPTION: -imagemenuloadcommand # # Dynamically loads the popup menu based on what was selected. # # Douglas R. Howard, Jr. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hierarchy::imagemenuloadcommand {} # ------------------------------------------------------------------ # PUBLIC METHODS # ------------------------------------------------------------------ # ---------------------------------------------------------------------- # PUBLIC METHOD: clear # # Removes all items from the display including all tags and icons. # The display will remain empty until the -filter or -querycommand # options are set. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::clear {} { $itk_component(list) configure -state normal -cursor watch $itk_component(list) delete 1.0 end $itk_component(list) configure -state disabled -cursor $itk_option(-cursor) # Clear the tags eval $itk_component(list) tag delete [$itk_component(list) tag names] catch {unset _nodes} catch {unset _text} catch {unset _tags} catch {unset _icons} catch {unset _states} catch {unset _images} catch {unset _indents} catch {unset _marked} catch {unset _selected} set _markers "" set _posted "" set _ucounter 0 set _hcounter 0 foreach mark [$itk_component(list) mark names] { $itk_component(list) mark unset $mark } return } # ---------------------------------------------------------------------- # PUBLIC METHOD: selection option ?uid uid...? # # Handles all operations controlling selections in the hierarchy. # Selections may be cleared, added, removed, or queried. The add and # remove options accept a series of unique ids. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::selection {op args} { switch -- $op { clear { $itk_component(list) tag remove hilite 1.0 end catch {unset _selected} return } add { foreach node $args { set _selected($node) 1 catch { $itk_component(list) tag add hilite \ "$node.first" "$node.last" } } } remove { foreach node $args { catch { unset _selected($node) $itk_component(list) tag remove hilite \ "$node.first" "$node.last" } } } get { return [array names _selected] } default { error "bad selection operation \"$op\":\ should be add, remove, clear or get" } } } # ---------------------------------------------------------------------- # PUBLIC METHOD: mark option ?arg arg...? # # Handles all operations controlling marks in the hierarchy. Marks may # be cleared, added, removed, or queried. The add and remove options # accept a series of unique ids. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::mark {op args} { switch -- $op { clear { $itk_component(list) tag remove lowlite 1.0 end catch {unset _marked} return } add { foreach node $args { set _marked($node) 1 catch { $itk_component(list) tag add lowlite \ "$node.first" "$node.last" } } } remove { foreach node $args { catch { unset _marked($node) $itk_component(list) tag remove lowlite \ "$node.first" "$node.last" } } } get { return [array names _marked] } default { error "bad mark operation \"$op\":\ should be add, remove, clear or get" } } } # ---------------------------------------------------------------------- # PUBLIC METHOD: current # # Returns the node that was most recently selected by the right mouse # button when the item menu was posted. Usually used by the code # in the item menu to figure out what item is being manipulated. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::current {} { return $_posted } # ---------------------------------------------------------------------- # PUBLIC METHOD: expand node # # Expands the hierarchy beneath the specified node. Since this can take # a moment for large hierarchies, the cursor will be changed to a watch # during the expansion. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::expand {node} { if {! [info exists _states($node)]} { error "bad expand node argument: \"$node\", the node doesn't exist" } if {!$_states($node) && \ (([lsearch $_tags($node) branch] != -1) || \ ([llength [_contents $node]] > 0))} { $itk_component(list) configure -state normal -cursor watch update # # Get the indentation level for the node. # set indent $_indents($node) set _markers "" $itk_component(list) mark set insert "$node:start" _drawLevel $node $indent # # Following the draw, all our markers need adjusting. # foreach {name index} $_markers { $itk_component(list) mark set $name $index } # # Set the image to be the open icon, denote the new state, # and set the cursor back to normal along with the state. # $_images($node) configure -image $itk_option(-openicon) set _states($node) 1 $itk_component(list) configure -state disabled \ -cursor $itk_option(-cursor) } } # ---------------------------------------------------------------------- # PUBLIC METHOD: collapse node # # Collapses the hierarchy beneath the specified node. Since this can # take a moment for large hierarchies, the cursor will be changed to a # watch during the expansion. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::collapse {node} { if {! [info exists _states($node)]} { error "bad collapse node argument: \"$node\", the node doesn't exist" } if {[info exists _states($node)] && $_states($node) && \ (([lsearch $_tags($node) branch] != -1) || \ ([llength [_contents $node]] > 0))} { $itk_component(list) configure -state normal -cursor watch update _deselectSubNodes $node $itk_component(list) delete "$node:start" "$node:end" catch {$_images($node) configure -image $itk_option(-closedicon)} set _states($node) 0 $itk_component(list) configure -state disabled \ -cursor $itk_option(-cursor) } } # ---------------------------------------------------------------------- # PUBLIC METHOD: toggle node # # Toggles the hierarchy beneath the specified node. If the hierarchy # is currently expanded, then it is collapsed, and vice-versa. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::toggle {node} { if {! [info exists _states($node)]} { error "bad toggle node argument: \"$node\", the node doesn't exist" } if {$_states($node)} { collapse $node } else { expand $node } } # ---------------------------------------------------------------------- # PUBLIC METHOD: prune node # # Removes a particular node from the hierarchy. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::prune {node} { # # While we're working, change the state and cursor so we can # edit the text and give a busy visual clue. # $itk_component(list) configure -state normal -cursor watch # # Recursively delete all the subnode information from our internal # arrays and remove all the tags. # _deleteNodeInfo $node # # If the mark $node:end exists then the node has decendents so # so we'll remove from the mark $node:start to $node:end in order # to delete all the subnodes below it in the text. # if {[lsearch [$itk_component(list) mark names] $node:end] != -1} { $itk_component(list) delete $node:start $node:end $itk_component(list) mark unset $node:end } # # Next we need to remove the node itself. Using the ranges for # its tag we'll remove it from line start to the end plus one # character which takes us to the start of the next node. # foreach {start end} [$itk_component(list) tag ranges $node] { $itk_component(list) delete "$start linestart" "$end + 1 char" } # # Delete the tag for this node. # $itk_component(list) tag delete $node # # The node must be removed from the list of subnodes for its parent. # We don't really have a clean way to do upwards referencing, so # the dirty way will have to do. We'll cycle through each node # and if this node is in its list of subnodes, we'll remove it. # foreach uid [array names _nodes] { if {[set index [lsearch $_nodes($uid) $node]] != -1} { set _nodes($uid) [lreplace $_nodes($uid) $index $index] } } # # We're done, so change the state and cursor back to their # original values. # $itk_component(list) configure -state disabled -cursor $itk_option(-cursor) } # ---------------------------------------------------------------------- # PUBLIC METHOD: draw ?when? # # Performs a complete draw of the entire hierarchy. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::draw {{when -now}} { if {$when == "-eventually"} { if {$_pending == ""} { set _pending [after idle [itcl::code $this draw -now]] } return } elseif {$when != "-now"} { error "bad when option \"$when\": should be -eventually or -now" } $itk_component(list) configure -state normal -cursor watch update $itk_component(list) delete 1.0 end catch {unset _images} set _markers "" _drawLevel "" "" foreach {name index} $_markers { $itk_component(list) mark set $name $index } $itk_component(list) configure -state disabled -cursor $itk_option(-cursor) set _pending "" } # ---------------------------------------------------------------------- # PUBLIC METHOD: refresh node # # Performs a redraw of a specific node. If that node is currently # not visible, then no action is taken. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::refresh {node} { if {! [info exists _nodes($node)]} { error "bad refresh node argument: \"$node\", the node doesn't exist" } if {! $_states($node)} {return} foreach parent [_getHeritage $node] { if {! $_states($parent)} {return} } $itk_component(list) configure -state normal -cursor watch $itk_component(list) delete $node:start $node:end set _markers "" $itk_component(list) mark set insert "$node:start" set indent $_indents($node) _drawLevel $node $indent foreach {name index} $_markers { $itk_component(list) mark set $name $index } $itk_component(list) configure -state disabled -cursor $itk_option(-cursor) } # ------------------------------------------------------------------ # THIN WRAPPED TEXT METHODS: # # The following methods are thin wraps of standard text methods. # Consult the Tk text man pages for functionallity and argument # documentation. # ------------------------------------------------------------------ # ------------------------------------------------------------------ # PUBLIC METHOD: bbox index # # Returns four element list describing the bounding box for the list # item at index # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::bbox {index} { return [$itk_component(list) bbox $index] } # ------------------------------------------------------------------ # PUBLIC METHOD compare index1 op index2 # # Compare indices according to relational operator. # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::compare {index1 op index2} { return [$itk_component(list) compare $index1 $op $index2] } # ------------------------------------------------------------------ # PUBLIC METHOD delete first ?last? # # Delete a range of characters from the text. # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::delete {first {last {}}} { $itk_component(list) configure -state normal -cursor watch $itk_component(list) delete $first $last $itk_component(list) configure -state disabled -cursor $itk_option(-cursor) } # ------------------------------------------------------------------ # PUBLIC METHOD dump ?switches? index1 ?index2? # # Returns information about the contents of the text widget from # index1 to index2. # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::dump {args} { return [eval $itk_component(list) dump $args] } # ------------------------------------------------------------------ # PUBLIC METHOD dlineinfo index # # Returns a five element list describing the area occupied by the # display line containing index. # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::dlineinfo {index} { return [$itk_component(list) dlineinfo $index] } # ------------------------------------------------------------------ # PUBLIC METHOD get index1 ?index2? # # Return text from start index to end index. # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::get {index1 {index2 {}}} { return [$itk_component(list) get $index1 $index2] } # ------------------------------------------------------------------ # PUBLIC METHOD index index # # Return position corresponding to index. # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::index {index} { return [$itk_component(list) index $index] } # ------------------------------------------------------------------ # PUBLIC METHOD insert index chars ?tagList? # # Insert text at index. # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::insert {args} { $itk_component(list) configure -state normal -cursor watch eval $itk_component(list) insert $args $itk_component(list) configure -state disabled -cursor $itk_option(-cursor) } # ------------------------------------------------------------------ # PUBLIC METHOD scan option args # # Implements scanning on texts. # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::scan {option args} { eval $itk_component(list) scan $option $args } # ------------------------------------------------------------------ # PUBLIC METHOD search ?switches? pattern index ?varName? # # Searches the text for characters matching a pattern. # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::search {args} { return [eval $itk_component(list) search $args] } # ------------------------------------------------------------------ # PUBLIC METHOD see index # # Adjusts the view in the window so the character at index is # visible. # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::see {index} { $itk_component(list) see $index } # ------------------------------------------------------------------ # PUBLIC METHOD tag option ?arg arg ...? # # Manipulate tags dependent on options. # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::tag {op args} { return [eval $itk_component(list) tag $op $args] } # ------------------------------------------------------------------ # PUBLIC METHOD window option ?arg arg ...? # # Manipulate embedded windows. # ------------------------------------------------------------------ itcl::body iwidgets::Hierarchy::window {option args} { return [eval $itk_component(list) window $option $args] } # ---------------------------------------------------------------------- # PUBLIC METHOD: xview args # # Thin wrap of the text widget's xview command. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::xview {args} { return [eval itk_component(list) xview $args] } # ---------------------------------------------------------------------- # PUBLIC METHOD: yview args # # Thin wrap of the text widget's yview command. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::yview {args} { return [eval $itk_component(list) yview $args] } # ---------------------------------------------------------------------- # PUBLIC METHOD: expanded node # # Tells if a node is expanded or collapsed # # Douglas R. Howard, Jr. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::expanded {node} { if {! [info exists _states($node)]} { error "bad collapse node argument: \"$node\", the node doesn't exist" } return $_states($node) } # ---------------------------------------------------------------------- # PUBLIC METHOD: expState # # Returns a list of all expanded nodes # # Douglas R. Howard, Jr. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::expState {} { set nodes [_contents ""] set open "" set i 0 while {1} { if {[info exists _states([lindex $nodes $i])] && $_states([lindex $nodes $i])} { lappend open [lindex $nodes $i] foreach child [_contents [lindex $nodes $i]] { lappend nodes $child } } incr i if {$i >= [llength $nodes]} {break} } return $open } # ------------------------------------------------------------------ # PROTECTED METHODS # ------------------------------------------------------------------ # ---------------------------------------------------------------------- # PROTECTED METHOD: _drawLevel node indent # # Used internally by draw to draw one level of the hierarchy. # Draws all of the nodes under node, using the indent string to # indent nodes. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_drawLevel {node indent} { lappend _markers "$node:start" [$itk_component(list) index insert] set bg [$itk_component(list) cget -background] # # Obtain the list of subnodes for this node and cycle through # each one displaying it in the hierarchy. # foreach child [_contents $node] { set _images($child) "$itk_component(list).hicon[incr _hcounter]" if {![info exists _states($child)]} { set _states($child) $itk_option(-expanded) } # # Check the user tags to see if they have been kind enough # to tell us ahead of time what type of node we are dealing # with branch or leaf. If they neglected to do so, then # get the contents of the child node to see if it has children # itself. # set display 0 if {[lsearch $_tags($child) leaf] != -1} { set type leaf } elseif {[lsearch $_tags($child) branch] != -1} { set type branch } else { if {[llength [_contents $child]] == 0} { set type leaf } else { set type branch } } # # Now that we know the type of node, branch or leaf, we know # the type of icon to use. # if {$type == "leaf"} { set icon $itk_option(-nodeicon) eval $_filterCode } else { if {$_states($child)} { set icon $itk_option(-openicon) } else { set icon $itk_option(-closedicon) } set display 1 } # # If display is set then we're going to be drawing this node. # Save off the indentation level for this node and do the indent. # if {$display} { set _indents($child) "$indent\t" $itk_component(list) insert insert $indent # # Add the branch or leaf icon and setup a binding to toggle # its expanded/collapsed state. # label $_images($child) -image $icon -background $bg # DRH - enhanced and added features that handle image clicking, # double clicking, and right clicking behavior bind $_images($child) <ButtonPress-1> \ "[itcl::code $this toggle $child]; [itcl::code $this _imageSelect $child]" bind $_images($child) <Double-1> [itcl::code $this _imageDblClick $child] bind $_images($child) <ButtonPress-3> \ [itcl::code $this _imagePost $child $_images($child) $type %x %y] $itk_component(list) window create insert -window $_images($child) # # If any user icons exist then draw them as well. The little # regexp is just to check and see if they've passed in a # command which needs to be evaluated as opposed to just # a variable. Also, attach a binding to call them if their # icon is selected. # if {[info exists _icons($child)]} { foreach image $_icons($child) { set wid "$itk_component(list).uicon[incr _ucounter]" if {[regexp {\[.*\]} $image]} { eval label $wid -image $image -background $bg } else { label $wid -image $image -background $bg } # DRH - this will bind events to the icons to allow # clicking, double clicking, and right clicking actions. bind $wid <ButtonPress-1> \ [itcl::code $this _iconSelect $child $image] bind $wid <Double-1> \ [itcl::code $this _iconDblSelect $child $image] bind $wid <ButtonPress-3> \ [itcl::code $this _imagePost $child $wid $type %x %y] $itk_component(list) window create insert -window $wid } } # # Create the list of tags to be applied to the text. Start # out with a tag of "info" and append "hilite" if the node # is currently selected, finally add the tags given by the # user. # set texttags [list "info" $child] if {[info exists _selected($child)]} { lappend texttags hilite } # The following conditional added for SF ticket #600941. if {[info exists _marked($child)]} { lappend texttags lowlite } foreach tag $_tags($child) { lappend texttags $tag } # # Insert the text for the node along with the tags and # append to the markers the start of this node. The text # has been broken at newlines into a list. We'll make sure # that each line is at the same indentation position. # set firstline 1 foreach line $_text($child) { if {$firstline} { $itk_component(list) insert insert " " } else { $itk_component(list) insert insert "$indent\t" } $itk_component(list) insert insert $line $texttags "\n" set firstline 0 } $itk_component(list) tag raise $child lappend _markers "$child:start" [$itk_component(list) index insert] # # If the state of the node is open, proceed to draw the next # node below it in the hierarchy. # if {$_states($child)} { _drawLevel $child "$indent\t" } } } lappend _markers "$node:end" [$itk_component(list) index insert] } # ---------------------------------------------------------------------- # PROTECTED METHOD: _contents uid # # Used internally to get the contents of a particular node. If this # is the first time the node has been seen or the -alwaysquery # option is set, the -querycommand code is executed to query the node # list, and the list is stored until the next time it is needed. # # The querycommand may return not only the list of subnodes for the # node but additional information on the tags and icons to be used. # The return value must be parsed based on the number of elements in # the list where the format is a list of lists: # # {{uid [text [tags [icons]]]} {uid [text [tags [icons]]]} ...} # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_contents {uid} { if {$itk_option(-alwaysquery)} { } else { if {[info exists _nodes($uid)]} { return $_nodes($uid) } } # # Substitute any %n's for the node name whose children we're # interested in obtaining. # set cmd $itk_option(-querycommand) regsub -all {%n} $cmd [list $uid] cmd set nodeinfolist [uplevel \#0 $cmd] # # Cycle through the node information returned by the query # command determining if additional information such as text, # user tags, or user icons have been provided. For text, # break it into a list at any newline characters. # set _nodes($uid) {} foreach nodeinfo $nodeinfolist { set subnodeuid [lindex $nodeinfo 0] lappend _nodes($uid) $subnodeuid set llen [llength $nodeinfo] if {$llen == 0 || $llen > 4} { error "invalid number of elements returned by query\ command for node: \"$uid\",\ should be uid \[text \[tags \[icons\]\]\]" } if {$llen == 1} { set _text($subnodeuid) [split $subnodeuid \n] } if {$llen > 1} { set _text($subnodeuid) [split [lindex $nodeinfo 1] \n] } if {$llen > 2} { set _tags($subnodeuid) [lindex $nodeinfo 2] } else { set _tags($subnodeuid) unknown } if {$llen > 3} { set _icons($subnodeuid) [lindex $nodeinfo 3] } } # # Return the list of nodes. # return $_nodes($uid) } # ---------------------------------------------------------------------- # PROTECTED METHOD: _post x y # # Used internally to post the popup menu at the coordinate (x,y) # relative to the widget. If (x,y) is on an item, then the itemMenu # component is posted. Otherwise, the bgMenu is posted. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_post {x y} { set rx [expr {[winfo rootx $itk_component(list)]+$x}] set ry [expr {[winfo rooty $itk_component(list)]+$y}] set index [$itk_component(list) index @$x,$y] # # The posted variable will hold the list of tags which exist at # this x,y position that will be passed back to the user. They # don't need to know about our internal tags, info, hilite, and # lowlite, so remove them from the list. # set _posted {} foreach tag [$itk_component(list) tag names $index] { if {![_isInternalTag $tag]} { lappend _posted $tag } } # # If we have tags then do the popup at this position. # if {$_posted != {}} { # DRH - here is where the user's function for dynamic popup # menu loading is done, if the user has specified to do so with the # "-textmenuloadcommand" if {$itk_option(-textmenuloadcommand) != {}} { eval $itk_option(-textmenuloadcommand) } tk_popup $itk_component(itemMenu) $rx $ry } else { tk_popup $itk_component(bgMenu) $rx $ry } } # ---------------------------------------------------------------------- # PROTECTED METHOD: _imagePost node image type x y # # Used internally to post the popup menu at the coordinate (x,y) # relative to the widget. If (x,y) is on an image, then the itemMenu # component is posted. # # Douglas R. Howard, Jr. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_imagePost {node image type x y} { set rx [expr {[winfo rootx $image]+$x}] set ry [expr {[winfo rooty $image]+$y}] # # The posted variable will hold the list of tags which exist at # this x,y position that will be passed back to the user. They # don't need to know about our internal tags, info, hilite, and # lowlite, so remove them from the list. # set _posted {} lappend _posted $node $type # # If we have tags then do the popup at this position. # if {$itk_option(-imagemenuloadcommand) != {}} { eval $itk_option(-imagemenuloadcommand) } tk_popup $itk_component(itemMenu) $rx $ry } # ---------------------------------------------------------------------- # PROTECTED METHOD: _select x y # # Used internally to select an item at the coordinate (x,y) relative # to the widget. The command associated with the -selectcommand # option is execute following % character substitutions. If %n # appears in the command, the selected node is substituted. If %s # appears, a boolean value representing the current selection state # will be substituted. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_select {x y} { if {$itk_option(-selectcommand) != {}} { if {[set seltags [$itk_component(list) tag names @$x,$y]] != {}} { foreach tag $seltags { if {![_isInternalTag $tag]} { lappend node $tag } } if {[lsearch $seltags "hilite"] == -1} { set selectstatus 0 } else { set selectstatus 1 } set cmd $itk_option(-selectcommand) regsub -all {%n} $cmd [lindex $node end] cmd regsub -all {%s} $cmd [list $selectstatus] cmd uplevel #0 $cmd } } return } # ---------------------------------------------------------------------- # PROTECTED METHOD: _double x y # # Used internally to double click an item at the coordinate (x,y) relative # to the widget. The command associated with the -dblclickcommand # option is execute following % character substitutions. If %n # appears in the command, the selected node is substituted. If %s # appears, a boolean value representing the current selection state # will be substituted. # # Douglas R. Howard, Jr. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_double {x y} { if {$itk_option(-dblclickcommand) != {}} { if {[set seltags [$itk_component(list) tag names @$x,$y]] != {}} { foreach tag $seltags { if {![_isInternalTag $tag]} { lappend node $tag } } if {[lsearch $seltags "hilite"] == -1} { set selectstatus 0 } else { set selectstatus 1 } set cmd $itk_option(-dblclickcommand) regsub -all {%n} $cmd [list $node] cmd regsub -all {%s} $cmd [list $selectstatus] cmd uplevel #0 $cmd } } return } # ---------------------------------------------------------------------- # PROTECTED METHOD: _iconSelect node icon # # Used internally to upon selection of user icons. The -iconcommand # is executed after substitution of the node for %n and icon for %i. # # Douglas R. Howard, Jr. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_iconSelect {node icon} { set cmd $itk_option(-iconcommand) regsub -all {%n} $cmd [list $node] cmd regsub -all {%i} $cmd [list $icon] cmd uplevel \#0 $cmd return {} } # ---------------------------------------------------------------------- # PROTECTED METHOD: _iconDblSelect node icon # # Used internally to upon double selection of user icons. The # -icondblcommand is executed after substitution of the node for %n and # icon for %i. # # Douglas R. Howard, Jr. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_iconDblSelect {node icon} { if {$itk_option(-icondblcommand) != {}} { set cmd $itk_option(-icondblcommand) regsub -all {%n} $cmd [list $node] cmd regsub -all {%i} $cmd [list $icon] cmd uplevel \#0 $cmd } return {} } # ---------------------------------------------------------------------- # PROTECTED METHOD: _imageSelect node icon # # Used internally to upon selection of user icons. The -imagecommand # is executed after substitution of the node for %n. # # Douglas R. Howard, Jr. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_imageSelect {node} { if {$itk_option(-imagecommand) != {}} { set cmd $itk_option(-imagecommand) regsub -all {%n} $cmd [list $node] cmd uplevel \#0 $cmd } return {} } # ---------------------------------------------------------------------- # PROTECTED METHOD: _imageDblClick node # # Used internally to upon double selection of images. The # -imagedblcommand is executed. # # Douglas R. Howard, Jr. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_imageDblClick {node} { if {$itk_option(-imagedblcommand) != {}} { set cmd $itk_option(-imagedblcommand) regsub -all {%n} $cmd [list $node] cmd uplevel \#0 $cmd } return {} } # ---------------------------------------------------------------------- # PROTECTED METHOD: _deselectSubNodes uid # # Used internally to recursively deselect all the nodes beneath a # particular node. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_deselectSubNodes {uid} { foreach node $_nodes($uid) { if {[array names _selected $node] != {}} { unset _selected($node) } if {[array names _nodes $node] != {}} { _deselectSubNodes $node } } } # ---------------------------------------------------------------------- # PROTECTED METHOD: _deleteNodeInfo uid # # Used internally to recursively delete all the information about a # node and its decendents. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_deleteNodeInfo {uid} { # # Recursively call ourseleves as we go down the hierarchy beneath # this node. # if {[info exists _nodes($uid)]} { foreach node $_nodes($uid) { if {[array names _nodes $node] != {}} { _deleteNodeInfo $node } } } # # Unset any entries in our arrays for the node. # catch {unset _nodes($uid)} catch {unset _text($uid)} catch {unset _tags($uid)} catch {unset _icons($uid)} catch {unset _states($uid)} catch {unset _images($uid)} catch {unset _indents($uid)} } # ---------------------------------------------------------------------- # PROTECTED METHOD: _getParent uid # # Used internally to determine the parent for a node. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_getParent {uid} { foreach node [array names _nodes] { if {[set index [lsearch $_nodes($node) $uid]] != -1} { return $node } } } # ---------------------------------------------------------------------- # PROTECTED METHOD: _getHeritage uid # # Used internally to determine the list of parents for a node. # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_getHeritage {uid} { set parents {} if {[set parent [_getParent $uid]] != {}} { lappend parents $parent } return $parents } # ---------------------------------------------------------------------- # PROTECTED METHOD (could be proc?): _isInternalTag tag # # Used internally to tags not to used for user callback commands # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_isInternalTag {tag} { set ii [expr {[lsearch -exact {info hilite lowlite unknown} $tag] != -1}]; return $ii; } # ---------------------------------------------------------------------- # PRIVATE METHOD: _configureTags # # This method added to fix SF ticket #596111. When the -querycommand # is reset after initial construction, the text component loses its # tag configuration. This method resets the hilite, lowlite, and info # tags. csmith: 9/5/02 # ---------------------------------------------------------------------- itcl::body iwidgets::Hierarchy::_configureTags {} { tag configure hilite -background $itk_option(-selectbackground) \ -foreground $itk_option(-selectforeground) tag configure lowlite -background $itk_option(-markbackground) \ -foreground $itk_option(-markforeground) tag configure info -font $itk_option(-font) -spacing1 6 } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/hyperhelp.itk����������������������������������������������������������������0000644�0036047�0045461�00000045344�07444553573�016105� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Hyperhelp # ---------------------------------------------------------------------- # Implements a help facility using html formatted hypertext files. # # ---------------------------------------------------------------------- # AUTHOR: Kris Raney EMAIL: kraney@spd.dsccc.com # # @(#) $Id: hyperhelp.itk,v 1.5 2002/03/16 05:26:19 mgbacke Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1996 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Acknowledgements: # # Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his # help.tcl code from tk inspect. # # Default resources. # option add *Hyperhelp.width 575 widgetDefault option add *Hyperhelp.height 450 widgetDefault option add *Hyperhelp.modality none widgetDefault option add *Hyperhelp.vscrollMode static widgetDefault option add *Hyperhelp.hscrollMode static widgetDefault option add *Hyperhelp.maxHistory 20 widgetDefault # # Usual options. # itk::usual Hyperhelp { keep -activebackground -activerelief -background -borderwidth -cursor \ -foreground -highlightcolor -highlightthickness \ -selectbackground -selectborderwidth -selectforeground \ -textbackground } # ------------------------------------------------------------------ # HYPERHELP # ------------------------------------------------------------------ itcl::class iwidgets::Hyperhelp { inherit iwidgets::Shell constructor {args} {} itk_option define -topics topics Topics {} itk_option define -helpdir helpdir Directory . itk_option define -title title Title "Help" itk_option define -closecmd closeCmd CloseCmd {} itk_option define -maxhistory maxHistory MaxHistory 20 public variable beforelink {} public variable afterlink {} public method showtopic {topic} public method followlink {link} public method forward {} public method back {} public method updatefeedback {n} protected method _readtopic {file {anchorpoint {}}} protected method _pageforward {} protected method _pageback {} protected method _lineforward {} protected method _lineback {} protected method _fill_go_menu {} protected variable _history {} ;# History list of viewed pages protected variable _history_ndx -1 ;# current position in history list protected variable _history_len 0 ;# length of history list protected variable _histdir -1 ;# direction in history we just came ;# from protected variable _len 0 ;# length of text to be rendered protected variable _file {} ;# current topic private variable _remaining 0 ;# remaining text to be rendered private variable _rendering 0 ;# flag - in process of rendering } # # Provide a lowercased access method for the Scrolledlistbox class. # proc ::iwidgets::hyperhelp {pathName args} { uplevel ::iwidgets::Hyperhelp $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Hyperhelp::constructor {args} { itk_option remove iwidgets::Shell::padx iwidgets::Shell::pady # # Create a pulldown menu # itk_component add -private menubar { frame $itk_interior.menu -relief raised -bd 2 } { keep -background -cursor } pack $itk_component(menubar) -side top -fill x itk_component add -private topicmb { menubutton $itk_component(menubar).topicmb -text "Topics" \ -menu $itk_component(menubar).topicmb.topicmenu \ -underline 0 -padx 8 -pady 2 } { keep -background -cursor -font -foreground \ -activebackground -activeforeground } pack $itk_component(topicmb) -side left itk_component add -private topicmenu { menu $itk_component(topicmb).topicmenu -tearoff no } { keep -background -cursor -font -foreground \ -activebackground -activeforeground } itk_component add -private navmb { menubutton $itk_component(menubar).navmb -text "Navigate" \ -menu $itk_component(menubar).navmb.navmenu \ -underline 0 -padx 8 -pady 2 } { keep -background -cursor -font -foreground \ -activebackground -activeforeground } pack $itk_component(navmb) -side left itk_component add -private navmenu { menu $itk_component(navmb).navmenu -tearoff no } { keep -background -cursor -font -foreground \ -activebackground -activeforeground } set m $itk_component(navmenu) $m add command -label "Forward" -underline 0 -state disabled \ -command [itcl::code $this forward] -accelerator f $m add command -label "Back" -underline 0 -state disabled \ -command [itcl::code $this back] -accelerator b $m add cascade -label "Go" -underline 0 -menu $m.go itk_component add -private navgo { menu $itk_component(navmenu).go -postcommand [itcl::code $this _fill_go_menu] } { keep -background -cursor -font -foreground \ -activebackground -activeforeground } # # Create a scrolledhtml object to display help pages # itk_component add scrtxt { iwidgets::scrolledhtml $itk_interior.scrtxt \ -linkcommand "$this followlink" -feedback "$this updatefeedback" } { keep -hscrollmode -vscrollmode -background -textbackground \ -fontname -fontsize -fixedfont -link \ -linkhighlight -borderwidth -cursor -sbwidth -scrollmargin \ -width -height -foreground -highlightcolor -visibleitems \ -highlightthickness -padx -pady -activerelief \ -relief -selectbackground -selectborderwidth \ -selectforeground -setgrid -wrap -unknownimage } pack $itk_component(scrtxt) -fill both -expand yes # # Bind shortcut keys # bind $itk_component(hull) <Key-f> [itcl::code $this forward] bind $itk_component(hull) <Key-b> [itcl::code $this back] bind $itk_component(hull) <Alt-Right> [itcl::code $this forward] bind $itk_component(hull) <Alt-Left> [itcl::code $this back] bind $itk_component(hull) <Key-space> [itcl::code $this _pageforward] bind $itk_component(hull) <Key-Next> [itcl::code $this _pageforward] bind $itk_component(hull) <Key-BackSpace> [itcl::code $this _pageback] bind $itk_component(hull) <Key-Prior> [itcl::code $this _pageback] bind $itk_component(hull) <Key-Delete> [itcl::code $this _pageback] bind $itk_component(hull) <Key-Down> [itcl::code $this _lineforward] bind $itk_component(hull) <Key-Up> [itcl::code $this _lineback] wm title $itk_component(hull) "Help" eval itk_initialize $args if {[lsearch -exact $args -closecmd] == -1} { configure -closecmd [itcl::code $this deactivate] } } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -topics # # Specifies the topics to display on the menu. For each topic, there should # be a file named <helpdir>/<topic>.html # ------------------------------------------------------------------ itcl::configbody iwidgets::Hyperhelp::topics { set m $itk_component(topicmenu) $m delete 0 last foreach topic $itk_option(-topics) { if {[lindex $topic 1] == {} } { $m add radiobutton -variable topic \ -value $topic \ -label $topic \ -command [list $this showtopic $topic] } else { if {[string index [file dirname [lindex $topic 1]] 0] != "/" && \ [string index [file dirname [lindex $topic 1]] 0] != "~"} { set link $itk_option(-helpdir)/[lindex $topic 1] } else { set link [lindex $topic 1] } $m add radiobutton -variable topic \ -value [lindex $topic 0] \ -label [lindex $topic 0] \ -command [list $this followlink $link] } } $m add separator $m add command -label "Close Help" -underline 0 \ -command $itk_option(-closecmd) } # ------------------------------------------------------------------ # OPTION: -title # # Specify the window title. # ------------------------------------------------------------------ itcl::configbody iwidgets::Hyperhelp::title { wm title $itk_component(hull) $itk_option(-title) } # ------------------------------------------------------------------ # OPTION: -helpdir # # Set location of help files # ------------------------------------------------------------------ itcl::configbody iwidgets::Hyperhelp::helpdir { if {[file pathtype $itk_option(-helpdir)] == "relative"} { configure -helpdir [file join [pwd] $itk_option(-helpdir)] } else { set _history {} set _history_len 0 set _history_ndx -1 $itk_component(navmenu) entryconfig 0 -state disabled $itk_component(navmenu) entryconfig 1 -state disabled configure -topics $itk_option(-topics) } } # ------------------------------------------------------------------ # OPTION: -closecmd # # Specify the command to execute when close is selected from the menu # ------------------------------------------------------------------ itcl::configbody iwidgets::Hyperhelp::closecmd { $itk_component(topicmenu) entryconfigure last -command $itk_option(-closecmd) } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: showtopic topic # # render text of help topic <topic>. The text is expected to be found in # <helpdir>/<topic>.html # ------------------------------------------------------------------ itcl::body iwidgets::Hyperhelp::showtopic {topic} { if ![regexp {(.*)#(.*)} $topic dummy topicname anchorpart] { set topicname $topic set anchorpart {} } if {$topicname == ""} { set topicname $_file set filepath $_file } else { set filepath $itk_option(-helpdir)/$topicname.html } if {[incr _history_ndx] < $itk_option(-maxhistory)} { set _history [lrange $_history 0 [expr {$_history_ndx - 1}]] set _history_len [expr {$_history_ndx + 1}] } else { incr _history_ndx -1 set _history [lrange $_history 1 $_history_ndx] set _history_len [expr {$_history_ndx + 1}] } lappend _history [list $topicname $filepath $anchorpart] _readtopic $filepath $anchorpart } # ------------------------------------------------------------------ # METHOD: followlink link # # Callback for click on a link. Shows new topic. # ------------------------------------------------------------------ itcl::body iwidgets::Hyperhelp::followlink {link} { if {[string compare $beforelink ""] != 0} { eval $beforelink $link } if ![regexp {(.*)#(.*)} $link dummy filepart anchorpart] { set filepart $link set anchorpart {} } if {$filepart != "" && [string index [file dirname $filepart] 0] != "/" && \ [string index [file dirname $filepart] 0] != "~"} { set filepart [$itk_component(scrtxt) pwd]/$filepart set hfile $filepart } else { set hfile $_file } incr _history_ndx set _history [lrange $_history 0 [expr {$_history_ndx - 1}]] set _history_len [expr {$_history_ndx + 1}] lappend _history [list [file rootname [file tail $hfile]] $hfile $anchorpart] set ret [_readtopic $filepart $anchorpart] if {[string compare $afterlink ""] != 0} { eval $afterlink $link } return $ret } # ------------------------------------------------------------------ # METHOD: forward # # Show topic one forward in history list # ------------------------------------------------------------------ itcl::body iwidgets::Hyperhelp::forward {} { if {$_rendering || ($_history_ndx+1) >= $_history_len} return incr _history_ndx eval _readtopic [lrange [lindex $_history $_history_ndx] 1 end] } # ------------------------------------------------------------------ # METHOD: back # # Show topic one back in history list # ------------------------------------------------------------------ itcl::body iwidgets::Hyperhelp::back {} { if {$_rendering || $_history_ndx <= 0} return incr _history_ndx -1 set _histdir 1 eval _readtopic [lrange [lindex $_history $_history_ndx] 1 end] } # ------------------------------------------------------------------ # METHOD: updatefeedback remaining # # Callback from text to update feedback widget # ------------------------------------------------------------------ itcl::body iwidgets::Hyperhelp::updatefeedback {n} { if {($_remaining - $n) > .1*$_len} { [$itk_interior.feedbackshell childsite].helpfeedback step [expr {$_remaining - $n}] update idletasks set _remaining $n } } # ------------------------------------------------------------------ # PRIVATE METHOD: _readtopic # # Read in file, render it in text area, and jump to anchorpoint # ------------------------------------------------------------------ itcl::body iwidgets::Hyperhelp::_readtopic {file {anchorpoint {}}} { if {$file != ""} { if {[string compare $file $_file] != 0} { if {[catch {set f [open $file r]} err]} { incr _history_ndx $_histdir set _history_len [expr {$_history_ndx + 1}] set _histdir -1 set m $itk_component(navmenu) if {($_history_ndx+1) < $_history_len} { $m entryconfig 0 -state normal } else { $m entryconfig 0 -state disabled } if {$_history_ndx > 0} { $m entryconfig 1 -state normal } else { $m entryconfig 1 -state disabled } return } set _file $file set txt [read $f] iwidgets::shell $itk_interior.feedbackshell -title \ "Rendering HTML" -padx 1 -pady 1 iwidgets::Feedback [$itk_interior.feedbackshell \ childsite].helpfeedback \ -steps [set _len [string length $txt]] \ -labeltext "Rendering HTML" -labelpos n pack [$itk_interior.feedbackshell childsite].helpfeedback $itk_interior.feedbackshell center $itk_interior $itk_interior.feedbackshell activate set _remaining $_len set _rendering 1 if {[catch {$itk_component(scrtxt) render $txt [file dirname \ $file]} err]} { if [regexp "</pre>" $err] { $itk_component(scrtxt) render "<tt>$err</tt>" } else { $itk_component(scrtxt) render "<pre>$err</pre>" } } wm title $itk_component(hull) "Help: $file" itcl::delete object [$itk_interior.feedbackshell \ childsite].helpfeedback itcl::delete object $itk_interior.feedbackshell set _rendering 0 } } set m $itk_component(navmenu) if {($_history_ndx+1) < $_history_len} { $m entryconfig 0 -state normal } else { $m entryconfig 0 -state disabled } if {$_history_ndx > 0} { $m entryconfig 1 -state normal } else { $m entryconfig 1 -state disabled } if {$anchorpoint != {}} { $itk_component(scrtxt) import -link #$anchorpoint } else { $itk_component(scrtxt) import -link # } set _histdir -1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _fill_go_menu # # update go submenu with current history # ------------------------------------------------------------------ itcl::body iwidgets::Hyperhelp::_fill_go_menu {} { set m $itk_component(navgo) catch {$m delete 0 last} for {set i [expr {$_history_len - 1}]} {$i >= 0} {incr i -1} { set topic [lindex [lindex $_history $i] 0] set filepath [lindex [lindex $_history $i] 1] set anchor [lindex [lindex $_history $i] 2] $m add command -label $topic \ -command [list $this followlink $filepath#$anchor] } } # ------------------------------------------------------------------ # PRIVATE METHOD: _pageforward # # Callback for page forward shortcut key # ------------------------------------------------------------------ itcl::body iwidgets::Hyperhelp::_pageforward {} { $itk_component(scrtxt) yview scroll 1 pages } # ------------------------------------------------------------------ # PRIVATE METHOD: _pageback # # Callback for page back shortcut key # ------------------------------------------------------------------ itcl::body iwidgets::Hyperhelp::_pageback {} { $itk_component(scrtxt) yview scroll -1 pages } # ------------------------------------------------------------------ # PRIVATE METHOD: _lineforward # # Callback for line forward shortcut key # ------------------------------------------------------------------ itcl::body iwidgets::Hyperhelp::_lineforward {} { $itk_component(scrtxt) yview scroll 1 units } # ------------------------------------------------------------------ # PRIVATE METHOD: _lineback # # Callback for line back shortcut key # ------------------------------------------------------------------ itcl::body iwidgets::Hyperhelp::_lineback {} { $itk_component(scrtxt) yview scroll -1 units } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/labeledframe.itk�������������������������������������������������������������0000644�0036047�0045461�00000042145�07336540123�016467� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Labeledframe # ---------------------------------------------------------------------- # Implements a hull frame with a grooved relief, a label, and a # frame childsite. # # The frame childsite can be filled with any widget via a derived class # or though the use of the childsite method. This class was designed # to be a general purpose base class for supporting the combination of # a labeled frame and a childsite. The options include the ability to # position the label at configurable locations within the grooved relief # of the hull frame, and control the display of the label. # # To following demonstrates the different values which the "-labelpos" # option may be set to and the resulting layout of the label when # one executes the following command with "-labeltext" set to "LABEL": # # example: # labeledframe .w -labeltext LABEL -labelpos <ne,n,nw,se,s,sw,en,e,es,wn,s,ws> # # ne n nw se s sw # # *LABEL**** **LABEL** ****LABEL* ********** ********* ********** # * * * * * * * * * * * * # * * * * * * * * * * * * # * * * * * * * * * * * * # ********** ********* ********** *LABEL**** **LABEL** ****LABEL* # # en e es wn s ws # # ********** ********* ********* ********* ********* ********** # * * * * * * * * * * * * # L * * * * * * L * * * * # A * L * * * * A * L * L # B * A * L * * B * A * A # E * B * A * * E * B * B # L * E * B * * L * E * E # * * L * E * * * * L * L # * * * * L * * * * * * * # ********** ********** ********* ********** ********* ********** # # ---------------------------------------------------------------------- # AUTHOR: John A. Tucker EMAIL: jatucker@spd.dsccc.com # # ====================================================================== # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Default resources. # option add *Labeledframe.labelMargin 10 widgetDefault option add *Labeledframe.labelFont \ "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*" widgetDefault option add *Labeledframe.labelPos n widgetDefault option add *Labeledframe.borderWidth 2 widgetDefault option add *Labeledframe.relief groove widgetDefault # # Usual options. # itk::usual Labeledframe { keep -background -cursor -labelfont -foreground } itcl::class iwidgets::Labeledframe { inherit itk::Archetype itk_option define -ipadx iPadX IPad 0 itk_option define -ipady iPadY IPad 0 itk_option define -labelmargin labelMargin LabelMargin 10 itk_option define -labelpos labelPos LabelPos n constructor {args} {} destructor {} # # Public methods # public method childsite {} # # Protected methods # protected { method _positionLabel {{when later}} method _collapseMargin {} method _setMarginThickness {value} method smt {value} { _setMarginThickness $value } } # # Private methods/data # private { proc _initTable {} variable _reposition "" ;# non-null => _positionLabel pending variable itk_hull "" common _LAYOUT_TABLE } } # # Provide a lowercased access method for the Labeledframe class. # proc ::iwidgets::labeledframe {pathName args} { uplevel ::iwidgets::Labeledframe $pathName $args } # ----------------------------------------------------------------------------- # CONSTRUCTOR # ----------------------------------------------------------------------------- itcl::body iwidgets::Labeledframe::constructor { args } { # # Create a window with the same name as this object # set itk_hull [namespace tail $this] set itk_interior $itk_hull itk_component add hull { frame $itk_hull \ -relief groove \ -class [namespace tail [info class]] } { keep -background -cursor -relief -borderwidth rename -highlightbackground -background background Background rename -highlightcolor -background background Background } bind itk-delete-$itk_hull <Destroy> "itcl::delete object $this" set tags [bindtags $itk_hull] bindtags $itk_hull [linsert $tags 0 itk-delete-$itk_hull] # # Create the childsite frame window # _______ # |_____| # |_|X|_| # |_____| # itk_component add childsite { frame $itk_interior.childsite -highlightthickness 0 -bd 0 } # # Create the label to be positioned within the grooved relief # of the hull frame. # itk_component add label { label $itk_interior.label -highlightthickness 0 -bd 0 } { usual rename -bitmap -labelbitmap labelBitmap Bitmap rename -font -labelfont labelFont Font rename -image -labelimage labelImage Image rename -text -labeltext labelText Text rename -textvariable -labelvariable labelVariable Variable ignore -highlightthickness -highlightcolor } grid $itk_component(childsite) -row 1 -column 1 -sticky nsew grid columnconfigure $itk_interior 1 -weight 1 grid rowconfigure $itk_interior 1 -weight 1 bind $itk_component(label) <Configure> +[itcl::code $this _positionLabel] # # Initialize the class array of layout configuration options. Since # this is a one time only thing. # _initTable eval itk_initialize $args # # When idle, position the label. # _positionLabel } # ----------------------------------------------------------------------------- # DESTRUCTOR # ----------------------------------------------------------------------------- itcl::body iwidgets::Labeledframe::destructor {} { if {$_reposition != ""} { after cancel $_reposition } if {[winfo exists $itk_hull]} { set tags [bindtags $itk_hull] set i [lsearch $tags itk-delete-$itk_hull] if {$i >= 0} { bindtags $itk_hull [lreplace $tags $i $i] } destroy $itk_hull } } # ----------------------------------------------------------------------------- # OPTIONS # ----------------------------------------------------------------------------- # ------------------------------------------------------------------ # OPTION: -ipadx # # Specifies the width of the horizontal gap from the border to the # the child site. # ------------------------------------------------------------------ itcl::configbody iwidgets::Labeledframe::ipadx { grid configure $itk_component(childsite) -padx $itk_option(-ipadx) _positionLabel } # ------------------------------------------------------------------ # OPTION: -ipady # # Specifies the width of the vertical gap from the border to the # the child site. # ------------------------------------------------------------------ itcl::configbody iwidgets::Labeledframe::ipady { grid configure $itk_component(childsite) -pady $itk_option(-ipady) _positionLabel } # ----------------------------------------------------------------------------- # OPTION: -labelmargin # # Set the margin of the most adjacent side of the label to the hull # relief. # ---------------------------------------------------------------------------- itcl::configbody iwidgets::Labeledframe::labelmargin { _positionLabel } # ----------------------------------------------------------------------------- # OPTION: -labelpos # # Set the position of the label within the relief of the hull frame # widget. # ---------------------------------------------------------------------------- itcl::configbody iwidgets::Labeledframe::labelpos { _positionLabel } # ----------------------------------------------------------------------------- # PROCS # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # PRIVATE PROC: _initTable # # Initializes the _LAYOUT_TABLE common variable of the Labeledframe # class. The initialization is performed in its own proc ( as opposed # to in the class definition ) so that the initialization occurs only # once. # # _LAYOUT_TABLE common array description: # Provides a table of the configuration option values # used to place the label widget within the grooved relief of the hull # frame for each of the 12 possible "-labelpos" values. # # Each of the 12 rows is layed out as follows: # {"-relx" "-rely" <rowconfigure|columnconfigure> <row/column number>} # ----------------------------------------------------------------------------- itcl::body iwidgets::Labeledframe::_initTable {} { array set _LAYOUT_TABLE { nw-relx 0.0 nw-rely 0.0 nw-wrap 0 nw-conf rowconfigure nw-num 0 n-relx 0.5 n-rely 0.0 n-wrap 0 n-conf rowconfigure n-num 0 ne-relx 1.0 ne-rely 0.0 ne-wrap 0 ne-conf rowconfigure ne-num 0 sw-relx 0.0 sw-rely 1.0 sw-wrap 0 sw-conf rowconfigure sw-num 2 s-relx 0.5 s-rely 1.0 s-wrap 0 s-conf rowconfigure s-num 2 se-relx 1.0 se-rely 1.0 se-wrap 0 se-conf rowconfigure se-num 2 en-relx 1.0 en-rely 0.0 en-wrap 1 en-conf columnconfigure en-num 2 e-relx 1.0 e-rely 0.5 e-wrap 1 e-conf columnconfigure e-num 2 es-relx 1.0 es-rely 1.0 es-wrap 1 es-conf columnconfigure es-num 2 wn-relx 0.0 wn-rely 0.0 wn-wrap 1 wn-conf columnconfigure wn-num 0 w-relx 0.0 w-rely 0.5 w-wrap 1 w-conf columnconfigure w-num 0 ws-relx 0.0 ws-rely 1.0 ws-wrap 1 ws-conf columnconfigure ws-num 0 } # # Since this is a one time only thing, we'll redefine the proc to be empty # afterwards so it only happens once. # # NOTE: Be careful to use the "body" command, or the proc will get lost! # itcl::body ::iwidgets::Labeledframe::_initTable {} {} } # ----------------------------------------------------------------------------- # METHODS # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # PUBLIC METHOD:: childsite # # ----------------------------------------------------------------------------- itcl::body iwidgets::Labeledframe::childsite {} { return $itk_component(childsite) } # ----------------------------------------------------------------------------- # PROTECTED METHOD: _positionLabel ?when? # # Places the label in the relief of the hull. If "when" is "now", the # change is applied immediately. If it is "later" or it is not # specified, then the change is applied later, when the application # is idle. # ----------------------------------------------------------------------------- itcl::body iwidgets::Labeledframe::_positionLabel {{when later}} { if {$when == "later"} { if {$_reposition == ""} { set _reposition [after idle [itcl::code $this _positionLabel now]] } return } set pos $itk_option(-labelpos) # # If there is not an entry for the "relx" value associated with # the given "-labelpos" option value, then it invalid. # if { [catch {set relx $_LAYOUT_TABLE($pos-relx)}] } { error "bad labelpos option\"$itk_option(-labelpos)\": should be\ nw, n, ne, sw, s, se, en, e, es, wn, w, or ws" } update idletasks $itk_component(label) configure -wraplength $_LAYOUT_TABLE($pos-wrap) set labelWidth [winfo reqwidth $itk_component(label)] set labelHeight [winfo reqheight $itk_component(label)] set borderwidth $itk_option(-borderwidth) set margin $itk_option(-labelmargin) switch $pos { nw { set labelThickness $labelHeight set minsize [expr {$labelThickness/2.0}] set xPos [expr {$minsize+$borderwidth+$margin}] set yPos -$minsize } n { set labelThickness $labelHeight set minsize [expr {$labelThickness/2.0}] set xPos [expr {-$labelWidth/2.0}] set yPos -$minsize } ne { set labelThickness $labelHeight set minsize [expr {$labelThickness/2.0}] set xPos [expr {-($minsize+$borderwidth+$margin+$labelWidth)}] set yPos -$minsize } sw { set labelThickness $labelHeight set minsize [expr {$labelThickness/2.0}] set xPos [expr {$minsize+$borderwidth+$margin}] set yPos -$minsize } s { set labelThickness $labelHeight set minsize [expr {$labelThickness/2.0}] set xPos [expr {-$labelWidth/2.0}] set yPos [expr {-$labelHeight/2.0}] } se { set labelThickness $labelHeight set minsize [expr {$labelThickness/2.0}] set xPos [expr {-($minsize+$borderwidth+$margin+$labelWidth)}] set yPos [expr {-$labelHeight/2.0}] } wn { set labelThickness $labelWidth set minsize [expr {$labelThickness/2.0}] set xPos -$minsize set yPos [expr {$minsize+$margin+$borderwidth}] } w { set labelThickness $labelWidth set minsize [expr {$labelThickness/2.0}] set xPos -$minsize set yPos [expr {-($labelHeight/2.0)}] } ws { set labelThickness $labelWidth set minsize [expr {$labelThickness/2.0}] set xPos -$minsize set yPos [expr {-($minsize+$borderwidth+$margin+$labelHeight)}] } en { set labelThickness $labelWidth set minsize [expr {$labelThickness/2.0}] set xPos -$minsize set yPos [expr {$minsize+$borderwidth+$margin}] } e { set labelThickness $labelWidth set minsize [expr {$labelThickness/2.0}] set xPos -$minsize set yPos [expr {-($labelHeight/2.0)}] } es { set labelThickness $labelWidth set minsize [expr {$labelThickness/2.0}] set xPos -$minsize set yPos [expr {-($minsize+$borderwidth+$margin+$labelHeight)}] } } _setMarginThickness $minsize place $itk_component(label) \ -relx $_LAYOUT_TABLE($pos-relx) -x $xPos \ -rely $_LAYOUT_TABLE($pos-rely) -y $yPos \ -anchor nw set what $_LAYOUT_TABLE($pos-conf) set number $_LAYOUT_TABLE($pos-num) grid $what $itk_interior $number -minsize $minsize set _reposition "" } # ----------------------------------------------------------------------------- # PROTECTED METHOD: _collapseMargin # # Resets the "-minsize" of all rows and columns of the hull's grid # used to set the label margin to 0 # ----------------------------------------------------------------------------- itcl::body iwidgets::Labeledframe::_collapseMargin {} { grid columnconfigure $itk_interior 0 -minsize 0 grid columnconfigure $itk_interior 2 -minsize 0 grid rowconfigure $itk_interior 0 -minsize 0 grid rowconfigure $itk_interior 2 -minsize 0 } # ----------------------------------------------------------------------------- # PROTECTED METHOD: _setMarginThickness # # Set the margin thickness ( i.e. the hidden "-highlightthickness" # of the hull ) to the input value. # # The "-highlightthickness" option of the hull frame is not intended to be # configured by users of this class, but does need to be configured to properly # place the label whenever the label is configured. # # Therefore, since I can't find a better way at this time, I achieve this # configuration by: adding the "-highlightthickness" option back into # the hull frame; configuring the "-highlightthickness" option to properly # place the label; and then remove the "-highlightthickness" option from the # hull. # # This way the option is not visible or configurable without some hacking. # # ----------------------------------------------------------------------------- itcl::body iwidgets::Labeledframe::_setMarginThickness {value} { itk_option add hull.highlightthickness $itk_component(hull) configure -highlightthickness $value itk_option remove hull.highlightthickness } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/labeledwidget.itk������������������������������������������������������������0000644�0036047�0045461�00000035031�07340266355�016663� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Labeledwidget # ---------------------------------------------------------------------- # Implements a labeled widget which contains a label and child site. # The child site is a frame which can filled with any widget via a # derived class or though the use of the childsite method. This class # was designed to be a general purpose base class for supporting the # combination of label widget and a childsite, where a label may be # text, bitmap or image. The options include the ability to position # the label around the childsite widget, modify the font and margin, # and control the display of the label. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: labeledwidget.itk,v 1.4 2001/08/20 20:02:53 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Labeledwidget { keep -background -cursor -foreground -labelfont } # ------------------------------------------------------------------ # LABELEDWIDGET # ------------------------------------------------------------------ itcl::class iwidgets::Labeledwidget { inherit itk::Widget constructor {args} {} destructor {} itk_option define -disabledforeground disabledForeground \ DisabledForeground \#a3a3a3 itk_option define -labelpos labelPos Position w itk_option define -labelmargin labelMargin Margin 2 itk_option define -labeltext labelText Text {} itk_option define -labelvariable labelVariable Variable {} itk_option define -labelbitmap labelBitmap Bitmap {} itk_option define -labelimage labelImage Image {} itk_option define -state state State normal itk_option define -sticky sticky Sticky nsew public method childsite private method _positionLabel {{when later}} proc alignlabels {args} {} protected variable _reposition "" ;# non-null => _positionLabel pending } # # Provide a lowercased access method for the Labeledwidget class. # proc ::iwidgets::labeledwidget {pathName args} { uplevel ::iwidgets::Labeledwidget $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Labeledwidget::constructor {args} { # # Create a frame for the childsite widget. # itk_component add -protected lwchildsite { frame $itk_interior.lwchildsite } # # Create label. # itk_component add label { label $itk_interior.label } { usual rename -font -labelfont labelFont Font ignore -highlightcolor -highlightthickness } # # Set the interior to be the childsite for derived classes. # set itk_interior $itk_component(lwchildsite) # # Initialize the widget based on the command line options. # eval itk_initialize $args # # When idle, position the label. # _positionLabel } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Labeledwidget::destructor {} { if {$_reposition != ""} {after cancel $_reposition} } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -disabledforeground # # Specified the foreground to be used on the label when disabled. # ------------------------------------------------------------------ itcl::configbody iwidgets::Labeledwidget::disabledforeground {} # ------------------------------------------------------------------ # OPTION: -labelpos # # Set the position of the label on the labeled widget. The margin # between the label and childsite comes along for the ride. # ------------------------------------------------------------------ itcl::configbody iwidgets::Labeledwidget::labelpos { _positionLabel } # ------------------------------------------------------------------ # OPTION: -labelmargin # # Specifies the distance between the widget and label. # ------------------------------------------------------------------ itcl::configbody iwidgets::Labeledwidget::labelmargin { _positionLabel } # ------------------------------------------------------------------ # OPTION: -labeltext # # Specifies the label text. # ------------------------------------------------------------------ itcl::configbody iwidgets::Labeledwidget::labeltext { $itk_component(label) configure -text $itk_option(-labeltext) _positionLabel } # ------------------------------------------------------------------ # OPTION: -labelvariable # # Specifies the label text variable. # ------------------------------------------------------------------ itcl::configbody iwidgets::Labeledwidget::labelvariable { $itk_component(label) configure -textvariable $itk_option(-labelvariable) _positionLabel } # ------------------------------------------------------------------ # OPTION: -labelbitmap # # Specifies the label bitmap. # ------------------------------------------------------------------ itcl::configbody iwidgets::Labeledwidget::labelbitmap { $itk_component(label) configure -bitmap $itk_option(-labelbitmap) _positionLabel } # ------------------------------------------------------------------ # OPTION: -labelimage # # Specifies the label image. # ------------------------------------------------------------------ itcl::configbody iwidgets::Labeledwidget::labelimage { $itk_component(label) configure -image $itk_option(-labelimage) _positionLabel } # ------------------------------------------------------------------ # OPTION: -sticky # # Specifies the stickyness of the child site. This option was added # by James Bonfield (committed by Chad Smith 8/20/01). # ------------------------------------------------------------------ itcl::configbody iwidgets::Labeledwidget::sticky { grid $itk_component(lwchildsite) -sticky $itk_option(-sticky) } # ------------------------------------------------------------------ # OPTION: -state # # Specifies the state of the label. # ------------------------------------------------------------------ itcl::configbody iwidgets::Labeledwidget::state { _positionLabel } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Returns the path name of the child site widget. # ------------------------------------------------------------------ itcl::body iwidgets::Labeledwidget::childsite {} { return $itk_component(lwchildsite) } # ------------------------------------------------------------------ # PROCEDURE: alignlabels widget ?widget ...? # # The alignlabels procedure takes a list of widgets derived from # the Labeledwidget class and adjusts the label margin to align # the labels. # ------------------------------------------------------------------ itcl::body iwidgets::Labeledwidget::alignlabels {args} { update set maxLabelWidth 0 # # Verify that all the widgets are of type Labeledwidget and # determine the size of the maximum length label string. # foreach iwid $args { set objcmd [itcl::find objects -isa Labeledwidget *::$iwid] if {$objcmd == ""} { error "$iwid is not a \"Labeledwidget\"" } set csWidth [winfo reqwidth $iwid.lwchildsite] set shellWidth [winfo reqwidth $iwid] if {($shellWidth - $csWidth) > $maxLabelWidth} { set maxLabelWidth [expr {$shellWidth - $csWidth}] } } # # Adjust the margins for the labels such that the child sites and # labels line up. # foreach iwid $args { set csWidth [winfo reqwidth $iwid.lwchildsite] set shellWidth [winfo reqwidth $iwid] set labelSize [expr {$shellWidth - $csWidth}] if {$maxLabelWidth > $labelSize} { set objcmd [itcl::find objects -isa Labeledwidget *::$iwid] set dist [expr {$maxLabelWidth - \ ($labelSize - [$objcmd cget -labelmargin])}] $objcmd configure -labelmargin $dist } } } # ------------------------------------------------------------------ # PROTECTED METHOD: _positionLabel ?when? # # Packs the label and label margin. If "when" is "now", the # change is applied immediately. If it is "later" or it is not # specified, then the change is applied later, when the application # is idle. # ------------------------------------------------------------------ itcl::body iwidgets::Labeledwidget::_positionLabel {{when later}} { if {$when == "later"} { if {$_reposition == ""} { set _reposition [after idle [itcl::code $this _positionLabel now]] } return } elseif {$when != "now"} { error "bad option \"$when\": should be now or later" } # # If we have a label, be it text, bitmap, or image continue. # if {($itk_option(-labeltext) != {}) || \ ($itk_option(-labelbitmap) != {}) || \ ($itk_option(-labelimage) != {}) || \ ($itk_option(-labelvariable) != {})} { # # Set the foreground color based on the state. # if {[info exists itk_option(-state)]} { switch -- $itk_option(-state) { disabled { $itk_component(label) configure \ -foreground $itk_option(-disabledforeground) } normal { $itk_component(label) configure \ -foreground $itk_option(-foreground) } } } set parent [winfo parent $itk_component(lwchildsite)] # # Switch on the label position option. Using the grid, # adjust the row/column setting of the label, margin, and # and childsite. The margin height/width is adjust based # on the orientation as well. Finally, set the weights such # that the childsite takes the heat on expansion and shrinkage. # switch $itk_option(-labelpos) { nw - n - ne { grid $itk_component(label) -row 0 -column 0 \ -sticky $itk_option(-labelpos) grid $itk_component(lwchildsite) -row 2 -column 0 \ -sticky $itk_option(-sticky) grid rowconfigure $parent 0 -weight 0 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize \ [winfo pixels $itk_component(label) \ $itk_option(-labelmargin)] grid rowconfigure $parent 2 -weight 1 -minsize 0 grid columnconfigure $parent 0 -weight 1 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize 0 grid columnconfigure $parent 2 -weight 0 -minsize 0 } en - e - es { grid $itk_component(lwchildsite) -row 0 -column 0 \ -sticky $itk_option(-sticky) grid $itk_component(label) -row 0 -column 2 \ -sticky $itk_option(-labelpos) grid rowconfigure $parent 0 -weight 1 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize 0 grid rowconfigure $parent 2 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 1 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize \ [winfo pixels $itk_component(label) \ $itk_option(-labelmargin)] grid columnconfigure $parent 2 -weight 0 -minsize 0 } se - s - sw { grid $itk_component(lwchildsite) -row 0 -column 0 \ -sticky $itk_option(-sticky) grid $itk_component(label) -row 2 -column 0 \ -sticky $itk_option(-labelpos) grid rowconfigure $parent 0 -weight 1 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize \ [winfo pixels $itk_component(label) \ $itk_option(-labelmargin)] grid rowconfigure $parent 2 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 1 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize 0 grid columnconfigure $parent 2 -weight 0 -minsize 0 } wn - w - ws { grid $itk_component(lwchildsite) -row 0 -column 2 \ -sticky $itk_option(-sticky) grid $itk_component(label) -row 0 -column 0 \ -sticky $itk_option(-labelpos) grid rowconfigure $parent 0 -weight 1 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize 0 grid rowconfigure $parent 2 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 0 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize \ [winfo pixels $itk_component(label) \ $itk_option(-labelmargin)] grid columnconfigure $parent 2 -weight 1 -minsize 0 } default { error "bad labelpos option\ \"$itk_option(-labelpos)\": should be\ nw, n, ne, sw, s, se, en, e, es, wn, w, or ws" } } # # Else, neither the label text, bitmap, or image have a value, so # forget them so they don't appear and manage only the childsite. # } else { grid forget $itk_component(label) grid $itk_component(lwchildsite) -row 0 -column 0 -sticky $itk_option(-sticky) set parent [winfo parent $itk_component(lwchildsite)] grid rowconfigure $parent 0 -weight 1 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize 0 grid rowconfigure $parent 2 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 1 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize 0 grid columnconfigure $parent 2 -weight 0 -minsize 0 } # # Reset the resposition flag. # set _reposition "" } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/mainwindow.itk���������������������������������������������������������������0000644�0036047�0045461�00000024574�07334044000�016235� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Mainwindow # ---------------------------------------------------------------------- # This class implements a mainwindow containing a menubar, toolbar, # mousebar, childsite, status line, and help line. Each item may # be filled and configured to suit individual needs. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) RCS: $Id: mainwindow.itk,v 1.2 2001/08/07 19:56:48 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # ------------------------------------------------------------------ # MAINWINDOW # ------------------------------------------------------------------ itcl::class iwidgets::Mainwindow { inherit iwidgets::Shell constructor {args} {} itk_option define -helpline helpLine HelpLine 1 itk_option define -statusline statusLine StatusLine 1 public { method childsite {} method menubar {args} method mousebar {args} method msgd {args} method toolbar {args} } protected { method _exitCB {} common _helpVar common _statusVar } } # # Provide a lowercased access method for the ::iwidgets::Mainwindow class. # proc iwidgets::mainwindow {pathName args} { uplevel ::iwidgets::Mainwindow $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Mainwindow::constructor {args} { itk_option add hull.width hull.height pack propagate $itk_component(hull) no wm protocol $itk_component(hull) WM_DELETE_WINDOW [itcl::code $this _exitCB] # # Create a menubar, renaming the font, foreground, and background # so they may be separately set. The help variable will be setup # as well. # itk_component add menubar { iwidgets::Menubar $itk_interior.menubar \ -helpvariable [itcl::scope _helpVar($this)] } { keep -disabledforeground -cursor \ -highlightbackground -highlightthickness rename -font \ -menubarfont menuBarFont Font rename -foreground \ -menubarforeground menuBarForeground Foreground rename -background \ -menubarbackground menuBarBackground Background } # # Add a toolbar beneath the menubar. # itk_component add toolbar { iwidgets::Toolbar $itk_interior.toolbar -orient horizontal \ -helpvariable [itcl::scope _helpVar($this)] } { keep -balloonbackground -balloondelay1 -balloondelay2 \ -balloonfont -balloonforeground -disabledforeground -cursor \ -highlightbackground -highlightthickness rename -font -toolbarfont toolbarFont Font rename -foreground -toolbarforeground toolbarForeground Foreground rename -background -toolbarbackground toolbarBackground Background } # # Add a mouse bar on the left. # itk_component add mousebar { iwidgets::Toolbar $itk_interior.mousebar -orient vertical \ -helpvariable [itcl::scope _helpVar($this)] } { keep -balloonbackground -balloondelay1 -balloondelay2 \ -balloonfont -balloonforeground -disabledforeground -cursor \ -highlightbackground -highlightthickness rename -font -toolbarfont toolbarFont Font rename -foreground -toolbarforeground toolbarForeground Foreground rename -background -toolbarbackground toolbarBackground Background } # # Create the childsite window window. # itk_component add -protected mwchildsite { frame $itk_interior.mwchildsite } # # Add the help and system status lines # itk_component add -protected lineframe { frame $itk_interior.lineframe } itk_component add help { label $itk_component(lineframe).help \ -textvariable [itcl::scope _helpVar($this)] \ -relief sunken -borderwidth 2 -width 10 } itk_component add status { label $itk_component(lineframe).status \ -textvariable [itcl::scope _statusVar($this)] \ -relief sunken -borderwidth 2 -width 10 } # # Create the message dialog for use throughout the mainwindow. # itk_component add msgd { iwidgets::Messagedialog $itk_interior.msgd -modality application } { usual ignore -modality } # # Use the grid to pack together the menubar, toolbar, mousebar, # childsite, and status area. # grid $itk_component(menubar) -row 0 -column 0 -columnspan 2 -sticky ew grid $itk_component(toolbar) -row 1 -column 0 -columnspan 2 -sticky ew grid $itk_component(mousebar) -row 2 -column 0 -sticky ns grid $itk_component(mwchildsite) -row 2 -column 1 -sticky nsew \ -padx 5 -pady 5 grid $itk_component(lineframe) -row 3 -column 0 -columnspan 2 -sticky ew grid columnconfigure $itk_interior 1 -weight 1 grid rowconfigure $itk_interior 2 -weight 1 # # Set the interior to be the childsite for derived classes. # set itk_interior $itk_component(mwchildsite) # # Initialize all the configuration options. # eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -helpline # # Specifies whether or not to display the help line. The value # may be given in any of the forms acceptable to Tk_GetBoolean. # ------------------------------------------------------------------ itcl::configbody iwidgets::Mainwindow::helpline { if {$itk_option(-helpline)} { pack $itk_component(help) -side left -fill x -expand yes -padx 2 } else { pack forget $itk_component(help) } } # ------------------------------------------------------------------ # OPTION: -statusline # # Specifies whether or not to display the status line. The value # may be given in any of the forms acceptable to Tk_GetBoolean. # ------------------------------------------------------------------ itcl::configbody iwidgets::Mainwindow::statusline { if {$itk_option(-statusline)} { pack $itk_component(status) -side right -fill x -expand yes -padx 2 } else { pack forget $itk_component(status) } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Return the childsite widget. # ------------------------------------------------------------------ itcl::body iwidgets::Mainwindow::childsite {} { return $itk_component(mwchildsite) } # ------------------------------------------------------------------ # METHOD: menubar ?args? # # Evaluate the args against the Menubar component. # ------------------------------------------------------------------ itcl::body iwidgets::Mainwindow::menubar {args} { if {[llength $args] == 0} { return $itk_component(menubar) } else { return [eval $itk_component(menubar) $args] } } # ------------------------------------------------------------------ # METHOD: toolbar ?args? # # Evaluate the args against the Toolbar component. # ------------------------------------------------------------------ itcl::body iwidgets::Mainwindow::toolbar {args} { if {[llength $args] == 0} { return $itk_component(toolbar) } else { return [eval $itk_component(toolbar) $args] } } # ------------------------------------------------------------------ # METHOD: mousebar ?args? # # Evaluate the args against the Mousebar component. # ------------------------------------------------------------------ itcl::body iwidgets::Mainwindow::mousebar {args} { if {[llength $args] == 0} { return $itk_component(mousebar) } else { return [eval $itk_component(mousebar) $args] } } # ------------------------------------------------------------------ # METHOD: msgd ?args? # # Evaluate the args against the Messagedialog component. # ------------------------------------------------------------------ itcl::body iwidgets::Mainwindow::msgd {args} { if {[llength $args] == 0} { return $itk_component(msgd) } else { return [eval $itk_component(msgd) $args] } } # ------------------------------------------------------------------ # PRIVATE METHOD: _exitCB # # Menu callback for the exit option from the file menu. The method # confirms the user's request to exit the application prior to # taking the action. # ------------------------------------------------------------------ itcl::body iwidgets::Mainwindow::_exitCB {} { # # Configure the message dialog for confirmation of the exit request. # msgd configure -title Confirmation -bitmap questhead \ -text "Exit confirmation\n\ Are you sure ?" msgd buttonconfigure OK -text Yes msgd buttonconfigure Cancel -text No msgd default Cancel msgd center $itk_component(hull) # # Activate the message dialog and given a positive response # proceed to exit the application # if {[msgd activate]} { ::exit } } ������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/menubar.itk������������������������������������������������������������������0000644�0036047�0045461�00000215151�07336540151�015515� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Menubar widget # ---------------------------------------------------------------------- # The Menubar command creates a new window (given by the pathName # argument) and makes it into a Pull down menu widget. Additional # options, described above may be specified on the command line or # in the option database to configure aspects of the Menubar such # as its colors and font. The Menubar command returns its pathName # argument. At the time this command is invoked, there must not exist # a window named pathName, but pathName's parent must exist. # # A Menubar is a widget that simplifies the task of creating # menu hierarchies. It encapsulates a frame widget, as well # as menubuttons, menus, and menu entries. The Menubar allows # menus to be specified and refer enced in a more consistent # manner than using Tk to build menus directly. First, Menubar # allows a menu tree to be expressed in a hierachical "language". # The Menubar accepts a menuButtons option that allows a list of # menubuttons to be added to the Menubar. In turn, each menubutton # accepts a menu option that spec ifies a list of menu entries # to be added to the menubutton's menu (as well as an option # set for the menu). Cascade entries in turn, accept a menu # option that specifies a list of menu entries to be added to # the cascade's menu (as well as an option set for the menu). In # this manner, a complete menu grammar can be expressed to the # Menubar. Additionally, the Menubar allows each component of # the Menubar system to be referenced by a simple componentPathName # syntax. Finally, the Menubar extends the option set of menu # entries to include the helpStr option used to implement status # bar help. # # WISH LIST: # This section lists possible future enhancements. # # ---------------------------------------------------------------------- # AUTHOR: Bill W. Scott # # CURRENT MAINTAINER: Chad Smith --> csmith@adc.com or itclguy@yahoo.com # # @(#) $Id: menubar.itk,v 1.8 2001/08/15 18:33:13 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Menubar { keep -activebackground -activeborderwidth -activeforeground \ -anchor -background -borderwidth -cursor -disabledforeground \ -font -foreground -highlightbackground -highlightthickness \ -highlightcolor -justify -padx -pady -wraplength } itcl::class iwidgets::Menubar { inherit itk::Widget constructor { args } {} itk_option define -foreground foreground Foreground Black itk_option define -activebackground activeBackground Foreground "#ececec" itk_option define -activeborderwidth activeBorderWidth BorderWidth 2 itk_option define -activeforeground activeForeground Background black itk_option define -anchor anchor Anchor center itk_option define -borderwidth borderWidth BorderWidth 2 itk_option define \ -disabledforeground disabledForeground DisabledForeground #a3a3a3 itk_option define \ -font font Font "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*" itk_option define \ -highlightbackground highlightBackground HighlightBackground #d9d9d9 itk_option define -highlightcolor highlightColor HighlightColor Black itk_option define \ -highlightthickness highlightThickness HighlightThickness 0 itk_option define -justify justify Justify center itk_option define -padx padX Pad 4p itk_option define -pady padY Pad 3p itk_option define -wraplength wrapLength WrapLength 0 itk_option define -menubuttons menuButtons MenuButtons {} itk_option define -helpvariable helpVariable HelpVariable {} public { method add { type path args } { } method delete { args } { } method index { path } { } method insert { beforeComponent type name args } method invoke { entryPath } { } method menucget { args } { } method menuconfigure { path args } { } method path { args } { } method type { path } { } method yposition { entryPath } { } } private { method menubutton { menuName args } { } method options { args } { } method command { cmdName args } { } method checkbutton { chkName args } { } method radiobutton { radName args } { } method separator { sepName args } { } method cascade { casName args } { } method _helpHandler { menuPath } { } method _addMenuButton { buttonName args} { } method _insertMenuButton { beforeMenuPath buttonName args} { } method _makeMenuButton {buttonName args} { } method _makeMenu \ { componentName widgetName menuPath menuEvalStr } { } method _substEvalStr { evalStr } { } method _deleteMenu { menuPath {menuPath2 {}} } { } method _deleteAMenu { path } { } method _addEntry { type path args } { } method _addCascade { tkMenuPath path args } { } method _insertEntry { beforeEntryPath type name args } { } method _insertCascade { bfIndex tkMenuPath path args } { } method _deleteEntry { entryPath {entryPath2 {}} } { } method _configureMenu { path tkPath {option {}} args } { } method _configureMenuOption { type path args } { } method _configureMenuEntry { path index {option {}} args } { } method _unsetPaths { parent } { } method _entryPathToTkMenuPath {entryPath} { } method _getTkIndex { tkMenuPath tkIndex} { } method _getPdIndex { tkMenuPath tkIndex } { } method _getMenuList { } { } method _getEntryList { menu } { } method _parsePath { path } { } method _getSymbolicPath { parent segment } { } method _getCallerLevel { } variable _parseLevel 0 ;# The parse level depth variable _callerLevel #0 ;# abs level of caller variable _pathMap ;# Array indexed by Menubar's path ;# naming, yields tk menu path variable _entryIndex -1 ;# current entry help is displayed ;# for during help <motion> events variable _tkMenuPath ;# last tk menu being added to variable _ourMenuPath ;# our last valid path constructed. variable _menuOption ;# The -menu option variable _helpString ;# The -helpstr optio } } # # Use option database to override default resources. # option add *Menubar*Menu*tearOff false widgetDefault option add *Menubar*Menubutton*relief flat widgetDefault option add *Menubar*Menu*relief raised widgetDefault # # Provide a lowercase access method for the menubar class # proc ::iwidgets::menubar { args } { uplevel ::iwidgets::Menubar $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Menubar::constructor { args } { component hull configure -borderwidth 0 # # Create the Menubar Frame that will hold the menus. # # might want to make -relief and -bd options with defaults itk_component add menubar { frame $itk_interior.menubar -relief raised -bd 2 } { keep -cursor -background -width -height } pack $itk_component(menubar) -fill both -expand yes # Map our pathname to class to the actual menubar frame set _pathMap(.) $itk_component(menubar) eval itk_initialize $args # # HACK HACK HACK # Tk expects some variables to be defined and due to some # unknown reason we confuse its normal ordering. So, if # the user creates a menubutton with no menu it will fail # when clicked on with a "Error: can't read $tkPriv(oldGrab): # no such element in array". So by setting it to null we # avoid this error. uplevel #0 "set tkPriv(oldGrab) {}" } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # This first set of options are for configuring menus and/or menubuttons # at the menu level. # # ------------------------------------------------------------------ # OPTION -foreground # # menu # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::foreground { } # ------------------------------------------------------------------ # OPTION -activebackground # # menu # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::activebackground { } # ------------------------------------------------------------------ # OPTION -activeborderwidth # # menu # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::activeborderwidth { } # ------------------------------------------------------------------ # OPTION -activeforeground # # menu # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::activeforeground { } # ------------------------------------------------------------------ # OPTION -anchor # # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::anchor { } # ------------------------------------------------------------------ # OPTION -borderwidth # # menu # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::borderwidth { } # ------------------------------------------------------------------ # OPTION -disabledforeground # # menu # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::disabledforeground { } # ------------------------------------------------------------------ # OPTION -font # # menu # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::font { } # ------------------------------------------------------------------ # OPTION -highlightbackground # # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::highlightbackground { } # ------------------------------------------------------------------ # OPTION -highlightcolor # # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::highlightcolor { } # ------------------------------------------------------------------ # OPTION -highlightthickness # # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::highlightthickness { } # ------------------------------------------------------------------ # OPTION -justify # # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::justify { } # ------------------------------------------------------------------ # OPTION -padx # # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::padx { } # ------------------------------------------------------------------ # OPTION -pady # # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::pady { } # ------------------------------------------------------------------ # OPTION -wraplength # # menubutton # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::wraplength { } # ------------------------------------------------------------------ # OPTION -menubuttons # # The menuButton option is a string which specifies the arrangement # of menubuttons on the Menubar frame. Each menubutton entry is # delimited by the newline character. Each entry is treated as # an add command to the Menubar. # # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::menubuttons { if { $itk_option(-menubuttons) != {} } { # IF one exists already, delete the old one and create # a new one if { ! [catch {_parsePath .0}] } { delete .0 .last } # # Determine the context level to evaluate the option string at # set _callerLevel [_getCallerLevel] # # Parse the option string in their scope, then execute it in # our scope. # incr _parseLevel _substEvalStr itk_option(-menubuttons) eval $itk_option(-menubuttons) # reset so that we know we aren't parsing in a scope currently. incr _parseLevel -1 } } # ------------------------------------------------------------------ # OPTION -helpvariable # # Specifies the global variable to update whenever the mouse is in # motion over a menu entry. This global variable is updated with the # current value of the active menu entry's helpStr. Other widgets # can "watch" this variable with the trace command, or as is the # case with entry or label widgets, they can set their textVariable # to the same global variable. This allows for a simple implementation # of a help status bar. Whenever the mouse leaves a menu entry, # the helpVariable is set to the empty string {}. # ------------------------------------------------------------------ itcl::configbody iwidgets::Menubar::helpvariable { if {"" != $itk_option(-helpvariable) && ![string match ::* $itk_option(-helpvariable)] && ![string match @itcl* $itk_option(-helpvariable)]} { set itk_option(-helpvariable) "::$itk_option(-helpvariable)" } } # ------------------------------------------------------------- # # METHOD: add type path args # # Adds either a menu to the menu bar or a menu entry to a # menu pane. # # If the type is one of cascade, checkbutton, command, # radiobutton, or separator it adds a new entry to the bottom # of the menu denoted by the menuPath prefix of componentPath- # Name. The new entry's type is given by type. If additional # arguments are present, they specify options available to # component type Entry. See the man pages for menu(n) in the # section on Entries. In addition all entries accept an added # option, helpStr: # # -helpstr value # # Specifes the string to associate with the entry. # When the mouse moves over the associated entry, the variable # denoted by helpVariable is set. Another widget can bind to # the helpVariable and thus display status help. # # If the type is menubutton, it adds a new menubut- # ton to the menu bar. If additional arguments are present, # they specify options available to component type MenuButton. # # If the type is menubutton or cascade, the menu # option is available in addition to normal Tk options for # these to types. # # -menu menuSpec # # This is only valid for componentPathNames of type # menubutton or cascade. Specifes an option set and/or a set # of entries to place on a menu and associate with the menu- # button or cascade. The option keyword allows the menu widget # to be configured. Each item in the menuSpec is treated as # add commands (each with the possibility of having other # -menu options). In this way a menu can be recursively built. # # The last segment of componentPathName cannot be # one of the keywords last, menu, end. Additionally, it may # not be a number. However the componentPathName may be refer- # enced in this manner (see discussion of Component Path # Names). # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::add { type path args } { if ![regexp \ {^(menubutton|command|cascade|separator|radiobutton|checkbutton)$} \ $type] { error "bad type \"$type\": must be one of the following:\ \"command\", \"checkbutton\", \"radiobutton\",\ \"separator\", \"cascade\", or \"menubutton\"" } regexp {[^.]+$} $path segName if [regexp {^(menu|last|end|[0-9]+)$} $segName] { error "bad name \"$segName\": user created component \ path names may not end with \ \"end\", \"last\", \"menu\", \ or be an integer" } # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # OK, either add a menu # ''''''''''''''''''''''''''''''''''''''''''''''''''''' if { $type == "menubutton" } { # grab the last component name (the menu name) eval _addMenuButton $segName $args # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Or add an entry # ''''''''''''''''''''''''''''''''''''''''''''''''''''' } else { eval _addEntry $type $path $args } } # ------------------------------------------------------------- # # METHOD: delete entryPath ?entryPath2? # # If componentPathName is of component type MenuButton or # Menu, delete operates on menus. If componentPathName is of # component type Entry, delete operates on menu entries. # # This command deletes all components between com- # ponentPathName and componentPathName2 inclusive. If com- # ponentPathName2 is omitted then it defaults to com- # ponentPathName. Returns an empty string. # # If componentPathName is of type Menubar, then all menus # and the menu bar frame will be destroyed. In this case com- # ponentPathName2 is ignored. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::delete { args } { # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Handle out of bounds in arg lengths # ''''''''''''''''''''''''''''''''''''''''''''''''''''' if { [llength $args] > 0 && [llength $args] <=2 } { # Path Conversions # ''''''''''''''''''''''''''''''''''''''''''''''''''''' set path [_parsePath [lindex $args 0]] set pathOrIndex $_pathMap($path) # Menu Entry # ''''''''''''''''''''''''''''''''''''''''''''''''''''' if { [regexp {^[0-9]+$} $pathOrIndex] } { eval "_deleteEntry $args" # Menu # ''''''''''''''''''''''''''''''''''''''''''''''''''''' } else { eval "_deleteMenu $args" } } else { error "wrong # args: should be \ \"$itk_component(hull) delete pathName ?pathName2?\"" } return "" } # ------------------------------------------------------------- # # METHOD: index path # # If componentPathName is of type menubutton or menu, it # returns the position of the menu/menubutton on the Menubar # frame. # # If componentPathName is of type command, separator, # radiobutton, checkbutton, or cascade, it returns the menu # widget's numerical index for the entry corresponding to com- # ponentPathName. If path is not found or the Menubar frame is # passed in, -1 is returned. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::index { path } { # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Path conversions # ''''''''''''''''''''''''''''''''''''''''''''''''''''' if { [catch {set fullPath [_parsePath $path]} ] } { return -1 } if { [catch {set tkPathOrIndex $_pathMap($fullPath)} ] } { return -1 } # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # If integer, return the value, otherwise look up the menu position # ''''''''''''''''''''''''''''''''''''''''''''''''''''' if { [regexp {^[0-9]+$} $tkPathOrIndex] } { set index $tkPathOrIndex } else { set index [lsearch [_getMenuList] $fullPath] } return $index } # ------------------------------------------------------------- # # METHOD: insert beforeComponent type name ?option value? # # Insert a new component named name before the component # specified by componentPathName. # # If componentPathName is of type MenuButton or Menu, the # new component inserted is of type Menu and given the name # name. In this case valid option value pairs are those # accepted by menubuttons. # # If componentPathName is of type Entry, the new com- # ponent inserted is of type Entry and given the name name. In # this case valid option value pairs are those accepted by # menu entries. # # name cannot be one of the keywords last, menu, end. # dditionally, it may not be a number. However the com- # ponentPathName may be referenced in this manner (see discus- # sion of Component Path Names). # # Returns -1 if the menubar frame is passed in. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::insert { beforeComponent type name args } { if ![regexp \ {^(menubutton|command|cascade|separator|radiobutton|checkbutton)$} \ $type] { error "bad type \"$type\": must be one of the following:\ \"command\", \"checkbutton\", \"radiobutton\",\ \"separator\", \"cascade\", or \"menubutton\"" } regexp {[^.]+$} $name segName if [regexp {^(menu|last|end|[0-9]+)$} $segName] { error "bad name \"$name\": user created component \ path names may not end with \ \"end\", \"last\", \"menu\", \ or be an integer" } set beforeComponent [_parsePath $beforeComponent] # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Choose menu insertion or entry insertion # ''''''''''''''''''''''''''''''''''''''''''''''''''''' if { $type == "menubutton" } { eval _insertMenuButton $beforeComponent $name $args } else { eval _insertEntry $beforeComponent $type $name $args } } # ------------------------------------------------------------- # # METHOD: invoke entryPath # # Invoke the action of the menu entry denoted by # entryComponentPathName. See the sections on the individual # entries in the menu(n) man pages. If the menu entry is dis- # abled then nothing happens. If the entry has a command # associated with it then the result of that command is # returned as the result of the invoke widget command. Other- # wise the result is an empty string. # # If componentPathName is not a menu entry, an error is # issued. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::invoke { entryPath } { # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Path Conversions # ''''''''''''''''''''''''''''''''''''''''''''''''''''' set entryPath [_parsePath $entryPath] set index $_pathMap($entryPath) # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Error Processing # ''''''''''''''''''''''''''''''''''''''''''''''''''''' # first verify that beforeEntryPath is actually a path to # an entry and not to menu, menubutton, etc. if { ! [regexp {^[0-9]+$} $index] } { error "bad entry path: beforeEntryPath is not an entry" } # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Call invoke command # ''''''''''''''''''''''''''''''''''''''''''''''''''''' # get the tk menu path to call set tkMenuPath [_entryPathToTkMenuPath $entryPath] # call the menu's invoke command, adjusting index based on tearoff $tkMenuPath invoke [_getTkIndex $tkMenuPath $index] } # ------------------------------------------------------------- # # METHOD: menucget componentPath option # # Returns the current value of the configuration option # given by option. The component type of componentPathName # determines the valid available options. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::menucget { path opt } { return [lindex [menuconfigure $path $opt] 4] } # ------------------------------------------------------------- # # METHOD: menuconfigure componentPath ?option? ?value option value...? # # Query or modify the configuration options of the sub- # component of the Menubar specified by componentPathName. If # no option is specified, returns a list describing all of the # available options for componentPathName (see # Tk_ConfigureInfo for information on the format of this # list). If option is specified with no value, then the com- # mand returns a list describing the one named option (this # list will be identical to the corresponding sublist of the # value returned if no option is specified). If one or more # option-value pairs are specified, then the command modifies # the given widget option(s) to have the given value(s); in # this case the command returns an empty string. The component # type of componentPathName determines the valid available # options. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::menuconfigure { path args } { # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Path Conversions # ''''''''''''''''''''''''''''''''''''''''''''''''''''' set path [_parsePath $path] set tkPathOrIndex $_pathMap($path) # Case: Menu entry being configured # ''''''''''''''''''''''''''''''''''''''''''''''''''''' if { [regexp {^[0-9]+$} $tkPathOrIndex] } { eval "_configureMenuEntry $path $tkPathOrIndex $args" # Case: Menu (button and pane) being configured. # ''''''''''''''''''''''''''''''''''''''''''''''''''''' } else { eval _configureMenu $path $tkPathOrIndex $args } } # ------------------------------------------------------------- # # METHOD: path # # SYNOPIS: path ?<mode>? <pattern> # # Returns a fully formed component path that matches pat- # tern. If no match is found it returns -1. The mode argument # indicates how the search is to be matched against pattern # and it must have one of the following values: # # -glob Pattern is a glob-style pattern which is # matched against each component path using the same rules as # the string match command. # # -regexp Pattern is treated as a regular expression # and matched against each component path using the same # rules as the regexp command. # # The default mode is -glob. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::path { args } { set len [llength $args] if { $len < 1 || $len > 2 } { error "wrong # args: should be \ \"$itk_component(hull) path ?mode?> <pattern>\"" } set pathList [array names _pathMap] set len [llength $args] switch -- $len { 1 { # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Case: no search modes given # ''''''''''''''''''''''''''''''''''''''''''''''''''''' set pattern [lindex $args 0] set found [lindex $pathList [lsearch -glob $pathList $pattern]] } 2 { # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Case: search modes present (-glob, -regexp) # ''''''''''''''''''''''''''''''''''''''''''''''''''''' set options [lindex $args 0] set pattern [lindex $args 1] set found \ [lindex $pathList [lsearch $options $pathList $pattern]] } default { # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Case: wrong # arguments # ''''''''''''''''''''''''''''''''''''''''''''''''''''' error "wrong # args: \ should be \"$itk_component(hull) path ?-glob? ?-regexp? pattern\"" } } return $found } # ------------------------------------------------------------- # # METHOD: type path # # Returns the type of the component given by entryCom- # ponentPathName. For menu entries, this is the type argument # passed to the add/insert widget command when the entry was # created, such as command or separator. Othewise it is either # a menubutton or a menu. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::type { path } { # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Path Conversions # ''''''''''''''''''''''''''''''''''''''''''''''''''''' set path [_parsePath $path] # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Error Handling: does the path exist? # ''''''''''''''''''''''''''''''''''''''''''''''''''''' if { [catch {set index $_pathMap($path)} ] } { error "bad path \"$path\"" } # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # ENTRY, Ask TK for type # ''''''''''''''''''''''''''''''''''''''''''''''''''''' if { [regexp {^[0-9]+$} $index] } { # get the menu path from the entry path name set tkMenuPath [_entryPathToTkMenuPath $path] # call the menu's type command, adjusting index based on tearoff set type [$tkMenuPath type [_getTkIndex $tkMenuPath $index]] # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # MENUBUTTON, MENU, or FRAME # ''''''''''''''''''''''''''''''''''''''''''''''''''''' } else { # should not happen, but have a path that is not a valid window. if { [catch {set className [winfo class $_pathMap($path)]}] } { error "serious error: \"$path\" is not a valid window" } # get the classname, look it up, get index, us it to look up type set type [ lindex \ {frame menubutton menu} \ [lsearch { Frame Menubutton Menu } $className] \ ] } return $type } # ------------------------------------------------------------- # # METHOD: yposition entryPath # # Returns a decimal string giving the y-coordinate within # the menu window of the topmost pixel in the entry specified # by componentPathName. If the componentPathName is not an # entry, an error is issued. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::yposition { entryPath } { # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Path Conversions # ''''''''''''''''''''''''''''''''''''''''''''''''''''' set entryPath [_parsePath $entryPath] set index $_pathMap($entryPath) # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Error Handling # ''''''''''''''''''''''''''''''''''''''''''''''''''''' # first verify that entryPath is actually a path to # an entry and not to menu, menubutton, etc. if { ! [regexp {^[0-9]+$} $index] } { error "bad value: entryPath is not an entry" } # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Call yposition command # ''''''''''''''''''''''''''''''''''''''''''''''''''''' # get the menu path from the entry path name set tkMenuPath [_entryPathToTkMenuPath $entryPath] # call the menu's yposition command, adjusting index based on tearoff return [$tkMenuPath yposition [_getTkIndex $tkMenuPath $index]] } # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # PARSING METHODS # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ------------------------------------------------------------- # # PARSING METHOD: menubutton # # This method is invoked via an evaluation of the -menubuttons # option for the Menubar. # # It adds a new menubutton and processes any -menu options # for creating entries on the menu pane associated with the # menubutton # ------------------------------------------------------------- itcl::body iwidgets::Menubar::menubutton { menuName args } { eval "add menubutton .$menuName $args" } # ------------------------------------------------------------- # # PARSING METHOD: options # # This method is invoked via an evaluation of the -menu # option for menubutton commands. # # It configures the current menu ($_ourMenuPath) with the options # that follow (args) # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::options { args } { eval "$_tkMenuPath configure $args" } # ------------------------------------------------------------- # # PARSING METHOD: command # # This method is invoked via an evaluation of the -menu # option for menubutton commands. # # It adds a new command entry to the current menu, $_ourMenuPath # naming it $cmdName. Since this is the most common case when # creating menus, streamline it by duplicating some code from # the add{} method. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::command { cmdName args } { set path $_ourMenuPath.$cmdName # error checking regsub {.*[.]} $path "" segName if [regexp {^(menu|last|end|[0-9]+)$} $segName] { error "bad name \"$segName\": user created component \ path names may not end with \ \"end\", \"last\", \"menu\", \ or be an integer" } eval _addEntry command $path $args } # ------------------------------------------------------------- # # PARSING METHOD: checkbutton # # This method is invoked via an evaluation of the -menu # option for menubutton/cascade commands. # # It adds a new checkbutton entry to the current menu, $_ourMenuPath # naming it $chkName. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::checkbutton { chkName args } { eval "add checkbutton $_ourMenuPath.$chkName $args" } # ------------------------------------------------------------- # # PARSING METHOD: radiobutton # # This method is invoked via an evaluation of the -menu # option for menubutton/cascade commands. # # It adds a new radiobutton entry to the current menu, $_ourMenuPath # naming it $radName. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::radiobutton { radName args } { eval "add radiobutton $_ourMenuPath.$radName $args" } # ------------------------------------------------------------- # # PARSING METHOD: separator # # This method is invoked via an evaluation of the -menu # option for menubutton/cascade commands. # # It adds a new separator entry to the current menu, $_ourMenuPath # naming it $sepName. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::separator { sepName args } { eval $_tkMenuPath add separator set _pathMap($_ourMenuPath.$sepName) [_getPdIndex $_tkMenuPath end] } # ------------------------------------------------------------- # # PARSING METHOD: cascade # # This method is invoked via an evaluation of the -menu # option for menubutton/cascade commands. # # It adds a new cascade entry to the current menu, $_ourMenuPath # naming it $casName. It processes the -menu option if present, # adding a new menu pane and its associated entries found. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::cascade { casName args } { # Save the current menu we are adding to, cascade can change # the current menu through -menu options. set saveOMP $_ourMenuPath set saveTKP $_tkMenuPath eval "add cascade $_ourMenuPath.$casName $args" # Restore the saved menu states so that the next entries of # the -menu/-menubuttons we are processing will be at correct level. set _ourMenuPath $saveOMP set _tkMenuPath $saveTKP } # ... A P I S U P P O R T M E T H O D S... # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # MENU ADD, INSERT, DELETE # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ------------------------------------------------------------- # # PRIVATE METHOD: _addMenuButton # # Makes a new menubutton & associated -menu, pack appended # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_addMenuButton { buttonName args} { eval "_makeMenuButton $buttonName $args" #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Pack at end, adjust for help buttonName # '''''''''''''''''''''''''''''''''' if { $buttonName == "help" } { pack $itk_component($buttonName) -side right } else { pack $itk_component($buttonName) -side left } return $itk_component($buttonName) } # ------------------------------------------------------------- # # PRIVATE METHOD: _insertMenuButton # # inserts a menubutton named $buttonName on a menu bar before # another menubutton specified by $beforeMenuPath # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_insertMenuButton { beforeMenuPath buttonName args} { eval "_makeMenuButton $buttonName $args" #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Pack before the $beforeMenuPath # '''''''''''''''''''''''''''''''' set beforeTkMenu $_pathMap($beforeMenuPath) regsub {[.]menu$} $beforeTkMenu "" beforeTkMenu pack $itk_component(menubar).$buttonName \ -side left \ -before $beforeTkMenu return $itk_component($buttonName) } # ------------------------------------------------------------- # # PRIVATE METHOD: _makeMenuButton # # creates a menubutton named buttonName on the menubar with args. # The -menu option if present will trigger attaching a menu pane. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_makeMenuButton {buttonName args} { #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Capture the -menu option if present # ''''''''''''''''''''''''''''''''''' array set temp $args if { [::info exists temp(-menu)] } { # We only keep this in case of menuconfigure or menucget set _menuOption(.$buttonName) $temp(-menu) set menuEvalStr $temp(-menu) } else { set menuEvalStr {} } # attach the actual menu widget to the menubutton's arg list set temp(-menu) $itk_component(menubar).$buttonName.menu set args [array get temp] #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Create menubutton component # '''''''''''''''''''''''''''''''' itk_component add $buttonName { eval ::menubutton \ $itk_component(menubar).$buttonName \ $args } { keep \ -activebackground \ -activeforeground \ -anchor \ -background \ -borderwidth \ -cursor \ -disabledforeground \ -font \ -foreground \ -highlightbackground \ -highlightcolor \ -highlightthickness \ -justify \ -padx \ -pady \ -wraplength } set _pathMap(.$buttonName) $itk_component($buttonName) _makeMenu \ $buttonName-menu \ $itk_component($buttonName).menu \ .$buttonName \ $menuEvalStr return $itk_component($buttonName) } # ------------------------------------------------------------- # # PRIVATE METHOD: _makeMenu # # Creates a menu. # It then evaluates the $menuEvalStr to create entries on the menu. # # Assumes the existence of $itk_component($buttonName) # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_makeMenu \ { componentName widgetName menuPath menuEvalStr } { #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Create menu component # '''''''''''''''''''''''''''''''' itk_component add $componentName { ::menu $widgetName } { keep \ -activebackground \ -activeborderwidth \ -activeforeground \ -background \ -borderwidth \ -cursor \ -disabledforeground \ -font \ -foreground } set _pathMap($menuPath.menu) $itk_component($componentName) #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Attach help handler to this menu # '''''''''''''''''''''''''''''''' bind $itk_component($componentName) <<MenuSelect>> \ [itcl::code $this _helpHandler $menuPath.menu] #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Handle -menu #''''''''''''''''''''''''''''''''' set _ourMenuPath $menuPath set _tkMenuPath $itk_component($componentName) # # A zero parseLevel says we are at the top of the parse tree, # so get the context scope level and do a subst for the menuEvalStr. # if { $_parseLevel == 0 } { set _callerLevel [_getCallerLevel] } # # bump up the parse level, so if we get called via the 'eval $menuEvalStr' # we know to skip the above steps... # incr _parseLevel eval $menuEvalStr # # leaving, so done with this parse level, so bump it back down # incr _parseLevel -1 } # ------------------------------------------------------------- # # PRIVATE METHOD: _substEvalStr # # This performs the substitution and evaluation of $ [], \ found # in the -menubutton/-menus options # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_substEvalStr { evalStr } { upvar $evalStr evalStrRef set evalStrRef [uplevel $_callerLevel [list subst $evalStrRef]] } # ------------------------------------------------------------- # # PRIVATE METHOD: _deleteMenu # # _deleteMenu menuPath ?menuPath2? # # deletes menuPath or from menuPath to menuPath2 # # Menu paths may be formed in one of two ways # .MENUBAR.menuName where menuName is the name of the menu # .MENUBAR.menuName.menu where menuName is the name of the menu # # The basic rule is '.menu' is not needed. # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_deleteMenu { menuPath {menuPath2 {}} } { if { $menuPath2 == "" } { # get a corrected path (subst for number, last, end) set path [_parsePath $menuPath] _deleteAMenu $path } else { # gets the list of menus in interface order set menuList [_getMenuList] # ... get the start menu and the last menu ... # get a corrected path (subst for number, last, end) set menuStartPath [_parsePath $menuPath] regsub {[.]menu$} $menuStartPath "" menuStartPath set menuEndPath [_parsePath $menuPath2] regsub {[.]menu$} $menuEndPath "" menuEndPath # get the menu position (0 based) of the start and end menus. set start [lsearch -exact $menuList $menuStartPath] if { $start == -1 } { error "bad menu path \"$menuStartPath\": \ should be one of $menuList" } set end [lsearch -exact $menuList $menuEndPath] if { $end == -1 } { error "bad menu path \"$menuEndPath\": \ should be one of $menuList" } # now create the list from this range of menus set delList [lrange $menuList $start $end] # walk thru them deleting each menu. # this list has no .menu on the end. foreach m $delList { _deleteAMenu $m.menu } } } # ------------------------------------------------------------- # # PRIVATE METHOD: _deleteAMenu # # _deleteMenu menuPath # # deletes a single Menu (menubutton and menu pane with entries) # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_deleteAMenu { path } { # We will normalize the path to not include the '.menu' if # it is on the path already. regsub {[.]menu$} $path "" menuButtonPath regsub {.*[.]} $menuButtonPath "" buttonName # Loop through and destroy any cascades, etc on menu. set entryList [_getEntryList $menuButtonPath] foreach entry $entryList { _deleteEntry $entry } # Delete the menubutton and menu components... destroy $itk_component($buttonName-menu) destroy $itk_component($buttonName) # This is because of some itcl bug that doesn't delete # the component on the destroy in some cases... catch {itk_component delete $buttonName-menu} catch {itk_component delete $buttonName} # unset our paths _unsetPaths $menuButtonPath } # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ENTRY ADD, INSERT, DELETE # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ------------------------------------------------------------- # # PRIVATE METHOD: _addEntry # # Adds an entry to menu. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_addEntry { type path args } { # Error Checking # '''''''''''''' # the path should not end with '.menu' # Not needed -- already checked by add{} # if { [regexp {[.]menu$} $path] } { # error "bad entry path: \"$path\". \ # The name \"menu\" is reserved for menu panes" # } # get the tkMenuPath set tkMenuPath [_entryPathToTkMenuPath $path] if { $tkMenuPath == "" } { error "bad entry path: \"$path\". The menu path prefix is not valid" } # get the -helpstr option if present array set temp $args if { [::info exists temp(-helpstr)] } { set helpStr $temp(-helpstr) unset temp(-helpstr) } else { set helpStr {} } set args [array get temp] # Handle CASCADE # '''''''''''''' # if this is a cascade go ahead and add in the menu... if { $type == "cascade" } { eval [list _addCascade $tkMenuPath $path] $args # Handle Non-CASCADE # '''''''''''''''''' } else { # add the entry if one doesn't already exist with the same # command name if [::info exists _pathMap($path)] { set cmdname [lindex [split $path .] end] error "Cannot add $type \"$cmdname\". A menu item already\ exists with this name." } eval [list $tkMenuPath add $type] $args set _pathMap($path) [_getPdIndex $tkMenuPath end] } # Remember the help string set _helpString($path) $helpStr return $_pathMap($path) } # ------------------------------------------------------------- # # PRIVATE METHOD: _addCascade # # Creates a cascade button. Handles the -menu option # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_addCascade { tkMenuPath path args } { # get the cascade name from our path regsub {.*[.]} $path "" cascadeName #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Capture the -menu option if present # ''''''''''''''''''''''''''''''''''' array set temp $args if { [::info exists temp(-menu)] } { set menuEvalStr $temp(-menu) } else { set menuEvalStr {} } # attach the menu pane set temp(-menu) $tkMenuPath.$cascadeName set args [array get temp] # Create the cascade entry eval $tkMenuPath add cascade $args # Keep the -menu string in case of menuconfigure or menucget if { $menuEvalStr != "" } { set _menuOption($path) $menuEvalStr } # update our pathmap set _pathMap($path) [_getPdIndex $tkMenuPath end] _makeMenu \ $cascadeName-menu \ $tkMenuPath.$cascadeName \ $path \ $menuEvalStr #return $itk_component($cascadeName) } # ------------------------------------------------------------- # # PRIVATE METHOD: _insertEntry # # inserts an entry on a menu before entry given by beforeEntryPath. # The added entry is of type TYPE and its name is NAME. ARGS are # passed for customization of the entry. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_insertEntry { beforeEntryPath type name args } { # convert entryPath to an index value set bfIndex $_pathMap($beforeEntryPath) # first verify that beforeEntryPath is actually a path to # an entry and not to menu, menubutton, etc. if { ! [regexp {^[0-9]+$} $bfIndex] } { error "bad entry path: $beforeEntryPath is not an entry" } # get the menu path from the entry path name regsub {[.][^.]*$} $beforeEntryPath "" menuPathPrefix set tkMenuPath $_pathMap($menuPathPrefix.menu) # If this entry already exists in the path map, throw an error. if [::info exists _pathMap($menuPathPrefix.$name)] { error "Cannot insert $type \"$name\". A menu item already\ exists with this name." } # INDEX is zero based at this point. # ENTRIES is a zero based list... set entries [_getEntryList $menuPathPrefix] # # Adjust the entries after the inserted item, to have # the correct index numbers. Note, we stay zero based # even though tk flips back and forth depending on tearoffs. # for {set i $bfIndex} {$i < [llength $entries]} {incr i} { # path==entry path in numerical order set path [lindex $entries $i] # add one to each entry after the inserted one. set _pathMap($path) [expr {$i + 1}] } # get the -helpstr option if present array set temp $args if { [::info exists temp(-helpstr)] } { set helpStr $temp(-helpstr) unset temp(-helpstr) } else { set helpStr {} } set args [array get temp] set path $menuPathPrefix.$name # Handle CASCADE # '''''''''''''' # if this is a cascade go ahead and add in the menu... if { [string match cascade $type] } { if { [ catch {eval "_insertCascade \ $bfIndex $tkMenuPath $path $args"} errMsg ]} { for {set i $bfIndex} {$i < [llength $entries]} {incr i} { # path==entry path in numerical order set path [lindex $entries $i] # sub the one we added earlier. set _pathMap($path) [expr {$_pathMap($path) - 1}] # @@ delete $hs } error $errMsg } # Handle Entry # '''''''''''''' } else { # give us a zero or 1-based index based on tear-off menu status # invoke the menu's insert command if { [catch {eval "$tkMenuPath insert \ [_getTkIndex $tkMenuPath $bfIndex] $type $args"} errMsg]} { for {set i $bfIndex} {$i < [llength $entries]} {incr i} { # path==entry path in numerical order set path [lindex $entries $i] # sub the one we added earlier. set _pathMap($path) [expr {$_pathMap($path) - 1}] # @@ delete $hs } error $errMsg } # add the helpstr option to our options list (attach to entry) set _helpString($path) $helpStr # Insert the new entry path into pathmap giving it an index value set _pathMap($menuPathPrefix.$name) $bfIndex } return [_getTkIndex $tkMenuPath $bfIndex] } # ------------------------------------------------------------- # # PRIVATE METHOD: _insertCascade # # Creates a cascade button. Handles the -menu option # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_insertCascade { bfIndex tkMenuPath path args } { # get the cascade name from our path regsub {.*[.]} $path "" cascadeName #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, # Capture the -menu option if present # ''''''''''''''''''''''''''''''''''' array set temp $args if { [::info exists temp(-menu)] } { # Keep the -menu string in case of menuconfigure or menucget set _menuOption($path) $temp(-menu) set menuEvalStr $temp(-menu) } else { set menuEvalStr {} } # attach the menu pane set temp(-menu) $tkMenuPath.$cascadeName set args [array get temp] # give us a zero or 1-based index based on tear-off menu status # invoke the menu's insert command eval "$tkMenuPath insert \ [_getTkIndex $tkMenuPath $bfIndex] cascade $args" # Insert the new entry path into pathmap giving it an index value set _pathMap($path) $bfIndex _makeMenu \ $cascadeName-menu \ $tkMenuPath.$cascadeName \ $path \ $menuEvalStr #return $itk_component($cascadeName) } # ------------------------------------------------------------- # # PRIVATE METHOD: _deleteEntry # # _deleteEntry entryPath ?entryPath2? # # either # deletes the entry entryPath # or # deletes the entries from entryPath to entryPath2 # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_deleteEntry { entryPath {entryPath2 {}} } { if { $entryPath2 == "" } { # get a corrected path (subst for number, last, end) set path [_parsePath $entryPath] set entryIndex $_pathMap($path) if { $entryIndex == -1 } { error "bad value for pathName: \ $entryPath in call to delet" } # get the type, if cascade, we will want to delete menu set type [type $path] # ... munge up the menu name ... # the tkMenuPath is looked up with the .menu added to lookup # strip off the entry component regsub {[.][^.]*$} $path "" menuPath set tkMenuPath $_pathMap($menuPath.menu) # get the ordered entry list set entries [_getEntryList $menuPath] # ... Fix up path entry indices ... # delete the path from the map unset _pathMap([lindex $entries $entryIndex]) # Subtract off 1 for each entry below the deleted one. for {set i [expr {$entryIndex + 1}]} \ {$i < [llength $entries]} \ {incr i} { set epath [lindex $entries $i] incr _pathMap($epath) -1 } # ... Delete the menu entry widget ... # delete the menu entry, ajusting index for TK $tkMenuPath delete [_getTkIndex $tkMenuPath $entryIndex] if { $type == "cascade" } { regsub {.*[.]} $path "" cascadeName destroy $itk_component($cascadeName-menu) # This is because of some itcl bug that doesn't delete # the component on the destroy in some cases... catch {itk_component delete $cascadeName-menu} _unsetPaths $path } } else { # get a corrected path (subst for number, last, end) set path1 [_parsePath $entryPath] set path2 [_parsePath $entryPath2] set fromEntryIndex $_pathMap($path1) if { $fromEntryIndex == -1 } { error "bad value for entryPath1: \ $entryPath in call to delet" } set toEntryIndex $_pathMap($path2) if { $toEntryIndex == -1 } { error "bad value for entryPath2: \ $entryPath2 in call to delet" } # ... munge up the menu name ... # the tkMenuPath is looked up with the .menu added to lookup # strip off the entry component regsub {[.][^.]*$} $path1 "" menuPath set tkMenuPath $_pathMap($menuPath.menu) # get the ordered entry list set entries [_getEntryList $menuPath] # ... Fix up path entry indices ... # delete the range from the pathMap list for {set i $fromEntryIndex} {$i <= $toEntryIndex} {incr i} { unset _pathMap([lindex $entries $i]) } # Subtract off 1 for each entry below the deleted range. # Loop from one below the bottom delete entry to end list for {set i [expr {$toEntryIndex + 1}]} \ {$i < [llength $entries]} \ {incr i} { # take this path and sets its index back by size of # deleted range. set path [lindex $entries $i] set _pathMap($path) \ [expr {$_pathMap($path) - \ (($toEntryIndex - $fromEntryIndex) + 1)}] } # ... Delete the menu entry widget ... # delete the menu entry, ajusting index for TK $tkMenuPath delete \ [_getTkIndex $tkMenuPath $fromEntryIndex] \ [_getTkIndex $tkMenuPath $toEntryIndex] } } # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # CONFIGURATION SUPPORT # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ------------------------------------------------------------- # # PRIVATE METHOD: _configureMenu # # This configures a menu. A menu is a true tk widget, thus we # pass the tkPath variable. This path may point to either a # menu button (does not end with the name 'menu', or a menu # which ends with the name 'menu' # # path : our Menubar path name to this menu button or menu pane. # if we end with the name '.menu' then it is a menu pane. # tkPath : the path to the corresponding Tk menubutton or menu. # args : the args for configuration # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_configureMenu { path tkPath {option {}} args } { set class [winfo class $tkPath] if { $option == "" } { # No arguments: return all options set configList [$tkPath configure] if { [info exists _menuOption($path)] } { lappend configList [list -menu menu Menu {} $_menuOption($path)] } else { lappend configList [list -menu menu Menu {} {}] } if { [info exists _helpString($path)] } { lappend configList [list -helpstr helpStr HelpStr {} \ $_helpString($path)] } else { lappend configList [list -helpstr helpStr HelpStr {} {}] } return $configList } elseif {$args == "" } { if { $option == "-menu" } { if { [info exists _menuOption($path)] } { return [list -menu menu Menu {} $_menuOption($path)] } else { return [list -menu menu Menu {} {}] } } elseif { $option == "-helpstr" } { if { [info exists _helpString($path)] } { return [list -helpstr helpStr HelpStr {} $_helpString($path)] } else { return [list -helpstr helpStr HelpStr {} {}] } } else { # ... OTHERWISE, let Tk get it. return [$tkPath configure $option] } } else { set args [concat $option $args] # If this is a menubutton, and has -menu option, process it if { $class == "Menubutton" && [regexp -- {-menu} $args] } { eval _configureMenuOption menubutton $path $args } else { eval $tkPath configure $args } return "" } } # ------------------------------------------------------------- # # PRIVATE METHOD: _configureMenuOption # # Allows for configuration of the -menu option on # menubuttons and cascades # # find out if we are the last menu, or are before one. # delete the old menu. # if we are the last, then add us back at the end # if we are before another menu, get the beforePath # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_configureMenuOption { type path args } { regsub {[.][^.]*$} $path "" pathPrefix if { $type == "menubutton" } { set menuList [_getMenuList] set pos [lsearch $menuList $path] if { $pos == ([llength $menuList] - 1) } { set insert false } else { set insert true } } elseif { $type == "cascade" } { set lastEntryPath [_parsePath $pathPrefix.last] if { $lastEntryPath == $path } { set insert false } else { set insert true } set pos [index $path] } eval "delete $pathPrefix.$pos" if { $insert } { # get name from path... regsub {.*[.]} $path "" name eval insert $pathPrefix.$pos $type \ $name $args } else { eval add $type $path $args } } # ------------------------------------------------------------- # # PRIVATE METHOD: _configureMenuEntry # # This configures a menu entry. A menu entry is either a command, # radiobutton, separator, checkbutton, or a cascade. These have # a corresponding Tk index value for the corresponding tk menu # path. # # path : our Menubar path name to this menu entry. # index : the t # args : the args for configuration # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_configureMenuEntry { path index {option {}} args } { set type [type $path] # set len [llength $args] # get the menu path from the entry path name set tkMenuPath [_entryPathToTkMenuPath $path] if { $option == "" } { set configList [$tkMenuPath entryconfigure \ [_getTkIndex $tkMenuPath $index]] if { $type == "cascade" } { if { [info exists _menuOption($path)] } { lappend configList [list -menu menu Menu {} \ $_menuOption($path)] } else { lappend configList [list -menu menu Menu {} {}] } } if { [info exists _helpString($path)] } { lappend configList [list -helpstr helpStr HelpStr {} \ $_helpString($path)] } else { lappend configList [list -helpstr helpStr HelpStr {} {}] } return $configList } elseif { $args == "" } { if { $option == "-menu" } { if { [info exists _menuOption($path)] } { return [list -menu menu Menu {} $_menuOption($path)] } else { return [list -menu menu Menu {} {}] } } elseif { $option == "-helpstr" } { if { [info exists _helpString($path)] } { return [list -helpstr helpStr HelpStr {} \ $_helpString($path)] } else { return [list -helpstr helpStr HelpStr {} {}] } } else { # ... OTHERWISE, let Tk get it. return [$tkMenuPath entryconfigure \ [_getTkIndex $tkMenuPath $index] $option] } } else { array set temp [concat $option $args] # ... Store -helpstr val,strip out -helpstr val from args if { [::info exists temp(-helpstr)] } { set _helpString($path) $temp(-helpstr) unset temp(-helpstr) } set args [array get temp] if { $type == "cascade" && [::info exists temp(-menu)] } { eval "_configureMenuOption cascade $path $args" } else { # invoke the menu's entryconfigure command # being careful to ajust the INDEX to be 0 or 1 based # depending on the tearoff status # if the stripping process brought us down to no options # to set, then forget the configure of widget. if { [llength $args] != 0 } { eval $tkMenuPath entryconfigure \ [_getTkIndex $tkMenuPath $index] $args } } return "" } } # ------------------------------------------------------------- # # PRIVATE METHOD: _unsetPaths # # comment # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_unsetPaths { parent } { # first get the complete list of all menu paths set pathList [array names _pathMap] # for each path that matches parent prefix, unset it. foreach path $pathList { if { [regexp [subst -nocommands {^$parent}] $path] } { unset _pathMap($path) } } } # ------------------------------------------------------------- # # PRIVATE METHOD: _entryPathToTkMenuPath # # Takes an entry path like .mbar.file.new and changes it to # .mbar.file.menu and performs a lookup in the pathMap to # get the corresponding menu widget name for tk # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_entryPathToTkMenuPath {entryPath} { # get the menu path from the entry path name # by stripping off the entry component of the path regsub {[.][^.]*$} $entryPath "" menuPath # the tkMenuPath is looked up with the .menu added to lookup if { [catch {set tkMenuPath $_pathMap($menuPath.menu)}] } { return "" } else { return $_pathMap($menuPath.menu) } } # ------------------------------------------------------------- # # These two methods address the issue of menu entry indices being # zero-based when the menu is not a tearoff menu and 1-based when # it is a tearoff menu. Our strategy is to hide this difference. # # _getTkIndex returns the index as tk likes it: 0 based for non-tearoff # and 1 based for tearoff menus. # # _getPdIndex (get pulldown index) always returns it as 0 based. # # ------------------------------------------------------------- # ------------------------------------------------------------- # # PRIVATE METHOD: _getTkIndex # # give us a zero or 1-based answer depending on the tearoff # status of the menu. If the menu denoted by tkMenuPath is a # tearoff menu it returns a 1-based result, otherwise a # zero-based result. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_getTkIndex { tkMenuPath tkIndex} { # if there is a tear off make it 1-based index if { [$tkMenuPath cget -tearoff] } { incr tkIndex } return $tkIndex } # ------------------------------------------------------------- # # PRIVATE METHOD: _getPdIndex # # Take a tk index and give me a zero based numerical index # # Ask the menu widget for the index of the entry denoted by # 'tkIndex'. Then if the menu is a tearoff adjust the value # to be zero based. # # This method returns the index as if tearoffs did not exist. # Always returns a zero-based index. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_getPdIndex { tkMenuPath tkIndex } { # get the index from the tk menu # this 0 based for non-tearoff and 1-based for tearoffs set pdIndex [$tkMenuPath index $tkIndex] # if there is a tear off make it 0-based index if { [$tkMenuPath cget -tearoff] } { incr pdIndex -1 } return $pdIndex } # ------------------------------------------------------------- # # PRIVATE METHOD: _getMenuList # # Returns the list of menus in the order they are on the interface # returned list is a list of our menu paths # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_getMenuList { } { # get the menus that are packed set tkPathList [pack slaves $itk_component(menubar)] regsub -- {[.]} $itk_component(hull) "" mbName regsub -all -- "\[.\]$mbName\[.\]menubar\[.\]" $tkPathList "." menuPathList return $menuPathList } # ------------------------------------------------------------- # # PRIVATE METHOD: _getEntryList # # # This method looks at a menupath and gets all the entries and # returns a list of all the entry path names in numerical order # based on their index values. # # MENU is the path to a menu, like .mbar.file.menu or .mbar.file # we will calculate a menuPath from this: .mbar.file # then we will build a list of entries in this menu excluding the # path .mbar.file.menu # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_getEntryList { menu } { # if it ends with menu, clip it off regsub {[.]menu$} $menu "" menuPath # first get the complete list of all menu paths set pathList [array names _pathMap] set numEntries 0 # iterate over the pathList and put on menuPathList those # that match the menuPattern foreach path $pathList { # if this path is on the menuPath's branch if { [regexp [subst -nocommands {$menuPath[.][^.]*$}] $path] } { # if not a menu itself if { ! [regexp {[.]menu$} $path] } { set orderedList($_pathMap($path)) $path incr numEntries } } } set entryList {} for {set i 0} {$i < $numEntries} {incr i} { lappend entryList $orderedList($i) } return $entryList } # ------------------------------------------------------------- # # PRIVATE METHOD: _parsePath # # given path, PATH, _parsePath splits the path name into its # component segments. It then puts the name back together one # segment at a time and calls _getSymbolicPath to replace the # keywords 'last' and 'end' as well as numeric digits. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_parsePath { path } { set segments [split [string trimleft $path .] .] set concatPath "" foreach seg $segments { set concatPath [_getSymbolicPath $concatPath $seg] if { [catch {set _pathMap($concatPath)} ] } { error "bad path: \"$path\" does not exist. \"$seg\" not valid" } } return $concatPath } # ------------------------------------------------------------- # # PRIVATE METHOD: _getSymbolicPath # # Given a PATH, _getSymbolicPath looks for the last segment of # PATH to contain: a number, the keywords last or end. If one # of these it figures out how to get us the actual pathname # to the searched widget # # Implementor's notes: # Surely there is a shorter way to do this. The only diff # for non-numeric is getting the llength of the correct list # It is hard to know this upfront so it seems harder to generalize. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_getSymbolicPath { parent segment } { # if the segment is a number, then look it up positionally # MATCH numeric index if { [regexp {^[0-9]+$} $segment] } { # if we have no parent, then we area menubutton if { $parent == {} } { set returnPath [lindex [_getMenuList] $segment] } else { set returnPath [lindex [_getEntryList $parent.menu] $segment] } # MATCH 'end' or 'last' keywords. } elseif { $segment == "end" || $segment == "last" } { # if we have no parent, then we are a menubutton if { $parent == {} } { set returnPath [lindex [_getMenuList] end] } else { set returnPath [lindex [_getEntryList $parent.menu] end] } } else { set returnPath $parent.$segment } return $returnPath } # ------------------------------------------------------------- # # PRIVATE METHOD: _helpHandler # # Bound to the <Motion> event on a menu pane. This puts the # help string associated with the menu entry into the # status widget help area. If no help exists for the current # entry, the status widget is cleared. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_helpHandler { menuPath } { if { $itk_option(-helpvariable) == {} } { return } set tkMenuWidget $_pathMap($menuPath) set entryIndex [$tkMenuWidget index active] # already on this item? if { $entryIndex == $_entryIndex } { return } set _entryIndex $entryIndex if {"none" != $entryIndex} { set entries [_getEntryList $menuPath] set menuEntryHit \ [lindex $entries [_getPdIndex $tkMenuWidget $entryIndex]] # blank out the old one set $itk_option(-helpvariable) {} # if there is a help string for this entry if { [::info exists _helpString($menuEntryHit)] } { set $itk_option(-helpvariable) $_helpString($menuEntryHit) } } else { set $itk_option(-helpvariable) {} set _entryIndex -1 } } # ------------------------------------------------------------- # # PRIVATE METHOD: _getCallerLevel # # Starts at stack frame #0 and works down till we either hit # a ::Menubar stack frame or an ::itk::Archetype stack frame # (the latter happens when a configure is called via the 'component' # method # # Returns the level of the actual caller of the menubar command # in the form of #num where num is the level number caller stack frame. # # ------------------------------------------------------------- itcl::body iwidgets::Menubar::_getCallerLevel { } { set levelName {} set levelsAreValid true set level 0 set callerLevel #$level while { $levelsAreValid } { # Hit the end of the stack frame if [catch {uplevel #$level {namespace current}}] { set levelsAreValid false set callerLevel #[expr {$level - 1}] # still going } else { set newLevelName [uplevel #$level {namespace current}] # See if we have run into the first ::Menubar level if { $newLevelName == "::itk::Archetype" || \ $newLevelName == "::iwidgets::Menubar" } { # If so, we are done-- set the callerLevel set levelsAreValid false set callerLevel #[expr {$level - 1}] } else { set levelName $newLevelName } } incr level } return $callerLevel } # # The default tkMenuFind proc in menu.tcl only looks for menubuttons # in frames. Since our menubuttons are within the Menubar class, the # default proc won't find them during menu traversal. This proc # redefines the default proc to remedy the problem. #----------------------------------------------------------- # BUG FIX: csmith (Chad Smith: csmith@adc.com), 3/30/99 #----------------------------------------------------------- # The line, "set qchild ..." below had a typo. It should be # "info command $child" instead of "winfo command $child". #----------------------------------------------------------- proc tkMenuFind {w char} { global tkPriv set char [string tolower $char] # Added by csmith, 5/10/01, to fix a bug reported on the itcl mailing list. if {$w == "."} { foreach child [winfo child $w] { set match [tkMenuFind $child $char] if {$match != ""} { return $match } } return {} } foreach child [winfo child $w] { switch [winfo class $child] { Menubutton { set qchild [info command $child] set char2 [string index [$qchild cget -text] \ [$qchild cget -underline]] if {([string compare $char [string tolower $char2]] == 0) || ($char == "")} { if {[$qchild cget -state] != "disabled"} { return $child } } } Frame - Menubar { set match [tkMenuFind $child $char] if {$match != ""} { return $match } } } } return {} } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/messagebox.itk���������������������������������������������������������������0000644�0036047�0045461�00000032575�07445713051�016232� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Messagebox # ---------------------------------------------------------------------- # Implements an information messages area widget with scrollbars. # Message types can be user defined and configured. Their options # include foreground, background, font, bell, and their display # mode of on or off. This allows message types to defined as needed, # removed when no longer so, and modified when necessary. An export # method is provided for file I/O. # # The number of lines that can be displayed may be limited with # the default being 1000. When this limit is reached, the oldest line # is removed. There is also support for saving the contents to a # file, using a file selection dialog. # ---------------------------------------------------------------------- # # History: # 01/16/97 - Alfredo Jahn Renamed from InfoMsgBox to MessageBox # Initial release... # 01/20/97 - Alfredo Jahn Add a popup window so that 3rd mouse # button can be used to configure/access the message area. # New methods added: _post and _toggleDebug. # 01/30/97 - Alfredo Jahn Add -filename option # 05/11/97 - Mark Ulferts Added the ability to define and configure # new types. Changed print method to be issue. # 09/05/97 - John Tucker Added export method. # # ---------------------------------------------------------------------- # AUTHOR: Alfredo Jahn V EMAIL: ajahn@spd.dsccc.com # Mark L. Ulferts mulferts@austin.dsccc.com # # @(#) $Id: messagebox.itk,v 1.6 2002/03/19 19:48:57 mgbacke Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Messagebox { keep -activebackground -activeforeground -background -borderwidth \ -cursor -highlightcolor -highlightthickness \ -jump -labelfont -textbackground -troughcolor } # ------------------------------------------------------------------ # MSGTYPE # ------------------------------------------------------------------ itcl::class iwidgets::MsgType { constructor {args} {eval configure $args} public variable background \#d9d9d9 public variable bell 0 public variable font -*-Courier-Medium-R-Normal--*-120-*-*-*-*-*-* public variable foreground Black public variable show 1 } # ------------------------------------------------------------------ # MESSAGEBOX # ------------------------------------------------------------------ itcl::class iwidgets::Messagebox { inherit itk::Widget constructor {args} {} destructor {} itk_option define -filename fileName FileName "" itk_option define -maxlines maxLines MaxLines 1000 itk_option define -savedir saveDir SaveDir "[pwd]" public { method clear {} method export {filename} method find {} method issue {string {type DEFAULT} args} method save {} method type {op tag args} } protected { variable _unique 0 variable _types {} variable _interior {} method _post {x y} } } # # Provide a lowercased access method for the Messagebox class. # proc ::iwidgets::messagebox {pathName args} { uplevel ::iwidgets::Messagebox $pathName $args } # # Use option database to override default resources of base classes. # option add *Messagebox.labelPos n widgetDefault option add *Messagebox.cursor top_left_arrow widgetDefault option add *Messagebox.height 0 widgetDefault option add *Messagebox.width 0 widgetDefault option add *Messagebox.visibleItems 80x24 widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Messagebox::constructor {args} { set _interior $itk_interior # # Create the text area. # itk_component add text { iwidgets::Scrolledtext $itk_interior.text -width 1 -height 1 \ -state disabled -wrap none } { keep -borderwidth -cursor -exportselection -highlightcolor \ -highlightthickness -padx -pady -relief -setgrid -spacing1 \ -spacing2 -spacing3 keep -activerelief -elementborderwidth -jump -troughcolor keep -hscrollmode -height -sbwidth -scrollmargin -textbackground \ -visibleitems -vscrollmode -width keep -labelbitmap -labelfont -labelimage -labelmargin \ -labelpos -labeltext -labelvariable } grid $itk_component(text) -row 0 -column 0 -sticky nsew grid rowconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 0 -weight 1 # # Setup right mouse button binding to post a user configurable # popup menu and diable the binding for left mouse clicks. # bind [$itk_component(text) component text] <ButtonPress-1> "break" bind [$itk_component(text) component text] \ <ButtonPress-3> [itcl::code $this _post %x %y] # # Create the small popup menu that can be configurable by users. # itk_component add itemMenu { menu $itk_component(hull).itemmenu -tearoff 0 } { keep -background -font -foreground \ -activebackground -activeforeground ignore -tearoff } # # Add clear and svae options to the popup menu. # $itk_component(itemMenu) add command -label "Find" \ -command [itcl::code $this find] $itk_component(itemMenu) add command -label "Save" \ -command [itcl::code $this save] $itk_component(itemMenu) add command -label "Clear" \ -command [itcl::code $this clear] # # Create a standard type to be used if no others are specified. # type add DEFAULT eval itk_initialize $args } # ------------------------------------------------------------------ # DESTURCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Messagebox::destructor {} { foreach type $_types { type remove $type } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD clear # # Clear the text area. # ------------------------------------------------------------------ itcl::body iwidgets::Messagebox::clear {} { $itk_component(text) configure -state normal $itk_component(text) delete 1.0 end $itk_component(text) configure -state disabled } # ------------------------------------------------------------------ # PUBLIC METHOD: type <op> <tag> <args> # # The type method supports several subcommands. Types can be added # removed and configured. All the subcommands use the MsgType class # to implement the functionaility. # ------------------------------------------------------------------ itcl::body iwidgets::Messagebox::type {op tag args} { switch $op { add { eval iwidgets::MsgType $this$tag $args lappend _types $tag $itk_component(text) tag configure $tag \ -font [$this$tag cget -font] \ -background [$this$tag cget -background] \ -foreground [$this$tag cget -foreground] return $tag } remove { if {[set index [lsearch $_types $tag]] != -1} { itcl::delete object $this$tag set _types [lreplace $_types $index $index] return } else { error "bad message type: \"$tag\", does not exist" } } configure { if {[set index [lsearch $_types $tag]] != -1} { set retVal [eval $this$tag configure $args] $itk_component(text) tag configure $tag \ -font [$this$tag cget -font] \ -background [$this$tag cget -background] \ -foreground [$this$tag cget -foreground] return $retVal } else { error "bad message type: \"$tag\", does not exist" } } cget { if {[set index [lsearch $_types $tag]] != -1} { return [eval $this$tag cget $args] } else { error "bad message type: \"$tag\", does not exist" } } default { error "bad type operation: \"$op\", should be add,\ remove, configure or cget" } } } # ------------------------------------------------------------------ # PUBLIC METHOD: issue string ?type? args # # Print the string out to the Messagebox. Check the options of the # message type to see if it should be displayed or if the bell # should be wrong. # ------------------------------------------------------------------ itcl::body iwidgets::Messagebox::issue {string {type DEFAULT} args} { if {[lsearch $_types $type] == -1} { error "bad message type: \"$type\", use the type\ command to create a new types" } # # If the type is currently configured to be displayed, then insert # it in the text widget, add the tag to the line and move the # vertical scroll bar to the bottom. # set tag $this$type if {[$tag cget -show]} { $itk_component(text) configure -state normal # # Find end of last message. # set prevend [$itk_component(text) index "end - 1 chars"] $itk_component(text) insert end "$string\n" $args $itk_component(text) tag add $type $prevend "end - 1 chars" $itk_component(text) yview end # # Sound a beep if the message type is configured such. # if {[$tag cget -bell]} { bell } # # If we reached our max lines limit, then remove enough lines to # get it back under. # set lineCount [lindex [split [$itk_component(text) index end] "."] 0] if { $lineCount > $itk_option(-maxlines) } { set numLines [expr {$lineCount - $itk_option(-maxlines) -1}] $itk_component(text) delete 1.0 $numLines.0 } $itk_component(text) configure -state disabled } } # ------------------------------------------------------------------ # PUBLIC METHOD: save # # Save contents of messages area to a file using a fileselectionbox. # ------------------------------------------------------------------ itcl::body iwidgets::Messagebox::save {} { set saveFile "" set filter "" set saveFile [tk_getSaveFile -title "Save Messages" \ -initialdir $itk_option(-savedir) \ -parent $itk_interior \ -initialfile $itk_option(-filename)] if { $saveFile != "" } { $itk_component(text) export $saveFile } } # ------------------------------------------------------------------ # PUBLIC METHOD: find # # Search the contents of messages area for a specific string. # ------------------------------------------------------------------ itcl::body iwidgets::Messagebox::find {} { if {! [info exists itk_component(findd)]} { itk_component add findd { iwidgets::Finddialog $itk_interior.findd \ -textwidget $itk_component(text) } } $itk_component(findd) center $itk_component(text) $itk_component(findd) activate } # ------------------------------------------------------------------ # PRIVATE METHOD: _post # # Used internally to post the popup menu at the coordinate (x,y) # relative to the widget. # ------------------------------------------------------------------ itcl::body iwidgets::Messagebox::_post {x y} { set rx [expr {[winfo rootx $itk_component(text)]+$x}] set ry [expr {[winfo rooty $itk_component(text)]+$y}] tk_popup $itk_component(itemMenu) $rx $ry } # ------------------------------------------------------------------ # METHOD export filename # # write text to a file (export filename) # ------------------------------------------------------------------ itcl::body iwidgets::Messagebox::export {filename} { $itk_component(text) export $filename } �����������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/messagedialog.itk������������������������������������������������������������0000644�0036047�0045461�00000012015�07334044000�016650� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Messagedialog # ---------------------------------------------------------------------- # Implements a message dialog composite widget. The Messagedialog is # derived from the Dialog class and is composed of an image and text # component. The image will accept both images as well as bitmaps. # The text can extend mutliple lines by embedding newlines. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: messagedialog.itk,v 1.3 2001/08/07 19:56:48 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Messagedialog { keep -background -cursor -font -foreground -modality keep -wraplength -justify } # ------------------------------------------------------------------ # MESSAGEDIALOG # ------------------------------------------------------------------ itcl::class iwidgets::Messagedialog { inherit iwidgets::Dialog constructor {args} {} itk_option define -imagepos imagePos Position w } # # Provide a lowercased access method for the Messagedialog class. # proc ::iwidgets::messagedialog {pathName args} { uplevel ::iwidgets::Messagedialog $pathName $args } # # Use option database to override default resources of base classes. # option add *Messagedialog.title "Message Dialog" widgetDefault option add *Messagedialog.master "." widgetDefault option add *Messagedialog.textPadX 20 widgetDefault option add *Messagedialog.textPadY 20 widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Messagedialog::constructor {args} { # # Create the image component which may be either a bitmap or image. # itk_component add image { label $itk_interior.image } { keep -background -bitmap -cursor -foreground -image } # # Create the text message component. The message may extend over # several lines by embedding '\n' characters. # itk_component add message { label $itk_interior.message } { keep -background -cursor -font -foreground -text keep -wraplength -justify rename -padx -textpadx textPadX Pad rename -pady -textpady textPadY Pad } # # Hide the apply and help buttons. # hide Apply hide Help # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -imagepos # # Specifies the image position relative to the message: n, s, # e, or w. The default is w. # ------------------------------------------------------------------ itcl::configbody iwidgets::Messagedialog::imagepos { switch $itk_option(-imagepos) { n { grid $itk_component(image) -row 0 -column 0 grid $itk_component(message) -row 1 -column 0 } s { grid $itk_component(message) -row 0 -column 0 grid $itk_component(image) -row 1 -column 0 } e { grid $itk_component(message) -row 0 -column 0 grid $itk_component(image) -row 0 -column 1 } w { grid $itk_component(image) -row 0 -column 0 grid $itk_component(message) -row 0 -column 1 } default { error "bad imagepos option \"$itk_option(-imagepos)\":\ should be n, e, s, or w" } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/notebook.itk�����������������������������������������������������������������0000644�0036047�0045461�00000073760�07336540173�015720� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Notebook Widget # ---------------------------------------------------------------------- # The Notebook command creates a new window (given by the pathName # argument) and makes it into a Notebook widget. Additional options, # described above may be specified on the command line or in the # option database to configure aspects of the Notebook such as its # colors, font, and text. The Notebook command returns its pathName # argument. At the time this command is invoked, there must not exist # a window named pathName, but path Name's parent must exist. # # A Notebook is a widget that contains a set of pages. It displays one # page from the set as the selected page. When a page is selected, the # page's contents are displayed in the page area. When first created a # Notebook has no pages. Pages may be added or deleted using widget commands # described below. # # A special option may be provided to the Notebook. The -auto option # specifies whether the Nptebook will automatically handle the unpacking # and packing of pages when pages are selected. A value of true signifies # that the notebook will automatically manage it. This is the default # value. A value of false signifies the notebook will not perform automatic # switching of pages. # # WISH LIST: # This section lists possible future enhancements. # # ---------------------------------------------------------------------- # AUTHOR: Bill W. Scott EMAIL: bscott@spd.dsccc.com # # @(#) $Id: notebook.itk,v 1.4 2001/08/15 18:33:31 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Default resources. # option add *Notebook.background #d9d9d9 widgetDefault option add *Notebook.auto true widgetDefault # # Usual options. # itk::usual Notebook { keep -background -cursor } # ------------------------------------------------------------------ # NOTEBOOK # ------------------------------------------------------------------ itcl::class iwidgets::Notebook { inherit itk::Widget constructor {args} {} itk_option define -background background Background #d9d9d9 itk_option define -auto auto Auto true itk_option define -scrollcommand scrollCommand ScrollCommand {} public method add { args } public method childsite { args } public method delete { args } public method index { args } public method insert { args } public method prev { } public method next { } public method pageconfigure { args } public method pagecget { index option } public method select { index } public method view { args } private method _childSites { } private method _scrollCommand { } private method _index { pathList index select} private method _createPage { args } private method _deletePages { fromPage toPage } private method _configurePages { args } private method _tabCommand { } private variable _currPage -1 ;# numerical index of current page selected private variable _pages {} ;# list of Page components private variable _uniqueID 0 ;# one-up number for unique page numbering } # # Provide a lowercase access method for the Notebook class # proc ::iwidgets::notebook {pathName args} { uplevel ::iwidgets::Notebook $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::constructor {args} { # # Create the outermost frame to maintain geometry. # itk_component add cs { frame $itk_interior.cs } { keep -cursor -background -width -height } pack $itk_component(cs) -fill both -expand yes pack propagate $itk_component(cs) no eval itk_initialize $args # force bg of all pages to reflect Notebook's background. _configurePages -background $itk_option(-background) } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION -background # # Sets the bg color of all the pages in the Notebook. # ------------------------------------------------------------------ itcl::configbody iwidgets::Notebook::background { if {$itk_option(-background) != {}} { _configurePages -background $itk_option(-background) } } # ------------------------------------------------------------------ # OPTION -auto # # Determines whether pages are automatically unpacked and # packed when pages get selected. # ------------------------------------------------------------------ itcl::configbody iwidgets::Notebook::auto { if {$itk_option(-auto) != {}} { } } # ------------------------------------------------------------------ # OPTION -scrollcommand # # Command string to be invoked when the notebook # has any changes to its current page, or number of pages. # # typically for scrollbars. # ------------------------------------------------------------------ itcl::configbody iwidgets::Notebook::scrollcommand { if {$itk_option(-scrollcommand) != {}} { _scrollCommand } } # ------------------------------------------------------------------ # METHOD: add add ?<option> <value>...? # # Creates a page and appends it to the list of pages. # processes pageconfigure for the page added. # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::add { args } { # The args list should be an even # of params, if not then # prob missing value for last item in args list. Signal error. set len [llength $args] if {$len % 2} { error "value for \"[lindex $args [expr {$len - 1}]]\" missing" } # add a Page component set pathName [eval _createPage $args] lappend _pages $pathName # update scroller _scrollCommand # return childsite for the Page component return [eval $pathName childsite] } # ------------------------------------------------------------------ # METHOD: childsite ?<index>? # # If index is supplied, returns the child site widget corresponding # to the page index. If called with no arguments, returns a list # of all child sites # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::childsite { args } { set len [llength $args] switch $len { 0 { # ... called with no arguments, return a list if { [llength $args] == 0 } { return [_childSites] } } 1 { set index [lindex $args 0] # ... otherwise, return child site for the index given # empty notebook if { $_pages == {} } { error "can't get childsite,\ no pages in the notebook \"$itk_component(hull)\"" } set index [_index $_pages $index $_currPage] # index out of range if { $index < 0 || $index >= [llength $_pages] } { error "bad Notebook page index in childsite method:\ should be between 0 and [expr {[llength $_pages] - 1}]" } set pathName [lindex $_pages $index] set cs [eval $pathName childsite] return $cs } default { # ... too many parameters passed error "wrong # args: should be\ \"$itk_component(hull) childsite ?index?\"" } } } # ------------------------------------------------------------------ # METHOD: delete <index1> ?<index2>? # # Deletes a page or range of pages from the notebook # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::delete { args } { # empty notebook if { $_pages == {} } { error "can't delete page, no pages in the notebook\ \"$itk_component(hull)\"" } set len [llength $args] switch -- $len { 1 { set fromPage [_index $_pages [lindex $args 0] $_currPage] if { $fromPage < 0 || $fromPage >= [llength $_pages] } { error "bad Notebook page index in delete method:\ should be between 0 and [expr {[llength $_pages] - 1}]" } set toPage $fromPage _deletePages $fromPage $toPage } 2 { set fromPage [_index $_pages [lindex $args 0] $_currPage] if { $fromPage < 0 || $fromPage >= [llength $_pages] } { error "bad Notebook page index1 in delete method:\ should be between 0 and [expr {[llength $_pages] - 1}]" } set toPage [_index $_pages [lindex $args 1] $_currPage] if { $toPage < 0 || $toPage >= [llength $_pages] } { error "bad Notebook page index2 in delete method:\ should be between 0 and [expr {[llength $_pages] - 1}]" error "bad Notebook page index2" } if { $fromPage > $toPage } { error "bad Notebook page index1 in delete method:\ index1 is greater than index2" } _deletePages $fromPage $toPage } default { # ... too few/many parameters passed error "wrong # args: should be\ \"$itk_component(hull) delete index1 ?index2?\"" } } } # ------------------------------------------------------------------ # METHOD: index <index> # # Given an index identifier returns the numeric index of the page # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::index { args } { if { [llength $args] != 1 } { error "wrong # args: should be\ \"$itk_component(hull) index index\"" } set index $args set number [_index $_pages $index $_currPage] return $number } # ------------------------------------------------------------------ # METHOD: insert <index> ?<option> <value>...? # # Inserts a page before a index. The before page may # be specified as a label or a page position. # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::insert { args } { # ... Error: no args passed set len [llength $args] if { $len == 0 } { error "wrong # args: should be\ \"$itk_component(hull) insert index ?option value?\"" } # ... set up index and args set index [lindex $args 0] set args [lrange $args 1 $len] # ... Error: unmatched option value pair (len is odd) # The args list should be an even # of params, if not then # prob missing value for last item in args list. Signal error. set len [llength $args] if { $len % 2 } { error "value for \"[lindex $args [expr {$len - 1}]]\" missing" } # ... Error: catch notebook empty if { $_pages == {} } { error "can't insert page, no pages in the notebook\ \"$itk_component(hull)\"" } # ok, get the page set page [_index $_pages $index $_currPage] # ... Error: catch bad value for before page. if { $page < 0 || $page >= [llength $_pages] } { error "bad Notebook page index in insert method:\ should be between 0 and [expr {[llength $_pages] - 1}]" } # ... Start the business of inserting # create the new page and get its path name... set pathName [eval _createPage $args] # grab the name of the page currently selected. (to keep in sync) set currPathName [lindex $_pages $_currPage] # insert pathName before $page set _pages [linsert $_pages $page $pathName] # keep the _currPage in sync with the insert. set _currPage [lsearch -exact $_pages $currPathName] # give scrollcommand chance to update _scrollCommand # give them child site back... return [eval $pathName childsite] } # ------------------------------------------------------------------ # METHOD: prev # # Selects the previous page. Wraps at first back to last page. # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::prev { } { # catch empty notebook if { $_pages == {} } { error "can't move to previous page,\ no pages in the notebook \"$itk_component(hull)\"" } # bump to the previous page and wrap if necessary set prev [expr {$_currPage - 1}] if { $prev < 0 } { set prev [expr {[llength $_pages] - 1}] } select $prev return $prev } # ------------------------------------------------------------------ # METHOD: next # # Selects the next page. Wraps at last back to first page. # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::next { } { # catch empty notebook if { $_pages == {} } { error "can't move to next page,\ no pages in the notebook \"$itk_component(hull)\"" } # bump to the next page and wrap if necessary set next [expr {$_currPage + 1}] if { $next >= [llength $_pages] } { set next 0 } select $next return $next } # ------------------------------------------------------------------ # METHOD: pageconfigure <index> ?<option> <value>...? # # Performs configure on a given page denoted by index. Index may # be a page number or a pattern matching the label associated with # a page. # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::pageconfigure { args } { # ... Error: no args passed set len [llength $args] if { $len == 0 } { error "wrong # args: should be\ \"$itk_component(hull) pageconfigure index ?option value?\"" } # ... set up index and args set index [lindex $args 0] set args [lrange $args 1 $len] set page [_index $_pages $index $_currPage] # ... Error: page out of range if { $page < 0 || $page >= [llength $_pages] } { error "bad Notebook page index in pageconfigure method:\ should be between 0 and [expr {[llength $_pages] - 1}]" } # Configure the page component set pathName [lindex $_pages $page] return [eval $pathName configure $args] } # ------------------------------------------------------------------ # METHOD: pagecget <index> <option> # # Performs cget on a given page denoted by index. Index may # be a page number or a pattern matching the label associated with # a page. # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::pagecget { index option } { set page [_index $_pages $index $_currPage] # ... Error: page out of range if { $page < 0 || $page >= [llength $_pages] } { error "bad Notebook page index in pagecget method:\ should be between 0 and [expr {[llength $_pages] - 1}]" } # Get the page info. set pathName [lindex $_pages $page] return [$pathName cget $option] } # ------------------------------------------------------------------ # METHOD: select <index> # # Select a page by index. Hide the last _currPage if it existed. # Then show the new one if it exists. Returns the currently # selected page or -1 if tried to do a select select when there is # no selection. # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::select { index } { global page$itk_component(hull) # ... Error: empty notebook if { $_pages == {} } { error "can't select page $index,\ no pages in the notebook \"$itk_component(hull)\"" } # if there is not current selection just ignore trying this selection if { $index == "select" && $_currPage == -1 } { return -1 } set reqPage [_index $_pages $index $_currPage] if { $reqPage < 0 || $reqPage >= [llength $_pages] } { error "bad Notebook page index in select method:\ should be between 0 and [expr {[llength $_pages] - 1}]" } # if we already have this page selected, then ignore selection. if { $reqPage == $_currPage } { return $_currPage } # if we are handling packing and unpacking the unpack if we can if { $itk_option(-auto) } { # if there is a current page packed, then unpack it if { $_currPage != -1 } { set currPathName [lindex $_pages $_currPage] pack forget $currPathName } } # set this now so that the -command cmd can do an 'index select' # to operate on this page. set _currPage $reqPage # invoke the command for this page set cmd [lindex [pageconfigure $index -command] 4] eval $cmd # give scrollcommand chance to update _scrollCommand # if we are handling packing and unpacking the pack if we can if { $itk_option(-auto) } { set reqPathName [lindex $_pages $reqPage] pack $reqPathName -anchor nw -fill both -expand yes } return $_currPage } # ------------------------------------------------------------------ # METHOD: view # # Return the current page # # view <index> # # Selects the page denoted by index to be current page # # view 'moveto' <fraction> # # Selects the page by using fraction amount # # view 'scroll' <num> <what> # # Selects the page by using num as indicator of next or previous # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::view { args } { set len [llength $args] switch -- $len { 0 { # Return current page return $_currPage } 1 { # Select by index select [lindex $args 0] } 2 { # Select using moveto set arg [lindex $args 0] if { $arg == "moveto" } { set fraction [lindex $args 1] if { [catch { set page \ [expr {round($fraction/(1.0/[llength $_pages]))}]}]} { error "expected floating-point number \ but got \"$fraction\"" } if { $page == [llength $_pages] } { incr page -1 } if { $page >= 0 && $page < [llength $_pages] } { select $page } } else { error "expected \"moveto\" but got $arg" } } 3 { # Select using scroll keyword set arg [lindex $args 0] if { $arg == "scroll" } { set amount [lindex $args 1] # check for integer value if { ! [regexp {^[-]*[0-9]*$} $amount] } { error "expected integer but got \"$amount\"" } set page [expr {$_currPage + $amount}] if { $page >= 0 && $page < [llength $_pages] } { select $page } } else { error "expected \"scroll\" but got $arg" } } default { set arg [lindex $args 0] if { $arg == "moveto" } { error "wrong # args: should be\ \"$itk_component(hull) view moveto fraction\"" } elseif { $arg == "scroll" } { error "wrong # args: should be\ \"$itk_component(hull) view scroll units|pages\"" } else { error "wrong # args: should be\ \"$itk_component(hull) view index\"" } } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _childSites # # Returns a list of child sites for all pages in the notebook. # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::_childSites { } { # empty notebook if { $_pages == {} } { error "can't get childsite list,\ no pages in the notebook \"$itk_component(hull)\"" } set csList {} foreach pathName $_pages { lappend csList [eval $pathName childsite] } return $csList } # ------------------------------------------------------------------ # PRIVATE METHOD: _scrollCommand # # If there is a -scrollcommand set up, then call the tcl command # and suffix onto it the standard 4 numbers scrollbars get. # # Invoke the scrollcommand, this is like the y/xscrollcommand # it is designed to talk to scrollbars and the the # tabset also knows how to obey scrollbar protocol. # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::_scrollCommand { } { if { $itk_option(-scrollcommand) != {} } { if { $_currPage != -1 } { set relTop [expr {($_currPage*1.0) / [llength $_pages]}] set relBottom [expr {(($_currPage+1)*1.0) / [llength $_pages]}] set scrollCommand "$itk_option(-scrollcommand) $relTop $relBottom" } else { set scrollCommand "$itk_option(-scrollcommand) 0 1" } uplevel #0 $scrollCommand } } # ------------------------------------------------------------------ # PRIVATE METHOD: _index # # pathList : list of path names to search thru if index is a label # index : either number, 'select', 'end', or pattern # select : current selection # # _index takes takes the value $index converts it to # a numeric identifier. If the value is not already # an integer it looks it up in the $pathList array. # If it fails it returns -1 # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::_index { pathList index select} { switch -- $index { select { set number $select } end { set number [expr {[llength $pathList] -1}] } default { # is it a number already? if { [regexp {^[0-9]+$} $index] } { set number $index if { $number < 0 || $number >= [llength $pathList] } { set number -1 } # otherwise it is a label } else { # look thru the pathList of pathNames and # get each label and compare with index. # if we get a match then set number to postion in $pathList # and break out. # otherwise number is still -1 set i 0 set number -1 foreach pathName $pathList { set label [lindex [$pathName configure -label] 4] if { [string match $label $index] } { set number $i break } incr i } } } } return $number } # ------------------------------------------------------------------ # PRIVATE METHOD: _createPage # # Creates a page, using unique page naming, propagates background # and keeps unique id up to date. # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::_createPage { args } { # # create an internal name for the page: .n.cs.page0, .n.cs.page1, etc. # set pathName $itk_component(cs).page$_uniqueID eval iwidgets::Page $pathName -background $itk_option(-background) $args incr _uniqueID return $pathName } # ------------------------------------------------------------------ # PRIVATE METHOD: _deletePages # # Deletes pages from $fromPage to $toPage. # # Operates in two passes, destroys all the widgets # Then removes the pathName from the page list # # Also keeps the current selection in bounds. # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::_deletePages { fromPage toPage } { for { set page $fromPage } { $page <= $toPage } { incr page } { # kill the widget set pathName [lindex $_pages $page] destroy $pathName } # physically remove the page set _pages [lreplace $_pages $fromPage $toPage] # If we deleted a selected page set our selection to none if { $_currPage >= $fromPage && $_currPage <= $toPage } { set _currPage -1 } # make sure _currPage stays in sync with new numbering... if { $_pages == {} } { # if deleted only remaining page, # reset current page to undefined set _currPage -1 # or if the current page was the last page, it needs come back } elseif { $_currPage >= [llength $_pages] } { incr _currPage -1 if { $_currPage < 0 } { # but only to zero set _currPage 0 } } # give scrollcommand chance to update _scrollCommand } # ------------------------------------------------------------------ # PRIVATE METHOD: _configurePages # # Does the pageconfigure method on each page in the notebook # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::_configurePages { args } { # make sure we have pages if { [catch {set _pages}] } { return } # go thru all pages and pageconfigure them. foreach pathName $_pages { eval "$pathName configure $args" } } # ------------------------------------------------------------------ # PRIVATE METHOD: _tabCommand # # Calls the command that was passed in through the # $itk_option(-tabcommand) argument. # # This method is up for debate... do we need the -tabcommand option? # ------------------------------------------------------------------ itcl::body iwidgets::Notebook::_tabCommand { } { global page$itk_component(hull) if { $itk_option(-tabcommand) != {} } { set newTabCmdStr $itk_option(-tabcommand) lappend newTabCmdStr [set page$itk_component(hull)] #eval $newTabCmdStr uplevel #0 $newTabCmdStr } } # # Page widget # ------------------------------------------------------------------ # # The Page command creates a new window (given by the pathName argument) # and makes it into a Page widget. Additional options, described above # may be specified on the com mand line or in the option database to # configure aspects of the Page such as its back ground, cursor, and # geometry. The Page command returns its pathName argument. At the time # this command is invoked, there must not exist a window named pathName, # but path Name's parent must exist. # # A Page is a frame that holds a child site. It is nothing more than a # frame widget with some intelligence built in. Its primary purpose is # to support the Notebook's concept of a page. It allows another widget # like the Notebook to treat a page as a single object. The Page has an # associated label and knows how to return its child site. # # ------------------------------------------------------------------ # AUTHOR: Bill W. Scott EMAIL: bscott@spd.dsccc.com # # ------------------------------------------------------------------ # Copyright (c) 1995 DSC Communications Corp. # ====================================================================== # Permission is hereby granted, without written agreement and without # license or royalty fees, to use, copy, modify, and distribute this # software and its documentation for any purpose, provided that the # above copyright notice and the following two paragraphs appear in # all copies of this software. # # IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES # ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN # IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH # DAMAGE. # # THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND # FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS # ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO # PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. # ====================================================================== # # Option database default resources: # option add *Page.disabledForeground #a3a3a3 widgetDefault option add *Page.label {} widgetDefault option add *Page.command {} widgetDefault itcl::class iwidgets::Page { inherit itk::Widget constructor {args} {} itk_option define \ -disabledforeground disabledForeground DisabledForeground #a3a3a3 itk_option define -label label Label {} itk_option define -command command Command {} public method childsite { } } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Page::constructor {args} { # # Create the outermost frame to maintain geometry. # itk_component add cs { frame $itk_interior.cs } { keep -cursor -background -width -height } pack $itk_component(cs) -fill both -expand yes pack propagate $itk_component(cs) no eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION -disabledforeground # # Sets the disabledForeground color of this page # ------------------------------------------------------------------ itcl::configbody iwidgets::Page::disabledforeground { } # ------------------------------------------------------------------ # OPTION -label # # Sets the label of this page. The label is a string identifier # for this page. # ------------------------------------------------------------------ itcl::configbody iwidgets::Page::label { } # ------------------------------------------------------------------ # OPTION -command # # The Tcl Command to associate with this page. # ------------------------------------------------------------------ itcl::configbody iwidgets::Page::command { } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Returns the child site widget of this page # ------------------------------------------------------------------ itcl::body iwidgets::Page::childsite { } { return $itk_component(cs) } ����������������iwidgets-4.1.0/generic/optionmenu.itk���������������������������������������������������������������0000644�0036047�0045461�00000053366�07366300426�016273� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Optionmenu # ---------------------------------------------------------------------- # Implements an option menu widget with options to manage it. # An option menu displays a frame containing a label and a button. # A pop-up menu will allow for the value of the button to change. # # ---------------------------------------------------------------------- # AUTHOR: Alfredo Jahn Phone: (214) 519-3545 # Email: ajahn@spd.dsccc.com # alfredo@wn.com # # @(#) $Id: optionmenu.itk,v 1.9 2001/10/26 15:28:22 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Default resources. # option add *Optionmenu.highlightThickness 1 widgetDefault option add *Optionmenu.borderWidth 2 widgetDefault option add *Optionmenu.labelPos w widgetDefault option add *Optionmenu.labelMargin 2 widgetDefault option add *Optionmenu.popupCursor arrow widgetDefault # # Usual options. # itk::usual Optionmenu { keep -activebackground -activeborderwidth -activeforeground \ -background -borderwidth -cursor -disabledforeground -font \ -foreground -highlightcolor -highlightthickness -labelfont \ -popupcursor } # ------------------------------------------------------------------ # OPTONMENU # ------------------------------------------------------------------ itcl::class iwidgets::Optionmenu { inherit iwidgets::Labeledwidget constructor {args} {} destructor {} itk_option define -clicktime clickTime ClickTime 150 itk_option define -command command Command {} itk_option define -cyclicon cyclicOn CyclicOn true itk_option define -width width Width 0 itk_option define -font font Font -Adobe-Helvetica-Bold-R-Normal--*-120-* itk_option define -borderwidth borderWidth BorderWidth 2 itk_option define -highlightthickness highlightThickness HighlightThickness 1 itk_option define -state state State normal public { method index {index} method delete {first {last {}}} method disable {index} method enable {args} method get {{first "current"} {last ""}} method insert {index string args} method popupMenu {args} method select {index} method sort {{mode "increasing"}} } protected { variable _calcSize "" ;# non-null => _calcSize pending } private { method _buttonRelease {time} method _getNextItem {index} method _next {} method _postMenu {time} method _previous {} method _setItem {item} method _setSize {{when later}} method _setitems {items} ;# Set the list of menu entries variable _postTime 0 variable _items {} ;# List of popup menu entries variable _numitems 0 ;# List of popup menu entries variable _currentItem "" ;# Active menu selection } } # # Provide a lowercased access method for the Optionmenu class. # proc ::iwidgets::optionmenu {pathName args} { uplevel ::iwidgets::Optionmenu $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::constructor {args} { global tcl_platform component hull configure -highlightthickness 0 itk_component add menuBtn { menubutton $itk_interior.menuBtn -relief raised -indicatoron on \ -textvariable [itcl::scope _currentItem] -takefocus 1 \ -menu $itk_interior.menuBtn.menu } { usual keep -borderwidth if {$tcl_platform(platform) != "unix"} { ignore -activebackground -activeforeground } } pack $itk_interior.menuBtn -fill x pack propagate $itk_interior no itk_component add popupMenu { menu $itk_interior.menuBtn.menu -tearoff no } { usual ignore -tearoff keep -activeborderwidth -borderwidth rename -cursor -popupcursor popupCursor Cursor } # # Bind to button release for all components. # bind $itk_component(menuBtn) <ButtonPress-1> \ "[itcl::code $this _postMenu %t]; break" bind $itk_component(menuBtn) <KeyPress-space> \ "[itcl::code $this _postMenu %t]; break" bind $itk_component(popupMenu) <ButtonRelease-1> \ [itcl::code $this _buttonRelease %t] # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::destructor {} { if {$_calcSize != ""} {after cancel $_calcSize} } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION -clicktime # # Interval time (in msec) used to determine that a single mouse # click has occurred. Used to post menu on a quick mouse click. # **WARNING** changing this value may cause the sigle-click # functionality to not work properly! # ------------------------------------------------------------------ itcl::configbody iwidgets::Optionmenu::clicktime {} # ------------------------------------------------------------------ # OPTION -command # # Specifies a command to be evaluated upon change in option menu. # ------------------------------------------------------------------ itcl::configbody iwidgets::Optionmenu::command {} # ------------------------------------------------------------------ # OPTION -cyclicon # # Turns on/off the 3rd mouse button capability. This feature # allows the right mouse button to cycle through the popup # menu list without poping it up. <shift>M3 cycles through # the menu in reverse order. # ------------------------------------------------------------------ itcl::configbody iwidgets::Optionmenu::cyclicon { if {$itk_option(-cyclicon)} { bind $itk_component(menuBtn) <3> [itcl::code $this _next] bind $itk_component(menuBtn) <Shift-3> [itcl::code $this _previous] bind $itk_component(menuBtn) <KeyPress-Down> [itcl::code $this _next] bind $itk_component(menuBtn) <KeyPress-Up> [itcl::code $this _previous] } else { bind $itk_component(menuBtn) <3> break bind $itk_component(menuBtn) <Shift-3> break bind $itk_component(menuBtn) <KeyPress-Down> break bind $itk_component(menuBtn) <KeyPress-Up> break } } # ------------------------------------------------------------------ # OPTION -width # # Allows the menu label width to be set to a fixed size # ------------------------------------------------------------------ itcl::configbody iwidgets::Optionmenu::width { _setSize } # ------------------------------------------------------------------ # OPTION -font # # Change all fonts for this widget. Also re-calculate height based # on font size (used to line up menu items over menu button label). # ------------------------------------------------------------------ itcl::configbody iwidgets::Optionmenu::font { _setSize } # ------------------------------------------------------------------ # OPTION -borderwidth # # Change borderwidth for this widget. Also re-calculate height based # on font size (used to line up menu items over menu button label). # ------------------------------------------------------------------ itcl::configbody iwidgets::Optionmenu::borderwidth { _setSize } # ------------------------------------------------------------------ # OPTION -highlightthickness # # Change highlightthickness for this widget. Also re-calculate # height based on font size (used to line up menu items over # menu button label). # ------------------------------------------------------------------ itcl::configbody iwidgets::Optionmenu::highlightthickness { _setSize } # ------------------------------------------------------------------ # OPTION -state # # Specified one of two states for the Optionmenu: normal, or # disabled. If the Optionmenu is disabled, then option menu # selection is ignored. # ------------------------------------------------------------------ itcl::configbody iwidgets::Optionmenu::state { switch $itk_option(-state) { normal { $itk_component(menuBtn) config -state normal $itk_component(label) config -fg $itk_option(-foreground) } disabled { $itk_component(menuBtn) config -state disabled $itk_component(label) config -fg $itk_option(-disabledforeground) } default { error "bad state option \"$itk_option(-state)\":\ should be disabled or normal" } } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: index index # # Return the numerical index corresponding to index. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::index {index} { if {[regexp {(^[0-9]+$)} $index]} { set idx [$itk_component(popupMenu) index $index] if {$idx == "none"} { return 0 } return [expr {$index > $idx ? $_numitems : $idx}] } elseif {$index == "end"} { return [expr {$_numitems - 1}] } elseif {$index == "select"} { return [lsearch $_items $_currentItem] } set numValue [lsearch -glob $_items $index] if {$numValue == -1} { error "bad Optionmenu index \"$index\"" } return $numValue } # ------------------------------------------------------------------ # METHOD: delete first ?last? # # Remove an item (or range of items) from the popup menu. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::delete {first {last {}}} { set first [index $first] set last [expr {$last != {} ? [index $last] : $first}] set nextAvail $_currentItem # # If current item is in delete range point to next available. # if {$_numitems > 1 && ([lsearch -exact [lrange $_items $first $last] [get]] != -1)} { set nextAvail [_getNextItem $last] } _setitems [lreplace $_items $first $last] # # Make sure "nextAvail" is still in the list. # set index [lsearch -exact $_items $nextAvail] _setItem [expr {$index != -1 ? $nextAvail : ""}] } # ------------------------------------------------------------------ # METHOD: disable index # # Disable a menu item in the option menu. This will prevent the user # from being able to select this item from the menu. This only effects # the state of the item in the menu, in other words, should the item # be the currently selected item, the user is responsible for # determining this condition and taking appropriate action. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::disable {index} { set index [index $index] $itk_component(popupMenu) entryconfigure $index -state disabled } # ------------------------------------------------------------------ # METHOD: enable index # # Enable a menu item in the option menu. This will allow the user # to select this item from the menu. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::enable {index} { set index [index $index] $itk_component(popupMenu) entryconfigure $index -state normal } # ------------------------------------------------------------------ # METHOD: get # # Returns the current menu item. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::get {{first "current"} {last ""}} { if {"current" == $first} { return $_currentItem } set first [index $first] if {"" == $last} { return [$itk_component(popupMenu) entrycget $first -label] } if {"end" == $last} { set last [$itk_component(popupMenu) index end] } else { set last [index $last] } set rval "" while {$first <= $last} { lappend rval [$itk_component(popupMenu) entrycget $first -label] incr first } return $rval } # ------------------------------------------------------------------ # METHOD: insert index string ?string? # # Insert an item in the popup menu. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::insert {index string args} { if {$index == "end"} { set index $_numitems } else { set index [index $index] } set args [linsert $args 0 $string] _setitems [eval linsert {$_items} $index $args] return "" } # ------------------------------------------------------------------ # METHOD: select index # # Select an item from the popup menu to display on the menu label # button. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::select {index} { set index [index $index] if {$index > ($_numitems - 1)} { incr index -1 } _setItem [lindex $_items $index] } # ------------------------------------------------------------------ # METHOD: popupMenu # # Evaluates the specified args against the popup menu component # and returns the result. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::popupMenu {args} { return [eval $itk_component(popupMenu) $args] } # ------------------------------------------------------------------ # METHOD: sort mode # # Sort the current menu in either "ascending" or "descending" order. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::sort {{mode "increasing"}} { switch $mode { ascending - increasing { _setitems [lsort -increasing $_items] } descending - decreasing { _setitems [lsort -decreasing $_items] } default { error "bad sort argument \"$mode\": should be ascending,\ descending, increasing, or decreasing" } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _buttonRelease # # Display the popup menu. Menu position is calculated. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::_buttonRelease {time} { if {(abs([expr $_postTime - $time])) <= $itk_option(-clicktime)} { return -code break } } # ------------------------------------------------------------------ # PRIVATE METHOD: _getNextItem index # # Allows either a string or index number to be passed in, and returns # the next item in the list in string format. Wrap around is automatic. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::_getNextItem {index} { if {[incr index] >= $_numitems} { set index 0 ;# wrap around } return [lindex $_items $index] } # ------------------------------------------------------------------ # PRIVATE METHOD: _next # # Sets the current option label to next item in list if that item is # not disbaled. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::_next {} { if {$itk_option(-state) != "normal"} { return } set i [lsearch -exact $_items $_currentItem] for {set cnt 0} {$cnt < $_numitems} {incr cnt} { if {[incr i] >= $_numitems} { set i 0 } if {[$itk_component(popupMenu) entrycget $i -state] != "disabled"} { _setItem [lindex $_items $i] break } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _previous # # Sets the current option label to previous item in list if that # item is not disbaled. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::_previous {} { if {$itk_option(-state) != "normal"} { return } set i [lsearch -exact $_items $_currentItem] for {set cnt 0} {$cnt < $_numitems} {incr cnt} { set i [expr {$i - 1}] if {$i < 0} { set i [expr {$_numitems - 1}] } if {[$itk_component(popupMenu) entrycget $i -state] != "disabled"} { _setItem [lindex $_items $i] break } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _postMenu time # # Display the popup menu. Menu position is calculated. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::_postMenu {time} { # # Don't bother to post if menu is empty. # if {[llength $_items] > 0 && $itk_option(-state) == "normal"} { set _postTime $time set itemIndex [lsearch -exact $_items $_currentItem] set margin [expr {$itk_option(-borderwidth) \ + $itk_option(-highlightthickness)}] set x [expr {[winfo rootx $itk_component(menuBtn)] + $margin}] set y [expr {[winfo rooty $itk_component(menuBtn)] \ - [$itk_component(popupMenu) yposition $itemIndex] + $margin}] tk_popup $itk_component(popupMenu) $x $y } } # ------------------------------------------------------------------ # PRIVATE METHOD: _setItem # # Set the menu button label to item, then dismiss the popup menu. # Also check if item has been changed. If so, also call user-supplied # command. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::_setItem {item} { if {$_currentItem != $item} { set _currentItem $item if {[winfo ismapped $itk_component(hull)]} { uplevel #0 $itk_option(-command) } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _setitems items # # Create a list of items available on the menu. Used to create the # popup menu. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::_setitems {items_} { # # Delete the old menu entries, and set the new list of # menu entries to those specified in "items_". # $itk_component(popupMenu) delete 0 last set _items "" set _numitems [llength $items_] # # Clear the menu button label. # if {$_numitems == 0} { _setItem "" return } set savedCurrentItem $_currentItem foreach opt $items_ { lappend _items $opt $itk_component(popupMenu) add command -label $opt \ -command [itcl::code $this _setItem $opt] } set first [lindex $_items 0] # # Make sure "savedCurrentItem" is still in the list. # if {$first != ""} { set i [lsearch -exact $_items $savedCurrentItem] #------------------------------------------------------------- # BEGIN BUG FIX: csmith (Chad Smith: csmith@adc.com), 11/18/99 #------------------------------------------------------------- # The previous code fragment: # <select [expr {$i != -1 ? $savedCurrentItem : $first}]> # is faulty because of exponential numbers. For example, # 2e-4 is numerically equal to 2e-04, but the string representation # is of course different. As a result, the select invocation # fails, and an error message is printed. #------------------------------------------------------------- if {$i != -1} { select $savedCurrentItem } else { select $first } #------------------------------------------------------------- # END BUG FIX #------------------------------------------------------------- } else { _setItem "" } _setSize } # ------------------------------------------------------------------ # PRIVATE METHOD: _setSize ?when? # # Set the size of the option menu. If "when" is "now", the change # is applied immediately. If it is "later" or it is not specified, # then the change is applied later, when the application is idle. # ------------------------------------------------------------------ itcl::body iwidgets::Optionmenu::_setSize {{when later}} { if {$when == "later"} { if {$_calcSize == ""} { set _calcSize [after idle [itcl::code $this _setSize now]] } return } set margin [expr {2*($itk_option(-borderwidth) \ + $itk_option(-highlightthickness))}] if {"0" != $itk_option(-width)} { set width $itk_option(-width) } else { set width [expr {[winfo reqwidth $itk_component(popupMenu)]+$margin+20}] } set height [winfo reqheight $itk_component(menuBtn)] $itk_component(lwchildsite) configure -width $width -height $height set _calcSize "" } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/pane.itk���������������������������������������������������������������������0000644�0036047�0045461�00000011173�07334044000�014773� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Paned # ---------------------------------------------------------------------- # Implements a pane for a paned window widget. The pane is itself a # frame with a child site for other widgets. The pane class performs # basic option management. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: pane.itk,v 1.3 2001/08/07 19:56:48 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Pane { keep -background -cursor } # ------------------------------------------------------------------ # PANE # ------------------------------------------------------------------ itcl::class iwidgets::Pane { inherit itk::Widget constructor {args} {} itk_option define -minimum minimum Minimum 10 itk_option define -margin margin Margin 8 public method childSite {} {} } # # Provide a lowercased access method for the Pane class. # proc ::iwidgets::pane {pathName args} { uplevel ::iwidgets::Pane $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Pane::constructor {args} { # # Create the pane childsite. # itk_component add childsite { frame $itk_interior.childsite } { keep -background -cursor } pack $itk_component(childsite) -fill both -expand yes # # Set the itk_interior variable to be the childsite for derived # classes. # set itk_interior $itk_component(childsite) eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -minimum # # Specifies the minimum size that the pane may reach. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pane::minimum { set pixels \ [winfo pixels $itk_component(hull) $itk_option(-minimum)] set itk_option(-minimum) $pixels } # ------------------------------------------------------------------ # OPTION: -margin # # Specifies the border distance between the pane and pane contents. # This is done by setting the borderwidth of the pane to the margin. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pane::margin { set pixels [winfo pixels $itk_component(hull) $itk_option(-margin)] set itk_option(-margin) $pixels $itk_component(childsite) configure \ -borderwidth $itk_option(-margin) } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childSite # # Return the pane child site path name. # ------------------------------------------------------------------ itcl::body iwidgets::Pane::childSite {} { return $itk_component(childsite) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/panedwindow.itk��������������������������������������������������������������0000644�0036047�0045461�00000075070�07345711156�016414� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Panedwindow # ---------------------------------------------------------------------- # Implements a multiple paned window widget capable of orienting the panes # either vertically or horizontally. Each pane is itself a frame acting # as a child site for other widgets. The border separating each pane # contains a sash which allows user positioning of the panes relative to # one another. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: panedwindow.itk,v 1.7 2001/09/06 15:12:46 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Panedwindow { keep -background -cursor -sashcursor } # ------------------------------------------------------------------ # PANEDWINDOW # ------------------------------------------------------------------ itcl::class iwidgets::Panedwindow { inherit itk::Widget constructor {args} {} itk_option define -orient orient Orient horizontal itk_option define -sashborderwidth sashBorderWidth SashBorderWidth 2 itk_option define -sashcursor sashCursor SashCursor crosshair itk_option define -sashwidth sashWidth SashWidth 10 itk_option define -sashheight sashHeight SashHeight 10 itk_option define -thickness thickness Thickness 3 itk_option define -sashindent sashIndent SashIndent -10 itk_option define -showhandle showHandle ShowHandle 1 public method index {index} public method childsite {args} public method fraction {args} public method add {tag args} public method insert {index tag args} public method delete {index} public method hide {index} public method show {index} public method paneconfigure {index args} public method reset {} protected method _pwConfigureEventHandler {width height} protected method _startGrip {where num} protected method _endGrip {where num} protected method _configGrip {where num} protected method _handleGrip {where num} protected method _moveSash {where num} private method _setFracArray {} private method _setActivePanes {} private method _calcFraction {where num} private method _makeSashes {} private method _placeSash {i} private method _placePanes {{start 0} {end end}} private variable _initialized 0 ;# Denotes initialized state. private variable _panes {} ;# List of panes. private variable _activePanes {} ;# List of active panes. private variable _sashes {} ;# List of sashes. private variable _separators {} ;# List of separators. private variable _frac ;# Array of fraction percentages. private variable _lowerlimit ;# Margin distance above/left of sash. private variable _upperlimit ;# Margin distance below/right of sash. private variable _dimension ;# Width/Height at start of drag. private variable _sashloc ;# Array of dist of sash from above/left. private variable _pixels ;# Array of dist of sash from above/left. private variable _minheight ;# Array of min heights for panes. private variable _minsashmoved ;# Lowest sash moved during dragging. private variable _maxsashmoved ;# Highest sash moved during dragging. private variable _dragging 0 ;# Boolean for dragging enabled. private variable _movecount 0 ;# Kludge counter to get sashes to ;# display without calling update ;# idletasks too often. private variable _width 0 ;# hull's width. private variable _height 0 ;# hull's height. private variable _unique -1 ;# Unique number for pane names. private variable _relief ;# relief for -showhandle } # # Provide a lowercased access method for the Panedwindow class. # proc ::iwidgets::panedwindow {pathName args} { uplevel ::iwidgets::Panedwindow $pathName $args } # # Use option database to override default resources of base classes. # option add *Panedwindow.width 10 widgetDefault option add *Panedwindow.height 10 widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::constructor {args} { itk_option add hull.width hull.height pack propagate $itk_component(hull) no # # Add binding for the configure event. # bind pw-config-$this <Configure> [itcl::code $this _pwConfigureEventHandler %w %h] bindtags $itk_component(hull) \ [linsert [bindtags $itk_component(hull)] 0 pw-config-$this] array set _relief {0 sunken 1 raised} eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -orient # # Specifies the orientation of the sashes. Once the paned window # has been mapped, set the sash bindings and place the panes. # ------------------------------------------------------------------ itcl::configbody iwidgets::Panedwindow::orient { if {$_initialized} { switch $itk_option(-orient) { vertical { for {set i 1} {$i < [llength $_activePanes]} {incr i} { bind $itk_component(sash$i) <Button-1> \ [itcl::code $this _startGrip %x $i] bind $itk_component(sash$i) <B1-Motion> \ [itcl::code $this _handleGrip %x $i] bind $itk_component(sash$i) <B1-ButtonRelease-1> \ [itcl::code $this _endGrip %x $i] bind $itk_component(sash$i) <Configure> \ [itcl::code $this _configGrip %x $i] } _setFracArray _makeSashes _placePanes } horizontal { for {set i 1} {$i < [llength $_activePanes]} {incr i} { bind $itk_component(sash$i) <Button-1> \ [itcl::code $this _startGrip %y $i] bind $itk_component(sash$i) <B1-Motion> \ [itcl::code $this _handleGrip %y $i] bind $itk_component(sash$i) <B1-ButtonRelease-1> \ [itcl::code $this _endGrip %y $i] bind $itk_component(sash$i) <Configure> \ [itcl::code $this _configGrip %y $i] } _setFracArray _makeSashes _placePanes } default { error "bad orientation option \"$itk_option(-orient)\":\ should be horizontal or vertical" } } } } # ------------------------------------------------------------------ # OPTION: -sashborderwidth # # Specifies a non-negative value indicating the width of the 3-D # border to draw around the outside of the sash. # ------------------------------------------------------------------ itcl::configbody iwidgets::Panedwindow::sashborderwidth { set pixels [winfo pixels $itk_component(hull) \ $itk_option(-sashborderwidth)] set itk_option(-sashborderwidth) $pixels if {$_initialized} { for {set i 1} {$i < [llength $_activePanes]} {incr i} { $itk_component(sash$i) configure \ -borderwidth $itk_option(-sashborderwidth) } } } # ------------------------------------------------------------------ # OPTION: -sashcursor # # Specifies the type of cursor to be used when over the sash. # ------------------------------------------------------------------ itcl::configbody iwidgets::Panedwindow::sashcursor { if {$_initialized} { for {set i 1} {$i < [llength $_activePanes]} {incr i} { $itk_component(sash$i) configure -cursor $itk_option(-sashcursor) } } } # ------------------------------------------------------------------ # OPTION: -sashwidth # # Specifies the width of the sash. # ------------------------------------------------------------------ itcl::configbody iwidgets::Panedwindow::sashwidth { set pixels [winfo pixels $itk_component(hull) \ $itk_option(-sashwidth)] set itk_option(-sashwidth) $pixels if {$_initialized} { for {set i 1} {$i < [llength $_activePanes]} {incr i} { $itk_component(sash$i) configure \ -width $itk_option(-sashwidth) } } } # ------------------------------------------------------------------ # OPTION: -sashheight # # Specifies the height of the sash, # ------------------------------------------------------------------ itcl::configbody iwidgets::Panedwindow::sashheight { set pixels [winfo pixels $itk_component(hull) \ $itk_option(-sashheight)] set itk_option(-sashheight) $pixels if {$_initialized} { for {set i 1} {$i < [llength $_activePanes]} {incr i} { $itk_component(sash$i) configure \ -height $itk_option(-sashheight) } } } # ------------------------------------------------------------------ # OPTION: -showhandle # # Specifies whether or not to show the sash handle. If not, then the # whole separator becomes the handle. Valid values are 0 or 1. # ------------------------------------------------------------------ itcl::configbody iwidgets::Panedwindow::showhandle { switch $itk_option(-showhandle) { 0 - 1 { # Update the sashes. _makeSashes _placePanes } default { error "Invalid option for -showhandle: $itk_option(-showhandle).\ Must be 1 or 0." } } } # ------------------------------------------------------------------ # OPTION: -thickness # # Specifies the thickness of the separators. It sets the width and # height of the separator to the thickness value and the borderwidth # to half the thickness. # ------------------------------------------------------------------ itcl::configbody iwidgets::Panedwindow::thickness { set pixels [winfo pixels $itk_component(hull) \ $itk_option(-thickness)] set itk_option(-thickness) $pixels if {$_initialized} { for {set i 1} {$i < [llength $_activePanes]} {incr i} { $itk_component(separator$i) configure \ -height $itk_option(-thickness) $itk_component(separator$i) configure \ -width $itk_option(-thickness) $itk_component(separator$i) configure \ -borderwidth [expr {$itk_option(-thickness) / 2}] } for {set i 1} {$i < [llength $_activePanes]} {incr i} { _placeSash $i } } } # ------------------------------------------------------------------ # OPTION: -sashindent # # Specifies the placement of the sash along the panes. A positive # value causes the sash to be offset from the near (left/top) side # of the pane, and a negative value causes the sash to be offset from # the far (right/bottom) side. If the offset is greater than the # width, then the sash is placed flush against the side. # ------------------------------------------------------------------ itcl::configbody iwidgets::Panedwindow::sashindent { set pixels [winfo pixels $itk_component(hull) \ $itk_option(-sashindent)] set itk_option(-sashindent) $pixels if {$_initialized} { for {set i 1} {$i < [llength $_activePanes]} {incr i} { _placeSash $i } } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: index index # # Searches the panes in the paned window for the one with the # requested tag, numerical index, or keyword "end". Returns the pane's # numerical index if found, otherwise error. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::index {index} { if {[llength $_panes] > 0} { if {[regexp {(^[0-9]+$)} $index]} { if {$index < [llength $_panes]} { return $index } else { error "Panedwindow index \"$index\" is out of range" } } elseif {$index == "end"} { return [expr {[llength $_panes] - 1}] } else { if {[set idx [lsearch $_panes $index]] != -1} { return $idx } error "bad Panedwindow index \"$index\": must be number, end,\ or pattern" } } else { error "Panedwindow \"$itk_component(hull)\" has no panes" } } # ------------------------------------------------------------------ # METHOD: childsite ?index? # # Given an index return the specifc childsite path name. Invoked # without an index return a list of all the child site panes. The # list is ordered from the near side (left/top). # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::childsite {args} { if {! $_initialized} { set _initialized 1 reset } if {[llength $args] == 0} { set children {} foreach pane $_panes { lappend children [$itk_component($pane) childSite] } return $children } else { set index [index [lindex $args 0]] return [$itk_component([lindex $_panes $index]) childSite] } } # ------------------------------------------------------------------ # METHOD: fraction percentage percentage ?percentage ...? # # Sets the visible percentage of the panes. Specifies a list of # percentages which are applied to the currently visible panes from # the near side (left/top). The number of percentages must be equal # to the current number of visible (mapped) panes and add up to 100. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::fraction {args} { #set args [linsert $args 0 $percentage1 $percentage2] if {[llength $args] == [llength $_activePanes]} { set sum 0 for {set i 0} {$i < [llength $args]} {incr i} { set sum [expr {$sum + [lindex $args $i]}] } if {$sum == 100} { set perc 0.0 for {set i 0} {$i < [llength $_activePanes]} {incr i} { set _frac($i) $perc set perc [expr {$perc + [expr {[lindex $args $i] / 100.0}]}] } set _frac($i) 1.0 if {[winfo ismapped $itk_component(hull)]} { _placePanes } } else { error "bad fraction arguments \"$args\": they should add\ up to 100" } } elseif {[llength $args] == 0} { for {set i 0; set j 1} {$j < [llength $_activePanes]} {incr i; incr j} { lappend _ret [expr {round(($_frac($j) - $_frac($i))*100)}] } lappend _ret [eval expr {100 - ([join $_ret +])}] return $_ret } else { error "wrong # args: should be \"$itk_component(hull)\ fraction percentage percentage ?percentage ...?\",\ where the number of percentages is\ [llength $_activePanes] and equal 100 or \"$itk_component(hull) fraction\" which will return a list of the current percentages" } } # ------------------------------------------------------------------ # METHOD: add tag ?option value option value ...? # # Add a new pane to the paned window to the far (right/bottom) side. # The method takes additional options which are passed on to the # pane constructor. These include -margin, and -minimum. The path # of the pane is returned. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::add {tag args} { # # Create panes. # itk_component add $tag { eval iwidgets::Pane $itk_interior.pane[incr _unique] $args } { keep -background -cursor } lappend _panes $tag lappend _activePanes $tag reset return $itk_component($tag) } # ------------------------------------------------------------------ # METHOD: insert index tag ?option value option value ...? # # Insert the specified pane in the paned window just before the one # given by index. Any additional options which are passed on to the # pane constructor. These include -margin, -minimum. The path of # the pane is returned. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::insert {index tag args} { # # Create panes. # itk_component add $tag { eval iwidgets::Pane $itk_interior.pane[incr _unique] $args } { keep -background -cursor } set index [index $index] set _panes [linsert $_panes $index $tag] lappend _activePanes $tag reset return $itk_component($tag) } # ------------------------------------------------------------------ # METHOD: delete index # # Delete the specified pane. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::delete {index} { set index [index $index] set tag [lindex $_panes $index] destroy $itk_component($tag) set _panes [lreplace $_panes $index $index] reset } # ------------------------------------------------------------------ # METHOD: hide index # # Remove the specified pane from the paned window. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::hide {index} { set index [index $index] set tag [lindex $_panes $index] if {[set idx [lsearch -exact $_activePanes $tag]] != -1} { set _activePanes [lreplace $_activePanes $idx $idx] } reset } # ------------------------------------------------------------------ # METHOD: show index # # Display the specified pane in the paned window. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::show {index} { set index [index $index] set tag [lindex $_panes $index] if {[lsearch -exact $_activePanes $tag] == -1} { lappend _activePanes $tag } reset } # ------------------------------------------------------------------ # METHOD: paneconfigure index ?option? ?value option value ...? # # Configure a specified pane. This method allows configuration of # panes from the Panedwindow level. The options may have any of the # values accepted by the add method. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::paneconfigure {index args} { set index [index $index] set tag [lindex $_panes $index] return [uplevel $itk_component($tag) configure $args] } # ------------------------------------------------------------------ # METHOD: reset # # Redisplay the panes based on the default percentages of the panes. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::reset {} { if {$_initialized && [llength $_panes]} { _setActivePanes _setFracArray _makeSashes _placePanes } } # ------------------------------------------------------------------ # PROTECTED METHOD: _pwConfigureEventHandler # # Performs operations necessary following a configure event. This # includes placing the panes. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::_pwConfigureEventHandler {width height} { set _width $width set _height $height if {$_initialized} { _placePanes } else { set _initialized 1 reset } } # ------------------------------------------------------------------ # PROTECTED METHOD: _startGrip where num # # Starts the sash drag and drop operation. At the start of the drag # operation all the information is known as for the upper and lower # limits for sash movement. The calculation is made at this time and # stored in protected variables for later access during the drag # handling routines. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::_startGrip {where num} { if {$itk_option(-orient) == "horizontal"} { set _dimension $_height } else { set _dimension $_width } set _minsashmoved $num set _maxsashmoved $num set totMinHeight 0 set cnt [llength $_activePanes] set _sashloc(0) 0 set _pixels($cnt) [expr {int($_dimension)}] for {set i 0} {$i < $cnt} {incr i} { set _pixels($i) [expr {int($_frac($i) * $_dimension)}] set margaft [$itk_component([lindex $_activePanes $i]) cget -margin] set minaft [$itk_component([lindex $_activePanes $i]) cget -minimum] set _minheight($i) [expr {$minaft + (2 * $margaft)}] incr totMinHeight $_minheight($i) } set _dragging [expr {$_dimension > $totMinHeight}] grab $itk_component(sash$num) raise $itk_component(separator$num) raise $itk_component(sash$num) $itk_component(sash$num) configure -relief sunken } # ------------------------------------------------------------------ # PROTECTED METHOD: _endGrip where num # # Ends the sash drag and drop operation. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::_endGrip {where num} { $itk_component(sash$num) configure -relief $_relief($itk_option(-showhandle)) grab release $itk_component(sash$num) if {$_dragging} { _calcFraction [expr {$_sashloc($num) + $where}] $num _placePanes [expr {$_minsashmoved - 1}] $_maxsashmoved set _dragging 0 } } # ------------------------------------------------------------------ # PROTECTED METHOD: _configGrip where num # # Configure action for sash. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::_configGrip {where num} { set _sashloc($num) $where } # ------------------------------------------------------------------ # PROTECTED METHOD: _handleGrip where num # # Motion action for sash. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::_handleGrip {where num} { if {$_dragging} { _moveSash [expr {$where + $_sashloc($num)}] $num incr _movecount if {$_movecount>4} { set _movecount 0 update idletasks } } } # ------------------------------------------------------------------ # PROTECTED METHOD: _moveSash where num # # Move the sash to the absolute pixel location # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::_moveSash {where num} { set _minsashmoved [expr {($_minsashmoved<$num)?$_minsashmoved:$num}] set _maxsashmoved [expr {($_maxsashmoved>$num)?$_maxsashmoved:$num}] set oldfrac $_frac($num) _calcFraction $where $num if {$_frac($num)!=$oldfrac} { _placeSash $num } } # ------------------------------------------------------------------ # PRIVATE METHOD: _setFracArray # # Calculates the percentages for the fraction array which lists the # percentages for each pane. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::_setFracArray {} { set perc 0.0 if {[llength $_activePanes] != 0} { set percIncr [expr {1.0 / [llength $_activePanes]}] } for {set i 0} {$i < [llength $_activePanes]} {incr i} { set _frac($i) $perc set perc [expr {$perc + $percIncr}] } set _frac($i) 1.0 } # ------------------------------------------------------------------ # PRIVATE METHOD: _setActivePanes # # Resets the active pane list. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::_setActivePanes {} { set _prevActivePanes $_activePanes set _activePanes {} foreach pane $_panes { if {[lsearch -exact $_prevActivePanes $pane] != -1} { lappend _activePanes $pane } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _calcFraction where num # # Determines the fraction for the sash. Make sure the fraction does # not go past the minimum for the pane on each side of the separator. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::_calcFraction {where num} { set numi [expr {$num + 1}] set numd [expr {$num - 1}] set _lowerlimit [expr {$_pixels($numd) + $_minheight($numd)}] set _upperlimit [expr {$_pixels($numi) - $_minheight($num)}] set dir [expr {$where - $_pixels($num)}] if {$where < $_lowerlimit && $dir <= 0} { if {$num == 1} { set _pixels($num) $_lowerlimit } { _moveSash [expr {$where - $_minheight($numd)}] $numd set _pixels($num) [expr {$_pixels($numd) + $_minheight($numd)}] } } elseif {$where > $_upperlimit && $dir >= 0} { if {$numi == [llength $_activePanes]} { set _pixels($num) $_upperlimit } { _moveSash [expr {$where + $_minheight($num)}] $numi set _pixels($num) \ [expr {$_pixels($numi) - $_minheight($num)}] } } else { set _pixels($num) $where } set _frac($num) [expr $_pixels($num).0 / $_dimension] } # ------------------------------------------------------------------ # PRIVATE METHOD: _makeSashes # # Removes any previous sashes and separators and creates new one. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::_makeSashes {} { # # Remove any existing sashes and separators. # foreach sash $_sashes { destroy $itk_component($sash) } foreach separator $_separators { destroy $itk_component($separator) } set _sashes {} set _separators {} # # Create one less separator and sash than the number of panes. # for {set id 1} {$id < [llength $_activePanes]} {incr id} { itk_component add sash$id { frame $itk_interior.sash$id -relief $_relief($itk_option(-showhandle)) \ -borderwidth $itk_option(-sashborderwidth) \ -cursor $itk_option(-sashcursor) \ -width $itk_option(-sashwidth) \ -height $itk_option(-sashheight) } { keep -background } lappend _sashes sash$id switch $itk_option(-orient) { vertical { bind $itk_component(sash$id) <Button-1> \ [itcl::code $this _startGrip %x $id] bind $itk_component(sash$id) <B1-Motion> \ [itcl::code $this _handleGrip %x $id] bind $itk_component(sash$id) <B1-ButtonRelease-1> \ [itcl::code $this _endGrip %x $id] bind $itk_component(sash$id) <Configure> \ [itcl::code $this _configGrip %x $id] } horizontal { bind $itk_component(sash$id) <Button-1> \ [itcl::code $this _startGrip %y $id] bind $itk_component(sash$id) <B1-Motion> \ [itcl::code $this _handleGrip %y $id] bind $itk_component(sash$id) <B1-ButtonRelease-1> \ [itcl::code $this _endGrip %y $id] bind $itk_component(sash$id) <Configure> \ [itcl::code $this _configGrip %y $id] } } itk_component add separator$id { frame $itk_interior.separator$id -relief sunken \ -height $itk_option(-thickness) \ -width $itk_option(-thickness) \ -borderwidth [expr {$itk_option(-thickness) / 2}] } { keep -background -cursor } lappend _separators separator$id } } # ------------------------------------------------------------------ # PRIVATE METHOD: _placeSash i # # Places the position of the sash and separator. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::_placeSash {i} { if {$itk_option(-orient) == "horizontal"} { place $itk_component(separator$i) -in $itk_component(hull) \ -x 0 -relwidth 1 -rely $_frac($i) -anchor w \ -height $itk_option(-thickness) if {$itk_option(-sashindent) < 0} { set sashPos [expr {$_width + $itk_option(-sashindent)}] set sashAnchor e } else { set sashPos $itk_option(-sashindent) set sashAnchor w } if {$itk_option(-showhandle)} { place $itk_component(sash$i) -in $itk_component(hull) \ -x $sashPos -rely $_frac($i) -anchor $sashAnchor } else { place $itk_component(sash$i) -in $itk_component(hull) \ -x 0 -relwidth 1 -rely $_frac($i) -anchor w \ -height $itk_option(-thickness) } } else { place $itk_component(separator$i) -in $itk_component(hull) \ -y 0 -relheight 1 -relx $_frac($i) -anchor n \ -width $itk_option(-thickness) if {$itk_option(-sashindent) < 0} { set sashPos [expr {$_height + $itk_option(-sashindent)}] set sashAnchor s } else { set sashPos $itk_option(-sashindent) set sashAnchor n } if {$itk_option(-showhandle)} { place $itk_component(sash$i) -in $itk_component(hull) \ -y $sashPos -relx $_frac($i) -anchor $sashAnchor } else { place $itk_component(sash$i) -in $itk_component(hull) \ -y 0 -relheight 1 -relx $_frac($i) -anchor n \ -width $itk_option(-thickness) } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _placePanes # # Resets the panes of the window following movement of the sash. # ------------------------------------------------------------------ itcl::body iwidgets::Panedwindow::_placePanes {{start 0} {end end}} { if {$end=="end"} { set end [expr {[llength $_activePanes] - 1}] } set _updatePanes [lrange $_activePanes $start $end] if {$_updatePanes == $_activePanes} { set _forgetPanes $_panes } { set _forgetPanes $_updatePanes } foreach pane $_forgetPanes { place forget $itk_component($pane) } if {$itk_option(-orient) == "horizontal"} { set i $start foreach pane $_updatePanes { place $itk_component($pane) -in $itk_component(hull) \ -x 0 -rely $_frac($i) -relwidth 1 \ -relheight [expr {$_frac([expr {$i + 1}]) - $_frac($i)}] incr i } } else { set i $start foreach pane $_updatePanes { place $itk_component($pane) -in $itk_component(hull) \ -y 0 -relx $_frac($i) -relheight 1 \ -relwidth [expr {$_frac([expr {$i + 1}]) - $_frac($i)}] incr i } } for {set i [expr {$start+1}]} {$i <= $end} {incr i} { if {[array names itk_component separator$i] != ""} { _placeSash $i raise $itk_component(separator$i) raise $itk_component(sash$i) } } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/promptdialog.itk�������������������������������������������������������������0000644�0036047�0045461�00000015722�07334044000�016555� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Promptdialog # ---------------------------------------------------------------------- # Implements a prompt dialog similar to the OSF/Motif standard prompt # dialog composite widget. The Promptdialog is derived from the # Dialog class and is composed of a EntryField with methods to # manipulate the dialog buttons. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: promptdialog.itk,v 1.2 2001/08/07 19:56:48 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Promptdialog { keep -background -borderwidth -cursor -foreground -highlightcolor \ -highlightthickness -insertbackground -insertborderwidth \ -insertofftime -insertontime -insertwidth -labelfont -modality \ -selectbackground -selectborderwidth -selectforeground \ -textbackground -textfont } # ------------------------------------------------------------------ # PROMPTDIALOG # ------------------------------------------------------------------ itcl::class iwidgets::Promptdialog { inherit iwidgets::Dialog constructor {args} {} public method get {} public method clear {} public method insert {args} public method delete {args} public method icursor {args} public method index {args} public method scan {args} public method selection {args} method xview {args} } # # Provide a lowercased access method for the Dialogshell class. # proc ::iwidgets::promptdialog {pathName args} { uplevel ::iwidgets::Promptdialog $pathName $args } # # Use option database to override default resources of base classes. # option add *Promptdialog.labelText Selection widgetDefault option add *Promptdialog.labelPos nw widgetDefault option add *Promptdialog.title "Prompt Dialog" widgetDefault option add *Promptdialog.master "." widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Promptdialog::constructor {args} { # # Set the borderwidth to zero. # component hull configure -borderwidth 0 # # Create an entry field widget. # itk_component add prompt { iwidgets::Entryfield $itk_interior.prompt -command [itcl::code $this invoke] } { usual keep -exportselection -invalid -labelpos -labeltext -relief \ -show -textbackground -textfont -validate } pack $itk_component(prompt) -fill x -expand yes set itk_interior [childsite] hide Help # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: get # # Thinwrapped method of entry field class. # ------------------------------------------------------------------ itcl::body iwidgets::Promptdialog::get {} { return [$itk_component(prompt) get] } # ------------------------------------------------------------------ # METHOD: clear # # Thinwrapped method of entry field class. # ------------------------------------------------------------------ itcl::body iwidgets::Promptdialog::clear {} { eval $itk_component(prompt) clear } # ------------------------------------------------------------------ # METHOD: insert args # # Thinwrapped method of entry field class. # ------------------------------------------------------------------ itcl::body iwidgets::Promptdialog::insert {args} { eval $itk_component(prompt) insert $args } # ------------------------------------------------------------------ # METHOD: delete first ?last? # # Thinwrapped method of entry field class. # ------------------------------------------------------------------ itcl::body iwidgets::Promptdialog::delete {args} { eval $itk_component(prompt) delete $args } # ------------------------------------------------------------------ # METHOD: icursor # # Thinwrapped method of entry field class. # ------------------------------------------------------------------ itcl::body iwidgets::Promptdialog::icursor {args} { eval $itk_component(prompt) icursor $args } # ------------------------------------------------------------------ # METHOD: index # # Thinwrapped method of entry field class. # ------------------------------------------------------------------ itcl::body iwidgets::Promptdialog::index {args} { return [eval $itk_component(prompt) index $args] } # ------------------------------------------------------------------ # METHOD: scan option args # # Thinwrapped method of entry field class. # ------------------------------------------------------------------ itcl::body iwidgets::Promptdialog::scan {args} { eval $itk_component(prompt) scan $args } # ------------------------------------------------------------------ # METHOD: selection args # # Thinwrapped method of entry field class. # ------------------------------------------------------------------ itcl::body iwidgets::Promptdialog::selection {args} { eval $itk_component(prompt) selection $args } # ------------------------------------------------------------------ # METHOD: xview args # # Thinwrapped method of entry field class. # ------------------------------------------------------------------ itcl::body iwidgets::Promptdialog::xview {args} { eval $itk_component(prompt) xview $args } ����������������������������������������������iwidgets-4.1.0/generic/pushbutton.itk���������������������������������������������������������������0000644�0036047�0045461�00000030342�10633050336�016267� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Pushbutton # ---------------------------------------------------------------------- # Implements a Motif-like Pushbutton with an optional default ring. # # WISH LIST: # 1) Allow bitmaps and text on the same button face (Tk limitation). # 2) provide arm and disarm bitmaps. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # Bret A. Schuhmacher EMAIL: bas@wn.com # # @(#) $Id: pushbutton.itk,v 1.4 2007/06/10 19:28:30 hobbs Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Pushbutton { keep -activebackground -activeforeground -background -borderwidth \ -cursor -disabledforeground -font -foreground -highlightbackground \ -highlightcolor -highlightthickness } # ------------------------------------------------------------------ # PUSHBUTTON # ------------------------------------------------------------------ itcl::class iwidgets::Pushbutton { inherit itk::Widget constructor {args} {} destructor {} itk_option define -padx padX Pad 11 itk_option define -pady padY Pad 4 itk_option define -font font Font \ -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* itk_option define -text text Text {} itk_option define -bitmap bitmap Bitmap {} itk_option define -image image Image {} itk_option define -highlightthickness highlightThickness \ HighlightThickness 2 itk_option define -borderwidth borderWidth BorderWidth 2 itk_option define -defaultring defaultRing DefaultRing 0 itk_option define -defaultringpad defaultRingPad Pad 4 itk_option define -height height Height 0 itk_option define -width width Width 0 itk_option define -takefocus takeFocus TakeFocus 0 public method flash {} public method invoke {} protected method _relayout {{when later}} protected variable _reposition "" ;# non-null => _relayout pending } # # Provide a lowercased access method for the Pushbutton class. # proc ::iwidgets::pushbutton {pathName args} { uplevel ::iwidgets::Pushbutton $pathName $args } # # Use option database to override default resources of base classes. # option add *Pushbutton.borderWidth 2 widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Pushbutton::constructor {args} { # # Reconfigure the hull to act as the outer sunken ring of # the pushbutton, complete with focus ring. # itk_option add hull.borderwidth hull.relief itk_option add hull.highlightcolor itk_option add hull.highlightbackground if {$::tk_version > 8.3} { # Tk 8.4+ frame -padx -pady options creates inadvertant margin box component hull configure -padx 0 -pady 0 \ -borderwidth [$this cget -borderwidth] } else { component hull configure -borderwidth [$this cget -borderwidth] } pack propagate $itk_component(hull) no itk_component add pushbutton { button $itk_component(hull).pushbutton \ } { usual keep -underline -wraplength -state -command } pack $itk_component(pushbutton) -expand 1 -fill both # # Initialize the widget based on the command line options. # eval itk_initialize $args # # Layout the pushbutton. # _relayout } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Pushbutton::destructor {} { if {$_reposition != ""} {after cancel $_reposition} } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -padx # # Specifies the extra space surrounding the label in the x direction. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pushbutton::padx { $itk_component(pushbutton) configure -padx $itk_option(-padx) _relayout } # ------------------------------------------------------------------ # OPTION: -pady # # Specifies the extra space surrounding the label in the y direction. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pushbutton::pady { $itk_component(pushbutton) configure -pady $itk_option(-pady) _relayout } # ------------------------------------------------------------------ # OPTION: -font # # Specifies the label font. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pushbutton::font { $itk_component(pushbutton) configure -font $itk_option(-font) _relayout } # ------------------------------------------------------------------ # OPTION: -text # # Specifies the label text. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pushbutton::text { $itk_component(pushbutton) configure -text $itk_option(-text) _relayout } # ------------------------------------------------------------------ # OPTION: -bitmap # # Specifies the label bitmap. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pushbutton::bitmap { $itk_component(pushbutton) configure -bitmap $itk_option(-bitmap) _relayout } # ------------------------------------------------------------------ # OPTION: -image # # Specifies the label image. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pushbutton::image { $itk_component(pushbutton) configure -image $itk_option(-image) _relayout } # ------------------------------------------------------------------ # OPTION: -highlightthickness # # Specifies the thickness of the highlight ring. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pushbutton::highlightthickness { $itk_component(pushbutton) configure \ -highlightthickness $itk_option(-highlightthickness) _relayout } # ------------------------------------------------------------------ # OPTION: -borderwidth # # Specifies the width of the relief border. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pushbutton::borderwidth { $itk_component(pushbutton) configure -borderwidth $itk_option(-borderwidth) _relayout } # ------------------------------------------------------------------ # OPTION: -defaultring # # Boolean describing whether the button displays its default ring. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pushbutton::defaultring { _relayout } # ------------------------------------------------------------------ # OPTION: -defaultringpad # # The size of the padded default ring around the button. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pushbutton::defaultringpad { pack $itk_component(pushbutton) \ -padx $itk_option(-defaultringpad) \ -pady $itk_option(-defaultringpad) } # ------------------------------------------------------------------ # OPTION: -height # # Specifies the height of the button inclusive of any default ring. # A value of zero lets the push button determine the height based # on the requested height plus highlightring and defaultringpad. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pushbutton::height { _relayout } # ------------------------------------------------------------------ # OPTION: -width # # Specifies the width of the button inclusive of any default ring. # A value of zero lets the push button determine the width based # on the requested width plus highlightring and defaultringpad. # ------------------------------------------------------------------ itcl::configbody iwidgets::Pushbutton::width { _relayout } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: flash # # Thin wrap of standard button widget flash method. # ------------------------------------------------------------------ itcl::body iwidgets::Pushbutton::flash {} { $itk_component(pushbutton) flash } # ------------------------------------------------------------------ # METHOD: invoke # # Thin wrap of standard button widget invoke method. # ------------------------------------------------------------------ itcl::body iwidgets::Pushbutton::invoke {} { $itk_component(pushbutton) invoke } # ------------------------------------------------------------------ # PROTECTED METHOD: _relayout ?when? # # Adjust the width and height of the Pushbutton to accomadate all the # current options settings. Add back in the highlightthickness to # the button such that the correct reqwidth and reqheight are computed. # Set the width and height based on the reqwidth/reqheight, # highlightthickness, and ringpad. Finally, configure the defaultring # properly. If "when" is "now", the change is applied immediately. If # it is "later" or it is not specified, then the change is applied later, # when the application is idle. # ------------------------------------------------------------------ itcl::body iwidgets::Pushbutton::_relayout {{when later}} { if {$when == "later"} { if {$_reposition == ""} { set _reposition [after idle [itcl::code $this _relayout now]] } return } elseif {$when != "now"} { error "bad option \"$when\": should be now or later" } set _reposition "" if {$itk_option(-width) == 0} { set w [expr {[winfo reqwidth $itk_component(pushbutton)] \ + 2 * $itk_option(-highlightthickness) \ + 2 * $itk_option(-borderwidth) \ + 2 * $itk_option(-defaultringpad)}] } else { set w $itk_option(-width) } if {$itk_option(-height) == 0} { set h [expr {[winfo reqheight $itk_component(pushbutton)] \ + 2 * $itk_option(-highlightthickness) \ + 2 * $itk_option(-borderwidth) \ + 2 * $itk_option(-defaultringpad)}] } else { set h $itk_option(-height) } component hull configure -width $w -height $h if {$itk_option(-defaultring)} { component hull configure -relief sunken \ -highlightthickness [$this cget -highlightthickness] \ -takefocus 1 configure -takefocus 1 component pushbutton configure \ -highlightthickness 0 -takefocus 0 } else { component hull configure -relief flat \ -highlightthickness 0 -takefocus 0 component pushbutton configure \ -highlightthickness [$this cget -highlightthickness] \ -takefocus 1 configure -takefocus 0 } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/radiobox.itk�����������������������������������������������������������������0000644�0036047�0045461�00000036205�07437072653�015705� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Radiobox # ---------------------------------------------------------------------- # Implements a radiobuttonbox. Supports adding, inserting, deleting, # selecting, and deselecting of radiobuttons by tag and index. # # ---------------------------------------------------------------------- # AUTHOR: Michael J. McLennan EMAIL: mmclennan@lucent.com # Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: radiobox.itk,v 1.8 2002/02/27 05:59:07 mgbacke Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Radiobox { keep -background -borderwidth -cursor -disabledforeground \ -foreground -labelfont -selectcolor } # ------------------------------------------------------------------ # RADIOBOX # ------------------------------------------------------------------ itcl::class iwidgets::Radiobox { inherit iwidgets::Labeledframe constructor {args} {} destructor {} itk_option define -disabledforeground \ disabledForeground DisabledForeground {} itk_option define -selectcolor selectColor Background {} itk_option define -command command Command {} itk_option define -orient orient Orient vertical public { method add {tag args} method buttonconfigure {index args} method component {{name ""} args} method delete {index} method deselect {index} method flash {index} method get {} method index {index} method insert {index tag args} method select {index} } protected method _command { name1 name2 opt } private { method gettag {index} ;# Get the tag of the checkbutton associated ;# with a numeric index method _rearrange {} ;# List of radiobutton tags. variable _buttons {} ;# List of radiobutton tags. common _modes ;# Current selection. variable _unique 0 ;# Unique id for choice creation. } } # # Provide a lowercased access method for the Radiobox class. # proc ::iwidgets::radiobox {pathName args} { uplevel ::iwidgets::Radiobox $pathName $args } # # Use option database to override default resources of base classes. # option add *Radiobox.labelMargin 10 widgetDefault option add *Radiobox.labelFont \ "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*" widgetDefault option add *Radiobox.labelPos nw widgetDefault option add *Radiobox.borderWidth 2 widgetDefault option add *Radiobox.relief groove widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::constructor {args} { # # Initialize the _modes array element prior to setting the trace. This # prevents the -command command (if defined) from being triggered when # the first radiobutton is added via the add method. # set _modes($this) {} trace variable [itcl::scope _modes($this)] w [itcl::code $this _command] grid columnconfigure $itk_component(childsite) 0 -weight 1 eval itk_initialize $args } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::destructor { } { trace vdelete [itcl::scope _modes($this)] w [itcl::code $this _command] catch {unset _modes($this)} } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -command # # Specifies a command to be evaluated upon change in the radiobox # ------------------------------------------------------------------ itcl::configbody iwidgets::Radiobox::command {} # ------------------------------------------------------------------ # OPTION: -orient # # Allows the user to orient the radiobuttons either horizontally # or vertically. # ------------------------------------------------------------------ itcl::configbody iwidgets::Radiobox::orient { if {$itk_option(-orient) == "horizontal" || $itk_option(-orient) == "vertical"} { _rearrange } else { error "Bad orientation: $itk_option(-orient). Should be\ \"horizontal\" or \"vertical\"." } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: index index # # Searches the radiobutton tags in the radiobox for the one with the # requested tag, numerical index, or keyword "end". Returns the # choices's numerical index if found, otherwise error. # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::index {index} { if {[llength $_buttons] > 0} { if {[regexp {(^[0-9]+$)} $index]} { if {$index < [llength $_buttons]} { return $index } else { error "Radiobox index \"$index\" is out of range" } } elseif {$index == "end"} { return [expr {[llength $_buttons] - 1}] } else { if {[set idx [lsearch $_buttons $index]] != -1} { return $idx } error "bad Radiobox index \"$index\": must be number, end,\ or pattern" } } else { error "Radiobox \"$itk_component(hull)\" has no radiobuttons" } } # ------------------------------------------------------------------ # METHOD: add tag ?option value option value ...? # # Add a new tagged radiobutton to the radiobox at the end. The method # takes additional options which are passed on to the radiobutton # constructor. These include most of the typical radiobutton # options. The tag is returned. # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::add {tag args} { set options {-value -variable} foreach option $options { if {[lsearch $args $option] != -1} { error "Error: specifying values for radiobutton component options\ \"-value\" and\n \"-variable\" is disallowed. The Radiobox must\ use these options when\n adding radiobuttons." } } itk_component add $tag { eval radiobutton $itk_component(childsite).rb[incr _unique] \ -variable [list [itcl::scope _modes($this)]] \ -anchor w \ -justify left \ -highlightthickness 0 \ -value $tag $args } { usual keep -state ignore -highlightthickness -highlightcolor rename -font -labelfont labelFont Font } lappend _buttons $tag grid $itk_component($tag) after idle [itcl::code $this _rearrange] return $tag } # ------------------------------------------------------------------ # METHOD: insert index tag ?option value option value ...? # # Insert the tagged radiobutton in the radiobox just before the # one given by index. Any additional options are passed on to the # radiobutton constructor. These include the typical radiobutton # options. The tag is returned. # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::insert {index tag args} { set options {-value -variable} foreach option $options { if {[lsearch $args $option] != -1} { error "Error: specifying values for radiobutton component options\ \"-value\" and\n \"-variable\" is disallowed. The Radiobox must\ use these options when\n adding radiobuttons." } } itk_component add $tag { eval radiobutton $itk_component(childsite).rb[incr _unique] \ -variable [list [itcl::scope _modes($this)]] \ -highlightthickness 0 \ -anchor w \ -justify left \ -value $tag $args } { usual ignore -highlightthickness -highlightcolor rename -font -labelfont labelFont Font } set index [index $index] set before [lindex $_buttons $index] set _buttons [linsert $_buttons $index $tag] grid $itk_component($tag) after idle [itcl::code $this _rearrange] return $tag } # ------------------------------------------------------------------ # METHOD: _rearrange # # Rearrange the buttons in the childsite frame using the grid # geometry manager. This method was modified by Chad Smith on 3/9/00 # to take into consideration the newly added -orient config option. # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::_rearrange {} { if {[set count [llength $_buttons]] > 0} { if {$itk_option(-orient) == "vertical"} { set row 0 foreach tag $_buttons { grid configure $itk_component($tag) -column 0 -row $row -sticky nw grid rowconfigure $itk_component(childsite) $row -weight 0 incr row } grid rowconfigure $itk_component(childsite) [expr {$count-1}] \ -weight 1 } else { set col 0 foreach tag $_buttons { grid configure $itk_component($tag) -column $col -row 0 -sticky nw grid columnconfigure $itk_component(childsite) $col -weight 1 incr col } } } } # ------------------------------------------------------------------ # METHOD: component ?name? ?arg arg arg...? # # This method overrides the base class definition to provide some # error checking. The user is disallowed from modifying the values # of the -value and -variable options for individual radiobuttons. # Addition of this method prompted by SF ticket 227923. # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::component {{name ""} args} { if {[lsearch $_buttons $name] != -1} { # See if the user's trying to use the configure method. Note that # because of globbing, as few characters as "co" are expanded to # "config". Similarly, "configu" will expand to "configure". if [regexp {^co+} [lindex $args 0]] { # The user's trying to modify a radiobutton. This is all fine and # dandy unless -value or -variable is being modified. set options {-value -variable} foreach option $options { set index [lsearch $args $option] if {$index != -1} { # If a value is actually specified, throw an error. if {[lindex $args [expr {$index + 1}]] != ""} { error "Error: specifying values for radiobutton component options\ \"-value\" and\n \"-variable\" is disallowed. The Radiobox\ uses these options internally." } } } } } eval chain $name $args } # ------------------------------------------------------------------ # METHOD: delete index # # Delete the specified radiobutton. # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::delete {index} { set tag [gettag $index] set index [index $index] destroy $itk_component($tag) set _buttons [lreplace $_buttons $index $index] if {$_modes($this) == $tag} { set _modes($this) {} } after idle [itcl::code $this _rearrange] return } # ------------------------------------------------------------------ # METHOD: select index # # Select the specified radiobutton. # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::select {index} { set tag [gettag $index] $itk_component($tag) invoke } # ------------------------------------------------------------------ # METHOD: get # # Return the tag of the currently selected radiobutton. # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::get {} { return $_modes($this) } # ------------------------------------------------------------------ # METHOD: deselect index # # Deselect the specified radiobutton. # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::deselect {index} { set tag [gettag $index] $itk_component($tag) deselect } # ------------------------------------------------------------------ # METHOD: flash index # # Flash the specified radiobutton. # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::flash {index} { set tag [gettag $index] $itk_component($tag) flash } # ------------------------------------------------------------------ # METHOD: buttonconfigure index ?option? ?value option value ...? # # Configure a specified radiobutton. This method allows configuration # of radiobuttons from the Radiobox level. The options may have any # of the values accepted by the add method. # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::buttonconfigure {index args} { set tag [gettag $index] eval $itk_component($tag) configure $args } # ------------------------------------------------------------------ # CALLBACK METHOD: _command name1 name2 opt # # Tied to the trace on _modes($this). Whenever our -variable for our # radiobuttons change, this method is invoked. It in turn calls # the user specified tcl script given by -command. # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::_command { name1 name2 opt } { uplevel #0 $itk_option(-command) } # ------------------------------------------------------------------ # METHOD: gettag index # # Return the tag of the checkbutton associated with a specified # numeric index # ------------------------------------------------------------------ itcl::body iwidgets::Radiobox::gettag {index} { return [lindex $_buttons [index $index]] } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/regexpfield.itk��������������������������������������������������������������0000644�0036047�0045461�00000035631�07337265237�016377� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Regexpfield # ---------------------------------------------------------------------- # Implements a text entry widget which accepts input that matches its # regular expression, and invalidates input which doesn't. # # # ---------------------------------------------------------------------- # AUTHOR: John A. Tucker E-mail: jatucker@austin.dsccc.com # # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Regexpfield { keep -background -borderwidth -cursor -foreground -highlightcolor \ -highlightthickness -insertbackground -insertborderwidth \ -insertofftime -insertontime -insertwidth -labelfont \ -selectbackground -selectborderwidth -selectforeground \ -textbackground -textfont } # ------------------------------------------------------------------ # ENTRYFIELD # ------------------------------------------------------------------ itcl::class iwidgets::Regexpfield { inherit iwidgets::Labeledwidget constructor {args} {} itk_option define -childsitepos childSitePos Position e itk_option define -command command Command {} itk_option define -fixed fixed Fixed 0 itk_option define -focuscommand focusCommand Command {} itk_option define -invalid invalid Command bell itk_option define -regexp regexp Regexp {.*} itk_option define -nocase nocase Nocase 0 public { method childsite {} method get {} method delete {args} method icursor {args} method index {args} method insert {args} method scan {args} method selection {args} method xview {args} method clear {} } protected { method _focusCommand {} method _keyPress {char sym state} } private { method _peek {char} } } # # Provide a lowercased access method for the Regexpfield class. # proc ::iwidgets::regexpfield {pathName args} { uplevel ::iwidgets::Regexpfield $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::constructor {args} { component hull configure -borderwidth 0 itk_component add entry { entry $itk_interior.entry } { keep -borderwidth -cursor -exportselection \ -foreground -highlightcolor \ -highlightthickness -insertbackground -insertborderwidth \ -insertofftime -insertontime -insertwidth -justify \ -relief -selectbackground -selectborderwidth \ -selectforeground -show -state -textvariable -width rename -font -textfont textFont Font rename -highlightbackground -background background Background rename -background -textbackground textBackground Background } # # Create the child site widget. # itk_component add -protected efchildsite { frame $itk_interior.efchildsite } set itk_interior $itk_component(efchildsite) # # Regexpfield instance bindings. # bind $itk_component(entry) <KeyPress> [itcl::code $this _keyPress %A %K %s] bind $itk_component(entry) <FocusIn> [itcl::code $this _focusCommand] # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -command # # Command associated upon detection of Return key press event # ------------------------------------------------------------------ itcl::configbody iwidgets::Regexpfield::command {} # ------------------------------------------------------------------ # OPTION: -focuscommand # # Command associated upon detection of focus. # ------------------------------------------------------------------ itcl::configbody iwidgets::Regexpfield::focuscommand {} # ------------------------------------------------------------------ # OPTION: -regexp # # Specify a regular expression to use in performing validation # of the content of the entry widget. # ------------------------------------------------------------------ itcl::configbody iwidgets::Regexpfield::regexp { } # ------------------------------------------------------------------ # OPTION: -invalid # # Specify a command to executed should the current Regexpfield contents # be proven invalid. # ------------------------------------------------------------------ itcl::configbody iwidgets::Regexpfield::invalid {} # ------------------------------------------------------------------ # OPTION: -fixed # # Restrict entry to 0 (unlimited) chars. The value is the maximum # number of chars the user may type into the field, regardles of # field width, i.e. the field width may be 20, but the user will # only be able to type -fixed number of characters into it (or # unlimited if -fixed = 0). # ------------------------------------------------------------------ itcl::configbody iwidgets::Regexpfield::fixed { if {[regexp {[^0-9]} $itk_option(-fixed)] || \ ($itk_option(-fixed) < 0)} { error "bad fixed option \"$itk_option(-fixed)\",\ should be positive integer" } } # ------------------------------------------------------------------ # OPTION: -childsitepos # # Specifies the position of the child site in the widget. # ------------------------------------------------------------------ itcl::configbody iwidgets::Regexpfield::childsitepos { set parent [winfo parent $itk_component(entry)] switch $itk_option(-childsitepos) { n { grid $itk_component(efchildsite) -row 0 -column 0 -sticky ew grid $itk_component(entry) -row 1 -column 0 -sticky nsew grid rowconfigure $parent 0 -weight 0 grid rowconfigure $parent 1 -weight 1 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 } e { grid $itk_component(efchildsite) -row 0 -column 1 -sticky ns grid $itk_component(entry) -row 0 -column 0 -sticky nsew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 } s { grid $itk_component(efchildsite) -row 1 -column 0 -sticky ew grid $itk_component(entry) -row 0 -column 0 -sticky nsew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid columnconfigure $parent 0 -weight 1 grid columnconfigure $parent 1 -weight 0 } w { grid $itk_component(efchildsite) -row 0 -column 0 -sticky ns grid $itk_component(entry) -row 0 -column 1 -sticky nsew grid rowconfigure $parent 0 -weight 1 grid rowconfigure $parent 1 -weight 0 grid columnconfigure $parent 0 -weight 0 grid columnconfigure $parent 1 -weight 1 } default { error "bad childsite option\ \"$itk_option(-childsitepos)\":\ should be n, e, s, or w" } } } # ------------------------------------------------------------------ # OPTION: -nocase # # Specifies whether or not lowercase characters can match either # lowercase or uppercase letters in string. # ------------------------------------------------------------------ itcl::configbody iwidgets::Regexpfield::nocase { switch $itk_option(-nocase) { 0 - 1 { } default { error "bad nocase option \"$itk_option(-nocase)\":\ should be 0 or 1" } } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Returns the path name of the child site widget. # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::childsite {} { return $itk_component(efchildsite) } # ------------------------------------------------------------------ # METHOD: get # # Thin wrap of the standard entry widget get method. # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::get {} { return [$itk_component(entry) get] } # ------------------------------------------------------------------ # METHOD: delete # # Thin wrap of the standard entry widget delete method. # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::delete {args} { return [eval $itk_component(entry) delete $args] } # ------------------------------------------------------------------ # METHOD: icursor # # Thin wrap of the standard entry widget icursor method. # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::icursor {args} { return [eval $itk_component(entry) icursor $args] } # ------------------------------------------------------------------ # METHOD: index # # Thin wrap of the standard entry widget index method. # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::index {args} { return [eval $itk_component(entry) index $args] } # ------------------------------------------------------------------ # METHOD: insert # # Thin wrap of the standard entry widget index method. # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::insert {args} { return [eval $itk_component(entry) insert $args] } # ------------------------------------------------------------------ # METHOD: scan # # Thin wrap of the standard entry widget scan method. # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::scan {args} { return [eval $itk_component(entry) scan $args] } # ------------------------------------------------------------------ # METHOD: selection # # Thin wrap of the standard entry widget selection method. # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::selection {args} { return [eval $itk_component(entry) selection $args] } # ------------------------------------------------------------------ # METHOD: xview # # Thin wrap of the standard entry widget xview method. # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::xview {args} { return [eval $itk_component(entry) xview $args] } # ------------------------------------------------------------------ # METHOD: clear # # Delete the current entry contents. # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::clear {} { $itk_component(entry) delete 0 end icursor 0 } # ------------------------------------------------------------------ # PRIVATE METHOD: _peek char # # The peek procedure returns the value of the Regexpfield with the # char inserted at the insert position. # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::_peek {char} { set str [get] set insertPos [index insert] set firstPart [string range $str 0 [expr {$insertPos - 1}]] set lastPart [string range $str $insertPos end] append rtnVal $firstPart $char $lastPart return $rtnVal } # ------------------------------------------------------------------ # PROTECTED METHOD: _focusCommand # # Method bound to focus event which evaluates the current command # specified in the focuscommand option # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::_focusCommand {} { uplevel #0 $itk_option(-focuscommand) } # ------------------------------------------------------------------ # PROTECTED METHOD: _keyPress # # Monitor the key press event checking for return keys, fixed width # specification, and optional validation procedures. # ------------------------------------------------------------------ itcl::body iwidgets::Regexpfield::_keyPress {char sym state} { # # A Return key invokes the optionally specified command option. # if {$sym == "Return"} { uplevel #0 $itk_option(-command) return -code break 1 } # # Tabs, BackSpace, and Delete are passed on for other bindings. # if {($sym == "Tab") || ($sym == "BackSpace") || ($sym == "Delete")} { return -code continue 1 } # # Character is not printable or the state is greater than one which # means a modifier was used such as a control, meta key, or control # or meta key with numlock down. # if {($char == "") || \ ($state == 4) || ($state == 8) || \ ($state == 36) || ($state == 40)} { return -code continue 1 } # # If the fixed length option is not zero, then verify that the # current length plus one will not exceed the limit. If so then # invoke the invalid command procedure. # if {$itk_option(-fixed) != 0} { if {[string length [get]] >= $itk_option(-fixed)} { uplevel #0 $itk_option(-invalid) return -code break 0 } } set flags "" # # Get the new value of the Regexpfield with the char inserted at the # insert position. # # If the new value doesn't match up with the pattern stored in the # -regexp option, then the invalid procedure is called. # # If the value of the "-nocase" option is true, then add the # "-nocase" flag to the list of flags. # set newVal [_peek $char] if {$itk_option(-nocase)} { set valid [::regexp -nocase -- $itk_option(-regexp) $newVal] } else { set valid [::regexp $itk_option(-regexp) $newVal] } if {!$valid} { uplevel #0 $itk_option(-invalid) return -code break 0 } return -code continue 1 } �������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/roman.itcl�������������������������������������������������������������������0000644�0036047�0045461�00000001335�07334044000�015327� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������namespace eval ::iwidgets { variable romand set romand(val) {1000 900 500 400 100 90 50 40 10 9 5 4 1} set romand(upper) { M CM D CD C XC L XL X IX V IV I} set romand(lower) { m cm d cd c xc l xl x ix v iv i} proc roman2 {n {case upper}} { variable romand set r "" foreach val $romand(val) sym $romand($case) { while {$n >= $val} { set r "$r$sym" incr n -$val } } return $r } proc roman {n {case upper}} { variable romand set r "" foreach val $romand(val) sym $romand($case) { for {} {$n >= $val} {incr n -$val} { set r "$r$sym" } } return $r } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/scopedobject.itcl������������������������������������������������������������0000644�0036047�0045461�00000011710�07334044000�016655� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Scopedobject # ----------------------------------------------------------------------------- # Implements a base class for defining Itcl classes which posses # scoped behavior like Tcl variables. The objects are only accessible # within the procedure in which they are instantiated and are deleted # when the procedure returns. # # Option(s): # # -enterscopecommand: Tcl command to invoke when a object enters scope # (i.e. when it is created ...). # # -exitscopecommand: Tcl command to invoke when a object exits scope # (i.e. when it is deleted ...). # # Note(s): # # Although a Scopedobject instance will automatically destroy itself # when it goes out of scope, one may explicity delete an instance # before it destroys itself. # # Example(s): # # Creating an instance at local scope in a procedure provides # an opportunity for tracing the entry and exiting of that # procedure. Users can register their proc/method tracing handlers # with the Scopedobject class via either of the following two ways: # # 1.) configure the "-exitscopecommand" on a Scopedobject instance; # e.g. # #!/usr/local/bin/wish # # proc tracedProc {} { # scopedobject #auto \ # -exitscopecommand {puts "enter tracedProc"} \ # -exitscopecommand {puts "exit tracedProc"} # } # # 2.) deriving from the Scopedobject and implementing the exit handling # in their derived classes destructor. # e.g. # # #!/usr/local/bin/wish # # class Proctrace { # inherit Scopedobject # # proc procname {} { # return [info level -1] # } # # constructor {args} { # puts "enter [procname]" # eval configure $args # } # # destructor { # puts "exit [procname]" # } # } # # proc tracedProc {} { # Proctrace #auto # } # # ----------------------------------------------------------------------------- # AUTHOR: John Tucker # DSC Communications Corp # ----------------------------------------------------------------------------- itcl::class iwidgets::Scopedobject { # # OPTIONS: # public { variable enterscopecommand {} variable exitscopecommand {} } # # PUBLIC: # constructor {args} {} destructor {} # # PRIVATE: # private { # Implements the Tcl trace command callback which is responsible # for destroying a Scopedobject instance when its corresponding # Tcl variable goes out of scope. # method _traceCommand {varName varValue op} # Stores the stack level of the invoking procedure in which # a Scopedobject instance in created. # variable _level 0 } } # # Provide a lowercased access method for the Scopedobject class. # proc ::iwidgets::scopedobject {pathName args} { uplevel ::iwidgets::Scopedobject $pathName $args } #-------------------------------------------------------------------------------- # CONSTRUCTOR #-------------------------------------------------------------------------------- itcl::body iwidgets::Scopedobject::constructor {args} { # Create a local variable in the procedure which this instance was created, # and then register out instance deletion command (i.e. _traceCommand) # to be called whenever the local variable is unset. # # If this is a derived class, then we will need to perform the variable creation # and tracing N levels up the stack frame, where: # N = depth of inheritance hierarchy. # set depth [llength [$this info heritage]] set _level "#[uplevel $depth info level]" uplevel $_level set _localVar($this) $this uplevel $_level trace variable _localVar($this) u \"[itcl::code $this _traceCommand]\" eval configure $args if {$enterscopecommand != {}} { eval $enterscopecommand } } #-------------------------------------------------------------------------------- # DESTRUCTOR #-------------------------------------------------------------------------------- itcl::body iwidgets::Scopedobject::destructor {} { uplevel $_level trace vdelete _localVar($this) u \"[itcl::code $this _traceCommand]\" if {$exitscopecommand != {}} { eval $exitscopecommand } } #--------------------------------------------------------------------------------# # # METHOD: _traceCommand # # PURPOSE: # Callback used to destroy instances when their locally created variable # goes out of scope. # itcl::body iwidgets::Scopedobject::_traceCommand {varName varValue op} { delete object $this } #------------------------------------------------------------------------------ # # OPTION: -enterscopecommand # # PURPOSE: # Specifies a Tcl command to invoke when a object enters scope. # itcl::configbody iwidgets::Scopedobject::enterscopecommand { } #------------------------------------------------------------------------------ # # OPTION: -exitscopecommand # # PURPOSE: # Specifies a Tcl command to invoke when an object exits scope. # itcl::configbody iwidgets::Scopedobject::exitscopecommand { } ��������������������������������������������������������iwidgets-4.1.0/generic/scrolledcanvas.itk�����������������������������������������������������������0000644�0036047�0045461�00000042161�07337265246�017100� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Scrolledcanvas # ---------------------------------------------------------------------- # Implements horizontal and vertical scrollbars around a canvas childsite # Includes options to control display of scrollbars. The standard # canvas options and methods are supported. # # ---------------------------------------------------------------------- # AUTHOR: Mark Ulferts mulferts@austin.dsccc.com # # @(#) $Id: scrolledcanvas.itk,v 1.3 2001/08/17 19:04:06 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Scrolledcanvas { keep -activebackground -activerelief -background -borderwidth -cursor \ -elementborderwidth -foreground -highlightcolor -highlightthickness \ -insertbackground -insertborderwidth -insertofftime -insertontime \ -insertwidth -jump -labelfont -selectbackground -selectborderwidth \ -selectforeground -textbackground -troughcolor } # ------------------------------------------------------------------ # SCROLLEDCANVAS # ------------------------------------------------------------------ itcl::class iwidgets::Scrolledcanvas { inherit iwidgets::Scrolledwidget constructor {args} {} destructor {} itk_option define -autoresize autoResize AutoResize 1 itk_option define -automargin autoMargin AutoMargin 0 public method childsite {} public method justify {direction} public method addtag {args} public method bbox {args} public method bind {args} public method canvasx {args} public method canvasy {args} public method coords {args} public method create {args} public method dchars {args} public method delete {args} public method dtag {args} public method find {args} public method focus {args} public method gettags {args} public method icursor {args} public method index {args} public method insert {args} public method itemconfigure {args} public method itemcget {args} public method lower {args} public method move {args} public method postscript {args} public method raise {args} public method scale {args} public method scan {args} public method select {args} public method type {args} public method xview {args} public method yview {args} } # # Provide a lowercased access method for the Scrolledcanvas class. # proc ::iwidgets::scrolledcanvas {pathName args} { uplevel ::iwidgets::Scrolledcanvas $pathName $args } # # Use option database to override default resources of base classes. # option add *Scrolledcanvas.width 200 widgetDefault option add *Scrolledcanvas.height 230 widgetDefault option add *Scrolledcanvas.labelPos n widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::constructor {args} { # # Create a clipping frame which will provide the border for # relief display. # itk_component add clipper { frame $itk_interior.clipper } { usual keep -borderwidth -relief -highlightthickness -highlightcolor rename -highlightbackground -background background Background } grid $itk_component(clipper) -row 0 -column 0 -sticky nsew grid rowconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 0 -weight 1 # # Create a canvas to scroll # itk_component add canvas { canvas $itk_component(clipper).canvas \ -height 1.0 -width 1.0 \ -scrollregion "0 0 1 1" \ -xscrollcommand \ [itcl::code $this _scrollWidget $itk_interior.horizsb] \ -yscrollcommand \ [itcl::code $this _scrollWidget $itk_interior.vertsb] } { usual ignore -highlightthickness -highlightcolor keep -closeenough -confine -scrollregion keep -xscrollincrement -yscrollincrement rename -background -textbackground textBackground Background } grid $itk_component(canvas) -row 0 -column 0 -sticky nsew grid rowconfigure $itk_component(clipper) 0 -weight 1 grid columnconfigure $itk_component(clipper) 0 -weight 1 # # Configure the command on the vertical scroll bar in the base class. # $itk_component(vertsb) configure \ -command [itcl::code $itk_component(canvas) yview] # # Configure the command on the horizontal scroll bar in the base class. # $itk_component(horizsb) configure \ -command [itcl::code $itk_component(canvas) xview] # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # DESTURCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::destructor {} { } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -autoresize # # Automatically adjusts the scrolled region to be the bounding # box covering all the items in the canvas following the execution # of any method which creates or destroys items. Thus, as new # items are added, the scrollbars adjust accordingly. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledcanvas::autoresize { if {$itk_option(-autoresize)} { set bbox [$itk_component(canvas) bbox all] if {$bbox != {}} { set marg $itk_option(-automargin) set bbox [lreplace $bbox 0 0 [expr {[lindex $bbox 0] - $marg}]] set bbox [lreplace $bbox 1 1 [expr {[lindex $bbox 1] - $marg}]] set bbox [lreplace $bbox 2 2 [expr {[lindex $bbox 2] + $marg}]] set bbox [lreplace $bbox 3 3 [expr {[lindex $bbox 3] + $marg}]] } $itk_component(canvas) configure -scrollregion $bbox } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Returns the path name of the child site widget. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::childsite {} { return $itk_component(canvas) } # ------------------------------------------------------------------ # METHOD: justify # # Justifies the canvas scrolled region in one of four directions: top, # bottom, left, or right. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::justify {direction} { if {[winfo ismapped $itk_component(canvas)]} { update idletasks switch $direction { left { $itk_component(canvas) xview moveto 0 } right { $itk_component(canvas) xview moveto 1 } top { $itk_component(canvas) yview moveto 0 } bottom { $itk_component(canvas) yview moveto 1 } default { error "bad justify argument \"$direction\": should be\ left, right, top, or bottom" } } } } # ------------------------------------------------------------------ # CANVAS METHODS: # # The following methods are thin wraps of standard canvas methods. # Consult the Tk canvas man pages for functionallity and argument # documentation # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: addtag tag searchSpec ?arg arg ...? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::addtag {args} { return [eval $itk_component(canvas) addtag $args] } # ------------------------------------------------------------------ # METHOD: bbox tagOrId ?tagOrId tagOrId ...? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::bbox {args} { return [eval $itk_component(canvas) bbox $args] } # ------------------------------------------------------------------ # METHOD: bind tagOrId ?sequence? ?command? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::bind {args} { return [eval $itk_component(canvas) bind $args] } # ------------------------------------------------------------------ # METHOD: canvasx screenx ?gridspacing? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::canvasx {args} { return [eval $itk_component(canvas) canvasx $args] } # ------------------------------------------------------------------ # METHOD: canvasy screeny ?gridspacing? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::canvasy {args} { return [eval $itk_component(canvas) canvasy $args] } # ------------------------------------------------------------------ # METHOD: coords tagOrId ?x0 y0 ...? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::coords {args} { return [eval $itk_component(canvas) coords $args] } # ------------------------------------------------------------------ # METHOD: create type x y ?x y ...? ?option value ...? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::create {args} { set retval [eval $itk_component(canvas) create $args] configure -autoresize $itk_option(-autoresize) return $retval } # ------------------------------------------------------------------ # METHOD: dchars tagOrId first ?last? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::dchars {args} { return [eval $itk_component(canvas) dchars $args] } # ------------------------------------------------------------------ # METHOD: delete tagOrId ?tagOrId tagOrId ...? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::delete {args} { set retval [eval $itk_component(canvas) delete $args] configure -autoresize $itk_option(-autoresize) return $retval } # ------------------------------------------------------------------ # METHOD: dtag tagOrId ?tagToDelete? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::dtag {args} { eval $itk_component(canvas) dtag $args configure -autoresize $itk_option(-autoresize) } # ------------------------------------------------------------------ # METHOD: find searchCommand ?arg arg ...? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::find {args} { return [eval $itk_component(canvas) find $args] } # ------------------------------------------------------------------ # METHOD: focus ?tagOrId? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::focus {args} { return [eval $itk_component(canvas) focus $args] } # ------------------------------------------------------------------ # METHOD: gettags tagOrId # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::gettags {args} { return [eval $itk_component(canvas) gettags $args] } # ------------------------------------------------------------------ # METHOD: icursor tagOrId index # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::icursor {args} { eval $itk_component(canvas) icursor $args } # ------------------------------------------------------------------ # METHOD: index tagOrId index # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::index {args} { return [eval $itk_component(canvas) index $args] } # ------------------------------------------------------------------ # METHOD: insert tagOrId beforeThis string # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::insert {args} { eval $itk_component(canvas) insert $args } # ------------------------------------------------------------------ # METHOD: itemconfigure tagOrId ?option? ?value? ?option value ...? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::itemconfigure {args} { set retval [eval $itk_component(canvas) itemconfigure $args] configure -autoresize $itk_option(-autoresize) return $retval } # ------------------------------------------------------------------ # METHOD: itemcget tagOrId ?option? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::itemcget {args} { set retval [eval $itk_component(canvas) itemcget $args] return $retval } # ------------------------------------------------------------------ # METHOD: lower tagOrId ?belowThis? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::lower {args} { eval $itk_component(canvas) lower $args } # ------------------------------------------------------------------ # METHOD: move tagOrId xAmount yAmount # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::move {args} { eval $itk_component(canvas) move $args configure -autoresize $itk_option(-autoresize) } # ------------------------------------------------------------------ # METHOD: postscript ?option value ...? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::postscript {args} { # # Make sure the fontmap is in scope. # set fontmap "" regexp -- {-fontmap +([^ ]+)} $args all fontmap if {$fontmap != ""} { global $fontmap } return [eval $itk_component(canvas) postscript $args] } # ------------------------------------------------------------------ # METHOD: raise tagOrId ?aboveThis? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::raise {args} { eval $itk_component(canvas) raise $args } # ------------------------------------------------------------------ # METHOD: scale tagOrId xOrigin yOrigin xScale yScale # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::scale {args} { eval $itk_component(canvas) scale $args } # ------------------------------------------------------------------ # METHOD: scan option args # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::scan {args} { eval $itk_component(canvas) scan $args } # ------------------------------------------------------------------ # METHOD: select option ?tagOrId arg? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::select {args} { eval $itk_component(canvas) select $args } # ------------------------------------------------------------------ # METHOD: type tagOrId # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::type {args} { return [eval $itk_component(canvas) type $args] } # ------------------------------------------------------------------ # METHOD: xview index # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::xview {args} { eval $itk_component(canvas) xview $args } # ------------------------------------------------------------------ # METHOD: yview index # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledcanvas::yview {args} { eval $itk_component(canvas) yview $args } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/scrolledframe.itk������������������������������������������������������������0000644�0036047�0045461�00000021160�07334044000�016667� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Scrolledframe # ---------------------------------------------------------------------- # Implements horizontal and vertical scrollbars around a childsite # frame. Includes options to control display of scrollbars. # # ---------------------------------------------------------------------- # AUTHOR: Mark Ulferts mulferts@austin.dsccc.com # # @(#) $Id: scrolledframe.itk,v 1.3 2001/08/07 19:56:48 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Scrolledframe { keep -activebackground -activerelief -background -borderwidth -cursor \ -elementborderwidth -foreground -highlightcolor -highlightthickness \ -jump -labelfont -troughcolor } # ------------------------------------------------------------------ # SCROLLEDFRAME # ------------------------------------------------------------------ itcl::class iwidgets::Scrolledframe { inherit iwidgets::Scrolledwidget constructor {args} {} destructor {} public method childsite {} public method justify {direction} public method xview {args} public method yview {args} protected method _configureCanvas {} protected method _configureFrame {} } # # Provide a lowercased access method for the Scrolledframe class. # proc ::iwidgets::scrolledframe {pathName args} { uplevel ::iwidgets::Scrolledframe $pathName $args } # # Use option database to override default resources of base classes. # option add *Scrolledframe.width 100 widgetDefault option add *Scrolledframe.height 100 widgetDefault option add *Scrolledframe.labelPos n widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledframe::constructor {args} { itk_option remove iwidgets::Labeledwidget::state # # Create a clipping frame which will provide the border for # relief display. # itk_component add clipper { frame $itk_interior.clipper } { usual keep -borderwidth -relief } grid $itk_component(clipper) -row 0 -column 0 -sticky nsew grid rowconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 0 -weight 1 # # Create a canvas to scroll # itk_component add canvas { canvas $itk_component(clipper).canvas \ -height 1.0 -width 1.0 \ -scrollregion "0 0 1 1" \ -xscrollcommand \ [itcl::code $this _scrollWidget $itk_interior.horizsb] \ -yscrollcommand \ [itcl::code $this _scrollWidget $itk_interior.vertsb] \ -highlightthickness 0 -takefocus 0 } { ignore -highlightcolor -highlightthickness keep -background -cursor } grid $itk_component(canvas) -row 0 -column 0 -sticky nsew grid rowconfigure $itk_component(clipper) 0 -weight 1 grid columnconfigure $itk_component(clipper) 0 -weight 1 # # Configure the command on the vertical scroll bar in the base class. # $itk_component(vertsb) configure \ -command [itcl::code $itk_component(canvas) yview] # # Configure the command on the horizontal scroll bar in the base class. # $itk_component(horizsb) configure \ -command [itcl::code $itk_component(canvas) xview] # # Handle configure events on the canvas to adjust the frame size # according to the scrollregion. # bind $itk_component(canvas) <Configure> [itcl::code $this _configureCanvas] # # Create a Frame inside canvas to hold widgets to be scrolled # itk_component add -protected sfchildsite { frame $itk_component(canvas).sfchildsite } { keep -background -cursor } pack $itk_component(sfchildsite) -fill both -expand yes $itk_component(canvas) create window 0 0 -tags frameTag \ -window $itk_component(sfchildsite) -anchor nw set itk_interior $itk_component(sfchildsite) bind $itk_component(sfchildsite) <Configure> [itcl::code $this _configureFrame] # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # DESTURCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledframe::destructor {} { } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Returns the path name of the child site widget. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledframe::childsite {} { return $itk_component(sfchildsite) } # ------------------------------------------------------------------ # METHOD: justify # # Justifies the scrolled region in one of four directions: top, # bottom, left, or right. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledframe::justify {direction} { if {[winfo ismapped $itk_component(canvas)]} { update idletasks switch $direction { left { $itk_component(canvas) xview moveto 0 } right { $itk_component(canvas) xview moveto 1 } top { $itk_component(canvas) yview moveto 0 } bottom { $itk_component(canvas) yview moveto 1 } default { error "bad justify argument \"$direction\": should be\ left, right, top, or bottom" } } } } # ------------------------------------------------------------------ # METHOD: xview index # # Adjust the view in the frame so that character position index # is displayed at the left edge of the widget. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledframe::xview {args} { return [eval $itk_component(canvas) xview $args] } # ------------------------------------------------------------------ # METHOD: yview index # # Adjust the view in the frame so that character position index # is displayed at the top edge of the widget. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledframe::yview {args} { return [eval $itk_component(canvas) yview $args] } # ------------------------------------------------------------------ # PRIVATE METHOD: _configureCanvas # # Responds to configure events on the canvas widget. When canvas # changes size, adjust frame size. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledframe::_configureCanvas {} { set sr [$itk_component(canvas) cget -scrollregion] set srw [lindex $sr 2] set srh [lindex $sr 3] $itk_component(sfchildsite) configure -height $srh -width $srw } # ------------------------------------------------------------------ # PRIVATE METHOD: _configureFrame # # Responds to configure events on the frame widget. When the frame # changes size, adjust scrolling region size. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledframe::_configureFrame {} { $itk_component(canvas) configure \ -scrollregion [$itk_component(canvas) bbox frameTag] } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������iwidgets-4.1.0/generic/scrolledhtml.itk�������������������������������������������������������������0000644�0036047�0045461�00000232204�10153652636�016561� 0����������������������������������������������������������������������������������������������������ustar �dgp�����������������������������771div�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Scrolledhtml # ---------------------------------------------------------------------- # Implements a scrolled html text widget by inheritance from scrolledtext # Import reads from an html file, while export still writes plain text # Also provides a render command, to display html text passed in as an # argument. # # This widget is HTML3.2 compliant, with the following exceptions: # a) nothing requiring a connection to an HTTP server is supported # b) some of the image alignments aren't supported, because they're not # supported by the text widget # c) the br attributes that go with the image alignments aren't implemented # d) background images are not supported, because they're not supported # by the text widget # e) automatic table/table cell sizing doesn't work very well. # # WISH LIST: # This section lists possible future enhancements. # # 1) size tables better using dlineinfo. # 2) make images scroll smoothly off top like they do off bottom. (limitation # of text widget?) # 3) add ability to get non-local URLs # a) support forms # b) support imagemaps # 4) keep track of visited links # 5) add tclets support # # BUGS: # Cells in a table can be caused to overlap. ex: # <table border width="100%"> # <tr><td>cell1</td><td align=right rowspan=2>cell2</td></tr> # <tr><td colspan=2>cell3 w/ overlap</td> # </table> # It hasn't been fixed because 1) it's a pain to fix, 2) the fix would slow # tables down by a significant amount, and 3) netscape has the same # bug, as of V3.01, and no one seems to care. # # In order to size tables properly, they must be visible, which causes an # annoying jump from table to table through the document at render time. # # ---------------------------------------------------------------------- # AUTHOR: Kris Raney EMAIL: kraney@spd.dsccc.com # # @(#) $Id: scrolledhtml.itk,v 1.8 2004/12/02 17:49:18 davygrvy Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1996 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # Acknowledgements: # # Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his # tkhtml.tcl code from tk inspect. The original code is copyright 1995 # Lawrence Berkeley Laboratory. # # This software is copyright (C) 1995 by the Lawrence Berkeley Laboratory. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that: (1) source code distributions # retain the above copyright notice and this paragraph in its entirety, (2) # distributions including binary code include the above copyright notice and # this paragraph in its entirety in the documentation or other materials # provided with the distribution, and (3) all advertising materials mentioning # features or use of this software display the following acknowledgement: # ``This product includes software developed by the University of California, # Lawrence Berkeley Laboratory and its contributors.'' Neither the name of # the University nor the names of its contributors may be used to endorse # or promote products derived from this software without specific prior # written permission. # # THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. # # This code is based on Angel Li's (angel@flipper.rsmas.miami.edu) HTML # # Default resources. # option add *Scrolledhtml.borderWidth 2 widgetDefault option add *Scrolledhtml.relief sunken widgetDefault option add *Scrolledhtml.scrollMargin 3 widgetDefault option add *Scrolledhtml.width 500 widgetDefault option add *Scrolledhtml.height 600 widgetDefault option add *Scrolledhtml.visibleItems 80x24 widgetDefault option add *Scrolledhtml.vscrollMode static widgetDefault option add *Scrolledhtml.hscrollMode static widgetDefault option add *Scrolledhtml.labelPos n widgetDefault option add *Scrolledhtml.wrap word widgetDefault # # Usual options. # itk::usual Scrolledhtml { keep -fontname -fontsize -fixedfont -link -alink -linkhighlight \ -activebackground -activerelief -background -borderwidth -cursor \ -elementborderwidth -foreground -highlightcolor -highlightthickness \ -insertbackground -insertborderwidth -insertofftime -insertontime \ -insertwidth -jump -labelfont -selectbackground -selectborderwidth \ -selectforeground -textbackground -textfont -troughcolor -unknownimage } # ------------------------------------------------------------------ # SCROLLEDHTML # ------------------------------------------------------------------ itcl::class iwidgets::Scrolledhtml { inherit iwidgets::Scrolledtext constructor {args} {} destructor {} itk_option define -feedback feedBack FeedBack {} itk_option define -linkcommand linkCommand LinkCommand {} itk_option define -fontname fontname FontName times itk_option define -fixedfont fixedFont FixedFont courier itk_option define -fontsize fontSize FontSize medium itk_option define -link link Link blue itk_option define -alink alink ALink red itk_option define -linkhighlight alink ALink red itk_option define -unknownimage unknownimage File {} itk_option define -textbackground textBackground Background {} itk_option define -update update Update 1 itk_option define -debug debug Debug 0 public method import {args} public method clear {} public method render {html {wd .}} public method title {} {return $_title} public method pwd {} {return $_cwd} protected method _setup {} protected method _set_tag {} protected method _reconfig_tags {} protected method _append_text {text} protected method _do {text} protected method _definefont {name foundry family weight slant registry} protected method _peek {instack} protected method _push {instack value} protected method _pop {instack} protected method _parse_fields {array_var string} protected method _href_click {cmd href} protected method _set_align {align} protected method _fixtablewidth {hottext table multiplier} protected method _header {level args} protected method _/header {level} protected method _entity_a {args} protected method _entity_/a {} protected method _entity_address {} protected method _entity_/address {} protected method _entity_b {} protected method _entity_/b {} protected method _entity_base {{args {}}} protected method _entity_basefont {{args {}}} protected method _entity_big {} protected method _entity_/big {} protected method _entity_blockquote {} protected method _entity_/blockquote {} protected method _entity_body {{args {}}} protected method _entity_/body {} protected method _entity_br {{args {}}} protected method _entity_center {} protected method _entity_/center {} protected method _entity_cite {} protected method _entity_/cite {} protected method _entity_code {} protected method _entity_/code {} protected method _entity_dir {{args {}}} protected method _entity_/dir {} protected method _entity_div {{args {}}} protected method _entity_dl {{args {}}} protected method _entity_/dl {} protected method _entity_dt {} protected method _entity_dd {} protected method _entity_dfn {} protected method _entity_/dfn {} protected method _entity_em {} protected method _entity_/em {} protected method _entity_font {{args {}}} protected method _entity_/font {} protected method _entity_h1 {{args {}}} protected method _entity_/h1 {} protected method _entity_h2 {{args {}}} protected method _entity_/h2 {} protected method _entity_h3 {{args {}}} protected method _entity_/h3 {} protected method _entity_h4 {{args {}}} protected method _entity_/h4 {} protected method _entity_h5 {{args {}}} protected method _entity_/h5 {} protected method _entity_h6 {{args {}}} protected method _entity_/h6 {} protected method _entity_hr {{args {}}} protected method _entity_i {} protected method _entity_/i {} protected method _entity_img {{args {}}} protected method _entity_kbd {} protected method _entity_/kbd {} protected method _entity_li {{args {}}} protected method _entity_listing {} protected method _entity_/listing {} protected method _entity_menu {{args {}}} protected method _entity_/menu {} protected method _entity_ol {{args {}}} protected method _entity_/ol {} protected method _entity_p {{args {}}} protected method _entity_pre {{args {}}} protected method _entity_/pre {} protected method _entity_samp {} protected method _entity_/samp {} protected method _entity_small {} protected method _entity_/small {} protected method _entity_sub {} protected method _entity_/sub {} protected method _entity_sup {} protected method _entity_/sup {} protected method _entity_strong {} protected method _entity_/strong {} protected method _entity_table {{args {}}} protected method _entity_/table {} protected method _entity_td {{args {}}} protected method _entity_/td {} protected method _entity_th {{args {}}} protected method _entity_/th {} protected method _entity_title {} protected method _entity_/title {} protected method _entity_tr {{args {}}} protected method _entity_/tr {} protected method _entity_tt {} protected method _entity_/tt {} protected method _entity_u {} protected method _entity_/u {} protected method _entity_ul {{args {}}} protected method _entity_/ul {} protected method _entity_var {} protected method _entity_/var {} protected variable _title {} ;# The title of the html document protected variable _licount 1 ;# list element count protected variable _listyle bullet ;# list element style protected variable _lipic {} ;# picture to use as bullet protected variable _color black ;# current text color protected variable _bgcolor #d9d9d9 ;# current background color protected variable _link blue ;# current link color protected variable _alink red ;# current highlight link color protected variable _smallpoints "60 80 100 120 140 180 240" ;# font point protected variable _mediumpoints "80 100 120 140 180 240 360" ;# sizes for protected variable _largepoints "100 120 140 180 240 360 480" ;# various protected variable _hugepoints "120 140 180 240 360 480 640" ;# fontsizes protected variable _font times ;# name of current font protected variable _rulerheight 6 ;# protected variable _indentincr 4 ;# increment to indent by protected variable _counter -1 ;# counter to give unique numbers protected variable _left 0 ;# initial left margin protected variable _left2 0 ;# subsequent left margin protected variable _right 0 ;# right margin protected variable _justify L ;# text justification protected variable _offset 0 ;# text offset (super/subscript) protected variable _textweight 0 ;# boldness of text protected variable _textslant 0 ;# whether to use italics protected variable _underline 0 ;# whether to use underline protected variable _verbatim 0 ;# whether to skip formatting protected variable _pre 0 ;# preformatted text protected variable _intitle 0 ;# in <title>... protected variable _anchorcount 0 ;# number of anchors protected variable _stack ;# array of stacks protected variable _pointsndx 2 ;# protected variable _fontnames ;# list of accepted font names protected variable _fontinfo ;# array of font info given font name protected variable _tag ;# protected variable _tagl ;# protected variable _tagfont ;# protected variable _cwd . ;# base directory of current page protected variable _anchor ;# array of indexes by anchorname protected variable _defaulttextbackground;# default text background protected variable _intable 0 ;# whether we are in a table now protected variable _hottext ;# widget where text currently goes protected variable _basefontsize 2 ;# as named protected variable _unknownimg {} ;# name of unknown image protected variable _images {} ;# list of images we created protected variable _prevpos {} ;# temporary used for table updates protected variable _prevtext {} ;# temporary used for table updates private variable _initialized 0 private variable _defUnknownImg [::image create photo -data { R0lGODdhHwAgAPQAAP///wAAAMzMzC9PT76+vvnTogCR/1WRVaoAVf//qvT09OKdcWlcx19f X9/f339/f8vN/J2d/aq2qoKCggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ACwAAAAAHwAgAAAF/iAgjqRDnmiKmqOkqsTaToDjvudTttLjOITJbTQhGI+iQE0xMvZqQIDw NAEiAcqRVdKAGh0NyVCkuyqZBEmwofgRrFIxSaI0JmuA9KTrthIicWMTAQ8xWHgSe15AVgcJ eVMjDwECOkome22Mb0cHCzEPOiQPgwGXCjomakedA0VgY1IPDZcuP3l5YkcRDwMHqDQoEzq2 Pz8IQkK7Bw8HDg+xO26PCAgRDcpGswEK2Dh9ItUMDdirPYUKwTKMjwDV1gHlR2oCkSmcI9UE BabYrGnQoolgBCGckX7yWJWDYaUMAYSRFECAwMXeiU1BHpKTB4CBR4+oBOb5By1UNgUfXj0C 8HaP079sBCCkZIAKWst/OGPOhNBNHQmXOeftJBASRVCcEiIojQDBwIOeRo+SpGXKFFGbP6Xi nLWxEMsmWpEOC9XDYtigYtKSwsH2xdq2cEfRmFS1rt27eE09CAEAOw== }] } # # Provide a lowercased access method for the Scrolledhtml class. # proc ::iwidgets::scrolledhtml {pathName args} { uplevel ::iwidgets::Scrolledhtml $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::constructor {args} { # define the fonts we're going to use set _fontnames "" _definefont helvetica adobe helvetica "medium bold" "r o" iso8859 _definefont courier adobe courier "medium bold" "r o" iso8859 _definefont times adobe times "medium bold" "r i" iso8859 _definefont symbol adobe symbol "medium medium" "r r" adobe $itk_component(text) configure -state disabled eval itk_initialize $args if {[lsearch -exact $args -linkcommand] == -1} { configure -linkcommand [itcl::code $this import -link] } set _initialized 1 } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::destructor {} { foreach x $_images { ::image delete $x } if {$_unknownimg != $_defUnknownImg} { ::image delete $_unknownimg } } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -fontsize # # Set the general size of the font. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledhtml::fontsize { switch $itk_option(-fontsize) { small { } medium { } large { } huge { } default { error "bad fontsize option\ \"$itk_option(-fontsize)\": should\ be small, medium, large, or huge" } } _reconfig_tags } # ------------------------------------------------------------------ # OPTION: -fixedfont # # Set the fixed font name # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledhtml::fixedfont { if {[lsearch -exact $_fontnames $itk_option(-fixedfont)] == -1} { error "Invalid font name \"$itk_option(-fixedfont)\". Must be one of \ $_fontnames" } } # ------------------------------------------------------------------ # OPTION: -fontname # # Set the default font name # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledhtml::fontname { if {[lsearch -exact $_fontnames $itk_option(-fontname)] == -1} { error "Invalid font name \"$itk_option(-fontname)\". Must be one of \ $_fontnames" } } # ------------------------------------------------------------------ # OPTION: -textbackground # # Set the default text background # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledhtml::textbackground { set _defaulttextbackground $itk_option(-textbackground) } # ------------------------------------------------------------------ # OPTION: -linkhighlight # # same as alink # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledhtml::linkhighlight { configure -alink $itk_option(-linkhighlight) } # ------------------------------------------------------------------ # OPTION: -unknownimage # # set image to use as substitute for images that aren't found # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledhtml::unknownimage { set oldimage $_unknownimg if {$itk_option(-unknownimage) != {}} { set uki $itk_option(-unknownimage) if [catch { set _unknownimg [::image create photo -file $uki] } err] { error "Couldn't create image $uki:\n$err\nUnknown image not found" } } else { set _unknownimg $_defUnknownImg } if {$oldimage != {} && $oldimage != $_defUnknownImg} { ::image delete $oldimage } } # ------------------------------------------------------------------ # OPTION: -update # # boolean indicating whether to update during rendering # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledhtml::update { switch -- $itk_option(-update) { 0 {} 1 {} true { configure -update 1 } yes { configure -update 1 } false { configure -update 0 } yes { configure -update 0 } default { error "invalid -update; must be boolean" } } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: clear # # Clears the text out # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::clear {} { $itk_component(text) config -state normal $itk_component(text) delete 1.0 end foreach x $_images { ::image delete $x } set _images {} _setup $itk_component(text) config -state disabled } # ------------------------------------------------------------------ # METHOD import ?-link? filename?#anchorname? # # read html text from a file (import filename) if the keyword link is present, # pathname is relative to last page, otherwise it is relative to current # directory. This allows the user to use a linkcommand of # " import -link" # # if '#anchorname' is appended to the filename, the page is displayed starting # at the anchor named 'anchorname' If an anchor is specified without a filename, # the current page is assumed. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::import {args} { update idletasks set len [llength $args] if {$len != 1 && $len != 2} { error "wrong # args: should be \ \"$itk_component(hull) import ?-link? filename\"" } set linkname [lindex $args [expr {$len - 1}]] # # Seperate filename#anchorname # if ![regexp {(.*)#(.*)} $linkname dummy filename anchorname] { set filename $linkname } if {$filename!=""} { # # Check for -link option # switch -- $len { 1 { # # open file & set cwd to that file's directory # set f [open $filename r] set _cwd [file dirname $filename] } 2 { switch -- [lindex $args 0] { -link { # # got -link, so set path relative to current locale, if path # is a relative pathname # if {[string compare "." [file dirname $filename]] == 0} { set f [open $_cwd/$filename r] } else { if {[string index [file dirname $filename] 0] != "/" &&\ [string index [file dirname $filename] 0] != "~"} { set f [open $_cwd/$filename r] append _cwd / append _cwd [file dirname $filename] } else { set f [open $filename r] set _cwd [file dirname $filename] } } } default { # got something other than -link error "invalid format: should be \ \"$itk_component(hull) import ?-link? filename\"" } } } } set txt [read $f] close $f render $txt $_cwd } # # if an anchor was requested, move that anchor into view # if [ info exists anchorname] { if {$anchorname!=""} { if [info exists _anchor($anchorname)] { $itk_component(text) see end $itk_component(text) see $_anchor($anchorname) } } else { $itk_component(text) see 0.0 } } } # ------------------------------------------------------------------ # METHOD: render text ?wd? # # Clear the text, then render html formatted text. Optional wd argument # sets the base directory for any links or images. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::render {html {wd .}} { update idletasks # # blank text and reset all state variables # clear set _cwd $wd # # make text writable # $itk_component(text) config -state normal set continuerendering 1 _set_tag while {$continuerendering} { # normal state while {[set len [string length $html]]} { # look for text up to the next <> element if [regexp -indices "^\[^<\]+" $html match] { set text [string range $html 0 [lindex $match 1]] _append_text "$text" set html \ [string range $html [expr {[lindex $match 1]+1}] end] } # we're either at a <>, or at the eot if [regexp -indices "^<((\[^>\"\]+|(\"\[^\"\]*\"))*)>" $html match entity] { regsub -all "\n" [string range $html [lindex $entity 0] \ [lindex $entity 1]] "" entity set cmd [string tolower [lindex $entity 0]] if {[info command _entity_$cmd]!=""} { if {[catch {eval _entity_$cmd [lrange $entity 1 end]} bad]} { if {$itk_option(-debug)} { global errorInfo puts stderr "render: _entity_$cmd [lrange $entity 1 end] = Error:$bad\n$errorInfo" } } } set html \ [string range $html [expr {[lindex $match 1]+1}] end] } if {$itk_option(-feedback) != {} } { eval $itk_option(-feedback) $len } if $_verbatim break } # we reach here if html is empty, or _verbatim is 1 if !$len break # _verbatim must be 1 # append text until next tag is reached if [regexp -indices "<.*>" $html match] { set text [string range $html 0 [expr {[lindex $match 0]-1}]] set html [string range $html [expr {[lindex $match 0]}] end] } else { set text $html set html "" } _append_text "$text" } $itk_component(text) config -state disabled } # ------------------------------------------------------------------ # PRIVATE METHOD: _setup # # Reset all state variables to prepare for a new page. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_setup {} { set _font $itk_option(-fontname) set _left 0 set _left2 0 set _right 0 set _justify L set _textweight 0 set _textslant 0 set _underline 0 set _verbatim 0 set _pre 0 set _title {} set _intitle 0 set _anchorcount 0 set _intable 0 set _hottext $itk_component(text) set _stack(font) {} set _stack(color) {} set _stack(bgcolor) {} set _stack(link) {} set _stack(alink) {} set _stack(justify) {} set _stack(listyle) {} set _stack(lipic) {} set _stack(href) {} set _stack(pointsndx) {} set _stack(left) {} set _stack(left2) {} set _stack(offset) {} set _stack(table) {} set _stack(tablewidth) {} set _stack(row) {} set _stack(column) {} set _stack(hottext) {} set _stack(tableborder) {} set _stack(cellpadding) {} set _stack(cellspacing) {} set _stack(licount) {} set _basefontsize 2 set _pointsndx 2 set _counter -1 set _bgcolor $_defaulttextbackground set _color $itk_option(-foreground) set _link $itk_option(-link) set _alink $itk_option(-alink) config -textbackground $_bgcolor foreach x [array names _anchor] { unset _anchor($x) } $itk_component(text) tag config hr -relief sunken -borderwidth 2 \ -font -*-*-*-*-*-*-$_rulerheight-*-*-*-*-*-*-* } # ------------------------------------------------------------------ # PRIVATE METHOD: _definefont name foundry family weight slant registry # # define font information used to generate font value from font name # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_definefont \ {name foundry family weight slant registry} { if {[lsearch -exact $_fontnames $name] == -1 } { lappend _fontnames $name } set _fontinfo($name) \ [list $foundry $family $weight $slant $registry] } # ------------------------------------------------------------------ # PRIVATE METHOD: _append_text text # # append text in the format described by the state variables # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_append_text {text} { if {!$_intable && $itk_option(-update)} {update} if {[string first "&" $text] != -1} { regsub -nocase -all "&" $text {\&} text regsub -nocase -all "<" $text "<" text regsub -nocase -all ">" $text ">" text regsub -nocase -all """ $text "\"" text } if !$_verbatim { if !$_pre { set text [string trim $text "\n\r"] regsub -all "\[ \n\r\t\]+" $text " " text } if ![string length $text] return } if {!$_pre && !$_intitle} { if {[catch {$_hottext get "end - 2c"} p]} { set p "" } set n [string index $text 0] if {$n == " " && $p == " "} { set text [string range $text 1 end] } if {[catch {$_hottext insert end $text $_tag}]} { set pht [winfo parent $_hottext] catch {$pht insert end $text $_tag} } return } if {$_pre && !$_intitle} { if {[catch {$_hottext insert end $text $_tag}]} { set pht [winfo parent $_hottext] catch {$pht insert end $text $_tag} } return } append _title $text } # ------------------------------------------------------------------ # PRIVATE METHOD: _set_tag # # generate a tag # ------------------------------------------------------------------ # a tag is constructed as: font?B?I?U?Points-LeftLeft2RightColorJustify itcl::body iwidgets::Scrolledhtml::_set_tag {} { set i -1 foreach var {foundry family weight slant registry} { set $var [lindex $_fontinfo($_font) \ [incr i]] } set x_font "-$foundry-$family-" set _tag $_font set args {} if {$_textweight > 0} { append _tag "B" append x_font [lindex $weight 1]- } else { append x_font [lindex $weight 0]- } if {$_textslant > 0} { append _tag "I" append x_font [lindex $slant 1]- } else { append x_font [lindex $slant 0]- } if {$_underline > 0} { append _tag "U" append args " -underline 1" } switch $_justify { L { append args " -justify left" } R { append args " -justify right" } C { append args " -justify center" } } append args " -offset $_offset" set pts [lindex [set [format "_%spoints" $itk_option(-fontsize)]] \ $_pointsndx] append _tag $_pointsndx - $_left \ $_left2 $_right \ $_color $_justify append x_font "normal-*-*-$pts-*-*-*-*-$registry-*" if $_anchorcount { set href [_peek href] set href_tag href[incr _counter] set tags [list $_tag $href_tag] if { $itk_option(-linkcommand)!= {} } { $_hottext tag bind $href_tag <1> \ [list uplevel #0 $itk_option(-linkcommand) $href] } $_hottext tag bind $href_tag \ [list $_hottext tag configure $href_tag \ -foreground $_alink] $_hottext tag bind $href_tag \ [list $_hottext tag configure $href_tag \ -foreground $_color] } else { set tags $_tag } if {![info exists _tagl($_tag)]} { set _tagfont($_tag) 1 eval $_hottext tag configure $_tag \ -foreground ${_color} \ -lmargin1 ${_left}m \ -lmargin2 ${_left2}m $args if [catch {eval $_hottext tag configure $_tag \ -font $x_font} err] { _definefont $_font * $family $weight $slant * regsub \$foundry $x_font * x_font regsub \$registry $x_font * x_font catch {eval $_hottext tag configure $_tag -font $x_font} } } if [info exists href_tag] { $_hottext tag raise $href_tag $_tag } set _tag $tags } # ------------------------------------------------------------------ # PRIVATE METHOD: _reconfig_tags # # reconfigure tags following a configuration change # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_reconfig_tags {} { if $_initialized { foreach tag [$itk_component(text) tag names] { foreach efont $_fontnames { if [regexp "${efont}(B?)(I?)(U?)(\[1-9\]\[0-9\]*)-" $tag t b i u points] { set j -1 set _font $efont foreach var {foundry family weight slant registry} { set $var [lindex $_fontinfo($_font) [incr j]] } set x_font "-$foundry-$family-" if {$b == "B"} { append x_font [lindex $weight 1]- } else { append x_font [lindex $weight 0]- } if {$i == "I"} { append x_font [lindex $slant 1]- } else { append x_font [lindex $slant 0]- } set pts [lindex [set [format \ "_%spoints" $itk_option(-fontsize)]] $points] append x_font "normal-*-*-$pts-*-*-*-*-$registry-*" $itk_component(text) tag config $tag -font $x_font break } } } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _push instack value # # push value onto stack(instack) # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_push {instack value} { set _stack($instack) [linsert $_stack($instack) 0 $value] } # ------------------------------------------------------------------ # PRIVATE METHOD: _pop instack # # pop value from stack(instack) # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_pop {instack} { if {$_stack($instack) == ""} { error "popping empty _stack $instack" } set val [lindex $_stack($instack) 0] set _stack($instack) [lrange $_stack($instack) 1 end] return $val } # ------------------------------------------------------------------ # PRIVATE METHOD: _peek instack # # peek at top value on stack(instack) # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_peek {instack} { return [lindex $_stack($instack) 0] } # ------------------------------------------------------------------ # PRIVATE METHOD: _parse_fields array_var string # # parse fields from a href or image tag. At the moment, doesn't support # spaces in field values. (e.g. alt="not avaliable") # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_parse_fields {array_var string} { upvar $array_var array if {$string != "{}" } { regsub -all "( *)=( *)" $string = string regsub -all {\\\"} $string \" string while {$string != ""} { if ![regexp "^ *(\[^ \n\r=\]+)=\"(\[^\"\n\r\t\]*)(.*)" $string \ dummy field value newstring] { if ![regexp "^ *(\[^ \n\r=\]+)=(\[^\n\r\t \]*)(.*)" $string \ dummy field value newstring] { if ![regexp "^ *(\[^ \n\r\]+)(.*)" $string dummy field newstring] { error "malformed command field; field = \"$string\"" continue } set value "" } } set array([string tolower $field]) $value set string "$newstring" } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _href_click # # process a click on an href # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_href_click {cmd href} { uplevel #0 $cmd $href } # ------------------------------------------------------------------ # PRIVATE METHOD: _set_align # # set text alignment # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_set_align {align} { switch [string tolower $align] { center { set _justify C } left { set _justify L } right { set _justify R } default {} } } # ------------------------------------------------------------------ # PRIVATE METHOD: _fixtablewidth # # fix table width & height # essentially, with nested tables the outer table must be configured before # the inner table, but the idle tasks get queued up in the opposite order, # so process later idle tasks before sizing yourself. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_fixtablewidth {hottext table multiplier} { update idletasks $hottext see $_anchor($table) update idletasks $table configure \ -width [expr {$multiplier * [winfo width $hottext] - \ 2* [$hottext cget -padx] - \ 2* [$hottext cget -borderwidth]} ] \ -height [winfo height $table] grid propagate $table 0 } # ------------------------------------------------------------------ # PRIVATE METHOD: _header level # # generic entity to set state for tag # Accepts argument of the form ?align=[left,right,center]? ?src=? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_header {level args} { eval _parse_fields ar $args _push justify $_justify if [info exists ar(align)] { _entity_p align=$ar(align) } else { _entity_p } if [info exists ar(src)] { _entity_img src=$ar(src) } _push pointsndx $_pointsndx set _pointsndx [expr {7-$level}] incr _textweight _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _/header level # # generic entity to set state for tag # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_/header {level} { set _justify [_pop justify] set _pointsndx [_pop pointsndx] incr _textweight -1 _set_tag _entity_p } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_a # # add an anchor. Accepts arguments of the form ?href=filename#anchorpoint? # ?name=anchorname? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_a {args} { _parse_fields ar $args _push color $_color if [info exists ar(href)] { _push href $ar(href) incr _anchorcount set _color $_link _entity_u } else { _push href {} } if [info exists ar(name)] { set _anchor($ar(name)) [$itk_component(text) index end] } if [info exists ar(id)] { set _anchor($ar(id)) [$itk_component(text) index end] } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/a # # End anchor # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/a {} { set href [_pop href] if {$href != {}} { incr _anchorcount -1 set _color [_pop color] _entity_/u } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_address # # display an address # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_address {} { _entity_br _entity_i } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/address # # change state back from address display # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/address {} { _entity_/i _entity_br } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_b # # Change current font to bold # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_b {} { incr _textweight _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/b # # change current font back from bold # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/b {} { incr _textweight -1 _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_base # # set the cwd of the document # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_base {{args {}}} { _parse_fields ar $args if [info exists ar(href)] { set _cwd [file dirname $ar(href)] } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_basefont # # set base font size # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_basefont {{args {}}} { _parse_fields ar $args if {[info exists ar(size)]} { set _basefontsize $ar(size) } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_big # # Change current font to a bigger size # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_big {} { _push pointsndx $_pointsndx if {[incr _pointsndx 2] > 6} { set _pointsndx 6 } _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/big # # change current font back from bigger size # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/big {} { set _pointsndx [_pop pointsndx] _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_blockquote # # display a block quote # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_blockquote {} { _entity_p _push left $_left incr _left $_indentincr _push left2 $_left2 set _left2 $_left _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/blockquote # # change back from blockquote # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/blockquote {} { _entity_p set _left [_pop left] set _left2 [_pop left2] _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_body # # begin body text. Takes argument of the form ?bgcolor=? ?text=? # ?link=? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_body {{args {}}} { _parse_fields ar $args if [info exists ar(bgcolor)] { set _bgcolor $ar(bgcolor) set temp $itk_option(-textbackground) config -textbackground $_bgcolor set _defaulttextbackground $temp } if [info exists ar(text)] { set _color $ar(text) } if [info exists ar(link)] { set _link $ar(link) } if [info exists ar(alink)] { set _alink $ar(alink) } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/body # # end body text # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/body {} { } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_br # # line break # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_br {{args {}}} { $_hottext insert end "\n" } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_center # # change justification to center # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_center {} { _push justify $_justify set _justify C _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/center # # change state back from center # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/center {} { set _justify [_pop justify] _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_cite # # display citation # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_cite {} { _entity_i } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/cite # # change state back from citation # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/cite {} { _entity_/i } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_code # # display code listing # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_code {} { _entity_pre } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/code # # end code listing # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/code {} { _entity_/pre } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_dir # # display dir list # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_dir {{args {}}} { _entity_ul plain $args } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/dir # # end dir list # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/dir {} { _entity_/ul } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_div # # divide text. same as

    # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_div {{args {}}} { _entity_p $args } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_dl # # begin definition list # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_dl {{args {}}} { if {$_left == 0} { _entity_p } _push left $_left _push left2 $_left2 if {$_left2 == $_left } { incr _left2 [expr {$_indentincr+3}] } else { incr _left2 $_indentincr } incr _left $_indentincr _push listyle $_listyle _push licount $_licount set _listyle none _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/dl # # end definition list # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/dl {} { set _left [_pop left] set _left2 [_pop left2] set _listyle [_pop listyle] set _licount [_pop licount] _set_tag if {$_left == 0} { _entity_p } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_dt # # definition term # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_dt {} { set _left [expr {$_left2 - 3}] _set_tag _entity_p } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_dd # # definition definition # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_dd {} { set _left $_left2 _set_tag _entity_br } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_dfn # # display defining instance of a term # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_dfn {} { _entity_i _entity_b } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/dfn # # change state back from defining instance of term # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/dfn {} { _entity_/b _entity_/i } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_em # # display emphasized text # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_em {} { _entity_i } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/em # # change state back from emphasized text # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/em {} { _entity_/i } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_font # # set font size and color # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_font {{args {}}} { _parse_fields ar $args _push pointsndx $_pointsndx _push color $_color if [info exists ar(size)] { if {![regexp {^[+-].*} $ar(size)]} { set _pointsndx $ar(size) } else { set _pointsndx [expr $_basefontsize $ar(size)] } if { $_pointsndx > 6 } { set _pointsndx 6 } else { if { $_pointsndx < 0 } { set _pointsndx 0 } } } if {[info exists ar(color)]} { set _color $ar(color) } _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/font # # close current font size # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/font {} { set _pointsndx [_pop pointsndx] set _color [_pop color] _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_h1 # # display header level 1. # Accepts argument of the form ?align=[left,right,center]? ?src=? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_h1 {{args {}}} { _header 1 $args } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/h1 # # change state back from header 1 # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/h1 {} { _/header 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_h2 # # display header level 2 # Accepts argument of the form ?align=[left,right,center]? ?src=? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_h2 {{args {}}} { _header 2 $args } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/h2 # # change state back from header 2 # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/h2 {} { _/header 2 } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_h3 # # display header level 3 # Accepts argument of the form ?align=[left,right,center]? ?src=? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_h3 {{args {}}} { _header 3 $args } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/h3 # # change state back from header 3 # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/h3 {} { _/header 3 } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_h4 # # display header level 4 # Accepts argument of the form ?align=[left,right,center]? ?src=? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_h4 {{args {}}} { _header 4 $args } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/h4 # # change state back from header 4 # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/h4 {} { _/header 4 } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_h5 # # display header level 5 # Accepts argument of the form ?align=[left,right,center]? ?src=? # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_h5 {{args {}}} { _header 5 $args } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/h5 # # change state back from header 5 # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/h5 {} { _/header 5 } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_h6 # # display header level 6 # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_h6 {{args {}}} { _header 6 $args } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/h6 # # change state back from header 6 # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/h6 {} { _/header 6 } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_hr # # Add a horizontal rule # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_hr {{args {}}} { _parse_fields ar $args if [info exists ar(size)] { set font "-font -*-*-*-*-*-*-$ar(size)-*-*-*-*-*-*-*" } else { set font "-font -*-*-*-*-*-*-2-*-*-*-*-*-*-*" } if [info exists ar(width)] { } if [info exists ar(noshade)] { set relief "-relief flat" set background "-background black" } else { set relief "-relief sunken" set background "" } # if [info exists ar(align)] { # $_hottext tag config hr$_counter -justify $ar(align) # set justify -justify $ar(align) # } else { # set justify "" # } eval $_hottext tag config hr[incr _counter] $relief $background $font \ -borderwidth 2 _entity_p $_hottext insert end " \n" hr$_counter } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_i # # display italicized text # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_i {} { incr _textslant _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/i # # change state back from italicized text # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/i {} { incr _textslant -1 _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_img # # display an image. takes argument of the form img= # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_img {{args {}}} { _parse_fields ar $args set alttext "" # # If proper argument exists # if [info exists ar(src)] { set imgframe $_hottext.img[incr _counter] # # if this is an anchor # if $_anchorcount { # create link colored border frame $imgframe -borderwidth 2 -background $_link bind $imgframe \ [list $imgframe configure -background $_alink] bind $imgframe \ [list $imgframe configure -background $_link] } else { # create plain frame frame $imgframe -borderwidth 0 -background $_color } # # try to load image # if {[string index $ar(src) 0] == "/" || [string index $ar(src) 0] == "~"} { set file $ar(src) } else { set file $_cwd/$ar(src) } if [catch {set img [::image create photo -file $file]} err] { if {[info exists ar(width)] && [info exists ar(height)] } { # suggestions exist, so make frame appropriate size and add a border $imgframe configure -width $ar(width) -height $ar(height) -borderwidth 2 pack propagate $imgframe false } # # If alt text is specified, display that # if [info exists ar(alt)] { # add a border $imgframe configure -borderwidth 2 set win $imgframe.text label $win -text "$ar(alt)" -background $_bgcolor \ -foreground $_color } else { # # use 'unknown image' set win $imgframe.image#auto # # make label containing image # label $win -image $_unknownimg -borderwidth 0 -background $_bgcolor } pack $win -fill both -expand true } else { ;# no error loading image lappend _images $img set win $imgframe.$img # # make label containing image # label $win -image $img -borderwidth 0 } pack $win # # set alignment # set align bottom if [info exists ar(align)] { switch $ar(align) { middle { set align center } right { set align center } default { set align [string tolower $ar(align)] } } } # # create window in text to display image # $_hottext window create end -window \ $imgframe -align $align # # set tag for window # $_hottext tag add $_tag $imgframe if $_anchorcount { set href [_peek href] set href_tag href[incr _counter] set tags [list $_tag $href_tag] if { $itk_option(-linkcommand)!= {} } { bind $win <1> [list uplevel #0 $itk_option(-linkcommand) $href] } } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_kbd # # Display keyboard input # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_kbd {} { incr _textweight _entity_tt _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/kbd # # change state back from displaying keyboard input # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/kbd {} { _entity_/tt incr _textweight -1 _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_li # # begin new list entry # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_li {{args {}}} { _parse_fields ar $args if [info exists ar(value)] { set _licount $ar(value) } _entity_br switch -exact $_listyle { bullet { set old_font $_font set _font symbol _set_tag $_hottext insert end "\xb7" $_tag set _font $old_font _set_tag } none { } picture { _entity_img src="$_lipic" width=4 height=4 align=middle } A { _entity_b $_hottext insert end [format "%c) " [expr {$_licount + 0x40}]] $_tag _entity_/b incr _licount } a { _entity_b $_hottext insert end [format "%c) " [expr {$_licount + 0x60}]] $_tag _entity_/b incr _licount } I { _entity_b $_hottext insert end "[::iwidgets::roman $_licount]) " $_tag _entity_/b incr _licount } i { _entity_b $_hottext insert end "[::iwidgets::roman $_licount lower])] " $_tag _entity_/b incr _licount } default { _entity_b $_hottext insert end "$_licount) " $_tag _entity_/b incr _licount } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_listing # # diplay code listing # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_listing {} { _entity_pre } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/listing # # end code listing # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/listing {} { _entity_/pre } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_menu # # diplay menu list # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_menu {{args {}}} { _entity_ul plain $args } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/menu # # end menu list # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/menu {} { _entity_/ul } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_ol # # begin ordered list # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_ol {{args {}}} { _parse_fields ar $args if $_left { _entity_br } else { _entity_p } if {![info exists ar(type)]} { set ar(type) 1 } _push licount $_licount if [info exists ar(start)] { set _licount $ar(start) } else { set _licount 1 } _push left $_left _push left2 $_left2 if {$_left2 == $_left } { incr _left2 [expr {$_indentincr+3}] } else { incr _left2 $_indentincr } incr _left $_indentincr _push listyle $_listyle set _listyle $ar(type) _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/ol # # end ordered list # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/ol {} { set _left [_pop left] set _left2 [_pop left2] set _listyle [_pop listyle] set _licount [_pop licount] _set_tag _entity_p } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_p # # paragraph break # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_p {{args {}}} { _parse_fields ar $args if [info exists ar(align)] { _set_align $ar(align) } else { set _justify L } _set_tag if [info exists ar(id)] { set _anchor($ar(id)) [$itk_component(text) index end] } set x [$_hottext get end-3c] set y [$_hottext get end-2c] if {$x == "" && $y == ""} return if {$y == ""} { $_hottext insert end "\n\n" return } if {$x == "\n" && $y == "\n"} return if {$y == "\n"} { $_hottext insert end "\n" return } $_hottext insert end "\n\n" } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_pre # # display preformatted text # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_pre {{args {}}} { _entity_tt _entity_br incr _pre } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/pre # # change state back from preformatted text # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/pre {} { _entity_/tt set _pre 0 _entity_p } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_samp # # display sample text. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_samp {} { _entity_kbd } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/samp # # switch back to non-sample text # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/samp {} { _entity_/kbd } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_small # # Change current font to a smaller size # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_small {} { _push pointsndx $_pointsndx if {[incr _pointsndx -2] < 0} { set _pointsndx 0 } _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/small # # change current font back from smaller size # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/small {} { set _pointsndx [_pop pointsndx] _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_sub # # display subscript # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_sub {} { _push offset $_offset incr _offset -2 _entity_small } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/sub # # switch back to non-subscript # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/sub {} { set _offset [_pop offset] _entity_/small } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_sup # # display superscript # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_sup {} { _push offset $_offset incr _offset 4 _entity_small } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/sup # # switch back to non-superscript # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/sup {} { set _offset [_pop offset] _entity_/small } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_strong # # display strong text. (i.e. make font bold) # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_strong {} { incr _textweight _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/strong # # switch back to non-strong text # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/strong {} { incr _textweight -1 _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_table # # display a table. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_table {{args {}}} { _parse_fields ar $args _entity_p set _intable 1 _push row -1 _push column 0 _push hottext $_hottext _push justify $_justify _push justify L # push color information for master of table, then push info for table _push color $_color _push bgcolor $_bgcolor _push link $_link _push alink $_alink if [info exists ar(bgcolor)] { set _bgcolor $ar(bgcolor) } if [info exists ar(text)] { set _color $ar(text) } if [info exists ar(link)] { set _link $ar(link) } if [info exists ar(alink)] { set _alink $ar(alink) } _push color $_color _push bgcolor $_bgcolor _push link $_link _push alink $_alink # push fake first row to avoid using optional /tr tag # (This needs to set a real color - not the empty string # becaule later code will try to use those values.) _push color $_color _push bgcolor $_bgcolor _push link {} _push alink {} if {[info exists ar(align)]} { _set_align $ar(align) _set_tag _append_text " " } set _justify L if [info exists ar(id)] { set _anchor($ar(id)) [$itk_component(text) index end] } if [info exists ar(cellpadding)] { _push cellpadding $ar(cellpadding) } else { _push cellpadding 0 } if [info exists ar(cellspacing)] { _push cellspacing $ar(cellspacing) } else { _push cellspacing 0 } if {[info exists ar(border)]} { _push tableborder 1 set relief raised if {$ar(border)==""} { set ar(border) 2 } } else { _push tableborder 0 set relief flat set ar(border) 2 } _push table [set table $_hottext.table[incr _counter]] iwidgets::labeledwidget $table -foreground $_color -background $_bgcolor -labelpos n if {[info exists ar(title)]} { $table configure -labeltext $ar(title) } # # create window in text to display table # $_hottext window create end -window $table set table [$table childsite] set _anchor($table) [$_hottext index "end - 1 line"] $table configure -borderwidth $ar(border) -relief $relief if {[info exists ar(width)]} { _push tablewidth $ar(width) } else { _push tablewidth 0 } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/table # # end table # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/table {} { if {$_intable} { _pop tableborder set table [[_pop table] childsite] _pop row _pop column _pop cellspacing _pop cellpadding # pop last row's defaults _pop color _pop bgcolor _pop link _pop alink # pop table defaults _pop color _pop bgcolor _pop link _pop alink # restore table master defaults set _color [_pop color] set _bgcolor [_pop bgcolor] set _link [_pop link] set _alink [_pop alink] foreach x [grid slaves $table] { set text [$x get 1.0 end] set tl [split $text \n] set max 0 foreach l $tl { set len [string length $l] if {$len > $max} { set max $len } } if {$max > [$x cget -width]} { $x configure -width $max } if {[$x cget -height] == 1} { $x configure -height [lindex [split [$x index "end - 1 chars"] "."] 0] } } $_hottext configure -state disabled set _hottext [_pop hottext] $_hottext configure -state normal if {[set tablewidth [_pop tablewidth]]!="0"} { if {[string index $tablewidth \ [expr {[string length $tablewidth] -1}]] == "%"} { set multiplier [expr {[string trimright $tablewidth "%"] / 100.0}] set idletask [after idle [itcl::code "$this _fixtablewidth $_hottext $table $multiplier"]] } else { $table configure -width $tablewidth grid propagate $table 0 } } _pop justify set _justify [_pop justify] _entity_br } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_td # # start table data cell # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_td {{args {}}} { if $_intable { _parse_fields ar $args set table [[_peek table] childsite] if {![info exists ar(colspan)]} { set ar(colspan) 1 } if {![info exists ar(rowspan)]} { set ar(rowspan) 1 } if {![info exists ar(width)]} { set ar(width) 10 } if {![info exists ar(height)]} { set ar(height) 0 } if [info exists ar(bgcolor)] { set _bgcolor $ar(bgcolor) } else { set _bgcolor [_peek bgcolor] } if [info exists ar(text)] { set _color $ar(text) } else { set _color [_peek color] } if [info exists ar(link)] { set _link $ar(link) } else { set _link [_peek link] } if [info exists ar(alink)] { set _alink $ar(alink) } else { set _alink [_peek alink] } $_hottext configure -state disabled set cellpadding [_peek cellpadding] set cellspacing [_peek cellspacing] set _hottext $table.cell[incr _counter] text $_hottext -relief flat -width $ar(width) -height $ar(height) \ -highlightthickness 0 -wrap word -cursor $itk_option(-cursor) \ -wrap word -cursor $itk_option(-cursor) \ -padx $cellpadding -pady $cellpadding if {$_color != ""} { $_hottext config -foreground $_color } if {$_bgcolor != ""} { $_hottext config -background $_bgcolor } if [info exists ar(nowrap)] { $_hottext configure -wrap none } if [_peek tableborder] { $_hottext configure -relief sunken } set row [_peek row] if {$row < 0} { set row 0 } set column [_pop column] if {$column < 0} { set column 0 } while {[grid slaves $table -row $row -column $column] != ""} { incr column } grid $_hottext -sticky nsew -row $row -column $column \ -columnspan $ar(colspan) -rowspan $ar(rowspan) \ -padx $cellspacing -pady $cellspacing grid columnconfigure $table $column -weight 1 _push column [expr {$column + $ar(colspan)}] if [info exists ar(align)] { _set_align $ar(align) } else { set _justify [_peek justify] } _set_tag } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/td # # end table data cell # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/td {} { } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_th # # start table header # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_th {{args {}}} { if $_intable { _parse_fields ar $args if [info exists ar(align)] { _entity_td $args } else { _entity_td align=center $args } _entity_b } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/th # # end table data cell # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/th {} { _entity_/td } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_title # # begin title of document # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_title {} { set _intitle 1 } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/title # # end title # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/title {} { set _intitle 0 } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_tr # # start table row # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_tr {{args {}}} { if $_intable { _parse_fields ar $args _pop justify if [info exists ar(align)] { _set_align $ar(align) _push justify $_justify } else { _push justify L } # pop last row's colors _pop color _pop bgcolor _pop link _pop alink if [info exists ar(bgcolor)] { set _bgcolor $ar(bgcolor) } else { set _bgcolor [_peek bgcolor] } if [info exists ar(text)] { set _color $ar(text) } else { set _color [_peek color] } if [info exists ar(link)] { set _link $ar(link) } else { set _link [_peek link] } if [info exists ar(alink)] { set _alink $ar(alink) } else { set _alink [_peek alink] } # push this row's defaults _push color $_color _push bgcolor $_bgcolor _push link $_link _push alink $_alink $_hottext configure -state disabled _push row [expr {[_pop row] + 1}] _pop column _push column 0 } } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/tr # # end table row # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/tr {} { } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_tt # # Show typewriter text, using the font given by -fixedfont # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_tt {} { _push font $_font set _font $itk_option(-fixedfont) set _verbatim 1 _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/tt # # Change back to non-typewriter mode to display text # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/tt {} { set _font [_pop font] set _verbatim 0 _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_u # # display underlined text # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_u {} { incr _underline _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/u # # change back from underlined text # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/u {} { incr _underline -1 _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_ul # # begin unordered list # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_ul {{args {}}} { _parse_fields ar $args if $_left { _entity_br } else { _entity_p } if [info exists ar(id)] { set _anchor($ar(id)) [$itk_component(text) index end] } _push left $_left _push left2 $_left2 if {$_left2 == $_left } { incr _left2 [expr {$_indentincr+3}] } else { incr _left2 $_indentincr } incr _left $_indentincr _push listyle $_listyle _push licount $_licount if [info exists ar(plain)] { set _listyle none } { set _listyle bullet } if [info exists ar(dingbat)] { set ar(src) $ar(dingbat) } _push lipic $_lipic if [info exists ar(src)] { set _listyle picture set _lipic $ar(src) } _set_tag } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/ul # # end unordered list # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/ul {} { set _left [_pop left] set _left2 [_pop left2] set _listyle [_pop listyle] set _licount [_pop licount] set _lipic [_pop lipic] _set_tag _entity_p } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_var # # Display variable # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_var {} { _entity_i } # ------------------------------------------------------------------ # PRIVATE METHOD: _entity_/var # # change state back from variable display # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledhtml::_entity_/var {} { _entity_/i } iwidgets-4.1.0/generic/scrolledlistbox.itk0000644003604700454610000006365107444671010017305 0ustar dgp771div# # Scrolledlistbox # ---------------------------------------------------------------------- # Implements a scrolled listbox with additional options to manage # horizontal and vertical scrollbars. This includes options to control # which scrollbars are displayed and the method, i.e. statically, # dynamically, or none at all. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: scrolledlistbox.itk,v 1.9 2002/03/16 16:25:44 mgbacke Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Scrolledlistbox { keep -activebackground -activerelief -background -borderwidth -cursor \ -elementborderwidth -foreground -highlightcolor -highlightthickness \ -jump -labelfont -selectbackground -selectborderwidth \ -selectforeground -textbackground -textfont -troughcolor } # ------------------------------------------------------------------ # SCROLLEDLISTBOX # ------------------------------------------------------------------ itcl::class iwidgets::Scrolledlistbox { inherit iwidgets::Scrolledwidget constructor {args} {} destructor {} itk_option define -dblclickcommand dblClickCommand Command {} itk_option define -selectioncommand selectionCommand Command {} itk_option define -width width Width 0 itk_option define -height height Height 0 itk_option define -visibleitems visibleItems VisibleItems 20x10 itk_option define -state state State normal public method curselection {} public method activate {index} public method bbox {index} public method clear {} public method see {index} public method index {index} public method delete {first {last {}}} public method get {first {last {}}} public method getcurselection {} public method insert {index args} public method nearest {y} public method scan {option args} public method selection {option first {last {}}} public method size {} public method selecteditemcount {} public method justify {direction} public method sort {{mode ascending}} public method xview {args} public method yview {args} public method itemconfigure {args} protected method _makeSelection {} protected method _dblclick {} protected method _fixIndex {index} # # List the event sequences that invoke single and double selection. # Should these change in the underlying Tk listbox, then they must # change here too. # common doubleSelectSeq { \ } common singleSelectSeq { \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } } # # Provide a lowercased access method for the Scrolledlistbox class. # proc ::iwidgets::scrolledlistbox {pathName args} { uplevel ::iwidgets::Scrolledlistbox $pathName $args } # # Use option database to override default resources of base classes. # option add *Scrolledlistbox.labelPos n widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::constructor {args} { # # Our -width and -height options are slightly different than # those implemented by our base class, so we're going to # remove them and redefine our own. # itk_option remove iwidgets::Scrolledwidget::width itk_option remove iwidgets::Scrolledwidget::height # # Create the listbox. # itk_component add listbox { listbox $itk_interior.listbox \ -width 1 -height 1 \ -xscrollcommand \ [itcl::code $this _scrollWidget $itk_interior.horizsb] \ -yscrollcommand \ [itcl::code $this _scrollWidget $itk_interior.vertsb] } { usual keep -borderwidth -exportselection -relief -selectmode keep -listvariable rename -font -textfont textFont Font rename -background -textbackground textBackground Background rename -highlightbackground -background background Background } grid $itk_component(listbox) -row 0 -column 0 -sticky nsew grid rowconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 0 -weight 1 # # Configure the command on the vertical scroll bar in the base class. # $itk_component(vertsb) configure \ -command [itcl::code $itk_component(listbox) yview] # # Configure the command on the horizontal scroll bar in the base class. # $itk_component(horizsb) configure \ -command [itcl::code $itk_component(listbox) xview] # # Create a set of bindings for monitoring the selection and install # them on the listbox component. # foreach seq $singleSelectSeq { bind SLBSelect$this $seq [itcl::code $this _makeSelection] } foreach seq $doubleSelectSeq { bind SLBSelect$this $seq [itcl::code $this _dblclick] } bindtags $itk_component(listbox) \ [linsert [bindtags $itk_component(listbox)] end SLBSelect$this] # # Also create a set of bindings for disabling the scrolledlistbox. # Since the command for it is "break", we can drop the $this since # they don't need to be unique to the object level. # if {[bind SLBDisabled] == {}} { foreach seq $singleSelectSeq { bind SLBDisabled $seq break } bind SLBDisabled break foreach seq $doubleSelectSeq { bind SLBDisabled $seq break } } # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # DESTURCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::destructor {} { } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -dblclickcommand # # Specify a command to be executed upon double click of a listbox # item. Also, create a couple of bindings used for specific # selection modes # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledlistbox::dblclickcommand {} # ------------------------------------------------------------------ # OPTION: -selectioncommand # # Specifies a command to be executed upon selection of a listbox # item. The command will be called upon each selection regardless # of selection mode.. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledlistbox::selectioncommand {} # ------------------------------------------------------------------ # OPTION: -width # # Specifies the width of the scrolled list box as an entire unit. # The value may be specified in any of the forms acceptable to # Tk_GetPixels. Any additional space needed to display the other # components such as margins and scrollbars force the listbox # to be compressed. A value of zero along with the same value for # the height causes the value given for the visibleitems option # to be applied which administers geometry constraints in a different # manner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledlistbox::width { if {$itk_option(-width) != 0} { set shell [lindex [grid info $itk_component(listbox)] 1] # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $shell]} { grid propagate $shell no } $itk_component(listbox) configure -width 1 $shell configure \ -width [winfo pixels $shell $itk_option(-width)] } else { configure -visibleitems $itk_option(-visibleitems) } } # ------------------------------------------------------------------ # OPTION: -height # # Specifies the height of the scrolled list box as an entire unit. # The value may be specified in any of the forms acceptable to # Tk_GetPixels. Any additional space needed to display the other # components such as margins and scrollbars force the listbox # to be compressed. A value of zero along with the same value for # the width causes the value given for the visibleitems option # to be applied which administers geometry constraints in a different # manner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledlistbox::height { if {$itk_option(-height) != 0} { set shell [lindex [grid info $itk_component(listbox)] 1] # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $shell]} { grid propagate $shell no } $itk_component(listbox) configure -height 1 $shell configure \ -height [winfo pixels $shell $itk_option(-height)] } else { configure -visibleitems $itk_option(-visibleitems) } } # ------------------------------------------------------------------ # OPTION: -visibleitems # # Specified the widthxheight in characters and lines for the listbox. # This option is only administered if the width and height options # are both set to zero, otherwise they take precedence. With the # visibleitems option engaged, geometry constraints are maintained # only on the listbox. The size of the other components such as # labels, margins, and scrollbars, are additive and independent, # effecting the overall size of the scrolled list box. In contrast, # should the width and height options have non zero values, they # are applied to the scrolled list box as a whole. The listbox # is compressed or expanded to maintain the geometry constraints. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledlistbox::visibleitems { if {[regexp {^[0-9]+x[0-9]+$} $itk_option(-visibleitems)]} { if {($itk_option(-width) == 0) && \ ($itk_option(-height) == 0)} { set chars [lindex [split $itk_option(-visibleitems) x] 0] set lines [lindex [split $itk_option(-visibleitems) x] 1] set shell [lindex [grid info $itk_component(listbox)] 1] # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {! [grid propagate $shell]} { grid propagate $shell yes } $itk_component(listbox) configure -width $chars -height $lines } } else { error "bad visibleitems option\ \"$itk_option(-visibleitems)\": should be\ widthxheight" } } # ------------------------------------------------------------------ # OPTION: -state # # Specifies the state of the scrolledlistbox which may be either # disabled or normal. In a disabled state, the scrolledlistbox # does not accept user selection. The default is normal. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledlistbox::state { set tags [bindtags $itk_component(listbox)] # # If the state is normal, then we need to remove the disabled # bindings if they exist. If the state is disabled, then we need # to install the disabled bindings if they haven't been already. # switch -- $itk_option(-state) { normal { $itk_component(listbox) configure \ -foreground $itk_option(-foreground) $itk_component(listbox) configure \ -selectforeground $itk_option(-selectforeground) if {[set index [lsearch $tags SLBDisabled]] != -1} { bindtags $itk_component(listbox) \ [lreplace $tags $index $index] } } disabled { $itk_component(listbox) configure \ -foreground $itk_option(-disabledforeground) $itk_component(listbox) configure \ -selectforeground $itk_option(-disabledforeground) if {[set index [lsearch $tags SLBDisabled]] == -1} { bindtags $itk_component(listbox) \ [linsert $tags 1 SLBDisabled] } } default { error "bad state value \"$itk_option(-state)\":\ must be normal or disabled" } } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: curselection # # Returns a list containing the indices of all the elements in the # listbox that are currently selected. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::curselection {} { return [$itk_component(listbox) curselection] } # ------------------------------------------------------------------ # METHOD: activate index # # Sets the active element to the one indicated by index. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::activate {index} { return [$itk_component(listbox) activate [_fixIndex $index]] } # ------------------------------------------------------------------ # METHOD: bbox index # # Returns four element list describing the bounding box for the list # item at index # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::bbox {index} { return [$itk_component(listbox) bbox [_fixIndex $index]] } # ------------------------------------------------------------------ # METHOD clear # # Clear the listbox area of all items. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::clear {} { delete 0 end } # ------------------------------------------------------------------ # METHOD: see index # # Adjusts the view such that the element given by index is visible. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::see {index} { $itk_component(listbox) see [_fixIndex $index] } # ------------------------------------------------------------------ # METHOD: index index # # Returns the decimal string giving the integer index corresponding # to index. The index value may be a integer number, active, # anchor, end, @x,y, or a pattern. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::index {index} { if {[regexp {(^[0-9]+$)|(^active$)|(^anchor$)|(^end$)|(^@-?[0-9]+,-?[0-9]+$)} $index]} { return [$itk_component(listbox) index $index] } else { set indexValue [lsearch -glob [get 0 end] $index] if {$indexValue == -1} { error "bad Scrolledlistbox index \"$index\": must be active,\ anchor, end, @x,y, number, or a pattern" } return $indexValue } } # ------------------------------------------------------------------ # METHOD: _fixIndex index # # Similar to the regular "index" method, but it only converts # the index to a numerical value if it is a string pattern. If # the index is in the proper form to be used with the listbox, # it is left alone. This fixes problems associated with converting # an index such as "end" to a numerical value. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::_fixIndex {index} { if {[regexp {(^[0-9]+$)|(^active$)|(^anchor$)|(^end$)|(^@[0-9]+,[0-9]+$)} \ $index]} { return $index } else { set indexValue [lsearch -glob [get 0 end] $index] if {$indexValue == -1} { error "bad Scrolledlistbox index \"$index\": must be active,\ anchor, end, @x,y, number, or a pattern" } return $indexValue } } # ------------------------------------------------------------------ # METHOD: delete first ?last? # # Delete one or more elements from list box based on the first and # last index values. Indexes may be a number, active, anchor, end, # @x,y, or a pattern. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::delete {first {last {}}} { set first [_fixIndex $first] if {$last != {}} { set last [_fixIndex $last] } else { set last $first } eval $itk_component(listbox) delete $first $last } # ------------------------------------------------------------------ # METHOD: get first ?last? # # Returns the elements of the listbox indicated by the indexes. # Indexes may be a number, active, anchor, end, @x,y, ora pattern. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::get {first {last {}}} { set first [_fixIndex $first] if {$last != {}} { set last [_fixIndex $last] } if {$last == {}} { return [$itk_component(listbox) get $first] } else { return [$itk_component(listbox) get $first $last] } } # ------------------------------------------------------------------ # METHOD: getcurselection # # Returns the contents of the listbox element indicated by the current # selection indexes. Short cut version of get and curselection # command combination. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::getcurselection {} { set rlist {} if {[selecteditemcount] > 0} { set cursels [$itk_component(listbox) curselection] switch $itk_option(-selectmode) { single - browse { set rlist [$itk_component(listbox) get $cursels] } multiple - extended { foreach sel $cursels { lappend rlist [$itk_component(listbox) get $sel] } } } } return $rlist } # ------------------------------------------------------------------ # METHOD: insert index string ?string ...? # # Insert zero or more elements in the list just before the element # given by index. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::insert {index args} { set index [_fixIndex $index] eval $itk_component(listbox) insert $index $args } # ------------------------------------------------------------------ # METHOD: nearest y # # Given a y-coordinate within the listbox, this command returns the # index of the visible listbox element nearest to that y-coordinate. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::nearest {y} { $itk_component(listbox) nearest $y } # ------------------------------------------------------------------ # METHOD: scan option args # # Implements scanning on listboxes. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::scan {option args} { eval $itk_component(listbox) scan $option $args } # ------------------------------------------------------------------ # METHOD: selection option first ?last? # # Adjusts the selection within the listbox. The index value may be # a integer number, active, anchor, end, @x,y, or a pattern. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::selection {option first {last {}}} { set first [_fixIndex $first] if {$last != {}} { set last [_fixIndex $last] $itk_component(listbox) selection $option $first $last } else { $itk_component(listbox) selection $option $first } } # ------------------------------------------------------------------ # METHOD: size # # Returns a decimal string indicating the total number of elements # in the listbox. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::size {} { return [$itk_component(listbox) size] } # ------------------------------------------------------------------ # METHOD: selecteditemcount # # Returns a decimal string indicating the total number of selected # elements in the listbox. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::selecteditemcount {} { return [llength [$itk_component(listbox) curselection]] } # ------------------------------------------------------------------ # METHOD: justify direction # # Justifies the list scrolled region in one of four directions: top, # bottom, left, or right. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::justify {direction} { switch $direction { left { $itk_component(listbox) xview moveto 0 } right { $itk_component(listbox) xview moveto 1 } top { $itk_component(listbox) yview moveto 0 } bottom { $itk_component(listbox) yview moveto 1 } default { error "bad justify argument \"$direction\": should\ be left, right, top, or bottom" } } } # ------------------------------------------------------------------ # METHOD: sort mode # # Sort the current list. This can take any sort switch from # the lsort command: ascii, integer, real, command, # increasing/ascending, decreasing/descending, etc. # # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::sort {{mode ascending}} { set vals [$itk_component(listbox) get 0 end] if {[llength $vals] == 0} {return} switch $mode { ascending {set mode increasing} descending {set mode decreasing} } $itk_component(listbox) delete 0 end if {[catch {eval $itk_component(listbox) insert end \ [lsort -${mode} $vals]} errorstring]} { error "bad sort argument \"$mode\": must be a valid argument to the\ Tcl lsort command" } return } # ------------------------------------------------------------------ # METHOD: xview args # # Change or query the vertical position of the text in the list box. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::xview {args} { return [eval $itk_component(listbox) xview $args] } # ------------------------------------------------------------------ # METHOD: yview args # # Change or query the horizontal position of the text in the list box. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::yview {args} { return [eval $itk_component(listbox) yview $args] } # ------------------------------------------------------------------ # METHOD: itemconfigure args # # This is a wrapper method around the new tk8.3 itemconfigure command # for the listbox. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::itemconfigure {args} { return [eval $itk_component(listbox) itemconfigure $args] } # ------------------------------------------------------------------ # PROTECTED METHOD: _makeSelection # # Evaluate the selection command. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::_makeSelection {} { uplevel #0 $itk_option(-selectioncommand) } # ------------------------------------------------------------------ # PROTECTED METHOD: _dblclick # # Evaluate the double click command option if not empty. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledlistbox::_dblclick {} { uplevel #0 $itk_option(-dblclickcommand) } iwidgets-4.1.0/generic/scrolledtext.itk0000644003604700454610000004360107537260565016612 0ustar dgp771div# # Scrolledtext # ---------------------------------------------------------------------- # Implements a scrolled text widget with additional options to manage # the vertical scrollbar. This includes options to control the method # in which the scrollbar is displayed, i.e. statically or dynamically. # Options also exist for adding a label to the scrolled text area and # controlling its position. Import/export of methods are provided for # file I/O. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: scrolledtext.itk,v 1.5 2002/09/10 03:05:25 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Scrolledtext { keep -activebackground -activerelief -background -borderwidth -cursor \ -elementborderwidth -foreground -highlightcolor -highlightthickness \ -insertbackground -insertborderwidth -insertofftime -insertontime \ -insertwidth -jump -labelfont -selectbackground -selectborderwidth \ -selectforeground -textbackground -textfont -troughcolor } # ------------------------------------------------------------------ # SCROLLEDTEXT # ------------------------------------------------------------------ itcl::class iwidgets::Scrolledtext { inherit iwidgets::Scrolledwidget constructor {args} {} destructor {} itk_option define -width width Width 0 itk_option define -height height Height 0 itk_option define -visibleitems visibleItems VisibleItems 80x24 public method bbox {index} public method childsite {} public method clear {} public method import {filename {index end}} public method export {filename} public method compare {index1 op index2} public method debug {args} public method delete {first {last {}}} public method dlineinfo {index} public method get {index1 {index2 {}}} public method image {option args} public method index {index} public method insert {args} public method mark {option args} public method scan {option args} public method search {args} public method see {index} public method tag {option args} public method window {option args} public method xview {args} public method yview {args} } # # Provide a lowercased access method for the Scrolledtext class. # proc ::iwidgets::scrolledtext {pathName args} { uplevel ::iwidgets::Scrolledtext $pathName $args } # # Use option database to override default resources of base classes. # option add *Scrolledtext.labelPos n widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::constructor {args} { # # Our -width and -height options are slightly different than # those implemented by our base class, so we're going to # remove them and redefine our own. # itk_option remove iwidgets::Scrolledwidget::width itk_option remove iwidgets::Scrolledwidget::height # # Create a clipping frame which will provide the border for # relief display. # itk_component add clipper { frame $itk_interior.clipper } { usual keep -borderwidth -relief -highlightthickness -highlightcolor rename -highlightbackground -background background Background } grid $itk_component(clipper) -row 0 -column 0 -sticky nsew grid rowconfigure $_interior 0 -weight 1 grid columnconfigure $_interior 0 -weight 1 # # Create the text area. # itk_component add text { text $itk_component(clipper).text \ -width 1 -height 1 \ -xscrollcommand \ [itcl::code $this _scrollWidget $itk_interior.horizsb] \ -yscrollcommand \ [itcl::code $this _scrollWidget $itk_interior.vertsb] \ -borderwidth 0 -highlightthickness 0 } { usual ignore -highlightthickness -highlightcolor -borderwidth keep -exportselection -padx -pady -setgrid \ -spacing1 -spacing2 -spacing3 -state -tabs -wrap rename -font -textfont textFont Font rename -background -textbackground textBackground Background } grid $itk_component(text) -row 0 -column 0 -sticky nsew grid rowconfigure $itk_component(clipper) 0 -weight 1 grid columnconfigure $itk_component(clipper) 0 -weight 1 # # Configure the command on the vertical scroll bar in the base class. # $itk_component(vertsb) configure \ -command [itcl::code $itk_component(text) yview] # # Configure the command on the horizontal scroll bar in the base class. # $itk_component(horizsb) configure \ -command [itcl::code $itk_component(text) xview] # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # DESTURCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::destructor {} { } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -width # # Specifies the width of the scrolled text as an entire unit. # The value may be specified in any of the forms acceptable to # Tk_GetPixels. Any additional space needed to display the other # components such as labels, margins, and scrollbars force the text # to be compressed. A value of zero along with the same value for # the height causes the value given for the visibleitems option # to be applied which administers geometry constraints in a different # manner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledtext::width { if {$itk_option(-width) != 0} { set shell [lindex [grid info $itk_component(clipper)] 1] # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $shell]} { grid propagate $shell no } $itk_component(text) configure -width 1 $shell configure \ -width [winfo pixels $shell $itk_option(-width)] } else { configure -visibleitems $itk_option(-visibleitems) } } # ------------------------------------------------------------------ # OPTION: -height # # Specifies the height of the scrolled text as an entire unit. # The value may be specified in any of the forms acceptable to # Tk_GetPixels. Any additional space needed to display the other # components such as labels, margins, and scrollbars force the text # to be compressed. A value of zero along with the same value for # the width causes the value given for the visibleitems option # to be applied which administers geometry constraints in a different # manner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledtext::height { if {$itk_option(-height) != 0} { set shell [lindex [grid info $itk_component(clipper)] 1] # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $shell]} { grid propagate $shell no } $itk_component(text) configure -height 1 $shell configure \ -height [winfo pixels $shell $itk_option(-height)] } else { configure -visibleitems $itk_option(-visibleitems) } } # ------------------------------------------------------------------ # OPTION: -visibleitems # # Specified the widthxheight in characters and lines for the text. # This option is only administered if the width and height options # are both set to zero, otherwise they take precedence. With the # visibleitems option engaged, geometry constraints are maintained # only on the text. The size of the other components such as # labels, margins, and scroll bars, are additive and independent, # effecting the overall size of the scrolled text. In contrast, # should the width and height options have non zero values, they # are applied to the scrolled text as a whole. The text is # compressed or expanded to maintain the geometry constraints. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledtext::visibleitems { if {[regexp {^[0-9]+x[0-9]+$} $itk_option(-visibleitems)]} { if {($itk_option(-width) == 0) && \ ($itk_option(-height) == 0)} { set chars [lindex [split $itk_option(-visibleitems) x] 0] set lines [lindex [split $itk_option(-visibleitems) x] 1] set shell [lindex [grid info $itk_component(clipper)] 1] # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {! [grid propagate $shell]} { grid propagate $shell yes } $itk_component(text) configure -width $chars -height $lines } } else { error "bad visibleitems option\ \"$itk_option(-visibleitems)\": should be\ widthxheight" } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Returns the path name of the child site widget. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::childsite {} { return $itk_component(text) } # ------------------------------------------------------------------ # METHOD: bbox index # # Returns four element list describing the bounding box for the list # item at index # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::bbox {index} { return [$itk_component(text) bbox $index] } # ------------------------------------------------------------------ # METHOD clear # # Clear the text area. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::clear {} { $itk_component(text) delete 1.0 end } # ------------------------------------------------------------------ # METHOD import filename # # Load text from an existing file (import filename) # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::import {filename {index end}} { set f [open $filename r] insert $index [read $f] close $f } # ------------------------------------------------------------------ # METHOD export filename # # write text to a file (export filename) # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::export {filename} { set f [open $filename w] set txt [$itk_component(text) get 1.0 end] puts $f $txt flush $f close $f } # ------------------------------------------------------------------ # METHOD compare index1 op index2 # # Compare indices according to relational operator. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::compare {index1 op index2} { return [$itk_component(text) compare $index1 $op $index2] } # ------------------------------------------------------------------ # METHOD debug ?boolean? # # Activates consistency checks in B-tree code associated with text # widgets. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::debug {args} { eval $itk_component(text) debug $args } # ------------------------------------------------------------------ # METHOD delete first ?last? # # Delete a range of characters from the text. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::delete {first {last {}}} { $itk_component(text) delete $first $last } # ------------------------------------------------------------------ # METHOD dlineinfo index # # Returns a five element list describing the area occupied by the # display line containing index. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::dlineinfo {index} { return [$itk_component(text) dlineinfo $index] } # ------------------------------------------------------------------ # METHOD get index1 ?index2? # # Return text from start index to end index. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::get {index1 {index2 {}}} { return [$itk_component(text) get $index1 $index2] } # ------------------------------------------------------------------ # METHOD image option ?arg arg ...? # # Manipulate images dependent on options. # # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::image {option args} { return [eval $itk_component(text) image $option $args] } # ------------------------------------------------------------------ # METHOD index index # # Return position corresponding to index. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::index {index} { return [$itk_component(text) index $index] } # ------------------------------------------------------------------ # METHOD insert index chars ?tagList? # # Insert text at index. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::insert {args} { eval $itk_component(text) insert $args } # ------------------------------------------------------------------ # METHOD mark option ?arg arg ...? # # Manipulate marks dependent on options. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::mark {option args} { return [eval $itk_component(text) mark $option $args] } # ------------------------------------------------------------------ # METHOD scan option args # # Implements scanning on texts. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::scan {option args} { eval $itk_component(text) scan $option $args } # ------------------------------------------------------------------ # METHOD search ?switches? pattern index ?varName? # # Searches the text for characters matching a pattern. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::search {args} { #----------------------------------------------------------- # BUG FIX: csmith (Chad Smith: csmith@adc.com), 11/18/99 #----------------------------------------------------------- # Need to run this command up one level on the stack since # the text widget may modify one of the arguments, which is # the case when -count is specified. #----------------------------------------------------------- return [uplevel eval $itk_component(text) search $args] } # ------------------------------------------------------------------ # METHOD see index # # Adjusts the view in the window so the character at index is # visible. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::see {index} { $itk_component(text) see $index } # ------------------------------------------------------------------ # METHOD tag option ?arg arg ...? # # Manipulate tags dependent on options. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::tag {option args} { return [eval $itk_component(text) tag $option $args] } # ------------------------------------------------------------------ # METHOD window option ?arg arg ...? # # Manipulate embedded windows. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::window {option args} { return [eval $itk_component(text) window $option $args] } # ------------------------------------------------------------------ # METHOD xview # # Changes x view in widget's window. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::xview {args} { return [eval $itk_component(text) xview $args] } # ------------------------------------------------------------------ # METHOD yview # # Changes y view in widget's window. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledtext::yview {args} { return [eval $itk_component(text) yview $args] } iwidgets-4.1.0/generic/scrolledwidget.itk0000644003604700454610000002776507334044000017101 0ustar dgp771div# # Scrolledwidget # ---------------------------------------------------------------------- # Implements a general purpose base class for scrolled widgets, by # creating the necessary horizontal and vertical scrollbars and # providing protected methods for controlling their display. The # derived class needs to take advantage of the fact that the grid # is used and the vertical scrollbar is in row 0, column 2 and the # horizontal scrollbar in row 2, column 0. # # ---------------------------------------------------------------------- # AUTHOR: Mark Ulferts mulferts@austin.dsccc.com # # @(#) $Id: scrolledwidget.itk,v 1.2 2001/08/07 19:56:48 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Scrolledwidget { keep -background -borderwidth -cursor -highlightcolor -highlightthickness keep -activebackground -activerelief -jump -troughcolor keep -labelfont -foreground } # ------------------------------------------------------------------ # SCROLLEDWIDGET # ------------------------------------------------------------------ itcl::class iwidgets::Scrolledwidget { inherit iwidgets::Labeledwidget constructor {args} {} destructor {} itk_option define -sbwidth sbWidth Width 15 itk_option define -scrollmargin scrollMargin ScrollMargin 3 itk_option define -vscrollmode vscrollMode VScrollMode static itk_option define -hscrollmode hscrollMode HScrollMode static itk_option define -width width Width 30 itk_option define -height height Height 30 protected method _scrollWidget {wid first last} protected method _vertScrollbarDisplay {mode} protected method _horizScrollbarDisplay {mode} protected method _configureEvent {} protected variable _vmode off ;# Vertical scroll mode protected variable _hmode off ;# Vertical scroll mode protected variable _recheckHoriz 1 ;# Flag to check need for ;# horizontal scrollbar protected variable _recheckVert 1 ;# Flag to check need for ;# vertical scrollbar protected variable _interior {} } # # Provide a lowercased access method for the Scrolledwidget class. # proc ::iwidgets::scrolledwidget {pathName args} { uplevel ::iwidgets::Scrolledwidget $pathName $args } # # Use option database to override default resources of base classes. # option add *Scrolledwidget.labelPos n widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledwidget::constructor {args} { # # Turn off the borderwidth on the hull and save off the # interior for later use. # component hull configure -borderwidth 0 set _interior $itk_interior # # Check if the scrollbars need mapping upon a configure event. # bind $_interior [itcl::code $this _configureEvent] # # Turn off propagation in the containing shell. # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $_interior]} { grid propagate $_interior no } # # Create the vertical scroll bar # itk_component add vertsb { scrollbar $itk_interior.vertsb -orient vertical } { usual keep -borderwidth -elementborderwidth -jump -relief rename -highlightbackground -background background Background } # # Create the horizontal scrollbar # itk_component add horizsb { scrollbar $itk_interior.horizsb -orient horizontal } { usual keep -borderwidth -elementborderwidth -jump -relief rename -highlightbackground -background background Background } # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # DESTURCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledwidget::destructor {} { } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -sbwidth # # Set the width of the scrollbars. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledwidget::sbwidth { $itk_component(vertsb) configure -width $itk_option(-sbwidth) $itk_component(horizsb) configure -width $itk_option(-sbwidth) } # ------------------------------------------------------------------ # OPTION: -scrollmargin # # Set the distance between the scrollbars and the list box. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledwidget::scrollmargin { set pixels [winfo pixels $_interior $itk_option(-scrollmargin)] if {$_hmode == "on"} { grid rowconfigure $_interior 1 -minsize $pixels } if {$_vmode == "on"} { grid columnconfigure $_interior 1 -minsize $pixels } } # ------------------------------------------------------------------ # OPTION: -vscrollmode # # Enable/disable display and mode of veritcal scrollbars. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledwidget::vscrollmode { switch $itk_option(-vscrollmode) { static { _vertScrollbarDisplay on } dynamic - none { _vertScrollbarDisplay off } default { error "bad vscrollmode option\ \"$itk_option(-vscrollmode)\": should be\ static, dynamic, or none" } } } # ------------------------------------------------------------------ # OPTION: -hscrollmode # # Enable/disable display and mode of horizontal scrollbars. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledwidget::hscrollmode { switch $itk_option(-hscrollmode) { static { _horizScrollbarDisplay on } dynamic - none { _horizScrollbarDisplay off } default { error "bad hscrollmode option\ \"$itk_option(-hscrollmode)\": should be\ static, dynamic, or none" } } } # ------------------------------------------------------------------ # OPTION: -width # # Specifies the width of the scrolled widget. The value may be # specified in any of the forms acceptable to Tk_GetPixels. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledwidget::width { $_interior configure -width \ [winfo pixels $_interior $itk_option(-width)] } # ------------------------------------------------------------------ # OPTION: -height # # Specifies the height of the scrolled widget. The value may be # specified in any of the forms acceptable to Tk_GetPixels. # ------------------------------------------------------------------ itcl::configbody iwidgets::Scrolledwidget::height { $_interior configure -height \ [winfo pixels $_interior $itk_option(-height)] } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # PROTECTED METHOD: _vertScrollbarDisplay mode # # Displays the vertical scrollbar based on the input mode. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledwidget::_vertScrollbarDisplay {mode} { switch $mode { on { set _vmode on grid columnconfigure $_interior 1 -minsize \ [winfo pixels $_interior $itk_option(-scrollmargin)] grid $itk_component(vertsb) -row 0 -column 2 -sticky ns } off { set _vmode off grid columnconfigure $_interior 1 -minsize 0 grid forget $itk_component(vertsb) } default { error "invalid argument \"$mode\": should be on or off" } } } # ------------------------------------------------------------------ # PROTECTED METHOD: _horizScrollbarDisplay mode # # Displays the horizontal scrollbar based on the input mode. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledwidget::_horizScrollbarDisplay {mode} { switch $mode { on { set _hmode on grid rowconfigure $_interior 1 -minsize \ [winfo pixels $_interior $itk_option(-scrollmargin)] grid $itk_component(horizsb) -row 2 -column 0 -sticky ew } off { set _hmode off grid rowconfigure $_interior 1 -minsize 0 grid forget $itk_component(horizsb) } default { error "invalid argument \"$mode\": should be on or off" } } } # ------------------------------------------------------------------ # PROTECTED METHOD: _scrollWidget wid first last # # Performs scrolling and display of scrollbars based on the total # and maximum frame size as well as the current -vscrollmode and # -hscrollmode settings. Parameters are automatic scroll parameters. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledwidget::_scrollWidget {wid first last} { $wid set $first $last if {$wid == $itk_component(vertsb)} { if {$itk_option(-vscrollmode) == "dynamic"} { if {($_recheckVert != 1) && ($_vmode == "on")} { return } else { set _recheckVert 0 } if {($first == 0) && ($last == 1)} { if {$_vmode != "off"} { _vertScrollbarDisplay off } } else { if {$_vmode != "on"} { _vertScrollbarDisplay on } } } } elseif {$wid == $itk_component(horizsb)} { if {$itk_option(-hscrollmode) == "dynamic"} { if {($_recheckHoriz != 1) && ($_hmode == "on")} { return } else { set _recheckHoriz 0 } if {($first == 0) && ($last == 1)} { if {$_hmode != "off"} { _horizScrollbarDisplay off } } else { if {$_hmode != "on"} { _horizScrollbarDisplay on } } } } } # ------------------------------------------------------------------ # PROTECTED METHOD: _configureEvent # # Resets the recheck flags which determine if we'll try and map # the scrollbars in dynamic mode. # ------------------------------------------------------------------ itcl::body iwidgets::Scrolledwidget::_configureEvent {} { update idletasks set _recheckVert 1 set _recheckHoriz 1 } iwidgets-4.1.0/generic/selectionbox.itk0000644003604700454610000004532107334044000016550 0ustar dgp771div# # Selectionbox # ---------------------------------------------------------------------- # Implements a selection box composed of a scrolled list of items and # a selection entry field. The user may choose any of the items displayed # in the scrolled list of alternatives and the selection field will be # filled with the choice. The user is also free to enter a new value in # the selection entry field. Both the list and entry areas have labels. # A child site is also provided in which the user may create other widgets # to be used in conjunction with the selection box. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: selectionbox.itk,v 1.2 2001/08/07 19:56:48 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Selectionbox { keep -activebackground -activerelief -background -borderwidth -cursor \ -elementborderwidth -foreground -highlightcolor -highlightthickness \ -insertbackground -insertborderwidth -insertofftime -insertontime \ -insertwidth -jump -labelfont -selectbackground -selectborderwidth \ -selectforeground -textbackground -textfont -troughcolor } # ------------------------------------------------------------------ # SELECTIONBOX # ------------------------------------------------------------------ itcl::class iwidgets::Selectionbox { inherit itk::Widget constructor {args} {} destructor {} itk_option define -childsitepos childSitePos Position center itk_option define -margin margin Margin 7 itk_option define -itemson itemsOn ItemsOn true itk_option define -selectionon selectionOn SelectionOn true itk_option define -width width Width 260 itk_option define -height height Height 320 public method childsite {} public method get {} public method curselection {} public method clear {component} public method insert {component index args} public method delete {first {last {}}} public method size {} public method scan {option args} public method nearest {y} public method index {index} public method selection {option args} public method selectitem {} private method _packComponents {{when later}} private variable _repacking {} ;# non-null => _packComponents pending } # # Provide a lowercased access method for the Selectionbox class. # proc ::iwidgets::selectionbox {pathName args} { uplevel ::iwidgets::Selectionbox $pathName $args } # # Use option database to override default resources of base classes. # option add *Selectionbox.itemsLabel Items widgetDefault option add *Selectionbox.selectionLabel Selection widgetDefault option add *Selectionbox.width 260 widgetDefault option add *Selectionbox.height 320 widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::constructor {args} { # # Set the borderwidth to zero and add width and height options # back to the hull. # component hull configure -borderwidth 0 itk_option add hull.width hull.height # # Create the child site widget. # itk_component add -protected sbchildsite { frame $itk_interior.sbchildsite } # # Create the items list. # itk_component add items { iwidgets::Scrolledlistbox $itk_interior.items -selectmode single \ -visibleitems 20x10 -labelpos nw -vscrollmode static \ -hscrollmode none } { usual keep -dblclickcommand -exportselection rename -labeltext -itemslabel itemsLabel Text rename -selectioncommand -itemscommand itemsCommand Command } configure -itemscommand [itcl::code $this selectitem] # # Create the selection entry. # itk_component add selection { iwidgets::Entryfield $itk_interior.selection -labelpos nw } { usual keep -exportselection rename -labeltext -selectionlabel selectionLabel Text rename -command -selectioncommand selectionCommand Command } # # Set the interior to the childsite for derived classes. # set itk_interior $itk_component(sbchildsite) # # Initialize the widget based on the command line options. # eval itk_initialize $args # # When idle, pack the components. # _packComponents } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::destructor {} { if {$_repacking != ""} {after cancel $_repacking} } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -childsitepos # # Specifies the position of the child site in the selection box. # ------------------------------------------------------------------ itcl::configbody iwidgets::Selectionbox::childsitepos { _packComponents } # ------------------------------------------------------------------ # OPTION: -margin # # Specifies distance between the items list and selection entry. # ------------------------------------------------------------------ itcl::configbody iwidgets::Selectionbox::margin { _packComponents } # ------------------------------------------------------------------ # OPTION: -itemson # # Specifies whether or not to display the items list. # ------------------------------------------------------------------ itcl::configbody iwidgets::Selectionbox::itemson { _packComponents } # ------------------------------------------------------------------ # OPTION: -selectionon # # Specifies whether or not to display the selection entry widget. # ------------------------------------------------------------------ itcl::configbody iwidgets::Selectionbox::selectionon { _packComponents } # ------------------------------------------------------------------ # OPTION: -width # # Specifies the width of the hull. The value may be specified in # any of the forms acceptable to Tk_GetPixels. A value of zero # causes the width to be adjusted to the required value based on # the size requests of the components. Otherwise, the width is # fixed. # ------------------------------------------------------------------ itcl::configbody iwidgets::Selectionbox::width { # # The width option was added to the hull in the constructor. # So, any width value given is passed automatically to the # hull. All we have to do is play with the propagation. # if {$itk_option(-width) != 0} { set propagate 0 } else { set propagate 1 } # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $itk_component(hull)] != $propagate} { grid propagate $itk_component(hull) $propagate } } # ------------------------------------------------------------------ # OPTION: -height # # Specifies the height of the hull. The value may be specified in # any of the forms acceptable to Tk_GetPixels. A value of zero # causes the height to be adjusted to the required value based on # the size requests of the components. Otherwise, the height is # fixed. # ------------------------------------------------------------------ itcl::configbody iwidgets::Selectionbox::height { # # The height option was added to the hull in the constructor. # So, any height value given is passed automatically to the # hull. All we have to do is play with the propagation. # if {$itk_option(-height) != 0} { set propagate 0 } else { set propagate 1 } # # Due to a bug in the tk4.2 grid, we have to check the # propagation before setting it. Setting it to the same # value it already is will cause it to toggle. # if {[grid propagate $itk_component(hull)] != $propagate} { grid propagate $itk_component(hull) $propagate } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Returns the path name of the child site widget. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::childsite {} { return $itk_component(sbchildsite) } # ------------------------------------------------------------------ # METHOD: get # # Returns the current selection. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::get {} { return [$itk_component(selection) get] } # ------------------------------------------------------------------ # METHOD: curselection # # Returns the current selection index. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::curselection {} { return [$itk_component(items) curselection] } # ------------------------------------------------------------------ # METHOD: clear component # # Delete the contents of either the selection entry widget or items # list. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::clear {component} { switch $component { selection { $itk_component(selection) clear } items { delete 0 end } default { error "bad clear argument \"$component\": should be\ selection or items" } } } # ------------------------------------------------------------------ # METHOD: insert component index args # # Insert element(s) into either the selection or items list widget. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::insert {component index args} { switch $component { selection { eval $itk_component(selection) insert $index $args } items { eval $itk_component(items) insert $index $args } default { error "bad insert argument \"$component\": should be\ selection or items" } } } # ------------------------------------------------------------------ # METHOD: delete first ?last? # # Delete one or more elements from the items list box. The default # is to delete by indexed range. If an item is to be removed by name, # it must be preceeded by the keyword "item". Only index numbers can # be used to delete a range of items. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::delete {first {last {}}} { set first [index $first] if {$last != {}} { set last [index $last] } else { set last $first } if {$first <= $last} { eval $itk_component(items) delete $first $last } else { error "first index must not be greater than second" } } # ------------------------------------------------------------------ # METHOD: size # # Returns a decimal string indicating the total number of elements # in the items list. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::size {} { return [$itk_component(items) size] } # ------------------------------------------------------------------ # METHOD: scan option args # # Implements scanning on items list. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::scan {option args} { eval $itk_component(items) scan $option $args } # ------------------------------------------------------------------ # METHOD: nearest y # # Returns the index to the nearest listbox item given a y coordinate. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::nearest {y} { return [$itk_component(items) nearest $y] } # ------------------------------------------------------------------ # METHOD: index index # # Returns the decimal string giving the integer index corresponding # to index. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::index {index} { return [$itk_component(items) index $index] } # ------------------------------------------------------------------ # METHOD: selection option args # # Adjusts the selection within the items list. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::selection {option args} { eval $itk_component(items) selection $option $args selectitem } # ------------------------------------------------------------------ # METHOD: selectitem # # Replace the selection entry field contents with the currently # selected items value. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::selectitem {} { $itk_component(selection) clear set numSelected [$itk_component(items) selecteditemcount] if {$numSelected == 1} { $itk_component(selection) insert end \ [$itk_component(items) getcurselection] } elseif {$numSelected > 1} { $itk_component(selection) insert end \ [lindex [$itk_component(items) getcurselection] 0] } $itk_component(selection) icursor end } # ------------------------------------------------------------------ # PRIVATE METHOD: _packComponents ?when? # # Pack the selection, items, and child site widgets based on options. # If "when" is "now", the change is applied immediately. If it is # "later" or it is not specified, then the change is applied later, # when the application is idle. # ------------------------------------------------------------------ itcl::body iwidgets::Selectionbox::_packComponents {{when later}} { if {$when == "later"} { if {$_repacking == ""} { set _repacking [after idle [itcl::code $this _packComponents now]] } return } elseif {$when != "now"} { error "bad option \"$when\": should be now or later" } set _repacking "" set parent [winfo parent $itk_component(sbchildsite)] set margin [winfo pixels $itk_component(hull) $itk_option(-margin)] switch $itk_option(-childsitepos) { n { grid $itk_component(sbchildsite) -row 0 -column 0 \ -sticky nsew -rowspan 1 grid $itk_component(items) -row 1 -column 0 -sticky nsew grid $itk_component(selection) -row 3 -column 0 -sticky ew grid rowconfigure $parent 0 -weight 0 -minsize 0 grid rowconfigure $parent 1 -weight 1 -minsize 0 grid rowconfigure $parent 2 -weight 0 -minsize $margin grid rowconfigure $parent 3 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 1 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize 0 } w { grid $itk_component(sbchildsite) -row 0 -column 0 \ -sticky nsew -rowspan 3 grid $itk_component(items) -row 0 -column 1 -sticky nsew grid $itk_component(selection) -row 2 -column 1 -sticky ew grid rowconfigure $parent 0 -weight 1 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize $margin grid rowconfigure $parent 2 -weight 0 -minsize 0 grid rowconfigure $parent 3 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 0 -minsize 0 grid columnconfigure $parent 1 -weight 1 -minsize 0 } s { grid $itk_component(items) -row 0 -column 0 -sticky nsew grid $itk_component(selection) -row 2 -column 0 -sticky ew grid $itk_component(sbchildsite) -row 3 -column 0 \ -sticky nsew -rowspan 1 grid rowconfigure $parent 0 -weight 1 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize $margin grid rowconfigure $parent 2 -weight 0 -minsize 0 grid rowconfigure $parent 3 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 1 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize 0 } e { grid $itk_component(items) -row 0 -column 0 -sticky nsew grid $itk_component(selection) -row 2 -column 0 -sticky ew grid $itk_component(sbchildsite) -row 0 -column 1 \ -sticky nsew -rowspan 3 grid rowconfigure $parent 0 -weight 1 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize $margin grid rowconfigure $parent 2 -weight 0 -minsize 0 grid rowconfigure $parent 3 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 1 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize 0 } center { grid $itk_component(items) -row 0 -column 0 -sticky nsew grid $itk_component(sbchildsite) -row 1 -column 0 \ -sticky nsew -rowspan 1 grid $itk_component(selection) -row 3 -column 0 -sticky ew grid rowconfigure $parent 0 -weight 1 -minsize 0 grid rowconfigure $parent 1 -weight 0 -minsize 0 grid rowconfigure $parent 2 -weight 0 -minsize $margin grid rowconfigure $parent 3 -weight 0 -minsize 0 grid columnconfigure $parent 0 -weight 1 -minsize 0 grid columnconfigure $parent 1 -weight 0 -minsize 0 } default { error "bad childsitepos option \"$itk_option(-childsitepos)\":\ should be n, e, s, w, or center" } } if {$itk_option(-itemson)} { } else { grid forget $itk_component(items) } if {$itk_option(-selectionon)} { } else { grid forget $itk_component(selection) } raise $itk_component(sbchildsite) } iwidgets-4.1.0/generic/selectiondialog.itk0000644003604700454610000002056407334044000017221 0ustar dgp771div# # Selectiondialog # ---------------------------------------------------------------------- # Implements a selection box similar to the OSF/Motif standard selection # dialog composite widget. The Selectiondialog is derived from the # Dialog class and is composed of a SelectionBox with attributes to # manipulate the dialog buttons. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # # @(#) $Id: selectiondialog.itk,v 1.2 2001/08/07 19:56:48 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Selectiondialog { keep -activebackground -activerelief -background -borderwidth -cursor \ -elementborderwidth -foreground -highlightcolor -highlightthickness \ -insertbackground -insertborderwidth -insertofftime -insertontime \ -insertwidth -jump -labelfont -modality -selectbackground \ -selectborderwidth -selectforeground -textbackground -textfont \ -troughcolor } # ------------------------------------------------------------------ # SELECTIONDIALOG # ------------------------------------------------------------------ itcl::class iwidgets::Selectiondialog { inherit iwidgets::Dialog constructor {args} {} public method childsite {} public method get {} public method curselection {} public method clear {component} public method insert {component index args} public method delete {first {last {}}} public method size {} public method scan {option args} public method nearest {y} public method index {index} public method selection {option args} public method selectitem {} } # # Provide a lowercased access method for the Selectiondialog class. # proc ::iwidgets::selectiondialog {pathName args} { uplevel ::iwidgets::Selectiondialog $pathName $args } # # Use option database to override default resources of base classes. # option add *Selectiondialog.title "Selection Dialog" widgetDefault option add *Selectiondialog.master "." widgetDefault # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::constructor {args} { # # Set the borderwidth to zero. # component hull configure -borderwidth 0 # # Instantiate a selection box widget. # itk_component add selectionbox { iwidgets::Selectionbox $itk_interior.selectionbox \ -dblclickcommand [itcl::code $this invoke] } { usual keep -childsitepos -exportselection -itemscommand -itemslabel \ -itemson -selectionlabel -selectionon -selectioncommand } configure -itemscommand [itcl::code $this selectitem] pack $itk_component(selectionbox) -fill both -expand yes set itk_interior [$itk_component(selectionbox) childsite] hide Help eval itk_initialize $args } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Thinwrapped method of selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::childsite {} { return [$itk_component(selectionbox) childsite] } # ------------------------------------------------------------------ # METHOD: get # # Thinwrapped method of selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::get {} { return [$itk_component(selectionbox) get] } # ------------------------------------------------------------------ # METHOD: curselection # # Thinwrapped method of selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::curselection {} { return [$itk_component(selectionbox) curselection] } # ------------------------------------------------------------------ # METHOD: clear component # # Thinwrapped method of selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::clear {component} { $itk_component(selectionbox) clear $component return } # ------------------------------------------------------------------ # METHOD: insert component index args # # Thinwrapped method of selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::insert {component index args} { eval $itk_component(selectionbox) insert $component $index $args return } # ------------------------------------------------------------------ # METHOD: delete first ?last? # # Thinwrapped method of selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::delete {first {last {}}} { $itk_component(selectionbox) delete $first $last return } # ------------------------------------------------------------------ # METHOD: size # # Thinwrapped method of selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::size {} { return [$itk_component(selectionbox) size] } # ------------------------------------------------------------------ # METHOD: scan option args # # Thinwrapped method of selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::scan {option args} { return [eval $itk_component(selectionbox) scan $option $args] } # ------------------------------------------------------------------ # METHOD: nearest y # # Thinwrapped method of selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::nearest {y} { return [$itk_component(selectionbox) nearest $y] } # ------------------------------------------------------------------ # METHOD: index index # # Thinwrapped method of selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::index {index} { return [$itk_component(selectionbox) index $index] } # ------------------------------------------------------------------ # METHOD: selection option args # # Thinwrapped method of selection box class. # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::selection {option args} { eval $itk_component(selectionbox) selection $option $args } # ------------------------------------------------------------------ # METHOD: selectitem # # Set the default button to ok and select the item. # ------------------------------------------------------------------ itcl::body iwidgets::Selectiondialog::selectitem {} { default OK $itk_component(selectionbox) selectitem } iwidgets-4.1.0/generic/shell.itk0000644003604700454610000003217210633051150015161 0ustar dgp771div# Shell # ---------------------------------------------------------------------- # This class is implements a shell which is a top level widget # giving a childsite and providing activate, deactivate, and center # methods. # # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com # Kris Raney EMAIL: kraney@spd.dsccc.com # # @(#) $Id: shell.itk,v 1.9 2007/06/10 19:35:04 hobbs Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1996 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Shell { keep -background -cursor -modality } # ------------------------------------------------------------------ # SHELL # ------------------------------------------------------------------ itcl::class iwidgets::Shell { inherit itk::Toplevel constructor {args} {} itk_option define -master master Window "" itk_option define -modality modality Modality none itk_option define -padx padX Pad 0 itk_option define -pady padY Pad 0 itk_option define -width width Width 0 itk_option define -height height Height 0 public method childsite {} public method activate {} public method deactivate {args} public method center {{widget {}}} protected variable _result {} ;# Resultant value for modal activation. private variable _busied {} ;# List of busied top level widgets. common grabstack {} common _wait } # # Provide a lowercased access method for the Shell class. # proc ::iwidgets::shell {pathName args} { uplevel ::iwidgets::Shell $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Shell::constructor {args} { itk_option add hull.width hull.height # # Maintain a withdrawn state until activated. # wm withdraw $itk_component(hull) # # Create the user child site # itk_component add -protected shellchildsite { frame $itk_interior.shellchildsite } pack $itk_component(shellchildsite) -fill both -expand yes # # Set the itk_interior variable to be the childsite for derived # classes. # set itk_interior $itk_component(shellchildsite) # # Bind the window manager delete protocol to deactivation of the # widget. This can be overridden by the user via the execution # of a similar command outside the class. # wm protocol $itk_component(hull) WM_DELETE_WINDOW [itcl::code $this deactivate] # # Initialize the widget based on the command line options. # eval itk_initialize $args } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -master # # Specifies the master window for the shell. The window manager is # informed that the shell is a transient window whose master is # -masterwindow. # ------------------------------------------------------------------ itcl::configbody iwidgets::Shell::master {} # ------------------------------------------------------------------ # OPTION: -modality # # Specify the modality of the dialog. # ------------------------------------------------------------------ itcl::configbody iwidgets::Shell::modality { switch $itk_option(-modality) { none - application - global { } default { error "bad modality option \"$itk_option(-modality)\":\ should be none, application, or global" } } } # ------------------------------------------------------------------ # OPTION: -padx # # Specifies a padding distance for the childsite in the X-direction. # ------------------------------------------------------------------ itcl::configbody iwidgets::Shell::padx { pack config $itk_component(shellchildsite) -padx $itk_option(-padx) } # ------------------------------------------------------------------ # OPTION: -pady # # Specifies a padding distance for the childsite in the Y-direction. # ------------------------------------------------------------------ itcl::configbody iwidgets::Shell::pady { pack config $itk_component(shellchildsite) -pady $itk_option(-pady) } # ------------------------------------------------------------------ # OPTION: -width # # Specifies the width of the shell. The value may be specified in # any of the forms acceptable to Tk_GetPixels. A value of zero # causes the width to be adjusted to the required value based on # the size requests of the components placed in the childsite. # Otherwise, the width is fixed. # ------------------------------------------------------------------ itcl::configbody iwidgets::Shell::width { # # The width option was added to the hull in the constructor. # So, any width value given is passed automatically to the # hull. All we have to do is play with the propagation. # if {$itk_option(-width) != 0} { pack propagate $itk_component(hull) no } else { pack propagate $itk_component(hull) yes } } # ------------------------------------------------------------------ # OPTION: -height # # Specifies the height of the shell. The value may be specified in # any of the forms acceptable to Tk_GetPixels. A value of zero # causes the height to be adjusted to the required value based on # the size requests of the components placed in the childsite. # Otherwise, the height is fixed. # ------------------------------------------------------------------ itcl::configbody iwidgets::Shell::height { # # The height option was added to the hull in the constructor. # So, any height value given is passed automatically to the # hull. All we have to do is play with the propagation. # if {$itk_option(-height) != 0} { pack propagate $itk_component(hull) no } else { pack propagate $itk_component(hull) yes } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: childsite # # Return the pathname of the user accessible area. # ------------------------------------------------------------------ itcl::body iwidgets::Shell::childsite {} { return $itk_component(shellchildsite) } # ------------------------------------------------------------------ # METHOD: activate # # Display the dialog and wait based on the modality. For application # and global modal activations, perform a grab operation, and wait # for the result. The result may be returned via an argument to the # "deactivate" method. # ------------------------------------------------------------------ itcl::body iwidgets::Shell::activate {} { if {[winfo ismapped $itk_component(hull)]} { raise $itk_component(hull) return } if {($itk_option(-master) != {}) && \ [winfo exists $itk_option(-master)]} { wm transient $itk_component(hull) $itk_option(-master) } set _wait($this) 0 raise $itk_component(hull) wm deiconify $itk_component(hull) tkwait visibility $itk_component(hull) # For some mysterious reason, Tk sometimes returns too late from the # "tkwait visibility", i.e. after the "deactivate" method was invoked, # i.e. after the dialog window already disappeared. This would lead to # an infinite vwait on _wait($this) further on. Trap this case. # See also 2002-03-15 message to the Tcl/Tk newsgroup. # Remark that tests show that if "raise" is given *after* "deiconify" # (see above), "tkwait visibility" always returns duly on time..... if {![winfo ismapped $itk_component(hull)]} { # means "deactivate" went already through the grab-release stuff. return $_result } # Need to flush the event loop. This line added as a result of # SF ticket #227885. update idletasks if {$itk_option(-modality) == "application"} { if {$grabstack != {}} { grab release [lindex $grabstack end] } set err 1 while {$err == 1} { set err [catch [list grab $itk_component(hull)]] if {$err == 1} { after 1000 } } lappend grabstack [list grab $itk_component(hull)] tkwait variable [itcl::scope _wait($this)] return $_result } elseif {$itk_option(-modality) == "global" } { if {$grabstack != {}} { grab release [lindex $grabstack end] } set err 1 while {$err == 1} { set err [catch [list grab -global $itk_component(hull)]] if {$err == 1} { after 1000 } } lappend grabstack [list grab -global $itk_component(hull)] tkwait variable [itcl::scope _wait($this)] return $_result } } # ------------------------------------------------------------------ # METHOD: deactivate # # Deactivate the display of the dialog. The method takes an optional # argument to passed to the "activate" method which returns the value. # This is only effective for application and global modal dialogs. # ------------------------------------------------------------------ itcl::body iwidgets::Shell::deactivate {args} { if {! [winfo ismapped $itk_component(hull)]} { return } if {$itk_option(-modality) == "none"} { wm withdraw $itk_component(hull) } elseif {$itk_option(-modality) == "application"} { grab release $itk_component(hull) if {$grabstack != {}} { if {[set grabstack [lreplace $grabstack end end]] != {}} { eval [lindex $grabstack end] } } wm withdraw $itk_component(hull) } elseif {$itk_option(-modality) == "global"} { grab release $itk_component(hull) if {$grabstack != {}} { if {[set grabstack [lreplace $grabstack end end]] != {}} { eval [lindex $grabstack end] } } wm withdraw $itk_component(hull) } if {[llength $args]} { set _result $args } else { set _result {} } set _wait($this) 1 return } # ------------------------------------------------------------------ # METHOD: center # # Centers the dialog with respect to another widget or the screen # as a whole. # ------------------------------------------------------------------ itcl::body iwidgets::Shell::center {{widget {}}} { update idletasks set hull $itk_component(hull) set w [winfo width $hull] set h [winfo height $hull] set sh [winfo screenheight $hull] ;# display screen's height/width set sw [winfo screenwidth $hull] # # User can request it centered with respect to root by passing in '{}' # if { $widget == "" } { set reqX [expr {($sw-$w)/2}] set reqY [expr {($sh-$h)/2}] } else { set wfudge 5 ;# wm width fudge factor set hfudge 20 ;# wm height fudge factor set widgetW [winfo width $widget] set widgetH [winfo height $widget] set reqX [expr {[winfo rootx $widget]+($widgetW-($widgetW/2))-($w/2)}] set reqY [expr {[winfo rooty $widget]+($widgetH-($widgetH/2))-($h/2)}] # # Adjust for errors - if too long or too tall # if { ($reqX+$w+$wfudge) > $sw } { set reqX [expr {$sw-$w-$wfudge}] } if { $reqX < $wfudge } { set reqX $wfudge } if { ($reqY+$h+$hfudge) > $sh } { set reqY [expr {$sh-$h-$hfudge}] } if { $reqY < $hfudge } { set reqY $hfudge } } wm geometry $hull +$reqX+$reqY } iwidgets-4.1.0/generic/spindate.itk0000644003604700454610000005175607340752361015707 0ustar dgp771div# Spindate # ---------------------------------------------------------------------- # Implements a Date spinner widget. A date spinner contains three # Spinner widgets: one Spinner for months, one SpinInt for days, # and one SpinInt for years. Months can be specified as abbreviated # strings, integers or a user-defined list. Options exist to manage to # behavior, appearance, and format of each component spinner. # # ---------------------------------------------------------------------- # AUTHOR: Sue Yockey EMAIL: yockey@actc.com # Mark L. Ulferts mulferts@austin.dsccc.com # # @(#) $Id: spindate.itk,v 1.5 2001/08/22 15:51:13 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Default resources. # option add *Spindate.monthLabel "Month" widgetDefault option add *Spindate.dayLabel "Day" widgetDefault option add *Spindate.yearLabel "Year" widgetDefault option add *Spindate.monthWidth 4 widgetDefault option add *Spindate.dayWidth 4 widgetDefault option add *Spindate.yearWidth 4 widgetDefault # # Usual options. # itk::usual Spindate { keep -background -cursor -foreground -labelfont -textbackground -textfont } # ------------------------------------------------------------------ # SPINDATE # ------------------------------------------------------------------ itcl::class iwidgets::Spindate { inherit itk::Widget constructor {args} {} destructor {} itk_option define -labelpos labelPos Position w itk_option define -orient orient Orient vertical itk_option define -monthon monthOn MonthOn true itk_option define -dayon dayOn DayOn true itk_option define -yearon yearOn YearOn true itk_option define -datemargin dateMargin Margin 1 itk_option define -yeardigits yearDigits YearDigits 4 itk_option define -monthformat monthFormat MonthFormat integer public { method get {{format "-string"}} method show {{date now}} } protected { method _packDate {{when later}} variable _repack {} ;# Reconfiguration flag. } private { method _lastDay {month year} method _spinMonth {direction} method _spinDay {direction} variable _monthFormatStr "%m" variable _yearFormatStr "%Y" variable _interior } } # # Provide a lowercased access method for the Spindate class. # proc ::iwidgets::spindate {pathName args} { uplevel ::iwidgets::Spindate $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Spindate::constructor {args} { set _interior $itk_interior set clicks [clock seconds] # # Create Month Spinner # itk_component add month { iwidgets::Spinner $itk_interior.month -fixed 2 -justify right \ -decrement [itcl::code $this _spinMonth -1] \ -increment [itcl::code $this _spinMonth 1] } { keep -background -cursor -arroworient -foreground \ -labelfont -labelmargin -relief -textbackground \ -textfont -repeatdelay -repeatinterval rename -labeltext -monthlabel monthLabel Text rename -width -monthwidth monthWidth Width } # # Take off the default bindings for selction and motion. # bind [$itk_component(month) component entry] <1> {break} bind [$itk_component(month) component entry] {break} # # Create Day Spinner # itk_component add day { iwidgets::Spinint $itk_interior.day -fixed 2 -justify right \ -decrement [itcl::code $this _spinDay -1] \ -increment [itcl::code $this _spinDay 1] } { keep -background -cursor -arroworient -foreground \ -labelfont -labelmargin -relief -textbackground \ -textfont -repeatdelay -repeatinterval rename -labeltext -daylabel dayLabel Text rename -width -daywidth dayWidth Width } # # Take off the default bindings for selction and motion. # bind [$itk_component(day) component entry] <1> {break} bind [$itk_component(day) component entry] {break} # # Create Year Spinner # itk_component add year { iwidgets::Spinint $itk_interior.year -fixed 2 -justify right \ -range {1900 3000} } { keep -background -cursor -arroworient -foreground \ -labelfont -labelmargin -relief -textbackground \ -textfont -repeatdelay -repeatinterval rename -labeltext -yearlabel yearLabel Text rename -width -yearwidth yearWidth Width } # # Take off the default bindings for selction and motion. # bind [$itk_component(year) component entry] <1> {break} bind [$itk_component(year) component entry] {break} # # Initialize the widget based on the command line options. # eval itk_initialize $args # # Show the current date. # show now } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Spindate::destructor {} { if {$_repack != ""} {after cancel $_repack} } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -labelpos # # Specifies the location of all 3 spinners' labels. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spindate::labelpos { switch $itk_option(-labelpos) { n { $itk_component(month) configure -labelpos n $itk_component(day) configure -labelpos n $itk_component(year) configure -labelpos n # # Un-align labels # $itk_component(month) configure -labelmargin 1 $itk_component(day) configure -labelmargin 1 $itk_component(year) configure -labelmargin 1 } s { $itk_component(month) configure -labelpos s $itk_component(day) configure -labelpos s $itk_component(year) configure -labelpos s # # Un-align labels # $itk_component(month) configure -labelmargin 1 $itk_component(day) configure -labelmargin 1 $itk_component(year) configure -labelmargin 1 } w { $itk_component(month) configure -labelpos w $itk_component(day) configure -labelpos w $itk_component(year) configure -labelpos w } e { $itk_component(month) configure -labelpos e $itk_component(day) configure -labelpos e $itk_component(year) configure -labelpos e # # Un-align labels # $itk_component(month) configure -labelmargin 1 $itk_component(day) configure -labelmargin 1 $itk_component(year) configure -labelmargin 1 } default { error "bad labelpos option \"$itk_option(-labelpos)\",\ should be n, s, w or e" } } _packDate } # ------------------------------------------------------------------ # OPTION: -orient # # Specifies the orientation of the 3 spinners for Month, Day # and year. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spindate::orient { _packDate } # ------------------------------------------------------------------ # OPTION: -monthon # # Specifies whether or not to display the month spinner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spindate::monthon { _packDate } # ------------------------------------------------------------------ # OPTION: -dayon # # Specifies whether or not to display the day spinner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spindate::dayon { _packDate } # ------------------------------------------------------------------ # OPTION: -yearon # # Specifies whether or not to display the year spinner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spindate::yearon { _packDate } # ------------------------------------------------------------------ # OPTION: -datemargin # # Specifies the margin space between the month and day spinners # and the day and year spinners. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spindate::datemargin { _packDate } # ------------------------------------------------------------------ # OPTION: -yeardigits # # Number of digits for year display, 2 or 4 # ------------------------------------------------------------------ itcl::configbody iwidgets::Spindate::yeardigits { set clicks [clock seconds] switch $itk_option(-yeardigits) { "2" { $itk_component(year) configure -width 2 -fixed 2 $itk_component(year) clear $itk_component(year) insert 0 [clock format $clicks -format "%y"] set _yearFormatStr "%y" } "4" { $itk_component(year) configure -width 4 -fixed 4 $itk_component(year) clear $itk_component(year) insert 0 [clock format $clicks -format "%Y"] set _yearFormatStr "%Y" } default { error "bad yeardigits option \"$itk_option(-yeardigits)\",\ should be 2 or 4" } } } # ------------------------------------------------------------------ # OPTION: -monthformat # # Format of month display, integers (1-12) or brief strings (Jan - # Dec), or full strings (January - December). # ------------------------------------------------------------------ itcl::configbody iwidgets::Spindate::monthformat { set clicks [clock seconds] if {$itk_option(-monthformat) == "brief"} { $itk_component(month) configure -width 3 -fixed 3 $itk_component(month) delete 0 end $itk_component(month) insert 0 [clock format $clicks -format "%b"] set _monthFormatStr "%b" } elseif {$itk_option(-monthformat) == "full"} { $itk_component(month) configure -width 9 -fixed 9 $itk_component(month) delete 0 end $itk_component(month) insert 0 [clock format $clicks -format "%B"] set _monthFormatStr "%B" } elseif {$itk_option(-monthformat) == "integer"} { $itk_component(month) configure -width 2 -fixed 2 $itk_component(month) delete 0 end $itk_component(month) insert 0 [clock format $clicks -format "%m"] set _monthFormatStr "%m" } else { error "bad monthformat option\ \"$itk_option(-monthformat)\", should be\ \"integer\", \"brief\" or \"full\"" } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: get ?format? # # Return the current contents of the spindate widget in one of # two formats string or as an integer clock value using the -string # and -clicks options respectively. The default is by string. # Reference the clock command for more information on obtaining dates # and their formats. # ------------------------------------------------------------------ itcl::body iwidgets::Spindate::get {{format "-string"}} { set month [$itk_component(month) get] set day [$itk_component(day) get] set year [$itk_component(year) get] if {[regexp {[0-9]+} $month]} { set datestr "$month/$day/$year" } else { set datestr "$day $month $year" } switch -- $format { "-string" { return $datestr } "-clicks" { return [clock scan $datestr] } default { error "bad format option \"$format\":\ should be -string or -clicks" } } } # ------------------------------------------------------------------ # PUBLIC METHOD: show date # # Changes the currently displayed date to be that of the date # argument. The date may be specified either as a string or an # integer clock value. Reference the clock command for more # information on obtaining dates and their formats. # ------------------------------------------------------------------ itcl::body iwidgets::Spindate::show {{date "now"}} { # # Convert the date to a clock clicks value. # if {$date == "now"} { set seconds [clock seconds] } else { if {[catch {clock format $date}] == 0} { set seconds $date } elseif {[catch {set seconds [clock scan $date]}] != 0} { error "bad date: \"$date\", must be a valid date\ string, clock clicks value or the keyword now" } } # # Display the month based on the -monthformat option. # switch $itk_option(-monthformat) { "brief" { $itk_component(month) delete 0 end $itk_component(month) insert 0 [clock format $seconds -format "%b"] } "full" { $itk_component(month) delete 0 end $itk_component(month) insert 0 [clock format $seconds -format "%B"] } "integer" { $itk_component(month) delete 0 end $itk_component(month) insert 0 [clock format $seconds -format "%m"] } } # # Display the day. # $itk_component(day) delete 0 end $itk_component(day) insert end [clock format $seconds -format "%d"] # # Display the year based on the -yeardigits option. # switch $itk_option(-yeardigits) { "2" { $itk_component(year) delete 0 end $itk_component(year) insert 0 [clock format $seconds -format "%y"] } "4" { $itk_component(year) delete 0 end $itk_component(year) insert 0 [clock format $seconds -format "%Y"] } } return } # ---------------------------------------------------------------- # PRIVATE METHOD: _spinMonth direction # # Increment or decrement month value. We need to get the values # for all three fields so we can make sure the day agrees with # the month. Should the current day be greater than the day for # the spun month, then the day is set to the last day for the # new month. # ---------------------------------------------------------------- itcl::body iwidgets::Spindate::_spinMonth {direction} { set month [$itk_component(month) get] set day [$itk_component(day) get] set year [$itk_component(year) get] # # There appears to be a bug in the Tcl clock command in that it # can't scan a date like "12/31/1999 1 month" or any other date with # a year above 2000, but it has no problem scanning "07/01/1998 1 month". # So, we're going to play a game and increment by days until this # is fixed in Tcl. # if {$direction == 1} { set incrdays 32 set day 01 } else { set incrdays -28 set day 28 } if {[regexp {[0-9]+} $month]} { set clicks [clock scan "$month/$day/$year $incrdays day"] } else { set clicks [clock scan "$day $month $year $incrdays day"] } $itk_component(month) clear $itk_component(month) insert 0 \ [clock format $clicks -format $_monthFormatStr] set currday [$itk_component(day) get] set lastday [_lastDay [$itk_component(month) get] $year] if {$currday > $lastday} { $itk_component(day) clear $itk_component(day) insert end $lastday } } # ---------------------------------------------------------------- # PRIVATE METHOD: _spinDay direction # # Increment or decrement day value. If the previous day was the # first, then set the new day to the last day for the current # month. If it was the last day of the month, change it to the # first. Otherwise, spin it to the next day. # ---------------------------------------------------------------- itcl::body iwidgets::Spindate::_spinDay {direction} { set month [$itk_component(month) get] set day [$itk_component(day) get] set year [$itk_component(year) get] set lastday [_lastDay $month $year] set currclicks [get -clicks] $itk_component(day) delete 0 end if {(($day == "01") || ($day == "1")) && ($direction == -1)} { $itk_component(day) insert 0 $lastday return } if {($day == $lastday) && ($direction == 1)} { $itk_component(day) insert 0 "01" return } set clicks [clock scan "$direction day" -base $currclicks] $itk_component(day) insert 0 [clock format $clicks -format "%d"] } # ------------------------------------------------------------------ # PRIVATE METHOD: _packDate when # # Pack the components of the date spinner. If "when" is "now", the # change is applied immediately. If it is "later" or it is not # specified, then the change is applied later, when the application # is idle. # ------------------------------------------------------------------ itcl::body iwidgets::Spindate::_packDate {{when later}} { if {$when == "later"} { if {$_repack == ""} { set _repack [after idle [itcl::code $this _packDate now]] } return } elseif {$when != "now"} { error "bad option \"$when\": should be now or later" } # # Turn off the minsizes for all the rows and columns. # for {set i 0} {$i < 5} {incr i} { grid rowconfigure $_interior $i -minsize 0 grid columnconfigure $_interior $i -minsize 0 } set _repack "" # # Based on the orientation, use the grid to place the components into # the proper rows and columns. # switch $itk_option(-orient) { vertical { set row -1 if {$itk_option(-monthon)} { grid $itk_component(month) -row [incr row] -column 0 \ -sticky nsew } else { grid forget $itk_component(month) } if {$itk_option(-dayon)} { if {$itk_option(-dayon)} { grid rowconfigure $_interior [incr row] \ -minsize $itk_option(-datemargin) } grid $itk_component(day) -row [incr row] -column 0 \ -sticky nsew } else { grid forget $itk_component(day) } if {$itk_option(-yearon)} { if {$itk_option(-monthon) || $itk_option(-dayon)} { grid rowconfigure $_interior [incr row] \ -minsize $itk_option(-datemargin) } grid $itk_component(year) -row [incr row] -column 0 \ -sticky nsew } else { grid forget $itk_component(year) } if {$itk_option(-labelpos) == "w"} { iwidgets::Labeledwidget::alignlabels $itk_component(month) \ $itk_component(day) $itk_component(year) } } horizontal { set column -1 if {$itk_option(-monthon)} { grid $itk_component(month) -row 0 -column [incr column] \ -sticky nsew } else { grid forget $itk_component(month) } if {$itk_option(-dayon)} { if {$itk_option(-monthon)} { grid columnconfigure $_interior [incr column] \ -minsize $itk_option(-datemargin) } grid $itk_component(day) -row 0 -column [incr column] \ -sticky nsew } else { grid forget $itk_component(day) } if {$itk_option(-yearon)} { if {$itk_option(-monthon) || $itk_option(-dayon)} { grid columnconfigure $_interior [incr column] \ -minsize $itk_option(-datemargin) } grid $itk_component(year) -row 0 -column [incr column] \ -sticky nsew } else { grid forget $itk_component(year) } # # Un-align labels. # $itk_component(month) configure -labelmargin 1 $itk_component(day) configure -labelmargin 1 $itk_component(year) configure -labelmargin 1 } default { error "bad orient option \"$itk_option(-orient)\", should\ be \"vertical\" or \"horizontal\"" } } } # ------------------------------------------------------------------ # PRIVATE METHOD: _lastDay month year # # Internal method which determines the last day of the month for # the given month and year. We start at 28 and go forward till # we fail. Crude but effective. # ------------------------------------------------------------------ itcl::body iwidgets::Spindate::_lastDay {month year} { set lastone 28 for {set lastone 28} {$lastone < 32} {incr lastone} { if {[regexp {[0-9]+} $month]} { if {[catch {clock scan "$month/[expr {$lastone + 1}]/$year"}] != 0} { return $lastone } } else { if {[catch {clock scan "[expr {$lastone + 1}] $month $year"}] != 0} { return $lastone } } } } iwidgets-4.1.0/generic/spinint.itk0000644003604700454610000001743507334044000015543 0ustar dgp771div# Spinint # ---------------------------------------------------------------------- # Implements an integer spinner widget. It inherits basic spinner # functionality from Spinner and adds specific features to create # an integer-only spinner. # Arrows may be placed horizontally or vertically. # User may specify an integer range and step value. # Spinner may be configured to wrap when min or max value is reached. # # NOTE: # Spinint integer values should not exceed the size of a long integer. # For a 32 bit long the integer range is -2147483648 to 2147483647. # # ---------------------------------------------------------------------- # AUTHOR: Sue Yockey Phone: (214) 519-2517 # E-mail: syockey@spd.dsccc.com # yockey@acm.org # # @(#) $Id: spinint.itk,v 1.3 2001/08/07 19:56:48 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Spinint { keep -background -borderwidth -cursor -foreground -highlightcolor \ -highlightthickness -insertbackground -insertborderwidth \ -insertofftime -insertontime -insertwidth -labelfont \ -selectbackground -selectborderwidth -selectforeground \ -textbackground -textfont } # ------------------------------------------------------------------ # SPININT # ------------------------------------------------------------------ itcl::class iwidgets::Spinint { inherit iwidgets::Spinner constructor {args} { Spinner::constructor -validate numeric } {} itk_option define -range range Range "" itk_option define -step step Step 1 itk_option define -wrap wrap Wrap true public method up {} public method down {} } # # Provide a lowercased access method for the Spinint class. # proc ::iwidgets::spinint {pathName args} { uplevel ::iwidgets::Spinint $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Spinint::constructor {args} { eval itk_initialize $args $itk_component(entry) delete 0 end if {[lindex $itk_option(-range) 0] == ""} { $itk_component(entry) insert 0 "0" } else { $itk_component(entry) insert 0 [lindex $itk_option(-range) 0] } } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -range # # Set min and max values for spinner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spinint::range { if {$itk_option(-range) != ""} { if {[llength $itk_option(-range)] != 2} { error "wrong # args: should be\ \"$itk_component(hull) configure -range {begin end}\"" } set min [lindex $itk_option(-range) 0] set max [lindex $itk_option(-range) 1] if {![regexp {^-?[0-9]+$} $min]} { error "bad range option \"$min\": begin value must be\ an integer" } if {![regexp {^-?[0-9]+$} $max]} { error "bad range option \"$max\": end value must be\ an integer" } if {$min > $max} { error "bad option starting range \"$min\": must be less\ than ending: \"$max\"" } } } # ------------------------------------------------------------------ # OPTION: -step # # Increment spinner by step value. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spinint::step { } # ------------------------------------------------------------------ # OPTION: -wrap # # Specify whether spinner should wrap value if at min or max. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spinint::wrap { } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: up # # Up arrow button press event. Increment value in entry. # ------------------------------------------------------------------ itcl::body iwidgets::Spinint::up {} { set min_range [lindex $itk_option(-range) 0] set max_range [lindex $itk_option(-range) 1] set val [$itk_component(entry) get] if {[lindex $itk_option(-range) 0] != ""} { # # Check boundaries. # if {$val >= $min_range && $val < $max_range} { incr val $itk_option(-step) $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $val } else { if {$itk_option(-wrap)} { if {$val >= $max_range} { $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $min_range } elseif {$val < $min_range} { $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $min_range } else { uplevel #0 $itk_option(-invalid) } } else { uplevel #0 $itk_option(-invalid) } } } else { # # No boundaries. # incr val $itk_option(-step) $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $val } } # ------------------------------------------------------------------ # METHOD: down # # Down arrow button press event. Decrement value in entry. # ------------------------------------------------------------------ itcl::body iwidgets::Spinint::down {} { set min_range [lindex $itk_option(-range) 0] set max_range [lindex $itk_option(-range) 1] set val [$itk_component(entry) get] if {[lindex $itk_option(-range) 0] != ""} { # # Check boundaries. # if {$val > $min_range && $val <= $max_range} { incr val -$itk_option(-step) $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $val } else { if {$itk_option(-wrap)} { if {$val <= $min_range} { $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $max_range } elseif {$val > $max_range} { $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $max_range } else { uplevel #0 $itk_option(-invalid) } } else { uplevel #0 $itk_option(-invalid) } } } else { # # No boundaries. # incr val -$itk_option(-step) $itk_component(entry) delete 0 end $itk_component(entry) insert 0 $val } } iwidgets-4.1.0/generic/spinner.itk0000644003604700454610000003667107337265305015560 0ustar dgp771div# Spinner # ---------------------------------------------------------------------- # Implements a spinner widget. The Spinner is comprised of an # EntryField plus up and down arrow buttons. # Spinner is meant to be used as a base class for creating more # specific spinners such as SpinInt.itk # Arrows may be drawn horizontally or vertically. # User may define arrow behavior or accept the default arrow behavior. # # ---------------------------------------------------------------------- # AUTHOR: Sue Yockey Phone: (214) 519-2517 # E-mail: syockey@spd.dsccc.com # yockey@acm.org # # @(#) $Id: spinner.itk,v 1.3 2001/08/17 19:04:37 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Usual options. # itk::usual Spinner { keep -background -borderwidth -cursor -foreground -highlightcolor \ -highlightthickness -insertbackground -insertborderwidth \ -insertofftime -insertontime -insertwidth -labelfont \ -selectbackground -selectborderwidth -selectforeground \ -textbackground -textfont } # ------------------------------------------------------------------ # SPINNER # ------------------------------------------------------------------ itcl::class iwidgets::Spinner { inherit iwidgets::Entryfield constructor {args} {} destructor {} itk_option define -arroworient arrowOrient Orient vertical itk_option define -textfont textFont \ Font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* itk_option define -borderwidth borderWidth BorderWidth 2 itk_option define -highlightthickness highlightThickness \ HighlightThickness 2 itk_option define -increment increment Command {} itk_option define -decrement decrement Command {} itk_option define -repeatdelay repeatDelay RepeatDelay 300 itk_option define -repeatinterval repeatInterval RepeatInterval 100 itk_option define -foreground foreground Foreground black public method down {} public method up {} protected method _pushup {} protected method _pushdown {} protected method _relup {} protected method _reldown {} protected method _doup {rate} protected method _dodown {rate} protected method _up {} protected method _down {} protected method _positionArrows {{when later}} protected variable _interior {} protected variable _reposition "" ;# non-null => _positionArrows pending protected variable _uptimer "" ;# non-null => _uptimer pending protected variable _downtimer "" ;# non-null => _downtimer pending } # # Provide a lowercased access method for the Spinner class. # proc ::iwidgets::spinner {pathName args} { uplevel ::iwidgets::Spinner $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::constructor {args} { # # Save off the interior for later use. # set _interior $itk_interior # # Create up arrow button. # itk_component add uparrow { canvas $itk_interior.uparrow -height 10 -width 10 \ -relief raised -highlightthickness 0 } { keep -background -borderwidth } # # Create down arrow button. # itk_component add downarrow { canvas $itk_interior.downarrow -height 10 -width 10 \ -relief raised -highlightthickness 0 } { keep -background -borderwidth } # # Add bindings for button press events on the up and down buttons. # bind $itk_component(uparrow) [itcl::code $this _pushup] bind $itk_component(uparrow) [itcl::code $this _relup] bind $itk_component(downarrow) [itcl::code $this _pushdown] bind $itk_component(downarrow) [itcl::code $this _reldown] eval itk_initialize $args # # When idle, position the arrows. # _positionArrows } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::destructor {} { if {$_reposition != ""} {after cancel $_reposition} if {$_uptimer != ""} {after cancel $_uptimer} if {$_downtimer != ""} {after cancel $_downtimer} } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -arroworient # # Place arrows vertically or horizontally . # ------------------------------------------------------------------ itcl::configbody iwidgets::Spinner::arroworient { _positionArrows } # ------------------------------------------------------------------ # OPTION: -textfont # # Change font, resize arrow buttons. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spinner::textfont { _positionArrows } # ------------------------------------------------------------------ # OPTION: -highlightthickness # # Change highlightthickness, resize arrow buttons. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spinner::highlightthickness { _positionArrows } # ------------------------------------------------------------------ # OPTION: -borderwidth # # Change borderwidth, resize arrow buttons. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spinner::borderwidth { _positionArrows } # ------------------------------------------------------------------ # OPTION: -increment # # Up arrow callback. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spinner::increment { if {$itk_option(-increment) == {}} { set itk_option(-increment) [itcl::code $this up] } } # ------------------------------------------------------------------ # OPTION: -decrement # # Down arrow callback. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spinner::decrement { if {$itk_option(-decrement) == {}} { set itk_option(-decrement) [itcl::code $this down] } } # ------------------------------------------------------------------ # OPTION: -repeatinterval # # Arrow repeat rate in milliseconds. A repeatinterval of 0 disables # button repeat. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spinner::repeatinterval { if {$itk_option(-repeatinterval) < 0} { set itk_option(-repeatinterval) 0 } } # ------------------------------------------------------------------ # OPTION: -repeatdelay # # Arrow repeat delay in milliseconds. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spinner::repeatdelay { if {$itk_option(-repeatdelay) < 0} { set itk_option(-repeatdelay) 0 } } # ------------------------------------------------------------------ # OPTION: -foreground # # Set the foreground color of the up and down arrows. Remember # to make sure the "tag" exists before setting them... # ------------------------------------------------------------------ itcl::configbody iwidgets::Spinner::foreground { if { [$itk_component(uparrow) gettags up] != "" } { $itk_component(uparrow) itemconfigure up \ -fill $itk_option(-foreground) } if { [$itk_component(downarrow) gettags down] != "" } { $itk_component(downarrow) itemconfigure down \ -fill $itk_option(-foreground) } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: up # # Up arrow command. Meant to be overloaded by derived class. # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::up {} { } # ------------------------------------------------------------------ # METHOD: down # # Down arrow command. Meant to be overloaded by derived class. # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::down {} { } # ------------------------------------------------------------------ # PROTECTED METHOD: _positionArrows ?when? # # Draw Arrows for spinner. If "when" is "now", the change is applied # immediately. If it is "later" or it is not specified, then the # change is applied later, when the application is idle. # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::_positionArrows {{when later}} { if {$when == "later"} { if {$_reposition == ""} { set _reposition [after idle [itcl::code $this _positionArrows now]] } return } elseif {$when != "now"} { error "bad option \"$when\": should be now or later" } set _reposition "" set bdw [cget -borderwidth] # # Based on the orientation of the arrows, pack them accordingly and # determine the width and height of the spinners. For vertical # orientation, it is really tight in the y direction, so we'll take # advantage of the highlightthickness. Horizontal alignment has # plenty of space vertically, thus we'll ignore the thickness. # switch $itk_option(-arroworient) { vertical { grid $itk_component(uparrow) -row 0 -column 0 grid $itk_component(downarrow) -row 1 -column 0 set totalHgt [winfo reqheight $itk_component(entry)] set spinHgt [expr {$totalHgt / 2}] set spinWid [expr {round ($spinHgt * 1.6)}] } horizontal { grid $itk_component(uparrow) -row 0 -column 0 grid $itk_component(downarrow) -row 0 -column 1 set spinHgt [expr {[winfo reqheight $itk_component(entry)] - \ (2 * [$itk_component(entry) cget -highlightthickness])}] set spinWid $spinHgt } default { error "bad orientation option \"$itk_option(-arroworient)\",\ should be horizontal or vertical" } } # # Configure the width and height of the spinners minus the borderwidth. # Next delete the previous spinner polygons and create new ones. # $itk_component(uparrow) config \ -height [expr {$spinHgt - (2 * $bdw)}] \ -width [expr {$spinWid - (2 * $bdw)}] $itk_component(uparrow) delete up $itk_component(uparrow) create polygon \ [expr {$spinWid / 2}] $bdw \ [expr {$spinWid - $bdw - 1}] [expr {$spinHgt - $bdw -1}] \ [expr {$bdw + 1}] [expr {$spinHgt - $bdw - 1}] \ -fill $itk_option(-foreground) -tags up $itk_component(downarrow) config \ -height [expr {$spinHgt - (2 * $bdw)}] \ -width [expr {$spinWid - (2 * $bdw)}] $itk_component(downarrow) delete down $itk_component(downarrow) create polygon \ [expr {$spinWid / 2}] [expr {($spinHgt - $bdw) - 1}] \ [expr {$bdw + 2}] [expr {$bdw + 1}] \ [expr {$spinWid - $bdw - 2}] [expr {$bdw + 1}] \ -fill $itk_option(-foreground) -tags down } # ------------------------------------------------------------------ # PRIVATE METHOD: _pushup # # Up arrow button press event. Call _doup with repeatdelay. # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::_pushup {} { $itk_component(uparrow) config -relief sunken _doup $itk_option(-repeatdelay) } # ------------------------------------------------------------------ # PRIVATE METHOD: _pushdown # # Down arrow button press event. Call _dodown with repeatdelay. # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::_pushdown {} { $itk_component(downarrow) config -relief sunken _dodown $itk_option(-repeatdelay) } # ------------------------------------------------------------------ # PRIVATE METHOD: _doup # # Call _up and post to do another one after "rate" milliseconds if # repeatinterval > 0. # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::_doup {rate} { _up if {$itk_option(-repeatinterval) > 0} { set _uptimer [after $rate [itcl::code $this _doup $itk_option(-repeatinterval)]] } } # ------------------------------------------------------------------ # PRIVATE METHOD: _dodown # # Call _down and post to do another one after "rate" milliseconds if # repeatinterval > 0. # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::_dodown {rate} { _down if {$itk_option(-repeatinterval) > 0} { set _downtimer \ [after $rate [itcl::code $this _dodown $itk_option(-repeatinterval)]] } } # ------------------------------------------------------------------ # PRIVATE METHOD: _relup # # Up arrow button release event. Cancel pending up timer. # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::_relup {} { $itk_component(uparrow) config -relief raised if {$_uptimer != ""} { after cancel $_uptimer set _uptimer "" } } # ------------------------------------------------------------------ # PRIVATE METHOD: _reldown # # Up arrow button release event. Cancel pending down timer. # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::_reldown {} { $itk_component(downarrow) config -relief raised if {$_downtimer != ""} { after cancel $_downtimer set _downtimer "" } } # ------------------------------------------------------------------ # PRIVATE METHOD: _up # # Up arrow button press event. Call defined increment command. # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::_up {} { uplevel #0 $itk_option(-increment) } # ------------------------------------------------------------------ # PRIVATE METHOD: _down # # Down arrow button press event. Call defined decrement command. # ------------------------------------------------------------------ itcl::body iwidgets::Spinner::_down {} { uplevel #0 $itk_option(-decrement) } iwidgets-4.1.0/generic/spintime.itk0000644003604700454610000003765107337265315015732 0ustar dgp771div# Spintime # ---------------------------------------------------------------------- # Implements a Time spinner widget. A time spinner contains three # integer spinners: one for hours, one for minutes and one for # seconds. Options exist to manage to behavior, appearance, and # format of each component spinner. # # ---------------------------------------------------------------------- # AUTHOR: Sue Yockey EMAIL: yockey@actc.com # Mark L. Ulferts mulferts@austin.dsccc.com # # @(#) $Id: spintime.itk,v 1.3 2001/08/17 19:04:45 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1997 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Default resources. # option add *Spintime.hourLabel "Hour" widgetDefault option add *Spintime.minuteLabel "Minute" widgetDefault option add *Spintime.secondLabel "Second" widgetDefault option add *Spintime.hourWidth 3 widgetDefault option add *Spintime.minuteWidth 3 widgetDefault option add *Spintime.secondWidth 3 widgetDefault # # Usual options. # itk::usual Spintime { keep -background -cursor -foreground -labelfont -textbackground -textfont } # ------------------------------------------------------------------ # SPINTIME # ------------------------------------------------------------------ itcl::class iwidgets::Spintime { inherit itk::Widget constructor {args} {} destructor {} itk_option define -orient orient Orient vertical itk_option define -labelpos labelPos Position w itk_option define -houron hourOn HourOn true itk_option define -minuteon minuteOn MinuteOn true itk_option define -secondon secondOn SecondOn true itk_option define -timemargin timeMargin Margin 1 itk_option define -militaryon militaryOn MilitaryOn true public { method get {{format "-string"}} method show {{date now}} } protected { method _packTime {{when later}} method _down60 {comp} variable _repack {} ;# Reconfiguration flag. variable _interior } } # # Provide a lowercased access method for the Spintime class. # proc ::iwidgets::spintime {pathName args} { uplevel ::iwidgets::Spintime $pathName $args } # ------------------------------------------------------------------ # CONSTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Spintime::constructor {args} { set _interior $itk_interior set clicks [clock seconds] # # Create Hour Spinner # itk_component add hour { iwidgets::Spinint $itk_interior.hour -fixed 2 -range {0 23} -justify right } { keep -background -cursor -arroworient -foreground \ -labelfont -labelmargin -relief -textbackground \ -textfont -repeatdelay -repeatinterval rename -labeltext -hourlabel hourLabel Text rename -width -hourwidth hourWidth Width } # # Take off the default bindings for selction and motion. # bind [$itk_component(hour) component entry] <1> {break} bind [$itk_component(hour) component entry] {break} # # Create Minute Spinner # itk_component add minute { iwidgets::Spinint $itk_interior.minute \ -decrement [itcl::code $this _down60 minute] \ -fixed 2 -range {0 59} -justify right } { keep -background -cursor -arroworient -foreground \ -labelfont -labelmargin -relief -textbackground \ -textfont -repeatdelay -repeatinterval rename -labeltext -minutelabel minuteLabel Text rename -width -minutewidth minuteWidth Width } # # Take off the default bindings for selction and motion. # bind [$itk_component(minute) component entry] <1> {break} bind [$itk_component(minute) component entry] {break} # # Create Second Spinner # itk_component add second { iwidgets::Spinint $itk_interior.second \ -decrement [itcl::code $this _down60 second] \ -fixed 2 -range {0 59} -justify right } { keep -background -cursor -arroworient -foreground \ -labelfont -labelmargin -relief -textbackground \ -textfont -repeatdelay -repeatinterval rename -labeltext -secondlabel secondLabel Text rename -width -secondwidth secondWidth Width } # # Take off the default bindings for selction and motion. # bind [$itk_component(second) component entry] <1> {break} bind [$itk_component(second) component entry] {break} # # Initialize the widget based on the command line options. # eval itk_initialize $args # # Show the current time. # show now } # ------------------------------------------------------------------ # DESTRUCTOR # ------------------------------------------------------------------ itcl::body iwidgets::Spintime::destructor {} { if {$_repack != ""} {after cancel $_repack} } # ------------------------------------------------------------------ # OPTIONS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # OPTION: -orient # # Specifies the orientation of the 3 spinners for Hour, Minute # and second. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spintime::orient { _packTime } # ------------------------------------------------------------------ # OPTION: -labelpos # # Specifies the location of all 3 spinners' labels. # Overloaded # ------------------------------------------------------------------ itcl::configbody iwidgets::Spintime::labelpos { switch $itk_option(-labelpos) { n { $itk_component(hour) configure -labelpos n $itk_component(minute) configure -labelpos n $itk_component(second) configure -labelpos n # # Un-align labels # $itk_component(hour) configure -labelmargin 1 $itk_component(minute) configure -labelmargin 1 $itk_component(second) configure -labelmargin 1 } s { $itk_component(hour) configure -labelpos s $itk_component(minute) configure -labelpos s $itk_component(second) configure -labelpos s # # Un-align labels # $itk_component(hour) configure -labelmargin 1 $itk_component(minute) configure -labelmargin 1 $itk_component(second) configure -labelmargin 1 } w { $itk_component(hour) configure -labelpos w $itk_component(minute) configure -labelpos w $itk_component(second) configure -labelpos w } e { $itk_component(hour) configure -labelpos e $itk_component(minute) configure -labelpos e $itk_component(second) configure -labelpos e # # Un-align labels # $itk_component(hour) configure -labelmargin 1 $itk_component(minute) configure -labelmargin 1 $itk_component(second) configure -labelmargin 1 } default { error "bad labelpos option \"$itk_option(-labelpos)\",\ should be n, s, w or e" } } _packTime } # ------------------------------------------------------------------ # OPTION: -houron # # Specifies whether or not to display the hour spinner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spintime::houron { _packTime } # ------------------------------------------------------------------ # OPTION: -minuteon # # Specifies whether or not to display the minute spinner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spintime::minuteon { _packTime } # ------------------------------------------------------------------ # OPTION: -secondon # # Specifies whether or not to display the second spinner. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spintime::secondon { _packTime } # ------------------------------------------------------------------ # OPTION: -timemargin # # Specifies the margin space between the hour and minute spinners # and the minute and second spinners. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spintime::timemargin { _packTime } # ------------------------------------------------------------------ # OPTION: -militaryon # # Specifies 24-hour clock or 12-hour. # ------------------------------------------------------------------ itcl::configbody iwidgets::Spintime::militaryon { set clicks [clock seconds] if {$itk_option(-militaryon)} { $itk_component(hour) configure -range {0 23} $itk_component(hour) delete 0 end $itk_component(hour) insert end [clock format $clicks -format "%H"] } else { $itk_component(hour) configure -range {1 12} $itk_component(hour) delete 0 end $itk_component(hour) insert end [clock format $clicks -format "%I"] } } # ------------------------------------------------------------------ # METHODS # ------------------------------------------------------------------ # ------------------------------------------------------------------ # METHOD: get ?format? # # Get the value of the time spinner in one of two formats string or # as an integer clock value using the -string and -clicks options # respectively. The default is by string. Reference the clock # command for more information on obtaining time and its formats. # ------------------------------------------------------------------ itcl::body iwidgets::Spintime::get {{format "-string"}} { set hour [$itk_component(hour) get] set minute [$itk_component(minute) get] set second [$itk_component(second) get] switch -- $format { "-string" { return "$hour:$minute:$second" } "-clicks" { return [clock scan "$hour:$minute:$second"] } default { error "bad format option \"$format\":\ should be -string or -clicks" } } } # ------------------------------------------------------------------ # PUBLIC METHOD: show time # # Changes the currently displayed time to be that of the time # argument. The time may be specified either as a string or an # integer clock value. Reference the clock command for more # information on obtaining time and its format. # ------------------------------------------------------------------ itcl::body iwidgets::Spintime::show {{time "now"}} { if {$time == "now"} { set seconds [clock seconds] } else { if {[catch {clock format $time}] == 0} { set seconds $time } elseif {[catch {set seconds [clock scan $time]}] != 0} { error "bad time: \"$time\", must be a valid time\ string, clock clicks value or the keyword now" } } $itk_component(hour) delete 0 end if {$itk_option(-militaryon)} { scan [clock format $seconds -format "%H"] "%d" hour } else { scan hour [clock format $seconds -format "%I"] "%d" hour } $itk_component(hour) insert end $hour $itk_component(minute) delete 0 end scan [clock format $seconds -format "%M"] "%d" minute $itk_component(minute) insert end $minute $itk_component(second) delete 0 end scan [clock format $seconds -format "%S"] "%d" seconds $itk_component(second) insert end $seconds return } # ------------------------------------------------------------------ # PROTECTED METHOD: _packTime ?when? # # Pack components of time spinner. If "when" is "now", the change # is applied immediately. If it is "later" or it is not specified, # then the change is applied later, when the application is idle. # ------------------------------------------------------------------ itcl::body iwidgets::Spintime::_packTime {{when later}} { if {$when == "later"} { if {$_repack == ""} { set _repack [after idle [itcl::code $this _packTime now]] } return } elseif {$when != "now"} { error "bad option \"$when\": should be now or later" } for {set i 0} {$i < 5} {incr i} { grid rowconfigure $_interior $i -minsize 0 grid columnconfigure $_interior $i -minsize 0 } if {$itk_option(-minuteon)} { set minuteon 1 } else { set minuteon 0 } if {$itk_option(-secondon)} { set secondon 1 } else { set secondon 0 } set _repack "" switch $itk_option(-orient) { vertical { set row -1 if {$itk_option(-houron)} { grid $itk_component(hour) -row [incr row] -column 0 \ -sticky nsew } else { grid forget $itk_component(hour) } if {$itk_option(-minuteon)} { if {$itk_option(-houron)} { grid rowconfigure $_interior [incr row] \ -minsize $itk_option(-timemargin) } grid $itk_component(minute) -row [incr row] -column 0 \ -sticky nsew } else { grid forget $itk_component(minute) } if {$itk_option(-secondon)} { if {$minuteon || $secondon} { grid rowconfigure $_interior [incr row] \ -minsize $itk_option(-timemargin) } grid $itk_component(second) -row [incr row] -column 0 \ -sticky nsew } else { grid forget $itk_component(second) } if {$itk_option(-labelpos) == "w"} { iwidgets::Labeledwidget::alignlabels $itk_component(hour) \ $itk_component(minute) $itk_component(second) } } horizontal { set column -1 if {$itk_option(-houron)} { grid $itk_component(hour) -row 0 -column [incr column] \ -sticky nsew } else { grid forget $itk_component(hour) } if {$itk_option(-minuteon)} { if {$itk_option(-houron)} { grid columnconfigure $_interior [incr column] \ -minsize $itk_option(-timemargin) } grid $itk_component(minute) -row 0 -column [incr column] \ -sticky nsew } else { grid forget $itk_component(minute) } if {$itk_option(-secondon)} { if {$minuteon || $secondon} { grid columnconfigure $_interior [incr column] \ -minsize $itk_option(-timemargin) } grid $itk_component(second) -row 0 -column [incr column] \ -sticky nsew } else { grid forget $itk_component(second) } # # Un-align labels # $itk_component(hour) configure -labelmargin 1 $itk_component(minute) configure -labelmargin 1 $itk_component(second) configure -labelmargin 1 } default { error "bad orient option \"$itk_option(-orient)\", should\ be \"vertical\" or \"horizontal\"" } } } # ------------------------------------------------------------------ # METHOD: down60 # # Down arrow button press event. Decrement value in the minute # or second entry. # ------------------------------------------------------------------ itcl::body iwidgets::Spintime::_down60 {comp} { set step [$itk_component($comp) cget -step] set val [$itk_component($comp) get] incr val -$step if {$val < 0} { set val [expr {60-$step}] } $itk_component($comp) delete 0 end $itk_component($comp) insert 0 $val } iwidgets-4.1.0/generic/tabnotebook.itk0000644003604700454610000011207207535736127016404 0ustar dgp771div# # Tabnotebook Widget # ---------------------------------------------------------------------- # The Tabnotebook command creates a new window (given by the pathName # argument) and makes it into a Tabnotebook widget. Additional options, # described above may be specified on the command line or in the option # database to configure aspects of the Tabnotebook such as its colors, # font, and text. The Tabnotebook command returns its pathName argument. # At the time this command is invoked, there must not exist a window # named pathName, but pathName's parent must exist. # # A Tabnotebook is a widget that contains a set of tabbed pages. It # displays one page from the set as the selected page. A Tab displays # the label for the page to which it is attached and serves as a page # selector. When a page's tab is selected, the page's contents are # displayed in the page area. The selected tab has a three-dimensional # effect to make it appear to float above the other tabs. The tabs are # displayed as a group along either the left, top, right, or bottom # edge. When first created a Tabnotebook has no pages. Pages may be # added or deleted using widget commands described below. # # A special option may be provided to the Tabnotebook. The -auto # option specifies whether the Tabnotebook will automatically handle # the unpacking and packing of pages when pages are selected. A value # of true sig nifies that the notebook will automatically manage it. This # is the default value. A value of false signifies the notebook will not # perform automatic switching of pages. # # ---------------------------------------------------------------------- # AUTHOR: Bill W. Scott # # CURRENT MAINTAINER: Chad Smith --> csmith@adc.com or itclguy@yahoo.com # # @(#) $Id: tabnotebook.itk,v 1.7 2002/09/05 20:19:35 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 DSC Technologies Corporation # ====================================================================== # Permission to use, copy, modify, distribute and license this software # and its documentation for any purpose, and without fee or written # agreement with DSC, is hereby granted, provided that the above copyright # notice appears in all copies and that both the copyright notice and # warranty disclaimer below appear in supporting documentation, and that # the names of DSC Technologies Corporation or DSC Communications # Corporation not be used in advertising or publicity pertaining to the # software without specific, written prior permission. # # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # ====================================================================== # # Default resources. # option add *Tabnotebook.borderWidth 2 widgetDefault option add *Tabnotebook.state normal widgetDefault option add *Tabnotebook.disabledForeground #a3a3a3 widgetDefault option add *Tabnotebook.scrollCommand {} widgetDefault option add *Tabnotebook.equalTabs true widgetDefault option add *Tabnotebook.font \ -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* widgetDefault option add *Tabnotebook.width 300 widgetDefault option add *Tabnotebook.height 150 widgetDefault option add *Tabnotebook.foreground Black widgetDefault option add *Tabnotebook.background #d9d9d9 widgetDefault option add *Tabnotebook.tabForeground Black widgetDefault option add *Tabnotebook.tabBackground #d9d9d9 widgetDefault option add *Tabnotebook.backdrop #d9d9d9 widgetDefault option add *Tabnotebook.margin 4 widgetDefault option add *Tabnotebook.tabBorders true widgetDefault option add *Tabnotebook.bevelAmount 0 widgetDefault option add *Tabnotebook.raiseSelect false widgetDefault option add *Tabnotebook.auto true widgetDefault option add *Tabnotebook.start 4 widgetDefault option add *Tabnotebook.padX 4 widgetDefault option add *Tabnotebook.padY 4 widgetDefault option add *Tabnotebook.gap overlap widgetDefault option add *Tabnotebook.angle 15 widgetDefault option add *Tabnotebook.tabPos s widgetDefault # # Usual options. # itk::usual Tabnotebook { keep -backdrop -background -borderwidth -cursor -disabledforeground \ -font -foreground -tabbackground -tabforeground } # ------------------------------------------------------------------ # TABNOTEBOOK # ------------------------------------------------------------------ itcl::class iwidgets::Tabnotebook { inherit itk::Widget constructor {args} {} destructor {} itk_option define -borderwidth borderWidth BorderWidth 2 itk_option define -state state State normal itk_option define \ -disabledforeground disabledForeground DisabledForeground #a3a3a3 itk_option define -scrollcommand scrollCommand ScrollCommand {} itk_option define -equaltabs equalTabs EqualTabs true itk_option define -font font Font \ -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* itk_option define -width width Width 300 itk_option define -height height Height 150 itk_option define -foreground foreground Foreground Black itk_option define -background background Background #d9d9d9 itk_option define -tabforeground tabForeground TabForeground Black itk_option define -tabbackground tabBackground TabBackground #d9d9d9 itk_option define -backdrop backdrop Backdrop #d9d9d9 itk_option define -margin margin Margin 4 itk_option define -tabborders tabBorders TabBorders true itk_option define -bevelamount bevelAmount BevelAmount 0 itk_option define -raiseselect raiseSelect RaiseSelect false itk_option define -auto auto Auto true itk_option define -start start Start 4 itk_option define -padx padX PadX 4 itk_option define -pady padY PadY 4 itk_option define -gap gap Gap overlap itk_option define -angle angle Angle 15 itk_option define -tabpos tabPos TabPos s public method add { args } public method configure { args } public method childsite { args } public method delete { args } public method index { args } public method insert { index args } public method prev { } public method next { } public method pageconfigure { index args } public method select { index } public method view { args } protected method _reconfigureTabset { } protected method _canvasReconfigure { wid hgt } protected method _pageReconfigure { pageName page wid hgt } private method _getArgs { optList args } private method _redrawBorder { wid hgt } private method _recomputeBorder { } private method _pack { tabPos } private method _resize {newWidth_ newHeight_} private variable _canvasWidth 0 ;# currently tabnote canvas width private variable _canvasHeight 0 ;# currently tabnote canvas height private variable _nbOptList {} ;# list of notebook options available private variable _tsOptList {} ;# list of tabset options available private variable _tabPos s ;# holds -tabPos, because of ordering private variable _borderRecompute false ;# did we dirty border after cfg? private variable _tabsetReconfigure false ;# did we dirty tabsets after cfg? } # ---------------------------------------------------------------------- # CONSTRUCTOR # ---------------------------------------------------------------------- itcl::body iwidgets::Tabnotebook::constructor {args} { # The following conditional added for SF ticket #514222. csmith 9/5/02 if {$::tk_version > 8.3} { component hull configure -borderwidth 0 -padx 0 -pady 0 } else { component hull configure -borderwidth 0 } # # Create the outermost canvas to maintain geometry. # itk_component add canvas { canvas $itk_interior.canvas -highlightthickness 0 } { keep -cursor -background -width -height } bind $itk_component(canvas) [itcl::code $this _resize %w %h] # ....................... # Create the NOTEBOOK # itk_component add notebook { iwidgets::Notebook $itk_interior.canvas.notebook } { keep -cursor -background } # # Ouch, create a dummy page, go pageconfigure to get its options # and munge them into a list for later doling by pageconfigure # $itk_component(notebook) add set nbConfigList [$itk_component(notebook) pageconfigure 0] foreach config $nbConfigList { lappend _nbOptList [lindex $config 0] } $itk_component(notebook) delete 0 # # Create the tabset. # itk_component add tabset { iwidgets::Tabset $itk_interior.canvas.tabset \ -command [itcl::code $this component notebook select] } { keep -cursor } eval itk_initialize $args # # Ouch, create a dummy tab, go tabconfigure to get its options # and munge them into a list for later doling by pageconfigure # $itk_component(tabset) add set tsConfigList [$itk_component(tabset) tabconfigure 0] foreach config $tsConfigList { lappend _tsOptList [lindex $config 0] } $itk_component(tabset) delete 0 bind $itk_component(tabset) \ [itcl::code $this _reconfigureTabset] _pack $_tabPos $itk_component(hull) configure -width [cget -width] -height [cget -height] } proc ::iwidgets::tabnotebook {pathName args} { uplevel ::iwidgets::Tabnotebook $pathName $args } # ------------------------------------------------------------- # DESTRUCTOR: destroy the Tabnotebook # ------------------------------------------------------------- itcl::body iwidgets::Tabnotebook::destructor {} { } # ---------------------------------------------------------------------- # OPTION -borderwidth # # Thickness of Notebook Border # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::borderwidth { if {$itk_option(-borderwidth) != {}} { #_recomputeBorder set _borderRecompute true } } # ---------------------------------------------------------------------- # OPTION -state # # State of the tabs in the tab notebook: normal or disabled # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::state { if {$itk_option(-state) != {}} { $itk_component(tabset) configure -state $itk_option(-state) #_reconfigureTabset set _tabsetReconfigure true } } # ---------------------------------------------------------------------- # OPTION -disabledforeground # # Specifies a foreground color to use for displaying a # tab's label when its state is disabled. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::disabledforeground { if {$itk_option(-disabledforeground) != {}} { $itk_component(tabset) configure \ -disabledforeground $itk_option(-disabledforeground) #_reconfigureTabset set _tabsetReconfigure true } } # ---------------------------------------------------------------------- # OPTION -scrollcommand # # Standard option. See options man pages. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::scrollcommand { if {$itk_option(-scrollcommand) != {}} { $itk_component(notebook) \ configure -scrollcommand $itk_option(-scrollcommand) } } # ---------------------------------------------------------------------- # OPTION -equaltabs # # Specifies whether to force tabs to be equal sized or not. # A value of true means constrain tabs to be equal sized. # A value of false allows each tab to size based on the text # label size. The value may have any of the forms accepted by # the Tcl_GetBoolean, such as true, false, 0, 1, yes, or no. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::equaltabs { if {$itk_option(-equaltabs) != {}} { $itk_component(tabset) \ configure -equaltabs $itk_option(-equaltabs) #_reconfigureTabset set _tabsetReconfigure true } } # ---------------------------------------------------------------------- # OPTION -font # # Font for tab labels when they are set to text (-label set) # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::font { if {$itk_option(-font) != {}} { $itk_component(tabset) configure -font $itk_option(-font) #_reconfigureTabset set _tabsetReconfigure true } } # ---------------------------------------------------------------------- # OPTION -width # # Width of the Tabnotebook # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::width { if {$itk_option(-width) != {}} { $itk_component(canvas) configure -width $itk_option(-width) #_recomputeBorder set _borderRecompute true } } # ---------------------------------------------------------------------- # OPTION -height # # Height of the Tabnotebook # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::height { if {$itk_option(-height) != {}} { $itk_component(canvas) configure -height $itk_option(-height) #_recomputeBorder set _borderRecompute true } } # ---------------------------------------------------------------------- # OPTION -foreground # # Specifies a foreground color to use for displaying a page # and its associated tab label (this is the selected state). # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::foreground { if {$itk_option(-foreground) != {}} { $itk_component(tabset) configure \ -selectforeground $itk_option(-foreground) } } # ---------------------------------------------------------------------- # OPTION -background # # Specifies a background color to use for displaying a page # and its associated tab bg (this is the selected state). # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::background { if {$itk_option(-background) != {}} { $itk_component(tabset) configure \ -selectbackground $itk_option(-background) #_recomputeBorder set _borderRecompute true } } # ---------------------------------------------------------------------- # OPTION -tabforeground # # Specifies a foreground color to use for displaying tab labels # when they are in their unselected state. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::tabforeground { if {$itk_option(-tabforeground) != {}} { $itk_component(tabset) configure \ -foreground $itk_option(-tabforeground) } } # ---------------------------------------------------------------------- # OPTION -tabbackground # # Specifies a background color to use for displaying tab backgrounds # when they are in their unselected state. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::tabbackground { if {$itk_option(-tabbackground) != {}} { $itk_component(tabset) configure \ -background $itk_option(-tabbackground) } } # ---------------------------------------------------------------------- # OPTION -backdrop # # Specifies a background color to use when filling in the # area behind the tabs. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::backdrop { if {$itk_option(-backdrop) != {}} { $itk_component(tabset) configure \ -backdrop $itk_option(-backdrop) } } # ---------------------------------------------------------------------- # OPTION -margin # # Sets the backdrop margin between tab edge and backdrop edge # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::margin { if {$itk_option(-margin) != {}} { $itk_component(tabset) configure -margin $itk_option(-margin) } } # ---------------------------------------------------------------------- # OPTION -tabborders # # Boolean that specifies whether to draw the borders of # the unselected tabs (tabs in background) # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::tabborders { if {$itk_option(-tabborders) != {}} { $itk_component(tabset) \ configure -tabborders $itk_option(-tabborders) #_reconfigureTabset set _tabsetReconfigure true } } # ---------------------------------------------------------------------- # OPTION -bevelamount # # Specifies pixel size of tab corners. 0 means no corners. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::bevelamount { if {$itk_option(-bevelamount) != {}} { $itk_component(tabset) \ configure -bevelamount $itk_option(-bevelamount) #_reconfigureTabset set _tabsetReconfigure true } } # ---------------------------------------------------------------------- # OPTION -raiseselect # # Sets whether to raise selected tabs # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::raiseselect { if {$itk_option(-raiseselect) != {}} { $itk_component(tabset) \ configure -raiseselect $itk_option(-raiseselect) #_reconfigureTabset set _tabsetReconfigure true } } # ---------------------------------------------------------------------- # OPTION -auto # # Determines whether pages are automatically unpacked and # packed when pages get selected. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::auto { if {$itk_option(-auto) != {}} { $itk_component(notebook) configure -auto $itk_option(-auto) } } # ---------------------------------------------------------------------- # OPTION -start # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::start { if {$itk_option(-start) != {}} { $itk_component(tabset) configure \ -start $itk_option(-start) #_reconfigureTabset set _tabsetReconfigure true } } # ---------------------------------------------------------------------- # OPTION -padx # # Specifies a non-negative value indicating how much extra space # to request for a tab around its label in the X-direction. # When computing how large a window it needs, the tab will add # this amount to the width it would normally need The tab will # end up with extra internal space to the left and right of its # text label. This value may have any of the forms acceptable # to Tk_GetPixels. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::padx { if {$itk_option(-padx) != {}} { $itk_component(tabset) configure -padx $itk_option(-padx) #_reconfigureTabset set _tabsetReconfigure true } } # ---------------------------------------------------------------------- # OPTION -pady # # Specifies a non-negative value indicating how much extra space to # request for a tab around its label in the Y-direction. When computing # how large a window it needs, the tab will add this amount to the # height it would normally need The tab will end up with extra internal # space to the top and bot tom of its text label. This value may have # any of the forms acceptable to Tk_GetPixels. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::pady { if {$itk_option(-pady) != {}} { $itk_component(tabset) configure -pady $itk_option(-pady) #_reconfigureTabset set _tabsetReconfigure true } } # ---------------------------------------------------------------------- # OPTION -gap # # Specifies the amount of pixel space to place between each tab. # Value may be any pixel offset value. In addition, a special keyword # 'overlap' can be used as the value to achieve a standard overlap of # tabs. This value may have any of the forms acceptable to Tk_GetPixels. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::gap { if {$itk_option(-gap) != {}} { $itk_component(tabset) configure -gap $itk_option(-gap) #_reconfigureTabset set _tabsetReconfigure true } } # ---------------------------------------------------------------------- # OPTION -angle # # Specifes the angle of slope from the inner edge to the outer edge # of the tab. An angle of 0 specifies square tabs. Valid ranges are # 0 to 45 degrees inclusive. Default is 15 degrees. If tabPos is # e or w, this option is ignored. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::angle { if {$itk_option(-angle) != {}} { $itk_component(tabset) configure -angle $itk_option(-angle) #_reconfigureTabset set _tabsetReconfigure true } } # ---------------------------------------------------------------------- # OPTION -tabpos # # Specifies the location of the set of tabs in relation to the # Notebook area. Must be n, s, e, or w. Defaults to s. # ---------------------------------------------------------------------- itcl::configbody iwidgets::Tabnotebook::tabpos { if {$itk_option(-tabpos) != {}} { set _tabPos $itk_option(-tabpos) $itk_component(tabset) configure \ -tabpos $itk_option(-tabpos) pack forget $itk_component(canvas) pack forget $itk_component(tabset) pack forget $itk_component(notebook) _pack $_tabPos } } # ------------------------------------------------------------- # METHOD: configure ?

    This is a test

    of the emergency broadcast system. This is only a test.

    If this were a real html document

    it would be displayed

    for more than an instant
    Four score and seven years ago
    int main { printf(\"Hello World!\");}
    write only memory
    the obvious antonym to read-only memory
      reasons this is a short list:
    1. it only has one entry
      reasons this is a short list:
    • it only has one entry
    No_image_here }} {}} {{.sh title} {Test}} {{.sh clear} {}}} { set method [lindex [lindex $test 0] 1] test Scrolledhtml-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 0 [lindex $test 1]] update incr m } # # Conclusion of construction/destruction tests # test Scrolledhtml-1.$c {Scrolledhtml destruction} { destroy .sh update } {} incr c test Scrolledhtml-1.$c {Scrolledhtml construction} { iwidgets::scrolledhtml .sh -hscrollmode dynamic -labeltext "Label" \ -labelpos n -labelmargin 5 pack .sh -padx 10 -pady 10 -fill both -expand yes update } {} incr c test Scrolledhtml-1.$c {Scrolledhtml destruction} { destroy .sh update } {} incr c test Scrolledhtml-1.$c {Scrolledhtml destruction} { iwidgets::scrolledhtml .sh pack .sh destroy .sh update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/scrolledlistbox.test0000644003604700454610000001426413127751371017223 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Scrolledlistbox class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: scrolledlistbox.test,v 1.6 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Scrolledlistbox-1.$c {Scrolledlistbox construction} { iwidgets::Scrolledlistbox .slb -height 300 -width 300 pack .slb -padx 10 -pady 10 -fill both -expand yes .slb insert end {Hello World} {Hello World} update } {} incr c # # Option tests which are successful. # test Scrolledlistbox-2.$o {configuration option} { llength [.slb configure] } {40} incr o foreach test { {-labeltext Scrolledlistbox Scrolledlistbox} {-height 200 200} {-width 200 200} {-labelpos nw nw} {-labelpos ne ne} {-labelpos en en} {-labelpos e e} {-labelpos es es} {-labelpos se se} {-labelpos s s} {-labelpos sw sw} {-labelpos wn wn} {-labelpos w w} {-labelpos ws ws} {-labelpos n n} {-borderwidth 3 3} {-hscrollmode none none} {-hscrollmode static static} {-hscrollmode dynamic dynamic} {-relief raised raised} {-relief sunken sunken} {-sbwidth 20 20} {-sbwidth 15 15} {-textbackground GhostWhite GhostWhite} {-scrollmargin 10 10} {-selectborderwidth 3 3} {-selectforeground blue blue} {-selectmode browse browse} {-selectmode extended extended} {-selectmode single single} {-selectmode multiple multiple} {-sticky w w} {-sticky nw nw} {-sticky n n} {-sticky ne ne} {-sticky e e} {-sticky se se} {-sticky s s} {-sticky sw sw} {-sticky news news} {-textfont 6x13 6x13} {-vscrollmode none none} {-vscrollmode static static} {-vscrollmode dynamic dynamic} {-visibleitems 30x20 30x20} {-width 0 0} {-height 0 0}} { set option [lindex $test 0] test Scrolledlistbox-2.$o "configuration options, $option" { .slb configure $option [lindex $test 1] lindex [.slb configure $option] 4 } [lindex $test 2] update incr o } # # Option tests which fail and produce errors. # foreach test { {-visibleitems bogus {bad visibleitems option "bogus": should be widthxheight}} {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}} {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}}} { set option [lindex $test 0] test Scrolledlistbox-2.$o "configuration options, $option" { list [catch {.slb configure $option [lindex $test 1]} msg] $msg } [list 1 [lindex $test 2]] incr o } # # Method tests which are successful. # foreach test { {{.slb insert 0 Test Test Test Test} {}} {{.slb insert end {More Test}} {}} {{.slb delete 1} {}} {{.slb delete 0 3} {}} {{.slb insert end World} {}} {{.slb selection set World} {}} {{.slb selection set World {More Test}} {}} {{.slb getcurselection} {{More Test} World}} {{.slb selecteditemcount} {2}} {{.slb selection clear 0 end} {}} {{.slb selecteditemcount} {0}} {{.slb clear} {}} {{.slb size} {0}} {{.slb insert end {Test} {Test} {Long String Test}} {}} {{.slb size} {3}} {{.slb insert 0 {Test} {Test} {Long String Test}} {}} {{.slb size} {6}} {{.slb insert 1 {Test} {Test} {Long String Test}} {}} {{.slb size} {9}} {{.slb insert 5 {Test} {Test} {XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}} {}} {{.slb size} {12}} {{.slb get end} {Long String Test}} {{.slb justify left} {}} {{.slb justify right} {}} {{.slb justify top} {}} {{.slb justify bottom} {}} {{.slb sort ascending} {}} {{.slb sort descending} {}} {{.slb sort increasing} {}} {{.slb sort decreasing} {}}} { set method [lindex [lindex $test 0] 1] test Scrolledlistbox-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 0 [lindex $test 1]] update incr m } # # Method tests which fail and produce errors # foreach test { {{.slb index bogus} {bad Scrolledlistbox index "bogus": must be active, anchor, end, @x,y, number, or a pattern}} {{.slb justify bogus} {bad justify argument "bogus": should be left, right, top, or bottom}} {{.slb sort bogus} {bad sort argument "bogus": must be a valid argument to the Tcl lsort command}}} { set method [lindex [lindex $test 0] 1] test Scrolledlistbox-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 1 [lindex $test 1]] incr m } # # Conclusion of constrcution/destruction tests # test Scrolledlistbox-1.$c {Scrolledlistbox destruction} { destroy .slb update } {} incr c test Scrolledlistbox-1.$c {Scrolledlistbox construction} { iwidgets::scrolledlistbox .slb -selectmode extended \ -vscrollmode static -hscrollmode dynamic -labeltext "List" \ -labelpos nw pack .slb -padx 10 -pady 10 -fill both -expand yes update } {} incr c test Scrolledlistbox-1.$c {Scrolledlistbox destruction} { destroy .slb update } {} incr c test Scrolledlistbox-1.$c {Scrolledlistbox destruction} { iwidgets::scrolledlistbox .slb pack .slb destroy .slb update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/scrolledtext.test0000644003604700454610000001124013127751371016512 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Scrolledtext class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: scrolledtext.test,v 1.6 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Scrolledtext-1.$c {Scrolledtext construction} { iwidgets::Scrolledtext .st pack .st -padx 10 -pady 10 -fill both -expand yes update } {} incr c # # Option tests which are successful. # test Scrolledtext-2.$o {configuration option} { llength [.st configure] } {49} incr o foreach test { {-background #d9d9d9 #d9d9d9} {-borderwidth 3 3} {-cursor gumby gumby} {-exportselection 0 0} {-exportselection 1 1} {-foreground Black Black} {-height 120 120} {-width 500 500} {-insertbackground Black Black} {-insertborderwidth 1 1} {-insertofftime 200 200} {-insertontime 500 500} {-insertwidth 3 3} {-labelmargin 5 5} {-labeltext Label Label} {-labelpos nw nw} {-labelpos ne ne} {-labelpos en en} {-labelpos e e} {-labelpos es es} {-labelpos se se} {-labelpos s s} {-labelpos sw sw} {-labelpos wn wn} {-labelpos w w} {-labelpos ws ws} {-labelpos n n} {-relief raised raised} {-relief sunken sunken} {-vscrollmode none none} {-vscrollmode static static} {-vscrollmode dynamic dynamic} {-hscrollmode none none} {-hscrollmode static static} {-hscrollmode dynamic dynamic} {-sbwidth 20 20} {-scrollmargin 5 5} {-selectborderwidth 2 2} {-state disabled disabled} {-state normal normal} {-sticky w w} {-sticky nw nw} {-sticky n n} {-sticky ne ne} {-sticky e e} {-sticky se se} {-sticky s s} {-sticky sw sw} {-sticky news news} {-textbackground GhostWhite GhostWhite} {-visibleitems 72x40 72x40} {-height 0 0} {-width 0 0} {-wrap char char} {-wrap none none}} { set option [lindex $test 0] test Scrolledtext-2.$o "configuration options, $option" { .st configure $option [lindex $test 1] lindex [.st configure $option] 4 } [lindex $test 2] update incr o } # # Option tests which fail and produce errors. # foreach test { {-visibleitems bogus {bad visibleitems option "bogus": should be widthxheight}} {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}} {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}}} { set option [lindex $test 0] test Scrolledtext-2.$o "configuration options, $option" { list [catch {.st configure $option [lindex $test 1]} msg] $msg } [list 1 [lindex $test 2]] incr o } # # Method tests which are successful. # foreach test { {{.st import ./scrolledtext.test} {}} {{.st export /tmp/scrolledtext.test} {}} {{.st clear} {}}} { set method [lindex [lindex $test 0] 1] test Scrolledtext-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 0 [lindex $test 1]] update incr m } # # Conclusion of constrcution/destruction tests # test Scrolledtext-1.$c {Scrolledtext destruction} { destroy .st update } {} incr c test Scrolledtext-1.$c {Scrolledtext construction} { iwidgets::scrolledtext .st -hscrollmode dynamic -labeltext "Label" \ -labelpos n -labelmargin 5 pack .st -padx 10 -pady 10 -fill both -expand yes update } {} incr c test Scrolledtext-1.$c {Scrolledtext destruction} { destroy .st update } {} incr c test Scrolledtext-1.$c {Scrolledtext destruction} { iwidgets::scrolledtext .st pack .st destroy .st update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/selectionbox.test0000644003604700454610000001201313127751371016473 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Selectionbox class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: selectionbox.test,v 1.4 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Selectionbox-1.$c {Selectionbox construction} { iwidgets::Selectionbox .sb .sb insert items end Hello {Out There} World set cs [label [.sb childsite].label -text "Child Site"] pack $cs -fill x -padx 10 -pady 10 pack .sb -padx 10 -pady 10 -fill both -expand yes update } {} incr c # # Option tests which are successful. # test Selectionbox-2.$o {configuration option} { llength [.sb configure] } {35} incr o foreach test { {-width 280 280} {-height 340 340} {-activebackground #ececec #ececec} {-activerelief raised raised} {-background #d9d9d9 #d9d9d9} {-textbackground GhostWhite GhostWhite} {-borderwidth 2 2} {-childsitepos n n} {-childsitepos s s} {-childsitepos e e} {-childsitepos w w} {-childsitepos center center} {-cursor gumby gumby} {-dblclickcommand {.sb configure -background blue} {.sb configure -background blue}} {-exportselection 1 1} {-foreground Black Black} {-highlightcolor Black Black} {-highlightthickness 2 2} {-insertbackground Black Black} {-insertborderwidth 0 0} {-insertofftime 300 300} {-insertontime 600 600} {-insertwidth 2 2} {-itemslabel "Items Label" "Items Label"} {-itemson no no} {-labelfont -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*} {-margin 10 10} {-itemson yes yes} {-selectbackground #c3c3c3 #c3c3c3} {-selectborderwidth 1 1} {-itemscommand {.sb selectitem} {.sb selectitem}} {-selectforeground Black Black} {-selectioncommand _command _command} {-selectionlabel "Selection Label" "Selection Label"} {-selectionon no no} {-selectionon yes yes} {-textfont 6x13 6x13} {-width 0 0} {-height 0 0}} { set option [lindex $test 0] test Selectionbox-2.$o "configuration options, $option" { .sb configure $option [lindex $test 1] lindex [.sb configure $option] 4 } [lindex $test 2] update incr o } # # Method tests which are successful. # foreach test { {{.sb childsite} {.sb.sbchildsite}} {{destroy [.sb childsite]} {}} {{.sb delete Hello 1} {}} {{.sb delete 0} {}} {{.sb insert items 0 One Two Three Four Five Six} {}} {{.sb component items get 0 end} {One Two Three Four Five Six}} {{.sb size} 6} {{.sb clear selection} {}} {{.sb insert selection 0 One} {}} {{.sb get} One} {{.sb index end} 6} {{.sb index Six} 5} {{.sb selection set 1} {}} {{.sb selectitem} {}} {{.sb curselection} 1} {{.sb get} Two} {{.sb delete Three} {}} {{.sb clear items} {}}} { set method [lindex [lindex $test 0] 1] test Selectionbox-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 0 [lindex $test 1]] update incr m } # # Method tests which fail and produce errors # foreach test { {{.sb clear bogus} {bad clear argument "bogus": should be selection or items}}} { set method [lindex [lindex $test 0] 1] test Selectionbox-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 1 [lindex $test 1]] incr m } # # Conclusion of constrcution/destruction tests # test Selectionbox-1.$c {Selectionbox destruction} { destroy .sb update } {} incr c test Selectionbox-1.$c {Selectionbox construction} { iwidgets::selectionbox .sb .sb component items configure -vscrollmode none -hscrollmode none pack .sb -padx 10 -pady 10 -fill both -expand yes update } {} incr c test Selectionbox-1.$c {Selectionbox destruction} { destroy .sb update } {} incr c test Selectionbox-1.$c {Selectionbox destruction} { iwidgets::selectionbox .sb pack .sb destroy .sb update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/selectiondialog.test0000644003604700454610000001233413127751371017150 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Selectiondialog class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # 4.x - Other tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: selectiondialog.test,v 1.5 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Selectiondialog-1.$c {Selectiondialog construction} { iwidgets::Selectiondialog .sd .sd insert items end Hello {Out There} World .sd activate } {} incr c # # Option tests which are successful. # test Selectiondialog-2.$o {configuration option} { llength [.sd configure] } {45} incr o foreach test { {-width 340 340} {-width 360 360} {-activerelief raised raised} {-borderwidth 2 2} {-background #d9d9d9 #d9d9d9} {-buttonboxpos n n} {-buttonboxpadx 10 10} {-buttonboxpos e e} {-buttonboxpos w w} {-buttonboxpady 10 10} {-buttonboxpos s s} {-cursor gumby gumby} {-foreground Black Black} {-highlightcolor Black Black} {-highlightthickness 2 2} {-modality global global} {-modality application application} {-modality none none} {-padx 15 15} {-pady 15 15} {-textbackground GhostWhite GhostWhite} {-separator off off} {-thickness 4 4} {-separator on on} {-title Selectiondialog Selectiondialog} {-childsitepos n n} {-childsitepos s s} {-childsitepos e e} {-childsitepos w w} {-childsitepos center center} {-cursor gumby gumby} {-exportselection 0 0} {-insertbackground Blue Blue} {-insertbackground Black Black} {-insertborderwidth 1 1} {-insertofftime 200 200} {-insertontime 500 500} {-insertwidth 3 3} {-itemslabel "Items Label" "Items Label"} {-itemson no no} {-labelfont 6x13 6x13} {-itemson yes yes} {-selectbackground #c3c3c3 #c3c3c3} {-selectborderwidth 2 2} {-selectforeground Black Black} {-selectionlabel "Selection Label" "Selection Label"} {-selectionon no no} {-selectionon yes yes} {-width 0 0} {-height 0 0} {-textfont 6x13 6x13}} { set option [lindex $test 0] test Selectiondialog-2.$o "configuration options, $option" { .sd configure $option [lindex $test 1] lindex [.sd configure $option] 4 } [lindex $test 2] update incr o } # # Method tests which are successful. # foreach test { {{.sd childsite} {.sd.shellchildsite.dschildsite.selectionbox.sbchildsite}} {{.sd clear items} {}} {{.sd component selectionbox component items get 0 end} {}} {{.sd insert items 0 One Two Three Four Five Six} {}} {{.sd component selectionbox component items get 0 end} {One Two Three Four Five Six}} {{.sd size} 6} {{.sd clear selection} {}} {{.sd insert selection 0 One} {}} {{.sd get} One} {{.sd index end} 6} {{.sd index Six} 5} {{.sd selection set 1} {}} {{.sd selectitem} {}} {{.sd curselection} 1} {{.sd get} Two} {{.sd delete Three} {}} {{.sd clear items} {}} {{.sd hide Help} {}} {{.sd hide Cancel} {}} {{.sd default Apply} {}} {{.sd show Cancel} {}} {{.sd deactivate} {}}} { set method [lindex [lindex $test 0] 1] test Selectiondialog-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 0 [lindex $test 1]] update incr m } # # Method tests which fail and produce errors # foreach test { {{.sd clear bogus} {bad clear argument "bogus": should be selection or items}} {{.sd insert bogus bogus} {bad insert argument "bogus": should be selection or items}}} { set method [lindex [lindex $test 0] 1] test Selectiondialog-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 1 [lindex $test 1]] incr m } # # Conclusion of constrcution/destruction tests # test Selectiondialog-1.$c {Selectiondialog destruction} { destroy .sd update } {} incr c test Selectiondialog-1.$c {Selectiondialog construction} { iwidgets::selectiondialog .sd update } {} incr c test Selectiondialog-1.$c {Selectiondialog destruction} { destroy .sd update } {} incr c test Selectiondialog-1.$c {Selectiondialog destruction} { iwidgets::selectiondialog .sd destroy .sd update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/shell.test0000644003604700454610000001066213127751371015114 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Shell class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # 4.x - Other tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: shell.test,v 1.6 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Shell-1.$c {Shell construction} { iwidgets::Shell .sh listbox [.sh childsite].lb -relief sunken pack [.sh childsite].lb -fill both -expand yes .sh center .sh activate } {} incr c # # Option tests which are successful. # test Shell-2.$o {configuration option} { llength [.sh configure] } {12} incr o foreach test { {-background #d9d9d9 #d9d9d9} {-width 200 200} {-height 200 200} {-cursor gumby gumby} {-modality global global} {-modality application application} {-modality none none} {-padx 15 15} {-pady 15 15} {-width 0 0} {-height 0 0} {-title "Shell" "Shell"}} { set option [lindex $test 0] test Shell-2.$o "configuration options, $option" { .sh configure $option [lindex $test 1] lindex [.sh configure $option] 4 } [lindex $test 2] update incr o } # # Option tests which fail and produce errors. # foreach test { {-modality bogus {bad modality option "bogus": should be none, application, or global}}} { set option [lindex $test 0] test Shell-2.$o "configuration options, $option" { list [catch {.sh configure $option [lindex $test 1]} msg] $msg } [list 1 [lindex $test 2]] incr o } # # Method tests which are successful. # foreach test { {{.sh childsite} {.sh.shellchildsite}} {{.sh activate} {}} {{.sh center .} {}} {{.sh center} {}}} { set method [lindex [lindex $test 0] 1] test Shell-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 0 [lindex $test 1]] update incr m } # # Deactivate test # test Shell-3.$m "object methods, deactivate" { list [catch {.sh deactivate} msg] $msg } [list 0 {}] update incr m # # Destruction test # test Shell-1.$c {Shell destruction} { destroy .sh update } {} incr c # # Global modality test. # test Shell-4.2 "global modality, activation, and deactivation" { iwidgets::shell .sh -modality global .sh center pack [label [.sh childsite].l -text "Global Modal Shell"] after 2000 {.sh deactivate Test} .sh center list [catch {.sh activate} msg] $msg } [list 0 Test] update # # Destruction test # test Shell-1.$c {Shell destruction} { destroy .sh update } {} incr c # # None modality test. # test Shell-4.3 "no modality, activation, and deactivation" { iwidgets::shell .sh -modality none .sh center pack [label [.sh childsite].l -text "Non-Modal Shell"] .sh center .sh activate update after 2000 .sh deactivate } {} update # # Destruction test # test Shell-1.$c {Shell destruction} { destroy .sh update } {} incr c # # Application modality test. # test Shell-4.4 "application modality, activation, and deactivation" { iwidgets::shell .sh -modality application .sh center pack [label [.sh childsite].l -text "Application Modal Shell"] after 2000 {.sh deactivate Test} .sh center list [catch {.sh activate} msg] $msg } [list 0 Test] update # # Destruction test # test Shell-1.$c {Shell destruction} { destroy .sh update } {} incr c test Shell-1.$c {Shell destruction} { iwidgets::shell .sh destroy .sh update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/spindate.test0000644003604700454610000001032213127751371015605 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Spindate class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: spindate.test,v 1.4 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Spindate-1.$c {Spindate construction} { iwidgets::Spindate .sd pack .sd -padx 10 -pady 10 -fill both -expand yes update } {} incr c # # Option tests which are successful. # test Spindate-2.$o {configuration option} { llength [.sd configure] } {26} incr o foreach test { {-arroworient horizontal horizontal} {-arroworient vertical vertical} {-background #d9d9d9 #d9d9d9} {-cursor gumby gumby} {-datemargin 3 3} {-daylabel Day: Day:} {-dayon false false} {-dayon true true} {-daywidth 4 4} {-labelmargin 4 4} {-labelpos n n} {-labelpos s s} {-labelpos e e} {-labelpos w w} {-monthformat integer integer} {-monthformat brief brief} {-monthformat full full} {-monthlabel Month: Month:} {-monthon false false} {-monthon true true} {-monthwidth 4 4} {-orient horizontal horizontal} {-orient vertical vertical} {-textbackground GhostWhite GhostWhite} {-yeardigits 2 2} {-yeardigits 4 4} {-yearlabel Year: Year:} {-yearon false false} {-yearon true true} {-yearwidth 4 4}} { set option [lindex $test 0] test Spindate-2.$o "configuration options, $option" { .sd configure $option [lindex $test 1] lindex [.sd configure $option] 4 } [lindex $test 2] update incr o } # # Option tests which fail and produce errors. # foreach test { {-yeardigits bogus {bad yeardigits option "bogus", should be 2 or 4}} {-monthformat bogus {bad monthformat option "bogus", should be "integer", "brief" or "full"}}} { set option [lindex $test 0] test Spindate-2.$o "configuration options, $option" { list [catch {.sd configure $option [lindex $test 1]} msg] $msg } [list 1 [lindex $test 2]] incr o } # # Method tests which are successful. # foreach test { {{.sd show 3/3/1960} {}} {{.sd get -string} "03 March 1960"}} { set method [lindex [lindex $test 0] 1] test Spindate-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 0 [lindex $test 1]] update incr m } foreach test { {{.sd show bogus} {bad date: "bogus", must be a valid date string, clock clicks value or the keyword now}} {{.sd get bogus} {bad format option "bogus": should be -string or -clicks}}} { set method [lindex [lindex $test 0] 1] test ScrolledListBox-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 1 [lindex $test 1]] incr m } # # Conclusion of constrcution/destruction tests # test Spindate-1.$c {Spindate destruction} { destroy .sd update } {} incr c test Spindate-1.$c {Spindate construction} { iwidgets::spindate .sd -monthformat brief pack .sd -padx 10 -pady 10 -fill both -expand yes update } {} incr c test Spindate-1.$c {Spindate destruction} { destroy .sd update } {} incr c test Spindate-1.$c {Spindate destruction} { iwidgets::spindate .sd pack .sd destroy .sd update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/spinint.test0000644003604700454610000001121213127751371015461 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Spinint class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: spinint.test,v 1.5 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Spinint-1.$c {Spinint construction} { iwidgets::Spinint .spi pack .spi -padx 10 -pady 10 -fill both -expand yes update } {} incr c # # Option tests which are successful. # test Spinint-2.$o {configuration option} { llength [.spi configure] } {48} incr o foreach test { {-background #d9d9d9 #d9d9d9} {-childsitepos e e} {-childsitepos s s} {-childsitepos w w} {-childsitepos n n} {-childsitepos e e} {-borderwidth 4 4} {-cursor gumby gumby} {-decrement {.spi insert end Down} {.spi insert end Down}} {-exportselection 0 0} {-fixed 10 10} {-borderwidth 2 2} {-foreground Black Black} {-increment {.spi insert end Up} {.spi insert end Up}} {-insertbackground Black Black} {-insertborderwidth 2 2} {-insertofftime 200 200} {-insertontime 500 500} {-insertwidth 3 3} {-labelfont 6x13 6x13} {-labelmargin 5 5} {-labeltext Label Label} {-labelpos w w} {-labelpos nw nw} {-labelpos n n} {-labelpos ne ne} {-labelpos e e} {-labelpos se se} {-labelpos s s} {-labelpos sw sw} {-arroworient horizontal horizontal} {-range {0 100} {0 100}} {-relief raised raised} {-selectbackground blue blue} {-selectbackground #c3c3c3 #c3c3c3} {-selectborderwidth 2 2} {-selectforeground Blue Blue} {-selectforeground Black Black} {-state disabled disabled} {-state normal normal} {-step 2 2} {-sticky w w} {-sticky nw nw} {-sticky n n} {-sticky ne ne} {-sticky e e} {-sticky se se} {-sticky s s} {-sticky sw sw} {-sticky news news} {-textfont 6x13 6x13} {-width 30 30} {-wrap 0 0}} { set option [lindex $test 0] test Spinint-2.$o "configuration options, $option" { .spi configure $option [lindex $test 1] lindex [.spi configure $option] 4 } [lindex $test 2] update incr o } # # Option tests which fail and produce errors. # foreach test { {-range {bogus} {wrong # args: should be ".spi configure -range {begin end}"}} {-range {bogus 0} {bad range option "bogus": begin value must be an integer}} {-range {0 bogus} {bad range option "bogus": end value must be an integer}} {-range {100 10} {bad option starting range "100": must be less than ending: "10"}}} { set option [lindex $test 0] test Spinint-2.$o "configuration options, $option" { list [catch {.spi configure $option [lindex $test 1]} msg] $msg } [list 1 [lindex $test 2]] incr o } # # Method tests which are successful. # foreach test { {{.spi clear} {}} {{.spi insert end 50} {}} {{.spi cget -step} 2} {{.spi up} {}} {{.spi down} {}} {{.spi get} 50}} { set method [lindex [lindex $test 0] 1] test Spinint-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 0 [lindex $test 1]] update incr m } # # Conclusion of constrcution/destruction tests # test Spinint-1.$c {Spinint destruction} { destroy .spi update } {} incr c test Spinint-1.$c {Spinint construction} { iwidgets::spinint .spi pack .spi -padx 10 -pady 10 -fill both -expand yes update } {} incr c test Spinint-1.$c {Spinint destruction} { destroy .spi update } {} incr c test Spinint-1.$c {Spinint destruction} { iwidgets::spinint .spi pack .spi destroy .spi update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/spinner.test0000644003604700454610000001004313127751371015454 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Spinner class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: spinner.test,v 1.6 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Spinner-1.$c {Spinner construction} { iwidgets::Spinner .sp pack .sp -padx 10 -pady 10 -fill both -expand yes update } {} incr c # # Option tests which are successful. # test Spinner-2.$o {configuration option} { llength [.sp configure] } {45} incr o foreach test { {-background #d9d9d9 #d9d9d9} {-foreground blue blue} {-borderwidth 4 4} {-childsitepos e e} {-childsitepos s s} {-childsitepos w w} {-childsitepos n n} {-childsitepos e e} {-borderwidth 2 2} {-cursor gumby gumby} {-decrement {.sp insert end Down} {.sp insert end Down}} {-exportselection 0 0} {-fixed 15 15} {-foreground Black Black} {-increment {.sp insert end Up} {.sp insert end Up}} {-insertbackground Blue Blue} {-insertbackground Black Black} {-insertborderwidth 2 2} {-insertofftime 200 200} {-insertontime 500 500} {-insertwidth 3 3} {-labelfont 6x13 6x13} {-labelmargin 5 5} {-labeltext Label Label} {-labelpos w w} {-labelpos nw nw} {-labelpos n n} {-labelpos ne ne} {-labelpos e e} {-labelpos se se} {-labelpos s s} {-labelpos sw sw} {-arroworient horizontal horizontal} {-relief raised raised} {-selectbackground #c3c3c3 #c3c3c3} {-selectborderwidth 2 2} {-selectforeground Black Black} {-state disabled disabled} {-state normal normal} {-sticky w w} {-sticky nw nw} {-sticky n n} {-sticky ne ne} {-sticky e e} {-sticky se se} {-sticky s s} {-sticky sw sw} {-sticky news news} {-textfont 6x13 6x13} {-validate numeric {::iwidgets::Entryfield::numeric %c}} {-repeatdelay 400 400} {-repeatdelay -100 0} {-repeatinterval 200 200} {-repeatinterval -100 0} {-width 30 30}} { set option [lindex $test 0] test Spinner-2.$o "configuration options, $option" { .sp configure $option [lindex $test 1] lindex [.sp configure $option] 4 } [lindex $test 2] update incr o } # # Method tests which are successful. # foreach test { {{.sp up} {}} {{.sp down} {}}} { set method [lindex [lindex $test 0] 1] test Spinner-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 0 [lindex $test 1]] update incr m } # # Conclusion of constrcution/destruction tests # test Spinner-1.$c {Spinner destruction} { destroy .sp update } {} incr c test Spinner-1.$c {Spinner construction} { iwidgets::spinner .sp pack .sp -padx 10 -pady 10 -fill both -expand yes update } {} incr c test Spinner-1.$c {Spinner destruction} { destroy .sp update } {} incr c test Spinner-1.$c {Spinner destruction} { iwidgets::spinner .sp pack .sp destroy .sp update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/spintime.test0000644003604700454610000000731313127751371015634 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Spintime class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: spintime.test,v 1.4 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Spintime-1.$c {Spintime construction} { iwidgets::Spintime .st pack .st -padx 10 -pady 10 -fill both -expand yes update } {} incr c # # Option tests which are successful. # test Spintime-2.$o {configuration option} { llength [.st configure] } {25} incr o foreach test { {-arroworient horizontal horizontal} {-arroworient vertical vertical} {-background #d9d9d9 #d9d9d9} {-cursor gumby gumby} {-hourlabel Hour: Hour:} {-houron false false} {-houron true true} {-hourwidth 4 4} {-labelmargin 4 4} {-labelpos n n} {-labelpos s s} {-labelpos e e} {-labelpos w w} {-militaryon no no} {-militaryon yes yes} {-minutelabel Minute: Minute:} {-minuteon false false} {-minuteon true true} {-minutewidth 4 4} {-orient horizontal horizontal} {-orient vertical vertical} {-secondlabel Second: Second:} {-secondon false false} {-secondon true true} {-secondwidth 4 4} {-textbackground GhostWhite GhostWhite} {-timemargin 3 3}} { set option [lindex $test 0] test Spintime-2.$o "configuration options, $option" { .st configure $option [lindex $test 1] lindex [.st configure $option] 4 } [lindex $test 2] update incr o } # # Method tests which are successful. # foreach test { {{.st show "21:21:21"} {}} {{.st get -string} "21:21:21"}} { set method [lindex [lindex $test 0] 1] test Spintime-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 0 [lindex $test 1]] update incr m } foreach test { {{.st show bogus} {bad time: "bogus", must be a valid time string, clock clicks value or the keyword now}} {{.st get bogus} {bad format option "bogus": should be -string or -clicks}}} { set method [lindex [lindex $test 0] 1] test ScrolledListBox-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 1 [lindex $test 1]] incr m } # # Conclusion of constrcution/destruction tests # test Spintime-1.$c {Spintime destruction} { destroy .st update } {} incr c test Spintime-1.$c {Spintime construction} { iwidgets::spintime .st pack .st -padx 10 -pady 10 -fill both -expand yes update } {} incr c test Spintime-1.$c {Spintime destruction} { destroy .st update } {} incr c test Spintime-1.$c {Spintime destruction} { iwidgets::spintime .st pack .st destroy .st update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/tabnotebook.test0000644003604700454610000002217613127751371016317 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Tabnotebook class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: tabnotebook.test,v 1.5 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Tabnotebook-1.$c {Tabnotebook construction} { iwidgets::Tabnotebook .tn pack .tn update .tn add -label one update .tn add -label two update .tn add -label three update } {} incr c # # Option tests which are successful. # test Tabnotebook-2.$o {configuration option} { llength [.tn configure] } {26} incr o foreach test { {-disabledforeground #a3a3a3 #a3a3a3 } {-start 4 4 } {-backdrop #d9d9d9 #d9d9d9 } {-borderwidth 2 2 } {-scrollcommand } {-font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* } {-gap overlap overlap } {-background #CDCDB7B7B5B5 #CDCDB7B7B5B5 } {-state normal normal } {-bevelamount 0 0 } {-equaltabs true true } {-foreground #000000000000 #000000000000 } {-raiseselect false false } {-padx 4 4 } {-pady 4 4 } {-margin 4 4 } {-cursor } {-angle 15 15 } {-tabbackground #d9d9d9 #d9d9d9 } {-tabborders true true } {-width 300 300 } {-tabpos s s } {-auto true true } {-height 150 150 } {-tabforeground Black Black } } { set option [lindex $test 0] test Tabnotebook-2.$o "configuration options, $option" { .tn configure $option [lindex $test 1] lindex [.tn configure $option] 4 } [lindex $test 2] update incr o } # # PageConfigure Option tests which are successful. # test Tabnotebook-2.$o {page configuration option} { llength [.tn pageconfigure 0] } {30} # do pageconfigure tests also... foreach test { {0 -label Hello Hello} {end -label "Hello World" "Hello World"} } { set index [lindex $test 0] set option [lindex $test 1] test Tabnotebook-2.$o "configuration options, $option" { .tn pageconfigure $index $option [lindex $test 2] lindex [.tn pageconfigure $index $option] 4 } [lindex $test 3] update incr o } # # Option tests which fail and produce errors. # #foreach test { # { -OPTION BADVALUE {ERROR_MESSAGE} } # } { # set option [lindex $test 0] # test Tabnotebook-2.$o "configuration options, $option" { # list [catch {.bb configure $option [lindex $test 1]} msg] $msg # } [list 1 [lindex $test 2]] # incr o #} # # Method tests which are successful. # foreach test { {{.tn add} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add -label Never} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add -label "Hello World" -disabledforeground gray} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn childsite Never} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn childsite 0} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn childsite end} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn index end} {[0-9]+}} {{.tn index Never} {[0-9]+}} {{.tn index 0} {0}} {{.tn select 0} {0}} {{.tn select select} {}} {{.tn select end} {[0-9]+}} {{.tn select "Hello World"} {[0-9]+}} {{.tn insert 0} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn insert select -label "An Insert"} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn insert end -label "Next To Last"} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn select 0} {0}} {{.tn next} {1}} {{.tn next} {2}} {{.tn prev} {1}} {{.tn prev} {0}} {{.tn delete Never} {}} {{.tn delete 1 2} {}} {{.tn delete 0 "Hello World"} {}} {{.tn add} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn delete 0 end} {}} {{.tn add} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn select 2} {[-]*[0-9]+}} {{.tn delete select end} {}} {{.tn delete 0 end} {}} {{.tn add -label "First Page"} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add -label "Second Page"} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add -label "Third Page"} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add -label "Fourth Page"} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add -label "Fifth Page"} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn add -label "Sixth Page"} {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}} {{.tn select "First Page"} {[-]*[0-9]+}} {{.tn delete select "Second Page"} {}} {{.tn delete "Third Page" 1} {}} {{.tn delete "Fifth Page" "Sixth Page"} {}} } { set method [lindex [lindex $test 0] 1] set method_invoke [lindex $test 0] set testContents "set msg {}\n" append testContents \ "set result \[catch \{[lindex $test 0]\} msg\]\n" append testContents \ "lappend result \[regexp -- \{[lindex $test 1]\} \$msg\] \n" append testContents "set result\n" test Tabnotebook-3.$m "\[$method_invoke\]" $testContents \ [list 0 1] update incr m } # # Method tests which fail and produce errors # set m 1 foreach test { {1 {.tn delete 0 end} {can't delete page}} {1 {.tn childsite 0} {can't get childsite, no pages}} {0 {.tn add} {}} {1 {.tn childsite 1} {bad Notebook page index in childsite method}} {1 {.tn childsite -1} {bad Notebook page index in childsite method}} {0 {.tn delete 0} {}} {1 {.tn delete 0} {can't delete page, no pages}} {0 {.tn add} {}} {1 {.tn delete 1} {bad Notebook page index in delete method:}} {1 {.tn delete select} {bad Notebook page index in delete method:}} {0 {.tn delete 0} {}} {0 {.tn add} {}} {1 {.tn delete 0 1} {bad Notebook page index2 in delete method:}} {1 {.tn delete 1 4} {bad Notebook page index1 in delete method:}} {0 {.tn add} {}} {1 {.tn delete 1 0} {bad Notebook page index1 in delete method: index1 is greater than index2}} {0 {.tn delete 0 1} {}} {0 {.tn add} {}} {1 {.tn delete 0 1 4 5 6} {wrong # args}} {1 {.tn delete} {wrong # args}} {0 {.tn delete 0} {}} {1 {.tn delete 0} {can't delete page}} {1 {.tn delete select} {can't delete page}} {1 {.tn insert 0} {can't insert page}} {0 {.tn add} {}} {0 {.tn add} {}} {1 {.tn insert 2} {bad Notebook page index in insert method:}} {1 {.tn insert -1} {bad Notebook page index}} {0 {.tn delete 0 end} {}} {1 {.tn next} {can't move to next page, no pages in the notebook}} {1 {.tn prev} {can't move to previous page, no pages in the notebook}} {1 {.tn select 0} {can't select page}} {0 {.tn add} {}} {1 {.tn select 1} {bad Notebook page index in select method:}} {0 {.tn delete 0} {}} } { set method_status [lindex $test 0] set method_invoke [lindex $test 1] set method [lindex $method_invoke 1] set testContents "set msg {}\n" append testContents \ "set result \[catch \{$method_invoke\} msg\]\n" append testContents \ "lappend result \[regexp -- \{[lindex $test 2]\} \$msg\] \n" append testContents "set result\n" test Tabnotebook-4.$m "\[$method_invoke\]" $testContents \ [list $method_status 1] incr m } # Conclusion of constrcution/destruction tests # test Tabnotebook-1.$c {Tabnotebook destruction} { destroy .tn update } {} incr c test Tabnotebook-1.$c {Tabnotebook construction} { iwidgets::Tabnotebook .tn -width 100 -height 100 pack .tn update .tn add -label one update .tn add -label two update .tn add -label three update } {} incr c test Tabnotebook-1.$c {Tabnotebook destruction} { destroy .tn update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/tabset.test0000644003604700454610000001776613127751371015303 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Tabset class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: tabset.test,v 1.6 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Tabset-1.$c {Tabset construction} { iwidgets::Tabset .ts pack .ts update .ts add -label one update .ts add -label two update .ts add -label three update } {} incr c # # Option tests which are successful. # test Tabset-2.$o {configuration option} { llength [.ts configure] } {24} incr o foreach test { {-disabledforeground #a3a3a3 #a3a3a3 } {-backdrop white white } {-start 4 4 } {-command } {-font fixed fixed } {-selectbackground #ececec #ececec } {-gap overlap overlap } {-background #CDCDB7B7B5B5 #CDCDB7B7B5B5 } {-state normal normal } {-equaltabs true true } {-bevelamount 0 0 } {-selectforeground black black } {-foreground #000000000000 #000000000000 } {-raiseselect false false } {-padx 4 4 } {-pady 4 4 } {-cursor } {-margin 5 5 } {-angle 20 20 } {-width 0 0 } {-tabborders true true } {-height 0 0 } {-tabpos s s } } { set option [lindex $test 0] test Tabset-2.$o "configuration options, $option" { .ts configure $option [lindex $test 1] lindex [.ts configure $option] 4 } [lindex $test 2] update incr o } # # Tabconfigure Option tests which are successful. # test Tabset-2.$o {tab configuration option} { llength [.ts tabconfigure 0] } {22} # do tabconfigure tests also... foreach test { {0 -bevelamount 0 0} {0 -state normal normal} {0 -anchor c c} {0 -image {} {}} {0 -bitmap {} {}} {0 -label Hello Hello} {0 -label "Hello World" "Hello World"} {0 -padx 4 4} {0 -pady 4 4} {0 -selectbackground gray70 gray70} {0 -selectforeground black black} {0 -disabledforeground gray gray} {0 -background white white} {0 -foreground black black} {0 -orient vertical vertical} {0 -invert false false} {0 -angle 20 20} {0 -font "-adobe-helvetica-bold-r-normal--34-240-100-100-p-182-iso8859-1" "-adobe-helvetica-bold-r-normal--34-240-100-100-p-182-iso8859-1"} {0 -tabborders true true} } { set index [lindex $test 0] set option [lindex $test 1] test Tabset-2.$o "tab configuration options, $option" { .ts tabconfigure $index $option [lindex $test 2] .ts tabcget $index $option } [lindex $test 3] update incr o } # # Option tests which fail and produce errors. # #foreach test { # { -OPTION BADVALUE {ERROR_MESSAGE} } # } { # set option [lindex $test 0] # test Tabset-2.$o "configuration options, $option" { # list [catch {.bb configure $option [lindex $test 1]} msg] $msg # } [list 1 [lindex $test 2]] # incr o #} # # Method tests which are successful. # foreach test { {{.ts add} {::.ts-tab[0-9]+}} {{.ts add} {::.ts-tab[0-9]+}} {{.ts add} {::.ts-tab[0-9]+}} {{.ts add -label Never} {::.ts-tab[0-9]+}} {{.ts add} {::.ts-tab[0-9]+}} {{.ts add -label "Hello World" -disabledforeground gray} {::.ts-tab[0-9]+}} {{.ts index end} {[0-9]+}} {{.ts index Never} {[0-9]+}} {{.ts index 0} {0}} {{.ts select 0} {0}} {{.ts select select} {0}} {{.ts select end} {[0-9]+}} {{.ts select "Hello World"} {[0-9]+}} {{.ts insert 0} {::.ts-tab[0-9]+}} {{.ts insert select -label "An Insert"} {::.ts-tab[0-9]+}} {{.ts insert end -label "Next To Last"} {::.ts-tab[0-9]+}} {{.ts select 0} {0}} {{.ts next} {1}} {{.ts next} {2}} {{.ts prev} {1}} {{.ts prev} {0}} {{.ts delete Never} {}} {{.ts delete 1 2} {}} {{.ts delete 0 "Hello World"} {}} {{.ts add} {::.ts-tab[0-9]+}} {{.ts add} {::.ts-tab[0-9]+}} {{.ts add} {::.ts-tab[0-9]+}} {{.ts add} {::.ts-tab[0-9]+}} {{.ts delete 0 end} {}} {{.ts add} {::.ts-tab[0-9]+}} {{.ts add} {::.ts-tab[0-9]+}} {{.ts add} {::.ts-tab[0-9]+}} {{.ts add} {::.ts-tab[0-9]+}} {{.ts select 2} {[-]*[0-9]+}} {{.ts delete select end} {}} {{.ts delete 0 end} {}} {{.ts add -label "First Page"} {::.ts-tab[0-9]+}} {{.ts add -label "Second Page"} {::.ts-tab[0-9]+}} {{.ts add -label "Third Page"} {::.ts-tab[0-9]+}} {{.ts add -label "Fourth Page"} {::.ts-tab[0-9]+}} {{.ts add -label "Fifth Page"} {::.ts-tab[0-9]+}} {{.ts add -label "Sixth Page"} {::.ts-tab[0-9]+}} {{.ts select "First Page"} {[-]*[0-9]+}} {{.ts delete select "Second Page"} {}} {{.ts delete "Third Page" 1} {}} {{.ts delete "Fifth Page" "Sixth Page"} {}} } { set method [lindex [lindex $test 0] 1] set method_invoke [lindex $test 0] set testContents "set msg {}\n" append testContents \ "set result \[catch \{[lindex $test 0]\} msg\]\n" append testContents \ "lappend result \[regexp -- \{[lindex $test 1]\} \$msg\] \n" append testContents "set result\n" test Tabset-3.$m "\[$method_invoke\]" $testContents \ [list 0 1] update incr m } # # Method tests which fail and produce errors # set m 1 foreach test { {1 {.ts delete 0 end} {can't delete tab}} {0 {.ts add} {}} {0 {.ts delete 0} {}} {1 {.ts delete 0} {can't delete tabs, no tabs}} {0 {.ts add} {}} {1 {.ts delete 1} {bad value for index1}} {1 {.ts delete select} {bad value for index1}} {0 {.ts delete 0} {}} {0 {.ts add} {}} {1 {.ts delete 0 1} {bad value for index2}} {1 {.ts delete 1 4} {bad value for index1}} {0 {.ts add} {}} {0 {.ts delete 0 1} {}} {0 {.ts add} {}} {1 {.ts delete 0 1 4 5 6} {wrong # args}} {1 {.ts delete} {wrong # args}} {0 {.ts delete 0} {}} {1 {.ts delete 0} {can't delete tabs}} {1 {.ts delete select} {can't delete tabs}} {1 {.ts insert 0} {no tab to insert before, tabset}} {0 {.ts add} {}} {0 {.ts add} {}} {1 {.ts insert 2} {bad value}} {1 {.ts insert -1} {bad }} {0 {.ts delete 0 end} {}} {1 {.ts next} {can't goto next tab, no tabs in the tabset}} {1 {.ts prev} {can't goto previous tab, no tabs in the tabset}} {1 {.ts select 0} {can't activate a tab, no tabs in the tabset}} {0 {.ts add} {}} {1 {.ts select 1} {bad value}} {0 {.ts delete 0} {}} } { set method_status [lindex $test 0] set method_invoke [lindex $test 1] set method [lindex $method_invoke 1] set testContents "set msg {}\n" append testContents \ "set result \[catch \{$method_invoke\} msg\]\n" append testContents \ "lappend result \[regexp -- \{[lindex $test 2]\} \$msg\] \n" append testContents "set result\n" test Tabset-4.$m "\[$method_invoke\]" $testContents \ [list $method_status 1] incr m } # Conclusion of constrcution/destruction tests # test Tabset-1.$c {Tabset destruction} { destroy .ts update } {} incr c test Tabset-1.$c {Tabset construction} { iwidgets::Tabset .ts -width 100 -height 100 pack .ts update .ts add -label one update .ts add -label two update .ts add -label three update } {} incr c test Tabset-1.$c {Tabset destruction} { destroy .ts update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/timeentry.test0000644003604700454610000001212113127751371016015 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Timeentry class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: timeentry.test,v 1.7 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Timeentry-1.$c {Timeentry construction} { iwidgets::Timeentry .te -labeltext "Time Entry" pack .te -padx 10 -pady 10 -fill both -expand yes update } {} incr c # # Option tests which are successful. # test Timeentry-2.$o {configuration option} { llength [.te configure] } {46} incr o foreach test { {-background #d9d9d9 #d9d9d9} {-borderwidth 4 4} {-borderwidth 2 2} {-command {.te configure -background red} {.te configure -background red}} {-cursor gumby gumby} {-exportselection 0 0} {-foreground Green Green} {-foreground Black Black} {-highlightcolor Red Red} {-highlightthickness 2 2} {-insertbackground Yellow Yellow} {-insertbackground Black Black} {-justify right right} {-justify center center} {-justify left left} {-labelmargin 5 5} {-labelpos w w} {-labelpos nw nw} {-labelpos n n} {-labelpos ne ne} {-labelpos e e} {-labelpos se se} {-labelpos s s} {-labelpos sw sw} {-labeltext Label Label} {-relief raised raised} {-relief sunken sunken} {-foreground black black} {-state disabled disabled} {-state normal normal} {-closetext Set Set} {-watchheight 200 200} {-watchwidth 200 200} {-hourradius .40 .40} {-hourcolor green green} {-minuteradius .90 .90} {-minutecolor blue blue} {-secondradius .99 .99} {-secondcolor red red} {-clockcolor brown brown} {-clockstipple error error} {-sticky w w} {-sticky nw nw} {-sticky n n} {-sticky ne ne} {-sticky e e} {-sticky se se} {-sticky s s} {-sticky sw sw} {-sticky news news} {-tickcolor purple purple} {-textbackground GhostWhite GhostWhite} {-textbackground #d9d9d9 #d9d9d9}} { set option [lindex $test 0] test Timeentry-2.$o "configuration options, $option" { .te configure $option [lindex $test 1] lindex [.te configure $option] 4 } [lindex $test 2] update incr o } # # Option tests which fail and produce errors. # foreach test { {-childsitepos bogus {bad childsite option "bogus": should be n, e, s, or w}}} { set option [lindex $test 0] test Timeentry-2.$o "configuration options, $option" { list [catch {.te configure $option [lindex $test 1]} msg] $msg } [list 1 [lindex $test 2]] incr o } # # Method tests which are successful. # foreach test { {{.te childsite} {.te.lwchildsite}} {{.te show "11:11:11 PM"} {11:11:11 PM}} {{.te get} {11:11:11 PM}} {{.te get -string} {11:11:11 PM}} {{.te isvalid} {1}} {{.te component time delete 0 end} {}} {{.te component time insert end 44:44:44} {}} {{.te isvalid} {0}} {{.te show now; list} {}}} { set method [lindex [lindex $test 0] 1] test Timeentry-3.$m "object methods, $method" { list [catch [lindex $test 0] msg] $msg } [list 0 [lindex $test 1]] update incr m } test Timeentry-3.$m "object methods, clock clicks" { set clicks [clock scan "3:15:00 PM"] .te show $clicks update .te get } {03:15:00 PM} incr m # # Method tests which fail and produce errors # foreach test { {{.te get bogus} {bad format option "bogus": should be -string or -clicks}} {{.te show bogus} {bad time: "bogus", must be a valid time string, clock clicks value or the keyword now}}} { set method [lindex [lindex $test 0] 1] test Timeentry-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 1 [lindex $test 1]] incr m } # # Conclusion of constrcution/destruction tests # test Timeentry-1.$c {Timeentry destruction} { destroy .te update } {} incr c test Timeentry-1.$c {Timeentry construction} { iwidgets::timeentry .te pack .te -padx 10 -pady 10 update } {} incr c test Timeentry-1.$c {Timeentry destruction} { destroy .te update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/timefield.test0000644003604700454610000001147613127751371015753 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Timefield class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: timefield.test,v 1.7 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Timefield-1.$c {Timefield construction} { iwidgets::Timefield .tf -labeltext "Date Field" pack .tf -padx 10 -pady 10 -fill both -expand yes update } {} incr c # # Option tests which are successful. # test Timefield-2.$o {configuration option} { llength [.tf configure] } {30} incr o foreach test { {-background #d9d9d9 #d9d9d9} {-borderwidth 4 4} {-borderwidth 2 2} {-command {.tf configure -background red} {.tf configure -background red}} {-cursor gumby gumby} {-exportselection 0 0} {-foreground Green Green} {-foreground Black Black} {-highlightcolor Red Red} {-highlightthickness 2 2} {-insertbackground Yellow Yellow} {-insertbackground Black Black} {-justify right right} {-justify center center} {-justify left left} {-labelmargin 5 5} {-labelpos w w} {-labelpos nw nw} {-labelpos n n} {-labelpos ne ne} {-labelpos e e} {-labelpos se se} {-labelpos s s} {-labelpos sw sw} {-labeltext Label Label} {-gmt true true} {-gmt false false} {-gmt on on} {-gmt off off} {-gmt 1 1} {-gmt 0 0} {-gmt yes yes} {-gmt no no} {-relief raised raised} {-relief sunken sunken} {-sticky w w} {-sticky nw nw} {-sticky n n} {-sticky ne ne} {-sticky e e} {-sticky se se} {-sticky s s} {-sticky sw sw} {-sticky news news} {-textbackground GhostWhite GhostWhite} {-textbackground #d9d9d9 #d9d9d9}} { set option [lindex $test 0] test Timefield-2.$o "configuration options, $option" { .tf configure $option [lindex $test 1] lindex [.tf configure $option] 4 } [lindex $test 2] update incr o } # # Option tests which fail and produce errors. # foreach test { {-childsitepos bogus {bad childsite option "bogus": should be n, e, s, or w}}} { set option [lindex $test 0] test Timefield-2.$o "configuration options, $option" { list [catch {.tf configure $option [lindex $test 1]} msg] $msg } [list 1 [lindex $test 2]] incr o } # # Method tests which are successful. # foreach test { {{.tf childsite} {.tf.lwchildsite}} {{.tf show "11:45:00 AM"} {11:45:00 AM}} {{.tf get} {11:45:00 AM}} {{.tf get -string} {11:45:00 AM}} {{.tf isvalid} {1}} {{.tf component time delete 0 end} {}} {{.tf component time insert end "44:44:44 PM"} {}} {{.tf isvalid} {0}} {{.tf show now; list} {}}} { set method [lindex [lindex $test 0] 1] test Timefield-3.$m "object methods, $method" { list [catch [lindex $test 0] msg] $msg } [list 0 [lindex $test 1]] update incr m } test Timefield-3.$m "object methods, clock clicks" { set clicks [clock scan "3:15:00 PM"] .tf show $clicks update .tf get } {03:15:00 PM} incr m # # Method tests which fail and produce errors # foreach test { {{.tf get bogus} {bad format option "bogus": should be -string or -clicks}} {{.tf show bogus} {bad time: "bogus", must be a valid time string, clock clicks value or the keyword now}}} { set method [lindex [lindex $test 0] 1] test Timefield-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 1 [lindex $test 1]] incr m } # # Conclusion of constrcution/destruction tests # test Timefield-1.$c {Timefield destruction} { destroy .tf update } {} incr c test Timefield-1.$c {Timefield construction} { iwidgets::timefield .tf pack .tf -padx 10 -pady 10 update } {} incr c test Timefield-1.$c {Timefield destruction} { destroy .tf update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/toolbar.test0000644003604700454610000001704513127751371015451 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Toolbar class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: toolbar.test,v 1.5 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 # # Initial construction test # test Toolbar-1.$c {Toolbar construction} { iwidgets::Toolbar .tb pack .tb update .tb add button item1 -text item1 update .tb add button item2 -text item2 update .tb add button item3 -text item3 update } {} incr c # # Option tests which are successful. # test Toolbar-2.$o {configuration option} { llength [.tb configure] } {27} incr o foreach test { {-disabledforeground #a3a3a3 #a3a3a3 } {-highlightthickness 0 0 } {-selectborderwidth 4 4 } {-balloonfont 6x10 6x10 } {-balloondelay1 1000 1000 } {-balloondelay2 200 200 } {-borderwidth 2 2 } {-selectcolor #CDCDB7B7B5B5 #CDCDB7B7B5B5 } {-highlightcolor Black Black } {-font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* } {-balloonbackground yellow yellow } {-helpvariable testing testing} {-troughcolor #c3c3c3 #c3c3c3 } {-selectbackground #c3c3c3 #c3c3c3 } {-highlightbackground #d9d9d9 #d9d9d9 } {-background #CDCDB7B7B5B5 #CDCDB7B7B5B5 } {-state normal normal } {-balloonforeground black black } {-selectforeground Black Black } {-foreground #000000000000 #000000000000 } {-activebackground #ececec #ececec } {-insertbackground Black Black } {-cursor crosshair crosshair } {-activeforeground Black Black } {-insertforeground Black Black } {-orient horizontal horizontal } } { set option [lindex $test 0] test Toolbar-2.$o "configuration options, $option" { .tb configure $option [lindex $test 1] .tb cget $option } [lindex $test 2] update incr o } # # Itemconfigure Option tests which are successful. # # This happens to be for a button. Note that the configuration options for # the Tk button changed in 8.4. Four new options were added. set newoptions [list -compound -overrelief -repeatdelay -repeatinterval] set o 0 if {$::tk_version < 8.4} { test Toolbar-3.$o {tab configuration option} { llength [.tb itemconfigure 0] } {33} } else { test Toolbar-3.$o {tab configuration option} { llength [.tb itemconfigure 0] } {37} } # do itemconfigure tests also... foreach test { {0 -activebackground #ececec #ececec } {0 -activeforeground Black Black } {0 -anchor center center } {0 -background #d9d9d9 #d9d9d9 } {0 -bd 0 0 } {0 -bg #d9d9d9 #d9d9d9 } {0 -bitmap {} {} } {0 -borderwidth 2 2 } {0 -command {} {} } {0 -compound none none } {0 -cursor {} {} } {0 -default disabled disabled } {0 -disabledforeground #a3a3a3 #a3a3a3 } {0 -fg Black Black } {0 -font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* } {0 -foreground Black Black } {0 -height 0 0 } {0 -highlightbackground #d9d9d9 #d9d9d9 } {0 -highlightcolor Black Black } {0 -highlightthickness 2 2 } {0 -image {} {} } {0 -justify center center } {0 -overrelief {} {} } {0 -padx 4 4 } {0 -pady 4 4 } {0 -relief raised raised } {0 -repeatdelay 0 0 } {0 -repeatinterval 0 0 } {0 -state normal normal } {0 -takefocus false false } {0 -text {} {} } {0 -textvariable {} {} } {0 -underline -1 -1 } {0 -width 0 0 } {0 -wraplength 0 0 } {0 -helpstr {} {} } {0 -balloonstr {} {} } } { set option [lindex $test 1] if {$::tk_version < 8.4} { if {[lsearch $newoptions $option] != -1} { # Skip it. continue } } set index [lindex $test 0] test Toolbar-2.$o "tab configuration options, $option" { .tb itemconfigure $index $option [lindex $test 2] .tb itemcget $index $option } [lindex $test 3] update incr o } # # Method tests which are successful. # foreach test { {{.tb delete 0 end} {}} {{.tb add radiobutton one} {.tb.one}} {{.tb index end} {0}} {{.tb add checkbutton two} {.tb.two}} {{.tb index end} {1}} {{.tb index one} {0}} {{.tb insert end button oneandhalf -text "One & half"} {.tb.oneandhalf}} {{.tb index oneandhalf} {1}} {{.tb delete oneandhalf} {}} {{.tb index two} {1}} {{.tb delete 0 end} {}} {{.tb index 0} {-1}} } { set method [lindex [lindex $test 0] 1] set method_invoke [lindex $test 0] set testContents "set msg {}\n" append testContents \ "set result \[catch \{[lindex $test 0]\} msg\]\n" append testContents \ "lappend result \[regexp -- \{[lindex $test 1]\} \$msg\] \n" append testContents "set result\n" test Toolbar-4.$m "\[$method_invoke\]" $testContents \ [list 0 1] update incr m } # # Method tests which fail and produce errors # foreach test { {1 {.tb delete 0 end} {}} {0 {.tb add button item1} {}} {0 {.tb delete 0} {}} {1 {.tb delete 0} {can't delete widget, no widgets in the Toolbar}} {0 {.tb add button item1} {}} {1 {.tb delete 1} {bad Toolbar widget index in delete method}} {0 {.tb delete 0} {}} {0 {.tb add button item1} {}} {1 {.tb delete 0 1} {bad Toolbar widget index2 in delete method}} {1 {.tb delete 1 4} {bad Toolbar widget index1 in delete method}} {0 {.tb add button item2} {}} {1 {.tb delete 1 0} {bad Toolbar widget index1 in delete method}} {0 {.tb delete 0 1} {}} {0 {.tb add button item1} {}} {1 {.tb delete 0 1 4 5 6} {wrong # args}} {1 {.tb delete} {wrong # args}} {0 {.tb delete 0} {}} {1 {.tb delete 0} {can't delete widget, no widgets in the Toolbar}} {1 {.tb insert 0 button itemA} {}} {0 {.tb add button item1} {}} {0 {.tb add button item2} {}} {0 {.tb insert 0 button itemAA} {}} {1 {.tb insert -1 button bogus} {bad toolbar entry index -1}} {0 {.tb delete 0 end} {}} } { set method_status [lindex $test 0] set method_invoke [lindex $test 1] set method [lindex $method_invoke 1] set testContents "set msg {}\n" append testContents \ "set result \[catch \{$method_invoke\} msg\]\n" append testContents \ "lappend result \[regexp -- \{[lindex $test 2]\} \$msg\] \n" append testContents "set result\n" test Toolbar-5.$m "\[$method_invoke\]" $testContents \ [list $method_status 1] incr m } # # Conclusion of constrcution/destruction tests # test Toolbar-1.$c {Toolbar destruction} { destroy .tb update } {} incr c test Toolbar-1.$c {Toolbar construction} { iwidgets::Toolbar .tb pack .tb update .tb add iwidgets::optionmenu opt update .tb add button b update .tb add frame filler update } {} incr c test Toolbar-1.$c {Toolbar destruction} { destroy .tb update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/usual.test0000644003604700454610000000472613127751371015142 0ustar dgp771div# This file is a Tcl script to test out all of the "usual" options # for all of the [incr Widgets]. It looks for other tests in this # directory, and tries to create a mega-widget with each of these # as a component. If there are any problems with "usual" definitions, # they will be found here. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: usual.test,v 1.4 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . # ---------------------------------------------------------------------- # Create a new mega-widget class that we can use to add other # classes as components. # ---------------------------------------------------------------------- test usual-1.1 {create a mega-widget that we can add components to} { itcl::class TestUsual { inherit itk::Widget method do {cmd} { eval $cmd } } TestUsual .testUsual } {.testUsual} # ---------------------------------------------------------------------- # Now, scan through all of the tests in this directory and look # for mega-widgets. Add each mega-widget to the test class. # ---------------------------------------------------------------------- set unique 0 foreach file [glob *.test] { set widget [file rootname [file tail $file]] if {$widget == "extbutton"} { if {$::tk_version < 8.4} { # Skip it. continue } } if {$widget != "usual"} { set name "c[incr unique]" test usual-1.2.$name "verify \"usual\" options for $widget" { .testUsual do [format { itk_component add %s { iwidgets::%s $itk_interior.%s } } $name $widget $name] } $name } } ::tcltest::cleanupTests exit iwidgets-4.1.0/tests/watch.test0000644003604700454610000000745513127751371015121 0ustar dgp771div# This file is a Tcl script to test out [incr Widgets] Watch class. # It is organized in the standard fashion for Tcl tests with the following # notation for test case labels: # # 1.x - Construction/Destruction tests # 2.x - Configuration option tests # 3.x - Method tests # # Copyright (c) 1995 DSC Technologies Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # @(#) $Id: watch.test,v 1.4 2017/07/07 18:29:13 dgp Exp $ package require tcltest namespace import -force ::tcltest::* loadTestedCommands if [catch {package require Iwidgets 4.0}] { # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY # env var is initialized in the Makefile when doing a 'make test'. # If sourcing this file independently, this variable must be set manually. if ![info exists env(IWIDGETS_LIBRARY)] { error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\ environment\nvariable to the directory that contains iwidgets.tcl" } lappend auto_path $env(IWIDGETS_LIBRARY) package require Iwidgets 4.0 } if {[string compare test [info procs test]] == 1} { source defs } wm geometry . {} raise . set c 1 set o 1 set m 1 catch {destroy .w} # # Initial construction test # test Watch-1.$c {Watch construction} { iwidgets::Watch .w pack .w -padx 10 -pady 10 -fill both -expand yes update } {} incr c # # Option tests which are successful. # test Watch-2.$o {configuration option} { llength [.w configure] } {34} incr o foreach test { {-background #d9d9d9 #d9d9d9} {-cursor gumby gumby} {-hourcolor yellow yellow} {-minutecolor blue blue} {-secondcolor green green} {-tickcolor red red} {-clockcolor orange orange} {-clockstipple error error} {-state disabled disabled} {-state normal normal} {-showampm no no} {-showampm yes yes} {-hourradius .3 .3} {-minuteradius .5 .5} {-secondradius .7 .7}} { set option [lindex $test 0] test Watch-2.$o "configuration options, $option" { .w configure $option [lindex $test 1] lindex [.w configure $option] 4 } [lindex $test 2] update incr o .w show after 500 } # # Option tests which fail and produce errors. # foreach test { {-state bogus {bad state option "bogus": should be normal or disabled}} {-showampm bogus {bad showampm option "bogus": should be boolean}}} { set option [lindex $test 0] test Watch-2.$o "configuration options, $option" { list [catch {.w configure $option [lindex $test 1]} msg] $msg } [list 1 [lindex $test 2]] incr o } # # Method tests which are successful. # foreach test { {{.w show "11:11:11"} {}} {{.w get} "11:11:11 AM"} {{.w show "now"} {}}} { set method [lindex [lindex $test 0] 1] test Watch-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 0 [lindex $test 1]] update incr m after 500 } foreach test { {{.w show bogus} {bad time: "bogus", must be a valid time string, clock clicks value or the keyword now}} {{.w get bogus} {bad format option "bogus": should be -string or -clicks}}} { set method [lindex [lindex $test 0] 1] test ScrolledListBox-3.$m "object methods, $method" { list [catch {eval [lindex $test 0]} msg] $msg } [list 1 [lindex $test 1]] incr m .w show after 500 } # # Conclusion of constrcution/destruction tests # test Watch-1.$c {Watch destruction} { destroy .w update } {} incr c test Watch-1.$c {Watch construction} { iwidgets::watch .w pack .w -padx 10 -pady 10 -fill both -expand yes update } {} incr c test Watch-1.$c {Watch destruction} { destroy .w update } {} incr c test Watch-1.$c {Watch destruction} { iwidgets::watch .w pack .w destroy .w update } {} ::tcltest::cleanupTests exit iwidgets-4.1.0/win/0000755003604700454610000000000013136712370012526 5ustar dgp771diviwidgets-4.1.0/win/iwidgets.tcl0000644003604700454610000000220207351714025015046 0ustar dgp771div# # iwidgets.tcl # ---------------------------------------------------------------------- # Invoked automatically by [incr Tk] upon startup to initialize # the [incr Widgets] package. # ---------------------------------------------------------------------- # AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com # # @(#) $Id: iwidgets.tcl,v 1.5 2001/09/18 18:53:09 smithc Exp $ # ---------------------------------------------------------------------- # Copyright (c) 1995 Mark L. Ulferts # ====================================================================== # See the file "license.terms" for information on usage and # redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. package require Tcl 8.1 package require Tk 8.1 package require Itcl 3.2 package require Itk 3.2 namespace eval ::iwidgets { namespace export * variable library [file dirname [info script]] variable version 4.0.1 } lappend auto_path $iwidgets::library \ [file join $iwidgets::library generic] \ [file join $iwidgets::library scripts] package provide Iwidgets $iwidgets::version iwidgets-4.1.0/win/makefile.vc0000644003604700454610000000314707302572414014643 0ustar dgp771div# Microsoft Visual C++ 4.0 makefile # # Copyright (c) 1993-1998 Lucent Technologies, Inc. # # RCS #(@) $Id: makefile.vc,v 1.4 2001/05/22 23:23:56 davygrvy Exp $ !include "pkg.vc" # You must define INSTALLDIR on the commandline, if Iwidgets is to be installed # from outside the Itcl source tree. !ifndef INSTALLDIR !include "../../config.vc" !endif ROOT = .. PACKAGE = iwidgets$(IWIDGETS_DOTVERSION) LIB_INSTALL_DIR = $(INSTALLDIR)\lib BIN_INSTALL_DIR = $(INSTALLDIR)\bin INCLUDE_INSTALL_DIR = $(INSTALLDIR)\include PKG_INSTALL_DIR = $(INSTALLDIR)\lib\$(PACKAGE) SCRIPT_INSTALL_DIR = $(PKG_INSTALL_DIR)\scripts DEMO_INSTALL_DIR = $(PKG_INSTALL_DIR)\demos # do nothing for this target. release : install : if not exist "$(INSTALLDIR)" mkdir "$(INSTALLDIR)" if not exist "$(LIB_INSTALL_DIR)" mkdir "$(LIB_INSTALL_DIR)" if not exist "$(PKG_INSTALL_DIR)" mkdir "$(PKG_INSTALL_DIR)" if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)" if not exist "$(DEMO_INSTALL_DIR)" mkdir "$(DEMO_INSTALL_DIR)" if not exist "$(DEMO_INSTALL_DIR)\html" mkdir "$(DEMO_INSTALL_DIR)\html" if not exist "$(DEMO_INSTALL_DIR)\images" mkdir "$(DEMO_INSTALL_DIR)\images" copy $(ROOT)\win\*.tcl "$(PKG_INSTALL_DIR)" copy $(ROOT)\generic\*.* "$(SCRIPT_INSTALL_DIR)" copy $(ROOT)\demos\*.* "$(DEMO_INSTALL_DIR)" copy $(ROOT)\demos\images\*.* "$(DEMO_INSTALL_DIR)\images" copy $(ROOT)\demos\html\*.* "$(DEMO_INSTALL_DIR)\html" copy $(ROOT)\demos\catalog "$(PKG_INSTALL_DIR)\catalog.tcl" echo package ifneeded Iwidgets $(IWIDGETS_DOTVERSION) [list source [file join $$dir iwidgets.tcl]] > \ "$(PKG_INSTALL_DIR)\pkgIndex.tcl" iwidgets-4.1.0/win/pkg.vc0000644003604700454610000000061107351714025013640 0ustar dgp771div###################################################################### # # Global package version numbers for iwidgets. # ###################################################################### # $Id: pkg.vc,v 1.4 2001/09/18 18:53:09 smithc Exp $ ###################################################################### IWIDGETS_DOTVERSION = 4.0.1 IWIDGETS_VERSION = $(IWIDGETS_DOTVERSION:.=)