fix, bug described in bdc7626b26, focus event, too much updates.

the docFocused event is still called but the observers does not always perform their updates
This commit is contained in:
Basile Burg 2015-01-31 14:44:44 +01:00
parent e9c6de2700
commit f211d3533f
6 changed files with 36 additions and 29 deletions

View File

@ -186,6 +186,7 @@ end;
procedure TCEEditorWidget.docFocused(aDoc: TCESynMemo); procedure TCEEditorWidget.docFocused(aDoc: TCESynMemo);
begin begin
if aDoc = fDoc then exit;
fDoc := aDoc; fDoc := aDoc;
focusedEditorChanged; focusedEditorChanged;
beginUpdateByDelay; beginUpdateByDelay;
@ -234,7 +235,6 @@ begin
macRecorder.Editor := fDoc; macRecorder.Editor := fDoc;
fSyncEdit.Editor := fDoc; fSyncEdit.Editor := fDoc;
completion.Editor := fDoc; completion.Editor := fDoc;
//TODO-cbugfix: prevent completion to steal the focus, this trigs too much updates after Ctrl+Space
if (pageControl.ActivePage.Caption = '') then if (pageControl.ActivePage.Caption = '') then
begin begin
fKeyChanged := true; fKeyChanged := true;

View File

@ -364,6 +364,7 @@ end;
procedure TCEMessagesWidget.projFocused(aProject: TCEProject); procedure TCEMessagesWidget.projFocused(aProject: TCEProject);
begin begin
if fProj = aProject then exit;
fProj := aProject; fProj := aProject;
filterMessages(fCtxt); filterMessages(fCtxt);
end; end;
@ -394,6 +395,7 @@ end;
procedure TCEMessagesWidget.docFocused(aDoc: TCESynMemo); procedure TCEMessagesWidget.docFocused(aDoc: TCESynMemo);
begin begin
if fDoc = aDoc then exit;
fDoc := aDoc; fDoc := aDoc;
filterMessages(fCtxt); filterMessages(fCtxt);
end; end;

View File

@ -29,7 +29,7 @@ type
procedure cbToFindChange(Sender: TObject); procedure cbToFindChange(Sender: TObject);
procedure chkEnableRepChange(Sender: TObject); procedure chkEnableRepChange(Sender: TObject);
private private
fEditor: TCESynMemo; fDoc: TCESynMemo;
fToFind: string; fToFind: string;
fReplaceWth: string; fReplaceWth: string;
fActFindNext, fActReplaceNext: TAction; fActFindNext, fActReplaceNext: TAction;
@ -187,28 +187,28 @@ end;
procedure TCESearchWidget.actFindNextExecute(sender: TObject); procedure TCESearchWidget.actFindNextExecute(sender: TObject);
begin begin
if fEditor = nil then exit; if fDoc = nil then exit;
// //
fSearchMru.Insert(0,fToFind); fSearchMru.Insert(0,fToFind);
if not chkFromCur.Checked then if not chkFromCur.Checked then
begin begin
if chkBack.Checked then if chkBack.Checked then
fEditor.CaretXY := Point(high(Integer), high(Integer)) fDoc.CaretXY := Point(high(Integer), high(Integer))
else else
begin begin
if not fHasRestarted then if not fHasRestarted then
fEditor.CaretXY := Point(0,0); fDoc.CaretXY := Point(0,0);
fHasRestarted := true; fHasRestarted := true;
end; end;
end end
else if fHasSearched then else if fHasSearched then
begin begin
if chkBack.Checked then if chkBack.Checked then
fEditor.CaretX := fEditor.CaretX - 1 fDoc.CaretX := fDoc.CaretX - 1
else else
fEditor.CaretX := fEditor.CaretX + length(fToFind); fDoc.CaretX := fDoc.CaretX + length(fToFind);
end; end;
if fEditor.SearchReplace(fToFind, '', getOptions) = 0 then if fDoc.SearchReplace(fToFind, '', getOptions) = 0 then
dlgOkInfo('the expression cannot be found') dlgOkInfo('the expression cannot be found')
else else
begin begin
@ -221,29 +221,29 @@ end;
procedure TCESearchWidget.actReplaceNextExecute(sender: TObject); procedure TCESearchWidget.actReplaceNextExecute(sender: TObject);
begin begin
if fEditor = nil then exit; if fDoc = nil then exit;
// //
fSearchMru.Insert(0, fToFind); fSearchMru.Insert(0, fToFind);
fReplaceMru.Insert(0, fReplaceWth); fReplaceMru.Insert(0, fReplaceWth);
if chkPrompt.Checked then if chkPrompt.Checked then
fEditor.OnReplaceText := @replaceEvent; fDoc.OnReplaceText := @replaceEvent;
if not chkFromCur.Checked then if not chkFromCur.Checked then
begin begin
if chkBack.Checked then if chkBack.Checked then
fEditor.CaretXY := Point(high(Integer), high(Integer)) fDoc.CaretXY := Point(high(Integer), high(Integer))
else else
fEditor.CaretXY := Point(0,0); fDoc.CaretXY := Point(0,0);
end end
else if fHasSearched then else if fHasSearched then
begin begin
if chkBack.Checked then if chkBack.Checked then
fEditor.CaretX := fEditor.CaretX - 1 fDoc.CaretX := fDoc.CaretX - 1
else else
fEditor.CaretX := fEditor.CaretX + length(fToFind); fDoc.CaretX := fDoc.CaretX + length(fToFind);
end; end;
if fEditor.SearchReplace(fToFind, fReplaceWth, getOptions + [ssoReplace]) <> 0 then if fDoc.SearchReplace(fToFind, fReplaceWth, getOptions + [ssoReplace]) <> 0 then
fHasSearched := true; fHasSearched := true;
fEditor.OnReplaceText := nil; fDoc.OnReplaceText := nil;
UpdateByEvent; UpdateByEvent;
end; end;
@ -251,17 +251,17 @@ procedure TCESearchWidget.actReplaceAllExecute(sender: TObject);
var var
opts: TSynSearchOptions; opts: TSynSearchOptions;
begin begin
if fEditor = nil then exit; if fDoc = nil then exit;
opts := getOptions + [ssoReplace]; opts := getOptions + [ssoReplace];
opts -= [ssoBackwards]; opts -= [ssoBackwards];
// //
fSearchMru.Insert(0, fToFind); fSearchMru.Insert(0, fToFind);
fReplaceMru.Insert(0, fReplaceWth); fReplaceMru.Insert(0, fReplaceWth);
if chkPrompt.Checked then fEditor.OnReplaceText := @replaceEvent; if chkPrompt.Checked then fDoc.OnReplaceText := @replaceEvent;
fEditor.CaretXY := Point(0,0); fDoc.CaretXY := Point(0,0);
while(true) do while(true) do
begin begin
if fEditor.SearchReplace(fToFind, fReplaceWth, opts) = 0 if fDoc.SearchReplace(fToFind, fReplaceWth, opts) = 0
then break; then break;
if fCancelAll then if fCancelAll then
begin begin
@ -269,7 +269,7 @@ begin
break; break;
end; end;
end; end;
fEditor.OnReplaceText := nil; fDoc.OnReplaceText := nil;
UpdateByEvent; UpdateByEvent;
end; end;
{$ENDREGION} {$ENDREGION}
@ -277,19 +277,20 @@ end;
{$REGION ICEMultiDocObserver ---------------------------------------------------} {$REGION ICEMultiDocObserver ---------------------------------------------------}
procedure TCESearchWidget.docNew(aDoc: TCESynMemo); procedure TCESearchWidget.docNew(aDoc: TCESynMemo);
begin begin
fEditor := aDoc; fDoc := aDoc;
UpdateByEvent; UpdateByEvent;
end; end;
procedure TCESearchWidget.docClosing(aDoc: TCESynMemo); procedure TCESearchWidget.docClosing(aDoc: TCESynMemo);
begin begin
if fEditor = aDoc then fEditor := nil; if fDoc = aDoc then fDoc := nil;
UpdateByEvent; UpdateByEvent;
end; end;
procedure TCESearchWidget.docFocused(aDoc: TCESynMemo); procedure TCESearchWidget.docFocused(aDoc: TCESynMemo);
begin begin
fEditor := aDoc; if fDoc = aDoc then exit;
fDoc := aDoc;
UpdateByEvent; UpdateByEvent;
end; end;
@ -321,11 +322,11 @@ end;
procedure TCESearchWidget.UpdateByEvent; procedure TCESearchWidget.UpdateByEvent;
begin begin
fActFindNext.Enabled := fEditor <> nil; fActFindNext.Enabled := fDoc <> nil;
fActReplaceNext.Enabled := (fEditor <> nil) and (chkEnableRep.Checked); fActReplaceNext.Enabled := (fDoc <> nil) and (chkEnableRep.Checked);
fActReplaceAll.Enabled := (fEditor <> nil) and (chkEnableRep.Checked); fActReplaceAll.Enabled := (fDoc <> nil) and (chkEnableRep.Checked);
cbReplaceWth.Enabled := (fEditor <> nil) and (chkEnableRep.Checked); cbReplaceWth.Enabled := (fDoc <> nil) and (chkEnableRep.Checked);
cbToFind.Enabled := fEditor <> nil; cbToFind.Enabled := fDoc <> nil;
// //
cbToFind.Items.Assign(fSearchMru); cbToFind.Items.Assign(fSearchMru);
cbReplaceWth.Items.Assign(fReplaceMru); cbReplaceWth.Items.Assign(fReplaceMru);

View File

@ -286,6 +286,7 @@ end;
procedure TCEStaticExplorerWidget.docFocused(aDoc: TCESynMemo); procedure TCEStaticExplorerWidget.docFocused(aDoc: TCESynMemo);
begin begin
if fDoc = aDoc then exit;
fDoc := aDoc; fDoc := aDoc;
if not Visible then exit; if not Visible then exit;
// //

View File

@ -128,6 +128,7 @@ end;
procedure TCEStaticEditorMacro.docFocused(aDoc: TCESynMemo); procedure TCEStaticEditorMacro.docFocused(aDoc: TCESynMemo);
begin begin
if fDoc = aDoc then exit;
fDoc := aDoc; fDoc := aDoc;
fCompletor.Editor := fDoc; fCompletor.Editor := fDoc;
end; end;

View File

@ -204,6 +204,7 @@ end;
procedure TCETodoListWidget.docFocused(aDoc: TCESynMemo); procedure TCETodoListWidget.docFocused(aDoc: TCESynMemo);
begin begin
if aDoc = fDoc then exit;
fDoc := aDoc; fDoc := aDoc;
if Visible then if Visible then
callToolProcess; callToolProcess;
@ -244,6 +245,7 @@ end;
procedure TCETodoListWidget.projFocused(aProject: TCEProject); procedure TCETodoListWidget.projFocused(aProject: TCEProject);
begin begin
if aProject = fProj then exit;
fProj := aProject; fProj := aProject;
if Visible then if Visible then
callToolProcess; callToolProcess;