Starts implementing TUntabbedNotebook

git-svn-id: trunk@27092 -
This commit is contained in:
sekelsenmat 2010-08-14 06:27:40 +00:00
parent 995a8157de
commit 58756ec370
4 changed files with 363 additions and 3 deletions

1
.gitattributes vendored
View File

@ -4602,6 +4602,7 @@ lcl/include/toolbutton.inc svneol=native#text/pascal
lcl/include/toolwindow.inc svneol=native#text/pascal
lcl/include/trackbar.inc svneol=native#text/pascal
lcl/include/treeview.inc svneol=native#text/pascal
lcl/include/untabbednotebook.inc svneol=native#text/plain
lcl/include/winapi.inc svneol=native#text/pascal
lcl/include/winapih.inc svneol=native#text/pascal
lcl/include/wincontrol.inc svneol=native#text/pascal

View File

@ -262,7 +262,23 @@ type
function Notebook: TCustomNotebook; virtual;
end;
{ TUntabbedNotebookComponentEditor
The default component editor for TUntabbedNotebook. }
TUntabbedNotebookComponentEditor = class(TDefaultComponentEditor)
protected
procedure AddNewPageToDesigner(Index: integer); virtual;
procedure DoAddPage; virtual;
procedure DoDeletePage; virtual;
procedure AddMenuItemsForPages(ParentMenuItem: TMenuItem); virtual;
procedure ShowPageMenuItemClick(Sender: TObject);
public
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
procedure PrepareItem(Index: Integer; const AnItem: TMenuItem); override;
function UNotebook: TUntabbedNotebook; virtual;
end;
{ TPageComponentEditor
The default component editor for TCustomPage. }
TPageComponentEditor = class(TNotebookComponentEditor)
@ -815,6 +831,117 @@ begin
Result:=TCustomNotebook(GetComponent);
end;
{ TUntabbedNotebookComponentEditor }
const
unbvAddPage = 0;
unbvDeletePage = 1;
unbvShowPage = 2;
procedure TUntabbedNotebookComponentEditor.AddNewPageToDesigner(Index: integer
);
var
Hook: TPropertyEditorHook;
NewPage: TUNBPage;
NewName: string;
begin
Hook:=nil;
if not GetHook(Hook) then exit;
NewPage:=UNoteBook.Page[Index];
NewName:=GetDesigner.CreateUniqueComponentName(NewPage.ClassName);
NewPage.Caption:=NewName;
NewPage.Name:=NewName;
UNoteBook.PageIndex:=Index;
Hook.PersistentAdded(NewPage,true);
Modified;
end;
procedure TUntabbedNotebookComponentEditor.DoAddPage;
begin
if not HasHook then exit;
UNoteBook.Pages.Add('');
AddNewPageToDesigner(UNoteBook.Pages.Count-1);
end;
procedure TUntabbedNotebookComponentEditor.DoDeletePage;
var
Hook: TPropertyEditorHook;
OldIndex: integer;
PageComponent: TPersistent;
begin
OldIndex := UNotebook.PageIndex;
if (OldIndex>=0) and (OldIndex<UNotebook.Pages.Count) then
begin
if not GetHook(Hook) then exit;
PageComponent := TPersistent(UNoteBook.Pages.Objects[OldIndex]);
Hook.DeletePersistent(PageComponent);
end;
end;
procedure TUntabbedNotebookComponentEditor.AddMenuItemsForPages(
ParentMenuItem: TMenuItem);
var
i: integer;
NewMenuItem: TMenuItem;
begin
ParentMenuItem.Enabled:=UNoteBook.Pages.Count>0;
for i:=0 to UNoteBook.Pages.Count-1 do
begin
NewMenuItem:=TMenuItem.Create(ParentMenuItem);
NewMenuItem.Name:='ShowPage'+IntToStr(i);
NewMenuItem.Caption:=UNotebook.Page[i].Name+' "'+UNotebook.Pages[i]+'"';
NewMenuItem.OnClick:=@ShowPageMenuItemClick;
ParentMenuItem.Add(NewMenuItem);
end;
end;
procedure TUntabbedNotebookComponentEditor.ShowPageMenuItemClick(Sender: TObject
);
begin
end;
procedure TUntabbedNotebookComponentEditor.ExecuteVerb(Index: Integer);
begin
case Index of
unbvAddPage: DoAddPage;
unbvDeletePage: DoDeletePage; // beware: this can free the editor itself
end;
end;
function TUntabbedNotebookComponentEditor.GetVerb(Index: Integer): string;
begin
// Here we reuse the strings from TNotebook, since they are indeed the same ones
case Index of
unbvAddPage: Result:=nbcesAddPage;
unbvDeletePage: Result:=nbcesDeletePage;
unbvShowPage: Result:=nbcesShowPage;
else
Result:='';
end;
end;
function TUntabbedNotebookComponentEditor.GetVerbCount: Integer;
begin
Result := 3;
end;
procedure TUntabbedNotebookComponentEditor.PrepareItem(Index: Integer;
const AnItem: TMenuItem);
begin
inherited PrepareItem(Index, AnItem);
case Index of
unbvAddPage: ;
unbvDeletePage: AnItem.Enabled:=UNotebook.PageIndex>=0;
unbvShowPage: AddMenuItemsForPages(AnItem);
end;
end;
function TUntabbedNotebookComponentEditor.UNotebook: TUntabbedNotebook;
begin
Result:=TUntabbedNotebook(GetComponent);
end;
{ TPageComponentEditor }
function TPageComponentEditor.Notebook: TCustomNotebook;
@ -1282,6 +1409,7 @@ end;
initialization
RegisterComponentEditorProc := @DefaultRegisterComponentEditorProc;
RegisterComponentEditor(TCustomNotebook, TNotebookComponentEditor);
RegisterComponentEditor(TUntabbedNotebook, TUntabbedNotebookComponentEditor);
RegisterComponentEditor(TCustomPage, TPageComponentEditor);
RegisterComponentEditor(TCustomTabControl, TTabControlComponentEditor);
RegisterComponentEditor(TStringGrid, TStringGridComponentEditor);

View File

@ -319,6 +319,68 @@ type
property TabStop;
end;
{ TUNBPages }
TUntabbedNotebook = class;
TUNBPages = class(TStrings)
private
FPageList: TListWithEvent;
FUNotebook: TUntabbedNotebook;
procedure PageListChange(Ptr: Pointer; AnAction: TListNotification);
protected
function GetObject(Index: Integer): TObject; override;
public
constructor Create(thePageList: TListWithEvent;
theUNotebook: TUntabbedNotebook);
procedure Clear; override;
procedure Delete(Index: Integer); override;
procedure Insert(Index: Integer; const S: String); override;
end;
{ TUNBPage }
TUNBPage = class(TCustomControl)
public
end;
{ TUntabbedNotebook }
TUntabbedNotebook = class(TCustomControl)
private
FPages: TStrings; // TUNBPages
FPageIndex: Integer;
FPageList: TListWithEvent;
{ function GetActivePage: String;
function GetActivePageComponent: TCustomPage;}
function GetPage(AIndex: Integer): TUNBPage;
// function GetPageCount : integer;
function GetPageIndex: Integer;
{ function FindVisiblePage(Index: Integer): Integer;}
procedure InsertPage(APage: TUNBPage; Index: Integer);
{ procedure MovePage(APage: TCustomPage; NewIndex: Integer);
procedure RemovePage(Index: Integer);
procedure SetActivePage(const Value: String);}
procedure SetPageIndex(AValue: Integer);
{ procedure ShowCurrentPage;}
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
{ function TabIndexAtClientPos(ClientPos: TPoint): integer;
function TabRect(AIndex: Integer): TRect;
function GetImageIndex(ThePageIndex: Integer): Integer; virtual;
function IndexOf(APage: TCustomPage): integer;
function CustomPage(Index: integer): TCustomPage;}
public
property Page[Index: Integer]: TUNBPage read GetPage;
// property PageCount: integer read GetPageCount;
// property PageList: TList read FPageList;
published
// property TabStop default true;
property PageIndex: Integer read GetPageIndex write SetPageIndex default -1;
property Pages: TStrings read FPages;
// property ActivePage: String read GetActivePage write SetActivePage;
end;
{ Timer }
@ -1250,15 +1312,16 @@ procedure Register;
begin
RegisterComponents('Standard',[TRadioGroup,TCheckGroup,TPanel]);
RegisterComponents('Additional',[TImage,TShape,TBevel,TPaintBox,TNotebook,
TLabeledEdit,TSplitter,TTrayIcon]);
TUntabbedNotebook, TLabeledEdit, TSplitter, TTrayIcon]);
RegisterComponents('System',[TTimer,TIdleTimer]);
RegisterNoIcon([TPage]);
RegisterNoIcon([TPage, TUNBPage]);
end;
{$I custompage.inc}
{$I page.inc}
{$I customnotebook.inc}
{$I notebook.inc}
{$I untabbednotebook.inc}
{$I timer.inc}
{$I idletimer.inc}
{$I shape.inc}

View File

@ -0,0 +1,168 @@
{%MainUnit ../extctrls.pp}
{******************************************************************************
TUntabbedNotebook
******************************************************************************
*****************************************************************************
* *
* This file is part of the Lazarus Component Library (LCL) *
* *
* See the file COPYING.modifiedLGPL.txt, included in this distribution, *
* for details about the copyright. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* *
*****************************************************************************
}
{******************************************************************************
TUNBPages
******************************************************************************}
{------------------------------------------------------------------------------
TUNBPages Constructor
------------------------------------------------------------------------------}
constructor TUNBPages.Create(thePageList: TListWithEvent;
theUNotebook: TUntabbedNotebook);
begin
inherited Create;
fPageList := thePageList;
fPageList.OnChange:=@PageListChange;
fUNotebook := theUNotebook;
end;
{------------------------------------------------------------------------------
procedure TUNBPages.PageListChange(Ptr: Pointer; AnAction: TListNotification);
------------------------------------------------------------------------------}
procedure TUNBPages.PageListChange(Ptr: Pointer; AnAction: TListNotification);
{var
APage: TCustomPage;}
begin
{ if (AnAction=lnAdded) then begin
APage:=TObject(Ptr) as TCustomPage;
if not (pfInserting in APage.FFlags) then
APage.Parent:=fNotebook;
end;}
end;
{------------------------------------------------------------------------------
TUNBPages GetObject
------------------------------------------------------------------------------}
function TUNBPages.GetObject(Index: Integer): TObject;
begin
{ if (Index<0) or (Index>=fPageList.Count) then
RaiseGDBException('TNBPages.GetObject Index out of bounds');
Result := TCustomPage(fPageList[Index]);}
end;
{------------------------------------------------------------------------------
TUNBPages Clear
------------------------------------------------------------------------------}
procedure TUNBPages.Clear;
begin
{ while fPageList.Count>0 do
Delete(fPageList.Count-1);}
end;
{------------------------------------------------------------------------------
TUNBPages Delete
------------------------------------------------------------------------------}
procedure TUNBPages.Delete(Index: Integer);
var
APage: TCustomPage;
begin
// Make sure Index is in the range of valid pages to delete
if (Index < 0) or (Index >= fPageList.Count) then Exit;
APage := TCustomPage(fPageList[Index]);
// delete handle
APage.Parent := nil;
// free the page
Application.ReleaseComponent(APage);
end;
{------------------------------------------------------------------------------
TUNBPages Insert
------------------------------------------------------------------------------}
procedure TUNBPages.Insert(Index: Integer; const S: String);
var
NewPage: TUNBPage;
NewOwner: TComponent;
begin
NewOwner := FUNotebook.Owner;
if NewOwner = nil then
NewOwner := FUNotebook;
NewPage := TUNBPage.Create(NewOwner);
NewPage.Caption := S;
FUNoteBook.InsertPage(NewPage,Index);
end;
{******************************************************************************
TUntabbedNotebook
******************************************************************************}
function TUntabbedNotebook.GetPage(AIndex: Integer): TUNBPage;
begin
if (AIndex < 0) or (AIndex >= FPageList.Count) then
RaiseGDBException('TUntabbedNotebook.GetCustomPage Index out of bounds');
Result := TUNBPage(FPageList.Items[AIndex]);
end;
function TUntabbedNotebook.GetPageIndex: Integer;
begin
Result := FPageIndex;
end;
procedure TUntabbedNotebook.InsertPage(APage: TUNBPage; Index: Integer);
begin
if FPageList.IndexOf(APage) >= 0 then Exit;
FPageList.Insert(Index, APage);
APage.Parent := Self;
APage.Align := alClient;
if PageIndex = -1 then SetPageIndex(Index);
end;
procedure TUntabbedNotebook.SetPageIndex(AValue: Integer);
begin
if (AValue < -1) or (AValue >= Pages.Count) then Exit;
if FPageIndex = AValue then exit;
// Hide the previously shown page
if (FPageIndex >= 0) and (FPageIndex < Pages.Count) then
Page[FPageIndex].Visible := False;
// Update the property
FPageIndex := AValue;
// And show the new one
Page[FPageIndex].Visible := False;
end;
{------------------------------------------------------------------------------
TUntabbedNotebook Constructor
------------------------------------------------------------------------------}
constructor TUntabbedNotebook.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
FPageList := TListWithEvent.Create;
FPageIndex := -1;
FPages := TUNBPages.Create(FPageList, Self);
ControlStyle := []; // do not add csAcceptsControls
TabStop := true;
end;
destructor TUntabbedNotebook.Destroy;
begin
FPageList.Free;
inherited Destroy;
end;