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

📄 addrbk_frm.pas

📁 siMail, siMail, siMail, siMail
💻 PAS
📖 第 1 页 / 共 3 页
字号:
(*
# (C) Copyright 2003
# Miha Vrhovnik, miha.vrhovnik@guest.arnes.si
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA
#
# The Initial Developer of the Original Code is Miha Vrhovnik (Slovenia).
# Portions created by Miha Vrhovnik are Copyright (c)2000-2003.
# All Rights Reserved.
#==============================================================================
# Contributor(s):
#==============================================================================
# History: see whats new.txt from distribution package
#==============================================================================
*)

unit addrBk_frm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, VirtualTrees, Menus, ActnList, ExtCtrls, ComCtrls, gnugettext,
  StdCtrls, Mask, MFEdit, VSTEdit, addrBk, ImgList, addressBook,
  fCompose, ldapsend, defFldrs, ActiveX, TBXStatusBars, TB2Item, TBX,
  TB2Dock, TB2Toolbar, JvExExtCtrls, JvNetscapeSplitter;

type TabkWindowMode = (abkSelect, abkNormal);

type
  TfrmAddrBk = class(TForm)
    ActionList1: TActionList;
    Panel1: TPanel;
    trBooks: TVirtualStringTree;
    dfsSplitter1: TJvNetscapeSplitter;
    editor: TVSTEditor;
    txtName: TMFEdit;
    actBookNew: TAction;
    actBookRename: TAction;
    actBookDelete: TAction;
    acrGroupNew: TAction;
    acrGroupRename: TAction;
    acrGroupDelete: TAction;
    actFileClose: TAction;
    actFileImportCSV: TAction;
    actFileExportCSV: TAction;
    actContactNew: TAction;
    actContactEdit: TAction;
    actContactDelete: TAction;
    actDelete: TAction;
    pnlSelect: TPanel;
    lstTo: TListBox;
    lstCC: TListBox;
    lstBCC: TListBox;
    cmdTo: TButton;
    cmdCC: TButton;
    cmdBCC: TButton;
    pnlContainer: TPanel;
    lstContacts: TVirtualStringTree;
    actSelectAll: TAction;
    actSelectUnselectAll: TAction;
    actSelectInvertSelection: TAction;
    pnlSelectContainer: TPanel;
    pnlButtons: TPanel;
    cmdOK: TButton;
    cmdCancel: TButton;
    imgTrash: TImage;
    mnuDock: TTBXDock;
    mnu: TTBXToolbar;
    N1: TTBXSubmenuItem;
    Import1: TTBXSubmenuItem;
    actFileImportCSV1: TTBXItem;
    Export1: TTBXSubmenuItem;
    actFileExportCSV1: TTBXItem;
    N3: TTBXSeparatorItem;
    Close1: TTBXItem;
    Book1: TTBXSubmenuItem;
    Newaddressbook2: TTBXItem;
    Renameaddressbook2: TTBXItem;
    Deleteaddressbook2: TTBXItem;
    Group1: TTBXSubmenuItem;
    Newusersgroup2: TTBXItem;
    Renameusersgroup2: TTBXItem;
    Deleteusersgroup2: TTBXItem;
    Contact1: TTBXSubmenuItem;
    New1: TTBXItem;
    Edit1: TTBXItem;
    Delete1: TTBXItem;
    Help1: TTBXItem;
    popAddrBkNormal: TTBXPopupMenu;
    Newaddressbook1: TTBXItem;
    Renameaddressbook1: TTBXItem;
    Deleteaddressbook1: TTBXItem;
    N2: TTBXSeparatorItem;
    Newusersgroup1: TTBXItem;
    Renameusersgroup1: TTBXItem;
    Deleteusersgroup1: TTBXItem;
    N4: TTBXSeparatorItem;
    Newcontact1: TTBXItem;
    Delete2: TTBXItem;
    popList: TTBXPopupMenu;
    Newcontact2: TTBXItem;
    Edit2: TTBXItem;
    Deletecontact1: TTBXItem;
    N5: TTBXSeparatorItem;
    Selectall1: TTBXItem;
    Unselectall1: TTBXItem;
    Invertselection1: TTBXItem;
    tbQuickFind: TTBXToolbar;
    TBControlItem1: TTBControlItem;
    txtQuickFind: TMFButtonEdit;
    sb: TTBXStatusBar;
    TBXItem1: TTBXItem;
    TBXItem2: TTBXItem;
    TBXSeparatorItem1: TTBXSeparatorItem;
    actFileSavePublic: TAction;
    actFileSavePrivate: TAction;
    actTo: TAction;
    actCC: TAction;
    actBCC: TAction;
    TBXToolbar1: TTBXToolbar;
    TBXItem3: TTBXItem;
    TBXItem4: TTBXItem;
    TBXItem5: TTBXItem;
    TBXSeparatorItem2: TTBXSeparatorItem;
    TBXItem6: TTBXItem;
    TBXItem7: TTBXItem;
    TBXItem8: TTBXItem;
    TBXSeparatorItem3: TTBXSeparatorItem;
    TBXItem9: TTBXItem;
    TBXItem10: TTBXItem;
    TBXItem11: TTBXItem;
    alToolbar: TActionList;
    actTBNewAddressBook: TAction;
    actTBRenameAddressBook: TAction;
    actTBDeleteAddressBook: TAction;
    actTBNewContactGroup: TAction;
    actTBRenameContactGroup: TAction;
    actTBDeleteContactGroup: TAction;
    actTBNewContact: TAction;
    actTBEditContact: TAction;
    actTBDeleteContact: TAction;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure trBooksGetNodeDataSize(Sender: TBaseVirtualTree;
      var NodeDataSize: Integer);
    procedure trBooksGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; TextType: TVSTTextType;
      var CellText: WideString);
    procedure actBookNewExecute(Sender: TObject);
    procedure trBooksGetPopupMenu(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Column: TColumnIndex; const P: TPoint;
      var AskParent: Boolean; var PopupMenu: TPopupMenu);
    procedure actBookNewUpdate(Sender: TObject);
    procedure trBooksCreateEditor(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Column: TColumnIndex; out EditLink: IVTEditLink);
    procedure trBooksEdited(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex);
    procedure trBooksEditCancelled(Sender: TBaseVirtualTree;
      Column: TColumnIndex);
    procedure txtNameExit(Sender: TObject);
    procedure actFileCloseExecute(Sender: TObject);
    procedure trBooksInitChildren(Sender: TBaseVirtualTree;
      Node: PVirtualNode; var ChildCount: Cardinal);
    procedure trBooksInitNode(Sender: TBaseVirtualTree; ParentNode,
      Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure trBooksGetImageIndex(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
      var Ghosted: Boolean; var ImageIndex: Integer);
    procedure trBooksEditing(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; var Allowed: Boolean);
    procedure actBookRenameExecute(Sender: TObject);
    procedure actBookDeleteExecute(Sender: TObject);
    procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean);
    procedure actDeleteExecute(Sender: TObject);
    procedure FormHide(Sender: TObject);
    procedure pnlSelectResize(Sender: TObject);
    procedure actContactNewExecute(Sender: TObject);
    procedure actContactNewUpdate(Sender: TObject);
    procedure trBooksChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
    procedure lstContactsGetNodeDataSize(Sender: TBaseVirtualTree;
      var NodeDataSize: Integer);
    procedure lstContactsGetText(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
      var CellText: WideString);
    procedure txtQuickFindEnter(Sender: TObject);
    procedure actContactEditUpdate(Sender: TObject);
    procedure actContactEditExecute(Sender: TObject);
    procedure lstContactsDblClick(Sender: TObject);
    procedure lstContactsGetPopupMenu(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Column: TColumnIndex; const P: TPoint;
      var AskParent: Boolean; var PopupMenu: TPopupMenu);
    procedure actSelectAllExecute(Sender: TObject);
    procedure actSelectUnselectAllExecute(Sender: TObject);
    procedure actSelectInvertSelectionExecute(Sender: TObject);
    procedure actContactDeleteUpdate(Sender: TObject);
    procedure actContactDeleteExecute(Sender: TObject);
    procedure lstContactsInitNode(Sender: TBaseVirtualTree; ParentNode,
      Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
    procedure FormDestroy(Sender: TObject);
    procedure lstToDblClick(Sender: TObject);
    procedure trBooksPaintText(Sender: TBaseVirtualTree;
      const TargetCanvas: TCanvas; Node: PVirtualNode;
      Column: TColumnIndex; TextType: TVSTTextType);
    procedure trBooksCompareNodes(Sender: TBaseVirtualTree; Node1,
      Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
    procedure FormConstrainedResize(Sender: TObject; var MinWidth,
      MinHeight, MaxWidth, MaxHeight: Integer);
    procedure cmdCancelClick(Sender: TObject);
    procedure lstToDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure trBooksDragAllowed(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean);
    procedure lstToDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure imgTrashDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure imgTrashDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure pnlButtonsResize(Sender: TObject);
    procedure cmdOKClick(Sender: TObject);
    procedure lstContactsDragAllowed(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean);
    procedure trBooksDragOver(Sender: TBaseVirtualTree; Source: TObject;
      Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode;
      var Effect: Integer; var Accept: Boolean);
    procedure trBooksDragDrop(Sender: TBaseVirtualTree; Source: TObject;
      DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState;
      Pt: TPoint; var Effect: Integer; Mode: TDropMode);
    procedure lstContactsHeaderClick(Sender: TVTHeader;
      Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X,
      Y: Integer);
    procedure FormResize(Sender: TObject);
    procedure actFileSavePrivateExecute(Sender: TObject);
    procedure actFileSavePublicExecute(Sender: TObject);
    procedure actToExecute(Sender: TObject);
    procedure actCCExecute(Sender: TObject);
    procedure actBCCExecute(Sender: TObject);
    procedure trBooksDblClick(Sender: TObject);
  private
    { Private declarations }
    nodePrivateBook: PVirtualNode;
    nodePublicBook: PVirtualNode;
    nodeRemoteBook: PVirtualNode;
    newBook: Boolean;
    FLdap: TLDAPSend;
    FMode: TabkWindowMode;
    FSelectedAddressBook: TAddressBook;
    FCancled: Boolean;
    procedure SaveAddressBook;
    procedure moveContacts(destAddrBk: TAddressBook);
  public
    { Public declarations }
    procedure CreateParams(var Params: TCreateParams); override;
    property  Mode: TabkWindowMode read FMode write FMode;
    property  SelectedAddressBook: TAddressBook read FSelectedAddressBook;
    property  Cancled: Boolean read FCancled;
    procedure ReloadBook(mode: TReloadBookMode);
  end;

var
  frmAddrBk: TfrmAddrBk;

implementation

uses mailBox, fContact, account, dImages;

{$R *.dfm}

type TAddrBkType = (abtPrivateRoot, abtPublicRoot, abtRemoteRoot,
    abtPrivate, abtPublic, abtRemote, abtGroup, abtContact, abtEmail);

type TTreeAddrBk = record
  id: TAddrBkType;
  obj: Pointer;
  text: String;
  default: Boolean;
end;

type PTreeAddrBk = ^TTreeAddrBk;

type TTreeContacts = record
  obj: TPerson;
end;

type PTreeContacts = ^TTreeContacts;

procedure TfrmAddrBk.FormCreate(Sender: TObject);
begin
  pnlSelect.Parent := pnlSelectContainer;
  pnlSelectContainer.Align := alClient;
  pnlSelect.Align := alClient;
  pnlContainer.Align := alClient;
end;

procedure TfrmAddrBk.FormShow(Sender: TObject);
var i: Integer;
begin
  //translate me
  TranslateComponent(Self);

  trBooks.Clear;

  //fill up address books tree
  nodePrivateBook := trBooks.AddChild(nil);
  with PTreeAddrBk(trBooks.GetNodeData(nodePrivateBook))^ do begin
    id := abtPrivateRoot;
    text := _('Private address books');
    obj := nil;
    default := False;
  end;
  nodePrivateBook.States := nodePrivateBook.States + [vsHasChildren];
  trBooks.InvalidateChildren(nodePrivateBook, True);

  nodePublicBook := trBooks.AddChild(nil);
  with PTreeAddrBk(trBooks.GetNodeData(nodePublicBook))^ do begin
    id := abtPublicRoot;
    text := _('Public address books');
    obj := nil;
    default := False;
  end;
  nodePublicBook.States := nodePublicBook.States + [vsHasChildren];
  trBooks.InvalidateChildren(nodePublicBook, True);

  nodeRemoteBook := trBooks.AddChild(nil);
  with PTreeAddrBk(trBooks.GetNodeData(nodeRemoteBook))^ do begin
    id := abtRemoteRoot;
    text := _('Remote address books (LDAP)');
    obj := nil;
    default := False;
  end;

    //read self position & size
  frmMailbox.Profile.Config.ReadControlSettings(Self);

  case Mode of
  abkSelect: begin
    pnlSelectContainer.Visible := True;
    pnlContainer.Visible := False;
    Self.Caption := _('Select addresses');
    //hide menus
    mnuDock.Visible := False;
  end;
  else begin
    pnlSelectContainer.Visible := False;
    pnlContainer.Visible := True;
    Self.Caption := _('Address book');
    //show menus
    mnuDock.Visible := True;
  end
  end;

  txtQuickFind.Text := ('Quick find');
end;

procedure TfrmAddrBk.trBooksGetNodeDataSize(Sender: TBaseVirtualTree;
  var NodeDataSize: Integer);
begin
  NodeDataSize := sizeOf(TTreeAddrBk);
end;

procedure TfrmAddrBk.trBooksGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
begin
  with PTreeAddrBk((Sender as TVirtualStringTree).GetNodeData(Node))^ do begin
    case id of
      abtPrivateRoot, abtPublicRoot, abtRemoteRoot: CellText := text;
      abtPrivate, abtPublic: CellText := TAddressBook(obj).BookName;
      abtContact: CellText := frmAddressBook.GetFullName(TPerson(obj));
      abtEmail: CellText := TEmail(obj).Email;
    end;
  end;

end;

procedure TfrmAddrBk.actBookNewExecute(Sender: TObject);
var sel, node: PVirtualNode;
begin
  sel := trBooks.GetFirstSelected;
  if (sel = nodePrivateBook) or (sel.Parent = nodePrivateBook) then begin
    newBook := True;
    if (sel = nodePrivateBook) then begin
      node := trBooks.AddChild(sel);
      trBooks.Expanded[sel] := True;
    end
    else begin
      node := trBooks.AddChild(sel.Parent);
      trBooks.Expanded[sel.Parent] := True;
    end;
    trBooks.EditNode(node, -1);

  end
  else if (sel = nodePublicBook) or (sel.Parent = nodePublicBook) then begin
    newBook := True;

⌨️ 快捷键说明

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