class GDBSrcBar {
inherit GDBToolBar
constructor {src args} {
GDBToolBar::constructor $src
} {
eval itk_initialize $args
add_hook gdb_trace_find_hook "$this trace_find_hook"
}
destructor {
global GDBSrcBar_state
unset GDBSrcBar_state($this)
remove_hook gdb_trace_find_hook "$this trace_find_hook"
}
public variable updatecommand {}
public variable updatevalue 0 {
global GDBSrcBar_state
::set GDBSrcBar_state($this) $updatevalue
}
public variable address {} {
if {$ButtonFrame != "" && [winfo exists $ButtonFrame.addr]} {
$ButtonFrame.addr configure -text $address -font src-font
}
}
public variable line {} {
if {$ButtonFrame != "" && [winfo exists $ButtonFrame.line]} {
$ButtonFrame.line configure -text $line
}
}
public variable displaymode SOURCE {
if {$ButtonFrame != ""} {
_set_stepi
}
}
public variable runstop normal {
if {$ButtonFrame != ""} {
_set_runstop
}
}
public variable Tracing 0 ; public variable Browsing 0 ; public variable Collecting 0 ;
public method create_menu_items {} {
global enable_external_editor tcl_platform
set m [new_menu file "File" 0]
if {[info exists enable_external_editor] && $enable_external_editor} {
add_menu_command None "Edit Source" \
[list $this _apply_source edit]
}
add_menu_command Other "Open..." \
"_open_file" -underline 0 -accelerator "Ctrl+O"
add_menu_command Other "Source..." \
"source_file" -underline 0
add_menu_separator
if {$tcl_platform(platform) == "windows"} {
add_menu_command None "Page Setup..." \
[format {
set top %s
ide_winprint page_setup -parent $top
} [winfo toplevel [namespace tail $this]]] \
-underline 8
add_menu_command None "Print Source..." \
"$this _apply_source print" \
-underline 0 -accelerator "Ctrl+P"
add_menu_separator
}
add_menu_command Other "Target Settings..." "set_target_name" \
-underline 0
add_menu_separator
add_menu_command None "Exit" gdbtk_quit -underline 1
create_run_menu
create_view_menu
if {[pref get gdb/control_target]} {
create_control_menu
}
if {[pref get gdb/mode]} {
create_trace_menu
}
new_menu pref "Preferences" 0
add_menu_command Other "Global..." \
"ManagedWin::open GlobalPref -transient" -underline 0
add_menu_command Other "Source..." \
"ManagedWin::open SrcPref -transient" -underline 0
create_help_menu
return 1
}
public method create_buttons {} {
global enable_external_editor
add_button stop None {} {}
_set_runstop
if {[pref get gdb/mode]} {
add_button tstop Control [list $this do_tstop] "Start Collection" \
-image Movie_on_img
add_button view Other [list $this set_control_mode 1] \
"Switch to Browse Mode" -image watch_movie_img
add_button_separator
}
if {[pref get gdb/control_target]} {
create_control_buttons
if {[pref get gdb/mode]} {
create_trace_buttons 0
}
} elseif {[get pref gdb/mode]} {
create_trace_buttons 1
}
add_button_separator
create_window_buttons
bind $Buttons(reg) <Button-3> "ManagedWin::open RegWin -force"
bind $Buttons(mem) <Button-3> "ManagedWin::open MemWin -force"
bind $Buttons(watch) <Button-3> "ManagedWin::open WatchWin -force"
bind $Buttons(vars) <Button-3> "ManagedWin::open LocalsWin -force"
add_button_separator
if {[info exists enable_external_editor] && $enable_external_editor} {
add_button edit Other [list $this _apply_source edit] "Edit Source" \
-image edit_img
add_button_separator
}
add_label addr $address "Address" -width 10 -relief sunken -bd 1 -anchor e \
-font src-font
add_label line $line "Line Number" -width 6 -relief sunken -bd 1 -anchor e \
-font src-font
button_right_justify
create_stack_buttons
}
public method _toggle_updates {} {
global GDBSrcBar_state
if {$updatecommand != ""} {
uplevel \ }
}
public method cancel_download {} {
global download_dialog download_cancel_ok
if {"$download_dialog" != ""} {
$download_dialog cancel
} else {
set download_cancel_ok 1
}
}
method create_run_menu {} {
if {![menu_exists Run]} {
set run_menu [new_menu run "Run" 0]
} else {
set run_menu [clear_menu Run]
}
set is_native [TargetSelection::native_debugging]
if {$is_native} {
if {[string compare $::tcl_platform(platform) windows] != 0} {
add_menu_command Attach "Attach to process" \
[code $this do_attach $run_menu] \
-underline 0 -accelerator "Ctrl+A"
}
} else {
add_menu_command Other "Connect to target" \
"$this do_connect $run_menu" -underline 0
}
if {[pref get gdb/control_target]} {
if {!$is_native} {
add_menu_command Other "Download" Download::download_it \
-underline 0 -accelerator "Ctrl+D"
}
add_menu_command Other "Run" [code $source inferior run] -underline 0 \
-accelerator R
}
if {$is_native} {
if {[string compare $::tcl_platform(platform) windows] != 0} {
add_menu_command Detach "Detach" [code $this do_detach $run_menu] \
-underline 0 -state disabled
}
} else {
add_menu_command Other "Disconnect" \
[code $this do_disconnect $run_menu] -underline 0 -state disabled
}
if {$is_native} {
add_menu_separator
add_menu_command Control "Kill" [code $this do_kill $run_menu] \
-underline 0 -state disabled
}
if { [pref get gdb/mode] } {
add_menu_separator
add_menu_command Other "Start collection" "$this do_tstop" \
-underline 0 -accelerator "Ctrl+B"
add_menu_command Other "Stop collection" "$this do_tstop" \
-underline 0 -accelerator "Ctrl+E" -state disabled
}
}
method create_stack_buttons {} {
add_button down {Trace Control} [list $this _apply_source stack down] \
"Down Stack Frame" -image down_img
add_button up {Trace Control} [list $this _apply_source stack up] \
"Up Stack Frame" -image up_img
add_button bottom {Trace Control} [list $this _apply_source stack bottom] \
"Go to Bottom of Stack" -image bottom_img
}
public method _set_runstop {} {
switch $runstop {
busy {
$ButtonFrame.stop configure -state disabled
}
downloading {
$ButtonFrame.stop configure -state normal -image stop_img \
-command [code $this cancel_download]
balloon register $ButtonFrame.stop "Stop"
}
running {
$ButtonFrame.stop configure -state normal -image stop_img \
-command [code $source inferior stop]
balloon register $ButtonFrame.stop "Stop"
}
normal {
$ButtonFrame.stop configure -state normal -image run_img \
-command [code $source inferior run]
balloon register $ButtonFrame.stop "Run (R)"
}
default {
debug "SrcBar::_set_runstop - unknown state $runstop ($running)"
}
}
}
public method _set_stepi {} {
if {!$Tracing} {
if {$displaymode == "SOURCE"} {
set state disabled
} else {
set state normal
}
$ButtonFrame.stepi configure -state $state
$ButtonFrame.nexti configure -state $state
}
}
public method _apply_source {args} {
if {$source != ""} {
eval $source $args
}
}
method trace_find_hook {mode from_tty} {
debug "in trace_find_hook, mode: $mode, from_tty: $from_tty, Browsing: $Browsing"
if {[string compare $mode -1] == 0} {
if {$Browsing} {
set_control_mode 0
}
} else {
if {!$Browsing} {
set_control_mode 1
}
}
}
method set_control_mode {mode} {
debug "set_control_mode called with mode $mode"
if {$mode} {
set Browsing 1
$Buttons(view) configure -image run_expt_img -command "$this set_control_mode 0"
balloon register $Buttons(view) "Switch to Control mode"
swap_button_lists $Trace_control_buttons $Run_control_buttons
enable_ui 1
} else {
if {$Browsing} {
tfind_cmd {tfind none}
}
set Browsing 0
$Buttons(view) configure -image watch_movie_img -command "$this set_control_mode 1"
balloon register $Buttons(view) "Switch to Browse mode"
swap_button_lists $Run_control_buttons $Trace_control_buttons
enable_ui 1
}
run_hooks control_mode_hook $Browsing
}
public method reconfig {} {
_load_src_images 1
GDBToolBar::reconfig
}
method do_attach {menu} {
gdbtk_attach_native
}
method do_detach {menu} {
::disconnect
gdbtk_idle
}
method do_kill {menu} {
gdb_cmd "kill"
run_hooks gdb_no_inferior_hook
}
method do_connect {menu {async 0}} {
global file_done
debug "do_connect: menu=$menu async=$async"
gdbtk_busy
set result [gdbtk_attach_remote]
switch $result {
ATTACH_ERROR {
set successful 0
}
ATTACH_TARGET_CHANGED {
if {[pref get gdb/load/check] && $file_done} {
set err [catch {gdb_cmd "compare-sections"} errTxt]
if {$err} {
set successful 0
tk_messageBox -title "Error" -message $errTxt \
-icon error -type ok
break
}
}
tk_messageBox -title "GDB" -message "Successfully connected" \
-icon info -type ok
set successful 1
}
ATTACH_CANCELED {
tk_messageBox -title "GDB" -message "Connection Canceled" -icon info \
-type ok
set successful 0
}
ATTACH_TARGET_UNCHANGED {
tk_messageBox -title "GDB" -message "Successfully connected" \
-icon info -type ok
set successful 1
}
default {
dbug E "Unhandled response from gdbtk_attach_remote: \"$result\""
set successful 0
}
}
gdbtk_idle
if {$successful} {
$menu entryconfigure "Connect to target" -state disabled
$menu entryconfigure "Disconnect" -state normal
} else {
$menu entryconfigure "Connect to target" -state normal
$menu entryconfigure "Disconnect" -state disabled
}
gdbtk_update
}
method do_disconnect {menu {async 0}} {
debug "$menu $async"
disconnect $async
$menu entryconfigure "Connect to target" -state normal
$menu entryconfigure "Disconnect" -state disabled
}
method do_tstop {} {
debug "do_tstop called... Collecting is $Collecting"
if {!$Collecting} {
if {$Browsing} {
set ret [tk_MessageBox -title "Warning" -message \
"You are currently browsing a trace experiment.
This command will clear the results of that experiment.
Do you want to continue?" \
-icon warning -type okcancel -default ok]
if {[string compare $ret cancel] == 0} {
return
}
set_control_mode 1
}
if {[tstart]} {
$Buttons(tstop) configure -image Movie_off_img
balloon register $Buttons(tstop) "End Collection"
set Collecting 1
} else {
tk_messageBox -title Error -message "Error downloading tracepoint info" \
-icon error -type ok
}
} else {
if {[tstop]} {
$Buttons(tstop) configure -image Movie_on_img
balloon register $Buttons(tstop) "Start Collection"
set Collecting 0
}
}
}
common menu_titles
}