From e8f5f157abb7159368de18d426d105fab2d14b1c Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Tue, 28 Apr 2020 20:39:01 +0000 Subject: [PATCH] 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 --- .../design/JvPageComps/jvpagecompsreg.pas | 15 +- .../JvPageComps/jvpagelinkeditorform.lfm | 160 ++++ .../JvPageComps/jvpagelinkeditorform.pas | 287 ++++++ .../JvPageComps/jvpagelisteditorform.lfm | 148 +++ .../JvPageComps/jvpagelisteditorform.pas | 374 ++++++++ .../design/JvPageComps/jvpagelisteditors.pas | 254 +----- .../design/JvPageComps/jvpagemanagerform.lfm | 90 ++ .../design/JvPageComps/jvpagemanagerform.pas | 452 ++++++++++ .../JvTabBarDemo_PageList.lpi | 87 ++ .../JvTabBarDemo_PageList.lpr | 25 + .../examples/JvTabBar_PageList/main.lfm | 840 ++++++++++++++++++ .../examples/JvTabBar_PageList/main.pas | 107 +++ .../jvcllaz/run/JvPageComps/jvpagelist.pas | 311 ++++--- 13 files changed, 2787 insertions(+), 363 deletions(-) create mode 100644 components/jvcllaz/design/JvPageComps/jvpagelinkeditorform.lfm create mode 100644 components/jvcllaz/design/JvPageComps/jvpagelinkeditorform.pas create mode 100644 components/jvcllaz/design/JvPageComps/jvpagelisteditorform.lfm create mode 100644 components/jvcllaz/design/JvPageComps/jvpagelisteditorform.pas create mode 100644 components/jvcllaz/design/JvPageComps/jvpagemanagerform.lfm create mode 100644 components/jvcllaz/design/JvPageComps/jvpagemanagerform.pas create mode 100644 components/jvcllaz/examples/JvTabBar_PageList/JvTabBarDemo_PageList.lpi create mode 100644 components/jvcllaz/examples/JvTabBar_PageList/JvTabBarDemo_PageList.lpr create mode 100644 components/jvcllaz/examples/JvTabBar_PageList/main.lfm create mode 100644 components/jvcllaz/examples/JvTabBar_PageList/main.pas diff --git a/components/jvcllaz/design/JvPageComps/jvpagecompsreg.pas b/components/jvcllaz/design/JvPageComps/jvpagecompsreg.pas index 05c2f4f54..e477900c1 100644 --- a/components/jvcllaz/design/JvPageComps/jvpagecompsreg.pas +++ b/components/jvcllaz/design/JvPageComps/jvpagecompsreg.pas @@ -16,7 +16,7 @@ implementation uses ImgList, PropEdits, ComponentEditors, - JvDsgnConsts, + JvDsgnConsts, JvPageList, JvNavigationPane, JvNavPaneEditors, JvTabBar, JvTabBarXPPainter, JvNotebookPageList, @@ -26,6 +26,7 @@ uses procedure Register; const cImageIndex = 'ImageIndex'; + cActivePage = 'ActivePage'; begin // JvNavigationPanel RegisterComponents(RsPaletteJvclVisual, [ // was: RsPaletteNavPane @@ -47,20 +48,18 @@ begin // JvPageList RegisterComponents(RsPaletteJvclVisual, [ // was: RsPaletteListComboTree - //TJvPageList, + TJvPageList, TJvNotebookPageList]); - { + RegisterClasses([TJvPageList, TJvStandardPage]); - RegisterComponentEditor(TJvCustomPageList, TJvCustomPageListEditor); // was: TJvCustomPageEditor + RegisterNoIcon([TJvStandardPage]); + RegisterComponentEditor(TJvCustomPageList, TJvCustomPageEditor); // was: TJvCustomPageEditor RegisterComponentEditor(TJvCustomPage, TJvCustomPageEditor); RegisterPropertyEditor(TypeInfo(TJvShowDesignCaption), nil, '', - TJvShowDesignCaptionProperty);# - } + TJvShowDesignCaptionProperty); - { RegisterPropertyEditor(TypeInfo(TJvCustomPage), TJvCustomPageList, cActivePage, TJvActivePageProperty); - } // JvPageTree RegisterComponents(RsPaletteJvclVisual, [ // was: TsPaletteListComboTree diff --git a/components/jvcllaz/design/JvPageComps/jvpagelinkeditorform.lfm b/components/jvcllaz/design/JvPageComps/jvpagelinkeditorform.lfm new file mode 100644 index 000000000..55e023519 --- /dev/null +++ b/components/jvcllaz/design/JvPageComps/jvpagelinkeditorform.lfm @@ -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 diff --git a/components/jvcllaz/design/JvPageComps/jvpagelinkeditorform.pas b/components/jvcllaz/design/JvPageComps/jvpagelinkeditorform.pas new file mode 100644 index 000000000..a0413dd39 --- /dev/null +++ b/components/jvcllaz/design/JvPageComps/jvpagelinkeditorform.pas @@ -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. diff --git a/components/jvcllaz/design/JvPageComps/jvpagelisteditorform.lfm b/components/jvcllaz/design/JvPageComps/jvpagelisteditorform.lfm new file mode 100644 index 000000000..1289b7c24 --- /dev/null +++ b/components/jvcllaz/design/JvPageComps/jvpagelisteditorform.lfm @@ -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 diff --git a/components/jvcllaz/design/JvPageComps/jvpagelisteditorform.pas b/components/jvcllaz/design/JvPageComps/jvpagelisteditorform.pas new file mode 100644 index 000000000..924b2121b --- /dev/null +++ b/components/jvcllaz/design/JvPageComps/jvpagelisteditorform.pas @@ -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 +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. diff --git a/components/jvcllaz/design/JvPageComps/jvpagelisteditors.pas b/components/jvcllaz/design/JvPageComps/jvpagelisteditors.pas index c8f5a8c67..0c31579f7 100644 --- a/components/jvcllaz/design/JvPageComps/jvpagelisteditors.pas +++ b/components/jvcllaz/design/JvPageComps/jvpagelisteditors.pas @@ -30,65 +30,38 @@ unit JvPageListEditors; interface uses - SysUtils, Classes, ImgList, Menus, - PropEdits, GraphPropEdits, ComponentEditors; + SysUtils, ImgList, Graphics, Classes, + PropEdits, ComponentEditors, GraphPropEdits, PropEditUtils, + JvPageList, JvDsgnEditors; type - (* { a property editor for the ActivePage property of TJvPageList } TJvActivePageProperty = class(TComponentProperty) public function GetAttributes: TPropertyAttributes; override; procedure GetValues(Proc: TGetStrProc); override; end; - *) TJvShowDesignCaptionProperty = class(TEnumProperty) function GetAttributes: TPropertyAttributes; override; end; { 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) - private - procedure InsertPage; - procedure PrevPage; - procedure NextPage; - procedure RemovePage; - function GetPageControl: TJvCustomPageList; public function GetVerb(Index: Integer): string; override; function GetVerbCount: Integer; override; procedure ExecuteVerb(Index: Integer); 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 function GetImageList: TCustomImageList; override; end; @@ -97,13 +70,11 @@ implementation uses TypInfo, - JvPageListTreeView; + JvDsgnConsts, JvPageListTreeView, JvPageListEditorForm; type -// THackPageList = class(TJvPageList); THackTreeView = class(TJvCustomPageListTreeView); -{ const cShowEditor = 0; cDash = 1; @@ -114,157 +85,6 @@ const 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; begin ExecuteVerb(cShowEditor); @@ -274,8 +94,7 @@ procedure TJvCustomPageEditor.ExecuteVerb(Index: Integer); begin case Index of cShowEditor: - ShowMessage('NOT IMPLEMENTED'); - // ShowPageListEditor(Designer, GetPageControl); + ShowPageListEditor(Self, GetPageControl); cNextPage: NextPage; cPrevPage: @@ -289,7 +108,7 @@ end; function TJvCustomPageEditor.GetPageControl: TJvCustomPageList; begin - if Component is TJvCustomPageList then + if GetComponent is TJvCustomPageList then Result := TJvCustomPageList(Component) else Result := TJvCustomPageList(TJvCustomPage(Component).PageList); @@ -322,14 +141,20 @@ procedure TJvCustomPageEditor.InsertPage; var P: TJvCustomPage; C: TJvCustomPageList; + Hook: TPropertyEditorHook = nil; begin + if not GetHook(Hook) then + Exit; C := GetPageControl; - P := C.GetPageClass.Create(Designer.LookupRoot); + P := C.GetPageClass.Create(C.Owner); try P.Parent := C; - P.Name := Designer.UniqueName(C.GetPageClass.ClassName); + P.Name := GetDesigner.CreateUniqueComponentName(C.GetPageClass.ClassName); P.PageList := C; C.ActivePage := P; + Hook.PersistentAdded(P, True); + GlobalDesignHook.SelectOnlyThis(P); + Modified; except P.Free; raise; @@ -350,24 +175,24 @@ procedure TJvCustomPageEditor.RemovePage; var AList: TJvCustomPageList; APage: TJvCustomPage; + APers: TPersistent; + Hook: TPropertyEditorHook; begin AList := GetPageControl; if (AList <> nil) and (AList.ActivePage <> nil) then begin APage := AList.ActivePage; -// Designer.SelectComponent(APage); - Designer.SelectOnlyThisComponent(APage); APage.PageList := nil; - APage.Free; - Designer.Modified; + //APage.Free; + //Designer.Modified; + APers := TPersistent(APage); + if GetHook(Hook) then + Hook.DeletePersistent(APers); end; end; - } -*********************************************************) - //=== { TJvActivePageProperty } ============================================== - (* + function TJvActivePageProperty.GetAttributes: TPropertyAttributes; begin Result := [paValueList]; @@ -378,16 +203,16 @@ var I: Integer; Component: TComponent; begin - for I := 0 to Designer.GetRoot.ComponentCount - 1 do - begin - Component := Designer.GetRoot.Components[I]; - if (Component.Name <> '') and (Component is TJvCustomPage) and - (TJvCustomPage(Component).PageList = GetComponent(0)) then - Proc(Component.Name); - end; + if (GlobalDesignHook <> nil) and (GlobalDesignHook.LookupRoot <> nil) and + (GlobalDesignHook.LookupRoot is TComponent) then + for I := 0 to TComponent(GlobalDesignHook.LookupRoot).ComponentCount - 1 do + begin + Component := TComponent(GlobalDesignHook.LookupRoot).Components[I]; + if (Component.Name <> '') and (Component is TJvCustomPage) and + (TJvCustomPage(Component).PageList = GetComponent(0)) then + Proc(Component.Name); + end; end; - *) - //=== { TJvSettingsTreeImagesProperty } ====================================== @@ -405,7 +230,6 @@ begin Result := nil; end; - //=== { TJvShowDesignCaptionProperty } ======================================= function TJvShowDesignCaptionProperty.GetAttributes: TPropertyAttributes; diff --git a/components/jvcllaz/design/JvPageComps/jvpagemanagerform.lfm b/components/jvcllaz/design/JvPageComps/jvpagemanagerform.lfm new file mode 100644 index 000000000..0a2fe00f4 --- /dev/null +++ b/components/jvcllaz/design/JvPageComps/jvpagemanagerform.lfm @@ -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 diff --git a/components/jvcllaz/design/JvPageComps/jvpagemanagerform.pas b/components/jvcllaz/design/JvPageComps/jvpagemanagerform.pas new file mode 100644 index 000000000..a8542d39e --- /dev/null +++ b/components/jvcllaz/design/JvPageComps/jvpagemanagerform.pas @@ -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. diff --git a/components/jvcllaz/examples/JvTabBar_PageList/JvTabBarDemo_PageList.lpi b/components/jvcllaz/examples/JvTabBar_PageList/JvTabBarDemo_PageList.lpi new file mode 100644 index 000000000..558d61ec5 --- /dev/null +++ b/components/jvcllaz/examples/JvTabBar_PageList/JvTabBarDemo_PageList.lpi @@ -0,0 +1,87 @@ + + + + + + + + + + + + <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> diff --git a/components/jvcllaz/examples/JvTabBar_PageList/JvTabBarDemo_PageList.lpr b/components/jvcllaz/examples/JvTabBar_PageList/JvTabBarDemo_PageList.lpr new file mode 100644 index 000000000..86126ea19 --- /dev/null +++ b/components/jvcllaz/examples/JvTabBar_PageList/JvTabBarDemo_PageList.lpr @@ -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. + diff --git a/components/jvcllaz/examples/JvTabBar_PageList/main.lfm b/components/jvcllaz/examples/JvTabBar_PageList/main.lfm new file mode 100644 index 000000000..62bab6d3a --- /dev/null +++ b/components/jvcllaz/examples/JvTabBar_PageList/main.lfm @@ -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 diff --git a/components/jvcllaz/examples/JvTabBar_PageList/main.pas b/components/jvcllaz/examples/JvTabBar_PageList/main.pas new file mode 100644 index 000000000..da1428b38 --- /dev/null +++ b/components/jvcllaz/examples/JvTabBar_PageList/main.pas @@ -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. + diff --git a/components/jvcllaz/run/JvPageComps/jvpagelist.pas b/components/jvcllaz/run/JvPageComps/jvpagelist.pas index 8ba3c005c..28960943a 100644 --- a/components/jvcllaz/run/JvPageComps/jvpagelist.pas +++ b/components/jvcllaz/run/JvPageComps/jvpagelist.pas @@ -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 Initial Developer of the Original Code is Peter Thörnqvist [peter3 at sourceforge dot net] . -Portions created by Peter Thörnqvist are Copyright (C) 2004 Peter Thörnqvist. +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) 2004 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.sourceforge.net +located at http://jvcl.delphi-jedi.org Known Issues: -----------------------------------------------------------------------------} -// $Id: JvPageList.pas 11400 2007-06-28 21:24:06Z ahuser $ - -// 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+} +// $Id$ unit JvPageList; +{$mode objfpc}{$H+} + interface uses - LCLIntf, LCLType, LMessages, - SysUtils, Classes, Controls, Graphics, - JvComponent; + SysUtils, Classes, Graphics, Controls, Types, LMessages, LCLIntf, LCLType, + JvComponent, JvThemes; type 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 a control. It has support for accepting components, propagating it's Enabled state, changing it's order in the page list and custom painting } - TJvCustomPage = class(TJvCustomControl) private FPageList: TJvCustomPageList; @@ -114,13 +108,12 @@ type TJvCustomPageList is a base class for components that implements the IPageList interface. 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... - TCMDesignHitTest = TLMMouse; - - TJvCustomPageList = class(TJvCustomControl, IUnknown, IPageList) - //TJvCustomPageList = class(TJvCustomControl) + TJvCustomPageList = class(TJvCustomControl, IUnknown, IPageList) private FPages: TList; FActivePage: TJvCustomPage; @@ -130,6 +123,7 @@ type FShowDesignCaption: TJvShowDesignCaption; FHiddenPages: TList; procedure CMDesignHitTest(var Msg: TCMDesignHitTest); message CM_DESIGNHITTEST; + procedure WMEraseBkgnd(var Message: TLMEraseBkgnd); message LM_ERASEBKGND; procedure UpdateEnabled; procedure SetPropagateEnable(const Value: Boolean); procedure SetShowDesignCaption(const Value: TJvShowDesignCaption); @@ -144,15 +138,16 @@ type function GetActivePageIndex: Integer; virtual; procedure SetActivePageIndex(AIndex: Integer); virtual; function GetPageFromIndex(AIndex: Integer): TJvCustomPage; virtual; - function GetPageCount: Integer;virtual; + function GetPageCount: Integer; virtual; function GetPageCaption(AIndex: Integer): string; virtual; procedure Paint; override; procedure PageCaptionChanged(Index: Integer; const NewCaption: string); virtual; + procedure Change; dynamic; procedure Loaded; override; - procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; procedure ShowControl(AControl: TControl); override; function InternalGetPageClass: TJvCustomPageClass; virtual; + procedure SetActivePage(Page: TJvCustomPage); virtual; procedure InsertPage(APage: TJvCustomPage); virtual; procedure RemovePage(APage: TJvCustomPage); virtual; @@ -160,11 +155,14 @@ type property HiddenPageList: TList read FHiddenPages; property PropagateEnable: Boolean read FPropagateEnable write SetPropagateEnable; property ShowDesignCaption: TJvShowDesignCaption read FShowDesignCaption write SetShowDesignCaption default sdcCenter; + property OnChange: TNotifyEvent read FOnChange write FOnChange; property OnChanging: TJvPageChangingEvent read FOnChanging write FOnChanging; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; + + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; // public in D2009 function FindNextPage(CurPage: TJvCustomPage; GoForward: Boolean; IncludeDisabled: Boolean): TJvCustomPage; procedure PrevPage; procedure NextPage; @@ -174,6 +172,7 @@ type function GetVisiblePageCount: Integer; property Height default 200; property Width default 300; + property ActivePageIndex: Integer read GetActivePageIndex write SetActivePageIndex; property ActivePage: TJvCustomPage read FActivePage write SetActivePage; property Pages[Index: Integer]: TJvCustomPage read GetPage; default; @@ -194,6 +193,7 @@ type property PopupMenu; property ShowHint; property PageIndex; + property OnContextPopup; property OnDragDrop; property OnDragOver; @@ -207,15 +207,14 @@ type property OnResize; property OnShow; property OnStartDrag; + property OnBeforePaint; property OnPaint; property OnAfterPaint; property OnMouseEnter; property OnMouseLeave; property OnParentColorChange; - {$IFDEF JVCLThemesEnabled} property ParentBackground default False; - {$ENDIF JVCLThemesEnabled} end; TJvPageList = class(TJvCustomPageList) @@ -227,6 +226,7 @@ type property ActivePage; property PropagateEnable; property ShowDesignCaption; + property Action; property Align; property Anchors; @@ -237,7 +237,6 @@ type property OnStartDock; property OnUnDock; property OnEndDock; -// property OnCanResize; property OnDockDrop; property OnDockOver; property OnGetSiteInfo; @@ -247,9 +246,11 @@ type property PopupMenu; property ShowHint; property Visible; + property OnMouseEnter; property OnMouseLeave; property OnParentColorChange; + property OnChange; property OnChanging; property OnConstrainedResize; @@ -268,9 +269,7 @@ type property OnMouseWheelUp; property OnResize; property OnStartDrag; - {$IFDEF JVCLThemesEnabled} property ParentBackground default False; - {$ENDIF JVCLThemesEnabled} end; implementation @@ -280,20 +279,20 @@ uses function GetUniqueName(AOwner: TComponent; const AClassName: string): string; var - i: Integer; + I: Integer; begin - i := 0; + I := 0; if AOwner = nil then begin repeat - Inc(i); - Result := AClassName + IntToStr(i); + Inc(I); + Result := AClassName + IntToStr(I); until FindGlobalComponent(Result) = nil; end else repeat - Inc(i); - Result := AClassName + IntToStr(i); + Inc(I); + Result := AClassName + IntToStr(I); until AOwner.FindComponent(Result) = nil; end; @@ -304,12 +303,19 @@ begin inherited Create(AOwner); FPageIndex := -1; Align := alClient; + //ControlStyle := ControlStyle + [csAcceptsControls, csDesignFixedBounds, csNoDesignVisible, csNoFocus]; ControlStyle := ControlStyle + [csOpaque, csAcceptsControls, csNoDesignVisible]; // IncludeThemeStyle(Self, [csParentBackground]); Visible := False; DoubleBuffered := True; end; +destructor TJvCustomPage.Destroy; +begin + PageList := nil; + inherited Destroy; +end; + procedure TJvCustomPage.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); @@ -317,12 +323,6 @@ begin Style := Style and not (CS_HREDRAW or CS_VREDRAW); end; -destructor TJvCustomPage.Destroy; -begin - PageList := nil; // This removes the page from the PageList. - inherited Destroy; -end; - procedure TJvCustomPage.DoAfterPaint(ACanvas: TCanvas; ARect: TRect); begin if Assigned(FOnAfterPaint) then @@ -366,41 +366,35 @@ procedure TJvCustomPage.DoPaint(ACanvas: TCanvas; ARect: TRect); var S: string; 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 - Font := Self.Font; - Brush.Style := bsSolid; - Brush.Color := Self.Color; - //SESS - //DrawThemedBackground(Self, Canvas, ARect); - DoEraseBackground(Canvas, 0); - if (csDesigning in ComponentState) then + ACanvas.Pen.Style := psDot; + ACanvas.Pen.Color := clBlack; + ACanvas.Brush.Style := bsClear; + ACanvas.Rectangle(ARect); + ACanvas.Brush.Style := bsSolid; + ACanvas.Brush.Color := Color; + if (PageList <> nil) and (PageList.ShowDesignCaption <> sdcNone) then begin - Pen.Style := psDot; - Pen.Color := clBlack; - Brush.Style := bsClear; - Rectangle(ARect); - Brush.Style := bsSolid; - Brush.Color := Color; - if (PageList <> nil) and (PageList.ShowDesignCaption <> sdcNone) then + S := Caption; + if S = '' then + S := Name; + // make some space around the edges + InflateRect(ARect, -4, -4); + if not Enabled then begin - S := Caption; - if S = '' then - S := Name; - // make some space around the edges - InflateRect(ARect, -4, -4); - 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); + SetBkMode(ACanvas.Handle, LCLType.TRANSPARENT); + ACanvas.Font.Color := clHighlightText; + DrawText(ACanvas.Handle, PChar(S), Length(S), ARect, GetDesignCaptionFlags(PageList.ShowDesignCaption) or DT_SINGLELINE); + OffsetRect(ARect, -1, -1); + ACanvas.Font.Color := clGrayText; end; + DrawText(ACanvas.Handle, PChar(S), Length(S), ARect, GetDesignCaptionFlags(PageList.ShowDesignCaption) or DT_SINGLELINE); + InflateRect(ARect, 4, 4); end; end; if Assigned(FOnPaint) then @@ -459,13 +453,37 @@ begin end; function TJvCustomPage.DoEraseBackground(ACanvas: TCanvas; Param: Integer): Boolean; +{$IFDEF JVCLStylesEnabled} +var + BrushRecall: TBrushRecall; +{$ENDIF JVCLStylesEnabled} begin - exit; - - ACanvas.Brush.Color := Self.Color; - ACanvas.Brush.Style := bsSolid; - ACanvas.FillRect(Rect(0, 0, Width, Height)); - Result := True; + if DoubleBuffered then + 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} + 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; procedure TJvCustomPage.TextChanged; @@ -490,19 +508,14 @@ end; procedure TJvCustomPage.ShowingChanged; begin inherited ShowingChanged; - if Showing then - try + try + if Showing then DoShow - except - Application.HandleException(Self); - end - else - if not Showing then - try + else DoHide; - except - Application.HandleException(Self); - end; + except + Application.HandleException(Self); + end; end; //=== { TJvCustomPageList } ================================================== @@ -510,10 +523,7 @@ end; constructor TJvCustomPageList.Create(AOwner: TComponent); begin inherited Create(AOwner); - // TNotebook has a comment: "Do not add csAcceptsControls" !!!! - // ControlStyle := ControlStyle + [csAcceptsControls]; - ControlStyle := []; - + ControlStyle := ControlStyle + [csAcceptsControls]; // IncludeThemeStyle(Self, [csParentBackground]); FPages := TList.Create; FHiddenPages := TList.Create; @@ -536,7 +546,7 @@ end; function TJvCustomPageList.CanChange(AIndex: Integer): Boolean; begin - Result := (AIndex >= 0) and (AIndex < GetPageCount); + Result := (AIndex >= 0) and (AIndex < PageCount); if Result and Assigned(FOnChanging) then FOnChanging(Self, AIndex, Result); end; @@ -552,9 +562,32 @@ var Pt: TPoint; begin inherited; - Pt := SmallPointToPoint(Msg.Pos); - if Assigned(ActivePage) and PtInRect(ActivePage.BoundsRect, Pt) then - Msg.Result := 1; + //Pt := SmallPointToPoint(Msg.Pos); + //if Assigned(ActivePage) and PtInRect(ActivePage.BoundsRect, Pt) then + // 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; procedure TJvCustomPageList.GetChildren(Proc: TGetChildProc; @@ -575,7 +608,7 @@ end; function TJvCustomPageList.GetPageCaption(AIndex: Integer): string; begin - if (AIndex >= 0) and (AIndex < GetPageCount) then + if (AIndex >= 0) and (AIndex < PageCount) then Result := TJvCustomPage(FPages[AIndex]).Caption else Result := ''; @@ -603,34 +636,37 @@ end; procedure TJvCustomPageList.Loaded; begin inherited Loaded; - if (GetPageCount > 0) and (ActivePage = nil) then + if (PageCount > 0) and (ActivePage = nil) then ActivePage := Pages[0]; end; procedure TJvCustomPageList.Paint; begin - if (csDesigning in ComponentState) and (GetPageCount = 0) then - with Canvas do - begin - Pen.Color := clBlack; - Pen.Style := psDot; - Brush.Style := bsClear; - Rectangle(ClientRect); - end; + if (csDesigning in ComponentState) and (PageCount = 0) then + begin + Canvas.Pen.Color := clBlack; + Canvas.Pen.Style := psDot; + Canvas.Brush.Style := bsClear; + Canvas.Rectangle(ClientRect); + end; end; procedure TJvCustomPageList.RemovePage(APage: TJvCustomPage); var I: Integer; - WNextPage: TJvCustomPage; + FNextPage: TJvCustomPage; begin - WNextPage := FindNextPage(APage, True, not (csDesigning in ComponentState)); - if WNextPage = APage then - WNextPage := nil; + FNextPage := FindNextPage(APage, True, not (csDesigning in ComponentState)); + if FNextPage = APage then + 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.FPageList := nil; FPages.Remove(APage); - SetActivePage(WNextPage); + SetActivePage(FNextPage); // (ahuser) In some cases SetActivePage does not change FActivePage // so we force FActivePage not to be "APage" if (FActivePage = APage) or (FActivePage = nil) then @@ -647,7 +683,7 @@ end; function TJvCustomPageList.GetPageFromIndex(AIndex: Integer): TJvCustomPage; begin - if (AIndex >= 0) and (AIndex < GetPageCount) then + if (AIndex >= 0) and (AIndex < PageCount) then Result := TJvCustomPage(Pages[AIndex]) else Result := nil; @@ -674,7 +710,8 @@ end; procedure TJvCustomPageList.ShowControl(AControl: TControl); begin if AControl is TJvCustomPage then - ActivePage := TJvCustomPage(AControl); + if ActivePage <> AControl then + ActivePage := TJvCustomPage(AControl); inherited ShowControl(AControl); end; @@ -727,17 +764,14 @@ end; procedure TJvCustomPageList.SetActivePage(Page: TJvCustomPage); var ParentForm: TCustomForm; - //TODO: why? - //{$IFDEF COMPILER9_UP} I: Integer; - //{$ENDIF COMPILER9_UP} begin // 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... if not (csLoading in ComponentState) and not CanChange(FPages.IndexOf(Page)) then Exit; - if GetPageCount = 0 then + if PageCount = 0 then FActivePage := nil; if (Page = nil) or (Page.PageList <> Self) then Exit @@ -745,7 +779,7 @@ begin begin ParentForm := GetParentForm(Self); if (ParentForm <> nil) and (FActivePage <> nil) and - FActivePage.ContainsControl(ParentForm.ActiveControl) then + FActivePage.ContainsControl(ParentForm.ActiveControl) and not (csDesigning in ComponentState) then begin ParentForm.ActiveControl := FActivePage; if ParentForm.ActiveControl <> FActivePage then @@ -755,16 +789,17 @@ begin 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; - 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 if Page.CanFocus then ParentForm.ActiveControl := Page @@ -782,7 +817,7 @@ begin Change; end; if (ParentForm <> nil) and (FActivePage <> nil) and - (ParentForm.ActiveControl = FActivePage) then + (ParentForm.ActiveControl = FActivePage) and not (csDesigning in ComponentState) then begin FActivePage.SelectFirst; end; @@ -849,7 +884,7 @@ begin if GoForward then begin Inc(I); - if I >= FPages.Count - 1 then + if I >= FPages.Count then I := 0; end else @@ -871,12 +906,8 @@ begin if FShowDesignCaption <> Value then begin FShowDesignCaption := Value; - if ActivePage <> nil then ActivePage.Invalidate; - //TODO: - (* if HandleAllocated and (csDesigning in ComponentState) then RedrawWindow(Handle, nil, 0, RDW_UPDATENOW or RDW_INVALIDATE or RDW_ALLCHILDREN); - *) end; end; @@ -906,6 +937,14 @@ begin else Result := nil; end; + +//===TJvPageList ============================================================= + +function TJvPageList.InternalGetPageClass: TJvCustomPageClass; +begin + Result := TJvStandardPage; +end; + procedure TJvCustomPageList.DeletePage(Index: Integer); begin if (Index >= 0) and (Index < PageCount) then @@ -934,12 +973,4 @@ begin Pages[Index].Caption := NewCaption; end; - -//===TJvPageList ============================================================= - -function TJvPageList.InternalGetPageClass: TJvCustomPageClass; -begin - Result := TJvStandardPage; -end; - end.