class WatchWin {
inherit VariableWin
constructor {args} {
set Sizebox 0
if {$init} {
set init 0
}
}
method build_win {f} {
global tcl_platform
set Menu [build_menu_helper Watch]
$Menu add command -label Remove -underline 0 \
-command [format {
%s remove [%s getSelection]
} $this $this]
set f [::frame $f.f]
set treeFrame [frame $f.top]
set entryFrame [frame $f.expr]
VariableWin::build_win $treeFrame
set Entry [entry $entryFrame.ent -font src-font]
button $entryFrame.but -text "Add Watch" -command [code $this validateEntry]
pack $f -fill both -expand yes
grid $entryFrame.ent -row 0 -column 0 -sticky news -padx 2
grid $entryFrame.but -row 0 -column 1 -padx 2
grid columnconfigure $entryFrame 0 -weight 1
grid columnconfigure $entryFrame 1
if {$tcl_platform(platform) == "windows"} {
grid columnconfigure $entryFrame 1 -pad 20
ide_sizebox [namespace tail $this].sizebox
place [namespace tail $this].sizebox -relx 1 -rely 1 -anchor se
}
grid $treeFrame -row 0 -column 0 -sticky news
grid $entryFrame -row 1 -column 0 -padx 5 -pady 5 -sticky news
grid columnconfigure $f 0 -weight 1
grid rowconfigure $f 0 -weight 1
window_name "Watch Expressions"
::update idletasks
bind $entryFrame.ent <Return> "$entryFrame.but flash; $entryFrame.but invoke"
}
method selectionChanged {entry} {
VariableWin::selectionChanged $entry
set state disabled
set entry [getSelection]
foreach var $Watched {
set name [lindex $var 0]
if {"$name" == "$entry"} {
set state normal
break
}
}
$Menu entryconfigure last -state $state
}
method validateEntry {} {
if {!$Running} {
debug "Getting entry value...."
set variable [$Entry get]
debug "Got $variable, going to add"
set ok [add $variable]
debug "Added... with ok: $ok"
$Entry delete 0 end
}
}
method clear_file {} {
VariableWin::clear_file
set Watched {}
}
destructor {
foreach var $Watched {
$var delete
}
}
method postMenu {X Y} {
set entry [getEntry $X $Y]
set found 0
foreach var $Watched {
set name [lindex $var 0]
if {"$name" == "$entry"} {
set found 1
break
}
}
set noStop [catch {$Popup index "Remove"} i]
if {!$noStop} {
$Popup delete $i
}
if {$found} {
$Popup add command -label "Remove" -command "$this remove \{$entry\}"
}
VariableWin::postMenu $X $Y
}
method remove {entry} {
global Display Update
set i [lsearch -exact $Watched $entry]
if {$i == -1} {
debug "WHAT HAPPENED?"
return
}
set Watched [lreplace $Watched $i $i]
set list [$Hlist info children $entry]
lappend list $entry
$Hlist delete entry $entry
$entry delete
}
method getVariablesBlankPath {} {
set list {}
set variables [displayedVariables {}]
foreach var $variables {
set name [$var name]
set on($name) 1
}
foreach var $Watched {
set name [$var name]
if {![info exists on($name)]} {
lappend list $var
}
}
return $list
}
method update {event} {
global Update Display
debug "START WATCH UPDATE CALLBACK"
catch {populate {}} msg
catch {VariableWin::update dummy} msg
debug "Did VariableWin::update with return \"$msg\""
debug "END WATCH UPDATE CALLBACK"
}
method showMe {} {
debug "Watched: $Watched"
}
method add {name} {
debug "Trying to add \"$name\" to watch"
set var [split $name \n]
set var [lindex $var 0]
set var [split $var =]
set var [lindex $var 0]
set var [string trim $var +-\;\ \r\n,]
set err [catch {gdb_cmd "set variable $var"} errTxt]
if {$err} {
dbug W "ERROR adding variable: $errTxt"
ManagedWin::open WarningDlg -transient \
-over $this -message [list $errTxt] -ignorable "watchvar"
} else {
if {[string index $var 0] == "\$"} {
catch {gdb_cmd "p $var"} msg
set msg [split $msg =]
set msg [string trim [lindex $msg 1] \ \r\n]
if {$msg == "void"} {
return 0
}
}
debug "In add, going to add $name"
set err [catch {set foo($name) 1}]
set err [expr {$err + [catch {expr {$foo($name) + 1}}]}]
if {!$err} {
set var [gdb_variable create -expr $name]
set ::Update($this,$var) 1
lappend Watched $var
update dummy
return 1
}
}
return 0
}
protected variable Entry
protected variable Watched {}
protected variable Menu {}
protected common init 1
}