# Register display window class definition for Insight.
# Copyright (C) 1998, 1999, 2001 Red Hat, Inc.
#
# Written by Keith Seitz (keiths@redhat.com)
# based on work by Martin Hunt (hunt@redhat.com)
#
# 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 RegWin {
  inherit EmbeddedWin GDBWin
  
  private {
    variable _change_list {}
    variable _menuitems

    # Display data for the table
    variable _data

    # Mapping of table cell index to register number
    variable _register

    # the register group that is displayed
    variable _group "all"

    # Mapping of register number to table cell index. "hidden" if
    # the register was "removed" from the display.
    variable _cell

    # Is REGNUM editable?
    variable _editable

    # List of possible display types for the registers (indexed by regnum)
    variable _types
    # The display type to use for each register (indexed by regnum)
    variable _type
    # The display format to use for each register (indexed by regnum)
    variable _format

    # The list of registers we're displaying
    variable _reg_display_list {}

    # Size of columns
    variable _col_size
    variable _max_label_width

    # Dimensions
    variable _rows
    variable _cols

    # Fencepost
    variable _running 0


    # Table layout/display methods
    method _build_win {}
    method _layout_table {}
    method _load_prefs {}
    method _size_cell_column {cell down}
    method _size_column {col down}

    # Table event handlers and related methods
    method _accept_edit {}
    method _add_to_watch {rn}
    method _but3 {x y X Y}
    method _delete_from_display {rn} 
    method _display_all {} 
    method _edit {x y}
    method _move {direction}
    method _open_memory {rn}
    method _select_group {}
    method _select_cell {cell}
    method _unedit {}

    # Register operations
    method _get_value {rn}
    method _change_format {rn {t {}}}
    method _update_register {rn}
  }

  public {
    method constructor {args}
    method destructor {}

    #
    # Gdb Events
    #
    method busy {event}
    method idle {event}
    method set_variable {event}
    method update {event}
    method arch_changed {event}
    method reconfig {}
  }
}
