# Debug window class definition for GDBtk.
# Copyright (C) 1998, 1999 Cygnus Solutions
#
# 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.


# -----------------------------------------------------------------------------
# NAME:
#	class DebugWin
#
# DESC:
#	This class implements a debug output window to display internal
#	debugging information. It can handle debugging messages, tracing,
#	and eventually profiling.
#
# NOTES:
#	This window is for developers.
#
# -----------------------------------------------------------------------------
itcl::class DebugWin {
  inherit ManagedWin

  private {
    variable _t
    variable _colors {
      {I green}
      {W yellow}
      {E orange}
      {X red}
    }
    variable _bigstr "                                                                                                                                                                                                             "
    method build_win {}
    method _source_all {}
    method _clear {}
    method _mark_old {}
    method _save_contents {}
    method reconfig {}
  }

  protected {
    method _ignore_on_save {} { return 1 }
  }

  public {
    method constructor {args}
    method destructor {}
    method puts {level cls func msg}
    method put_trace {enter level func ar}
    method loadlog {}
  }
}

# -----------------------------------------------------------------------------
# NAME:
#	class DebugWinDOpts
#
# DESC:
#	This class implements a debug options dialog for the DebugWin.
#	Currently this consists os a selection dialog to choose which
#	messages to print. Eventually it could also include a filter
#	for different priorities and color selections.
#
# NOTES:
#	This window is for developers.
#
# -----------------------------------------------------------------------------
itcl::class DebugWinDOpts {
  inherit ManagedWin

  public {
    method constructor {args} {}
    method destructor {}
  }

  protected {
    method _ignore_on_save { return 1 }
  }

  private {
    variable _classes
    method build_win {}
    method _all {}
    method _apply {done}
  }
}
