////////////////////////////////////////////////////////////////////// // // // observerWatchList.pas: Watch list observer // // // // The contents of this file are subject to the Bottled Light // // Public License Version 1.0 (the "License"); you may not use this // // file except in compliance with the License. You may obtain a // // copy of the License at http://www.bottledlight.com/BLPL/ // // // // Software distributed under the License is distributed on an // // "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or // // implied. See the License for the specific language governing // // rights and limitations under the License. // // // // The Original Code is the Mappy VM User Interface, released // // April 1st, 2003. The Initial Developer of the Original Code is // // Bottled Light, Inc. Portions created by Bottled Light, Inc. are // // Copyright (C) 2001-2003 Bottled Light, Inc. All Rights Reserved. // // // // Author(s): // // Michael Noland (joat), michael@bottledlight.com // // // // Changelog: // // 1.0: First public release (April 1st, 2003) // // // // Notes: // // None at present. // // // ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// unit observerWatchList; ////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// interface //////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, cpuObservers, nexus; ////////////////////////////////////////////////////////////////////// type TdbgWatchList = class(TCpuObserver) contextMenu: TPopupMenu; mEditWatch: TMenuItem; mAddWatch: TMenuItem; N1: TMenuItem; mEnabled: TMenuItem; mDeleteWatch: TMenuItem; N2: TMenuItem; mEnableAllWatches: TMenuItem; mDisableAllWatches: TMenuItem; mDeleteAllWatches: TMenuItem; list: TListView; procedure ToggleEnabled(Sender: TObject); procedure EditWatch(Sender: TObject); procedure AddAWatch(Sender: TObject); procedure DeleteAWatch(Sender: TObject); procedure EnableAllWatches(Sender: TObject); procedure DisableAllWatches(Sender: TObject); procedure DeleteAllWatches(Sender: TObject); procedure contextMenuPopup(Sender: TObject); procedure FormCreate(Sender: TObject); procedure listAdvancedCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); public procedure UpdateObserver; override; class function OCaption: string; override; end; ////////////////////////////////////////////////////////////////////// var dbgWatchList: TdbgWatchList; ////////////////////////////////////////////////////////////////////// implementation /////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// uses dbgWatches, debugWatchProperties; ////////////////////////////////////////////////////////////////////// {$R *.DFM} ////////////////////////////////////////////////////////////////////// procedure TdbgWatchList.UpdateObserver; var i: integer; item: TListItem; watch: TWatch; begin list.Items.Clear; for i := 0 to watches.Count - 1 do begin watch := watches.Items[i] as TWatch; // Add the breakpoint info to the list item := list.Items.Add; item.Data := watch; // item.Checked := watch.enabled; item.Caption := watch.expression; item.SubItems.Add(watch.Evaluate); end; end; ////////////////////////////////////////////////////////////////////// class function TdbgWatchList.OCaption: string; begin Result := 'Watches'; end; ////////////////////////////////////////////////////////////////////// // Context Menu ////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// procedure TdbgWatchList.contextMenuPopup(Sender: TObject); var itemSelected: boolean; begin itemSelected := list.Selected <> nil; mEnabled.visible := itemSelected; mEditWatch.visible := itemSelected; N1.visible := itemSelected; mDeleteWatch.visible := itemSelected; end; ////////////////////////////////////////////////////////////////////// procedure TdbgWatchList.ToggleEnabled(Sender: TObject); begin if list.Selected <> nil then begin TWatch(list.Selected.data).enabled := not TWatch(list.Selected.data).enabled; UpdateObservers; end; end; ////////////////////////////////////////////////////////////////////// procedure TdbgWatchList.EditWatch(Sender: TObject); var watchProperties: TdbgWatchProperties; begin if list.Selected <> nil then begin Application.CreateForm(TdbgWatchProperties, watchProperties); watchProperties.watch := TWatch(list.Selected.data); watchProperties.Show; UpdateObservers; end; end; ////////////////////////////////////////////////////////////////////// procedure TdbgWatchList.AddAWatch(Sender: TObject); var watchProperties: TdbgWatchProperties; begin Application.CreateForm(TdbgWatchProperties, watchProperties); watchProperties.watch := TWatch.Create; AddWatch(watchProperties.watch); watchProperties.Show; UpdateObservers; end; ////////////////////////////////////////////////////////////////////// procedure TdbgWatchList.DeleteAWatch(Sender: TObject); begin if list.Selected <> nil then begin RemoveWatch(TWatch(list.Selected.data)); list.Items.Delete(list.Items.IndexOf(list.Selected)); UpdateObservers; end; end; ////////////////////////////////////////////////////////////////////// procedure TdbgWatchList.EnableAllWatches(Sender: TObject); var i: integer; begin for i := 0 to watches.Count - 1 do TWatch(watches.items[i]).enabled := true; UpdateObservers; end; ////////////////////////////////////////////////////////////////////// procedure TdbgWatchList.DisableAllWatches(Sender: TObject); var i: integer; begin for i := 0 to watches.Count - 1 do TWatch(watches.items[i]).enabled := false; UpdateObservers; end; ////////////////////////////////////////////////////////////////////// procedure TdbgWatchList.DeleteAllWatches(Sender: TObject); begin ClearWatches; UpdateObservers; end; ////////////////////////////////////////////////////////////////////// procedure TdbgWatchList.FormCreate(Sender: TObject); begin HelpContext := LinkHelp('watches.html'); list.DoubleBuffered := true; end; ////////////////////////////////////////////////////////////////////// procedure TdbgWatchList.listAdvancedCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); begin DefaultDraw := true; if TWatch(item.Data).enabled then list.Font.Color := clBtnText else list.Font.Color := clGrayText; end; ////////////////////////////////////////////////////////////////////// initialization RegisterViewer(TdbgWatchList); end. //////////////////////////////////////////////////////////////////////