home *** CD-ROM | disk | FTP | other *** search
- #
- # 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
-
- }
-
-