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,12 +353,17 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
try
DisableAllActions;
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 := True; TIDEBreakPoint(Item.Data).Enabled := True;
end; end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end;
end; end;
procedure TBreakPointsDlg.actDisableSelectedExecute(Sender: TObject); procedure TBreakPointsDlg.actDisableSelectedExecute(Sender: TObject);
@ -364,12 +371,17 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
try
DisableAllActions;
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 := False; TIDEBreakPoint(Item.Data).Enabled := False;
end; end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end;
end; end;
procedure TBreakPointsDlg.lvBreakPointsClick(Sender: TObject); procedure TBreakPointsDlg.lvBreakPointsClick(Sender: TObject);
@ -484,6 +496,8 @@ var
CurBreakPoint: TIDEBreakPoint; CurBreakPoint: TIDEBreakPoint;
Filename: String; Filename: String;
begin begin
try
DisableAllActions;
CurItem:=lvBreakPoints.Selected; CurItem:=lvBreakPoints.Selected;
if (CurItem=nil) then exit; if (CurItem=nil) then exit;
Filename:=TIDEBreakpoint(CurItem.Data).Source; Filename:=TIDEBreakpoint(CurItem.Data).Source;
@ -498,6 +512,9 @@ begin
if CompareFilenames(CurBreakPoint.Source,Filename)=0 if CompareFilenames(CurBreakPoint.Source,Filename)=0
then CurBreakPoint.Free; then CurBreakPoint.Free;
end; end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end;
end; end;
procedure TBreakPointsDlg.popDisableAllSameSourceCLICK(Sender: TObject); procedure TBreakPointsDlg.popDisableAllSameSourceCLICK(Sender: TObject);
@ -508,6 +525,8 @@ var
CurBreakPoint: TIDEBreakPoint; CurBreakPoint: TIDEBreakPoint;
Filename: String; Filename: String;
begin begin
try
DisableAllActions;
CurItem:=lvBreakPoints.Selected; CurItem:=lvBreakPoints.Selected;
if (CurItem=nil) then exit; if (CurItem=nil) then exit;
Filename:=TIDEBreakpoint(CurItem.Data).Source; Filename:=TIDEBreakpoint(CurItem.Data).Source;
@ -518,6 +537,9 @@ begin
if CompareFilenames(CurBreakPoint.Source,Filename)=0 if CompareFilenames(CurBreakPoint.Source,Filename)=0
then CurBreakPoint.Enabled := False; then CurBreakPoint.Enabled := False;
end; end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end;
end; end;
procedure TBreakPointsDlg.popEnableAllSameSourceCLICK(Sender: TObject); procedure TBreakPointsDlg.popEnableAllSameSourceCLICK(Sender: TObject);
@ -528,6 +550,8 @@ var
CurBreakPoint: TIDEBreakPoint; CurBreakPoint: TIDEBreakPoint;
Filename: String; Filename: String;
begin begin
try
DisableAllActions;
CurItem:=lvBreakPoints.Selected; CurItem:=lvBreakPoints.Selected;
if (CurItem=nil) then exit; if (CurItem=nil) then exit;
Filename:=TIDEBreakpoint(CurItem.Data).Source; Filename:=TIDEBreakpoint(CurItem.Data).Source;
@ -538,12 +562,17 @@ begin
if CompareFilenames(CurBreakPoint.Source,Filename)=0 if CompareFilenames(CurBreakPoint.Source,Filename)=0
then CurBreakPoint.Enabled := True; then CurBreakPoint.Enabled := True;
end; end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end;
end; end;
procedure TBreakPointsDlg.popDeleteAllClick(Sender: TObject); procedure TBreakPointsDlg.popDeleteAllClick(Sender: TObject);
var var
n: Integer; n: Integer;
begin begin
try
DisableAllActions;
if MessageDlg(lisDeleteAllBreakpoints, if MessageDlg(lisDeleteAllBreakpoints,
lisDeleteAllBreakpoints, lisDeleteAllBreakpoints,
mtConfirmation,[mbYes,mbCancel],0)<>mrYes mtConfirmation,[mbYes,mbCancel],0)<>mrYes
@ -555,6 +584,9 @@ begin
finally finally
lvBreakPoints.EndUpdate; lvBreakPoints.EndUpdate;
end; end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end;
end; end;
procedure TBreakPointsDlg.popShowClick(Sender: TObject); procedure TBreakPointsDlg.popShowClick(Sender: TObject);
@ -564,7 +596,12 @@ end;
procedure TBreakPointsDlg.popDeleteClick(Sender: TObject); procedure TBreakPointsDlg.popDeleteClick(Sender: TObject);
begin begin
try
DisableAllActions;
DeleteSelectedBreakpoints DeleteSelectedBreakpoints
finally
lvBreakPointsSelectItem(nil, nil, False);
end;
end; end;
procedure TBreakPointsDlg.popDisableAllClick(Sender: TObject); procedure TBreakPointsDlg.popDisableAllClick(Sender: TObject);
@ -572,12 +609,17 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
try
DisableAllActions;
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.Data <> nil if Item.Data <> nil
then TIDEBreakPoint(Item.Data).Enabled := False; then TIDEBreakPoint(Item.Data).Enabled := False;
end; end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end;
end; end;
procedure TBreakPointsDlg.popEnableAllClick(Sender: TObject); procedure TBreakPointsDlg.popEnableAllClick(Sender: TObject);
@ -585,12 +627,17 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
try
DisableAllActions;
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.Data <> nil if Item.Data <> nil
then TIDEBreakPoint(Item.Data).Enabled := True; then TIDEBreakPoint(Item.Data).Enabled := True;
end; end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end;
end; end;
procedure TBreakPointsDlg.popEnabledClick(Sender: TObject); procedure TBreakPointsDlg.popEnabledClick(Sender: TObject);
@ -599,6 +646,8 @@ var
Item: TListItem; Item: TListItem;
Enable: Boolean; Enable: Boolean;
begin begin
try
DisableAllActions;
Item:=lvBreakPoints.Selected; Item:=lvBreakPoints.Selected;
if (Item=nil) then exit; if (Item=nil) then exit;
@ -616,17 +665,34 @@ begin
else begin else begin
TIDEBreakPoint(Item.Data).Enabled:= Enable; TIDEBreakPoint(Item.Data).Enabled:= Enable;
end; end;
finally
lvBreakPointsSelectItem(nil, nil, False);
end;
end; end;
procedure TBreakPointsDlg.popPropertiesClick(Sender: TObject); procedure TBreakPointsDlg.popPropertiesClick(Sender: TObject);
begin begin
try
DisableAllActions;
ShowProperties; 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,6 +401,8 @@ var
BreakPoint: TIDEBreakPoint; BreakPoint: TIDEBreakPoint;
FileName: String; FileName: String;
begin begin
try
DisableAllActions;
if (Item <> nil) and (BreakPoints <> nil) then if (Item <> nil) and (BreakPoints <> nil) then
begin begin
idx := FViewStart + Item.Index; idx := FViewStart + Item.Index;
@ -395,6 +417,9 @@ begin
else else
DebugBoss.DoCreateBreakPoint(FileName, Entry.Line, False); DebugBoss.DoCreateBreakPoint(FileName, Entry.Line, False);
end; end;
finally
EnableAllActions;
end;
end; end;
procedure TCallStackDlg.lvCallStackDBLCLICK(Sender: TObject); procedure TCallStackDlg.lvCallStackDBLCLICK(Sender: TObject);
@ -439,10 +464,15 @@ procedure TCallStackDlg.actSetAsCurrentClick(Sender : TObject);
var var
Entry: TCallStackEntry; Entry: TCallStackEntry;
begin begin
try
DisableAllActions;
Entry := GetCurrentEntry; Entry := GetCurrentEntry;
if Entry = nil then Exit; 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
try
DisableAllActions;
if CallStack <> nil if CallStack <> nil
then SetViewStart(CallStack.Count - FViewLimit) then SetViewStart(CallStack.Count - FViewLimit)
else SetViewStart(0); 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
try
DisableAllActions;
SetViewStart(StrToIntDef(txtGoto.Text, 0)); SetViewStart(StrToIntDef(txtGoto.Text, 0));
finally
EnableAllActions;
end;
end; end;
procedure TCallStackDlg.actViewMoreExecute(Sender: TObject); procedure TCallStackDlg.actViewMoreExecute(Sender: TObject);
begin begin
try
DisableAllActions;
ToolButtonPower.Down := True; ToolButtonPower.Down := True;
ToolButtonPowerClick(nil); ToolButtonPowerClick(nil);
ViewLimit := ViewLimit + FViewCount; ViewLimit := ViewLimit + FViewCount;
finally
EnableAllActions;
end;
end; end;
procedure TCallStackDlg.actViewTopExecute(Sender: TObject); procedure TCallStackDlg.actViewTopExecute(Sender: TObject);
begin begin
try
DisableAllActions;
ToolButtonPower.Down := True; ToolButtonPower.Down := True;
ToolButtonPowerClick(nil); ToolButtonPowerClick(nil);
SetViewStart(0); 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
try
DisableAllActions;
ToolButtonPower.Down := True; ToolButtonPower.Down := True;
ToolButtonPowerClick(nil); ToolButtonPowerClick(nil);
ViewLimit := FViewCount; 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,12 +323,17 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
try
DisableAllActions;
for n := 0 to lvWatches.Items.Count -1 do for n := 0 to lvWatches.Items.Count -1 do
begin begin
Item := lvWatches.Items[n]; Item := lvWatches.Items[n];
if Item.Selected then if Item.Selected then
TIDEWatch(Item.Data).Enabled := True; TIDEWatch(Item.Data).Enabled := True;
end; end;
finally
lvWatchesSelectItem(nil, nil, False);
end;
end; end;
procedure TWatchesDlg.actDisableSelectedExecute(Sender: TObject); procedure TWatchesDlg.actDisableSelectedExecute(Sender: TObject);
@ -333,12 +341,17 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
try
DisableAllActions;
for n := 0 to lvWatches.Items.Count -1 do for n := 0 to lvWatches.Items.Count -1 do
begin begin
Item := lvWatches.Items[n]; Item := lvWatches.Items[n];
if Item.Selected then if Item.Selected then
TIDEWatch(Item.Data).Enabled := False; TIDEWatch(Item.Data).Enabled := False;
end; end;
finally
lvWatchesSelectItem(nil, nil, False);
end;
end; end;
procedure TWatchesDlg.lvWatchesKeyDown(Sender: TObject; var Key: Word; procedure TWatchesDlg.lvWatchesKeyDown(Sender: TObject; var Key: Word;
@ -357,26 +370,41 @@ end;
procedure TWatchesDlg.popAddClick(Sender: TObject); procedure TWatchesDlg.popAddClick(Sender: TObject);
begin begin
try
DisableAllActions;
DebugBoss.ShowWatchProperties(nil); 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
try
DisableAllActions;
for n := lvWatches.Items.Count - 1 downto 0 do for n := lvWatches.Items.Count - 1 downto 0 do
TIDEWatch(lvWatches.Items[n].Data).Free; 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
try
DisableAllActions;
repeat repeat
Item := GetSelected; Item := GetSelected;
Item.Free; Item.Free;
until Item = nil; until Item = nil;
//GetSelected.Free; //GetSelected.Free;
finally
lvWatchesSelectItem(nil, nil, False);
end;
end; end;
procedure TWatchesDlg.popDisableAllClick(Sender: TObject); procedure TWatchesDlg.popDisableAllClick(Sender: TObject);
@ -384,12 +412,17 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
try
DisableAllActions;
for n := 0 to lvWatches.Items.Count - 1 do for n := 0 to lvWatches.Items.Count - 1 do
begin begin
Item := lvWatches.Items[n]; Item := lvWatches.Items[n];
if Item.Data <> nil if Item.Data <> nil
then TIDEWatch(Item.Data).Enabled := False; then TIDEWatch(Item.Data).Enabled := False;
end; end;
finally
lvWatchesSelectItem(nil, nil, False);
end;
end; end;
procedure TWatchesDlg.popEnableAllClick(Sender: TObject); procedure TWatchesDlg.popEnableAllClick(Sender: TObject);
@ -397,27 +430,42 @@ var
n: Integer; n: Integer;
Item: TListItem; Item: TListItem;
begin begin
try
DisableAllActions;
for n := 0 to lvWatches.Items.Count - 1 do for n := 0 to lvWatches.Items.Count - 1 do
begin begin
Item := lvWatches.Items[n]; Item := lvWatches.Items[n];
if Item.Data <> nil if Item.Data <> nil
then TIDEWatch(Item.Data).Enabled := True; then TIDEWatch(Item.Data).Enabled := True;
end; end;
finally
lvWatchesSelectItem(nil, nil, False);
end;
end; end;
procedure TWatchesDlg.popEnabledClick(Sender: TObject); procedure TWatchesDlg.popEnabledClick(Sender: TObject);
var var
Watch: TIDEWatch; Watch: TIDEWatch;
begin begin
try
DisableAllActions;
Watch := GetSelected; Watch := GetSelected;
if Watch = nil then Exit; if Watch = nil then Exit;
popEnabled.Checked := not popEnabled.Checked; popEnabled.Checked := not popEnabled.Checked;
Watch.Enabled := 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
try
DisableAllActions;
DebugBoss.ShowWatchProperties(GetSelected); 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;