⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jvqpagelinkeditorform.pas

📁 East make Tray Icon in delphi
💻 PAS
字号:
{******************************************************************************}
{* WARNING:  JEDI VCL To CLX Converter generated unit.                        *}
{*           Manual modifications will be lost on next release.               *}
{******************************************************************************}

{-----------------------------------------------------------------------------
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鰎nqvist [peter3 at sourceforge dot net] .
Portions created by Peter Th鰎nqvist are Copyright (C) 2003 Peter Th鰎nqvist.
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

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: JvQPageLinkEditorForm.pas,v 1.13 2004/09/07 23:15:18 asnepvangers Exp $
-----------------------------------------------------------------------------}
// $Id: JvQPageLinkEditorForm.pas,v 1.13 2004/09/07 23:15:18 asnepvangers Exp $

unit JvQPageLinkEditorForm;

{$I jvcl.inc}

interface

uses
  Classes, SysUtils, QWindows, QForms, QControls, QStdCtrls, QExtCtrls, QComCtrls,
  QActnList, QMenus,
  {$IFDEF HAS_UNIT_VARIANTS}
  Variants,
  {$ENDIF HAS_UNIT_VARIANTS} 
  DesignEditors, DesignIntf, 
  JvQPageList, JvQPageListTreeView, JvQComponent;

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;

procedure ShowPageLinkEditor(TreeView: TJvCustomPageListTreeView);

implementation

uses
  JvQDsgnConsts;



{$R *.xfm}


type
  THackTreeView = class(TJvCustomPageListTreeView);

procedure ShowPageLinkEditor(TreeView: TJvCustomPageListTreeView);
begin
  if TfrmJvTreeViewLinksEditor.Edit(TreeView,  TreeView.PageList ) and
    (THackTreeView(TreeView).Items.Count > 0) then
    THackTreeView(TreeView).Items.GetFirstNode.Expand(False);
end;

//=== { TJvPageLinksProperty } ===============================================

procedure TJvPageLinksProperty.Edit;
begin
  ShowPageLinkEditor(GetComponent(0) as TJvCustomPageListTreeView);
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.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -