LazReport, previous step for proper drawing in designer: isolating selection and object draws

git-svn-id: trunk@40540 -
This commit is contained in:
jesus 2013-03-13 06:00:20 +00:00
parent afb022bcb4
commit 17eb1a44d9

View File

@ -172,8 +172,17 @@ type
procedure DClick(Sender: TObject); procedure DClick(Sender: TObject);
procedure MoveResize(Kx,Ky:Integer; UseFrames,AResize: boolean); procedure MoveResize(Kx,Ky:Integer; UseFrames,AResize: boolean);
// focusrect
procedure NPDrawFocusRect; procedure NPDrawFocusRect;
procedure NPEraseFocusRect; procedure NPEraseFocusRect;
// objects
procedure NPDrawLayerObjects(Rgn: HRGN; Start:Integer=10000);
procedure NPRedrawViewCheckBand(t: TfrView);
// selection
procedure NPPaintSelection; // this is the only function that works during Paint
procedure NPDrawSelection;
procedure NPEraseSelection;
protected protected
procedure Paint; override; procedure Paint; override;
procedure WMEraseBkgnd(var {%H-}Message: TLMEraseBkgnd); message LM_ERASEBKGND; procedure WMEraseBkgnd(var {%H-}Message: TLMEraseBkgnd); message LM_ERASEBKGND;
@ -1151,7 +1160,7 @@ begin
SelectClipRgn(Canvas.Handle, 0); SelectClipRgn(Canvas.Handle, 0);
if not Down then if not Down then
DrawPage(dmSelection); NPPaintSelection;
{$IFDEF DebugLR} {$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.Draw DONE'); DebugLnExit('TfrDesignerPage.Draw DONE');
@ -1286,7 +1295,7 @@ begin
NPEraseFocusRect; NPEraseFocusRect;
RFlag := False; RFlag := False;
DrawPage(dmSelection); NPEraseSelection;
Down := True; Down := True;
DontChange := False; DontChange := False;
if Button = mbLeft then if Button = mbLeft then
@ -1419,7 +1428,7 @@ begin
if Button = mbRight then if Button = mbRight then
begin begin
DrawPage(dmSelection); NPDrawSelection;
Down := False; Down := False;
GetCursorPos(p{%H-}); GetCursorPos(p{%H-});
//FDesigner.Popup1Popup(nil); //FDesigner.Popup1Popup(nil);
@ -1640,19 +1649,8 @@ begin
end; end;
SelNum := 1; SelNum := 1;
if t.Typ = gtBand then NPRedrawViewCheckBand(t);
begin
{$IFDEF DebugLR}
DebugLn('A new band was inserted');
{$ENDIF}
Draw(10000, t.GetClipRgn(rtExtended))
end
else
begin
t.Draw(Canvas);
DrawSelection(t);
end;
with FDesigner do with FDesigner do
begin begin
SelectionChanged; SelectionChanged;
@ -1703,8 +1701,7 @@ begin
t.FrameWidth := LastLineWidth; t.FrameWidth := LastLineWidth;
t.FrameColor := LastFrameColor; t.FrameColor := LastFrameColor;
SelNum := 1; SelNum := 1;
t.Draw(Canvas); NPRedrawViewCheckBand(t);
DrawSelection(t);
FDesigner.SelectionChanged; FDesigner.SelectionChanged;
FDesigner.AddUndoAction(acInsert); FDesigner.AddUndoAction(acInsert);
{$IFDEF DebugLR} {$IFDEF DebugLR}
@ -1737,7 +1734,7 @@ begin
end; end;
GetMultipleSelected; GetMultipleSelected;
FDesigner.SelectionChanged; FDesigner.SelectionChanged;
DrawPage(dmSelection); NPDrawSelection;
{$IFDEF DebugLR} {$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MUp DONE: objects contained in frame'); DebugLnExit('TfrDesignerPage.MUp DONE: objects contained in frame');
{$ENDIF} {$ENDIF}
@ -1758,7 +1755,7 @@ begin
end; end;
end; end;
GetMultipleSelected; GetMultipleSelected;
Draw(TopSelected, ClipRgn); NPDrawLayerObjects(ClipRgn, TopSelected);
{$IFDEF DebugLR} {$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MUp DONE: Splitting'); DebugLnExit('TfrDesignerPage.MUp DONE: Splitting');
{$ENDIF} {$ENDIF}
@ -1768,7 +1765,7 @@ begin
//resizing several objects //resizing several objects
if Moved and MRFlag and (Cursor <> crDefault) then if Moved and MRFlag and (Cursor <> crDefault) then
begin begin
Draw(TopSelected, ClipRgn); NPDrawLayerObjects(ClipRgn, TopSelected);
{$IFDEF DebugLR} {$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MUp DONE: resizing several objects'); DebugLnExit('TfrDesignerPage.MUp DONE: resizing several objects');
{$ENDIF} {$ENDIF}
@ -1778,7 +1775,7 @@ begin
//redrawing all moved or resized objects //redrawing all moved or resized objects
if not Moved then if not Moved then
begin begin
DrawPage(dmSelection); NPDrawSelection;
{$IFDEF DebugLR} {$IFDEF DebugLR}
DebugLn('redrawing all moved or resized objects'); DebugLn('redrawing all moved or resized objects');
{$ENDIF} {$ENDIF}
@ -1789,7 +1786,7 @@ begin
if SelNum > 1 then if SelNum > 1 then
begin begin
//JRA DebugLn('HERE, ClipRgn', Dbgs(ClipRgn)); //JRA DebugLn('HERE, ClipRgn', Dbgs(ClipRgn));
Draw(TopSelected, ClipRgn); NPDrawLayerObjects(ClipRgn, TopSelected);
GetMultipleSelected; GetMultipleSelected;
FDesigner.ShowPosition; FDesigner.ShowPosition;
end end
@ -1799,7 +1796,7 @@ begin
NormalizeCoord(t); NormalizeCoord(t);
if Cursor <> crDefault then if Cursor <> crDefault then
t.Resized; t.Resized;
Draw(TopSelected, ClipRgn); NPDrawLayerObjects(ClipRgn, TopSelected);
FDesigner.ShowPosition; FDesigner.ShowPosition;
end; end;
end; end;
@ -2104,8 +2101,8 @@ begin
DrawPage(dmShape) DrawPage(dmShape)
else else
begin begin
Draw(10000, hr); NPDrawLayerObjects(hr);
Draw(10000, hr1); NPDrawLayerObjects(hr1);
end; end;
Inc(LastX, kx); Inc(LastX, kx);
@ -2265,7 +2262,7 @@ begin
Hr2:=t.GetClipRgn(rtExtended); Hr2:=t.GetClipRgn(rtExtended);
CombineRgn(hr1, hr, hr2, RGN_OR); CombineRgn(hr1, hr, hr2, RGN_OR);
DeleteObject(Hr2); DeleteObject(Hr2);
Draw(10000, hr1); NPDrawLayerObjects(hr1);
DeleteObject(Hr); DeleteObject(Hr);
{$IFDEF DebugLR} {$IFDEF DebugLR}
DebugLn('MDown resizing 2'); DebugLn('MDown resizing 2');
@ -2341,7 +2338,8 @@ begin
begin begin
CombineRgn(hr, hr, hr1, RGN_OR); CombineRgn(hr, hr, hr1, RGN_OR);
DeleteObject(hr1); DeleteObject(hr1);
Draw(10000, hr);
NPDrawLayerObjects(hr);
end; end;
{$IFDEF LCLQt}Invalidate;{$endif} {$IFDEF LCLQt}Invalidate;{$endif}
{$IFDEF LCLCarbon}Invalidate;{$endif} {$IFDEF LCLCarbon}Invalidate;{$endif}
@ -2357,6 +2355,44 @@ begin
DrawFocusRect(OldRect); DrawFocusRect(OldRect);
end; end;
procedure TfrDesignerPage.NPDrawLayerObjects(Rgn: HRGN; Start:Integer=10000);
begin
// here one just have to invalidate Rgn and objects will be drawn normally
// NOTE: this case, one needs to delete Rgn
Draw(Start, Rgn);
end;
procedure TfrDesignerPage.NPDrawSelection;
begin
DrawPage(dmSelection);
end;
procedure TfrDesignerPage.NPPaintSelection;
begin
DrawPage(dmSelection);
end;
procedure TfrDesignerPage.NPEraseSelection;
begin
DrawPage(dmSelection);
end;
procedure TfrDesignerPage.NPRedrawViewCheckBand(t: TfrView);
begin
if t.Typ = gtBand then
begin
{$IFDEF DebugLR}
DebugLn('A new band was inserted');
{$ENDIF}
Draw(10000, t.GetClipRgn(rtExtended))
end
else
begin
t.Draw(Canvas);
DrawSelection(t);
end;
end;
procedure TfrDesignerPage.CMMouseLeave(var Message: TLMessage); procedure TfrDesignerPage.CMMouseLeave(var Message: TLMessage);
begin begin
if (Mode = mdInsert) and not Down then if (Mode = mdInsert) and not Down then
@ -3272,7 +3308,7 @@ end;
procedure TfrDesignerForm.RedrawPage; procedure TfrDesignerForm.RedrawPage;
begin begin
PageView.Draw(10000, 0); PageView.NPDrawLayerObjects(0);
end; end;
procedure TfrDesignerForm.OnModify(sender: TObject); procedure TfrDesignerForm.OnModify(sender: TObject);
@ -3439,11 +3475,11 @@ begin
t := TfrView(Objects[TopSelected]); t := TfrView(Objects[TopSelected]);
if not (ssAlt in Shift) then if not (ssAlt in Shift) then
begin begin
PageView.DrawPage(dmSelection); PageView.NPEraseSelection;
Unselect; Unselect;
SelNum := 1; SelNum := 1;
t1.Selected := True; t1.Selected := True;
PageView.DrawPage(dmSelection); PageView.NPDrawSelection;
end end
else else
begin begin
@ -3468,7 +3504,7 @@ end;
procedure TfrDesignerForm.MoveObjects(dx, dy: Integer; aResize: Boolean); procedure TfrDesignerForm.MoveObjects(dx, dy: Integer; aResize: Boolean);
begin begin
AddUndoAction(acEdit); AddUndoAction(acEdit);
PageView.DrawPage(dmSelection); PageView.NPEraseSelection;
PageView.MoveResize(Dx,Dy, false, aResize); PageView.MoveResize(Dx,Dy, false, aResize);
ShowPosition; ShowPosition;
PageView.GetMultipleSelected; PageView.GetMultipleSelected;
@ -3490,7 +3526,7 @@ var
begin begin
AddUndoAction(acDelete); AddUndoAction(acDelete);
GetRegion; // JRA 3 GetRegion; // JRA 3
PageView.DrawPage(dmSelection); PageView.NPEraseSelection;
for i := Objects.Count - 1 downto 0 do for i := Objects.Count - 1 downto 0 do
begin begin
t := TfrView(Objects[i]); t := TfrView(Objects[i]);
@ -3883,10 +3919,10 @@ begin
View := TfrView(TMenuItem(Sender).Tag); View := TfrView(TMenuItem(Sender).Tag);
if Objects.IndexOf(View)>=0 then if Objects.IndexOf(View)>=0 then
begin begin
PageView.DrawPage(dmSelection); PageView.NPEraseSelection;
SelectSameClass(View); SelectSameClass(View);
PageView.GetMultipleSelected; PageView.GetMultipleSelected;
PageView.DrawPage(dmSelection); PageView.NPDrawSelection;
SelectionChanged; SelectionChanged;
end; end;
end; end;
@ -3960,7 +3996,7 @@ begin
AddUndoAction(acEdit); AddUndoAction(acEdit);
if WithRedraw then begin if WithRedraw then begin
PageView.DrawPage(dmSelection); PageView.NPEraseSelection;
GetRegion; GetRegion;
end; end;
@ -3971,7 +4007,7 @@ begin
end; end;
if WithRedraw then if WithRedraw then
PageView.Draw(TopSelected, ClipRgn); PageView.NPDrawLayerObjects(ClipRgn, TopSelected);
end; end;
// data=0 remove all borders // data=0 remove all borders
@ -4239,7 +4275,7 @@ begin
if Busy then if Busy then
Exit; Exit;
AddUndoAction(acEdit); AddUndoAction(acEdit);
PageView.DrawPage(dmSelection); PageView.NPEraseSelection;
GetRegion; GetRegion;
b:=(Sender as TControl).Tag; b:=(Sender as TControl).Tag;
@ -4377,7 +4413,7 @@ begin
end; end;
end; end;
PageView.Draw(TopSelected, ClipRgn); PageView.NPDrawLayerObjects(ClipRgn, TopSelected);
ActiveControl := nil; ActiveControl := nil;
if b in [20, 21] then if b in [20, 21] then
@ -4768,8 +4804,8 @@ begin
View := TfrView(Objects[TopSelected]); View := TfrView(Objects[TopSelected]);
if ShowEditor = mrOk then if ShowEditor = mrOk then
begin begin
PageView.DrawPage(dmSelection); PageView.NPDrawSelection;
PageView.Draw(TopSelected, View.GetClipRgn(rtExtended)); PageView.NPDrawLayerObjects(View.GetClipRgn(rtExtended), TopSelected);
end; end;
end; end;
ActiveControl := nil; ActiveControl := nil;
@ -4794,16 +4830,16 @@ begin
if ShowModal = mrOk then if ShowModal = mrOk then
begin begin
AddUndoAction(acEdit); AddUndoAction(acEdit);
PageView.DrawPage(dmSelection);
(t as TfrPictureView).Picture.Assign(Image1.Picture); (t as TfrPictureView).Picture.Assign(Image1.Picture);
PageView.Draw(TopSelected, t.GetClipRgn(rtExtended)); PageView.NPDrawSelection;
PageView.NPDrawLayerObjects(t.GetClipRgn(rtExtended), TopSelected);
end; end;
end; end;
frGEditorForm.Free; frGEditorForm.Free;
end end
else if t.Typ = gtBand then else if t.Typ = gtBand then
begin begin
PageView.DrawPage(dmSelection); PageView.NPEraseSelection;
bt := (t as TfrBandView).BandType; bt := (t as TfrBandView).BandType;
if bt in [btMasterData, btDetailData, btSubDetailData] then if bt in [btMasterData, btDetailData, btSubDetailData] then
begin begin
@ -4825,7 +4861,7 @@ begin
end end
else else
PageView.DFlag := False; PageView.DFlag := False;
PageView.Draw(TopSelected, t.GetClipRgn(rtExtended)); PageView.NPDrawLayerObjects(t.GetClipRgn(rtExtended), TopSelected);
end end
else if t.Typ = gtSubReport then else if t.Typ = gtSubReport then
CurPage := (t as TfrSubReportView).SubPage CurPage := (t as TfrSubReportView).SubPage
@ -4836,9 +4872,9 @@ begin
begin begin
if frAddIns[i].EditorForm <> nil then if frAddIns[i].EditorForm <> nil then
begin begin
PageView.DrawPage(dmSelection); PageView.NPEraseSelection;
frAddIns[i].EditorForm.ShowEditor(t); frAddIns[i].EditorForm.ShowEditor(t);
PageView.Draw(TopSelected, t.GetClipRgn(rtExtended)); PageView.NPDrawLayerObjects(t.GetClipRgn(rtExtended), TopSelected);
end end
else else
ShowMemoEditor; ShowMemoEditor;
@ -5088,8 +5124,8 @@ end;
procedure TfrDesignerForm.AfterChange; procedure TfrDesignerForm.AfterChange;
begin begin
PageView.DrawPage(dmSelection); PageView.NPDrawSelection;
PageView.Draw(TopSelected, 0); PageView.NPDrawLayerObjects(0, TopSelected);
ObjInspRefresh; ObjInspRefresh;
end; end;
@ -5241,10 +5277,10 @@ end;
procedure TfrDesignerForm.SelAllBClick(Sender: TObject); // select all procedure TfrDesignerForm.SelAllBClick(Sender: TObject); // select all
begin begin
PageView.DrawPage(dmSelection); PageView.NPEraseSelection;
SelectAll; SelectAll;
PageView.GetMultipleSelected; PageView.GetMultipleSelected;
PageView.DrawPage(dmSelection); PageView.NPDrawSelection;
SelectionChanged; SelectionChanged;
end; end;