mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-07-22 01:05:58 +02:00
LazReport, previous step for proper drawing in designer: isolating selection and object draws
git-svn-id: trunk@40540 -
This commit is contained in:
parent
afb022bcb4
commit
17eb1a44d9
@ -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,18 +1649,7 @@ 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
|
||||||
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user