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

View File

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

View File

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