jvcllaz: Add TJvPageList, contribution by Michal Gawrycki. Add JvTabBarDemp_PageList example.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7413 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2020-04-28 20:39:01 +00:00
parent 977021871d
commit e8f5f157ab
13 changed files with 2787 additions and 363 deletions

View File

@ -16,7 +16,7 @@ implementation
uses uses
ImgList, ImgList,
PropEdits, ComponentEditors, PropEdits, ComponentEditors,
JvDsgnConsts, JvDsgnConsts, JvPageList,
JvNavigationPane, JvNavPaneEditors, JvNavigationPane, JvNavPaneEditors,
JvTabBar, JvTabBarXPPainter, JvTabBar, JvTabBarXPPainter,
JvNotebookPageList, JvNotebookPageList,
@ -26,6 +26,7 @@ uses
procedure Register; procedure Register;
const const
cImageIndex = 'ImageIndex'; cImageIndex = 'ImageIndex';
cActivePage = 'ActivePage';
begin begin
// JvNavigationPanel // JvNavigationPanel
RegisterComponents(RsPaletteJvclVisual, [ // was: RsPaletteNavPane RegisterComponents(RsPaletteJvclVisual, [ // was: RsPaletteNavPane
@ -47,20 +48,18 @@ begin
// JvPageList // JvPageList
RegisterComponents(RsPaletteJvclVisual, [ // was: RsPaletteListComboTree RegisterComponents(RsPaletteJvclVisual, [ // was: RsPaletteListComboTree
//TJvPageList, TJvPageList,
TJvNotebookPageList]); TJvNotebookPageList]);
{
RegisterClasses([TJvPageList, TJvStandardPage]); RegisterClasses([TJvPageList, TJvStandardPage]);
RegisterComponentEditor(TJvCustomPageList, TJvCustomPageListEditor); // was: TJvCustomPageEditor RegisterNoIcon([TJvStandardPage]);
RegisterComponentEditor(TJvCustomPageList, TJvCustomPageEditor); // was: TJvCustomPageEditor
RegisterComponentEditor(TJvCustomPage, TJvCustomPageEditor); RegisterComponentEditor(TJvCustomPage, TJvCustomPageEditor);
RegisterPropertyEditor(TypeInfo(TJvShowDesignCaption), nil, '', RegisterPropertyEditor(TypeInfo(TJvShowDesignCaption), nil, '',
TJvShowDesignCaptionProperty);# TJvShowDesignCaptionProperty);
}
{
RegisterPropertyEditor(TypeInfo(TJvCustomPage), RegisterPropertyEditor(TypeInfo(TJvCustomPage),
TJvCustomPageList, cActivePage, TJvActivePageProperty); TJvCustomPageList, cActivePage, TJvActivePageProperty);
}
// JvPageTree // JvPageTree
RegisterComponents(RsPaletteJvclVisual, [ // was: TsPaletteListComboTree RegisterComponents(RsPaletteJvclVisual, [ // was: TsPaletteListComboTree

View File

@ -0,0 +1,160 @@
object frmJvTreeViewLinksEditor: TfrmJvTreeViewLinksEditor
Left = 294
Top = 184
ClientWidth = 464
ClientHeight = 231
ActiveControl = tvItems
BorderIcons = [biSystemMenu]
Caption = 'JvTreeViewLinks Editor'
OldCreateOrder = False
PopupMenu = popTree
OnResize = FormResize
PixelsPerInch = 96
TextHeight = 13
object Bevel1: TBevel
Left = 0
Top = 191
Width = 464
Height = 42
Align = alBottom
Shape = bsTopLine
end
object Splitter1: TSplitter
Left = 163
Top = 0
Width = 3
Height = 191
Cursor = crHSplit
AutoSnap = False
end
object Splitter2: TSplitter
Left = 268
Top = 0
Width = 3
Height = 191
Cursor = crHSplit
AutoSnap = False
end
object pnlLeft: TPanel
Left = 0
Top = 0
Width = 163
Height = 191
Align = alLeft
BevelOuter = bvNone
BorderWidth = 4
TabOrder = 0
object Label1: TLabel
Left = 4
Top = 4
Width = 155
Height = 16
Align = alTop
AutoSize = False
Caption = '&Nodes:'
FocusControl = tvItems
Layout = tlCenter
end
object tvItems: TTreeView
Left = 4
Top = 20
Width = 155
Height = 167
Align = alClient
ChangeDelay = 60
HideSelection = False
Indent = 19
PopupMenu = popTree
ReadOnly = True
ShowButtons = False
ShowLines = False
TabOrder = 0
ToolTips = False
OnChange = tvItemsChange
end
end
object btnOK: TButton
Left = 285
Top = 199
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = '&OK'
ModalResult = 1
TabOrder = 3
end
object btnCancel: TButton
Left = 373
Top = 199
Width = 75
Height = 25
Anchors = [akRight, akBottom]
Caption = '&Cancel'
ModalResult = 2
TabOrder = 4
end
object pnlMid: TPanel
Left = 166
Top = 0
Width = 102
Height = 191
Align = alLeft
BevelOuter = bvNone
TabOrder = 1
object btnLink: TButton
Left = 5
Top = 24
Width = 91
Height = 25
Action = acLink
Anchors = [akTop]
TabOrder = 0
TabStop = False
end
end
object pnlRight: TPanel
Left = 271
Top = 0
Width = 193
Height = 191
Align = alClient
BevelOuter = bvNone
BorderWidth = 4
Caption = 'pnlRight'
TabOrder = 2
object Label2: TLabel
Left = 4
Top = 4
Width = 185
Height = 17
Align = alTop
AutoSize = False
Caption = '&Pages:'
FocusControl = lbPages
Layout = tlCenter
end
object lbPages: TListBox
Left = 4
Top = 21
Width = 185
Height = 166
Align = alClient
ItemHeight = 13
TabOrder = 0
end
end
object acMain: TActionList
OnUpdate = acMainUpdate
Left = 168
Top = 64
object acLink: TAction
Caption = '<- Create &Link ->'
ShortCut = 16397
OnExecute = acLinkExecute
end
end
object popTree: TPopupMenu
Left = 58
Top = 72
end
end

View File

@ -0,0 +1,287 @@
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvPageLinkEditorForm.PAS, released on 2003-01-01.
The Initial Developer of the Original Code is Peter Th�rnqvist [peter3 at sourceforge dot net] .
Portions created by Peter Th�rnqvist are Copyright (C) 2003 Peter Th�rnqvist.
All Rights Reserved.
Contributor(s):
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.delphi-jedi.org
Known Issues:
Changes:
2002-10-22:
changed the way a parent/child PageIndex is assigned so that it matches the
actual component using this editor
$Id$
-----------------------------------------------------------------------------}
// $Id$
unit JvPageLinkEditorForm;
{$I jvcl.inc}
interface
uses
Classes, SysUtils, Windows, Forms, Controls, StdCtrls, ExtCtrls, ComCtrls,
ActnList, Menus,
Variants,
DesignEditors, DesignIntf,
JvPageList, JvPageListTreeView, JvComponent;
type
{ a property editor for the PageLinks property of TJvCustomPageListTreeView}
TJvPageLinksProperty = class(TClassProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure Edit; override;
end;
TfrmJvTreeViewLinksEditor = class(TJvForm)
tvItems: TTreeView;
btnLink: TButton;
lbPages: TListBox;
acMain: TActionList;
acLink: TAction;
Label1: TLabel;
Label2: TLabel;
btnOK: TButton;
btnCancel: TButton;
Bevel1: TBevel;
pnlLeft: TPanel;
pnlMid: TPanel;
pnlRight: TPanel;
popTree: TPopupMenu;
Splitter1: TSplitter;
Splitter2: TSplitter;
procedure tvItemsChange(Sender: TObject; Node: TTreeNode);
procedure acLinkExecute(Sender: TObject);
procedure acMainUpdate(Action: TBasicAction;
var Handled: Boolean);
procedure FormResize(Sender: TObject);
private
FTreeView:TCustomTreeView;
function CreatePopUpItem(Index: Integer): TMenuItem;
procedure DoPopClick(Sender: TObject);
procedure AssignComponents(TreeView: TCustomTreeView; const PageList: IPageList);
procedure AssignToComponents(TreeView: TCustomTreeView; const PageList: IPageList);
public
class function Edit(TreeView: TCustomTreeView; const PageList: IPageList): Boolean;
end;
function ShowPageLinkEditor(TreeView: TJvCustomPageListTreeView): Boolean;
implementation
uses
JvDsgnConsts;
{$R *.dfm}
type
THackTreeView = class(TJvCustomPageListTreeView);
function ShowPageLinkEditor(TreeView: TJvCustomPageListTreeView): Boolean;
begin
Result := TfrmJvTreeViewLinksEditor.Edit(TreeView, TreeView.PageList);
if Result and (THackTreeView(TreeView).Items.Count > 0) then
THackTreeView(TreeView).Items.GetFirstNode.Expand(False);
end;
//=== { TJvPageLinksProperty } ===============================================
procedure TJvPageLinksProperty.Edit;
begin
if ShowPageLinkEditor(GetComponent(0) as TJvCustomPageListTreeView) then
Modified;
end;
function TJvPageLinksProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
//=== { TfrmJvTreeViewLinksEditor } ==========================================
function GetStrippedText(const AText: string): string;
var
I: Integer;
begin
Result := AText;
for I := Length(AText) downto 1 do
if AText[I] = '(' then
begin
Result := Copy(AText, 1, I - 2);
Break;
end;
end;
function GetNewTreeText(const AText: string; Index: Integer): string;
begin
Result := Format('%s (%d)', [GetStrippedText(AText), Index])
end;
procedure TfrmJvTreeViewLinksEditor.DoPopClick(Sender: TObject);
begin
with Sender as TMenuItem do
begin
lbPages.ItemIndex := Tag;
if acLink.Enabled then
acLink.Execute;
end;
end;
function TfrmJvTreeViewLinksEditor.CreatePopUpItem(Index: Integer): TMenuItem;
begin
Result := TMenuItem.Create(popTree);
Result.Caption := Format(RsCreateLinkToPaged, [Index]);
Result.Tag := Index;
if Index < 10 then
Result.ShortCut := ShortCut(Ord('0') + Index, [ssCtrl])
else
if (Index >= 10) and (Index < 36) then
Result.ShortCut := ShortCut(Ord('A') + Index - 10, [ssCtrl]);
Result.OnClick := DoPopClick;
end;
procedure TfrmJvTreeViewLinksEditor.AssignComponents(TreeView: TCustomTreeView;
const PageList: IPageList);
var
N1: TJvPageIndexNode;
N2: TTreeNode;
I: Integer;
begin
tvItems.Items.Clear;
FTreeView := TreeView;
if TreeView <> nil then
begin
tvItems.Items.Assign(THackTreeView(TreeView).Items);
tvItems.ShowButtons := True; // THackTreeView(TreeView).ShowButtons;
end;
if TreeView is TJvCustomPageListTreeView then
begin
N1 := THackTreeView(TreeView).Items.GetFirstNode as TJvPageIndexNode;
N2 := tvItems.Items.GetFirstNode;
while Assigned(N1) and Assigned(N2) do
begin
N2.Data := Pointer(N1.PageIndex);
N2.Text := Format('%s (%d)', [N1.Text, N1.PageIndex]);
N1 := TJvPageIndexNode(N1.GetNext);
N2 := N2.GetNext;
end;
end;
lbPages.Items.Clear;
popTree.Items.Clear;
if PageList <> nil then
for I := 0 to PageList.GetPageCount - 1 do
begin
lbPages.Items.Add(Format('%s (%d)', [PageList.GetPageCaption(I), I]));
popTree.Items.Add(CreatePopUpItem(I));
end;
if tvItems.Items.Count > 0 then
begin
tvItems.Items[0].Selected := True;
tvItems.Items[0].Expand(False);
end;
end;
procedure TfrmJvTreeViewLinksEditor.AssignToComponents(TreeView: TCustomTreeView;
const PageList: IPageList);
var
N1: TJvPageIndexNode;
N2: TTreeNode;
begin
if TreeView <> nil then
THackTreeView(TreeView).Items.Assign(tvItems.Items);
if TreeView is TJvCustomPageListTreeView then
begin
N1 := THackTreeView(TreeView).Items.GetFirstNode as TJvPageIndexNode;
N2 := tvItems.Items.GetFirstNode;
while Assigned(N1) and Assigned(N2) do
begin
N1.PageIndex := Integer(N2.Data);
N1.Text := GetStrippedText(N2.Text);
N1 := TJvPageIndexNode(N1.GetNext);
N2 := N2.GetNext;
end;
end;
end;
procedure TfrmJvTreeViewLinksEditor.tvItemsChange(Sender: TObject;
Node: TTreeNode);
begin
if Node <> nil then
if Node is TJvPageIndexNode then
lbPages.ItemIndex := TJvPageIndexNode(Node).PageIndex
else
lbPages.ItemIndex := Integer(Node.Data);
end;
procedure TfrmJvTreeViewLinksEditor.acLinkExecute(Sender: TObject);
var
N: TTreeNode;
begin
N := tvItems.Selected;
N.Data := Pointer(lbPages.ItemIndex);
if FTreeView is TJvCustomSettingsTreeView then
begin
// make the editor behave like the component
if (N.Parent <> nil) and (N.Parent.GetFirstChild = N) then
begin
N.Parent.Data := Pointer(lbPages.ItemIndex);
N.Parent.Text := GetNewTreeText(N.Parent.Text, lbPages.ItemIndex);
end
else
if N.HasChildren then
begin
N.GetFirstChild.Data := Pointer(lbPages.ItemIndex);
N.GetFirstChild.Text := GetNewTreeText(N.GetFirstChild.Text, lbPages.ItemIndex);
end;
end;
if N is TJvPageIndexNode then
TJvPageIndexNode(N).PageIndex := lbPages.ItemIndex;
N.Text := GetNewTreeText(N.Text, lbPages.ItemIndex);
end;
procedure TfrmJvTreeViewLinksEditor.acMainUpdate(Action: TBasicAction;
var Handled: Boolean);
begin
acLink.Enabled := (tvItems.Selected <> nil) and (lbPages.ItemIndex > -1);
end;
procedure TfrmJvTreeViewLinksEditor.FormResize(Sender: TObject);
begin
pnlLeft.Width := (ClientWidth - pnlMid.Width) div 2;
end;
class function TfrmJvTreeViewLinksEditor.Edit(TreeView: TCustomTreeView;
const PageList: IPageList): Boolean;
begin
// keep in mind that Self is a class here not an object
with Self.Create(Application) do
try
AssignComponents(TreeView, PageList);
Result := ShowModal = mrOk;
if Result then
AssignToComponents(TreeView, PageList);
finally
Free;
end;
end;
end.

View File

@ -0,0 +1,148 @@
object frmPageListEditor: TfrmPageListEditor
Left = 446
Height = 342
Top = 114
Width = 233
Caption = 'PageList Editor'
ClientHeight = 342
ClientWidth = 233
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
LCLVersion = '2.1.0.0'
object ToolBar1: TToolBar
Left = 0
Height = 23
Top = 0
Width = 233
AutoSize = True
ButtonHeight = 23
ButtonWidth = 23
Caption = 'ToolBar1'
EdgeInner = esNone
EdgeOuter = esNone
Images = ilButtons
ParentShowHint = False
ShowHint = True
TabOrder = 0
object btnAdd: TToolButton
Left = 1
Hint = 'Add page'
Top = 0
Action = acAdd
end
object btnDelete: TToolButton
Left = 24
Hint = 'Delete page'
Top = 0
Action = acDelete
end
object ToolButton1: TToolButton
Left = 47
Height = 23
Top = 0
Caption = 'ToolButton1'
ImageIndex = 3
Style = tbsSeparator
end
object tbMoveUp: TToolButton
Left = 55
Top = 0
Action = acMoveUp
end
object tbMoveDown: TToolButton
Left = 78
Top = 0
Action = acMoveDown
end
end
object lbPages: TListBox
Left = 0
Height = 296
Top = 23
Width = 233
Align = alClient
ItemHeight = 0
OnClick = lbPagesClick
OnKeyPress = lbPagesKeyPress
PopupMenu = popEditor
TabOrder = 1
end
object StatusBar1: TStatusBar
Left = 0
Height = 23
Top = 319
Width = 233
Panels = <>
end
object alEditor: TActionList
Images = ilButtons
OnUpdate = alEditorUpdate
Left = 86
Top = 34
object acAdd: TAction
Caption = 'Add'
Hint = 'Add Welcome page'
ImageIndex = 0
OnExecute = acAddExecute
ShortCut = 45
end
object acDelete: TAction
Caption = 'Delete'
Hint = 'Delete selected page(s)'
ImageIndex = 1
OnExecute = acDeleteExecute
OnUpdate = acDeleteUpdate
ShortCut = 46
end
object acMoveUp: TAction
Caption = 'Move Up'
Hint = 'Move Up'
ImageIndex = 2
OnExecute = acMoveUpExecute
ShortCut = 16422
end
object acMoveDown: TAction
Caption = 'Move Down'
Hint = 'Move Down'
ImageIndex = 3
OnExecute = acMoveDownExecute
ShortCut = 16424
end
end
object ilButtons: TImageList
Left = 20
Top = 30
Bitmap = {
4C7A040000001000000010000000FE0000000000000078DAED558B0E833008E4
E3FB6DFE56679DD42BC5963E96749B24448DDC1D6041A2CB9C733E18B518C407
7CF65C31C4A0BEE4B270C8AB31FD04E3CF7BF41076E384718C65CEE275C7737F
102B73A11B0EC6C75A85367294F4F9DE2BBA167D6EA3A55EE988AFF58C35B66D
53F1167DC67A257F933EC465FA1D8EF321CF9CD569590BB9F5E6D88295B16DBA
EFB8D42B339FCCBFC6D133FF3207CB79546B3EDE1938707F0036EE0172C55D76
E99F2E62E2BBEAFC3B3F32FFF15B3DF3FF8B3652DFDE9F744E5BB1EC8D1C09B6
9143C51A39C4D9CA70D9DEFA50FD4BE03B6A7E6CADB91FF97EDF787E67CCEFC8
FE98B1BF66F56F747FCFF87FFC85BD007F143BD9
}
end
object popEditor: TPopupMenu
Images = ilButtons
Left = 54
Top = 120
object Add1: TMenuItem
Action = acAdd
end
object Delete1: TMenuItem
Action = acDelete
end
object N1: TMenuItem
Caption = '-'
end
object MoveUp1: TMenuItem
Action = acMoveUp
end
object MoveDown1: TMenuItem
Action = acMoveDown
end
end
end

View File

@ -0,0 +1,374 @@
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvPageListEditorForm.PAS, released on 2004-03-28.
The Initial Developer of the Original Code is Peter Thornqvist <peter3 at sourceforge dot net>
Portions created by Peter Thornqvist are Copyright (C) 2004 Peter Thornqvist.
All Rights Reserved.
Contributor(s):
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.delphi-jedi.org
Known Issues:
-----------------------------------------------------------------------------}
// $Id$
unit JvPageListEditorForm;
{$mode objfpc}{$H+}
interface
uses
SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ActnList, ImgList, ComCtrls, StdCtrls, ToolWin, Menus,
PropEdits, PropEditUtils, ComponentEditors,
JvPageList, JvPageListEditors, IDEWindowIntf;
type
{ TfrmPageListEditor }
TfrmPageListEditor = class(TForm)
ToolBar1: TToolBar;
btnAdd: TToolButton;
btnDelete: TToolButton;
ToolButton1: TToolButton;
tbMoveUp: TToolButton;
tbMoveDown: TToolButton;
lbPages: TListBox;
alEditor: TActionList;
acAdd: TAction;
acDelete: TAction;
acMoveUp: TAction;
acMoveDown: TAction;
ilButtons: TImageList;
StatusBar1: TStatusBar;
popEditor: TPopupMenu;
Add1: TMenuItem;
Delete1: TMenuItem;
N1: TMenuItem;
MoveUp1: TMenuItem;
MoveDown1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure acAddExecute(Sender: TObject);
procedure acDeleteExecute(Sender: TObject);
procedure acMoveUpExecute(Sender: TObject);
procedure acMoveDownExecute(Sender: TObject);
procedure FormClose(Sender: TObject; var AAction: TCloseAction);
procedure acDeleteUpdate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure lbPagesClick(Sender: TObject);
procedure alEditorUpdate(AAction: TBasicAction; var Handled: Boolean);
procedure lbPagesKeyPress(Sender: TObject; var Key: Char);
private
FPageList: TJvCustomPageList;
FIgnoreEvents: Boolean;
FEditor: TJvCustomPageEditor;
procedure SetPageList(const Value: TJvCustomPageList);
procedure UpdateList(ItemIndex: Integer);
procedure SelectPage(const Index: Integer);
//procedure Add(Page: TJvCustomPage);
function FindPage(APage: TJvCustomPage; out AIndex: Integer): Boolean;
procedure OnComponentRenamed(AComponent: TComponent);
procedure OnPersistentDeleting(APersistent: TPersistent);
procedure OnPersistentAdded(APersistent: TPersistent; Select: boolean);
public
property PageList:TJvCustomPageList read FPageList write SetPageList;
end;
procedure ShowPageListEditor(Editor: TJvCustomPageEditor; APageList: TJvCustomPageList);
implementation
uses
JvDsgnConsts;
{$R *.lfm}
procedure ShowPageListEditor(Editor: TJvCustomPageEditor; APageList: TJvCustomPageList);
var
frmPageListEditor: TfrmPageListEditor = nil;
begin
// Show the editor
frmPageListEditor := FindEditorForm(Editor.GetComponent) as TfrmPageListEditor;
if not Assigned(frmPageListEditor) then
frmPageListEditor := TfrmPageListEditor.Create(Application);
try
frmPageListEditor.FEditor := Editor;
frmPageListEditor.PageList := APageList;
frmPageListEditor.Caption := Format(RsFmtCaption,[APageList.Name]);
RegisterEditorForm(frmPageListEditor, Editor.GetComponent);
except
frmPageListEditor.Free;
raise;
end;
frmPageListEditor.EnsureVisible;
end;
type
TJvCustomPageAccess = class(TJvCustomPage);
procedure TfrmPageListEditor.acAddExecute(Sender: TObject);
//var
//APage: TJvCustomPage;
//Hook: TPropertyEditorHook;
begin
//if not FEditor.GetHook(Hook) then
// Exit;
//APage := PageList.GetPageClass.Create(PageList.Owner);
//try
// APage.Name := FEditor.GetDesigner.CreateUniqueComponentName(APage.ClassName);
// Add(APage);
// Hook.PersistentAdded(APage, True);
// FEditor.Modified;
//except
// APage.Free;
// raise;
//end;
if FEditor.GetPageControl <> nil then
FEditor.InsertPage;
end;
procedure TfrmPageListEditor.acDeleteExecute(Sender: TObject);
//var
// I: Integer;
// Hook: TPropertyEditorHook;
begin
//if Assigned(PageList.ActivePage) and FEditor.GetHook(Hook) then
//begin
// I := lbPages.ItemIndex;
// if lbPages.ItemIndex >= 0 then
// lbPages.Items.Delete(TJvCustomPageAccess(PageList.ActivePage).PageIndex);
// if GlobalDesignHook <> nil then
// GlobalDesignHook.SelectOnlyThis(PageList);
// PageList.ActivePage.Free;
// Hook.PersistentDeleted;
// if I >= lbPages.Items.Count then
// Dec(I);
// if (I >= 0) and (I < lbPages.Items.Count) then
// begin
// lbPages.ItemIndex := I;
// SelectPage(I);
// end
// else
// FEditor.Modified;
//end;
if (FEditor.GetPageControl <> nil) then
FEditor.RemovePage;
end;
procedure TfrmPageListEditor.acMoveUpExecute(Sender: TObject);
var
I: Integer;
begin
I := lbPages.ItemIndex;
lbPages.Items.Move(I, I-1);
if Assigned(PageList) then
begin
TJvCustomPageAccess(PageList.Pages[I]).PageIndex := I - 1;
lbPages.ItemIndex := I - 1;
end;
end;
procedure TfrmPageListEditor.acMoveDownExecute(Sender: TObject);
var
I: Integer;
begin
I := lbPages.ItemIndex;
lbPages.Items.Move(I, I+1);
if Assigned(PageList) then
begin
TJvCustomPageAccess(PageList.Pages[I]).PageIndex := I + 1;
lbPages.ItemIndex := I + 1;
end;
end;
procedure TfrmPageListEditor.SetPageList(const Value: TJvCustomPageList);
begin
if FPageList <> Value then
begin
FPageList := Value;
UpdateList(0);
end;
end;
//procedure TfrmPageListEditor.Add(Page: TJvCustomPage);
//var
// Hook: TPropertyEditorHook;
//begin
// if not FEditor.GetHook(Hook) then
// Exit;
// Page.Parent := PageList;
// Page.PageList := PageList;
// PageList.ActivePage := Page;
// Hook.PersistentAdded(Page, True);
// GlobalDesignHook.SelectOnlyThis(Page);
// FEditor.Modified;
// lbPages.ItemIndex := lbPages.Items.Add(Page.Name);
//end;
function TfrmPageListEditor.FindPage(APage: TJvCustomPage; out AIndex: Integer
): Boolean;
var
I: Integer;
begin
if Assigned(PageList) and (PageList.PageCount > 0) then
for I := 0 to PageList.PageCount - 1 do
if PageList.Pages[I] = APage then
begin
AIndex := I;
Exit(True);
end;
AIndex := -1;
Result := False;
end;
procedure TfrmPageListEditor.OnComponentRenamed(AComponent: TComponent);
var
I: Integer;
begin
if FIgnoreEvents then Exit;
if (AComponent is TJvCustomPage) and FindPage(TJvCustomPage(AComponent), I) then
UpdateList(I);
end;
procedure TfrmPageListEditor.OnPersistentDeleting(APersistent: TPersistent);
var
I: Integer;
begin
if FIgnoreEvents then Exit;
if (APersistent is TJvCustomPage) then
UpdateList(-1)
else if (APersistent is TJvCustomPageList) and (FEditor.GetPageControl = APersistent) then
Close;
end;
procedure TfrmPageListEditor.OnPersistentAdded(APersistent: TPersistent;
Select: boolean);
var
I: Integer;
begin
if FIgnoreEvents then Exit;
if (APersistent is TJvCustomPage) and FindPage(TJvCustomPage(APersistent), I) then
begin
UpdateList(I);
lbPages.Selected[I] := Select;
end;
end;
procedure TfrmPageListEditor.SelectPage(const Index: Integer);
var
Page: TJvCustomPageAccess;
begin
if Assigned(FPageList) and Active then
begin
FIgnoreEvents := True;
try
Page := nil;
if (Index >= 0) and (Index < FPageList.PageCount) then
Page := TJvCustomPageAccess(FPageList.Pages[Index]);
PageList.ActivePage := Page;
if GlobalDesignHook <> nil then
begin
GlobalDesignHook.SelectOnlyThis(Page);
GlobalDesignHook.Modified(PageList);
end;
finally
FIgnoreEvents := False;
end;
end;
end;
procedure TfrmPageListEditor.UpdateList(ItemIndex: Integer);
var
I: Integer;
begin
if Assigned(FPageList) then
begin
FIgnoreEvents := True;
lbPages.Items.BeginUpdate;
try
lbPages.Items.Clear;
for I := 0 to FPageList.PageCount - 1 do
lbPages.Items.Add(TJvCustomPageAccess(FPageList.Pages[I]).Name);
if (ItemIndex >= 0) and (ItemIndex < lbPages.Items.Count) then
lbPages.ItemIndex := ItemIndex
else
lbPages.ItemIndex := -1;
finally
lbPages.Items.EndUpdate;
FIgnoreEvents := False;
end;
end
else
lbPages.Items.Clear;
end;
procedure TfrmPageListEditor.FormClose(Sender: TObject;
var AAction: TCloseAction);
begin
IDEDialogLayoutList.SaveLayout(Self);
AAction := caFree;
end;
procedure TfrmPageListEditor.acDeleteUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled :=
(lbPages.Items.Count > 0) and (lbPages.ItemIndex >= 0);
end;
procedure TfrmPageListEditor.FormDestroy(Sender: TObject);
begin
if Assigned(GlobalDesignHook) then
GlobalDesignHook.RemoveAllHandlersForObject(Self);
UnregisterEditorForm(Self);
end;
procedure TfrmPageListEditor.lbPagesClick(Sender: TObject);
begin
SelectPage(lbPages.ItemIndex);
end;
procedure TfrmPageListEditor.alEditorUpdate(AAction: TBasicAction;
var Handled: Boolean);
begin
acMoveUp.Enabled := lbPages.ItemIndex > 0;
acMoveDown.Enabled :=
(lbPages.ItemIndex <> -1) and
(lbPages.ItemIndex < lbPages.Items.Count - 1);
end;
procedure TfrmPageListEditor.lbPagesKeyPress(Sender: TObject;
var Key: Char);
begin
if lbPages.ItemIndex <> -1 then
begin
SelectPage(lbPages.ItemIndex);
//ActivateInspector(Key);
Key := #0;
end;
end;
procedure TfrmPageListEditor.FormCreate(Sender: TObject);
begin
IDEDialogLayoutList.ApplyLayout(Self);
if Assigned(GlobalDesignHook) then
begin
GlobalDesignHook.AddHandlerComponentRenamed(@OnComponentRenamed);
GlobalDesignHook.AddHandlerPersistentDeleting(@OnPersistentDeleting);
GlobalDesignHook.AddHandlerPersistentAdded(@OnPersistentAdded);
end;
end;
end.

View File

@ -30,65 +30,38 @@ unit JvPageListEditors;
interface interface
uses uses
SysUtils, Classes, ImgList, Menus, SysUtils, ImgList, Graphics, Classes,
PropEdits, GraphPropEdits, ComponentEditors; PropEdits, ComponentEditors, GraphPropEdits, PropEditUtils,
JvPageList, JvDsgnEditors;
type type
(*
{ a property editor for the ActivePage property of TJvPageList } { a property editor for the ActivePage property of TJvPageList }
TJvActivePageProperty = class(TComponentProperty) TJvActivePageProperty = class(TComponentProperty)
public public
function GetAttributes: TPropertyAttributes; override; function GetAttributes: TPropertyAttributes; override;
procedure GetValues(Proc: TGetStrProc); override; procedure GetValues(Proc: TGetStrProc); override;
end; end;
*)
TJvShowDesignCaptionProperty = class(TEnumProperty) TJvShowDesignCaptionProperty = class(TEnumProperty)
function GetAttributes: TPropertyAttributes; override; function GetAttributes: TPropertyAttributes; override;
end; end;
{ a component editor for the TJvPageList } { a component editor for the TJvPageList }
(********************************** NOT WORKING ***************
// adapted from TUntabbedNotebookComponentEditor)
TJvCustomPageListEditor = 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 PageList: TJvCustomPageList; virtual;
end;
TJvCustomPageEditor = class(TJvCustomPageListEditor)
public
function PageList: TJvCustomPageList; override;
function Page: TJvCustomPage; virtual;
end;
{
TJvCustomPageEditor = class(TComponentEditor) TJvCustomPageEditor = class(TComponentEditor)
private
procedure InsertPage;
procedure PrevPage;
procedure NextPage;
procedure RemovePage;
function GetPageControl: TJvCustomPageList;
public public
function GetVerb(Index: Integer): string; override; function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override; function GetVerbCount: Integer; override;
procedure ExecuteVerb(Index: Integer); override; procedure ExecuteVerb(Index: Integer); override;
procedure Edit; override; procedure Edit; override;
end; }
***********************************************)
TJvSettingsTreeImagesProperty = class(TImageIndexPropertyEditor) function GetPageControl: TJvCustomPageList;
procedure InsertPage;
procedure PrevPage;
procedure NextPage;
procedure RemovePage;
end;
TJvSettingsTreeImagesProperty = class(TImageIndexPropertyEditor{TJvDefaultImageIndexProperty})
protected protected
function GetImageList: TCustomImageList; override; function GetImageList: TCustomImageList; override;
end; end;
@ -97,13 +70,11 @@ implementation
uses uses
TypInfo, TypInfo,
JvPageListTreeView; JvDsgnConsts, JvPageListTreeView, JvPageListEditorForm;
type type
// THackPageList = class(TJvPageList);
THackTreeView = class(TJvCustomPageListTreeView); THackTreeView = class(TJvCustomPageListTreeView);
{
const const
cShowEditor = 0; cShowEditor = 0;
cDash = 1; cDash = 1;
@ -114,157 +85,6 @@ const
cElementCount = 6; cElementCount = 6;
const
unbvAddPage = 0;
unbvDeletePage = 1;
unbvShowPage = 2;
}
{ TJvCustomPageListEditor }
(****************************************** NOT WORKING
{ adapted from TUntabbedNotebookComponentEditor for LCL's Notebook
originally named "TJvCustomPageEditor" }
function TJvCustomPageListEditor.PageList: TJvCustomPageList;
begin
Result := TJvCustomPageList(GetComponent);
end;
procedure TJvCustomPageListEditor.AddNewPageToDesigner(Index: integer);
var
Hook: TPropertyEditorHook;
newPage: TJvCustomPage;
newName: string;
begin
Hook := nil;
if not GetHook(Hook) then exit;
DebugLn('GetHook ' + Hook.ClassName);
newPage := PageList.Pages[Index];
newName := GetDesigner.CreateUniqueComponentName(newPage.ClassName);
newPage.Caption := newName;
newPage.Name := newName;
PageList.ActivePageIndex := Index;
Hook.PersistentAdded(newPage, true);
Modified;
end;
procedure TJvCustomPageListEditor.DoAddPage;
begin
DebugLn('DoAddPage: ENTER');
if not HasHook then exit;
DebugLn('DoAddPage');
THackPageList(PageList).AddPage('');
DebugLn('DoAddPage: PageCount=' + IntToStr(PageList.pageCount));
AddNewPageToDesigner(PageList.PageCount-1);
DebugLn('DoAddPage: EXIT');
end;
procedure TJvCustomPageListEditor.DoDeletePage;
var
Hook: TPropertyEditorHook;
OldIndex: integer;
PageComponent: TPersistent;
begin
OldIndex := PageList.ActivePageIndex;
if (OldIndex >= 0) and (OldIndex < PageList.PageCount) then
begin
if not GetHook(Hook) then exit;
PageComponent := TPersistent(PageList.Pages[OldIndex]);
Hook.DeletePersistent(PageComponent);
end;
end;
procedure TJvCustomPageListEditor.AddMenuItemsForPages(ParentMenuItem: TMenuItem);
var
n: Integer;
i: integer;
NewMenuItem: TMenuItem;
begin
n := PageList.PageCount;
ParentMenuItem.Enabled := n > 0;
for i := 0 to n - 1 do
begin
NewMenuItem := TMenuItem.Create(ParentMenuItem);
NewMenuItem.Name := 'ShowPage' + IntToStr(i);
NewMenuItem.Caption := PageList.Pages[i].Name + ' "' + PageList.Pages[i].Caption + '"';
NewMenuItem.OnClick := @ShowPageMenuItemClick;
ParentMenuItem.Add(NewMenuItem);
end;
end;
procedure TJvCustomPageListEditor.ShowPageMenuItemClick(Sender: TObject);
var
AMenuItem: TMenuItem;
NewPageIndex: integer;
begin
AMenuItem := TMenuItem(Sender);
if (AMenuItem = nil) or (not (AMenuItem is TMenuItem)) then exit;
NewPageIndex := AMenuItem.MenuIndex;
if (NewPageIndex < 0) or (NewPageIndex >= PageList.PageCount) then exit;
PageList.ActivePageIndex := NewPageIndex;
GetDesigner.SelectOnlyThisComponent(PageList.Pages[NewPageIndex]);
end;
procedure TJvCustomPageListEditor.ExecuteVerb(Index: Integer);
begin
case Index of
unbvAddPage : DoAddPage;
unbvDeletePage : DoDeletePage; // beware: this can free the editor itself
end;
end;
function TJvCustomPageListEditor.GetVerb(Index: Integer): string;
begin
case Index of
unbvAddPage : Result := RsNewPage;
unbvDeletePage : Result := RsDelPage;
unbvShowPage : Result := RsShowPage;
else
Result := '';
end;
end;
function TJvCustomPageListEditor.GetVerbCount: Integer;
begin
Result := 3;
end;
procedure TJvCustomPageListEditor.PrepareItem(Index: Integer;
const AnItem: TMenuItem);
begin
inherited PrepareItem(Index, AnItem);
case Index of
unbvAddPage : ;
unbvDeletePage : AnItem.Enabled := PageList.ActivePageIndex >= 0;
unbvShowPage : AddMenuItemsForPages(AnItem);
end;
end;
{ TJvCustomPageEditor }
{ adapted from TUNBPageComponentEditor for LCL's Notebook pages }
function TJvCustomPageEditor.PageList: TJvCustomPageList;
var
lPage: TJvCustomPage;
begin
lPage := Page;
if (lPage.Parent <> nil) and (lPage.Parent is TJvCustomPageList) then
Result := TJvCustomPageList(lPage.Parent)
else
Result := nil;
end;
function TJvCustomPageEditor.Page: TJvCustomPage;
begin
Result := TJvCustomPage(GetComponent);
end;
{
procedure TJvCustomPageEditor.Edit; procedure TJvCustomPageEditor.Edit;
begin begin
ExecuteVerb(cShowEditor); ExecuteVerb(cShowEditor);
@ -274,8 +94,7 @@ procedure TJvCustomPageEditor.ExecuteVerb(Index: Integer);
begin begin
case Index of case Index of
cShowEditor: cShowEditor:
ShowMessage('NOT IMPLEMENTED'); ShowPageListEditor(Self, GetPageControl);
// ShowPageListEditor(Designer, GetPageControl);
cNextPage: cNextPage:
NextPage; NextPage;
cPrevPage: cPrevPage:
@ -289,7 +108,7 @@ end;
function TJvCustomPageEditor.GetPageControl: TJvCustomPageList; function TJvCustomPageEditor.GetPageControl: TJvCustomPageList;
begin begin
if Component is TJvCustomPageList then if GetComponent is TJvCustomPageList then
Result := TJvCustomPageList(Component) Result := TJvCustomPageList(Component)
else else
Result := TJvCustomPageList(TJvCustomPage(Component).PageList); Result := TJvCustomPageList(TJvCustomPage(Component).PageList);
@ -322,14 +141,20 @@ procedure TJvCustomPageEditor.InsertPage;
var var
P: TJvCustomPage; P: TJvCustomPage;
C: TJvCustomPageList; C: TJvCustomPageList;
Hook: TPropertyEditorHook = nil;
begin begin
if not GetHook(Hook) then
Exit;
C := GetPageControl; C := GetPageControl;
P := C.GetPageClass.Create(Designer.LookupRoot); P := C.GetPageClass.Create(C.Owner);
try try
P.Parent := C; P.Parent := C;
P.Name := Designer.UniqueName(C.GetPageClass.ClassName); P.Name := GetDesigner.CreateUniqueComponentName(C.GetPageClass.ClassName);
P.PageList := C; P.PageList := C;
C.ActivePage := P; C.ActivePage := P;
Hook.PersistentAdded(P, True);
GlobalDesignHook.SelectOnlyThis(P);
Modified;
except except
P.Free; P.Free;
raise; raise;
@ -350,24 +175,24 @@ procedure TJvCustomPageEditor.RemovePage;
var var
AList: TJvCustomPageList; AList: TJvCustomPageList;
APage: TJvCustomPage; APage: TJvCustomPage;
APers: TPersistent;
Hook: TPropertyEditorHook;
begin begin
AList := GetPageControl; AList := GetPageControl;
if (AList <> nil) and (AList.ActivePage <> nil) then if (AList <> nil) and (AList.ActivePage <> nil) then
begin begin
APage := AList.ActivePage; APage := AList.ActivePage;
// Designer.SelectComponent(APage);
Designer.SelectOnlyThisComponent(APage);
APage.PageList := nil; APage.PageList := nil;
APage.Free; //APage.Free;
Designer.Modified; //Designer.Modified;
APers := TPersistent(APage);
if GetHook(Hook) then
Hook.DeletePersistent(APers);
end; end;
end; end;
}
*********************************************************)
//=== { TJvActivePageProperty } ============================================== //=== { TJvActivePageProperty } ==============================================
(*
function TJvActivePageProperty.GetAttributes: TPropertyAttributes; function TJvActivePageProperty.GetAttributes: TPropertyAttributes;
begin begin
Result := [paValueList]; Result := [paValueList];
@ -378,16 +203,16 @@ var
I: Integer; I: Integer;
Component: TComponent; Component: TComponent;
begin begin
for I := 0 to Designer.GetRoot.ComponentCount - 1 do if (GlobalDesignHook <> nil) and (GlobalDesignHook.LookupRoot <> nil) and
begin (GlobalDesignHook.LookupRoot is TComponent) then
Component := Designer.GetRoot.Components[I]; for I := 0 to TComponent(GlobalDesignHook.LookupRoot).ComponentCount - 1 do
if (Component.Name <> '') and (Component is TJvCustomPage) and begin
(TJvCustomPage(Component).PageList = GetComponent(0)) then Component := TComponent(GlobalDesignHook.LookupRoot).Components[I];
Proc(Component.Name); if (Component.Name <> '') and (Component is TJvCustomPage) and
end; (TJvCustomPage(Component).PageList = GetComponent(0)) then
Proc(Component.Name);
end;
end; end;
*)
//=== { TJvSettingsTreeImagesProperty } ====================================== //=== { TJvSettingsTreeImagesProperty } ======================================
@ -405,7 +230,6 @@ begin
Result := nil; Result := nil;
end; end;
//=== { TJvShowDesignCaptionProperty } ======================================= //=== { TJvShowDesignCaptionProperty } =======================================
function TJvShowDesignCaptionProperty.GetAttributes: TPropertyAttributes; function TJvShowDesignCaptionProperty.GetAttributes: TPropertyAttributes;

View File

@ -0,0 +1,90 @@
object JvProxyEditor: TJvProxyEditor
Left = 269
Top = 114
ClientWidth = 508
ClientHeight = 295
BorderIcons = [biSystemMenu]
Caption = 'Page Proxy Editor'
Icon.Data = {
0000010001002020100000000000E80200001600000028000000200000004000
0000010004000000000000020000000000000000000000000000000000000000
0000000080000080000000808000800000008000800080800000C0C0C0008080
80000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000F000000000000000000000000000000FF00F0000000000
0000000000000000FFF07F0000000BBBBBBBBBBBBBBBBB0FFFF07F0BBBB00B80
00000000000000FFF8F07F0000B00B8FFEFFFFFFFFF708FF88F07F0770B00B8F
FEFFFFFFFFF0B0F8D8F07F0770B00B8EEEEEEEEEEEE708FD8DF07F0A70B00B8F
FEFFFFFFFFF708F8D8F07F0A70B00B8FFEFFFFFFFFF0B0FD8DF07F0A70B00B8E
EEEEEEEEEEE708F8DFF07F0A70B00B8FFEFFFFFFFFF708FDFFF07F0A70B00B8F
FEFFFFFFFFF0B0FFAFF0CF0A70B00B8EEEEEEEEEEEE708FAAFF0CF0770B00B8F
FEFFFFFFFFF708FAAFF0CF0770B00B8FFEFFFFFFFFF0B0FAAFF0CF0770B00B8E
EEEEEEEEEEE708FAAFF07F0970B00B8FFEFFFFFFFFF708FAFFF07F0970B00B8F
FEFFFFFFFFF0B0FFFFF07F0770B00B8EEEEEEEEEEEE708FFFF087F0770B00B8F
FEFFFFFFFFF708FFF087F00770B00B8FFEFFFFFFFFF0B0FF08700877F0B00B8F
FE777777777708F0800877FFF0B00B8F00000000008708000777FFFFF0B00B88
0FF77778800000000000000000B00BBBB0FF77880BBB0BBBBBBBBBBBBBB00000
000FF780000BBB00000000000000000000FF7778000000000000000000000000
000000000000000000000000000000000000000000000000000000000000FFFF
FEFFFFFFFCFFFFFFF89FFFFFF01F800000010000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000080000001F8063FFFFC0FFFFFFFFFFFFF0100}
OldCreateOrder = True
OnClose = FormClose
OnCreate = FormCreate
OnResize = FormResize
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object BtnPanel: TPanel
Left = 409
Top = 0
Width = 97
Height = 304
Align = alRight
BevelOuter = bvNone
TabOrder = 0
object CloseBtn: TButton
Left = 11
Top = 12
Width = 77
Height = 25
Anchors = [akTop, akRight]
Caption = 'Close'
TabOrder = 0
OnClick = CloseBtnClick
end
object DeleteBtn: TButton
Left = 11
Top = 44
Width = 77
Height = 25
Anchors = [akTop, akRight]
Caption = 'Delete'
TabOrder = 1
OnClick = DeleteBtnClick
end
end
object ProxyGrid: TDrawGrid
Left = 0
Top = 0
Width = 409
Height = 304
Align = alClient
ColCount = 2
Ctl3D = True
DefaultRowHeight = 17
FixedCols = 0
RowCount = 2
Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRowSelect]
ParentCtl3D = False
TabOrder = 1
OnDrawCell = ProxyGridDrawCell
OnKeyDown = ProxyGridKeyDown
OnSelectCell = ProxyGridSelectCell
ColWidths = (
162
175)
end
end

View File

@ -0,0 +1,452 @@
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvPgMngrEd.PAS, released on 2002-07-04.
The Initial Developers of the Original Code are: Fedor Koshevnikov, Igor Pavluk and Serge Korolev
Copyright (c) 1997, 1998 Fedor Koshevnikov, Igor Pavluk and Serge Korolev
Copyright (c) 2001,2002 SGB Software
All Rights Reserved.
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.delphi-jedi.org
Known Issues:
-----------------------------------------------------------------------------}
// $Id$
unit JvPageManagerForm;
{$I jvcl.inc}
interface
uses
SysUtils, Classes, Windows, Graphics, Controls, Forms, Grids, StdCtrls, ExtCtrls,
RTLConsts, DesignIntf, DesignEditors, VCLEditors, DesignWindows,
JvPageManager, JvJVCLUtils, JvComponent;
type
TJvProxyEditor = class(TDesignWindow)
BtnPanel: TPanel;
CloseBtn: TButton;
DeleteBtn: TButton;
ProxyGrid: TDrawGrid;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure ProxyGridDrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);
procedure ProxyGridSelectCell(Sender: TObject; Col, Row: Longint; var CanSelect: Boolean);
procedure CloseBtnClick(Sender: TObject);
procedure DeleteBtnClick(Sender: TObject);
procedure ProxyGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormResize(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FPageManager: TJvPageManager;
FDeleting: Boolean;
procedure SetPageManager(Value: TJvPageManager);
function GetForm: TCustomForm;
procedure UpdateData;
function CheckPageManager: Boolean;
procedure SelectProxy(Proxy: TJvPageProxy);
function ProxyByRow(Row: Integer): TJvPageProxy;
protected
function UniqueName(Component: TComponent): string; override;
procedure Activated; override;
public
procedure NameProxy(Sender: TObject);
procedure ItemsModified(const Designer: IDesigner); override;
procedure DesignerClosed(const ADesigner: IDesigner; AGoingDormant: Boolean); override;
function GetEditState: TEditState; override;
procedure ItemDeleted(const ADesigner: IDesigner; Item: TPersistent); override;
property PageManager: TJvPageManager read FPageManager write SetPageManager;
property OwnerForm: TCustomForm read GetForm;
end;
TJvProxyListProperty = class(TPropertyEditor)
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure Edit; override;
end;
TJvPageManagerEditor = class(TComponentEditor)
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
TJvPageNameProperty = class(TStringProperty)
function GetAttributes: TPropertyAttributes; override;
procedure GetValues(Proc: TGetStrProc); override;
end;
TJvPageBtnProperty = class(TComponentProperty)
procedure GetValues(Proc: TGetStrProc); override;
end;
implementation
uses
Consts, Buttons,
JvDsgnConsts, JvDsgnTypes;
{$R *.dfm}
function FindEditor(Manager: TJvPageManager): TJvProxyEditor;
var
I: Integer;
begin
Result := nil;
for I := 0 to Screen.FormCount - 1 do
if Screen.Forms[I] is TJvProxyEditor then
if TJvProxyEditor(Screen.Forms[I]).PageManager = Manager then
begin
Result := TJvProxyEditor(Screen.Forms[I]);
Break;
end;
end;
procedure ShowProxyEditor(Designer: IJvDesigner; Manager: TJvPageManager);
var
Editor: TJvProxyEditor;
begin
if Manager = nil then
Exit;
Editor := FindEditor(Manager);
if Editor <> nil then
begin
Editor.Show;
if Editor.WindowState = wsMinimized then
Editor.WindowState := wsNormal;
end
else
begin
Editor := TJvProxyEditor.Create(Application);
try
Editor.Designer := IJvFormDesigner(Designer);
Editor.PageManager := Manager;
Editor.Show;
except
Editor.Free;
raise;
end;
end;
end;
//=== { TJvProxyListProperty } ===============================================
function TJvProxyListProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
function TJvProxyListProperty.GetValue: string;
var
List: TList;
begin
List := TList(Pointer(GetOrdValue));
if (List = nil) or (List.Count = 0) then
Result := srNone
else
Result := Format('(%s)', [GetPropType^.Name]);
end;
procedure TJvProxyListProperty.Edit;
begin
ShowProxyEditor(Designer, TJvPageManager(GetComponent(0)));
end;
//=== { TJvPageBtnProperty } =================================================
procedure TJvPageBtnProperty.GetValues(Proc: TGetStrProc);
var
I: Integer;
Component: TComponent;
begin
for I := 0 to Designer.Root.ComponentCount - 1 do
begin
Component := Designer.Root.Components[I];
if (Component.Name <> '') and (Component.InheritsFrom(TButtonControl) or
Component.InheritsFrom(TSpeedButton) or
AnsiSameText(Component.ClassName, 'TJvSpeedButton')) then
Proc(Component.Name);
end;
end;
//=== { TJvPageNameProperty } ================================================
function TJvPageNameProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paValueList];
end;
procedure TJvPageNameProperty.GetValues(Proc: TGetStrProc);
var
PageProxy: TJvPageProxy;
I: Integer;
begin
PageProxy := GetComponent(0) as TJvPageProxy;
if (PageProxy <> nil) and (PageProxy.PageManager <> nil) and
(PageProxy.PageManager.PageOwner <> nil) then
for I := 0 to PageProxy.PageManager.PageCount - 1 do
Proc(PageProxy.PageManager.PageNames[I]);
end;
//=== { TJvPageManagerEditor } ===============================================
procedure TJvPageManagerEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0:
ShowProxyEditor(Designer, TJvPageManager(Component));
end;
end;
function TJvPageManagerEditor.GetVerb(Index: Integer): string;
begin
case Index of
0:
Result := RsProxyEditor;
end;
end;
function TJvPageManagerEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
//=== { TJvProxyEditor } =====================================================
procedure TJvProxyEditor.SetPageManager(Value: TJvPageManager);
begin
if FPageManager <> Value then
begin
if FPageManager <> nil then
FPageManager.OnCheckProxy := nil;
FPageManager := Value;
if FPageManager <> nil then
FPageManager.OnCheckProxy := NameProxy;
UpdateData;
end;
end;
function TJvProxyEditor.UniqueName(Component: TComponent): string;
var
Temp: string;
begin
Result := '';
if (Component <> nil) then
Temp := Component.ClassName
else
Temp := TJvPageProxy.ClassName;
if (UpCase(Temp[1]) = 'T') and (Length(Temp) > 1) then
System.Delete(Temp, 1, 1);
Result := Designer.UniqueName(Temp);
end;
function TJvProxyEditor.GetEditState: TEditState;
begin
Result := [];
end;
procedure TJvProxyEditor.NameProxy(Sender: TObject);
begin
if (Sender is TJvPageProxy) and (TJvPageProxy(Sender).Name = '') then
TJvPageProxy(Sender).Name := UniqueName(TJvPageProxy(Sender));
end;
procedure TJvProxyEditor.DesignerClosed(const ADesigner: IDesigner; AGoingDormant: Boolean);
begin
if ADesigner.Root = OwnerForm then
Free;
end;
procedure TJvProxyEditor.ItemsModified(const Designer: IDesigner);
begin
if not (csDestroying in ComponentState) then
UpdateData;
end;
procedure TJvProxyEditor.Activated;
begin
SelectProxy(ProxyByRow(ProxyGrid.Row - 1));
end;
procedure TJvProxyEditor.ItemDeleted(const ADesigner: IDesigner; Item: TPersistent);
begin
if Item = FPageManager then
begin
FPageManager := nil;
Close;
end;
end;
procedure TJvProxyEditor.UpdateData;
var
ProxyCount: Integer;
begin
if CheckPageManager then
begin
if not FDeleting then
FPageManager.Resync;
ProxyCount := FPageManager.PageProxies.Count;
if ProxyCount = 0 then
begin
ProxyGrid.RowCount := 2;
SelectProxy(nil);
end
else
ProxyGrid.RowCount := 1 + ProxyCount;
DeleteBtn.Enabled := ProxyCount > 0;
ProxyGrid.Invalidate;
end;
end;
function TJvProxyEditor.GetForm: TCustomForm;
begin
Result := TCustomForm(Designer.Root); { GetParentForm(FBar) }
end;
procedure TJvProxyEditor.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
if FPageManager <> nil then
FPageManager.OnCheckProxy := nil;
end;
procedure TJvProxyEditor.FormShow(Sender: TObject);
begin
if FPageManager.PageOwner <> nil then
Caption := Format(RsPageProxies, [FPageManager.PageOwner.Name]);
end;
function TJvProxyEditor.CheckPageManager: Boolean;
begin
Result := (FPageManager <> nil) and (FPageManager.Owner <> nil) and
(Designer.Root <> nil);
end;
type
TDesignerSelectionList = IDesignerSelections;
procedure TJvProxyEditor.SelectProxy(Proxy: TJvPageProxy);
var
FComponents: TDesignerSelectionList;
begin
if CheckPageManager and Active then
begin
FComponents := TDesignerSelections.Create;
if Proxy <> nil then
FComponents.Add(Proxy)
else
FComponents.Add(FPageManager);
SetSelection(FComponents);
end;
end;
function TJvProxyEditor.ProxyByRow(Row: Integer): TJvPageProxy;
begin
Result := nil;
if CheckPageManager and (Row >= 0) and
(Row < FPageManager.PageProxies.Count) then
Result := FPageManager.PageProxies.Items[Row];
end;
procedure TJvProxyEditor.ProxyGridDrawCell(Sender: TObject;
Col, Row: Longint; Rect: TRect; State: TGridDrawState);
var
CellText: string;
Proxy: TJvPageProxy;
begin
CellText := '';
if gdFixed in State then
case Col of
0:
CellText := RsProxyName;
1:
CellText := RsPageName;
end
else
begin
Proxy := ProxyByRow(Row - 1);
if Proxy <> nil then
begin
case Col of
0:
CellText := Proxy.Name;
1:
CellText := Proxy.PageName;
end;
end;
end;
DrawCellText(ProxyGrid, Col, Row, CellText, Rect, taLeftJustify, vaCenterJustify);
end;
procedure TJvProxyEditor.ProxyGridSelectCell(Sender: TObject;
Col, Row: Longint; var CanSelect: Boolean);
begin
SelectProxy(ProxyByRow(Row - 1));
end;
procedure TJvProxyEditor.CloseBtnClick(Sender: TObject);
begin
Close;
end;
procedure TJvProxyEditor.DeleteBtnClick(Sender: TObject);
var
Proxy: TJvPageProxy;
begin
Proxy := ProxyByRow(ProxyGrid.Row - 1);
if Proxy <> nil then
begin
TCustomForm(Designer.Root).Designer.ValidateRename(Proxy, Proxy.Name, '');
FDeleting := True;
try
Proxy.Free;
Designer.Modified;
finally
FDeleting := False;
end;
end;
end;
procedure TJvProxyEditor.ProxyGridKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Shift = [] then
begin
case Key of
VK_RETURN:
if ProxyByRow(ProxyGrid.Row - 1) <> nil then
ActivateInspector(#0);
VK_DELETE:
DeleteBtnClick(nil);
end;
end;
end;
procedure TJvProxyEditor.FormResize(Sender: TObject);
begin
with ProxyGrid do
begin
DefaultColWidth := (ClientWidth - 1) div 2;
ColWidths[1] := ClientWidth - ColWidths[0] - 1;
end;
end;
procedure TJvProxyEditor.FormCreate(Sender: TObject);
begin
if NewStyleControls then
Font.Style := [];
end;
end.

View File

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="JvTabBarDemo_PageList"/>
<Scaled Value="True"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
<Icon Value="0"/>
</General>
<BuildModes Count="1">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages Count="3">
<Item1>
<PackageName Value="LazControls"/>
</Item1>
<Item2>
<PackageName Value="JvPageCompsR"/>
</Item2>
<Item3>
<PackageName Value="LCL"/>
</Item3>
</RequiredPackages>
<Units Count="2">
<Unit0>
<Filename Value="JvTabBarDemo_PageList.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="main.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="MainForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="Main"/>
</Unit1>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="../../bin/$(TargetCPU)-$(TargetOS)/JvTabBarDemo_PageList/JvTabBarDemo_PageList"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,25 @@
program JvTabBarDemo_PageList;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
{$IFDEF HASAMIGA}
athreads,
{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, lazcontrols, Main
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource:=True;
Application.Scaled:=True;
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.

View File

@ -0,0 +1,840 @@
object MainForm: TMainForm
Left = 345
Height = 469
Top = 134
Width = 723
Caption = 'JvTabBar Demo'
ClientHeight = 469
ClientWidth = 723
LCLVersion = '2.1.0.0'
object JvTabBar1: TJvTabBar
Left = 0
Height = 40
Top = 0
Width = 723
AutoSize = False
CloseButton = False
HotTracking = True
PageListTabLink = True
PageList = JvPageList1
Images = ImageList1
Tabs = <
item
Caption = 'Memo'
Selected = True
ImageIndex = 0
end
item
Caption = 'Image'
ImageIndex = 1
end
item
Caption = 'Grid'
ImageIndex = 2
end
item
Caption = 'Shell controls'
ImageIndex = 3
end>
OnTabCloseQuery = JvTabBar1TabCloseQuery
end
object JvPageList1: TJvPageList
Left = 0
Height = 373
Top = 40
Width = 723
ActivePage = JvStandardPage1
PropagateEnable = False
Align = alClient
object JvStandardPage1: TJvStandardPage
Left = 0
Height = 373
Top = 0
Width = 723
Caption = 'Memo'
object Memo1: TMemo
Left = 8
Height = 357
Top = 8
Width = 707
Align = alClient
BorderSpacing.Around = 8
Font.Name = 'Courier New'
Lines.Strings = (
'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.'
)
ParentFont = False
TabOrder = 0
end
end
object JvStandardPage2: TJvStandardPage
Left = 0
Height = 388
Top = 0
Width = 723
Caption = 'Image'
Color = clForm
object Image1: TImage
Left = 8
Height = 372
Top = 8
Width = 707
Align = alClient
BorderSpacing.Around = 8
Picture.Data = {
1754506F727461626C654E6574776F726B47726170686963F03E000089504E47
0D0A1A0A0000000D49484452000001C6000001540806000000BECC9C61000014
BA7A5458745261772070726F66696C6520747970652065786966000078DAC59A
679223371285FFE3147B04B884390E6C846EB0C7DFEF15D93D4E23378AD869A9
D9C3218B40E6CB6750EDCE7F7FBBEE3FFCB158B2CB565BE9A578FEE49E7B1CFC
D0FCEBCFEB31F8FC7C7FFEACF2FE297CFBBCB3FCFE31F298784CAF7F28E7F518
06CFDB9737D4FC7E7E7EFBBCABEBF5436CEF0BBDFFE1E382499F1CB594F722DF
174AF1F57C78FFDDF5F7FB46FE6A3BEFFF537D2EF1F9E2EFFF9E2BC5D8C69329
BA7852489EEFCFA72456905A1A7C0FCF77BD28A4C4CF3EE5E7FB4F6AE73E7FFC
AE78F3BE57F85DEDFC78BF227D5B0AE7CBFB05E5BB1ABD9F0FF6FBB57B2AF4F5
8A82FFECDA37FF507BF878CB0FB5BB77B77BCF6B7723172A55DC7B53E1B584D7
3278E1A494E9795BE1ABF2BFF1737DBE3A5F8D2D2E8ABEE9E6E46BB9D043E4B3
6FC86187116E38CFE30A8B25E67862E531C615D3F35C4B35F6B89EA6647D851B
6BEA693B7A14D3A26B89A7E3E75AC2F3B9FDF9BC151A9FBC03AF8C818B05DEF1
C397FBBD27FFC9D7E785EE1574435031697D7835380A802C439DD3775E4543C2
7DF7CDDEF5E5CB7DB6F5CB1F3536D1417BCADCD8E0E0DACF25A6852FD84A4F9F
13AF339F9D7FC13DD4FDBE0025E2B38DC580EE1C7C09C94209BEC65843A08E8D
FE0C561E538E930E04B3B883BBF426A542735AD467F39E1A9ED74668E6791A6A
A111964AAAB4A6A741B37236F053730343C392656766C5AA35EB364A2AB95829
A51671D4A8A9E66AB5D45A5BED75B4D472B3565A6DADF5367AEC090AB35E7A75
BDF5DEC7E04307971EBC7BF08A31669C69E669B3CC3ADBEC732CE0B3F2B25556
5D6DF53576DC6933FEBBECEA76DB7D8F130E503AF9D829A79E76FA1917ACDD74
F3B55B6EBDEDF63B3EBBF6EEEAB75D0BDF75EE8FBB16DE5D53C7F2F3BAFAA56B
3C5DEBC72582E8C4D4333A1673A0E3551D00D0513DF32DE41CD539F5CCF7C850
58A46BC1D49C1DD4313A984F8876C367EFBE74EE0FFB06F9FFADBEC59F75CEA9
75FF46E79C5AF7EEDC8F7DFB9DAEEDF1284A7A1AA429544D7DBA101B2F386DC4
36A449FFF8D1FDEA05FEF442EC3C957560CB75EACEF16E3A32738B287C28EDF8
9E231D9BA83DC51AD321E69468F1DA712D50E13BC6EEA350B46567B75553E83D
AA84748B8EE6DD6C31F6DE775B7DCFBE4A0DFDB0221F87856C924F2BBC35DFC2
B4E7B6A20D9BC628D9DC2BCFB8D70A69D576D3108DEFC93FE6562F384ADDC5C0
72BDE093CB5D258028305BBAD53BAC8C75D33E5C0AE0DC988171AEFC3766B9DE
568A87EBAE95D9848B05FCEE26049EDB0AD3418D80479EECE1A416B830F5EA5C
2DB1318D5DF776E0B9948EE5DE7CEAC79FE0108DD47C86A95B315B5C22804320
BCAAF93E6205E07527307FF2068FA0310C6BB37A76095132178DCD24079CA36F
ABF1D67B56293B9DC38BE3E59A9541EB9D57C6BC28B8E772473566DEF862E563
AAB6267FE23E7EF8D5C7EF2E547A9EE5F40058C6E607633FB786DA13458E21A6
52E0FCC624321ABBDE3AEEBE3BDD40B1275519E7DA98B3F3FD4EB3BE34EF19B9
EEE30020B8A253990C6941738CEF2C58C9E51BFA21BAABF4DBADD9474A5CAE36
1BDB4AED37CCC1C86AEAEBEE8DF91F500C3EA086D52214290414A8E9F4762823
7DB3735C45BA6698F374419A1DD1E85C76CC60659E029544A17B168316F7CE1D
FCA5E2613A28B514FE79686EBA2B02BFA0001B26DA5D3C1432A0616B5A409C19
B26EDB673E27EEB38775D6C94FE7ECA39E8602FFB6E52E4002E3FEF459D73679
535008D84BC28460060AB84899120E5B3657B153676D0C4F53CDA31FE029CCE4
C664E5D522540E8478158B487BEF9355F012D75999092F892AF5C35E0DD6EC89
7FDBD05D66E3A72446C14DF6277637C40A662FE802AE2CACE3DB980906E09DEC
E706983F6A725B3ED40E6E400FCA2E05C2C50C6707167A663A5213ADF40556BC
1A910E6C9DE7AE91CF1DB90FDF3A68677C7A006A509581777CF3BDBC0C1A81F0
61AAE74A510E23599F0F34D71940C7C63894FACCC0C7D391A1F1BDB150A75EFD
4C3656AB1543E262BA0D52A36C61F9C07714708AAB865694B6051644D7A3D159
4349909F8B3A55A07F29239A14268D74ED069C62EA860CAB594CF3DC93D2AE08
01CDA27D47440C2EC00E8D1E602A5BF0C598C832B37BE4A19A6744F6073DF258
26DA83E96403BD8603F9545804B645C023CC0CDFD4BA2278ADA70011E6A4C04C
157B3C4E86EB17785C054F00E2FF9990B8AF9F9805A35C130D87406B4EB37526
A395D426763DEC01B6FC18E241FA18B33C29738E59BCC125DB6DE285BCEDB82C
CD750BB34DB744078715FAD63C9C0BB0E8C51E4CB8D875EDF2414520B486E260
E281DB873DA87141BB0F625EE215BCFD050C6B55A6A3A26A7BD47362D8275446
80C2703D4CCB041AE3B8827DE87B49368AD051EE844730AF94ACFBC9C3815107
03DF84B42E4B840316D912624139F3753A9C5D77A00D887F663C6FDE3D300E84
1F480171481773858E01DBB1F592298BCCECEDC86211BA2C3E5A03573B291DFA
8275C17E8C35203ADA5A157E6539F245AE57CE288718B874968A84E0D6CFF5C0
FCC251ECDA9BF3770434131B070F79481855DBE3E9252A21E723E12893695978
291B794276D011A8C423015CE215D4E49018B4BFEEDAD7DD584748029ABBE748
EFF7C6B1B57B949C079A6858B21348F8EBDD7CBE0763BEE376D840D8BED77C13
3200B54C71B25FF73049B1D903008F9C473F8B047023C0B806A91A7C87014592
A7EF6E5ADEB9D09EC6E44E84B621E81E2FB1B91EB646E833E03249DF6C52B58D
63D7BC227C4D451660A1BCE4FE9276AC966768505E14555468B20D880F1CD73B
F729391D2E509545FDC985D9C376C385A9D000D815057205F2DD4C29C906A37B
B904FA86EA7B315E641C708F0600F1441A1BBCF2AA51DB30EC141A7AD3C14E0D
73675167E48697F499920C183A928436A61FBB7311FC21FE11D306EC18F6203D
049071D8358E85A1CEDDE99003F772E2982628B55B4D638985C2FF8449D7A0C6
9D3159B8690C5B43A3066958F1926B7B4D61A9C3E1CEFF051351A6832B150E18
827D49836CB3F481C4A07FDBD0D4CD2AD022020C89024B193AC54422F0FF274E
5A478AB8734DDC08E82A06679B04AC5D709690769224B83A395A65F316E91B62
0DDBE013E01760CE6813706AEEBC3DE0D8AC6742FDC66F503531790B91EAE345
79A39050FBE3E9424285FBD23E1874AB21E58E6A642CE9CC793B0C1ADE050D2A
0DF74B3E3AEA13BC52135ED46FE07942EB03FF4CBF1B51182D8F185E06F4A229
EB52ECD88AB367D9B76FA9418202F7D269D3014CD8A49684E1A563AD79E7DC3C
65C0F6A04415A7089EE4C736DD758A3D82B88E3AC8EAB5C5603BEC0C436B5EF0
FF6030E13AF385C44D6224E161CADBBA1898C5BA3B3ECF159A41F6E9D80E70A2
5CA9AE74BE9E11C77081DB0A3C2BD64BFE02678AC859833719BF760C4EC4C410
217AB82C05920B898F61F40A97A15AF861C43615FE5B3A3B4B0F680868B36402
99494BB5D8CBD65B7067B2B82A850C830888CB63707A9F2A73E81049808FEEA9
BD1321A7922825CA38F4A03330C8010B07A92EE2BA114CEA471699D6F8517A82
C6624EB0B350D70A680244C770540C09F498E0A4A8FC80B1623B0D0F99981C8D
8BC7F2CBF44344C8210612C03519193EB0038CD61120DB325E3A1FAC384324A5
8F59C75AD73B16E609C6C8047E6A0B82062A09B7F4142222517BACD07C520694
393CF425FBF4A1D084270CC55ECE4ED8582F54287A4829F8732033127DEF77B3
6969927F78F21935D20C96E8F4C72A95134DB199BE3587C3212B675689C1B40E
7651C01C04CF3A2D05BA8B85C39DA140DD23FE28399700F3F2CF9BEA8C080517
C704925720553C152EA03EA6E0A1F5BF45232448723FAD207C66C6DD5007BCFB
580817316ED3FC7EF12803F6009398F3A163438D3ED9EEFACDA8CF4704DC6482
1916AC081615BBC0FA529A3840E8EF3C22D261EB93A52055E21AF0388807FA07
094C594FF8D396233A40D8155E06BD0582411DA848A5D558ED25B4EB9418F30E
580B4C544DD60713B567907E9265D0C4E2000D1CCE3AD8586343583DC2A64E2E
B727BB86A2C377CC525309F886215ECC80219430D95A7DA2AAB33707820ADE99
8DE8A00E09F55555615508F6C0E8A31F14F46258610735DB764745323E1B8D62
5A4AD857E74711F74624967B27EC646887219D5A4214131A8E50F4DB27B2CB1C
43B7048CDC74C8CAE430899DA921AED705E0B0E0A46CAEFD3E00081429ADED07
5936C01E51A176461D1029D9E29C08641026EC976561B092AE00A9B787895F1E
E9039B217420E361CB88552C36719AB9C73F4D4607E9C774835DC22456CE212D
B2447344E2290A4F814FDF6C8E244B98514283E28476480D5047A80541471A8B
6C696D2A688E0DA59508D0045CA64E343A6116ECE359410EA51B72C5B9CD8770
9B66A8A99C94233124E89A2590DC259005BFB891740A35A4414976005BB4D745
E70892FEC290F9C0FB008B60B1B1ACC024993F3A0323DBF5161D39066B8133A8
3A1C9CF84B5E22B78AA384CA6565712D3A2FD44C91B5A920E190CC8E4F6822D3
26390A0E82DFBAD953F089715F3BF4B483733B684BD6EC43985BAF66616455CC
B397BB2539F34EC350AD026D0DB7899E4BD908C74546219D412856180B9D22B7
0451D546C121B8D231347094F8830126C641F78A8B8C697084E8C94249D8642D
AAC6686E293BB8C7F369FEDFC1E94F1EDDD74F048A0E2D9C0A00345744AE8A87
805671C7403AEA7C136B40E72F3324BE6CD74816690587E9550B179E56AFBAD0
6F22A0E50A185934883B93981068A961324EDE4327FB7B6AFA3B5A8AE02DC3F9
63698956A89EC91ECB52541A6FD26B8FC73F9480D47DBB5A56DEE067CCE93256
C3E4C5CF86C60BAE9631403D081A0A3A5C3E8F0A0D1F0CC569E4A3E96F3EB82F
EA06C0756006210358C214EC83AB616181DC4FDEC152CC9551ACC058927C016F
904CB0613E84882FF518BA33A29335A805BF8991A122782920B25699CDADE71A
CAA1011E269C222D49A7644CC013FFD98CF4E7EA8A8010312E51677670E782D7
BC4E1208E70E96C017E91828CA88A099F2F6B2C019EF6AF1EACC99AE088290B1
5C59D1894C18416E6ADE883D99890BE14F86D74EF86CF2D465CC208DB2366068
CC0CF12868CDC8ED2EBC9FC2D0A91098E24E3479488FE4E97440BEFD897CFA61
FC135DBCD2C11AE055720606AE51295481D963B1A10A1832AC7037B382FDAD68
8D774931815C42FC95498687C8B4D85F66A24EC9D27EC817F4908216A6988690
7D0C3B91A4CAEB72C51A499089ABE2CC5829F6EC02601093B78ECBB18B8C140E
574708D0964A8E12345B609270871B07AA301F817A393809543C3E97C8B7E5F5
B61C7C859E76E473A1259E10A661FEA44A4347CC6A04D7B8069DF5E657CC7A0E
861F53C1957538F67437464C51D6FD0CD9097133254CBB633D95DBA16F60846B
48581142AD0E7DD7514418A0979D61EC4019C295102816305028164B4267FE50
1E93B345A80034EE9E7D4163603B4E47C10FCC64045DAC42564948B34F12A763
50B4EE514FBC12CDC772EB4E1C8635572C067C51EBDE9411AD770BFA89D4DB0B
4C82974E8395A774C6C92BBA4EC8A18BA403714A89262DDD43041206AA99BCFE
64575236BE179FA2BBE6105ED97F91C87E426CD88D181B748CFC4DAE3DFA8649
8AEE5DC299ABCE8C03D952C08130339147466EE97E542453E39A1D72D5AFCE13
D986C6B99D03A1EB970028E64AC25A596F4FA853B89727DCCF1D71F64FBBB11A
65A2FD157F205F7DA116FC2C1166EB000D3C37B6EBB7E641D2AC3840DCC3AFC1
72BA7D6E186E38984F827F92BB21435A3112C0993D2485E513A942AB890045E9
83169A2D63083A72252B55E19AA95B4C584ED49BE47794455619F23F181DFAB3
BBE44E2E91A66C5A55EA0957C7FD6D226B608A6764F7F063F2C7A83FE2832177
A3C3ED948DA145963C418C0748B3DC0B87614BB0613A74F43A179B6505510B64
0820C94649FD46B989EB243586D6888F9072928AB1573683CA91256F810071F0
1DEB7916EE6D42BF0B9BBBA0042C5322A3D11CDC802B1770EAC41A5A9399C7F2
328838F28400E70482D903A131EB44F81A69A021536847C3F1A126E44122D8B8
2EE30FFACFFC792269E90C90E1A41159A7CF391122D92FA0564F8284ACE0C6E4
8F48B40B281502726238B1A168EC3432C5456748D60C415E8551DCACACEF272D
4B1A51000336AF030423C911E9E002D4D78B994E22B742EB494A17580EAE8779
6CE6D977BACA1C155AE0E3404303070196CD8E22A38581D91796AFEE3B633CD9
2E6CB595625EA7CA3A8C0A3A392A14F2D2D313AACE73B10AC8909DE1D6165B10
8EC9D65C7E55881001DACA5AB447BF801048D17F9A6DDCDF0A414088D0001874
844A13A07AB68CD4B3355052F0150B7DA52CE142A9CB3FF72AE062ACF73D70AB
E6418EEE60B9749BED92DA2184E72E008D24676FB715827CC3BD2F12E2204F4D
795FF6CFAB0418099D8E2174F4825B899A0EDD002102D1B28AE9552A1AEE34BB
E471046B57DD86B816A9EFFD2B6CC6C430EECA38CC82C393631328390CC2C20A
7E00FB724342BE1A42A6C35A62CE3917B19970AC4EA01952DD28C08177290DF6
B6A1B4B0AE7E2985AC345854815B48CB480FA63CA29013CF8608E2F8E0B78A25
00306D325914141350114F861DF2273F2C4F2CFCC5C331F7E369D9C6B34D26A6
258626873B613E1D5FC17E4381A2E093BDEE8FA07B37D1612BF6FC268BDCC995
EBE285C8CF7C1D6F43C1BA0D9A75E84CE2C337E1764BDE412783CB171D167AA0
02DE1FE03B9201C3B399E28768178F162AEF0459704EED6D14F4AFC88C41DDCF
61AC8C1CFCAD7B0032C7FAFDB0E4E237770F80CACC7E17451779B32D4960FA75
023881206822F4E2CC90FEA0DB7E5C42A74CCB3B853546195B942E7E6B81BE7A
0563839E21BCE831449714CA93A420B803CD8278C59B0D437B80A4DF86F58B94
D237C920ACC1C8F29A266193B9639EF1BE080E2E94A0BA6A49847C1AB3E50189
5D7400475A7D30A7DF674AA8FC45DA23AB1881D4804E5EB495E6604080D346D5
E111CA0F2982652400B6B89338560F11B28FAA7B4709269E58E28DFEE1618B88
4537DAF2924BDA93A66426AF33D7BAA9A6337A76494025847A89D821B73AC605
4464253622ADA7F3D87E669B1746FD8AC3CCCCA997C561490897CEDAB1E218E0
3FB8E5F32B8F9F176211DAE519BA7F9523227A1492516468FA749D8F76FD3696
7ACD9F51C4A268ABDC0856693826427777F14F3A0B5EF52EB496BFA1B45BBF99
65FEC943153BB38AEE382BF34E6C9BC1CF787FBAD465CC5D4180C2AEA451C332
13BEBAC452DED1971F0F167EFEE8FEEA0BFF0F174A14A553FDFF01F579924C32
2159E400000006624B474400FF00FF00FFA0BDA793000000097048597300000B
1300000B1301009A9C180000000774494D4507E20B0A0C040A02961422000020
004944415478DAEDDD7F48D4F9BEC7F1F7DC397899CB1CE630E1650E2EB3181E
5C2626460CC598483C1886D1A2188A61188692282DCA2E45D15214C54A521447
928D8D9524499262634569487658491A1A76488E34ACECB0B27225B9C30E67D8
E10E9FFB475B67DB55D3D499EF8FE703BE503936DFEFE7FB9DEF6B3E9FEFE787
4529250000E0A5FFA00800002018010020180100201801002018010020180100
2018010020180100201801002018010020180100201801002018010020180100
2018010020180100201801002018010020180100201801002018010020180100
201801002018010000C1080000C1080000C1080000C1080000C1080000C108BC
83D9D959B565CB16B56BD72E158944142502806084A98D8E8ECAE2E2A2048341
292D2D95FEFE7EC21100C108F34A2412AFFF9C4C26A5ADAD4D0E1D3AA492C924
8503108C80F9E4E6E6FEE1DF060606A4B4B454C562316A8F00C108988BDBED5E
F2DF239188949696CAD4D414E108108C807978BDDED0723F9B9F9F97F2F27219
1E1E261C0182113087DCDCDC1DF9F9F9CBFE3C994C4A4343039D72008211308F
C6C6C6157F9E4EA7A5ADAD4D7A7B7B0947C0242C4AF17987B95DB97245757777
4B3A9D5EF175C78F1F970B172E5828318060040CAFAFAF4FB5B7B7BFF575A74F
9F963367CE108E8081D1940A88C8D1A3472D1F7FFCF15B5F77F6EC59E9E9E9E1
DB24408D1130BE743A2DA5A5A52A140ABDF5B557AF5E958E8E0E6A8E00C10818
5B381C563B76EC78EBF34611913B77EE485D5D1DE108180C4DA9C06FF87C3E4B
7D7DFDAA5E7BE8D02161F271801A236078D3D3D36ADBB66DAB7A6D7E7EBE3C7E
FC38949B9BBB839203A8310286E4F1782C656565AB7AEDECECAC34343414AFA6
E91500C108E8565353D3AA5F1B0804E4D34F3FA5E90530089A528125C46231F5
FEFBEFAFFAF5393939F2F8F163F1F97C74C601A831422F92C9A4ECDBB74F9597
97B3ACD25BB8DD6E8BC7E359F5EB53A994B4B5B5094DAA00C1081D191818500F
1E3C90898909D9BB77AFA452290A65052525256B7AFDD4D4945CBB768D2F1C00
C108BDB87FFFFEEB3F4F4F4F4B77773737F115F87CBE35FFCEA953A7646E6E8E
72050846685D3299944020F0C6BF5DBB768DC57857505858B8E6DF492412D2D3
D343E1010423B46E7272522593C9256B3858DA4A6B35AEA4BFBF5FE6E7E7F9C2
01108CD0B26030B8E4BF8F8F8F4B2010E026FEB28CD4D9B367D5C18307555151
91FAE0830FDEB9763E38384881023AF5278AC01C26262696FD592010908A8A0A
539547229190070F1EA8402020A15048563371F85A0C0C0C48575717171EA043
8C633481743A2D7FFEF39F976C4A1511191B1B93CACA4A538CBF0B0683AAB7B7
5746474765B9F2D828959595D2D5D5255555558C6D04084668492814523B762C
3F95E74F3FFD242E97CBD037EF6834AA3EF9E413191919C9F87B7B3C1EE9E8E8
90A6A6268BDD6EE78204348E678C26100E8757FCB9D3E93474288E8E8EAAA2A2
A2AC84A2C8CBA131EDEDEDF2FEFBEFABFEFE7EBE89020423B22D12892CFB33AB
D52A393939863DF6C1C141B56FDF3E49241259DF97C5C545696B6B931D3B76A8
50284440020423B265666666D99FA5D3694D84C626D5D4D4E1C38735374D5B28
14921D3B76485B5B9B5A5C5C6CE50A05084668281845446667670D597B3971E2
84A6A7BDEBEFEF976DDBB65D1F1F1FA7F608108CC894542A25B1586CC5D7BCED
19A44EBF0CA8DF4E81A755F3F3F3B267CF1E3975EA9462027280604406C462B1
B7DE70971BFCAF677A08C5DF3A7FFEBCECDBB78FA655806044266A246F333A3A
6AB8E59226272775B7CFA3A3A3525A5A7A3D1A8DD2B40A108CC86630C6623109
068386BA19BFADF958ABA2D1A8ECDCB953229108E108108CD80C0B0B0BAB7A5D
5F5F9FA18E3B1E8FEBFA9CFDFDEF7F9770384C3802042336DA6A7B650E0F0F4B
2C1633CC8DD8E974EAFE0BCD9E3D7B0847200B9844DCE0563B1F683A9D96F3E7
CFCBF5EBD757F5FA999919954824241C0EBFF17CD2E7F349494949D667D2D17B
30FE361CC7C6C694CFE763BE558060C44658CBE0FD1B376EC8D1A34797BC09A7
5229191F1F57A3A3A332323222737373CBFE3F0E8743555757CBF1E3C7C5EBF5
66E586EEF178647474D410E1F8F7BFFF5D1E3E7C483802194253AAC1AD65D2EA
743A2D9D9D9DAFFF3E3F3FAF7A7A7AD4BE7DFBD4962D5BD4BE7DFBE4DAB56B2B
86A2C8CBE77B838383B27DFB763974E890CAC6F3BE929212C39CC3C5C545D9B3
678FD05B15A0C6880D60B55AD7F4FA6030281F7DF4919A9999D9901AD7C0C080
4C4E4EAAB1B131C9CFCFCF588DA7ACACCC50E771616141F6EEDD2BDF7EFBED93
DCDCDC1D5CD9003546BC2387C3B1E6DFB972E5CA86364346A351292F2FCF68E7
1EB7DB6DF1FBFD863A97D168541A1A1A8A9921072018B10E2E974B13FB118BC5
E4C30F3FCCE8DCA5353535863B9F8140403EFDF4539A54018211EF2A2F2F4F33
FB120E87337A536F6A6A0AD96C36C39DD3F3E7CF0B138F030423DE51414181A6
7A32F6F6F666AC13496E6EEE8EFAFA7A439ED7C3870F0BF3AA020423DE81C3E1
90FCFC7CCDEC4F2A95924F3FFD3463EF77F2E4C9357740D283B9B939E9EEEEBE
CE150E108C78073E9F4F53FB33343494B18E3805050596E6E666439ED79B376F
CAE8E8284DAA00C188B5AAACACD4D4FEA4D369191818C8D8FB9D3E7D5A727272
0C796E3B3B3B855EAA00C18835AAAEAED6DC3E0D0D0D65ECBDDC6EB7E5F4E9D3
863CB7D16854FAFBFBA935021BC8A2149F29A34B2412F2D7BFFE55AD657AB84C
F8E1871FC4ED7667AC73507B7BBB32DA2A222222B9B9B9F2FDF7DF5BD632CB11
006A8CA6D6D9D9A9B9501411191F1FCFE8FB5DBD7AD562B41971445ECE8A73F1
E245537DC34D2412323232A2563B493E4030E2B591911175F3E64D4DEEDBD4D4
5446DFCF6AB5CA679F7D66C8F3DCD7D727660A89C3870FABDADA5AD9BB77AFCA
E4A4112018A1FF9AC493B6B636CDEE5F2814CAF87BFAFD7E8BD7EB35DCB95E5C
5C94C1C14153D41AA3D1A81A1E1E161191898909F9E4934F781E048211ABD3D9
D959BCB0B0A0D9FD8B442259795FA30EFABF76ED9A29AEEBFBF7EFBFF1F75FE7
F6251C413062659393932A933D3FDF452A959285858527997E5F233E67147939
E5DEE4E4A4E10362A92678660202C188B73A71E2842EF6737E7EBE38D3EFE9F3
F9DA8C7ADE6FDCB861F86B7B666666A9EB483A3B3B9909081B82E11A06AD2DEE
DCB95317FBFAECD933F1783C199FCF75CB962D6A7171D170E7DEE974CAFFFCCF
FF588C380DDE2BFFF99FFFB96C879BB1B131A9ACACB47017003546BCA1A7A747
17FB69B55AB3128A222FC7FE19D1E2E2A2A19B53E3F1F88A4B97B5B7B78B1687
2681604416C56231F5FBCE095A96ADAEF6461E0C3F313161D86373381CD2D4D4
B4ECCFA3D1A85CBB768D6630108CF8B7818101DDCC9D994EA7333699F8EF1971
9DC65782C1A0A1AFF1CB972FB7399DCE657F7EFEFC79999B9B231C4130E2DFC1
A827999EFDC60CC1988DF1A199E4743AFB8F1D3BB6ECCF1389847CF2C927DC0C
403042241289A8A57AEC69D9AB81DA9966E459621616160CFF9CADA5A565C575
3607070725140A516B04C168760F1E3CD0DD3E070201999999C9F80D2C1E8F1B
FA5A8846A3860E85BCBC3C8BDFEF5FF135E7CF9FE7A6008291607CA0CBFD3E7B
F66CC6DFD3E835AAF9F979C35FEF6F9BA861646444229108B546108C66954AA5
74FB6C69686828E3430C8C3EE1B619862C1417BF7D6E886C7CE902C1088D0887
C3BA5D82279D4E4B7B7B7BC67AD3A65229C3D7A8CCB0E284CBE57AEB6B464646
B2D2540F82111A303939A9F760979E9E9E8CDCC0B23544041B6BA5211BBFFDD2
D5DFDF4F61816034232374D13F7BF66C469E09CDCDCD19FE7A30EACC3EEF6260
604058B31104A30945A351DD1F4332999403070E6CFAF3312394D5DBACA69951
EF56DBB378616141464646682500C168367A1BBFB8D2711C397264536F62D3D3
D386BE16AC56AB141414187E22EDB54C024F732A084693595C5C6C35D24A1143
434372F1E2C54D0BC76C2D909C29F9F9F9869ED9E795D9D9D955BF7662628269
E2B06A7FA208F42F1A8D1A6E1DBA13274E88DBED568D8D8D1B5EF3317A8D71F7
EEDDBA3F865028A442A190CCCCCCBC6E5AF7783C62B7DBC5E7F3495E5EDE9ABE
E0A4D369B97FFFBE1C3D7A941B06084633306A6792C3870F8BCBE552151515AC
AFB706151515BADCEF582CA67A7B7B6560604036A3056474749460C4AAD0946A
00465C7057E4E558BCDADADA0DEFA96AE425A76C369B545757EBEA8B44329994
13274EA8AD5BB7CA952B5736ED7A0E0683BA5979060423D6C9C8B39CC4E371D9
BB77EF863E1FCACBCB336C79D5D5D589C3E1D0CDFECECECEAAA2A22275F1E2C5
4D0FADC5C54506FB8360340BA34F6F36373727E5E5E51B168E460EC68E8E0EDD
EC6B2814523B77EECC688F6AA377BC02C108138946A3525E5E2EF3F3F3EB0EC7
C2C2424396D1FEFDFBA5A4A4C4A293F3A9F6EEDD9BF1A9F90846108C305C3876
7777AFFBFFF1783C862B1BABD52AE7CE9DD3C5BE269349F9F0C30F656161212B
AD0F00C168027A7AA6B45E838383120C06D7556B7CDB72457AD4D4D4245EAF57
17B5C5EEEE6E95AD213346EDA8068211BF63E45E964BE9ECEC5C57470D97CB65
F17ABD86290FB7DB2D972E5D6AD3C3BE068341D5D7D797B5F79F9E9E36FC22D5
201821E69B303A1C0E4B7F7FFFBA6A8DD5D5D586280BABD52AB76EDD12A7D3A9
8B39CF3A3B3BB3FAFED16854F6EEDDABCCB05E2508465333C384D1BFB7DEEEFD
7575758628873367CE88DFEFD74513EAFDFBF755381CCEFA7E4C4E4ECA871F7E
A858710304A381E5E7E79B6E6698582C26C3C3C3EF5C6B2C2E2EB6AC6605782D
ABABAB93E3C78FEBE6DCF7F6F66A665F0281807CF4D1478C6904C168540E8763
558BB61ACD952B57D6F5FB5D5D5DBA3DF69A9A1AB975EB96C56AB5EA627F2727
27D5C4C484A6F6A9AFAF6FDD4DF22018A1613E9FCF74C73C393929535353EF7C
63ABAFAFB7E8B1DCAAAAAAE4F6EDDB969C9C1CDDECB356977DEAEEEE66361C10
8C04A3B18C8C8CBCF3EF5AAD56B97AF5AAE8A5D625F2B2D3D0DDBB7775158AAF
56B6D0A2442221870E1D620E55108C4654525262CAE31E1F1F5FD7EFFBFD7ECB
C71F7FAC8B63EDE8E8907BF7EE59F4B6D6E2E8E8A8D2F2F8C1A9A9299A54F126
A5149B01B6172F5EB48A8832DB66B55AD5CF3FFFBCAEB2FBE5975F64FFFEFD9A
3DC69C9C1CF58F7FFC43E9F5DA3C7AF4A8E6AF23A7D3A95EBC78D1CABD844D29
458DD1289C4E67BF9106ADAFA5992E1A8DAEEBDB7E4E4E8EDCBE7DDBA2C51971
F2F3F3E5DB6FBF95A3478FEAB6E7713018D4FC3E2E2E2ECAD9B367AF0B4053AA
B11865D0FA5A45A3D175FF1F369B4D1E3E7C68D1D2F8C6D6D656F9EEBBEF2CC5
C5C5BA0DC5783CAE9B89BBFBFBFB3764927A108CD090A6A626531EF746CD6262
B3D9E4CE9D3B962FBFFC32AB9326E4E7E7CBD75F7F2DD7AF5FB7E87DBABF9191
11DD044D32995CF71020108CD0188FC7A3FB41EBEF62A37B95363535599E3F7F
6EE9EAEACA688F559BCD26274F9E9467CF9E59AAAAAA0C3169434F4F8FAEF6B7
AFAF4F982E0E04A3C13437379BEE9837637511BBDD2E972E5DB23C7FFE5CCE9C
39B3696B38969595C9C99327656C6C4C7EFEF967CBB973E774D7EB7439A3A3A3
595B45E35DC5E371191A1AA239D5E42C4A710D1849329994AD5BB7AA4C2F009B
4DCF9E3D138FC7B3E935AC7038AC46464624128948241259D3B34DBBDD2E1E8F
477C3E9FF87C3EF1783CE2F57ADBF432F9F7BB282F2FD7DC6C37AB515252228F
1F3FB6703721186120172F5E54274E9C304D6DF1C58B1759991A2D994CCAF4F4
B41211999F9F7F63115C9BCDF67A41648FC763985AE05ABE44141515F1650BBA
F4278AC0783A3A3A2C57AE5C3145ADB1A2A2226B33D7D86C36D1738FD14DFE72
A6EBFD1F191979FDC506E6C3334603FAF5F998298ED5AC3D71B52C168BA9E1E1
615D1FC3D0D01027926084D13436365A2A2B2B0D7D8C3E9F4FF6EFDF4F8D4D83
B545BDCF3D1A894418D34830C288AE5FBFBE293D36B5E2CC9933BA9A00DC2CB5
C51B376E18E258F4D871080423DE223F3FDF72FBF66D4386475D5D1DB5450D3A
7FFEBCA45229431CCBE4E4242794608411555555594E9F3E6DB4C097CF3FFF9C
50D4606DF1E6CD9B86391E82916084819D3E7DDAD2DADA6A8863713A9D72EFDE
3D433711535BD486502824C96492134B30C2A8AE5FBF6EE9E8E8D07D283E7CF8
50BC5E2FB5456A8B9B2E9D4E4B381CA6030EC10823BB7AF5AAE5E4C993BADCF7
82820279F4E891F87C3E4291DA62C6E86D4A3B108C7807E7CE9DB37CF9E597A2
A79958AAAAAAE4F1E3C76DD414B5291A8D1AA6272AC10882D1A49A9A9A2C4F9F
3E959292124DEFA7DD6E977FFCE31FF2F5D75F5B8C3CA7A8DE9D3A754AF7E316
97138BC538C10423CCA2B0B0D0F2F8F163CBE79F7F9ED5B50797535F5F2FFFFC
E73F75BD72BD1984C36165E459627E3BFF2D084698444B4B8BE5F9F3E7969327
4F6AA279B5A2A2421E3F7E2CB76FDFB6E4E5E5118A1A67F4C9EACDB44A0DFE8D
D535F0DAC2C2C2939B376F16F7F5F5C9ECEC6CC6DED766B3496363A3747474D0
B94647262626547979B9A18F312F2F4F7EFCF147AE49821178B9C8EC8D1B3724
1008C8E2E2E2A6DD743A3A3AA4B5B5B58D6788FAB373E74E65F441F00E8743FE
F77FFF976024188137058341150804241008AC7BFE48B7DB2D4D4D4DB27FFF7E
292929E186A353232323AAB6B6D6F0C799939323BFFCF20BD729C108AC2C1289
A868342A333333128D46251C0E8BC8CB1E7C0B0B0B6FBCD6E57289DFEF17BFDF
2F555555525858C84D46E7D2E9B4141515A948244230826004D6221A8DAA8282
026E2A06333030A00E1D3A648A63A52995600480B7D6163FF8E003158D464D71
BC2E974B7EFAE92782D16418AE0160D56EDCB8619A507C556304C10800CBBA76
ED9AA98E372F2F8F934E3002C0D242A190293ADCFC56414101279E600480A519
75A2F095B8DD6E4E3CC1680E535353EABDF7DE530D0D0D6A6E6E8EDE47C05BA4
D36931F29CA8CBF1783C9C7C82D11C464646646E6E4E86868664C78E1D323535
4538022B989E9E569B3503929695959571F209467388C7E3AFFF3C3F3F2FE5E5
E5F2E0C103C2115846301834DD31E7E5E589CBE562A806C1684EC964526A6B6B
251008108EC0128C3E27EA5276EFDECD892718CD63A9B149A9544A6A6B6B2512
89108EC0EF9869ECE22BD5D5D59C788211F1785C6EDEBC494100BFF3FB39708D
CE6AB54A5555551B679E6034758DF1954422C15501FC4E2A9532D5F1EEDFBF5F
580A8D603415BBDDBEECCF32B9402F6084CF8C11B5B4B470D24DEC4F663C68A7
D3B9ECCF42A190A4D369B15AAD6BFE461D0804D4C4C4842C2E2ECAFCFCBCD8ED
76B1DBED525C5C2C4EA7532A2B2B2DCCBD083DCACDCD35CDB116141448555515
BD5109467371B95CCBFE6C71715126272795DFEF5FD507637676569D3D7B5686
868624994CAEF85AABD5AA2A2B2BA5BABA5A9A9A9A0849E886C7E359F722D57A
71FCF8F1357F3186B198B229F56D13030F0C0CBCF5FF88C7E372E4C811F5B7BF
FD4D6EDEBCF9D6501479397BC8E8E8A8747676CAD6AD5B556F6FAF5ACDEF01D9
E6F7FB4D535B6C6E6EA6B668764A29D36D3FFFFCB388885A6EB3DBEDEAC71F7F
54CBFDFEE3C78F95DBED562BFD1FABDDDC6EB7FAE28B2F9419CF039B7EB6172F
5EB4E6E4E46CC835AFE5EDCE9D3B7C16D9C4B407EE72B956FC803436362EF901
B97BF7AEB2D96C1BFE81F47ABDEAABAFBEE243C9A6D9ADBEBEDED0A1585757C7
E78FCDDCC1585656F6D60FCA37DF7CF3C607E5D6AD5BCA6AB56EEA87B3B1B151
FDEB5FFFE2E264D3DCF6FCF9F34DBFFEB3B5399D4EF5D34F3F118C6CA29432EF
00FFD5ACB376E8D021595C5C6C1511090402EAF0E1C3924EA73775BF060707A5
B4B45445A35166E081D63E3396D6D656C31D97D56A95DBB76F332F2ACCDDF946
44C4E7F3BDF535B3B3B372F0E0C1EBE17058D5D6D6666C9073241291A2A222B9
7FFF3EE1084DB970E182C5688BF75EBE7C592A2B2B0945BC6651CA9CF7DE6030
A876EDDAB5AAD7E6E4E4646DE68F73E7CEC9C99327F9D04233A6A7A7556969A9
216689EAEAEA924B972EF1F902C128F272458D3FFFF9CF6AB39B4637EAC3FBD9
679F59185B05AD181D1D55B5B5B5A2E7E146274F9E9473E7CE118AF803D336A5
DA6C36F17ABDBAD8D7DEDE5E292A2A52A15088A6556842555595656C6C4CB753
C55DBA74895004C1B8143DADCE1D8944A4B4B454BABBBB15139D430BFC7EBFE5
DB6FBF95C2C242DDEC736E6EAE8C8D8D49575717A1088271297A5B6F2D9D4E4B
6F6FAF6CDBB64D3D78F080DA23B2CEEBF55A9E3E7D6AD1C3A4DB151515F2DD77
DFD1D1066F65DA678C222F9F336ED9B245B7D3B2D5D7D7CBD5AB5743B9B9B93B
B894F5291C0EBFF19CDB66B389C7E3D1E58D7B626242B5B7B7CBF4F4B4A6F6CB
ED76CB850B17A4B1B1914004C1B81A070E1C50C3C3C3BADD7F87C32167CE9C91
8E8E0E3AE7685024125153535332353525F3F3F332373727333333ABEED1595C
5C2C2E974B3C1E8FF87C3E292B2B93FCFC7CCDDEE0D3E9B4DCB871435DBC7831
EB4BB8391C0EF9F8E38FA5ABABCB62B3D9B818B17A669FE1E0D6AD5B8698B9C3
E3F1A8478F1E317347966786B975EB963A76EC98F2FBFD6AB3E61675BBDDAAB9
B959DDBB774FFDF2CB2F9A2C8BFFFBBFFF932FBEF842AD6686A98DDE0A0A0AD4
E5CB97D5CF3FFFCC75C9C69470EFB2FDEB5FFF1287C36198A9ADEAEBEBD50F3F
FC404066681B1B1B53C78F1F57F9F9F95939DF0E87431D3D7A547DFFFDF79A3D
E7FFFCE73FD5F1E3C7D5DBE62796754EE9565F5FAFBEFEFA6BAE7D36827123B6
8E8E0E43CDFB68B7DBD5B973E7345B9BD0F3F6F4E95375E7CE1DD5DCDCAC9C4E
A766CEB9D56A55CDCDCDEAD9B3679A0E86AFBEFA4A7574746CC81709AFD7AB8E
1F3FAEC6C6C60843B60DDD4CFF8C5144241A8DAA0F3EF840F430D87F2D0A0A0A
E4B3CF3E939A9A1A3A1DBC63C798898909894422120E8725140AE962BF6B6A6A
E4D2A54B9A7E162922128BC5D4F8F8B8048341894422CB96AFDD6E97C2C242F1
783C525C5C2C252525525C5C6CC9C9C9E122059D6F36534343831A1A1A32E4B1
EDDEBD5B3EFBEC33292929212057108FC7657C7C5CDDBF7F5FC6C7C7657E7E5E
B7C762B7DBE5EAD5ABBA5B74371C0EABE9E9E9D763230B0B0B2D7A9D440004A3
216A8DDBB66DCBDA9CA899D0D8D828172E5C10B7DB4D40FE2A9148C8E0E0A01A
1A1A92402060B8E3ABA9A991EBD7AF33A407580BDA93FFBD7DFCF1C7865FA1DC
66B3A993274F9ABEC7DEB367CFD4B163C794913A5E2DB7E5E5E5A9870F1FF21C
8E8D8D678C6B974C2665FBF6ED2A1A8D1AFE585D2E979C3B774E5A5A5A4C537B
4CA7D3323C3CACFAFBFB0D593B5C494E4E8E7CF1C5170C720756E13F28827FB3
D96C525959698A639D9F9F9723478E485151919A989830F4B7A3743A2D7D7D7D
EAFDF7DF570D0D0DA60B451191542A25070F1E94BEBE3EBE090304E3DABF599B
49381C96F2F272A9ADAD55B3B3B386BB698E8C8CA8EDDBB7ABF6F676999B9B33
FDF5DDDEDE2E83838384234030AEADD6684623232352545464989BE6DCDC9CDA
BB77AFAAADADD5DCDC9DD976F8F06109040284234030AE8ED3E934EDB1C7E371
3978F0A0343434A8783CAEDBE3B871E386DAB66D9B8C8E8E72412F21954A496D
6DAD18B18500201837416E6EAEE9CB606868484A4B4B552C16D3D58D339148C8
BE7DFBD491234744CFC19EA92F41B5B5B5861E9E04108C1B444F8BAE6EA69999
19292D2D957038AC8B708CC5626AE7CE9DEAC183079CBC550A87C3D2DDDD4DAD
11F81D866B2C51EBF8CB5FFEA28C363DDCBB72381CF2CD37DF88D7EBD56C37FF
A9A929F5E1871FEA7AA69A6CB15AADF2EDB7DF322B12408D717976BB5DF2F3F3
29885FC5E371D9BB77AFCCCDCD69F21BD4D4D4942A2F2F2714DF513A9D96B6B6
369A54018271653E9F8F42F88DB9B939D9BB77AFE66E9E914844EDD9B34792C9
2427691DC2E130E31B01827165C5C5C514C21F43482E5EBCA8999BE7AFC331E8
64B3412E5EBC28894482820008C6A59965F69BB53A7FFEBC44A3D1AC87632A95
7AD5BCCB49D920F3F3F372E5CA156A8D00C1B8349FCF6731F378C69502E9D34F
3FCDFA7E747777AB4824C209D960BDBDBDD41A0182716956AB55EAEAEA288825
0C0D0DC9FCFC7CD66A16C160505DBB768D13B109161717992E0E201897575353
43212C219D4ECBC8C848D6DEBBBDBD9D93B089AE5CB942218060A40896565959
6971B95C14C4D2B5B6ACBCEFC0C0004DA89B6C7A7A5A464747A9358260C41F59
AD56696E6EA620963039399995DAE2D9B36729FC0C686868D0CD8C4700C19861
2D2D2D62B55A2988DF89C562197FCFD1D151353B3B4BE167403C1E973D7BF610
8E2018F14705050596EAEA6A0A6289DA5BA6C70FF6F7F753F019B4B0B020BB76
EDA259150423FEA8ABAB8B425882DD6ECFD87B2D2E2EB6323978E6FDBA5A899C
3F7F9E7004C1887FDBBD7BB7A5A4A48482F80DA7D399D126E6D1D1D1EB4CEA9E
BDD68153A74E497979B962FD46108C78EDF8F1E314C26F14141464F4FDB2D1D9
076F9A989890A2A222191818201C413042A4A6A6C6C2FCA9FF96E91A34C1A80D
F1785C0E1D3A24BB76ED5274CC01C108B97CF93285F0AB4CCE259B4EA785B18B
DA120C06A5A8A8480E1C38A02291080109C361A1E2353878F0A01A1C1C347519
D86C3679F1E285C566B365E4FDE6E6E6D47BEFBDC7C5A761151515D2D5D525D5
D5D52C760C6A8C6673F5EAD5B6DCDC5C5397416363A3642A14454418BBA87D81
4040F6EDDB27FFFDDFFFADBABBBB552010E0DB36A8319AC9D0D0906A686830ED
F13F7DFA547C3E5FC66A060F1E3C50FBF6EDE3C2D31987C321151515525252F2
6AB36472880F403066586D6DADCAD644DAD9B47FFF7EB977EF5E469BCBCCFE45
C4486C369B783C1EC9CDCD15B7DBFD879FE7E4E448595999949595497E7E3ECD
B22018F5647E7E5EEDD8B1C3540BE55AAD56F9EEBBEFC4E3F164F486353838A8
0E1E3CC84567327EBF5F8E1E3D2A757575969C9C1C0A0419C533C677E072B92C
77EFDE15337D608F1D3B96F1507C55CB80F90483413978F0A07CF0C1076A7C7C
9C6FEF2018F5A0A4A4C472FDFA75531C6B7E7EBE9C3973262B4D5B04A3B9CDCE
CECA9E3D7BA4A1A1412D2C2C3CA14440306A5C7373B3E5D8B163863EC69C9C1C
B973E78E64ABE384D97B01E3A5A1A121292D2D2D8EC562D41E41306ADDA54B97
2C151515863DBECB972F4B717171D63A42E4E5E57191E175ED71D7AE5D323333
43386253D1F96603241209D9B3678F32DAD4658D8D8D72EBD6ADACF70EFCAFFF
FA2F954C2637817964000009AB49444154B9D02022222E974B1E3E7C989567DE
A0C68855B2DBEDF2F5D75F1B6A158EDDBB77CBE79F7FAE891B8FC7E3E122C36B
F3F3F3525B5B2B894482C200C1A8650E8743C6C6C62CBB77EFD6FDB178BD5EB9
77EF9E452B1D5FBC5E2F1718DE303333239D9D9D34778160D44B38363535E9F6
180A0B0B656C6C4C1C0E8766F689954DB0949B376F4A3018241C41306A5D4E4E
8E7CF9E59796D3A74F677431DF8DE0F3F9E4D1A347E272B934F5ECC608B5706C
8ECECE4E61116B108C3A71E6CC19CBC3870F75D3ABB2ACAC4C1E3E7CD8A6B550
1411F1783C16A7D3C945853F0887C332323242AD1104A35EECDEBDDBF2F4E9D3
505D5D9DA6F7B3B9B9591E3D7A64713A9DFD5ADC3FABD5AAA9A65D68CBB56BD7
28046C28866B64C8E8E8A8FAE8A38F646666464B3531E9EAEA929696164D777B
4F2412F297BFFC45D16486E53C7BF68CE11BA0C6A83755555596EFBEFBCE72F9
F26571B95C59AD7DD5D7D7CB37DF7C23CF9E3DB3683D144544229108A188150D
0F0F53082018F5282727478E1D3B66F9E1871F2C9F7FFE7946C7E7151414C8E9
D3A7E5C71F7F94DBB76F5BFC7EBF6EBE5D4F4C4C70F1806044C6D0949AFD9BBE
BA7FFFBE0C0D0D6DF8325695959552515121F5F5F5BA5EDF6ED7AE5D2A180C72
B160453FFEF8A3E4E5E5D19C0A82D148A6A6A65430189470382CA15048A6A7A7
57FDBB858585E2F57AC5E7F389D7EB15BFDFDFA6D5CE346BB1B0B0F0E4AF7FFD
6B314DA9789BBB77EF4A4D4D0DC18875FB1345A01D2525256F4C2B974AA52412
892891971D507EDB71C7EBF5BE5E0FD2EBF51A7631D71B376E108A589570382C
3535351404A831C2B8D2E9B4FCED6F7F53B3B3B31406DEAAA6A646EEDEBD4B8D
11EB46E71B68D6E8E828A188555BCBA3078060842EF5F4F4500858B5582C4621
806084B16B8B0CD3C05A24934996A202C108634AA552D2D9D9494160CD161616
E834018211C673F1E245158D462908AC19CDA920186138535353EAFCF9F31404
DE095FA84030C250E2F1B8343434482A95A230F04E1616162804108C3086542A
25B5B5B50CCFC0BABF5C0104230CE1F0E1C32A100850105817ABD54A21806084
FEB5B5B5A9C1C1410A02EB66B7DB2904AC1B73A5226BD2E9B41C397244DDBC79
93C2C086703A9D1402A831429F1616169EECD9B38750C486CAE622E0A0C608BC
B3A9A92975E0C001C69C61C31516165208A0C608FD48269372EAD429B573E74E
42111BCE66B349414101AB6B801A23F4617C7C5C757676BEB1A624B0912A2A2A
E8950A6A8CD0BEA9A929555E5EAEF6ECD94328625355565652082018A16DA74E
9D52A5A5A5C22A19C8548D11D80816A5988C1E1BAFA7A7477DF2C927140432C2
E7F3C9D3A74F79BE086A8CD0A6FBF7EFAB13274E5010C898D6D6560A01D418A1
4D7373736AFBF6EDB2B8B848612023EC76BBFCF4D34F1666BD01354668D28913
27084564544B4B0B53C1811A23B429168BA9AD5BB74A3A9DA63090114EA7539E
3F7FDEE6743AFB290D506384E6F4F7F7138AC8A893274F0AA1086A8CD0ACEDDB
B7AB4824424120230A0A0AE4D9B367969C9C1C0A03D418A13D0B0B0B4F084564
D2F5EBD7855004C108CD9A9C9C2CA61490295D5D5D525151C1B845108CD0AED9
D9590A011951565626172E5C2014413042DB18A2814CC8CBCB937BF7EE856842
05C108CD4BA55214023695CBE592B1B131C9CDCDDD4169806084E6391C0E0A01
9B1A8A0F1F3E148FC743132A0846E8436E6E2E850042110423F04A4141018500
421186C0007F6C886432295BB66C51C96492C2C086282B2B93DBB76F8BDBED26
14418D11FA63B3D9A4B898A18CD818C78E1D93478F1E590845108CD0355650C7
7AD9ED76B973E78E5CBE7C99A9DE403042FFAAAAAA2804BCB3E2E26279F2E489
D4D5D5514B04C10863282B2BB3D00907EF12885F7DF5953C79F2C45258584828
826084B1B4B6B652085815BFDFFF3A10ABABAB09446806BD52B1A1E2F1B8BCF7
DE7B2A9148501858527D7DBD7475754949490961086A8C303E87C321C78E1DA3
20F006BBDD2E1D1D1DF2FDF7DFCBEDDBB72D8422A831C2541289846CDDBA552D
2C2C501826979B9B2B5D5D5DD2DADADAE6743AFB2911108C30ADBEBE3ED5DEDE
4E419894D7EB9563C78E49535313C32E4030022222E9745A76ECD8A1C2E13085
611276BB5DEAEAEAA4A5A545FC7E3F4DA5201881DF0B06836AD7AE5D1484C195
9595497373B33436365AEC763B0502821158494343831A1A1AA2200C26373757
9A9A9AA4A5A58509BE4130026B118D46D5B66DDB58C8D820AAABABA5B9B959F6
EFDFCFB343108CC0BB3A71E284BA78F12205A153F9F9F9D2DCDC2C2D2D2D9297
9747ED100423B05EA9544A4A4B4BE988A32376BB5DF6EFDF2FCDCDCD52595949
1882600436DACCCC8C2A2D2D95783C4E616894C3E190AAAA2A696C6C94CACA4A
8BCD66A3504030029B697878581D38708082D05818EEDFBF5FEAEAEAA4AAAA8A
E78600C1884CEBEDED55DDDDDD144416B95C2EA9AAAA7A1D8656AB9542017EE3
4F140132A9ABABCB924C26D5A953A7288C0CB15AAD5251512115151552555525
3E9F8F678600354650733417B7DB2DD5D5D5525555251515150CBC070846E8C1
F0F0B03A74E8902493490A639D5C2E97F8FD7ED9BD7BB754555549414101B542
8060841E85422175E0C001999D9DA530D6202F2FEF7510565454082BDF030423
0C249148486767A7BA79F32685B18CFCFC7C292B2B7BFDAC303F3F9F20040846
18DD83070FD4471F7D24D168D4F465515252227EBF5FCACACAC4EFF78BCBE522
0801821166944AA5A4A7A747F5F4F498663200BBDDFE3A047F0D4206D7030423
F0A6783C2ED7AE5D53BDBDBDB2B8B86898E3CACBCB139FCFF7C6464719806004
562D9148C8E0E0A0EAEFEF975028A49BFD76381C525050201E8F47BC5EEFAB10
0CE5E6E6EEE0AC020423B0212291881A1C1C94919111999999C9FAFEB8DD6EC9
CBCB13AFD72BF9F9F9929797271E8F470A0B0B193708108C4066C56231F5E0C1
0309068332333323E17058D2E9F486BF8FCFE71397CB256EB75B7C3E9FE4E5E5
BDFA33CD9F00C108685B341A55D16854666666647A7A5A22918844A351595858
785DC3CBCDCD1591972BD0BBDD6EB15AADE2F3F94444A4A0A0401C0EC7AB6650
820F20180100C07F50040000108C0000108C0000108C0000108C0000108C0000
108C0000108C0000108C0000108C0000108C0000108C0000108C0000108C0000
108C0000108C0000108C0000108C0000108C0000108C0000108C0000108C0000
108C0000108C0000806004008060040080600400806004008060040080600400
8060040080600400806004008060040080600400806004008060040080600400
8060040080600400806004008060040080600400806004008060040080600400
8060040000042300000423000004230000042300006BF1FF143D33712B8DD511
0000000049454E44AE426082
}
end
end
object JvStandardPage3: TJvStandardPage
Left = 0
Height = 388
Top = 0
Width = 723
Caption = 'Grid'
object StringGrid1: TStringGrid
Left = 8
Height = 372
Top = 8
Width = 707
Align = alClient
BorderSpacing.Around = 8
TabOrder = 0
end
end
object JvStandardPage4: TJvStandardPage
Left = 0
Height = 388
Top = 0
Width = 723
Caption = 'Shell controls'
object ShellListView1: TShellListView
Left = 285
Height = 372
Top = 8
Width = 430
Align = alClient
BorderSpacing.Top = 8
BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
Color = clDefault
TabOrder = 0
ObjectTypes = [otNonFolders]
ShellTreeView = ShellTreeView1
end
object ShellTreeView1: TShellTreeView
Left = 8
Height = 372
Top = 8
Width = 272
Align = alLeft
BorderSpacing.Left = 8
BorderSpacing.Top = 8
BorderSpacing.Bottom = 8
FileSortType = fstNone
TabOrder = 1
ObjectTypes = [otFolders]
ShellListView = ShellListView1
end
object Splitter1: TSplitter
Left = 280
Height = 388
Top = 0
Width = 5
end
end
end
object Panel1: TPanel
Left = 0
Height = 56
Top = 413
Width = 723
Align = alBottom
AutoSize = True
BevelOuter = bvLowered
ClientHeight = 56
ClientWidth = 723
TabOrder = 2
object lblPainter: TLabel
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = cmbPainter
AnchorSideTop.Side = asrCenter
Left = 9
Height = 15
Top = 21
Width = 37
BorderSpacing.Left = 8
Caption = 'Painter'
ParentColor = False
end
object cmbPainter: TComboBox
AnchorSideLeft.Control = lblPainter
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Panel1
AnchorSideTop.Side = asrCenter
Left = 54
Height = 23
Top = 17
Width = 129
BorderSpacing.Left = 8
BorderSpacing.Top = 8
BorderSpacing.Bottom = 8
ItemHeight = 15
ItemIndex = 0
Items.Strings = (
'Modern'
'XP'
)
OnChange = cmbPainterChange
Style = csDropDownList
TabOrder = 0
Text = 'Modern'
end
object lblOrientation: TLabel
AnchorSideLeft.Control = cmbPainter
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbOrientation
AnchorSideTop.Side = asrCenter
Left = 207
Height = 15
Top = 21
Width = 60
BorderSpacing.Left = 24
Caption = 'Orientation'
ParentColor = False
end
object cmbOrientation: TComboBox
AnchorSideLeft.Control = lblOrientation
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Panel1
AnchorSideTop.Side = asrCenter
Left = 275
Height = 23
Top = 17
Width = 100
BorderSpacing.Left = 8
BorderSpacing.Top = 8
ItemHeight = 15
ItemIndex = 0
Items.Strings = (
'top'
'bottom'
)
OnChange = cmbOrientationChange
Style = csDropDownList
TabOrder = 1
Text = 'top'
end
object cbCloseButton: TCheckBox
AnchorSideLeft.Control = cmbOrientation
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Panel1
Left = 399
Height = 19
Top = 9
Width = 141
BorderSpacing.Left = 24
BorderSpacing.Top = 8
Caption = 'Tabs with Close button'
OnChange = cbCloseButtonChange
TabOrder = 2
end
object cbAllowTabMoving: TCheckBox
AnchorSideLeft.Control = cbCloseButton
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Panel1
AnchorSideTop.Side = asrCenter
Left = 556
Height = 19
Top = 19
Width = 114
BorderSpacing.Left = 16
Caption = 'Allow tab moving'
OnChange = cbAllowTabMovingChange
TabOrder = 3
end
object cbTabHotTracking: TCheckBox
AnchorSideLeft.Control = cbCloseButton
AnchorSideTop.Control = cbCloseButton
AnchorSideTop.Side = asrBottom
Left = 399
Height = 19
Top = 28
Width = 108
BorderSpacing.Bottom = 8
Caption = 'Tab hot-tracking'
OnChange = cbTabHotTrackingChange
TabOrder = 4
end
end
object JvModernTabBarPainter1: TJvModernTabBarPainter
Font.Color = clWindowText
DisabledFont.Color = clGrayText
SelectedFont.Color = clWindowText
left = 136
top = 248
end
object JvTabBarXPPainter1: TJvTabBarXPPainter
Font.Color = clWindowText
DisabledFont.Color = clGrayText
SelectedFont.Color = clWindowText
FixedTabSize = 0
left = 288
top = 248
end
object ImageList1: TImageList
Height = 24
Width = 24
left = 493
top = 150
Bitmap = {
4C7A040000001800000018000000390500000000000078DAED997F4C1B6518C7
EBC8A810AB59C31F4A149205661417583A7A65F10FFF74242871E28F9898912C
05EE0A9BD98C712CB671D9144C964C531570F80FE347CDA2018738B91636810C
4702632830CD268B60C4C504CA6FCAE3FBDCF636D797BBEB95B6C9B2F124DFF4
BDF79EFBDCF77DDE7BDF3657836133682424BEFB7AC60ECF98C9B423851C6E51
CAF9F18C1336A286D395E010C6C1E9F4434666ED3F06434AAAD23D3037D2B871
F326F4F7F7C3A9535FC3CE9DDD8144A37BDEB075FB6E823346CB6F181A82A30D
0D303030009DA2082FBD5CF27B42525A912129298DE012B5F8168B4551349A06
07C171F52A384747E155B71BAA4E7E084FA6A7BF62301A3309EA9168EA836C81
B05DE3E36026B5496E6A821347F6C35DB6496B7ED5FC07D9C3C377D86363123B
C9E381B36D6D50FF510568B1F5F8F710AEC4BE7E1DCC7D7D90DCD202675B5B61
9C1C7FE77E1FB4D86AFE693413DF0E5A93CB97A59A207B8C1CCFCCCC40C7571F
40B835A2E67F757515AAEB5BE1586717987B7B2576A38C1D0804A47510095F5E
7BB1AB07866E05A0BA7910CC9F7D21B1E939646344CAA7B1B6B60655D5D55072
E42408C7DCD0DE7141AA37F54D63A3FE913F3D3D0DE3A41663E499999C9A5A37
37D1F8C758595901BFDF0FF3F3F3521BEFC94634F597FB555B17D1F8D713D1F8
D73ABE57FDC78B1F8D367F253C5861B7DB21DE8A5784F04FE4C6562CFFD3BDB1
15CBAF7F3B44132D8760DF8D5FC0B4BC20A9F0CF2B307AEEBD7579AA62F9DF1C
0E6AE2FC71302FCD818174CBB56D695E3A27CF5515CBFFE1E3A0F6FD3DBA8E4D
5534F55B48AEAA58FECF678232AD2EABF21F25E7E4B9AA62F983AD4199022BAA
FCC7902FCB5515CBFFA32FA842FF6D55FE6BFE7F437255C5F0777D991354564D
0E24D7EC022323EC7B4E96A725969FEE4E8FA958BEB5D11A53B1FC82F682988A
E51FE83D1053B1FCCA5F2B63AA75CF671CF7E7786AF31BFCC188C2C2C2D98202
B2F6A2147294F8786E7272326A21478D1F2B69F9C74FA550EB57CAD3C3275D41
C9F9F27E5691F0EF35FF91F237EB7F7FD53FDEFB8FDEF00AB95922CF7D1BAF7D
36967C1F9F9BE3E5B966AFC075F8786B899CEF737007BD0EEE7B9FC01DBF62B7
6C95F2ED9614927BDAC773ED4487C37BB571E41E8FFBF6BFF030B96EE8A2DDF2
04F249FBB6C8E7EDF11415257805EBE7A2C01D72B90C5B48BBC7C7E7BD88D78A
C29EF470FC4B65CF6F13055B19F1E926CC5B62799E15F9C4F385A087726B368E
A79BB73D83E389ACD6E8C7F6168E81B45B703C77FD9FA739380EC26DF4967116
F2792E323E378135FDE9A0258DB4FF92F1FFF396ED7EDAE3CA4AF409360F19CF
1BEDE57B8DA47F0473F0DACEB2DCEDE1F8226F7D935C237A795B9597B7BED35D
C16576F3B94F91B11C25F3F709CE23C9719005F5D09DE7212F839C6BC0FA91FB
54DC2FBF4D6A6B6B676B6A6A60A322D7AFEBABABAB5BA37C3CC677BE722D2F2F
8768696929448B8B8B41E1F518F8AE9BBEEFC63E96FFEC359014099BF2F17D74
6969291417174BF750E21B3CD742A487BDB0B020B1464646203F3F5F12B6F5F0
91979A9AAA28CAA67C36583EAD85CBE5D2ED5BCE57921A9F32E97C68B129BFAD
AB27445A7C2AB65E4A6CFCBF412F1F3DCBFDB37CE4C9E700D97AF99449F9E16A
42D91BE15326ADBF167B237CB5FA2BB1E7E6E674F3D1B3DC3FCB471EBB0EF4F2
E5F508576FEA9B4A2F5FA91EE1D8F89F58347CB5FD81B223E1230FEBAFD73795
D2FE8F7D723E65523EF2E87C68B1A97FFA1F224A697F93F3D59E4F25F6ECECAC
C41A1E1E86ECEC6C49D856E3CBEBC1F291C7CE03E563389D4E496AFEF5D69BFA
A60AB7FFC7FBFB3D9EF13F63520965
}
end
end

View File

@ -0,0 +1,107 @@
unit Main;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
Grids, ShellCtrls, ListViewFilterEdit, JvTabBar, JvPageList,
JvTabBarXPPainter;
type
{ TMainForm }
TMainForm = class(TForm)
cbCloseButton: TCheckBox;
cbAllowTabMoving: TCheckBox;
cbTabHotTracking: TCheckBox;
cmbPainter: TComboBox;
cmbOrientation: TComboBox;
Image1: TImage;
ImageList1: TImageList;
JvModernTabBarPainter1: TJvModernTabBarPainter;
JvPageList1: TJvPageList;
JvStandardPage1: TJvStandardPage;
JvStandardPage2: TJvStandardPage;
JvStandardPage3: TJvStandardPage;
JvStandardPage4: TJvStandardPage;
JvTabBar1: TJvTabBar;
JvTabBarXPPainter1: TJvTabBarXPPainter;
lblPainter: TLabel;
lblOrientation: TLabel;
Memo1: TMemo;
Panel1: TPanel;
ShellListView1: TShellListView;
ShellTreeView1: TShellTreeView;
Splitter1: TSplitter;
StringGrid1: TStringGrid;
procedure cbCloseButtonChange(Sender: TObject);
procedure cbAllowTabMovingChange(Sender: TObject);
procedure cbTabHotTrackingChange(Sender: TObject);
procedure cmbPainterChange(Sender: TObject);
procedure cmbOrientationChange(Sender: TObject);
procedure JvTabBar1TabCloseQuery(Sender: TObject; Item: TJvTabBarItem;
var CanClose: Boolean);
private
public
end;
var
MainForm: TMainForm;
implementation
{$R *.lfm}
{ TMainForm }
procedure TMainForm.cbCloseButtonChange(Sender: TObject);
begin
JvTabBar1.CloseButton := cbCloseButton.Checked;
end;
procedure TMainForm.cbTabHotTrackingChange(Sender: TObject);
begin
JvTabBar1.HotTracking := cbTabHotTracking.Checked;
end;
procedure TMainForm.cbAllowTabMovingChange(Sender: TObject);
begin
JvTabBar1.AllowTabMoving := cbAllowTabMoving.Checked;
end;
procedure TMainForm.cmbPainterChange(Sender: TObject);
begin
case cmbPainter.ItemIndex of
0: JvTabBar1.Painter := JvModernTabBarPainter1;
1: JvTabBar1.Painter := JvTabBarXPPainter1;
end;
end;
procedure TMainForm.JvTabBar1TabCloseQuery(Sender: TObject;
Item: TJvTabBarItem; var CanClose: Boolean);
begin
CanClose := MessageDlg('Do you really want to close tab ' + Item.Caption + '?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes;
end;
procedure TMainForm.cmbOrientationChange(Sender: TObject);
begin
case cmbOrientation.ItemIndex of
0: begin
JvTabBar1.Orientation := toTop;
JvTabBar1.Align := alTop;
end;
1: begin
JvTabBar1.Orientation := toBottom;
JvTabBar1.Align := alBottom;
end;
end;
end;
end.

View File

@ -10,34 +10,29 @@ the specific language governing rights and limitations under the License.
The Original Code is: JvPageList.PAS, released on 2003-04-25. The Original Code is: JvPageList.PAS, released on 2003-04-25.
The Initial Developer of the Original Code is Peter Thörnqvist [peter3 at sourceforge dot net] . The Initial Developer of the Original Code is Peter Thrnqvist [peter3 at sourceforge dot net] .
Portions created by Peter Thörnqvist are Copyright (C) 2004 Peter Thörnqvist. Portions created by Peter Thrnqvist are Copyright (C) 2004 Peter Thrnqvist.
All Rights Reserved. All Rights Reserved.
Contributor(s): Contributor(s):
You may retrieve the latest version of this file at the Project JEDI's JVCL home page, You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net located at http://jvcl.delphi-jedi.org
Known Issues: Known Issues:
-----------------------------------------------------------------------------} -----------------------------------------------------------------------------}
// $Id: JvPageList.pas 11400 2007-06-28 21:24:06Z ahuser $ // $Id$
// Initial port to Lazarus by Sergio Samayoa - september 2007.
// Conversion is done in incremental way: as types / classes / routines
// are needed they are converted.
{$mode objfpc}{$H+}
unit JvPageList; unit JvPageList;
{$mode objfpc}{$H+}
interface interface
uses uses
LCLIntf, LCLType, LMessages, SysUtils, Classes, Graphics, Controls, Types, LMessages, LCLIntf, LCLType,
SysUtils, Classes, Controls, Graphics, JvComponent, JvThemes;
JvComponent;
type type
EPageListError = class(Exception); EPageListError = class(Exception);
@ -62,7 +57,6 @@ type
{ TJvCustomPage is the base class for pages in a TJvPageList and implements the basic behaviour of such { TJvCustomPage is the base class for pages in a TJvPageList and implements the basic behaviour of such
a control. It has support for accepting components, propagating it's Enabled state, changing it's order in the a control. It has support for accepting components, propagating it's Enabled state, changing it's order in the
page list and custom painting } page list and custom painting }
TJvCustomPage = class(TJvCustomControl) TJvCustomPage = class(TJvCustomControl)
private private
FPageList: TJvCustomPageList; FPageList: TJvCustomPageList;
@ -114,13 +108,12 @@ type
TJvCustomPageList is a base class for components that implements the IPageList interface. TJvCustomPageList is a base class for components that implements the IPageList interface.
It works like TPageControl but does not have any tabs It works like TPageControl but does not have any tabs
} }
TJvShowDesignCaption = (sdcNone, sdcTopLeft, sdcTopCenter, sdcTopRight, sdcLeftCenter, sdcCenter, sdcRightCenter, sdcBottomLeft, sdcBottomCenter, sdcBottomRight, sdcRunTime); TJvShowDesignCaption = (
sdcNone, sdcTopLeft, sdcTopCenter, sdcTopRight, sdcLeftCenter, sdcCenter,
sdcRightCenter, sdcBottomLeft, sdcBottomCenter, sdcBottomRight, sdcRunTime
);
//TODO: 25.09.2007 - SESS - Find a better place... TJvCustomPageList = class(TJvCustomControl, IUnknown, IPageList)
TCMDesignHitTest = TLMMouse;
TJvCustomPageList = class(TJvCustomControl, IUnknown, IPageList)
//TJvCustomPageList = class(TJvCustomControl)
private private
FPages: TList; FPages: TList;
FActivePage: TJvCustomPage; FActivePage: TJvCustomPage;
@ -130,6 +123,7 @@ type
FShowDesignCaption: TJvShowDesignCaption; FShowDesignCaption: TJvShowDesignCaption;
FHiddenPages: TList; FHiddenPages: TList;
procedure CMDesignHitTest(var Msg: TCMDesignHitTest); message CM_DESIGNHITTEST; procedure CMDesignHitTest(var Msg: TCMDesignHitTest); message CM_DESIGNHITTEST;
procedure WMEraseBkgnd(var Message: TLMEraseBkgnd); message LM_ERASEBKGND;
procedure UpdateEnabled; procedure UpdateEnabled;
procedure SetPropagateEnable(const Value: Boolean); procedure SetPropagateEnable(const Value: Boolean);
procedure SetShowDesignCaption(const Value: TJvShowDesignCaption); procedure SetShowDesignCaption(const Value: TJvShowDesignCaption);
@ -144,15 +138,16 @@ type
function GetActivePageIndex: Integer; virtual; function GetActivePageIndex: Integer; virtual;
procedure SetActivePageIndex(AIndex: Integer); virtual; procedure SetActivePageIndex(AIndex: Integer); virtual;
function GetPageFromIndex(AIndex: Integer): TJvCustomPage; virtual; function GetPageFromIndex(AIndex: Integer): TJvCustomPage; virtual;
function GetPageCount: Integer;virtual; function GetPageCount: Integer; virtual;
function GetPageCaption(AIndex: Integer): string; virtual; function GetPageCaption(AIndex: Integer): string; virtual;
procedure Paint; override; procedure Paint; override;
procedure PageCaptionChanged(Index: Integer; const NewCaption: string); virtual; procedure PageCaptionChanged(Index: Integer; const NewCaption: string); virtual;
procedure Change; dynamic; procedure Change; dynamic;
procedure Loaded; override; procedure Loaded; override;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
procedure ShowControl(AControl: TControl); override; procedure ShowControl(AControl: TControl); override;
function InternalGetPageClass: TJvCustomPageClass; virtual; function InternalGetPageClass: TJvCustomPageClass; virtual;
procedure SetActivePage(Page: TJvCustomPage); virtual; procedure SetActivePage(Page: TJvCustomPage); virtual;
procedure InsertPage(APage: TJvCustomPage); virtual; procedure InsertPage(APage: TJvCustomPage); virtual;
procedure RemovePage(APage: TJvCustomPage); virtual; procedure RemovePage(APage: TJvCustomPage); virtual;
@ -160,11 +155,14 @@ type
property HiddenPageList: TList read FHiddenPages; property HiddenPageList: TList read FHiddenPages;
property PropagateEnable: Boolean read FPropagateEnable write SetPropagateEnable; property PropagateEnable: Boolean read FPropagateEnable write SetPropagateEnable;
property ShowDesignCaption: TJvShowDesignCaption read FShowDesignCaption write SetShowDesignCaption default sdcCenter; property ShowDesignCaption: TJvShowDesignCaption read FShowDesignCaption write SetShowDesignCaption default sdcCenter;
property OnChange: TNotifyEvent read FOnChange write FOnChange; property OnChange: TNotifyEvent read FOnChange write FOnChange;
property OnChanging: TJvPageChangingEvent read FOnChanging write FOnChanging; property OnChanging: TJvPageChangingEvent read FOnChanging write FOnChanging;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; // public in D2009
function FindNextPage(CurPage: TJvCustomPage; GoForward: Boolean; IncludeDisabled: Boolean): TJvCustomPage; function FindNextPage(CurPage: TJvCustomPage; GoForward: Boolean; IncludeDisabled: Boolean): TJvCustomPage;
procedure PrevPage; procedure PrevPage;
procedure NextPage; procedure NextPage;
@ -174,6 +172,7 @@ type
function GetVisiblePageCount: Integer; function GetVisiblePageCount: Integer;
property Height default 200; property Height default 200;
property Width default 300; property Width default 300;
property ActivePageIndex: Integer read GetActivePageIndex write SetActivePageIndex; property ActivePageIndex: Integer read GetActivePageIndex write SetActivePageIndex;
property ActivePage: TJvCustomPage read FActivePage write SetActivePage; property ActivePage: TJvCustomPage read FActivePage write SetActivePage;
property Pages[Index: Integer]: TJvCustomPage read GetPage; default; property Pages[Index: Integer]: TJvCustomPage read GetPage; default;
@ -194,6 +193,7 @@ type
property PopupMenu; property PopupMenu;
property ShowHint; property ShowHint;
property PageIndex; property PageIndex;
property OnContextPopup; property OnContextPopup;
property OnDragDrop; property OnDragDrop;
property OnDragOver; property OnDragOver;
@ -207,15 +207,14 @@ type
property OnResize; property OnResize;
property OnShow; property OnShow;
property OnStartDrag; property OnStartDrag;
property OnBeforePaint; property OnBeforePaint;
property OnPaint; property OnPaint;
property OnAfterPaint; property OnAfterPaint;
property OnMouseEnter; property OnMouseEnter;
property OnMouseLeave; property OnMouseLeave;
property OnParentColorChange; property OnParentColorChange;
{$IFDEF JVCLThemesEnabled}
property ParentBackground default False; property ParentBackground default False;
{$ENDIF JVCLThemesEnabled}
end; end;
TJvPageList = class(TJvCustomPageList) TJvPageList = class(TJvCustomPageList)
@ -227,6 +226,7 @@ type
property ActivePage; property ActivePage;
property PropagateEnable; property PropagateEnable;
property ShowDesignCaption; property ShowDesignCaption;
property Action; property Action;
property Align; property Align;
property Anchors; property Anchors;
@ -237,7 +237,6 @@ type
property OnStartDock; property OnStartDock;
property OnUnDock; property OnUnDock;
property OnEndDock; property OnEndDock;
// property OnCanResize;
property OnDockDrop; property OnDockDrop;
property OnDockOver; property OnDockOver;
property OnGetSiteInfo; property OnGetSiteInfo;
@ -247,9 +246,11 @@ type
property PopupMenu; property PopupMenu;
property ShowHint; property ShowHint;
property Visible; property Visible;
property OnMouseEnter; property OnMouseEnter;
property OnMouseLeave; property OnMouseLeave;
property OnParentColorChange; property OnParentColorChange;
property OnChange; property OnChange;
property OnChanging; property OnChanging;
property OnConstrainedResize; property OnConstrainedResize;
@ -268,9 +269,7 @@ type
property OnMouseWheelUp; property OnMouseWheelUp;
property OnResize; property OnResize;
property OnStartDrag; property OnStartDrag;
{$IFDEF JVCLThemesEnabled}
property ParentBackground default False; property ParentBackground default False;
{$ENDIF JVCLThemesEnabled}
end; end;
implementation implementation
@ -280,20 +279,20 @@ uses
function GetUniqueName(AOwner: TComponent; const AClassName: string): string; function GetUniqueName(AOwner: TComponent; const AClassName: string): string;
var var
i: Integer; I: Integer;
begin begin
i := 0; I := 0;
if AOwner = nil then if AOwner = nil then
begin begin
repeat repeat
Inc(i); Inc(I);
Result := AClassName + IntToStr(i); Result := AClassName + IntToStr(I);
until FindGlobalComponent(Result) = nil; until FindGlobalComponent(Result) = nil;
end end
else else
repeat repeat
Inc(i); Inc(I);
Result := AClassName + IntToStr(i); Result := AClassName + IntToStr(I);
until AOwner.FindComponent(Result) = nil; until AOwner.FindComponent(Result) = nil;
end; end;
@ -304,12 +303,19 @@ begin
inherited Create(AOwner); inherited Create(AOwner);
FPageIndex := -1; FPageIndex := -1;
Align := alClient; Align := alClient;
//ControlStyle := ControlStyle + [csAcceptsControls, csDesignFixedBounds, csNoDesignVisible, csNoFocus];
ControlStyle := ControlStyle + [csOpaque, csAcceptsControls, csNoDesignVisible]; ControlStyle := ControlStyle + [csOpaque, csAcceptsControls, csNoDesignVisible];
// IncludeThemeStyle(Self, [csParentBackground]); // IncludeThemeStyle(Self, [csParentBackground]);
Visible := False; Visible := False;
DoubleBuffered := True; DoubleBuffered := True;
end; end;
destructor TJvCustomPage.Destroy;
begin
PageList := nil;
inherited Destroy;
end;
procedure TJvCustomPage.CreateParams(var Params: TCreateParams); procedure TJvCustomPage.CreateParams(var Params: TCreateParams);
begin begin
inherited CreateParams(Params); inherited CreateParams(Params);
@ -317,12 +323,6 @@ begin
Style := Style and not (CS_HREDRAW or CS_VREDRAW); Style := Style and not (CS_HREDRAW or CS_VREDRAW);
end; end;
destructor TJvCustomPage.Destroy;
begin
PageList := nil; // This removes the page from the PageList.
inherited Destroy;
end;
procedure TJvCustomPage.DoAfterPaint(ACanvas: TCanvas; ARect: TRect); procedure TJvCustomPage.DoAfterPaint(ACanvas: TCanvas; ARect: TRect);
begin begin
if Assigned(FOnAfterPaint) then if Assigned(FOnAfterPaint) then
@ -366,41 +366,35 @@ procedure TJvCustomPage.DoPaint(ACanvas: TCanvas; ARect: TRect);
var var
S: string; S: string;
begin begin
with ACanvas do ACanvas.Font := Font;
ACanvas.Brush.Style := bsSolid;
ACanvas.Brush.Color := Color;
DrawThemedBackground(Self, ACanvas, ARect);
if csDesigning in ComponentState then
begin begin
Font := Self.Font; ACanvas.Pen.Style := psDot;
Brush.Style := bsSolid; ACanvas.Pen.Color := clBlack;
Brush.Color := Self.Color; ACanvas.Brush.Style := bsClear;
//SESS ACanvas.Rectangle(ARect);
//DrawThemedBackground(Self, Canvas, ARect); ACanvas.Brush.Style := bsSolid;
DoEraseBackground(Canvas, 0); ACanvas.Brush.Color := Color;
if (csDesigning in ComponentState) then if (PageList <> nil) and (PageList.ShowDesignCaption <> sdcNone) then
begin begin
Pen.Style := psDot; S := Caption;
Pen.Color := clBlack; if S = '' then
Brush.Style := bsClear; S := Name;
Rectangle(ARect); // make some space around the edges
Brush.Style := bsSolid; InflateRect(ARect, -4, -4);
Brush.Color := Color; if not Enabled then
if (PageList <> nil) and (PageList.ShowDesignCaption <> sdcNone) then
begin begin
S := Caption; SetBkMode(ACanvas.Handle, LCLType.TRANSPARENT);
if S = '' then ACanvas.Font.Color := clHighlightText;
S := Name; DrawText(ACanvas.Handle, PChar(S), Length(S), ARect, GetDesignCaptionFlags(PageList.ShowDesignCaption) or DT_SINGLELINE);
// make some space around the edges OffsetRect(ARect, -1, -1);
InflateRect(ARect, -4, -4); ACanvas.Font.Color := clGrayText;
if not Enabled then
begin
SetBkMode(Handle, TRANSPARENT);
Canvas.Font.Color := clHighlightText;
//TODO: Use JCLUtils one?
DrawText(Handle, PChar(S), Length(S), ARect, GetDesignCaptionFlags(PageList.ShowDesignCaption) or DT_SINGLELINE);
OffsetRect(ARect, -1, -1);
Canvas.Font.Color := clGrayText;
end;
DrawText(Handle, PChar(S), Length(S), ARect, GetDesignCaptionFlags(PageList.ShowDesignCaption) or DT_SINGLELINE);
InflateRect(ARect, 4, 4);
end; end;
DrawText(ACanvas.Handle, PChar(S), Length(S), ARect, GetDesignCaptionFlags(PageList.ShowDesignCaption) or DT_SINGLELINE);
InflateRect(ARect, 4, 4);
end; end;
end; end;
if Assigned(FOnPaint) then if Assigned(FOnPaint) then
@ -459,13 +453,37 @@ begin
end; end;
function TJvCustomPage.DoEraseBackground(ACanvas: TCanvas; Param: Integer): Boolean; function TJvCustomPage.DoEraseBackground(ACanvas: TCanvas; Param: Integer): Boolean;
{$IFDEF JVCLStylesEnabled}
var
BrushRecall: TBrushRecall;
{$ENDIF JVCLStylesEnabled}
begin begin
exit; if DoubleBuffered then
begin
ACanvas.Brush.Color := Self.Color; {$IFDEF JVCLStylesEnabled}
ACanvas.Brush.Style := bsSolid; BrushRecall := nil;
ACanvas.FillRect(Rect(0, 0, Width, Height)); try
Result := True; if StyleServices.Enabled and not StyleServices.IsSystemStyle then
begin
BrushRecall := TBrushRecall.Create(Brush);
Brush.Color := StyleServices.GetSystemColor(Brush.Color);
end;
{$ENDIF JVCLStylesEnabled}
Result := inherited DoEraseBackground(ACanvas, Param);
{$IFDEF JVCLStylesEnabled}
finally
BrushRecall.Free;
end;
{$ENDIF JVCLStylesEnabled}
end
else
begin
{$IFDEF JVCLStylesEnabled}
if StyleServices.Enabled then
DrawThemedBackground(Self, Canvas, ClientRect, Color, ParentBackground);
{$ENDIF JVCLStylesEnabled}
Result := True;
end;
end; end;
procedure TJvCustomPage.TextChanged; procedure TJvCustomPage.TextChanged;
@ -490,19 +508,14 @@ end;
procedure TJvCustomPage.ShowingChanged; procedure TJvCustomPage.ShowingChanged;
begin begin
inherited ShowingChanged; inherited ShowingChanged;
if Showing then try
try if Showing then
DoShow DoShow
except else
Application.HandleException(Self);
end
else
if not Showing then
try
DoHide; DoHide;
except except
Application.HandleException(Self); Application.HandleException(Self);
end; end;
end; end;
//=== { TJvCustomPageList } ================================================== //=== { TJvCustomPageList } ==================================================
@ -510,10 +523,7 @@ end;
constructor TJvCustomPageList.Create(AOwner: TComponent); constructor TJvCustomPageList.Create(AOwner: TComponent);
begin begin
inherited Create(AOwner); inherited Create(AOwner);
// TNotebook has a comment: "Do not add csAcceptsControls" !!!! ControlStyle := ControlStyle + [csAcceptsControls];
// ControlStyle := ControlStyle + [csAcceptsControls];
ControlStyle := [];
// IncludeThemeStyle(Self, [csParentBackground]); // IncludeThemeStyle(Self, [csParentBackground]);
FPages := TList.Create; FPages := TList.Create;
FHiddenPages := TList.Create; FHiddenPages := TList.Create;
@ -536,7 +546,7 @@ end;
function TJvCustomPageList.CanChange(AIndex: Integer): Boolean; function TJvCustomPageList.CanChange(AIndex: Integer): Boolean;
begin begin
Result := (AIndex >= 0) and (AIndex < GetPageCount); Result := (AIndex >= 0) and (AIndex < PageCount);
if Result and Assigned(FOnChanging) then if Result and Assigned(FOnChanging) then
FOnChanging(Self, AIndex, Result); FOnChanging(Self, AIndex, Result);
end; end;
@ -552,9 +562,32 @@ var
Pt: TPoint; Pt: TPoint;
begin begin
inherited; inherited;
Pt := SmallPointToPoint(Msg.Pos); //Pt := SmallPointToPoint(Msg.Pos);
if Assigned(ActivePage) and PtInRect(ActivePage.BoundsRect, Pt) then //if Assigned(ActivePage) and PtInRect(ActivePage.BoundsRect, Pt) then
Msg.Result := 1; // Msg.Result := 1;
end;
procedure TJvCustomPageList.WMEraseBkgnd(var Message: TLMEraseBkgnd);
{$IFDEF JVCLStylesEnabled}
var
BrushRecall: TBrushRecall;
{$ENDIF JVCLStylesEnabled}
begin
{$IFDEF JVCLStylesEnabled}
BrushRecall := nil;
try
if StyleServices.Enabled and not StyleServices.IsSystemStyle then
begin
BrushRecall := TBrushRecall.Create(Brush);
Brush.Color := StyleServices.GetSystemColor(Brush.Color);
end;
{$ENDIF JVCLStylesEnabled}
inherited;
{$IFDEF JVCLStylesEnabled}
finally
BrushRecall.Free;
end;
{$ENDIF JVCLStylesEnabled}
end; end;
procedure TJvCustomPageList.GetChildren(Proc: TGetChildProc; procedure TJvCustomPageList.GetChildren(Proc: TGetChildProc;
@ -575,7 +608,7 @@ end;
function TJvCustomPageList.GetPageCaption(AIndex: Integer): string; function TJvCustomPageList.GetPageCaption(AIndex: Integer): string;
begin begin
if (AIndex >= 0) and (AIndex < GetPageCount) then if (AIndex >= 0) and (AIndex < PageCount) then
Result := TJvCustomPage(FPages[AIndex]).Caption Result := TJvCustomPage(FPages[AIndex]).Caption
else else
Result := ''; Result := '';
@ -603,34 +636,37 @@ end;
procedure TJvCustomPageList.Loaded; procedure TJvCustomPageList.Loaded;
begin begin
inherited Loaded; inherited Loaded;
if (GetPageCount > 0) and (ActivePage = nil) then if (PageCount > 0) and (ActivePage = nil) then
ActivePage := Pages[0]; ActivePage := Pages[0];
end; end;
procedure TJvCustomPageList.Paint; procedure TJvCustomPageList.Paint;
begin begin
if (csDesigning in ComponentState) and (GetPageCount = 0) then if (csDesigning in ComponentState) and (PageCount = 0) then
with Canvas do begin
begin Canvas.Pen.Color := clBlack;
Pen.Color := clBlack; Canvas.Pen.Style := psDot;
Pen.Style := psDot; Canvas.Brush.Style := bsClear;
Brush.Style := bsClear; Canvas.Rectangle(ClientRect);
Rectangle(ClientRect); end;
end;
end; end;
procedure TJvCustomPageList.RemovePage(APage: TJvCustomPage); procedure TJvCustomPageList.RemovePage(APage: TJvCustomPage);
var var
I: Integer; I: Integer;
WNextPage: TJvCustomPage; FNextPage: TJvCustomPage;
begin begin
WNextPage := FindNextPage(APage, True, not (csDesigning in ComponentState)); FNextPage := FindNextPage(APage, True, not (csDesigning in ComponentState));
if WNextPage = APage then if FNextPage = APage then
WNextPage := nil; FNextPage := nil;
{ If the last page is removed, go back to the prior page }
if (FNextPage <> nil) and (FNextPage.PageIndex = 0) and (APage.PageIndex > 0) then
FNextPage := Pages[APage.PageIndex - 1];
APage.Visible := False; APage.Visible := False;
APage.FPageList := nil; APage.FPageList := nil;
FPages.Remove(APage); FPages.Remove(APage);
SetActivePage(WNextPage); SetActivePage(FNextPage);
// (ahuser) In some cases SetActivePage does not change FActivePage // (ahuser) In some cases SetActivePage does not change FActivePage
// so we force FActivePage not to be "APage" // so we force FActivePage not to be "APage"
if (FActivePage = APage) or (FActivePage = nil) then if (FActivePage = APage) or (FActivePage = nil) then
@ -647,7 +683,7 @@ end;
function TJvCustomPageList.GetPageFromIndex(AIndex: Integer): TJvCustomPage; function TJvCustomPageList.GetPageFromIndex(AIndex: Integer): TJvCustomPage;
begin begin
if (AIndex >= 0) and (AIndex < GetPageCount) then if (AIndex >= 0) and (AIndex < PageCount) then
Result := TJvCustomPage(Pages[AIndex]) Result := TJvCustomPage(Pages[AIndex])
else else
Result := nil; Result := nil;
@ -674,7 +710,8 @@ end;
procedure TJvCustomPageList.ShowControl(AControl: TControl); procedure TJvCustomPageList.ShowControl(AControl: TControl);
begin begin
if AControl is TJvCustomPage then if AControl is TJvCustomPage then
ActivePage := TJvCustomPage(AControl); if ActivePage <> AControl then
ActivePage := TJvCustomPage(AControl);
inherited ShowControl(AControl); inherited ShowControl(AControl);
end; end;
@ -727,17 +764,14 @@ end;
procedure TJvCustomPageList.SetActivePage(Page: TJvCustomPage); procedure TJvCustomPageList.SetActivePage(Page: TJvCustomPage);
var var
ParentForm: TCustomForm; ParentForm: TCustomForm;
//TODO: why?
//{$IFDEF COMPILER9_UP}
I: Integer; I: Integer;
//{$ENDIF COMPILER9_UP}
begin begin
// Mantis 3227: Checking if the page can be changed has to be done at the // Mantis 3227: Checking if the page can be changed has to be done at the
// beginning or the page would change but not the index... // beginning or the page would change but not the index...
if not (csLoading in ComponentState) and not CanChange(FPages.IndexOf(Page)) then if not (csLoading in ComponentState) and not CanChange(FPages.IndexOf(Page)) then
Exit; Exit;
if GetPageCount = 0 then if PageCount = 0 then
FActivePage := nil; FActivePage := nil;
if (Page = nil) or (Page.PageList <> Self) then if (Page = nil) or (Page.PageList <> Self) then
Exit Exit
@ -745,7 +779,7 @@ begin
begin begin
ParentForm := GetParentForm(Self); ParentForm := GetParentForm(Self);
if (ParentForm <> nil) and (FActivePage <> nil) and if (ParentForm <> nil) and (FActivePage <> nil) and
FActivePage.ContainsControl(ParentForm.ActiveControl) then FActivePage.ContainsControl(ParentForm.ActiveControl) and not (csDesigning in ComponentState) then
begin begin
ParentForm.ActiveControl := FActivePage; ParentForm.ActiveControl := FActivePage;
if ParentForm.ActiveControl <> FActivePage then if ParentForm.ActiveControl <> FActivePage then
@ -755,16 +789,17 @@ begin
end; end;
end; end;
//TODO: why?
//{$IFDEF COMPILER9_UP}
for I := 0 to GetPageCount - 1 do
if Pages[i] <> Page then
Pages[i].Hide;
//{$ELSE}
//Page.BringToFront;
//{$ENDIF COMPILER9_UP}
Page.Visible := True; Page.Visible := True;
if (ParentForm <> nil) and (FActivePage <> nil) and (ParentForm.ActiveControl = FActivePage) then Page.ControlStyle := Page.ControlStyle - [csNoDesignVisible];
for I := 0 to PageCount - 1 do
if Pages[i] <> Page then
begin
Pages[i].Visible := False;
Pages[i].ControlStyle := Pages[i].ControlStyle + [csNoDesignVisible];
end;
if csDesigning in ComponentState then // Visible:=False has no real effect when in design mode
Page.BringToFront;
if (ParentForm <> nil) and (FActivePage <> nil) and (ParentForm.ActiveControl = FActivePage) and not (csDesigning in ComponentState) then
begin begin
if Page.CanFocus then if Page.CanFocus then
ParentForm.ActiveControl := Page ParentForm.ActiveControl := Page
@ -782,7 +817,7 @@ begin
Change; Change;
end; end;
if (ParentForm <> nil) and (FActivePage <> nil) and if (ParentForm <> nil) and (FActivePage <> nil) and
(ParentForm.ActiveControl = FActivePage) then (ParentForm.ActiveControl = FActivePage) and not (csDesigning in ComponentState) then
begin begin
FActivePage.SelectFirst; FActivePage.SelectFirst;
end; end;
@ -849,7 +884,7 @@ begin
if GoForward then if GoForward then
begin begin
Inc(I); Inc(I);
if I >= FPages.Count - 1 then if I >= FPages.Count then
I := 0; I := 0;
end end
else else
@ -871,12 +906,8 @@ begin
if FShowDesignCaption <> Value then if FShowDesignCaption <> Value then
begin begin
FShowDesignCaption := Value; FShowDesignCaption := Value;
if ActivePage <> nil then ActivePage.Invalidate;
//TODO:
(*
if HandleAllocated and (csDesigning in ComponentState) then if HandleAllocated and (csDesigning in ComponentState) then
RedrawWindow(Handle, nil, 0, RDW_UPDATENOW or RDW_INVALIDATE or RDW_ALLCHILDREN); RedrawWindow(Handle, nil, 0, RDW_UPDATENOW or RDW_INVALIDATE or RDW_ALLCHILDREN);
*)
end; end;
end; end;
@ -906,6 +937,14 @@ begin
else else
Result := nil; Result := nil;
end; end;
//===TJvPageList =============================================================
function TJvPageList.InternalGetPageClass: TJvCustomPageClass;
begin
Result := TJvStandardPage;
end;
procedure TJvCustomPageList.DeletePage(Index: Integer); procedure TJvCustomPageList.DeletePage(Index: Integer);
begin begin
if (Index >= 0) and (Index < PageCount) then if (Index >= 0) and (Index < PageCount) then
@ -934,12 +973,4 @@ begin
Pages[Index].Caption := NewCaption; Pages[Index].Caption := NewCaption;
end; end;
//===TJvPageList =============================================================
function TJvPageList.InternalGetPageClass: TJvCustomPageClass;
begin
Result := TJvStandardPage;
end;
end. end.