mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-08 02:38:03 +02:00
212 lines
5.3 KiB
PHP
212 lines
5.3 KiB
PHP
{%MainUnit ../comctrls.pp}
|
|
|
|
{******************************************************************************
|
|
TPageControl
|
|
******************************************************************************
|
|
|
|
Author: Mattias Gaertner
|
|
|
|
*****************************************************************************
|
|
This file is part of the Lazarus Component Library (LCL)
|
|
|
|
See the file COPYING.modifiedLGPL.txt, included in this distribution,
|
|
for details about the license.
|
|
*****************************************************************************
|
|
|
|
}
|
|
|
|
{ TPageControl }
|
|
|
|
function TPageControl.GetActivePageIndex: Integer;
|
|
begin
|
|
Result:=inherited PageIndex;
|
|
end;
|
|
|
|
function TPageControl.GetActiveTabSheet: TTabSheet;
|
|
begin
|
|
Result:=TTabSheet(inherited ActivePageComponent);
|
|
end;
|
|
|
|
function TPageControl.GetTabSheet(Index: Integer): TTabSheet;
|
|
begin
|
|
Result:=TTabSheet(inherited Page[Index]);
|
|
end;
|
|
|
|
procedure TPageControl.SetActivePageIndex(const AValue: Integer);
|
|
begin
|
|
inherited PageIndex:=AValue;
|
|
end;
|
|
|
|
procedure TPageControl.SetActiveTabSheet(const AValue: TTabSheet);
|
|
begin
|
|
//debugln(['TPageControl.SetActiveTabSheet ',DbgSName(Self),' ',DbgSName(AValue)]);
|
|
ActivePageComponent := AValue;
|
|
end;
|
|
|
|
function TPageControl.FindPageWithDockClient(Client: TControl): TTabSheet;
|
|
var
|
|
i: integer;
|
|
begin
|
|
for i := 0 to PageCount - 1 do
|
|
if Pages[i] = Client.Parent then
|
|
begin
|
|
Result := Pages[i];
|
|
exit;
|
|
end;
|
|
Result := nil;
|
|
end;
|
|
|
|
class procedure TPageControl.WSRegisterClass;
|
|
begin
|
|
inherited WSRegisterClass;
|
|
RegisterPageControl;
|
|
RegisterPropertyToSkip(TPageControl, 'PageIndex', 'Needed when converting from VCL TabbedNotebook to TPageControl', '');
|
|
RegisterPropertyToSkip(TPageControl, 'TabFont', 'Needed when converting from VCL TabbedNotebook to TPageControl', '');
|
|
end;
|
|
|
|
function TPageControl.GetPageClass: TCustomPageClass;
|
|
begin
|
|
Result := TTabSheet;
|
|
end;
|
|
|
|
procedure TPageControl.DoAddDockClient(Client: TControl; const ARect: TRect);
|
|
var
|
|
TabSheet: TTabSheet;
|
|
begin
|
|
// Client cannot be added to TPageControl itself but new TabSheet should be
|
|
// added and client placed onto it
|
|
TabSheet := TTabSheet.Create(Self);
|
|
TabSheet.Caption := GetDockCaption(Client);
|
|
try
|
|
TabSheet.PageControl := Self;
|
|
Client.Parent := TabSheet;
|
|
// delphi compatible behaviour => align to client
|
|
Client.Align := alClient;
|
|
except
|
|
FreeAndNil(TabSheet);
|
|
end;
|
|
end;
|
|
|
|
procedure TPageControl.DockOver(Source: TDragDockObject; X, Y: Integer;
|
|
State: TDragState; var Accept: Boolean);
|
|
var
|
|
P: TPoint;
|
|
begin
|
|
P := Parent.ClientToScreen(Point(Left, Top));
|
|
Source.DockRect := Rect(P.X, P.Y, P.X + Width, P.Y + Height);
|
|
DoDockOver(Source, X, Y, State, Accept);
|
|
end;
|
|
|
|
procedure TPageControl.DoRemoveDockClient(Client: TControl);
|
|
begin
|
|
// we cannot search for client page here since Client.Parent
|
|
// is changed at moment => search for page before parent change and free here
|
|
FreeAndNil(FPageToUndock);
|
|
end;
|
|
|
|
function TPageControl.DoUndockClientMsg(NewTarget, Client: TControl): boolean;
|
|
begin
|
|
FPageToUndock := FindPageWithDockClient(Client);
|
|
Result := inherited DoUndockClientMsg(NewTarget, Client);
|
|
end;
|
|
|
|
function TPageControl.ChildClassAllowed(ChildClass: TClass): boolean;
|
|
begin
|
|
Result:=(ChildClass<>nil) and (ChildClass.InheritsFrom(GetPageClass));
|
|
if Widgetset.GetLCLCapability(lcAllowChildControlsInNativeControls) = LCL_CAPABILITY_YES then Result := True;
|
|
end;
|
|
|
|
procedure TPageControl.UpdateDockCaption(Exclude: TControl = nil);
|
|
var
|
|
i:integer;
|
|
begin
|
|
for i:=0 to Self.PageCount-1 do
|
|
with Pages[i] do
|
|
if ControlCount>0 then
|
|
Caption:=Controls[0].Caption;
|
|
end;
|
|
|
|
function TPageControl.FindNextPage(CurPage: TTabSheet; GoForward,
|
|
CheckTabVisible: Boolean): TTabSheet;
|
|
var
|
|
I, StartIndex: Integer;
|
|
begin
|
|
Result := nil;
|
|
if PageCount = 0 then
|
|
exit;
|
|
StartIndex := IndexOf(CurPage);
|
|
if StartIndex < 0 then
|
|
if GoForward then
|
|
StartIndex := PageCount - 1
|
|
else
|
|
StartIndex := 0;
|
|
i := StartIndex;
|
|
repeat
|
|
if GoForward then
|
|
begin
|
|
Inc(i);
|
|
if i = PageCount then
|
|
i := 0;
|
|
end else
|
|
begin
|
|
if i = 0 then
|
|
i := PageCount;
|
|
Dec(I);
|
|
end;
|
|
if not CheckTabVisible or Pages[i].TabVisible then
|
|
begin
|
|
Result := Pages[i];
|
|
exit;
|
|
end;
|
|
until i = StartIndex;
|
|
end;
|
|
|
|
procedure TPageControl.SelectNextPage(GoForward: Boolean);
|
|
begin
|
|
SelectNextPage(GoForward,true);
|
|
end;
|
|
|
|
procedure TPageControl.SelectNextPage(GoForward: Boolean;
|
|
CheckTabVisible: Boolean);
|
|
var
|
|
NextPage: TTabSheet;
|
|
begin
|
|
NextPage:=FindNextPage(ActivePage,GoForward,CheckTabVisible);
|
|
if NextPage<>nil then ActivePage:=NextPage;
|
|
end;
|
|
|
|
function TPageControl.IndexOfTabAt(X, Y: Integer): Integer;
|
|
begin
|
|
Result:=inherited IndexOfTabAt(X, Y);
|
|
end;
|
|
|
|
function TPageControl.IndexOfTabAt(P: TPoint): Integer;
|
|
begin
|
|
Result:=inherited IndexOfTabAt(P);
|
|
end;
|
|
|
|
function TPageControl.IndexOfPageAt(X, Y: Integer): Integer;
|
|
begin
|
|
Result:=inherited IndexOfPageAt(X, Y);
|
|
end;
|
|
|
|
function TPageControl.IndexOfPageAt(P: TPoint): Integer;
|
|
begin
|
|
Result:=inherited IndexOfPageAt(P);
|
|
end;
|
|
|
|
// Convenience routine, to make the TPageControl more intuitive to use
|
|
// A Lazarus addition
|
|
function TPageControl.AddTabSheet: TTabSheet;
|
|
begin
|
|
Result := GetPageClass.Create(Self) as TTabSheet;
|
|
Result.PageControl := Self;
|
|
end;
|
|
|
|
procedure TPageControl.Clear;
|
|
begin
|
|
Tabs.Clear;
|
|
end;
|
|
|
|
// included by comctrls.pp
|