bgerror.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:9k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # bgerror.tcl --
  2. #
  3. # Implementation of the bgerror procedure.  It posts a dialog box with
  4. # the error message and gives the user a chance to see a more detailed
  5. # stack trace, and possible do something more interesting with that
  6. # trace (like save it to a log).  This is adapted from work done by
  7. # Donal K. Fellows.
  8. #
  9. # Copyright (c) 1998-2000 by Ajuba Solutions.
  10. # Copyright (c) 2007 Daniel A. Steffen <das@users.sourceforge.net>
  11. # RCS: @(#) $Id: bgerror.tcl,v 1.23.2.9 2007/11/09 06:26:54 das Exp $
  12. # $Id: bgerror.tcl,v 1.23.2.9 2007/11/09 06:26:54 das Exp $
  13. namespace eval ::tk::dialog::error {
  14.     namespace import -force ::tk::msgcat::*
  15.     namespace export bgerror
  16.     option add *ErrorDialog.function.text [mc "Save To Log"] 
  17. widgetDefault
  18.     option add *ErrorDialog.function.command [namespace code SaveToLog]
  19.     if {[tk windowingsystem] eq "aqua"} {
  20. option add *ErrorDialog*background systemAlertBackgroundActive 
  21. widgetDefault
  22. option add *ErrorDialog*info.text.background white widgetDefault
  23. option add *ErrorDialog*Button.highlightBackground 
  24. systemAlertBackgroundActive widgetDefault
  25.     }
  26. }
  27. proc ::tk::dialog::error::Return {} {
  28.     variable button
  29.     .bgerrorDialog.ok configure -state active -relief sunken
  30.     update idletasks
  31.     after 100
  32.     set button 0
  33. }
  34. proc ::tk::dialog::error::Details {} {
  35.     set w .bgerrorDialog
  36.     set caption [option get $w.function text {}]
  37.     set command [option get $w.function command {}]
  38.     if { ($caption eq "") || ($command eq "") } {
  39. grid forget $w.function
  40.     }
  41.     lappend command [.bgerrorDialog.top.info.text get 1.0 end-1c]
  42.     $w.function configure -text $caption -command $command
  43.     grid $w.top.info - -sticky nsew -padx 3m -pady 3m
  44. }
  45. proc ::tk::dialog::error::SaveToLog {text} {
  46.     if { $::tcl_platform(platform) eq "windows" } {
  47. set allFiles *.*
  48.     } else {
  49. set allFiles *
  50.     }
  51.     set types [list
  52.     [list [mc "Log Files"] .log]
  53.     [list [mc "Text Files"] .txt]
  54.     [list [mc "All Files"] $allFiles] 
  55.     ]
  56.     set filename [tk_getSaveFile -title [mc "Select Log File"] 
  57.     -filetypes $types -defaultextension .log -parent .bgerrorDialog]
  58.     if {![string length $filename]} {
  59. return
  60.     }
  61.     set f [open $filename w]
  62.     puts -nonewline $f $text
  63.     close $f
  64. }
  65. proc ::tk::dialog::error::Destroy {w} {
  66.     if {$w eq ".bgerrorDialog"} {
  67. variable button
  68. set button -1
  69.     }
  70. }
  71. # ::tk::dialog::error::bgerror --
  72. # This is the default version of bgerror.
  73. # It tries to execute tkerror, if that fails it posts a dialog box containing
  74. # the error message and gives the user a chance to ask to see a stack
  75. # trace.
  76. # Arguments:
  77. # err - The error message.
  78. proc ::tk::dialog::error::bgerror err {
  79.     global errorInfo tcl_platform
  80.     variable button
  81.     set info $errorInfo
  82.     set ret [catch {::tkerror $err} msg];
  83.     if {$ret != 1} {return -code $ret $msg}
  84.     # Ok the application's tkerror either failed or was not found
  85.     # we use the default dialog then :
  86.     set windowingsystem [tk windowingsystem]
  87.     if {($tcl_platform(platform) eq "macintosh")
  88.              || ($windowingsystem eq "aqua")} {
  89. set ok [mc Ok]
  90. set messageFont system
  91. set textRelief flat
  92. set textHilight 0
  93.     } else {
  94. set ok [mc OK]
  95. set messageFont {Times -18}
  96. set textRelief sunken
  97. set textHilight 1
  98.     }
  99.     # Truncate the message if it is too wide (longer than 30 characacters) or
  100.     # too tall (more than 4 newlines).  Truncation occurs at the first point at
  101.     # which one of those conditions is met.
  102.     set displayedErr ""
  103.     set lines 0
  104.     foreach line [split $err n] {
  105. if { [string length $line] > 30 } {
  106.     append displayedErr "[string range $line 0 29]..."
  107.     break
  108. }
  109. if { $lines > 4 } {
  110.     append displayedErr "..."
  111.     break
  112. } else {
  113.     append displayedErr "${line}n"
  114. }
  115. incr lines
  116.     }
  117.     set w .bgerrorDialog
  118.     set title [mc "Application Error"]
  119.     set text [mc {Error: %1$s} $displayedErr]
  120.     set buttons [list ok $ok dismiss [mc "Skip Messages"] 
  121.     function [mc "Details >>"]]
  122.     # 1. Create the top-level window and divide it into top
  123.     # and bottom parts.
  124.     destroy .bgerrorDialog
  125.     toplevel .bgerrorDialog -class ErrorDialog
  126.     wm withdraw .bgerrorDialog
  127.     wm title .bgerrorDialog $title
  128.     wm iconname .bgerrorDialog ErrorDialog
  129.     wm protocol .bgerrorDialog WM_DELETE_WINDOW { }
  130.     if {($tcl_platform(platform) eq "macintosh")
  131.             || ($windowingsystem eq "aqua")} {
  132. ::tk::unsupported::MacWindowStyle style .bgerrorDialog moveableAlert {}
  133.     }
  134.     frame .bgerrorDialog.bot
  135.     frame .bgerrorDialog.top
  136.     if {$windowingsystem eq "x11"} {
  137. .bgerrorDialog.bot configure -relief raised -bd 1
  138. .bgerrorDialog.top configure -relief raised -bd 1
  139.     }
  140.     pack .bgerrorDialog.bot -side bottom -fill both
  141.     pack .bgerrorDialog.top -side top -fill both -expand 1
  142.     set W [frame $w.top.info]
  143.     text $W.text
  144.     -yscrollcommand [list $W.scroll set]
  145.     -setgrid true
  146.     -width 40
  147.     -height 10
  148.     -state normal
  149.     -relief $textRelief
  150.     -highlightthickness $textHilight
  151.     -wrap char
  152.     if {$windowingsystem eq "aqua"} {
  153. $W.text configure -width 80 -background white
  154.     }
  155.     scrollbar $W.scroll -command [list $W.text yview]
  156.     pack $W.scroll -side right -fill y
  157.     pack $W.text -side left -expand yes -fill both
  158.     $W.text insert 0.0 "$errn$info"
  159.     $W.text mark set insert 0.0
  160.     bind $W.text <ButtonPress-1> { focus %W }
  161.     $W.text configure -state disabled
  162.     # 2. Fill the top part with bitmap and message
  163.     # Max-width of message is the width of the screen...
  164.     set wrapwidth [winfo screenwidth .bgerrorDialog]
  165.     # ...minus the width of the icon, padding and a fudge factor for
  166.     # the window manager decorations and aesthetics.
  167.     set wrapwidth [expr {$wrapwidth-60-[winfo pixels .bgerrorDialog 9m]}]
  168.     label .bgerrorDialog.msg -justify left -text $text -font $messageFont 
  169.     -wraplength $wrapwidth
  170.     if {($tcl_platform(platform) eq "macintosh")
  171.             || ($windowingsystem eq "aqua")} {
  172. # On the Macintosh, use the stop bitmap
  173. label .bgerrorDialog.bitmap -bitmap stop
  174.     } else {
  175. # On other platforms, make the error icon
  176. canvas .bgerrorDialog.bitmap -width 32 -height 32 -highlightthickness 0
  177. .bgerrorDialog.bitmap create oval 0 0 31 31 -fill red -outline black
  178. .bgerrorDialog.bitmap create line 9 9 23 23 -fill white -width 4
  179. .bgerrorDialog.bitmap create line 9 23 23 9 -fill white -width 4
  180.     }
  181.     grid .bgerrorDialog.bitmap .bgerrorDialog.msg 
  182.     -in .bgerrorDialog.top
  183.     -row 0
  184.     -padx 3m
  185.     -pady 3m
  186.     grid configure  .bgerrorDialog.msg -sticky nsw -padx {0 3m}
  187.     grid rowconfigure  .bgerrorDialog.top 1 -weight 1
  188.     grid columnconfigure .bgerrorDialog.top 1 -weight 1
  189.     # 3. Create a row of buttons at the bottom of the dialog.
  190.     set i 0
  191.     foreach {name caption} $buttons {
  192. button .bgerrorDialog.$name
  193. -text $caption
  194. -default normal
  195. -command [namespace code [list set button $i]]
  196. grid .bgerrorDialog.$name
  197. -in .bgerrorDialog.bot
  198. -column $i
  199. -row 0
  200. -sticky ew
  201. -padx 10
  202. grid columnconfigure .bgerrorDialog.bot $i -weight 1
  203. # We boost the size of some Mac buttons for l&f
  204. if {($tcl_platform(platform) eq "macintosh")
  205.     || ($windowingsystem eq "aqua")} {
  206.     if {($name eq "ok") || ($name eq "dismiss")} {
  207. grid columnconfigure .bgerrorDialog.bot $i -minsize 90
  208.     }
  209.     grid configure .bgerrorDialog.$name -pady 7
  210. }
  211. incr i
  212.     }
  213.     # The "OK" button is the default for this dialog.
  214.     .bgerrorDialog.ok configure -default active
  215.     bind .bgerrorDialog <Return> [namespace code Return]
  216.     bind .bgerrorDialog <Destroy> [namespace code [list Destroy %W]]
  217.     .bgerrorDialog.function configure -command [namespace code Details]
  218.     # 6. Update all the geometry information so we know how big it wants
  219.     # to be, then center the window in the display and deiconify it.
  220.     ::tk::PlaceWindow .bgerrorDialog
  221.     # 7. Ensure that we are topmost.
  222.     raise .bgerrorDialog
  223.     if {$tcl_platform(platform) eq "windows"} {
  224. # Place it topmost if we aren't at the top of the stacking
  225. # order to ensure that it's seen
  226. if {[lindex [wm stackorder .] end] ne ".bgerrorDialog"} {
  227.     wm attributes .bgerrorDialog -topmost 1
  228. }
  229.     }
  230.     # 8. Set a grab and claim the focus too.
  231.     ::tk::SetFocusGrab .bgerrorDialog .bgerrorDialog.ok
  232.     # 9. Wait for the user to respond, then restore the focus and
  233.     # return the index of the selected button.  Restore the focus
  234.     # before deleting the window, since otherwise the window manager
  235.     # may take the focus away so we can't redirect it.  Finally,
  236.     # restore any grab that was in effect.
  237.     vwait [namespace which -variable button]
  238.     set copy $button; # Save a copy...
  239.     ::tk::RestoreFocusGrab .bgerrorDialog .bgerrorDialog.ok destroy
  240.     if {$copy == 1} {
  241. return -code break
  242.     }
  243. }
  244. namespace eval :: {
  245.     # Fool the indexer
  246.     proc bgerror err {}
  247.     rename bgerror {}
  248.     namespace import ::tk::dialog::error::bgerror
  249. }