diff options
author | Fernando Nasser <fnasser@redhat.com> | 2001-01-25 17:49:22 +0000 |
---|---|---|
committer | Fernando Nasser <fnasser@redhat.com> | 2001-01-25 17:49:22 +0000 |
commit | 2a7977a4ab0d2b3afb2b932cdde92906c2b05a47 (patch) | |
tree | 80aeb7e31f5e940bed7f478b3ed2f43f8d001e21 /gdb/gdbtk/library/srcbar.itcl | |
parent | 3738aee39078be0bf511dd5e28b4fd832e2ff8fc (diff) | |
download | gdb-2a7977a4ab0d2b3afb2b932cdde92906c2b05a47.tar.gz |
2001-01-25 Fernando Nasser <fnasser@redhat.com>
* library/srcbar.itcl: New file. Implement SrcBar, a menu and toolbar
for the Source Window (code previously in srcmenubar.itcl and
srctoolbar.itcl).
* library/srcmenubar.itcl: Remove obsolete file.
* library/srctoolbar.itcl: Remove obsolete file.
* library/srcbar.tcl: Remove obsolete file.
* library/srcwin.itb (_build_win): Use SrcBar.
* library/tclIndex: Regenerate.
Diffstat (limited to 'gdb/gdbtk/library/srcbar.itcl')
-rw-r--r-- | gdb/gdbtk/library/srcbar.itcl | 1129 |
1 files changed, 1129 insertions, 0 deletions
diff --git a/gdb/gdbtk/library/srcbar.itcl b/gdb/gdbtk/library/srcbar.itcl new file mode 100644 index 00000000000..cd8061eb0d2 --- /dev/null +++ b/gdb/gdbtk/library/srcbar.itcl @@ -0,0 +1,1129 @@ +# SrcBar +# Copyright 2001 Red Hat, Inc. +# +# 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 a menu and a toolbar that are attached to a source window. +# +# PUBLIC ATTRIBUTES: +# +# +# METHODS: +# +# configure ....... used to change public attributes +# +# PRIVATE METHODS +# +# X11 OPTION DATABASE ATTRIBUTES +# +# +# ---------------------------------------------------------------------- + +class SrcBar { + inherit itk::Widget + + # ------------------------------------------------------------------ + # CONSTRUCTOR - create widget + # ------------------------------------------------------------------ + constructor {src args} { + set source $src + + # Load the images to be used in toolbar buttons + _load_images + _load_src_images + + # Create a menu widget for the Source Window + set Menu [GDBMenuBar $itk_interior.menubar] + + # Fill it with the initial set of entries + if {! [create_menu_items]} { + destroy $this + } else { + # We do not pack the menu, but make it the menu of the toplevel window + $Menu menubar_show + } + + # Create a toolbar widget for the Source Window + set Tool [GDBToolBar $itk_interior.toolbar] + + # Now create the Source Window initial set of toolbar buttons + # First give the necessary info about each button and their position + create_buttons + # Then effectively create the tollbar widget + $Tool toolbar_show + + # Pack the toolbar + pack $Tool -expand 1 -fill both + + eval itk_initialize $args + add_hook gdb_idle_hook "$this enable_ui 1" + add_hook gdb_busy_hook "$this enable_ui 0" + add_hook gdb_no_inferior_hook "$this enable_ui 2" + add_hook gdb_set_hook "$this set_hook" + add_hook gdb_trace_find_hook "$this handle_trace_find_hook" + } + + # ------------------------------------------------------------------ + # DESTRUCTOR - destroy window containing widget + # ------------------------------------------------------------------ + destructor { + global GDBSrcBar_state + + unset GDBSrcBar_state($this) + remove_hook gdb_idle_hook "$this enable_ui 1" + remove_hook gdb_busy_hook "$this enable_ui 0" + remove_hook gdb_no_inferior_hook "$this enable_ui 2" + remove_hook gdb_set_hook "$this set_hook" + remove_hook gdb_trace_find_hook "$this handle_trace_find_hook" + + #destroy $this + } + + #################################################################### + # The next set of functions create the common menu groupings that + # are used in gdb menus. + # Private. Used at contruction time. + # These were previously at the GDBToolBar... + #################################################################### + + # ------------------------------------------------------------------ + # METHOD: create_menu_items - Add some menu items to the menubar. + # Returns 1 if any items added. + # ------------------------------------------------------------------ + private method create_menu_items {} { + + create_file_menu + + create_run_menu + + create_view_menu + + if {[pref get gdb/control_target]} { + create_control_menu + } + + if {[pref get gdb/mode]} { + create_trace_menu + } + + create_pref_menu + + create_help_menu + + return 1 + } + + # ------------------------------------------------------------------ + # METHOD: create_file_menu - Creates the standard file menu. + # ------------------------------------------------------------------ + + private method create_file_menu {} { + global enable_external_editor tcl_platform + + $Menu menubar_new_menu file "File" 0 + + if {[info exists enable_external_editor] && $enable_external_editor} { + $Menu menubar_add_menu_command None "Edit Source" \ + [code $source edit] + } + + $Menu menubar_add_menu_command Other "Open..." \ + "_open_file" -underline 0 -accelerator "Ctrl+O" + + $Menu menubar_add_menu_command Other "Source..." \ + "source_file" -underline 0 + + set sessions [session_list] + if {[llength $sessions]} { + $Menu menubar_add_menu_separator + set i 1 + foreach item $sessions { + $Menu menubar_add_menu_command Other "$i $item" \ + [list session_load $item] \ + -underline 0 + incr i + } + } + + $Menu menubar_add_menu_separator + + if {$tcl_platform(platform) == "windows"} { + $Menu menubar_add_menu_command None "Page Setup..." \ + [format { + set top %s + ide_winprint page_setup -parent $top + } [winfo toplevel [namespace tail $this]]] \ + -underline 8 + } + + $Menu menubar_add_menu_command None "Print Source..." \ + [code $source print] \ + -underline 0 -accelerator "Ctrl+P" + + $Menu menubar_add_menu_separator + + $Menu menubar_add_menu_command Other "Target Settings..." \ + "set_target_name" -underline 0 + + $Menu menubar_add_menu_separator + + $Menu menubar_add_menu_command None "Exit" gdbtk_quit -underline 1 + } + + # ------------------------------------------------------------------ + # METHOD: create_run_menu - Creates the standard run menu, + # or reconfigures it if it already exists. + # ------------------------------------------------------------------ + + private method create_run_menu {} { + + if {![$Menu menubar_menu_exists Run]} { + set run_menu [$Menu menubar_new_menu run "Run" 0] + } else { + set run_menu [$Menu menubar_clear_menu Run] + } + + set is_native [TargetSelection::native_debugging] + + # If we are on a Unix target, put in the attach options. "ps" doesn't + # give me the Windows PID yet, and the attach also seems flakey, so + # I will hold off on the Windows implementation for now. + + if {$is_native} { + if {[string compare $::tcl_platform(platform) windows] != 0} { + $Menu menubar_add_menu_command Attach "Attach to process" \ + [code $this do_attach $run_menu] \ + -underline 0 -accelerator "Ctrl+A" + } + } else { + $Menu menubar_add_menu_command Other "Connect to target" \ + "$this do_connect $run_menu" -underline 0 + } + + if {[pref get gdb/control_target]} { + if {!$is_native} { + $Menu menubar_add_menu_command Other "Download" Download::download_it \ + -underline 0 -accelerator "Ctrl+D" + } + $Menu menubar_add_menu_command Other "Run" [code $source inferior run] \ + -underline 0 -accelerator R + } + + if {$is_native} { + if {[string compare $::tcl_platform(platform) windows] != 0} { + $Menu menubar_add_menu_command Detach "Detach" \ + [code $this do_detach $run_menu] \ + -underline 0 -state disabled + } + } else { + $Menu menubar_add_menu_command Other "Disconnect" \ + [code $this do_disconnect $run_menu] -underline 0 -state disabled + } + + if {$is_native} { + $Menu menubar_add_menu_separator + $Menu menubar_add_menu_command Control "Kill" \ + [code $this do_kill $run_menu] \ + -underline 0 -state disabled + } + + if { [pref get gdb/mode] } { + $Menu menubar_add_menu_separator + + $Menu menubar_add_menu_command Other "Start collection" "$this do_tstop" \ + -underline 0 -accelerator "Ctrl+B" + + $Menu menubar_add_menu_command Other "Stop collection" "$this do_tstop" \ + -underline 0 -accelerator "Ctrl+E" -state disabled + } + } + + # ------------------------------------------------------------------ + # METHOD: create_view_menu - Creates the standard view menu + # ------------------------------------------------------------------ + + private method create_view_menu {} { + + $Menu menubar_new_menu view "View" 0 + + $Menu menubar_add_menu_command Other "Stack" {ManagedWin::open StackWin} \ + -underline 0 -accelerator "Ctrl+S" + + $Menu menubar_add_menu_command Other "Registers" {ManagedWin::open RegWin} \ + -underline 0 -accelerator "Ctrl+R" + + $Menu menubar_add_menu_command Other "Memory" {ManagedWin::open MemWin} \ + -underline 0 -accelerator "Ctrl+M" + + $Menu menubar_add_menu_command Other "Watch Expressions" \ + {ManagedWin::open WatchWin} \ + -underline 0 -accelerator "Ctrl+W" + $Menu menubar_add_menu_command Other "Local Variables" \ + {ManagedWin::open LocalsWin} \ + -underline 0 -accelerator "Ctrl+L" + + if {[pref get gdb/control_target]} { + $Menu menubar_add_menu_command Other "Breakpoints" \ + {ManagedWin::open BpWin -tracepoints 0} \ + -underline 0 -accelerator "Ctrl+B" + } + + if {[pref get gdb/mode]} { + $Menu menubar_add_menu_command Other "Tracepoints" \ + {ManagedWin::open BpWin -tracepoints 1} \ + -underline 0 -accelerator "Ctrl+T" + $Menu menubar_add_menu_command Other "Tdump" {ManagedWin::open TdumpWin} \ + -underline 2 -accelerator "Ctrl+U" + } + + $Menu menubar_add_menu_command Other "Console" {ManagedWin::open Console} \ + -underline 2 -accelerator "Ctrl+N" + + $Menu menubar_add_menu_command Other "Function Browser" \ + {ManagedWin::open BrowserWin} \ + -underline 1 -accelerator "Ctrl+F" + $Menu menubar_add_menu_command Other "Thread List" \ + {ManagedWin::open ProcessWin} \ + -underline 0 -accelerator "Ctrl+H" + if {[info exists ::env(GDBTK_DEBUG)] && $::env(GDBTK_DEBUG)} { + $Menu menubar_add_menu_separator + $Menu menubar_add_menu_command Other "Debug Window" \ + {ManagedWin::open DebugWin} \ + -underline 3 -accelerator "Ctrl+U" + } + } + + # ------------------------------------------------------------------ + # METHOD: create_control_menu - Creates the standard control menu + # ------------------------------------------------------------------ + + private method create_control_menu {} { + + $Menu menubar_new_menu cntrl "Control" 0 + + $Menu menubar_add_menu_command Control "Step" [code $source inferior step] \ + -underline 0 -accelerator S + + $Menu menubar_add_menu_command Control "Next" [code $source inferior next] \ + -underline 0 -accelerator N + + $Menu menubar_add_menu_command Control "Finish" \ + [code $source inferior finish] \ + -underline 0 -accelerator F + + $Menu menubar_add_menu_command Control "Continue" \ + [code $source inferior continue] \ + -underline 0 -accelerator C + + $Menu menubar_add_menu_separator + $Menu menubar_add_menu_command Control "Step Asm Inst" \ + [code $source inferior stepi] \ + -underline 1 -accelerator S + + $Menu menubar_add_menu_command Control "Next Asm Inst" \ + [code $source inferior nexti] \ + -underline 1 -accelerator N + + # $Menu menubar_add_menu_separator + # $Menu menubar_add_menu_command Other "Automatic Step" auto_step + } + + # ------------------------------------------------------------------ + # METHOD: create_trace_menu - Creates the standard trace menu + # ------------------------------------------------------------------ + + private method create_trace_menu {} { + + $Menu menubar_new_menu trace "Trace" 0 + + $Menu menubar_add_menu_command Other "Save Trace Commands..." \ + "save_trace_commands" \ + -underline 0 + + $Menu menubar_add_menu_separator + + $Menu menubar_add_menu_command Trace "Next Hit" {tfind_cmd tfind} \ + -underline 0 -accelerator N + + $Menu menubar_add_menu_command Trace "Previous Hit" {tfind_cmd "tfind -"} \ + -underline 0 -accelerator P + + $Menu menubar_add_menu_command Trace "First Hit" {tfind_cmd "tfind start"} \ + -underline 0 -accelerator F + + $Menu menubar_add_menu_command Trace "Next Line Hit" \ + {tfind_cmd "tfind line"} \ + -underline 5 -accelerator L + + $Menu menubar_add_menu_command Trace "Next Hit Here" \ + {tfind_cmd "tfind tracepoint"} \ + -underline 9 -accelerator H + + $Menu menubar_add_menu_separator + $Menu menubar_add_menu_command Trace "Tfind Line..." \ + "ManagedWin::open TfindArgs -Type LN" \ + -underline 9 -accelerator E + + $Menu menubar_add_menu_command Trace "Tfind PC..." \ + "ManagedWin::open TfindArgs -Type PC" \ + -underline 7 -accelerator C + + $Menu menubar_add_menu_command Trace "Tfind Tracepoint..." \ + "ManagedWin::open TfindArgs -Type TP" \ + -underline 6 -accelerator T + + $Menu menubar_add_menu_command Trace "Tfind Frame..." \ + "ManagedWin::open TfindArgs -Type FR" \ + -underline 6 -accelerator F + } + + # ------------------------------------------------------------------ + # METHOD: create_pref_menu - Creates the standard preferences menu + # ------------------------------------------------------------------ + private method create_pref_menu {} { + + $Menu menubar_new_menu pref "Preferences" 0 + + $Menu menubar_add_menu_command Other "Global..." \ + "ManagedWin::open GlobalPref -transient" -underline 0 + + $Menu menubar_add_menu_command Other "Source..." \ + "ManagedWin::open SrcPref -transient" -underline 0 + } + + # ------------------------------------------------------------------ + # METHOD: create_help_menu - Creates the standard help menu + # ------------------------------------------------------------------ + private method create_help_menu {} { + + $Menu menubar_new_menu help "Help" 0 + $Menu menubar_add_menu_command Other "Help Topics" \ + {HtmlViewer::open_help index.html} \ + -underline 0 + $Menu menubar_add_menu_separator + $Menu menubar_add_menu_command Other "About GDB..." \ + {ManagedWin::open About -transient} \ + -underline 0 + } + + #################################################################### + # The next set of functions are the generic button groups that gdb uses. + # Private. Used at contruction time. + # These were previously at the GDBToolBar... + #################################################################### + + # ------------------------------------------------------------------ + # METHOD: create_buttons - Add some buttons to the toolbar. + # Returns list of buttons in form acceptable + # to standard_toolbar. + # ------------------------------------------------------------------ + private method create_buttons {} { + global enable_external_editor + + $Tool toolbar_add_button stop None {} {} + _set_runstop + + if {[pref get gdb/mode]} { + $Tool toolbar_add_button tstop Control \ + [list $this do_tstop] "Start Collection" \ + -image Movie_on_img + + $Tool toolbar_add_button view Other [list $this set_control_mode 1] \ + "Switch to Browse Mode" -image watch_movie_img + + $Tool toolbar_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]} { + + # + # If we don't control the target, then we might as well + # put a copy of the trace controls on the source window. + # + create_trace_buttons 1 + } + + $Tool toolbar_add_button_separator + + create_window_buttons + + # Random bits of obscurity... + $Tool toolbar_bind_button reg <Button-3> "ManagedWin::open RegWin -force" + $Tool toolbar_bind_button mem <Button-3> "ManagedWin::open MemWin -force" + $Tool toolbar_bind_button watch <Button-3> \ + "ManagedWin::open WatchWin -force" + $Tool toolbar_bind_button vars <Button-3> \ + "ManagedWin::open LocalsWin -force" + + $Tool toolbar_add_button_separator + + if {[info exists enable_external_editor] && $enable_external_editor} { + $Tool toolbar_add_button edit Other [code $source edit] "Edit Source" \ + -image edit_img + + $Tool toolbar_add_button_separator + } + + $Tool toolbar_add_label addr $address "Address" -width 10 -relief sunken \ + -bd 1 -anchor e -font src-font + + $Tool toolbar_add_label line $line "Line Number" -width 6 -relief sunken \ + -bd 1 -anchor e -font src-font + + $Tool toolbar_button_right_justify + + create_stack_buttons + + # This feature has been disabled for now. + # checkbutton $ButtonFrame.upd -command "$this _toggle_updates" \ + # -variable GDBSrcBar_state($this) + # lappend button_list $ButtonFrame.upd + # global GDBSrcBar_state + # ::set GDBSrcBar_state($this) $updatevalue + # balloon register $ButtonFrame.upd "Toggle Window Updates" + } + + # ------------------------------------------------------------------ + # METHOD: create_control_buttons - Creates the step, continue, etc buttons. + # ------------------------------------------------------------------ + + private method create_control_buttons {} { + $Tool toolbar_add_button step Control [code $source inferior step] \ + "Step (S)" -image step_img + + $Tool toolbar_add_button next Control [code $source inferior next] \ + "Next (N)" -image next_img + + $Tool toolbar_add_button finish Control [code $source inferior finish] \ + "Finish (F)" -image finish_img + + $Tool toolbar_add_button continue Control [code $source inferior continue] \ + "Continue (C)" -image continue_img + + # A spacer before the assembly-level items looks good. It helps + # to indicate that these are somehow different. + $Tool toolbar_add_button_separator + + $Tool toolbar_add_button stepi Control [code $source inferior stepi] \ + "Step Asm Inst (S)" -image stepi_img + + $Tool toolbar_add_button nexti Control [code $source inferior nexti] \ + "Next Asm Inst (N)" -image nexti_img + + _set_stepi + + set Run_control_buttons {step next finish continue -stepi nexti} + + } + + # ------------------------------------------------------------------ + # METHOD: create_trace_buttons - Creates the next hit, etc. + # ------------------------------------------------------------------ + + private method create_trace_buttons {{show 0}} { + + if {$show} { + set command $Tool toolbar_add_button + } else { + set command $Tool toolbar_create_button + } + + $command tfindstart Trace {tfind_cmd "tfind start"} "First Hit <F>" \ + -image rewind_img + + $command tfind Trace {tfind_cmd tfind} "Next Hit <N>" -image next_hit_img + + $command tfindprev Trace {tfind_cmd "tfind -"} "Previous Hit <P>" \ + -image prev_hit_img + + $command tfindline Trace {tfind_cmd "tfind line"} "Next Line Hit <L>" \ + -image next_line_img + + $command tfindtp Trace { tfind_cmd "tfind tracepoint"} \ + "Next Hit Here <H>" -image next_check_img + + set Trace_control_buttons {tfindstart tfind tfindprev tfindline tfindtp} + } + + # ------------------------------------------------------------------ + # METHOD: create_window_buttons - Creates the registers, etc, buttons + # ------------------------------------------------------------------ + + private method create_window_buttons {} { + $Tool toolbar_add_button reg Other {ManagedWin::open RegWin} \ + "Registers (Ctrl+R)" -image reg_img + + $Tool toolbar_add_button mem Other {ManagedWin::open MemWin} \ + "Memory (Ctrl+M)" -image memory_img + + $Tool toolbar_add_button stack Other {ManagedWin::open StackWin} \ + "Stack (Ctrl+S)" -image stack_img + + $Tool toolbar_add_button watch Other {ManagedWin::open WatchWin} \ + "Watch Expressions (Ctrl+W)" -image watch_img + + $Tool toolbar_add_button vars Other {ManagedWin::open LocalsWin} \ + "Local Variables (Ctrl+L)" -image vars_img + + if {[pref get gdb/control_target]} { + $Tool toolbar_add_button bp Other {ManagedWin::open BpWin} \ + "Breakpoints (Ctrl+B)" -image bp_img + } + + if {[pref get gdb/mode]} { + $Tool toolbar_add_button tp Other \ + {ManagedWin::open BpWin -tracepoints 1} \ + "Tracepoints (Ctrl+T)" -image tp_img + + $Tool toolbar_add_button tdump Trace {ManagedWin::open TdumpWin} \ + "Tdump (Ctrl+D)" -image tdump_img + } + + $Tool toolbar_add_button con Other {ManagedWin::open Console} \ + "Console (Ctrl+N)" -image console_img + } + + # ------------------------------------------------------------------ + # METHOD: create_stack_buttons - Creates the up down bottom stack buttons + # ------------------------------------------------------------------ + + private method create_stack_buttons {} { + + $Tool toolbar_add_button down {Trace Control} \ + [code $source stack down] \ + "Down Stack Frame" -image down_img + + $Tool toolbar_add_button up {Trace Control} \ + [code $source stack up] \ + "Up Stack Frame" -image up_img + + $Tool toolbar_add_button bottom {Trace Control} \ + [code $source stack bottom] \ + "Go to Bottom of Stack" -image bottom_img + + } + + #################################################################### + # + # Auxiliary methods used by the toolbar + # + #################################################################### + + # ------------------------------------------------------------------ + # METHOD: _load_images - Load standard images. Private method. + # ------------------------------------------------------------------ + public method _load_images { {reconfig 0} } { + global gdb_ImageDir + if {!$reconfig && $_loaded_images} { + return + } + set _loaded_images 1 + + lappend imgs console reg stack vmake vars watch memory bp + foreach name $imgs { + image create photo ${name}_img -file [file join $gdb_ImageDir ${name}.gif] + } + } + + # ------------------------------------------------------------------ + # METHOD: _load_src_images - Load standard images. Private method. + # ------------------------------------------------------------------ + method _load_src_images { {reconf 0} } { + global gdb_ImageDir + + if {!$reconf && $_loaded_src_images} { + return + } + set _loaded_src_images 1 + + foreach name {run stop step next finish continue edit \ + stepi nexti up down bottom Movie_on Movie_off \ + next_line next_check next_hit rewind prev_hit \ + watch_movie run_expt tdump tp} { + image create photo ${name}_img -file [file join $gdb_ImageDir ${name}.gif] + } + } + + # ------------------------------------------------------------------ + # METHOD: _set_runstop - Set state of run/stop button. + # + # busy - Run button becomes disabled + # running - Stop button appears, allowing user to stop executing target + # downloading - Stop button appears, allowing user to interrupt downloading + # normal - Run button appears, allowing user to run/re-run exe + # ------------------------------------------------------------------ + public method _set_runstop {} { + dbug W $runstop + + switch $runstop { + busy { + $Tool toolbar_configure_button stop -state disabled + } + downloading { + $Tool toolbar_configure_button stop -state normal -image stop_img \ + -command [code $this cancel_download] + $Tool toolbar_set_button_balloon stop "Stop" + } + running { + $Tool toolbar_configure_button stop -state normal -image stop_img \ + -command [code $source inferior stop] + $Tool toolbar_set_button_balloon stop "Stop" + } + normal { + $Tool toolbar_configure_button stop -state normal -image run_img \ + -command [code $source inferior run] + $Tool toolbar_set_button_balloon stop "Run (R)" + } + default { + dbug W "unknown state $runstop" + } + } + } + + + # ------------------------------------------------------------------ + # METHOD: _set_stepi - Set state of stepi/nexti buttons. + # ------------------------------------------------------------------ + public method _set_stepi {} { + + # Only do this in synchronous mode + if {!$Tracing} { + # In source-only mode, disable these buttons. Otherwise, enable + # them. + if {$displaymode == "SOURCE"} { + set state disabled + } else { + set state normal + } + $Tool toolbar_configure_button stepi -state $state + $Tool toolbar_configure_button nexti -state $state + } + } + + + #################################################################### + # + # State control methods used by both the menu and the toolbar + # + #################################################################### + + # ------------------------------------------------------------------ + # METHOD: handle_trace_find_hook - response to the tfind command. + # If the command puts us in a new mode, then switch modes... + # ------------------------------------------------------------------ + method handle_trace_find_hook {mode from_tty} { + debug "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 - sets up the srcbar for browsing + # a trace experiment. + # mode: 1 => browse mode + # 0 => control mode + # ------------------------------------------------------------------ + method set_control_mode {mode} { + debug "set_control_mode called with mode $mode" + if {$mode} { + set Browsing 1 + $Tool toolbar_configure_button view -image run_expt_img \ + -command "$this set_control_mode 0" + $Tool toolbar_set_button_balloon view "Switch to Control mode" + # Now swap out the buttons... + $Tool toolbar_swap_button_lists $Trace_control_buttons \ + $Run_control_buttons + enable_ui 1 + } else { + if {$Browsing} { + tfind_cmd {tfind none} + } + set Browsing 0 + $Tool toolbar_configure_button view -image watch_movie_img \ + -command "$this set_control_mode 1" + $Tool toolbar_set_button_balloon view "Switch to Browse mode" + # Now swap out the buttons... + $Tool toolbar_swap_button_lists $Run_control_buttons \ + $Trace_control_buttons + enable_ui 1 + } + } + + # ------------------------------------------------------------------ + # METHOD: reconfig - reconfigure the srcbar + # used when preferences change + # ------------------------------------------------------------------ + public method reconfig {} { + debug + _load_src_images 1 + _load_images 1 + # FIXME: Must Check if we are Tracing and set the buttons accordingly. + } + + # ------------------------------------------------------------------ + # METHOD: set_hook - run when user enters a `set' command. + # + # FIXME: Should not be accessing the base class internal data + # As the spec says, one must clear the menu and recreate it. + # ------------------------------------------------------------------ + method set_hook {varname value} { + debug "Got $varname = $value" + + if {$varname == "os"} { + # Make current_menu pointer point to the View Menu. + # FIXME: Should not be accessing the base class internal data directly + set view_menu [menu_find View] + # Restore the current_menu pointer. + set save_menu [$Menu menubar_set_current_menu $view_menu] + set title "Kernel Objects" + + # Look for the KOD menu entry... + if {[catch {$view_menu index $title} index]} { + set index none + } + + # FIXME: This assumes that the KOD menu is the last one as it does not + # adjust the index information kept by the GDBMenuBar class. + if {$value == ""} { + # No OS, so remove KOD from View menu. + if {$index != "none"} { + # FIXME: Should not be accessing the base class internal data + $view_menu delete $index + } + } else { + # Add KOD to View menu, but only if it isn't already there. + if {$index == "none"} { + $Menu menubar_add_menu_command Other $title \ + {ManagedWin::open KodWin} \ + -underline 0 -accelerator "Ctrl+K" + } + } + + # Restore the current_menu pointer. + $Menu menubar_set_current_menu $save_menu + + global gdb_kod_cmd + set gdb_kod_cmd $value + } + } + + #################################################################### + # The following method enables/disables both menus and buttons. + #################################################################### + + # ------------------------------------------------------------------ + # METHOD: enable_ui - enable/disable the appropriate buttons and menus + # Called from the busy, idle, and no_inferior hooks. + # + # on must be: + # value Control Other Trace State + # 0 off off off gdb is busy + # 1 on on off gdb has inferior, and is idle + # 2 off on off gdb has no inferior, and is idle + # ------------------------------------------------------------------ + public method enable_ui {on} { + global tcl_platform + debug "$on - Browsing=$Browsing" + + # Do the enabling so that all the disabling happens first, this way if a + # button belongs to two groups, enabling takes precedence, which is + # probably right. + + switch $on { + 0 { + # Busy + set enable_list {Control disabled \ + Other disabled \ + Trace disabled \ + Attach disabled \ + Detach disabled} + } + 1 { + # Idle, with inferior + if {!$Browsing} { + set enable_list {Trace disabled \ + Control normal \ + Other normal \ + Attach disabled \ + Detach normal } + # set the states of stepi and nexti correctly + _set_stepi + } else { + set enable_list {Control disabled Other normal Trace normal} + } + + } + 2 { + # Idle, no inferior + set enable_list {Control disabled \ + Trace disabled \ + Other normal \ + Attach normal \ + Detach disabled } + } + default { + debug "Unknown type: $on in enable_ui" + return + } + } + + $Menu set_class_state $enable_list + $Tool set_class_state $enable_list + } + + #################################################################### + # + # Execute actions corresponding to menu events + # + #################################################################### + + # ------------------------------------------------------------------ + # METHOD: do_attach: attach to a running target + # ------------------------------------------------------------------ + method do_attach {menu} { + gdbtk_attach_native + } + + # ------------------------------------------------------------------ + # METHOD: do_detach: detach from a running target + # ------------------------------------------------------------------ + method do_detach {menu} { + gdbtk_disconnect + gdbtk_idle + } + + # ------------------------------------------------------------------ + # METHOD: do_kill: kill the current target + # ------------------------------------------------------------------ + method do_kill {menu} { + gdb_cmd "kill" + run_hooks gdb_no_inferior_hook + } + + # ------------------------------------------------------------------ + # METHOD: do_connect: connect to a remote target + # in asynch mode if async is 1 + # ------------------------------------------------------------------ + method do_connect {menu {async 0}} { + + set successful [gdbtk_connect $async] + + 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 + } + + # Make the menu reflect this change + ::update idletasks + } + + # ------------------------------------------------------------------ + # METHOD: do_disconnect: disconnect from a remote target + # in asynch mode if async is 1. + # + # ------------------------------------------------------------------ + method do_disconnect {menu {async 0}} { + debug "$menu $async" + # + # For now, these are the same, but they might be different... + # + + gdbtk_disconnect $async + + $menu entryconfigure "Connect to target" -state normal + $menu entryconfigure "Disconnect" -state disabled + } + + #################################################################### + # + # Execute actions corresponding to toolbar events + # + #################################################################### + + # ------------------------------------------------------------------ + # METHOD: _toggle_updates - Run when the update checkbutton is + # toggled. Private method. + # ------------------------------------------------------------------ + public method _toggle_updates {} { + global GDBSrcBar_state + if {$updatecommand != ""} { + uplevel \#0 $updatecommand $GDBSrcBar_state($this) + } + } + + # ------------------------------------------------------------------ + # METHOD: cancel_download + # ------------------------------------------------------------------ + public method cancel_download {} { + global download_dialog download_cancel_ok + + if {"$download_dialog" != ""} { + $download_dialog cancel + } else { + set download_cancel_ok 1 + } + } + + #################################################################### + # + # Execute actions that can be activated by both menu entries and + # toolbar buttons + # + #################################################################### + + # ------------------------------------------------------------------ + # METHOD: do_tstop: Change the GUI state, then do the tstop or + # tstart command, whichever is appropriate. + # + # ------------------------------------------------------------------ + method do_tstop {} { + debug "do_tstop called... Collecting is $Collecting" + + if {!$Collecting} { + # + # Start the trace experiment + # + + 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]} { + # FIXME: Must enable the Stop Collection menu item and + # disable the Start Collection item + $Tool toolbar_configure_button tstop -image Movie_off_img + $Tool toolbar_set_button_balloon tstop "End Collection" + set Collecting 1 + } else { + tk_messageBox -title Error \ + -message "Error downloading tracepoint info" \ + -icon error -type ok + } + } else { + # + # Stop the trace experiment + # + + if {[tstop]} { + # FIXME: Must enable the Stop Collection menu item and + # disable the Start Collection item + $Tool toolbar_configure_button tstop -image Movie_on_img + $Tool toolbar_set_button_balloon tstop "Start Collection" + set Collecting 0 + } + } + } + + #################################################################### + # + # PRIVATE DATA + # + #################################################################### + + # This is a handle on our parent source window. + private variable source {} + + # The GdbMenuBar component + private variable Menu + + # The GdbToolBar component + private variable Tool + + # FIXME - Need to break the images into the sets needed for + # each button group, and load them when the button group is + # created. + + # This is set if we've already loaded the standard images. + private common _loaded_images 0 + + # This is set if we've already loaded the standard images. Private + # variable. + private common _loaded_src_images 0 + + # These buttons go in the control area when we are browsing + protected variable Trace_control_buttons + + # And these go in the control area when we are running + protected variable Run_control_buttons + + #################################################################### + # + # PUBLIC DATA + # + #################################################################### + + # This is the command that should be run when the `update' + # checkbutton is toggled. The current value of the checkbutton is + # appended to the command. + public variable updatecommand {} + + # This controls whether the `update' checkbutton is turned on or + # off. + public variable updatevalue 0 { + global GDBSrcBar_state + ::set GDBSrcBar_state($this) $updatevalue + } + + # This holds the text that is shown in the address label. + public variable address {} { + $Tool toolbar_configure_button addr -text $address -font src-font + } + + # This holds the text that is shown in the line label. + public variable line {} { + $Tool toolbar_configure_button line -text $line + } + + # This holds the source window's display mode. Valid values are + # SOURCE, ASSEMBLY, SRC+ASM, and MIXED. + public variable displaymode SOURCE { + _set_stepi + } + + # This indicates what is the inferior state. + # Possible values are: {busy running downloading normal} + public variable runstop normal { + dbug W "configuring runstop $runstop" + + # Set the Run/Stop button accordingly + _set_runstop + } + + # The next three determine the state of the application when Tracing is enabled. + + public variable Tracing 0 ;# Is tracing enabled for this gdb? + public variable Browsing 0 ;# Are we currently browsing a trace experiment? + public variable Collecting 0 ;# Are we currently collecting a trace experiment? +} |