unit debug;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls,PrgSteps,PrgProg, savepos, prgoutl, KParam, kinicomp,
  kComp;

type TSetCursor = (scChangeIfNew,scChangeAllways);

type
  TFormDebug = class(TForm)
    Panel2: TPanel;
    ButtonStep: TButton;
    ButtonRun: TButton;
    ButtonPause: TButton;
    ButtonGoto: TButton;
    ButtonShow: TButton;
    ButtonStop: TButton;
    SavePos1: TSavePos;
    Timer1: TTimer;
    CBStep: TkCheckBox;
    ButtonStack: TButton;
    Counter1: TCounter;
    procedure ButtonStepClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ButtonRunClick(Sender: TObject);
    procedure ButtonPauseClick(Sender: TObject);
    procedure ButtonGotoClick(Sender: TObject);
    procedure ButtonShowClick(Sender: TObject);
    procedure ButtonStopClick(Sender: TObject);
    procedure ListBoxStepsDrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Counter1Click(Sender: TObject);
    procedure ButtonStackClick(Sender: TObject);
  private
    LastIndex : integer;
    prog : TStepProgram;
    BoxSteps : TProgOutline;
    procedure LookButtons;
  public
    procedure SetCursor(force:TSetCursor);
    constructor Create2(AOwner:TControl; p:TStepProgram); virtual;
    procedure Start(p:TStepProgram);
    procedure SetIndex(i:integer);
    procedure UpdateList;
  end;

//var
//  FormDebug: TFormDebug;

implementation

{$R *.DFM}

procedure TFormDebug.SetCursor(force:TSetCursor);
begin
  if ( force = scChangeIfNew ) and ( LastIndex = prog.CurNr ) then exit;
  LastIndex := prog.CurNr;
  BoxSteps.ItemIndex := LastIndex;
end;

procedure TFormDebug.Start(p:TStepProgram);
begin
  Show;
  prog := p;
  BoxSteps.Steps := p.Steps;
//  if ( not prog.StartDebug(BoxSteps) ) then exit;
//  Prog.Steps.UpdateListBox(BoxSteps);
  BoxSteps.UpdateBox;
  SetCursor(scChangeAllways);
  Caption := 'Debug '+prog.id;
end;

procedure TFormDebug.ButtonStepClick(Sender: TObject);
begin
//  prog.DoStep;
//  prog.Pause;
  prog.DoOneStep;
end;

procedure TFormDebug.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  prog.DoStopDebug;
end;

procedure TFormDebug.ButtonRunClick(Sender: TObject);
begin
  prog.DoContinueRun;
end;

procedure TFormDebug.ButtonPauseClick(Sender: TObject);
begin
  Prog.DoPause;
end;

procedure TFormDebug.ButtonGotoClick(Sender: TObject);
begin
  Prog.DoGoto(BoxSteps.ItemIndex);
end;

procedure TFormDebug.ButtonShowClick(Sender: TObject);
begin
//  Prog.Show;
  SetCursor(scChangeAllways);
end;

procedure TFormDebug.ButtonStopClick(Sender: TObject);
begin
  Prog.DoStop;
end;


procedure TFormDebug.ListBoxStepsDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  ColorListBox(Control,Index,Rect,State,prog.Steps);
end;


procedure TFormDebug.SetIndex(i:integer);
begin
  if CBStep.Checked then
    BoxSteps.ItemIndex := i;
end;

procedure TFormDebug.UpdateList;
begin
  BoxSteps.UpdateBox;
end;


procedure TFormDebug.FormCreate(Sender: TObject);
begin
  BoxSteps := TProgOutline.Create2(self,prog.Steps);
  BoxSteps.Parent := self;
//  BoxSteps.OnClick := BoxStepsClick;
//  BoxSteps.OnDblClick := BoxStepsDblClick;
  BoxSteps.MinWidth := 600;
end;

constructor TFormDebug.Create2(AOwner:TControl; p:TStepProgram);
begin
  prog := p;
  inherited Create(AOwner);
end;

procedure TFormDebug.LookButtons;
begin
  if not Assigned(prog) then exit; 
  ButtonStop.Enabled := not prog.Stopped;
  ButtonPause.Enabled := not prog.Paused;
  ButtonRun.Enabled := (prog.Stopped) or (prog.Paused);
end;

procedure TFormDebug.Timer1Timer(Sender: TObject);
begin
  SetCursor(scChangeIfNew);
  LookButtons;
end;

procedure TFormDebug.Counter1Click(Sender: TObject);
begin
  Counter1.Value := TOneProgStep(BoxSteps.Steps[BoxSteps.ItemIndex]).Step.GetValue;
end;

procedure TFormDebug.ButtonStackClick(Sender: TObject);
var s:string;
begin
  s := '---------------------------' + #13#10+
       prog.CallStack.AsString(',') + #13#10 +
       '---------------------------' + #13#10+
       prog.VarStack.AsString(#10#13);
  ShowMessage(s);     
end;

end.
