📄 addrbk_frm.pas
字号:
(*
# (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 + -