designer: start drawing and selection of inlined non-visual components (todo: control selection)

git-svn-id: trunk@22795 -
This commit is contained in:
paul 2009-11-26 10:39:57 +00:00
parent bea12e9550
commit c1fdc5e879

View File

@ -254,7 +254,7 @@ type
var Handled: boolean);
function NonVisualComponentLeftTop(AComponent: TComponent): TPoint;
function NonVisualComponentAtPos(x,y: integer): TComponent;
function NonVisualComponentAtPos(X, Y: integer): TComponent;
procedure MoveNonVisualComponentIntoForm(AComponent: TComponent);
procedure MoveNonVisualComponentsIntoForm;
function WinControlAtPos(x,y: integer; UseRootAsDefault,
@ -1327,6 +1327,16 @@ function TDesigner.NonVisualComponentLeftTop(AComponent: TComponent): TPoint;
begin
Result.X := LeftFromDesignInfo(AComponent.DesignInfo);
Result.Y := TopFromDesignInfo(AComponent.DesignInfo);
// convert to owner coords
while AComponent.Owner <> FLookupRoot do
begin
AComponent := AComponent.Owner;
if AComponent is TControl then
begin
inc(Result.X, TControl(AComponent).Left);
inc(Result.Y, TControl(AComponent).Top);
end;
end;
end;
procedure TDesigner.InvalidateWithParent(AComponent: TComponent);
@ -2876,19 +2886,16 @@ end;
procedure TDesigner.DrawNonVisualComponents(aDDC: TDesignerDeviceContext);
var
AComponent: TComponent;
Icon, Surface: TBitmap;
i, ItemLeft, ItemTop, ItemRight, ItemBottom: integer;
Surface: TBitmap;
procedure DrawComponent(AComponent: TComponent);
var
Icon: TBitmap;
ItemLeft, ItemTop, ItemRight, ItemBottom: integer;
Diff, ItemLeftTop: TPoint;
IconRect, TextRect: TRect;
TextSize: TSize;
IsSelected: Boolean;
begin
Surface := nil;
for i := 0 to FLookupRoot.ComponentCount - 1 do
begin
AComponent := FLookupRoot.Components[i];
if ComponentIsIcon(AComponent) then
begin
Diff := aDDC.FormOrigin;
//DebugLn(['aDDC.FormOrigin - ', Diff.X, ' : ' ,Diff.Y]);
@ -2899,7 +2906,7 @@ begin
ItemRight := ItemLeft + NonVisualCompWidth;
ItemBottom := ItemTop + NonVisualCompWidth;
if not aDDC.RectVisible(ItemLeft, ItemTop, ItemRight, ItemBottom) then
Continue;
Exit;
IsSelected := ControlSelection.IsSelected(AComponent);
aDDC.Save;
@ -2962,7 +2969,26 @@ begin
ItemLeft, ItemTop, NonVisualCompWidth, NonVisualCompWidth);
aDDC.Restore;
end;
procedure TraverseComponents(ALookupRoot: TComponent);
var
i: integer;
AComponent: TComponent;
begin
for i := 0 to ALookupRoot.ComponentCount - 1 do
begin
AComponent := ALookupRoot.Components[i];
if csInline in AComponent.ComponentState then
TraverseComponents(AComponent)
else
if ComponentIsIcon(AComponent) then
DrawComponent(AComponent);
end;
end;
begin
Surface := nil;
TraverseComponents(FLookupRoot);
if Surface <> nil then
Surface.Free;
end;
@ -3104,29 +3130,59 @@ begin
end;
end;
function TDesigner.NonVisualComponentAtPos(x,y: integer): TComponent;
var i: integer;
function TDesigner.NonVisualComponentAtPos(X, Y: integer): TComponent;
function TraverseComponents(ALookupRoot: TComponent): TComponent;
var
i: integer;
LeftTop: TPoint;
begin
for i:=FLookupRoot.ComponentCount-1 downto 0 do begin
Result:=FLookupRoot.Components[i];
if ComponentIsIcon(Result) then begin
with Result do begin
for i := ALookupRoot.ComponentCount - 1 downto 0 do
begin
Result := ALookupRoot.Components[i];
if csInline in Result.ComponentState then
begin
Result := TraverseComponents(Result);
if Result <> nil then
Exit;
end
else
if ComponentIsIcon(Result) then
begin
with Result do
begin
LeftTop := NonVisualComponentLeftTop(Result);
if (LeftTop.x<=x) and (LeftTop.y<=y)
and (LeftTop.x+NonVisualCompWidth>x)
and (LeftTop.y+NonVisualCompWidth>y) then
exit;
if (LeftTop.x <= x) and (LeftTop.y <= y) and
(LeftTop.x + NonVisualCompWidth > x) and
(LeftTop.y + NonVisualCompWidth > y) then
Exit;
end;
end;
end;
Result := nil;
end;
procedure TDesigner.MoveNonVisualComponentIntoForm(AComponent: TComponent);
begin
with NonVisualComponentLeftTop(AComponent) do
AComponent.DesignInfo := LeftTopToDesignInfo(x, y);
Result := TraverseComponents(FLookupRoot);
end;
procedure TDesigner.MoveNonVisualComponentIntoForm(AComponent: TComponent);
var
P: TPoint;
Tmp: TComponent;
begin
P := NonVisualComponentLeftTop(AComponent);
Tmp := AComponent;
while Tmp.Owner <> FLookupRoot do
begin
Tmp := Tmp.Owner;
if Tmp is TControl then
begin
dec(P.X, TControl(Tmp).Left);
dec(P.Y, TControl(Tmp).Top);
end;
end;
AComponent.DesignInfo := LeftTopToDesignInfo(P.X, P.Y);
end;
procedure TDesigner.MoveNonVisualComponentsIntoForm;