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

itcl::class PluginWindow {
  inherit ManagedWin GDBEventHandler

  # ------------------------------------------------------------------
  #  CONSTRUCTOR - create widget
  # ------------------------------------------------------------------
  constructor {args} {

    # Create a menu widget for the plug-in window
    set menubar [GDBMenuBar $itk_interior.menubar]

    # Create a toolbar widget for the plug-in window
    set toolbar [GDBToolBar $itk_interior.toolbar]

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

    # Create a frame for the subclass to use
    set child [frame $itk_interior.child]

    # Pack the childsite
    pack $child -expand 1 -fill both

    eval itk_initialize $args
    add_hook gdb_no_inferior_hook [code $this no_inferior]
  }

  # ------------------------------------------------------------------
  #  DESTRUCTOR - destroy window containing widget
  # ------------------------------------------------------------------
  destructor {
    remove_hook gdb_no_inferior_hook [code $this no_inferior]

    #destroy $this
  }

  # ------------------------------------------------------------------
  #  ACCESSOR METHOD - Retrieve childsite
  # ------------------------------------------------------------------
  public method childsite {} {
    return $child
  }

  # Don't automatically reload plugins.
  protected method _ignore_on_save {} { return 1 }

  ####################################################################
  #
  # State control methods used by both the menu and the toolbar
  # 
  ####################################################################

  # ------------------------------------------------------------------
  #  METHOD:  idle - handle IdleEvent
  # ------------------------------------------------------------------
  protected method idle {event} {
    debug "PluginWindow::idle"
    enable_ui 1
  }

  # ------------------------------------------------------------------
  #  METHOD:  busy - BusyEvent handler
  #             Invoked when gdb is going to run the inferior
  # ------------------------------------------------------------------
  public method busy {event} {
    debug "PluginWindow::busy"
    enable_ui 0
  }

  # ------------------------------------------------------------------
  #  METHOD:  no_inferior
  #             Invoked when gdb detects the inferior is gone 
  # ------------------------------------------------------------------
  protected method no_inferior {} {
    debug 
    enable_ui 2
  }

  ####################################################################
  # 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     State
  #   0          off       off      gdb is busy
  #   1          on        on       gdb has inferior, and is idle
  #   2          off       on       gdb has no inferior, and is idle
  # ------------------------------------------------------------------
  public method enable_ui {on} {
    global tcl_platform
    debug "$on"

    # 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}
      }
      1 {
        # Idle, with inferior
	set enable_list {Control normal \
			   Other normal}
      }
      2 {
        # Idle, no inferior
	set enable_list {Control disabled \
			   Other normal}
      }
      default {
	debug "Unknown type: $on in enable_ui"
	return
      }
    }

    $menubar set_class_state $enable_list
    $toolbar set_class_state $enable_list
  }

  ####################################################################
  #
  #  PRIVATE DATA
  #
  ####################################################################

  # The childsite
  private variable child

  ####################################################################
  #
  #  PROTECTED DATA
  #
  ####################################################################

  # The GdbMenuBar component
  protected variable menubar

  # The GdbToolBar component
  protected variable toolbar

  ####################################################################
  #
  #  PUBLIC DATA
  #
  ####################################################################

  # None.
}
