# SrcTextWin class definition, for Insight
# Copyright (C) 1997, 1998, 1999, 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.


itcl::class SrcTextWin {
  inherit itk::Widget GDBWin

  public {
    variable Tracing	;# 1 if we are running in trace mode
    variable Browsing     0 ;# 1 if we are browsing a trace experiment
    variable parent {}	;# the parent SrcWin
    variable ignore_var_balloons 0;  # ignore all variable balloons

    # Set the height of the src window
    variable textheight 5i {
      catch {$itk_interior.p configure -height $itk_option(-textheight)}
    }
    
    method constructor {args}
    method destructor {}
    method disassembly_changed {}
    method reconfig {}
    method trace_find_hook {mode from_tty}
    method set_control_mode {mode}
    method build_popups {}
    method build_win {}
    method SetRunningState {state}
    method enable {on}
    method setTabs {win {asm S}}
    method enable_disable_src_tags {win how}
    method config_win {win {asm S}}
    method addPopup {menu label command {abg {}} {browse 1} {run 1}}
    method updateBalloon {}
    method ClearTags {}
    method FillSource {winname tagname filename funcname line addr pc_addr lib}
    method FillAssembly {winname tagname filename funcname line addr pc_addr lib}
    method FillMixed {winname tagname filename funcname line addr pc_addr lib}
    method location {tagname filename funcname line addr pc_addr lib}
    method LoadFile {winname name lib mtime_changed}
    method display_line { win line }
    method display_breaks {}
    method insertBreakTag {win linenum tag}
    method removeBreakTag {win linenum tag }
    method bp {action bpnum addr {linenum {}} {file {}} {type 0} {enabled 0} {thread -1}}
    method do_bp { win action linenum type bpnum enabled thread asm}
    method hasBP {win line}
    method hasTP {win line}
    method report_source_location {}
    method lookup_line {win y}
    method continue_to_here {{win {}} {y -1} {threads -1}}
    method jump_to_here {{win {}} {y -1} {threads -1}}
    method set_bp_at_line {{type N} {win {}} {y -1} {threads "-1"}}
    method remove_bp_at_line {{win {}} {y -1}}
    method enable_disable_at_line {action}
    method set_tp_at_line {{win {}} {y -1}}
    method next_hit_at_line {{win {}} {y -1}}
    method remove_tp_at_line {{win {}} {y -1}}
    method do_tag_popup {name X Y y}
    method do_source_popup { X Y x y }
    method addToWatch {var}
    method do_key {key}
    method mode_get {}
    method mode_set {new_mode {go 1}}
    method cancelMotion {}
    method motion {type win x y}
    method showBPBalloon {win x y}
    method showBalloon {win x y}
    method getVariable {x y {line {}}}
    method trace_help {args}
    method line_is_executable {win line}
    method tracepoint_range {win low high}
    method search {exp direction}
    method LoadFromCache {pname name asm lib}
    method UnLoadFromCache {pname oldpane name asm lib}
    method print {top}
    method ask_thread_bp {}
    method do_thread_bp {listbox}
    method test_get {var}
    method clear_file {}
    method get_file {}
    method set_tag_to_stack {}

    # GDB Events
    method breakpoint {event}
    method tracepoint {event}
    method set_variable {event}
  }

  private {
    variable top	;# toplevel window
    variable twin	;# top text window of pane
    variable _tpane	;# top pane name
    variable bwin ""	;# bottom text window of pane
    variable _bpane ""	;# bottom pane name

    variable do_display_breaks 0	;# flag    
    variable popups
    
    variable timeoutID {} ;# The timeout ID for the variable balloon help
    variable UseVariableBalloons
    
    variable mode_changed 0
    variable current	;# our current state
    variable pc		;# where the PC is now
    variable oldmode ""	;# remember the mode we want, even if we can't have it
    
    variable Running 0	;# another way to disable things while target is active
    variable Linenums	;# use linenumbers?
    variable SearchIndex 1.0	;# static
    variable id	;#thread id to line mapping
    # needed for assembly support
    variable _map
    variable Cname  ""	;# cache index name for _map
    # cache is not shared among windows yet.  That could be a later
    # optimization
    variable Stwc	;# Source Text Window Cache
    variable filenum 0

    # The variable object which the variable balloon describes 
    variable _balloon_var {}

    method balloon_value {variable}
    method _mtime_changed {filename}
    method _initialize_srctextwin {}
    method _clear_cache {}
    method _highlightAsmLine {win addr pc_addr tagname filename funcname} {}

    proc makeBreakDot {size colorList {image {}}}
  }


  
  # common variables are shared among all objects of this type
  # break_images stores the images associated with the break dot.
  # bp
  # temp_bp
  # disabled_bp
  # tp
  # thread_bp
  protected common break_images

  # This is the list of bp types.  Be nice, and don't put spaces in
  # any of the elements of this list...
  protected common bp_types {bp temp_bp disabled_bp thread_bp}

  # This variable is used in the "Continue to here" case, where we are
  # disabling then reenabling breakpoints behind the user's back to
  # implement this feature, but we don't want the user to see this...
  protected common dont_change_appearance 0

  protected common TimeOut 100 ;# The timeout value for variable balloon help

}
