uselectcontact.pas

来自「FMA is a free1 powerful phone editing to」· PAS 代码 · 共 626 行 · 第 1/2 页

PAS
626
字号
unit uSelectContact;

{
*******************************************************************************
* Descriptions: Selecting Multiple Contacts
* $Source: /cvsroot/fma/fma/uSelectContact.pas,v $
* $Locker:  $
*
* Todo:
*
* Change Log:
* $Log: uSelectContact.pas,v $
*
*******************************************************************************
}

interface

uses
  Windows, TntWindows, Messages, SysUtils, TntSysUtils, Variants, Classes, TntClasses, Graphics, TntGraphics, Controls, TntControls, Forms, TntForms,
  Dialogs, TntDialogs, ExtCtrls, TntExtCtrls, StdCtrls, TntStdCtrls, ComCtrls, TntComCtrls, UniTntCtrls, ImgList,
  Menus, TntMenus, Placemnt, VirtualTrees;

type
  TfrmSelContact = class(TTntForm)
    Label1: TTntLabel;
    TntListView1: TTntListView;
    AddButton: TTntButton;
    SelectedList: TTntListView;
    Label2: TTntLabel;
    RemButton: TTntButton;
    OkButton: TTntButton;
    CancelButton: TTntButton;
    TntEdit1: TTntEdit;
    Label3: TTntLabel;
    ComboBox1: TTntComboBox;
    ClearButton: TTntButton;
    ImageList1: TImageList;
    CheckBox1: TTntCheckBox;
    PopupMenu1: TTntPopupMenu;
    NewContact1: TTntMenuItem;
    N1: TTntMenuItem;
    Properties1: TTntMenuItem;
    FormStorage1: TFormStorage;
    NoItemsPanel: TTntPanel;
    Animate1: TAnimate;
    Timer1: TTimer;
    procedure TntListView1SelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    procedure SelectedListSelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    procedure RemButtonClick(Sender: TObject);
    procedure AddButtonClick(Sender: TObject);
    procedure TntEdit1Change(Sender: TObject);
    procedure TntListView1DblClick(Sender: TObject);
    procedure ClearButtonClick(Sender: TObject);
    procedure TntListView1Insert(Sender: TObject; Item: TListItem);
    procedure Properties1Click(Sender: TObject);
    procedure NewContact1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure OkButtonClick(Sender: TObject);
    procedure PopupMenu1Popup(Sender: TObject);
  private
    { Private declarations }
    FAllowSIM,FAllowNoNumbers,FSelProcessed: boolean;
    FSelection: WideString;
    FAllowGroups: boolean;
    function Get_Sel: WideString;
    function Get_MultiSelect: boolean;
    procedure Set_MultiSelect(const Value: boolean);
    procedure Set_AllowSIM(const Value: boolean);
    procedure DoSanityCheck;
  protected
    { Protected declarations }
    procedure DoAddContact(Node: TTntListItem);
    procedure DoUpdateContacts(Mask: WideString = '');
    procedure DoProcessSelection; virtual;
    procedure DoSelectDefaultItem; virtual;
  public
    { Public declarations }
    property AllowGroups: boolean read FAllowGroups write FAllowGroups;
    property AllowNoNumbers: boolean read FAllowNoNumbers write FAllowNoNumbers;
    property AllowSIMContacts: boolean read FAllowSIM write Set_AllowSIM;
    property AllowMultiSelect: boolean read Get_MultiSelect write Set_MultiSelect;

    property SelContacts: WideString read Get_Sel write FSelection;
  end;

var
  frmSelContact: TfrmSelContact;

implementation

uses
  gnugettext, gnugettexthelpers,
  uSyncPhonebook, uMissedCalls, Unit1, uSIMEdit, uDialogs;

{$R *.dfm}

procedure TfrmSelContact.TntListView1SelectItem(Sender: TObject;
  Item: TListItem; Selected: Boolean);
begin
  AddButton.Enabled := (TntListView1.SelCount <> 0) and
    (AllowMultiSelect or (SelectedList.Items.Count = 0));
  Properties1.Enabled := (TntListView1.SelCount = 1) and
    (TntListView1.Selected.ImageIndex = 0); // only for contacts
end;

procedure TfrmSelContact.SelectedListSelectItem(Sender: TObject;
  Item: TListItem; Selected: Boolean);
begin
  RemButton.Enabled := Selected;
end;

procedure TfrmSelContact.RemButtonClick(Sender: TObject);
var
  i: integer;
begin
  for i := SelectedList.Items.Count-1 downto 0 do
    if SelectedList.Items[i].Selected then
      SelectedList.Items[i].Delete;
end;

procedure TfrmSelContact.AddButtonClick(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to TntListView1.Items.Count-1 do
    if TntListView1.Items[i].Selected then
      DoAddContact(TntListView1.Items[i]);
end;

procedure TfrmSelContact.TntEdit1Change(Sender: TObject);
begin
  Timer1.Enabled := False;
  Timer1.Enabled := True;
end;

procedure TfrmSelContact.DoUpdateContacts(Mask: WideString);
const
  Sem: boolean = False;
var
  root, node, node2: PVirtualNode;
  EData: PFmaExplorerNode;
  nme,tel,grp: WideString;
begin
  if Sem then begin
    Timer1.Enabled := True;
    exit;
  end;
  Sem := True;
  try
    case ComboBox1.ItemIndex of
      0: root := Form1.FNodeContactsME;
      1: root := Form1.FNodeContactsSM;
      else exit; // just in case
    end;
    Mask := WideUpperCase(Mask);
    TntListView1.Items.BeginUpdate;
    try
      { Clear view }
      TntListView1.Items.Clear;
      TntListView1.Items.EndUpdate;
      NoItemsPanel.Visible := False;
      Animate1.Color := clWindow;
      Animate1.Visible := True;
      Animate1.Active := True;
      Update;
      TntListView1.Items.BeginUpdate;
      { Build list }
      if AllowGroups and AllowMultiSelect and (ComboBox1.ItemIndex = 0) then
      begin
        node := Form1.ExplorerNew.GetFirstChild(Form1.FNodeGroups);
        while node <> nil do begin
          EData := Form1.ExplorerNew.GetNodeData(node);
          nme := EData.Text;
          if (Mask = '') or (Pos(Mask,WideUpperCase(nme)) <> 0) then begin
            tel := '';
            node2 := Form1.ExplorerNew.GetFirstChild(node);
            while node2<>nil do begin
              if length(tel) <> 0 then tel := tel + ',';
              EData := Form1.ExplorerNew.GetNodeData(node2);
              grp := EData.Text;
              { quote group member name which contains the delimiter char }
              if pos(',',grp) <> 0 then grp := '"'+grp+'"';
              tel := tel + grp;
              node2 := Form1.ExplorerNew.GetNextSibling(node2);
            end;
            with TntListView1.Items.Add do begin
              Caption := nme;
              SubItems.Add(tel);
              ImageIndex := 1;
              //StateIndex := -1;
            end;
          end;
          node := Form1.ExplorerNew.GetNextSibling(node);
        end;
      end;

      node := Form1.ExplorerNew.GetFirstChild(root);
      while node<>nil do begin
        EData := Form1.ExplorerNew.GetNodeData(node);
        nme := EData.Text;
        if (Mask = '') or (Pos(Mask,WideUpperCase(nme)) <> 0) then begin
          node2 := Form1.ExplorerNew.GetFirstChild(node);
          while node2<>nil do begin
            EData := Form1.ExplorerNew.GetNodeData(node2);
            if not CheckBox1.Enabled or not CheckBox1.Checked or
              (EData.ImageIndex = 10) then
              begin
                tel := EData.Text;
                with TntListView1.Items.Add do begin
                  Caption := nme;
                  SubItems.Add(tel);
                  ImageIndex := 0;
                  StateIndex := EData.ImageIndex;
                end;
              end;
            node2 := Form1.ExplorerNew.GetNextSibling(node2);
          end;
          { Allow contact without numbers if selecting from Phonebook only
            (see "Add To Phonebook" for details) }
          if FAllowNoNumbers and (root.ChildCount = 0) then
            with TntListView1.Items.Add do begin
              Caption := nme;
              SubItems.Add(''); // no phone
              ImageIndex := 0;
              //StateIndex := -1;
            end;
        end;
        node := Form1.ExplorerNew.GetNextSibling(node);
        Application.ProcessMessages;
      end;
    finally
      TntListView1.Items.EndUpdate;
    end;
    if not FSelProcessed then begin
      DoProcessSelection;
      DoSelectDefaultItem;
      FSelProcessed := True;
    end;
  finally
    Animate1.Visible := False;
    Animate1.Active := False;
    NoItemsPanel.Visible := TntListView1.Items.Count = 0;
    Sem := False;
  end;
end;

procedure TfrmSelContact.TntListView1DblClick(Sender: TObject);
begin
  if TntListView1.Selected <> nil then AddButton.Click;
end;

procedure TfrmSelContact.ClearButtonClick(Sender: TObject);
begin
  //if MessageDlgW(_('Clear all recipients?'),mtConfirmation,MB_YESNO) = ID_YES then
    SelectedList.Clear;
end;

function TfrmSelContact.get_Sel: WideString;
var
  i: integer;
  tel: WideString;
begin
  Result := '';
  for i := 0 to SelectedList.Items.Count-1 do begin
    if Result <> '' then Result := Result + '; ';
    if SelectedList.Items[i].ImageIndex = 0 then begin
      tel := SelectedList.Items[i].SubItems[0];
      if SelectedList.Items[i].Caption <> '' then begin
        if tel <> '' then
          Result := Result + SelectedList.Items[i].Caption + ' [' + tel + ']'
        else
          Result := Result + SelectedList.Items[i].Caption;
      end
      else
        Result := Result + tel;
    end
    else
      Result := Result + SelectedList.Items[i].Caption + ' {' + SelectedList.Items[i].SubItems[0] + '}'
  end;
end;

procedure TfrmSelContact.TntListView1Insert(Sender: TObject;
  Item: TListItem);
begin
  Item.ImageIndex := 0;
end;

procedure TfrmSelContact.Properties1Click(Sender: TObject);
var
  ContactME: PContactData;
  ContactSM: PSIMData;
  Edited: boolean;
begin
  Edited := False;
  case ComboBox1.ItemIndex of
    0: // Phonebook
       if Form1.IsIrmcSyncEnabled then begin
         if Form1.frmSyncPhonebook.FindContact(TntListView1.Selected.Caption,ContactME) then
           with Form1.frmSyncPhonebook do begin
             SelContact := ContactME;
             Edited := DoEdit;
           end;
       end
       else begin
         if Form1.frmMEEdit.FindContact(TntListView1.Selected.Caption,ContactSM) then
           with Form1.frmMEEdit do begin
             SelContact := ContactSM;
             Edited := DoEdit;

⌨️ 快捷键说明

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