URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [insight/] [gdb/] [gdbtcl/] [globalpref.itb] - Rev 1765
Compare with Previous | Blame | View Log
# Global preference class implementation for GDBtk.
# Copyright 1997, 1998, 1999 Cygnus Solutions
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License (GPL) as published by
# the Free Software Foundation; either version 2 of the License, or (at
# your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# ----------------------------------------------------------------------
# Implements Global preferences dialog
#
# ----------------------------------------------------------------------
# ------------------------------------------------------------------
# PROC: _init - set up the tracing labels info
# ------------------------------------------------------------------
body GlobalPref::_init {} {
if {$inited} {
return
}
set inited 1
array set tracing_labels {
0 "Tracing features disabled"
1 "Tracing features enabled"
max_len 0
}
foreach elem [array names tracing_labels] {
set len [string length $tracing_labels($elem)]
set tracing_labels(max_len) \
[expr $len > $tracing_labels(max_len) ? $len : $tracing_labels(max_len) ]
}
}
# ------------------------------------------------------------------
# METHOD: constructor - create the Global Preferences object
# ------------------------------------------------------------------
body GlobalPref::constructor {args} {
window_name "Global Preferences"
_init
build_win
eval itk_initialize $args
}
# ------------------------------------------------------------------
# METHOD: destructor - destroy the Global Preferences object
# ------------------------------------------------------------------
body GlobalPref::destructor {} {
foreach thunk $Fonts {
font delete test-$thunk-font
}
}
# ------------------------------------------------------------------
# METHOD: build_win - build the dialog
# ------------------------------------------------------------------
body GlobalPref::build_win {} {
global tcl_platform GDBTK_LIBRARY
debug
frame $itk_interior.f
frame $itk_interior.x
set frame $itk_interior.f
# Icons
frame $frame.icons
label $frame.icons.lab -text "Icons "
combobox::combobox $frame.icons.cb -editable 0 -maxheight 10\
-command [code $this change_icons]
# get list of icon directories
set curdir [pwd]
set icondirlist ""
cd $GDBTK_LIBRARY
foreach foo [glob -- *] {
if {[file isdirectory $foo] && [file exists [file join $foo "icons.txt"]]} {
lappend icondirlist $foo
}
}
set width 14
# load combobox
set imagedir [pref get gdb/ImageDir]
foreach dir $icondirlist {
if {![string compare $dir $imagedir]} {
set cdir 1
} else {
set cdir 0
}
set foo [file join $dir "icons.txt"]
if {[catch {::open $foo r} fid]} {
# failed
dbug E "couldn't open $foo:$fid"
if {$cdir} {$frame.icons.cb entryset "unknown icons"}
$frame.icons.cb list insert end "unknown icons"
} else {
if {[gets $fid txt] >= 0} {
if {$cdir} {$frame.icons.cb entryset $txt}
if {[string length $txt] > $width} {set width [string length $txt]}
$frame.icons.cb list insert end $txt
} else {
if {$cdir} {$frame.icons.cb entryset "unknown icons"}
$frame.icons.cb list insert end "unknown icons"
}
close $fid
}
}
$frame.icons.cb configure -width $width
cd $curdir
# searching for fixed font families take a long time
# therefore, we cache the font names. The font cache
# can be saved in the init file. A way should be provided
# to rescan the font list, without deleting the entry from the
# init file.
set font_cache [pref get gdb/font_cache]
if {$font_cache == ""} {
if {$tcl_platform(platform) == "unix"} {
toplevel .c
wm title .c "Scanning for fonts"
message .c.m -width 3i -text "Scanning system for fonts\n\nPlease wait..." \
-relief flat -padx 30 -pady 30 \
-bg [pref get gdb/global_prefs/message_bg] \
-fg [pref get gdb/global_prefs/message_fg]
::update
pack .c.m
focus .c
::raise .c
::update
}
set fam [font families]
foreach fn $fam {
if {[font metrics [list $fn] -fixed] == 1} {
lappend font_cache $fn
}
}
pref set gdb/font_cache $font_cache
if {$tcl_platform(platform) == "unix"} { destroy .c }
}
Labelledframe $frame.d -text "Fonts"
set f [$frame.d get_frame]
make_font_item $f fixed "Fixed Font:" $font_cache
if {$tcl_platform(platform) != "windows"} {
# Cannot change the windows menu font ourselves
make_font_item $f menu "Menu Font:" [font families]
}
make_font_item $f default "Default Font:" [font families]
make_font_item $f status "Status Bar Font:" [font families]
# This is the tracing preference
set tracing_cb [pref get gdb/mode]
if { ![info exists tracing_labels($tracing_cb)]} {
debug "Got unknown mode value: $tracing_cb"
set tracing_labels($tracing_cb) "Unknown gdb mode..."
}
frame $frame.tracing
checkbutton $frame.tracing.cb -variable [scope tracing_cb] \
-text $tracing_labels($tracing_cb) \
-command [code $this toggle_tracing $frame.tracing.cb] \
-width $tracing_labels(max_len) -anchor w
pack $frame.tracing.cb -pady 10 -side left -fill none
# help browser preferences
if {$tcl_platform(platform) == "windows"} {
set help_text "Use Internet Browser to View Help Files"
} else {
set help_text "Use Netscape to View Help Files"
}
frame $frame.browser
checkbutton $frame.browser.cb \
-text $help_text -variable [pref varname gdb/help/browser]
pack $frame.browser.cb -pady 10 -side left -fill none
# use_icons
if {$tcl_platform(platform) == "unix"} {
frame $frame.use_icons
checkbutton $frame.use_icons.cb \
-text "Use builtin image as icon." -variable [pref varname gdb/use_icons]
pack $frame.use_icons.cb -pady 10 -side left -fill none
}
# console wrap
frame $frame.consolewrap
checkbutton $frame.consolewrap.cw -text "wrap text in console window" \
-variable [pref varname gdb/console/wrap]
pack $frame.consolewrap.cw -pady 10 -side left -fill none
pack $frame.icons.lab $frame.icons.cb -side left
pack $frame.icons -side top -padx 10 -pady 10
pack $frame.tracing -side top -fill x -expand 0 -side bottom
pack $frame.browser -side top -fill x -expand 0 -side bottom
if {$tcl_platform(platform) == "unix"} {
pack $frame.use_icons -side top -fill x -expand 0 -side bottom
}
pack $frame.consolewrap -side top -fill x -expand 0 -side bottom
pack $frame.d -side top -fill both -expand yes
# make buttons
button $itk_interior.x.ok -text OK -underline 0 -width 7 -command [code $this ok]
button $itk_interior.x.apply -text Apply -width 7 -underline 0 -command [code $this apply]
button $itk_interior.x.cancel -text Cancel -width 7 -underline 0 -command [code $this cancel]
pack $itk_interior.x.ok $itk_interior.x.apply $itk_interior.x.cancel -side left
standard_button_box $itk_interior.x
pack $itk_interior.x -fill x -padx 5 -pady 5 -side bottom
pack $itk_interior.f -fill both -expand yes -padx 10 -pady 5
bind $itk_interior.x.ok <Return> \
"$itk_interior.x.ok flash; $itk_interior.x.ok invoke"
focus $itk_interior.x.ok
# We don't want the window flashing around as we change the fonts...
::update idletasks
resize_font_item_height
pack propagate $itk_interior.f 0
}
# ------------------------------------------------------------------
# PRIVATE METHOD: make_font_item
# ------------------------------------------------------------------
body GlobalPref::make_font_item {f name label font_list} {
# create ComboBox with font name
lappend Fonts $name
set Original($name,family) [font actual global/$name -family]
set Original($name,size) [font actual global/$name -size]
font create test-$name-font -family $Original($name,family) \
-size $Original($name,size)
label $f.${name}x -text $label
combobox::combobox $f.${name}n -editable 0 -value $Original($name,family) \
-command [code $this wfont_changed family $name]
foreach a $font_list {
$f.${name}n list insert end $a
}
tixControl $f.${name}s -label Size: -integer true -max 18 -min 6 \
-value $Original(${name},size) -command [code $this font_changed size $name]
[$f.${name}s subwidget entry] configure -width 2
label $f.${name}l -text ABCDEFabcdef0123456789 -font test-$name-font
grid $f.${name}x $f.${name}n $f.${name}s $f.${name}l -sticky we -padx 5 -pady 5
grid columnconfigure $f 3 -weight 1
}
# ------------------------------------------------------------------
# PRIVATE METHOD: resize_font_item_height
# ------------------------------------------------------------------
body GlobalPref::resize_font_item_height {} {
foreach font $Fonts {
set master [$itk_interior.f.d get_frame]
set row [gridCGet $master.${font}l -row]
grid rowconfigure $master $row -minsize [lindex [grid bbox $master 0 $row 3 $row ] 3]
}
}
# ------------------------------------------------------------------
# PRIVATE METHOD: change_icons
# ------------------------------------------------------------------
body GlobalPref::change_icons {w args} {
global gdb_ImageDir GDBTK_LIBRARY
set index [$w list curselection]
if {$index != ""} {
set dir [lindex $icondirlist $index]
pref set gdb/ImageDir $dir
set gdb_ImageDir [file join $GDBTK_LIBRARY $dir]
ManagedWin::restart
}
}
# ------------------------------------------------------------------
# PRIVATE METHOD: wfont_changed - callback from font comboboxes
# PRIVATE METHOD: font_changed - callback from font tixControls
# ------------------------------------------------------------------
body GlobalPref::wfont_changed {attribute font w val} {
font_changed $attribute $font $val
}
body GlobalPref::font_changed {attribute font val} {
# val will be a size or a font name
switch $attribute {
size {
set oldval [font configure test-$font-font -size]
font configure test-$font-font -size $val
}
family {
set oldval [font configure test-$font-font -family]
font configure test-$font-font -family $val
}
default { debug "GlobalPref::font_changed -- invalid change" }
}
}
# ------------------------------------------------------------------
# METHOD: toggle_tracing_mode - toggles the tracing mode on and off
# ------------------------------------------------------------------
body GlobalPref::toggle_tracing_mode {} {
pref set gdb/mode $tracing_cb
# Reset the button-1 behavior if you are going out of trace mode.
if {!$tracing_cb} {
pref set gdb/B1_behavior 1
}
}
body GlobalPref::toggle_tracing {win} {
debug foo
$win configure -text $tracing_labels($tracing_cb)
}
# ------------------------------------------------------------------
# METHOD: ok - called to accept settings and close dialog
# ------------------------------------------------------------------
body GlobalPref::ok {} {
apply 1
}
# ------------------------------------------------------------------
# METHOD: apply - apply current settings to the screen
# ------------------------------------------------------------------
body GlobalPref::apply {{deleteMe 0}} {
set commands {}
# If you are not destroying the window, then make sure to
# propagate the geometry info from the font frame, so that changing
# the fonts IN the window don't cause some of the buttons to
# get obscured...
if {!$deleteMe} {
pack propagate $itk_interior.f 1
}
foreach thunk $Fonts {
set font [font configure test-$thunk-font]
if {[pref get global/font/$thunk] != $font} {
lappend commands [list pref set global/font/$thunk $font]
}
}
if {[pref get gdb/mode] != $tracing_cb} {
lappend commands toggle_tracing_mode
}
if {[llength $commands] > 0} {
foreach command $commands {
eval $command
}
if {$deleteMe} {
unpost
}
ManagedWin::restart
return
}
if {$deleteMe} {
unpost
} else {
after idle "
update idletasks
[code $this resize_font_item_height]
pack propagate $itk_interior.f 0
"
}
}
# ------------------------------------------------------------------
# METHOD: cancel - forget current settings -- reset to original
# state and close preferences
# ------------------------------------------------------------------
body GlobalPref::cancel {} {
# Reset fonts if different
set commands {}
foreach thunk $Fonts {
set family [font configure global/$thunk -family]
set size [font configure global/$thunk -size]
if {$Original($thunk,family) != $family || $Original($thunk,size) != $size} {
lappend commands [list pref set global/font/$thunk \
[list -family $Original($thunk,family) -size $Original($thunk,size)]]
}
}
if {[llength $commands] > 0} {
foreach command $commands {
eval $command
}
}
if {[llength $commands] > 0} {
ManagedWin::restart
}
unpost
}