home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / comanche.exe / lib / iwidgets3.0.0 / scripts / messagebox.itk < prev    next >
Text File  |  1999-02-24  |  13KB  |  404 lines

  1. #
  2. # Messagebox
  3. # ----------------------------------------------------------------------
  4. # Implements an information messages area widget with scrollbars.
  5. # Message types can be user defined and configured.  Their options
  6. # include foreground, background, font, bell, and their display
  7. # mode of on or off.  This allows message types to defined as needed,
  8. # removed when no longer so, and modified when necessary.  An export
  9. # method is provided for file I/O.
  10. #
  11. # The number of lines that can be displayed may be limited with
  12. # the default being 1000. When this limit is reached, the oldest line 
  13. # is removed.  There is also support for saving the contents to a 
  14. # file, using a file selection dialog.
  15. # ----------------------------------------------------------------------
  16. #
  17. # History:
  18. #   01/16/97 - Alfredo Jahn  Renamed from InfoMsgBox to MessageBox
  19. #       Initial release...
  20. #   01/20/97 - Alfredo Jahn  Add a popup window so that 3rd mouse
  21. #       button can be used to configure/access the message area.
  22. #       New methods added: _post and _toggleDebug.
  23. #   01/30/97 - Alfredo Jahn  Add -filename option
  24. #   05/11/97 - Mark Ulferts  Added the ability to define and configure 
  25. #       new types.  Changed print method to be issue.  
  26. #   09/05/97 - John Tucker Added export method. 
  27. #
  28. # ----------------------------------------------------------------------
  29. #  AUTHOR: Alfredo Jahn V               EMAIL: ajahn@spd.dsccc.com
  30. #          Mark L. Ulferts                     mulferts@austin.dsccc.com
  31. #
  32. #  @(#) $Id: messagebox.itk,v 1.2 1998/08/11 14:42:10 welch Exp $
  33. # ----------------------------------------------------------------------
  34. #            Copyright (c) 1997 DSC Technologies Corporation
  35. # ======================================================================
  36. # Permission to use, copy, modify, distribute and license this software 
  37. # and its documentation for any purpose, and without fee or written 
  38. # agreement with DSC, is hereby granted, provided that the above copyright 
  39. # notice appears in all copies and that both the copyright notice and 
  40. # warranty disclaimer below appear in supporting documentation, and that 
  41. # the names of DSC Technologies Corporation or DSC Communications 
  42. # Corporation not be used in advertising or publicity pertaining to the 
  43. # software without specific, written prior permission.
  44. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  45. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  46. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  47. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  48. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  49. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  50. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  51. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  52. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  53. # SOFTWARE.
  54. # ======================================================================
  55.  
  56. #
  57. # Usual options.
  58. #
  59. itk::usual Messagebox {
  60.     keep -activebackground -activeforeground -background -borderwidth \
  61.     -cursor -highlightcolor -highlightthickness \
  62.     -jump -labelfont -textbackground -troughcolor 
  63. }
  64.  
  65. # ------------------------------------------------------------------
  66. #                              MSGTYPE
  67. # ------------------------------------------------------------------
  68.  
  69. class iwidgets::MsgType {
  70.     constructor {args} {eval configure $args}
  71.  
  72.     public variable background \#d9d9d9
  73.     public variable bell 0
  74.     public variable font -*-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*
  75.     public variable foreground Black
  76.     public variable show 1
  77. }
  78.  
  79. # ------------------------------------------------------------------
  80. #                              MESSAGEBOX
  81. # ------------------------------------------------------------------
  82. class iwidgets::Messagebox {
  83.     inherit itk::Widget
  84.  
  85.     constructor {args} {}
  86.     destructor {}
  87.  
  88.     itk_option define -filename fileName FileName ""
  89.     itk_option define -maxlines maxLines MaxLines 1000
  90.     itk_option define -savedir saveDir SaveDir "[pwd]"
  91.  
  92.     public {
  93.         method clear {}
  94.         method export {filename} 
  95.         method find {}
  96.         method issue {string {type DEFAULT} args}
  97.         method save {}
  98.     method type {op tag args}
  99.     }
  100.  
  101.     protected {
  102.     variable _unique 0
  103.     variable _types {}
  104.     variable _interior {}
  105.  
  106.     method _post {x y}
  107.     }
  108. }
  109.  
  110. #
  111. # Provide a lowercased access method for the Messagebox class.
  112. proc ::iwidgets::messagebox {pathName args} {
  113.     uplevel ::iwidgets::Messagebox $pathName $args
  114. }
  115.  
  116. #
  117. # Use option database to override default resources of base classes.
  118. #
  119. option add *Messagebox.labelPos n widgetDefault
  120. option add *Messagebox.cursor top_left_arrow widgetDefault
  121. option add *Messagebox.height 0 widgetDefault
  122. option add *Messagebox.width 0 widgetDefault
  123. option add *Messagebox.visibleItems 80x24 widgetDefault
  124.  
  125. # ------------------------------------------------------------------
  126. #                           CONSTRUCTOR
  127. # ------------------------------------------------------------------
  128. body iwidgets::Messagebox::constructor {args} {
  129.     set _interior $itk_interior
  130.  
  131.     # 
  132.     # Create the text area.
  133.     #
  134.     itk_component add text {
  135.     iwidgets::Scrolledtext $itk_interior.text -width 1 -height 1 \
  136.         -state disabled -wrap none
  137.     } {
  138.     keep -borderwidth -cursor -exportselection -highlightcolor \
  139.         -highlightthickness -padx -pady -relief -setgrid -spacing1 \
  140.         -spacing2 -spacing3 
  141.  
  142.     keep -activerelief -elementborderwidth -jump -troughcolor
  143.  
  144.     keep -hscrollmode -height -sbwidth -scrollmargin -textbackground \
  145.         -visibleitems -vscrollmode -width
  146.  
  147.     keep -labelbitmap -labelfont -labelimage -labelmargin \
  148.         -labelpos -labeltext -labelvariable
  149.     }
  150.     grid $itk_component(text) -row 0 -column 0 -sticky nsew
  151.     grid rowconfigure $_interior 0 -weight 1
  152.     grid columnconfigure $_interior 0 -weight 1
  153.     
  154.     #
  155.     # Setup right mouse button binding to post a user configurable
  156.     # popup menu and diable the binding for left mouse clicks.
  157.     #
  158.     bind [$itk_component(text) component text] <ButtonPress-1> "break"
  159.     bind [$itk_component(text) component text] \
  160.     <ButtonPress-3> [code $this _post %x %y]
  161.     
  162.     #
  163.     # Create the small popup menu that can be configurable by users.
  164.     #
  165.     itk_component add itemMenu {
  166.     menu $itk_component(hull).itemmenu -tearoff 0 
  167.     } {
  168.     keep -background -font -foreground \
  169.         -activebackground -activeforeground
  170.     ignore -tearoff
  171.     }
  172.  
  173.     #
  174.     # Add clear and svae options to the popup menu.
  175.     #
  176.     $itk_component(itemMenu) add command -label "Clear" \
  177.     -command [code $this clear]
  178.     $itk_component(itemMenu) add command -label "Save" \
  179.     -command [code $this save]
  180.     $itk_component(itemMenu) add command -label "Find" \
  181.     -command [code $this find]
  182.  
  183.     #
  184.     # Create a standard type to be used if no others are specified.
  185.     #
  186.     type add DEFAULT
  187.  
  188.     eval itk_initialize $args
  189. }
  190.  
  191. # ------------------------------------------------------------------
  192. #                            DESTURCTOR
  193. # ------------------------------------------------------------------
  194. body iwidgets::Messagebox::destructor {} {
  195.     foreach type $_types {
  196.     type remove $type
  197.     }
  198. }
  199.  
  200. # ------------------------------------------------------------------
  201. #                            METHODS
  202. # ------------------------------------------------------------------
  203.  
  204. # ------------------------------------------------------------------
  205. # METHOD clear 
  206. #
  207. # Clear the text area.
  208. # ------------------------------------------------------------------
  209. body iwidgets::Messagebox::clear {} {
  210.     $itk_component(text) configure -state normal
  211.  
  212.     $itk_component(text) delete 1.0 end
  213.  
  214.     $itk_component(text) configure -state disabled
  215. }
  216.  
  217. # ------------------------------------------------------------------
  218. # PUBLIC METHOD: type <op> <tag> <args>
  219. #
  220. # The type method supports several subcommands.  Types can be added
  221. # removed and configured.  All the subcommands use the MsgType class
  222. # to implement the functionaility.
  223. # ------------------------------------------------------------------
  224. body iwidgets::Messagebox::type {op tag args} {
  225.     switch $op {
  226.     add {
  227.         eval iwidgets::MsgType $this$tag $args
  228.         
  229.         lappend _types $tag
  230.  
  231.         $itk_component(text) tag configure $tag \
  232.         -font [$this$tag cget -font] \
  233.         -background [$this$tag cget -background] \
  234.         -foreground [$this$tag cget -foreground]
  235.  
  236.         return $tag
  237.     }
  238.  
  239.     remove {
  240.         if {[set index [lsearch $_types $tag]] != -1} {
  241.         delete object $this$tag
  242.         set _types [lreplace $_types $index $index]
  243.  
  244.         return
  245.         } else {
  246.         error "bad message type: \"$tag\", does not exist"
  247.         }
  248.     }
  249.  
  250.     configure {
  251.         if {[set index [lsearch $_types $tag]] != -1} {
  252.         set retVal [eval $this$tag configure $args]
  253.  
  254.         $itk_component(text) tag configure $tag \
  255.             -font [$this$tag cget -font] \
  256.             -background [$this$tag cget -background] \
  257.             -foreground [$this$tag cget -foreground]
  258.  
  259.         return $retVal
  260.  
  261.         } else {
  262.         error "bad message type: \"$tag\", does not exist"
  263.         }
  264.     }
  265.  
  266.     cget {
  267.         if {[set index [lsearch $_types $tag]] != -1} {
  268.         return [eval $this$tag cget $args]
  269.         } else {
  270.         error "bad message type: \"$tag\", does not exist"
  271.         }
  272.     }
  273.  
  274.     default {
  275.         error "bad type operation: \"$op\", should be add,\
  276.                    remove, configure or cget"
  277.     }
  278.     }
  279. }
  280.  
  281. # ------------------------------------------------------------------
  282. # PUBLIC METHOD: issue string ?type? args
  283. #
  284. # Print the string out to the Messagebox. Check the options of the
  285. # message type to see if it should be displayed or if the bell 
  286. # should be wrong.
  287. # ------------------------------------------------------------------
  288. body iwidgets::Messagebox::issue {string {type DEFAULT} args} {
  289.     if {[lsearch $_types $type] == -1} {
  290.     error "bad message type: \"$type\", use the type\
  291.                command to create a new types"
  292.     }
  293.  
  294.     #
  295.     # If the type is currently configured to be displayed, then insert
  296.     # it in the text widget, add the tag to the line and move the 
  297.     # vertical scroll bar to the bottom.
  298.     #
  299.     set tag $this$type
  300.  
  301.     if {[$tag cget -show]} {
  302.     $itk_component(text) configure -state normal
  303.  
  304.     #
  305.     # Find end of last message.
  306.     #
  307.     set prevend [$itk_component(text) index "end - 1 chars"]
  308.     
  309.     $itk_component(text) insert end "$string\n" $args
  310.  
  311.     $itk_component(text) tag add $type $prevend "end - 1 chars"
  312.     $itk_component(text) yview end
  313.  
  314.     #
  315.     # Sound a beep if the message type is configured such.
  316.     #
  317.     if {[$tag cget -bell]} {
  318.         bell
  319.     }
  320.  
  321.     #
  322.     # If we reached our max lines limit, then remove enough lines to
  323.     # get it back under.
  324.     #
  325.     set lineCount [lindex [split [$itk_component(text) index end] "."] 0]
  326.  
  327.     if { $lineCount > $itk_option(-maxlines) } {
  328.         set numLines [expr $lineCount - $itk_option(-maxlines) -1]
  329.         
  330.         $itk_component(text) delete 1.0 $numLines.0
  331.     }
  332.  
  333.     $itk_component(text) configure -state disabled
  334.     }
  335. }
  336.  
  337. # ------------------------------------------------------------------
  338. # PUBLIC METHOD: save
  339. #
  340. # Save contents of messages area to a file using a fileselectionbox. 
  341. # ------------------------------------------------------------------
  342. body iwidgets::Messagebox::save {} {
  343.     set saveFile ""
  344.     set filter   ""
  345.  
  346.     set saveFile [tk_getSaveFile -title "Save Messages" \
  347.               -initialdir $itk_option(-savedir) \
  348.               -initialfile $itk_option(-filename)]
  349.  
  350.     if { $saveFile != "" } {
  351.     $itk_component(text) export $saveFile
  352.     issue "Contents saved to $pathname" INFO
  353.     }
  354. }
  355.  
  356. # ------------------------------------------------------------------
  357. # PUBLIC METHOD: find
  358. #
  359. # Search the contents of messages area for a specific string.
  360. # ------------------------------------------------------------------
  361. body iwidgets::Messagebox::find {} {
  362.     if {! [info exists itk_component(findd)]} {
  363.     itk_component add findd {
  364.         iwidgets::Finddialog $itk_interior.findd \
  365.         -textwidget $itk_component(text)
  366.     } 
  367.     }
  368.  
  369.     $itk_component(findd) center $itk_component(text)
  370.     $itk_component(findd) activate
  371. }
  372.  
  373. # ------------------------------------------------------------------
  374. # PRIVATE METHOD: _post
  375. #
  376. # Used internally to post the popup menu at the coordinate (x,y)
  377. # relative to the widget.
  378. # ------------------------------------------------------------------
  379. body iwidgets::Messagebox::_post {x y} {
  380.     set rx [expr [winfo rootx $itk_component(text)]+$x]
  381.     set ry [expr [winfo rooty $itk_component(text)]+$y]
  382.  
  383.     tk_popup $itk_component(itemMenu) $rx $ry
  384. }
  385.  
  386.  
  387. # ------------------------------------------------------------------
  388. # METHOD export filename
  389. #
  390. # write text to a file (export filename)
  391. # ------------------------------------------------------------------
  392. body iwidgets::Messagebox::export {filename} {
  393.     set f [open $filename w]
  394.     
  395.     set txt [$itk_component(text) get 1.0 end]
  396.     puts $f $txt
  397.     
  398.     flush $f
  399.     close $f
  400. }
  401.  
  402.