DBG: protect dialog actions against re-entrance

git-svn-id: trunk@28736 -
This commit is contained in:
martin 2010-12-17 01:46:36 +00:00
parent 8e4d321718
commit 7e077f0e18
3 changed files with 319 additions and 136 deletions

View File

@ -134,7 +134,9 @@ type
procedure JumpToCurrentBreakPoint; procedure JumpToCurrentBreakPoint;
procedure ShowProperties; procedure ShowProperties;
protected protected
procedure DoBeginUpdate; override;
procedure DoEndUpdate; override; procedure DoEndUpdate; override;
procedure DisableAllActions;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
@ -351,11 +353,16 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
for n := 0 to lvBreakPoints.Items.Count -1 do try
begin DisableAllActions;
Item := lvBreakPoints.Items[n]; for n := 0 to lvBreakPoints.Items.Count -1 do
if Item.Selected then begin
TIDEBreakPoint(Item.Data).Enabled := True; Item := lvBreakPoints.Items[n];
if Item.Selected then
TIDEBreakPoint(Item.Data).Enabled := True;
end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end; end;
end; end;
@ -364,11 +371,16 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
for n := 0 to lvBreakPoints.Items.Count -1 do try
begin DisableAllActions;
Item := lvBreakPoints.Items[n]; for n := 0 to lvBreakPoints.Items.Count -1 do
if Item.Selected then begin
TIDEBreakPoint(Item.Data).Enabled := False; Item := lvBreakPoints.Items[n];
if Item.Selected then
TIDEBreakPoint(Item.Data).Enabled := False;
end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end; end;
end; end;
@ -484,19 +496,24 @@ var
CurBreakPoint: TIDEBreakPoint; CurBreakPoint: TIDEBreakPoint;
Filename: String; Filename: String;
begin begin
CurItem:=lvBreakPoints.Selected; try
if (CurItem=nil) then exit; DisableAllActions;
Filename:=TIDEBreakpoint(CurItem.Data).Source; CurItem:=lvBreakPoints.Selected;
if MessageDlg(lisDeleteAllBreakpoints, if (CurItem=nil) then exit;
Format(lisDeleteAllBreakpoints2, ['"', Filename, '"']), Filename:=TIDEBreakpoint(CurItem.Data).Source;
mtConfirmation,[mbYes,mbCancel],0)<>mrYes if MessageDlg(lisDeleteAllBreakpoints,
then exit; Format(lisDeleteAllBreakpoints2, ['"', Filename, '"']),
for n := lvBreakPoints.Items.Count - 1 downto 0 do mtConfirmation,[mbYes,mbCancel],0)<>mrYes
begin then exit;
Item := lvBreakPoints.Items[n]; for n := lvBreakPoints.Items.Count - 1 downto 0 do
CurBreakPoint:=TIDEBreakPoint(Item.Data); begin
if CompareFilenames(CurBreakPoint.Source,Filename)=0 Item := lvBreakPoints.Items[n];
then CurBreakPoint.Free; CurBreakPoint:=TIDEBreakPoint(Item.Data);
if CompareFilenames(CurBreakPoint.Source,Filename)=0
then CurBreakPoint.Free;
end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end; end;
end; end;
@ -508,15 +525,20 @@ var
CurBreakPoint: TIDEBreakPoint; CurBreakPoint: TIDEBreakPoint;
Filename: String; Filename: String;
begin begin
CurItem:=lvBreakPoints.Selected; try
if (CurItem=nil) then exit; DisableAllActions;
Filename:=TIDEBreakpoint(CurItem.Data).Source; CurItem:=lvBreakPoints.Selected;
for n := 0 to lvBreakPoints.Items.Count - 1 do if (CurItem=nil) then exit;
begin Filename:=TIDEBreakpoint(CurItem.Data).Source;
Item := lvBreakPoints.Items[n]; for n := 0 to lvBreakPoints.Items.Count - 1 do
CurBreakPoint:=TIDEBreakPoint(Item.Data); begin
if CompareFilenames(CurBreakPoint.Source,Filename)=0 Item := lvBreakPoints.Items[n];
then CurBreakPoint.Enabled := False; CurBreakPoint:=TIDEBreakPoint(Item.Data);
if CompareFilenames(CurBreakPoint.Source,Filename)=0
then CurBreakPoint.Enabled := False;
end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end; end;
end; end;
@ -528,15 +550,20 @@ var
CurBreakPoint: TIDEBreakPoint; CurBreakPoint: TIDEBreakPoint;
Filename: String; Filename: String;
begin begin
CurItem:=lvBreakPoints.Selected; try
if (CurItem=nil) then exit; DisableAllActions;
Filename:=TIDEBreakpoint(CurItem.Data).Source; CurItem:=lvBreakPoints.Selected;
for n := 0 to lvBreakPoints.Items.Count - 1 do if (CurItem=nil) then exit;
begin Filename:=TIDEBreakpoint(CurItem.Data).Source;
Item := lvBreakPoints.Items[n]; for n := 0 to lvBreakPoints.Items.Count - 1 do
CurBreakPoint:=TIDEBreakPoint(Item.Data); begin
if CompareFilenames(CurBreakPoint.Source,Filename)=0 Item := lvBreakPoints.Items[n];
then CurBreakPoint.Enabled := True; CurBreakPoint:=TIDEBreakPoint(Item.Data);
if CompareFilenames(CurBreakPoint.Source,Filename)=0
then CurBreakPoint.Enabled := True;
end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end; end;
end; end;
@ -544,16 +571,21 @@ procedure TBreakPointsDlg.popDeleteAllClick(Sender: TObject);
var var
n: Integer; n: Integer;
begin begin
if MessageDlg(lisDeleteAllBreakpoints,
lisDeleteAllBreakpoints,
mtConfirmation,[mbYes,mbCancel],0)<>mrYes
then exit;
lvBreakPoints.BeginUpdate;
try try
for n := lvBreakPoints.Items.Count - 1 downto 0 do DisableAllActions;
TIDEBreakPoint(lvBreakPoints.Items[n].Data).Free; if MessageDlg(lisDeleteAllBreakpoints,
lisDeleteAllBreakpoints,
mtConfirmation,[mbYes,mbCancel],0)<>mrYes
then exit;
lvBreakPoints.BeginUpdate;
try
for n := lvBreakPoints.Items.Count - 1 downto 0 do
TIDEBreakPoint(lvBreakPoints.Items[n].Data).Free;
finally
lvBreakPoints.EndUpdate;
end;
finally finally
lvBreakPoints.EndUpdate; lvBreakPointsSelectItem(nil, nil, False);
end; end;
end; end;
@ -564,7 +596,12 @@ end;
procedure TBreakPointsDlg.popDeleteClick(Sender: TObject); procedure TBreakPointsDlg.popDeleteClick(Sender: TObject);
begin begin
DeleteSelectedBreakpoints try
DisableAllActions;
DeleteSelectedBreakpoints
finally
lvBreakPointsSelectItem(nil, nil, False);
end;
end; end;
procedure TBreakPointsDlg.popDisableAllClick(Sender: TObject); procedure TBreakPointsDlg.popDisableAllClick(Sender: TObject);
@ -572,11 +609,16 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
for n := 0 to lvBreakPoints.Items.Count - 1 do try
begin DisableAllActions;
Item := lvBreakPoints.Items[n]; for n := 0 to lvBreakPoints.Items.Count - 1 do
if Item.Data <> nil begin
then TIDEBreakPoint(Item.Data).Enabled := False; Item := lvBreakPoints.Items[n];
if Item.Data <> nil
then TIDEBreakPoint(Item.Data).Enabled := False;
end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end; end;
end; end;
@ -585,11 +627,16 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
for n := 0 to lvBreakPoints.Items.Count - 1 do try
begin DisableAllActions;
Item := lvBreakPoints.Items[n]; for n := 0 to lvBreakPoints.Items.Count - 1 do
if Item.Data <> nil begin
then TIDEBreakPoint(Item.Data).Enabled := True; Item := lvBreakPoints.Items[n];
if Item.Data <> nil
then TIDEBreakPoint(Item.Data).Enabled := True;
end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end; end;
end; end;
@ -599,34 +646,53 @@ var
Item: TListItem; Item: TListItem;
Enable: Boolean; Enable: Boolean;
begin begin
Item:=lvBreakPoints.Selected; try
if (Item=nil) then exit; DisableAllActions;
Item:=lvBreakPoints.Selected;
if (Item=nil) then exit;
Enable := not TIDEBreakPoint(Item.Data).Enabled; Enable := not TIDEBreakPoint(Item.Data).Enabled;
if lvBreakPoints.SelCount > 1 if lvBreakPoints.SelCount > 1
then begin then begin
for n := 0 to lvBreakPoints.Items.Count -1 do for n := 0 to lvBreakPoints.Items.Count -1 do
begin begin
Item := lvBreakPoints.Items[n]; Item := lvBreakPoints.Items[n];
if Item.Selected then if Item.Selected then
TIDEBreakPoint(Item.Data).Enabled := Enable; TIDEBreakPoint(Item.Data).Enabled := Enable;
end;
end
else begin
TIDEBreakPoint(Item.Data).Enabled:= Enable;
end; end;
end finally
else begin lvBreakPointsSelectItem(nil, nil, False);
TIDEBreakPoint(Item.Data).Enabled:= Enable;
end; end;
end; end;
procedure TBreakPointsDlg.popPropertiesClick(Sender: TObject); procedure TBreakPointsDlg.popPropertiesClick(Sender: TObject);
begin begin
ShowProperties; try
DisableAllActions;
ShowProperties;
finally
lvBreakPointsSelectItem(nil, nil, False);
end;
end; end;
procedure TBreakPointsDlg.DoEndUpdate; procedure TBreakPointsDlg.DoEndUpdate;
begin begin
inherited DoEndUpdate; inherited DoEndUpdate;
if bpdsItemsNeedUpdate in FStates then UpdateAll; if bpdsItemsNeedUpdate in FStates then UpdateAll;
lvBreakPointsSelectItem(nil, nil, False);
end;
procedure TBreakPointsDlg.DisableAllActions;
var
i: Integer;
begin
for i := 0 to ActionList1.ActionCount - 1 do
(ActionList1.Actions[i] as TAction).Enabled := False;
end; end;
procedure TBreakPointsDlg.UpdateItem(const AnItem: TListItem; procedure TBreakPointsDlg.UpdateItem(const AnItem: TListItem;
@ -761,5 +827,11 @@ begin
DebugBoss.ShowBreakPointProperties(CurBreakPoint); DebugBoss.ShowBreakPointProperties(CurBreakPoint);
end; end;
procedure TBreakPointsDlg.DoBeginUpdate;
begin
inherited DoBeginUpdate;
DisableAllActions;
end;
end. end.

View File

@ -126,6 +126,8 @@ type
protected protected
procedure DoBeginUpdate; override; procedure DoBeginUpdate; override;
procedure DoEndUpdate; override; procedure DoEndUpdate; override;
procedure DisableAllActions;
procedure EnableAllActions;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
@ -307,12 +309,30 @@ end;
procedure TCallStackDlg.DoBeginUpdate; procedure TCallStackDlg.DoBeginUpdate;
begin begin
DisableAllActions;
lvCallStack.BeginUpdate; lvCallStack.BeginUpdate;
end; end;
procedure TCallStackDlg.DoEndUpdate; procedure TCallStackDlg.DoEndUpdate;
begin begin
lvCallStack.EndUpdate; lvCallStack.EndUpdate;
EnableAllActions;
end;
procedure TCallStackDlg.DisableAllActions;
var
i: Integer;
begin
for i := 0 to aclActions.ActionCount - 1 do
(aclActions.Actions[i] as TAction).Enabled := False;
end;
procedure TCallStackDlg.EnableAllActions;
var
i: Integer;
begin
for i := 0 to aclActions.ActionCount - 1 do
(aclActions.Actions[i] as TAction).Enabled := True;
end; end;
function TCallStackDlg.GetCurrentEntry: TCallStackEntry; function TCallStackDlg.GetCurrentEntry: TCallStackEntry;
@ -381,19 +401,24 @@ var
BreakPoint: TIDEBreakPoint; BreakPoint: TIDEBreakPoint;
FileName: String; FileName: String;
begin begin
if (Item <> nil) and (BreakPoints <> nil) then try
begin DisableAllActions;
idx := FViewStart + Item.Index; if (Item <> nil) and (BreakPoints <> nil) then
if idx >= CallStack.Count then Exit; begin
Entry := CallStack.Entries[idx]; idx := FViewStart + Item.Index;
FileName := Entry.Source; if idx >= CallStack.Count then Exit;
if (FileName = '') or not DebugBoss.GetFullFilename(FileName, False) then Entry := CallStack.Entries[idx];
Exit; FileName := Entry.Source;
BreakPoint := BreakPoints.Find(FileName, Entry.Line); if (FileName = '') or not DebugBoss.GetFullFilename(FileName, False) then
if BreakPoint <> nil then Exit;
DebugBoss.DoDeleteBreakPoint(BreakPoint.Source, BreakPoint.Line) BreakPoint := BreakPoints.Find(FileName, Entry.Line);
else if BreakPoint <> nil then
DebugBoss.DoCreateBreakPoint(FileName, Entry.Line, False); DebugBoss.DoDeleteBreakPoint(BreakPoint.Source, BreakPoint.Line)
else
DebugBoss.DoCreateBreakPoint(FileName, Entry.Line, False);
end;
finally
EnableAllActions;
end; end;
end; end;
@ -439,10 +464,15 @@ procedure TCallStackDlg.actSetAsCurrentClick(Sender : TObject);
var var
Entry: TCallStackEntry; Entry: TCallStackEntry;
begin begin
Entry := GetCurrentEntry; try
if Entry = nil then Exit; DisableAllActions;
Entry := GetCurrentEntry;
if Entry = nil then Exit;
CallStack.Current := Entry; CallStack.Current := Entry;
finally
EnableAllActions;
end;
end; end;
procedure TCallStackDlg.actShowClick(Sender: TObject); procedure TCallStackDlg.actShowClick(Sender: TObject);
@ -452,9 +482,14 @@ end;
procedure TCallStackDlg.actViewBottomExecute(Sender: TObject); procedure TCallStackDlg.actViewBottomExecute(Sender: TObject);
begin begin
if CallStack <> nil try
then SetViewStart(CallStack.Count - FViewLimit) DisableAllActions;
else SetViewStart(0); if CallStack <> nil
then SetViewStart(CallStack.Count - FViewLimit)
else SetViewStart(0);
finally
EnableAllActions;
end;
end; end;
procedure TCallStackDlg.actToggleBreakPointExecute(Sender: TObject); procedure TCallStackDlg.actToggleBreakPointExecute(Sender: TObject);
@ -464,21 +499,36 @@ end;
procedure TCallStackDlg.actViewGotoExecute(Sender: TObject); procedure TCallStackDlg.actViewGotoExecute(Sender: TObject);
begin begin
SetViewStart(StrToIntDef(txtGoto.Text, 0)); try
DisableAllActions;
SetViewStart(StrToIntDef(txtGoto.Text, 0));
finally
EnableAllActions;
end;
end; end;
procedure TCallStackDlg.actViewMoreExecute(Sender: TObject); procedure TCallStackDlg.actViewMoreExecute(Sender: TObject);
begin begin
ToolButtonPower.Down := True; try
ToolButtonPowerClick(nil); DisableAllActions;
ViewLimit := ViewLimit + FViewCount; ToolButtonPower.Down := True;
ToolButtonPowerClick(nil);
ViewLimit := ViewLimit + FViewCount;
finally
EnableAllActions;
end;
end; end;
procedure TCallStackDlg.actViewTopExecute(Sender: TObject); procedure TCallStackDlg.actViewTopExecute(Sender: TObject);
begin begin
ToolButtonPower.Down := True; try
ToolButtonPowerClick(nil); DisableAllActions;
SetViewStart(0); ToolButtonPower.Down := True;
ToolButtonPowerClick(nil);
SetViewStart(0);
finally
EnableAllActions;
end;
end; end;
procedure TCallStackDlg.BreakPointChanged(const ASender: TIDEBreakPoints; procedure TCallStackDlg.BreakPointChanged(const ASender: TIDEBreakPoints;
@ -571,9 +621,14 @@ end;
procedure TCallStackDlg.actViewLimitExecute(Sender: TObject); procedure TCallStackDlg.actViewLimitExecute(Sender: TObject);
begin begin
ToolButtonPower.Down := True; try
ToolButtonPowerClick(nil); DisableAllActions;
ViewLimit := FViewCount; ToolButtonPower.Down := True;
ToolButtonPowerClick(nil);
ViewLimit := FViewCount;
finally
EnableAllActions;
end;
end; end;
procedure TCallStackDlg.SetViewStart(AStart: Integer); procedure TCallStackDlg.SetViewStart(AStart: Integer);

View File

@ -111,6 +111,7 @@ type
procedure UpdateItem(const AItem: TListItem; const AWatch: TIDEWatch); procedure UpdateItem(const AItem: TListItem; const AWatch: TIDEWatch);
procedure UpdateAll; procedure UpdateAll;
procedure DisableAllActions;
protected protected
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
@ -276,6 +277,8 @@ begin
actDeleteAll.Enabled := lvWatches.Items.Count > 0; actDeleteAll.Enabled := lvWatches.Items.Count > 0;
actProperties.Enabled := ItemSelected; actProperties.Enabled := ItemSelected;
actPower.Enabled := True;
end; end;
procedure TWatchesDlg.lvWatchesDblClick(Sender: TObject); procedure TWatchesDlg.lvWatchesDblClick(Sender: TObject);
@ -320,11 +323,16 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
for n := 0 to lvWatches.Items.Count -1 do try
begin DisableAllActions;
Item := lvWatches.Items[n]; for n := 0 to lvWatches.Items.Count -1 do
if Item.Selected then begin
TIDEWatch(Item.Data).Enabled := True; Item := lvWatches.Items[n];
if Item.Selected then
TIDEWatch(Item.Data).Enabled := True;
end;
finally
lvWatchesSelectItem(nil, nil, False);
end; end;
end; end;
@ -333,11 +341,16 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
for n := 0 to lvWatches.Items.Count -1 do try
begin DisableAllActions;
Item := lvWatches.Items[n]; for n := 0 to lvWatches.Items.Count -1 do
if Item.Selected then begin
TIDEWatch(Item.Data).Enabled := False; Item := lvWatches.Items[n];
if Item.Selected then
TIDEWatch(Item.Data).Enabled := False;
end;
finally
lvWatchesSelectItem(nil, nil, False);
end; end;
end; end;
@ -357,26 +370,41 @@ end;
procedure TWatchesDlg.popAddClick(Sender: TObject); procedure TWatchesDlg.popAddClick(Sender: TObject);
begin begin
DebugBoss.ShowWatchProperties(nil); try
DisableAllActions;
DebugBoss.ShowWatchProperties(nil);
finally
lvWatchesSelectItem(nil, nil, False);
end;
end; end;
procedure TWatchesDlg.popDeleteAllClick(Sender: TObject); procedure TWatchesDlg.popDeleteAllClick(Sender: TObject);
var var
n: Integer; n: Integer;
begin begin
for n := lvWatches.Items.Count - 1 downto 0 do try
TIDEWatch(lvWatches.Items[n].Data).Free; DisableAllActions;
for n := lvWatches.Items.Count - 1 downto 0 do
TIDEWatch(lvWatches.Items[n].Data).Free;
finally
lvWatchesSelectItem(nil, nil, False);
end;
end; end;
procedure TWatchesDlg.popDeleteClick(Sender: TObject); procedure TWatchesDlg.popDeleteClick(Sender: TObject);
var var
Item: TIDEWatch; Item: TIDEWatch;
begin begin
repeat try
Item := GetSelected; DisableAllActions;
Item.Free; repeat
until Item = nil; Item := GetSelected;
//GetSelected.Free; Item.Free;
until Item = nil;
//GetSelected.Free;
finally
lvWatchesSelectItem(nil, nil, False);
end;
end; end;
procedure TWatchesDlg.popDisableAllClick(Sender: TObject); procedure TWatchesDlg.popDisableAllClick(Sender: TObject);
@ -384,11 +412,16 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
for n := 0 to lvWatches.Items.Count - 1 do try
begin DisableAllActions;
Item := lvWatches.Items[n]; for n := 0 to lvWatches.Items.Count - 1 do
if Item.Data <> nil begin
then TIDEWatch(Item.Data).Enabled := False; Item := lvWatches.Items[n];
if Item.Data <> nil
then TIDEWatch(Item.Data).Enabled := False;
end;
finally
lvWatchesSelectItem(nil, nil, False);
end; end;
end; end;
@ -397,11 +430,16 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
for n := 0 to lvWatches.Items.Count - 1 do try
begin DisableAllActions;
Item := lvWatches.Items[n]; for n := 0 to lvWatches.Items.Count - 1 do
if Item.Data <> nil begin
then TIDEWatch(Item.Data).Enabled := True; Item := lvWatches.Items[n];
if Item.Data <> nil
then TIDEWatch(Item.Data).Enabled := True;
end;
finally
lvWatchesSelectItem(nil, nil, False);
end; end;
end; end;
@ -409,15 +447,25 @@ procedure TWatchesDlg.popEnabledClick(Sender: TObject);
var var
Watch: TIDEWatch; Watch: TIDEWatch;
begin begin
Watch := GetSelected; try
if Watch = nil then Exit; DisableAllActions;
popEnabled.Checked := not popEnabled.Checked; Watch := GetSelected;
Watch.Enabled := popEnabled.Checked; if Watch = nil then Exit;
popEnabled.Checked := not popEnabled.Checked;
Watch.Enabled := popEnabled.Checked;
finally
lvWatchesSelectItem(nil, nil, False);
end;
end; end;
procedure TWatchesDlg.popPropertiesClick(Sender: TObject); procedure TWatchesDlg.popPropertiesClick(Sender: TObject);
begin begin
DebugBoss.ShowWatchProperties(GetSelected); try
DisableAllActions;
DebugBoss.ShowWatchProperties(GetSelected);
finally
lvWatchesSelectItem(nil, nil, False);
end;
end; end;
procedure TWatchesDlg.UpdateItem(const AItem: TListItem; const AWatch: TIDEWatch); procedure TWatchesDlg.UpdateItem(const AItem: TListItem; const AWatch: TIDEWatch);
@ -467,6 +515,14 @@ begin
WatchUpdate(FWatches, FWatches.Items[i]); WatchUpdate(FWatches, FWatches.Items[i]);
end; end;
procedure TWatchesDlg.DisableAllActions;
var
i: Integer;
begin
for i := 0 to ActionList1.ActionCount - 1 do
(ActionList1.Actions[i] as TAction).Enabled := False;
end;
procedure TWatchesDlg.WatchAdd(const ASender: TIDEWatches; const AWatch: TIDEWatch); procedure TWatchesDlg.WatchAdd(const ASender: TIDEWatches; const AWatch: TIDEWatch);
var var
Item: TListItem; Item: TListItem;