# SrcBar
# Copyright (C) 2001, 2002, 2004, 2008 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
#
#
# ----------------------------------------------------------------------

itcl::class SrcBar {
  inherit itk::Widget GDBEventHandler

  # ------------------------------------------------------------------
  #  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 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 show

    # Pack the toolbar
    pack $Tool -expand 1 -fill both

    # Set the srcbar's initial state
    enable_ui 2

    eval itk_initialize $args
    add_hook gdb_no_inferior_hook "$this enable_ui 2"
    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_no_inferior_hook "$this enable_ui 2"
    remove_hook gdb_trace_find_hook "$this handle_trace_find_hook"

    #destroy $this
  }

  # ------------------------------------------------------------------
  #  NAME:         private method SrcBar::_post
  #  DESCRIPTION:  Post the given menu
  #
  #  ARGUMENTS:
  #                what  - which menu to post
  #  RETURNS:      Nothing
  # ------------------------------------------------------------------
  private method _post {what} {

    switch $what {
      file {
	_update_file_menu
      }
    }
  }


  ####################################################################
  # 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_plugin_menu

    create_pref_menu
    
    create_help_menu

    return 1
  }

  # ------------------------------------------------------------------
  #  PRIVATE METHOD:  _update_file_menu - update the file menu
  #                    Used really only to update the session list.
  # ------------------------------------------------------------------
  private method _update_file_menu {} {
    global enable_external_editor gdbtk_platform gdb_exe_name

    # Clear the File menu
    $Menu clear file

    if {[info exists enable_external_editor] && $enable_external_editor} {
      $Menu add command None "Edit Source" \
	[code $source edit]
    }

    $Menu add command Other "Open..."  \
      "_open_file" -underline 0 -accelerator "Ctrl+O"

    if {$gdb_exe_name == ""} {
      set state disabled
    } else {
      set state normal
    }
    $Menu add command Other "Close" \
      "_close_file" -underline 0 -accelerator "Ctrl+W" -state $state

    $Menu add command Other "Source..." \
      "source_file" -underline 0

    set sessions [Session::list_names]
    if {[llength $sessions]} {
      $Menu add separator
      set i 1
      foreach item $sessions {
	$Menu add command Other "$i $item" \
	  [list Session::load $item] \
	  -underline 0
	incr i
      }
    }

    $Menu add separator

    if {$gdbtk_platform(platform) == "windows"} {
      $Menu add command None "Page Setup..." \
	[format {
	  set top %s
	  ide_winprint page_setup -parent $top
	} [winfo toplevel [namespace tail $this]]] \
	-underline 8
    }

    $Menu add command None "Print Source..." \
      [code $source print] \
      -underline 0 -accelerator "Ctrl+P"

    $Menu add separator

    $Menu add command Other "Target Settings..." \
      "set_target_name" -underline 0

    $Menu add separator

    $Menu add command None "Exit" gdbtk_quit -underline 1
  }

  # ------------------------------------------------------------------
  #  METHOD:  create_file_menu - Creates the standard file menu. 
  # ------------------------------------------------------------------
  
  private method create_file_menu {} {

    $Menu add menubutton file "File" 0 -postcommand [code $this _post file]
    _update_file_menu
  }

  # ------------------------------------------------------------------
  #  METHOD:  create_run_menu - Creates the standard run menu, 
  #  or reconfigures it if it already exists.
  # ------------------------------------------------------------------
  
  private method create_run_menu {} {

    if {![$Menu exists Run]} {
      set run_menu [$Menu add menubutton run "Run" 0]
    } else {
      set run_menu [$Menu clear 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 $::gdbtk_platform(platform) windows] != 0} {
	$Menu add command Attach "Attach to process" \
	  [code $this do_attach $run_menu] \
	  -underline 0 -accelerator "Ctrl+A"
      }
    } else {
      $Menu add command Other "Connect to target" \
	"$this do_connect $run_menu" -underline 0
    }

    if {[pref get gdb/control_target]} {
      if {!$is_native} {
	$Menu add command Other "Download" Download::download_it \
	  -underline 0 -accelerator "Ctrl+D"
      }
      $Menu add command Other "Run" [code $source inferior run] \
        -underline 0 -accelerator R
    }

    if {$is_native} {
      if {[string compare $::gdbtk_platform(platform) windows] != 0} {
	$Menu add command Detach "Detach" \
          [code $this do_detach $run_menu] \
	  -underline 0 -state disabled
      }
    } else {
      $Menu add command Other "Disconnect"  \
	[code $this do_disconnect $run_menu] -underline 0 -state disabled
    }

    if {$is_native} {
      $Menu add separator
      $Menu add command Control "Kill" \
        [code $this do_kill $run_menu] \
	-underline 0 -state disabled
    }

    if { [pref get gdb/mode] } {
      $Menu add separator 

      $Menu add command Other "Start collection" "$this do_tstop" \
	-underline 0 -accelerator "Ctrl+B"
         
      $Menu add 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 add menubutton view "View" 0

    $Menu add command Other "Stack" {ManagedWin::open StackWin} \
      -underline 0 -accelerator "Ctrl+S" 
      
    $Menu add command Other "Registers" {ManagedWin::open RegWin} \
      -underline 0 -accelerator "Ctrl+R" 
      
    $Menu add command Other "Memory" {ManagedWin::open MemWin} \
      -underline 0 -accelerator "Ctrl+M" 
      
    $Menu add command Other "Watch Expressions" \
      {ManagedWin::open WatchWin} \
      -underline 0 -accelerator "Ctrl+T" 
    $Menu add command Other "Local Variables" \
      {ManagedWin::open LocalsWin} \
      -underline 0 -accelerator "Ctrl+L" 

    if {[pref get gdb/control_target]} {
      $Menu add command Other "Breakpoints" \
	{ManagedWin::open BpWin -tracepoints 0} \
	-underline 0 -accelerator "Ctrl+B" 
    }

    if {[pref get gdb/mode]} {
      $Menu add command Other "Tracepoints" \
        {ManagedWin::open BpWin -tracepoints 1} \
	-underline 0 -accelerator "Ctrl+T"
      $Menu add command Other "Tdump" {ManagedWin::open TdumpWin} \
	-underline 2 -accelerator "Ctrl+U"
    }

    $Menu add command Other "Console" {ManagedWin::open Console} \
      -underline 2 -accelerator "Ctrl+N" 
      
    $Menu add command Other "Function Browser" \
      {ManagedWin::open BrowserWin} \
      -underline 1 -accelerator "Ctrl+F" 
    $Menu add command Other "Thread List" \
      {ManagedWin::open ProcessWin} \
      -underline 0 -accelerator "Ctrl+H"
    if {[info exists ::env(GDBTK_DEBUG)] && $::env(GDBTK_DEBUG)} {
      $Menu add separator
      $Menu add 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 add menubutton cntrl "Control" 0
    
    $Menu add command Control "Step" [code $source inferior step] \
      -underline 0 -accelerator S
    
    $Menu add command Control "Next" [code $source inferior next] \
      -underline 0 -accelerator N
    
    $Menu add command Control "Finish" \
      [code $source inferior finish] \
      -underline 0 -accelerator F
    
    $Menu add command Control "Continue" \
      [code $source inferior continue] \
      -underline 0 -accelerator C
    
    $Menu add separator
    $Menu add command Control "Step Asm Inst" \
      [code $source inferior stepi] \
      -underline 1 -accelerator S
    
    $Menu add command Control "Next Asm Inst" \
      [code $source inferior nexti] \
      -underline 1 -accelerator N
    
    # $Menu add separator
    # $Menu add command Other "Automatic Step" auto_step
  }

  # ------------------------------------------------------------------
  #  METHOD:  create_trace_menu - Creates the standard trace menu
  # ------------------------------------------------------------------
  
  private method create_trace_menu {} {

    $Menu add menubutton trace "Trace" 0
    
    $Menu add command Other "Save Trace Commands..." \
      "save_trace_commands" \
      -underline 0

    $Menu add separator

    $Menu add command Trace "Next Hit" {tfind_cmd tfind} \
      -underline 0 -accelerator N
    
    $Menu add command Trace "Previous Hit" {tfind_cmd "tfind -"} \
      -underline 0 -accelerator P
    
    $Menu add command Trace "First Hit" {tfind_cmd "tfind start"} \
      -underline 0 -accelerator F
    
    $Menu add command Trace "Next Line Hit" \
      {tfind_cmd "tfind line"} \
      -underline 5 -accelerator L
    
    $Menu add command Trace "Next Hit Here" \
      {tfind_cmd "tfind tracepoint"} \
      -underline 9 -accelerator H
    
    $Menu add separator
    $Menu add command Trace "Tfind Line..." \
      "ManagedWin::open TfindArgs -Type LN" \
      -underline 9 -accelerator E
    
    $Menu add command Trace "Tfind PC..." \
      "ManagedWin::open TfindArgs -Type PC" \
      -underline 7 -accelerator C
    
    $Menu add command Trace "Tfind Tracepoint..." \
      "ManagedWin::open TfindArgs -Type TP" \
      -underline 6 -accelerator T

    $Menu add command Trace "Tfind Frame..." \
      "ManagedWin::open TfindArgs -Type FR" \
      -underline 6 -accelerator F
  }

  # ------------------------------------------------------------------
  #  METHOD:  create_plugin_menu - Creates the optional plugin menu
  # ------------------------------------------------------------------  
  private method create_plugin_menu {} {
    global gdb_plugins

    $Menu add menubutton plugin "PlugIn" 4
    set plugins_available 0
    foreach plugin_dir $gdb_plugins {
      if {[catch {source [file join $plugin_dir plugins.tcl]} txt]} {
	dbug E $txt
      }
    }

    if {! $plugins_available} {
      # No plugins are available for this configuration,
      # so remove the menu
      debug "No plugins configured, go remove the PlugIn menu..."
      $Menu delete plugin
    }
  }

  # ------------------------------------------------------------------
  #  METHOD:  create_pref_menu - Creates the standard preferences menu
  # ------------------------------------------------------------------  
  private method create_pref_menu {} {

    $Menu add menubutton pref "Preferences" 0
    
    $Menu add command Other "Global..." \
      "ManagedWin::open GlobalPref -transient" -underline 0
    
    $Menu add command Other "Source..." \
      "ManagedWin::open SrcPref -transient" -underline 0

    set save_menu [$Menu menubar_get_current_menu]

    set advanced_menu [$Menu add cascade adv Advanced "Advanced" 0]

    $advanced_menu add command -label "Edit Color Schemes..." -underline 0 \
      -command "ManagedWin::open CSPref -transient" -underline 0

    $advanced_menu add command -label "IPC Support..." -underline 0 \
      -command "ManagedWin::open IPCPref -transient" -underline 0

    $Menu menubar_set_current_menu $save_menu

    $Menu add separator

    set color_menu [$Menu add cascade use_cs Color "Use Color Scheme" 0]
    for {set i 0} {$i < 16} {incr i} {
      set dbg [recolor [pref get gdb/bg/$i] 80]
      $color_menu add command -label $i -background [pref get gdb/bg/$i] \
	-activebackground $dbg -command "set_bg_colors $i" -underline 0
    }

    if {[pref get gdb/use_color_schemes] == "1"} {
      set cs_state normal
    } else {
      set cs_state disabled
    }
    $Menu set_class_state "Color $cs_state"
  }

  # ------------------------------------------------------------------
  #  METHOD:  create_help_menu - Creates the standard help menu
  # ------------------------------------------------------------------  
  private method create_help_menu {} {
    # KDE and GNOME like the help menu to be the last item in the menubar.
    # The default Unix behavior is to be at the far right of the menubar.
    set os [pref get gdb/compat]
    if {$os == "KDE" || $os == "GNOME"} {
      set helpmenu "_help"
    } else {
      set helpmenu "help"
    }
    $Menu add menubutton $helpmenu "Help" 0
    $Menu add command Other "Help Topics" {open_help index.html} \
      -underline 0
    $Menu add separator
    $Menu add 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 add button stop None {} {}
    _set_runstop

    if {[pref get gdb/mode]} {
      $Tool add button tstop Control \
                         [list $this do_tstop] "Start Collection" \
	                 -image Movie_on_img

      $Tool add button view Other [list $this set_control_mode 1] \
	                 "Switch to Browse Mode" -image watch_movie_img

      $Tool add 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 add separator

    create_window_buttons

    # Random bits of obscurity...
    $Tool itembind reg   <Button-3> "ManagedWin::open RegWin -force"
    $Tool itembind mem   <Button-3> "ManagedWin::open MemWin -force"
    $Tool itembind watch <Button-3> \
      "ManagedWin::open WatchWin -force"
    $Tool itembind vars  <Button-3> \
      "ManagedWin::open LocalsWin -force"

    $Tool add separator

    if {[info exists enable_external_editor] && $enable_external_editor} {
      $Tool add button edit Other [code $source edit] "Edit Source" \
	                      -image edit_img

      $Tool add separator
    }

    # Add find in file entry box.
    $Tool add label findlabel "Find:" "" -anchor e -font global/fixed
    $Tool add custom searchbox entry "Search in editor" \
       -bd 3 -font global/fixed -width 10

    set callback [code $source search]
    $Tool itembind searchbox <Return> \
	    "$callback forwards \[eval %W get\]"
    $Tool itembind searchbox <Shift-Return> \
            "$callback backwards \[eval %W get\]"

    $Tool add separator

    $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 add button step Control [code $source inferior step] \
      "Step (S)" -image step_img
    
    $Tool add button next Control [code $source inferior next] \
      "Next (N)" -image next_img
    
    $Tool add button finish Control [code $source inferior finish] \
      "Finish (F)" -image finish_img
    
    $Tool 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 add separator
    
    $Tool add button stepi Control [code $source inferior stepi] \
      "Step Asm Inst (S)" -image stepi_img
    
    $Tool 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 "add button"
    } else {
      set command "create"
    }

    $Tool $command tfindstart Trace {tfind_cmd "tfind start"} "First Hit <F>" \
      -image rewind_img
    
    $Tool $command tfind Trace {tfind_cmd tfind} "Next Hit <N>" -image next_hit_img
    
    $Tool $command tfindprev Trace {tfind_cmd "tfind -"} "Previous Hit <P>" \
      -image prev_hit_img
    
    $Tool $command tfindline Trace {tfind_cmd "tfind line"} "Next Line Hit <L>" \
      -image next_line_img
    
    $Tool $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 add button reg Other {ManagedWin::open RegWin} \
                           "Registers (Ctrl+R)" -image reg_img

    $Tool add button mem Other {ManagedWin::open MemWin} \
                           "Memory (Ctrl+M)" -image memory_img

    $Tool add button stack Other {ManagedWin::open StackWin} \
                             "Stack (Ctrl+S)" -image stack_img

    $Tool add button watch Other {ManagedWin::open WatchWin} \
                             "Watch Expressions (Ctrl+W)" -image watch_img

    $Tool add button vars Other {ManagedWin::open LocalsWin} \
                            "Local Variables (Ctrl+L)" -image vars_img

    if {[pref get gdb/control_target]} {
      $Tool add button bp Other {ManagedWin::open BpWin} \
                            "Breakpoints (Ctrl+B)" -image bp_img
    }

    if {[pref get gdb/mode]} {
      $Tool add button tp Other \
        {ManagedWin::open BpWin -tracepoints 1} \
	"Tracepoints (Ctrl+T)" -image tp_img
      
      $Tool add button tdump Trace {ManagedWin::open TdumpWin} \
                               "Tdump (Ctrl+D)" -image tdump_img
    }

    $Tool 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 add button down {Trace Control} \
      [code $source stack down] \
      "Down Stack Frame" -image down_img

    $Tool add button up {Trace Control} \
      [code $source stack up] \
      "Up Stack Frame" -image up_img

    $Tool 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 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 I $runstop

    switch $runstop {
      busy {
	$Tool itemconfigure stop -state disabled
      }
      downloading {
	$Tool itemconfigure stop -state normal -image stop_img \
	  -command [code $this cancel_download]
	$Tool itemballoon stop "Stop"
      }
      running {
	$Tool itemconfigure stop -state normal -image stop_img \
	  -command [code $source inferior stop]
	$Tool itemballoon stop "Stop"
      }
      normal {
	$Tool itemconfigure stop -state normal -image run_img \
	  -command [code $source inferior run]
	$Tool itemballoon 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 itemconfigure stepi -state $state
      $Tool itemconfigure 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 itemconfigure view -image run_expt_img \
                            -command "$this set_control_mode 0"
      $Tool itemballoon 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 itemconfigure view -image watch_movie_img \
                            -command "$this set_control_mode 1"
      $Tool itemballoon 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

    if {[pref get gdb/use_color_schemes] == "1"} {
      set cs_state normal
    } else {
      set cs_state disabled
    }
    $Menu set_class_state "Color $cs_state"
    for {set i 0} {$i < 16} {incr i} {
      set dbg [recolor [pref get gdb/bg/$i] 80]
      $color_menu entryconfigure $i -activebackground $dbg -background [pref get gdb/bg/$i]
    }
    # FIXME: Must Check if we are Tracing and set the buttons accordingly.
  }

  # ------------------------------------------------------------------
  #  METHOD:  set_variable - 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.
  # ------------------------------------------------------------------  
  public method set_variable {event} {
    set varname [$event get variable]
    set value   [$event get 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 add 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} {
    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]

# ARC 24/11/08
# en/disable other menu items

    if {$successful} {
      $menu entryconfigure "Connect to target" -state disabled
      $menu entryconfigure "Download"          -state normal
      $menu entryconfigure "Run"               -state normal
      $menu entryconfigure "Disconnect"        -state normal
    } else {
      $menu entryconfigure "Connect to target" -state normal
      $menu entryconfigure "Download"          -state disabled
      $menu entryconfigure "Run"               -state disabled
      $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

# ARC 24/11/08
# disable other menu items

    $menu entryconfigure "Connect to target" -state normal
    $menu entryconfigure "Download"          -state disabled
    $menu entryconfigure "Run"               -state disabled
    $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 itemconfigure tstop -image Movie_off_img
        $Tool itemballoon 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 itemconfigure tstop -image Movie_on_img
        $Tool itemballoon tstop "Start Collection"
	set Collecting 0
     }
    }
  }

  # ------------------------------------------------------------------
  #  METHOD:  busy - BusyEvent handler
  # ------------------------------------------------------------------
  method busy {event} {
    enable_ui 0
  }

  # ------------------------------------------------------------------
  #  METHOD:  idle - IdleEvent handler
  # ------------------------------------------------------------------
  method idle {event} {
    enable_ui 1
  }

  ####################################################################
  #
  #  PRIVATE DATA
  #
  ####################################################################

  # This is a handle on our parent source window.
  private variable source {}

  # The GdbMenuBar component
  private variable Menu
  private variable color_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 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 I "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?
}
