////////////////////////////////////////////////////////////////////// // // // observerBreakpointList.pas: Breakpoint 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 observerBreakpointList; ///////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// interface //////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, cpuObservers, nexus, ImgList; ////////////////////////////////////////////////////////////////////// type TdbgBreakpointList = class(TCpuObserver) list: TListView; contextMenu: TPopupMenu; mEditBreakpoint: TMenuItem; mAddBreakpoint: TMenuItem; N1: TMenuItem; mEnabled: TMenuItem; mDeleteBreakpoint: TMenuItem; mEnableAllBreakpoints: TMenuItem; mDisableAllBreakpoints: TMenuItem; mDeleteAllBreakpoints: TMenuItem; N2: TMenuItem; mViewSource: TMenuItem; imageList: TImageList; procedure contextMenuPopup(Sender: TObject); procedure ToggleEnabled(Sender: TObject); procedure EditBreakpoint(Sender: TObject); procedure ViewSource(Sender: TObject); procedure AddABreakpoint(Sender: TObject); procedure DeleteABreakpoint(Sender: TObject); procedure EnableAllBreakpoints(Sender: TObject); procedure DisableAllBreakpoints(Sender: TObject); procedure DeleteAllBreakpoints(Sender: TObject); procedure FormCreate(Sender: TObject); public procedure UpdateObserver; override; class function OCaption: string; override; end; ////////////////////////////////////////////////////////////////////// var dbgBreakpointList: TdbgBreakpointList; ////////////////////////////////////////////////////////////////////// implementation /////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// uses dbgBreakpoints, debugBreakpointProperties; ////////////////////////////////////////////////////////////////////// {$R *.DFM} ////////////////////////////////////////////////////////////////////// procedure TdbgBreakpointList.UpdateObserver; var i: integer; item: TListItem; bp: TBreakpoint; begin list.Items.Clear; for i := 0 to breakpoints.Count - 1 do begin bp := breakpoints.Items[i] as TBreakpoint; // Add the breakpoint info to the list item := list.Items.Add; item.Data := bp; // item.Checked := bp.enabled; item.Caption := IntToHex(bp.address, 8); item.SubItems.Add(IntToStr(bp.line)); item.SubItems.Add(bp.condition); if bp.breakExecution and (bp.logMessage <> '') then item.SubItems.Add('Break, Log "' + bp.logMessage + '"') else if bp.breakExecution then item.SubItems.Add('Break') else if bp.logMessage <> '' then item.SubItems.Add('Log "' + bp.logMessage + '"') else item.SubItems.Add(''); if bp.enabled then item.ImageIndex := 1 else item.ImageIndex := 0; item.SubItems.Add(IntToStr(bp.passCount)); end; end; ////////////////////////////////////////////////////////////////////// class function TdbgBreakpointList.OCaption: string; begin Result := 'Breakpoints'; end; ////////////////////////////////////////////////////////////////////// // Context Menu ////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// procedure TdbgBreakpointList.contextMenuPopup(Sender: TObject); var itemSelected: boolean; begin itemSelected := list.Selected <> nil; mEnabled.visible := itemSelected; mEditBreakpoint.visible := itemSelected; mViewSource.visible := itemSelected; N1.visible := itemSelected; mDeleteBreakpoint.visible := itemSelected; end; ////////////////////////////////////////////////////////////////////// procedure TdbgBreakpointList.ToggleEnabled(Sender: TObject); begin if list.Selected <> nil then begin TBreakpoint(list.Selected.data).enabled := not TBreakpoint(list.Selected.data).enabled; UpdateObservers; end; end; ////////////////////////////////////////////////////////////////////// procedure TdbgBreakpointList.EditBreakpoint(Sender: TObject); var bpProperties: TdbgBreakpointProperties; begin if list.Selected <> nil then begin Application.CreateForm(TdbgBreakpointProperties, bpProperties); bpProperties.bp := TBreakpoint(list.Selected.data); bpProperties.Show; UpdateObservers; end; end; ////////////////////////////////////////////////////////////////////// procedure TdbgBreakpointList.ViewSource(Sender: TObject); begin Beep; end; ////////////////////////////////////////////////////////////////////// procedure TdbgBreakpointList.AddABreakpoint(Sender: TObject); var bpProperties: TdbgBreakpointProperties; begin Application.CreateForm(TdbgBreakpointProperties, bpProperties); bpProperties.bp := TBreakpoint.Create; AddBreakpoint(bpProperties.bp); bpProperties.Show; UpdateObservers; end; ////////////////////////////////////////////////////////////////////// procedure TdbgBreakpointList.DeleteABreakpoint(Sender: TObject); begin if list.Selected <> nil then begin RemoveBreakpoint(TBreakpoint(list.Selected.data)); list.Items.Delete(list.Items.IndexOf(list.Selected)); UpdateObservers; end; end; ////////////////////////////////////////////////////////////////////// procedure TdbgBreakpointList.EnableAllBreakpoints(Sender: TObject); var i: integer; begin for i := 0 to breakpoints.Count - 1 do TBreakpoint(breakpoints.items[i]).enabled := true; UpdateObservers; end; ////////////////////////////////////////////////////////////////////// procedure TdbgBreakpointList.DisableAllBreakpoints(Sender: TObject); var i: integer; begin for i := 0 to breakpoints.Count - 1 do TBreakpoint(breakpoints.items[i]).enabled := false; UpdateObservers; end; ////////////////////////////////////////////////////////////////////// procedure TdbgBreakpointList.DeleteAllBreakpoints(Sender: TObject); begin ClearBreakpoints; UpdateObservers; end; ////////////////////////////////////////////////////////////////////// procedure TdbgBreakpointList.FormCreate(Sender: TObject); begin HelpContext := LinkHelp('breakpoints.html'); list.DoubleBuffered := true; end; ////////////////////////////////////////////////////////////////////// initialization RegisterViewer(TdbgBreakpointList); end. //////////////////////////////////////////////////////////////////////