Ignore:
Timestamp:
Dec 15, 2021, 8:56:06 PM (2 years ago)
Author:
chronos
Message:
  • Added: Find dialog to search text value by given contact field or by any field.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Forms/UFormContacts.pas

    r74 r76  
    6464    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    6565    procedure FormCreate(Sender: TObject);
     66    procedure FormDestroy(Sender: TObject);
     67    procedure FormResize(Sender: TObject);
    6668    procedure FormShow(Sender: TObject);
    6769    procedure ListView1Data(Sender: TObject; Item: TListItem);
     
    8183    procedure FormContactNext(Sender: TObject);
    8284    procedure DoUpdateInterface;
     85    procedure UpdateColumns;
    8386  public
     87    ListViewColumns: TContactFieldIndexes;
     88    FilterItems: TContactFilterItems;
    8489    property Contacts: TContacts read FContacts write SetContacts;
    8590    procedure ReloadList;
     
    123128  end;
    124129
     130var
     131  I: Integer;
    125132begin
    126133  if Item.Index < ListViewSort1.List.Count then
    127134  with TContact(ListViewSort1.List[Item.Index]) do begin
    128     AddItem(Fields[cfFullName], True);
    129     AddItem(Fields[cfFirstName]);
    130     AddItem(Fields[cfMiddleName]);
    131     AddItem(Fields[cfLastName]);
    132     AddItem(Fields[cfTel]);
    133     AddItem(Fields[cfTelCell]);
    134     AddItem(Fields[cfTelHome]);
    135     AddItem(Fields[cfTelWork]);
     135    for I := 0 to ListViewColumns.Count - 1 do begin
     136      AddItem(Fields[ListViewColumns[I]], I = 0);
     137    end;
    136138    Item.Data := ListViewSort1.List[Item.Index];
    137139  end;
     
    150152
    151153procedure TFormContacts.ListViewFilter1Change(Sender: TObject);
    152 begin
     154var
     155  I: Integer;
     156begin
     157  // Load filter StringGrid cells into filter
     158  FilterItems.Clear;
     159  for I := 0 to ListViewColumns.Count - 1 do
     160    if I < ListViewFilter1.StringGrid.ColCount then
     161      if ListViewFilter1.StringGrid.Cells[I, 0] <> '' then
     162        FilterItems.AddNew(ListViewColumns[I], ListViewFilter1.StringGrid.Cells[I, 0]);
     163
    153164  ReloadList;
    154165  UpdateInterface;
     
    165176  if Assigned(Item1) and Assigned(Item2) and (ListViewSort1.Order <> soNone) then begin
    166177    with ListViewSort1 do
    167     case Column of
    168       0: Result := CompareString(TContact(Item1).Fields[cfFullName], TContact(Item2).Fields[cfFullName]);
    169       1: Result := CompareString(TContact(Item1).Fields[cfFirstName], TContact(Item2).Fields[cfFirstName]);
    170       2: Result := CompareString(TContact(Item1).Fields[cfMiddleName], TContact(Item2).Fields[cfMiddleName]);
    171       3: Result := CompareString(TContact(Item1).Fields[cfLastName], TContact(Item2).Fields[cfLastName]);
    172       4: Result := CompareString(TContact(Item1).Fields[cfTel], TContact(Item2).Fields[cfTel]);
    173       5: Result := CompareString(TContact(Item1).Fields[cfTelCell], TContact(Item2).Fields[cfTelCell]);
    174       6: Result := CompareString(TContact(Item1).Fields[cfTelHome], TContact(Item2).Fields[cfTelHome]);
    175       7: Result := CompareString(TContact(Item1).Fields[cfTelWork], TContact(Item2).Fields[cfTelWork]);
    176     end;
     178    Result := CompareString(TContact(Item1).Fields[ListViewColumns[Column]], TContact(Item2).Fields[ListViewColumns[Column]]);
    177179    if ListViewSort1.Order = soDown then Result := -Result;
    178180  end else Result := 0;
     
    191193var
    192194  I: Integer;
     195  J: Integer;
     196  K: Integer;
    193197  FoundCount: Integer;
    194   EnteredCount: Integer;
    195 begin
    196   EnteredCount := ListViewFilter1.TextEnteredCount;
     198begin
    197199  for I := List.Count - 1 downto 0 do begin
    198200    if List.Items[I] is TContact then begin
    199201      with TContact(List.Items[I]) do begin
    200          with ListViewFilter1 do
    201          if Visible and (EnteredCount > 0) then begin
    202            FoundCount := 0;
    203            if Pos(UTF8LowerCase(StringGrid.Cells[0, 0]),
    204              UTF8LowerCase(TContact(List.Items[I]).Fields[cfFullName])) > 0 then Inc(FoundCount);
    205            if Pos(UTF8LowerCase(StringGrid.Cells[1, 0]),
    206              UTF8LowerCase(TContact(List.Items[I]).Fields[cfFirstName])) > 0 then Inc(FoundCount);
    207            if Pos(UTF8LowerCase(StringGrid.Cells[2, 0]),
    208              UTF8LowerCase(TContact(List.Items[I]).Fields[cfMiddleName])) > 0 then Inc(FoundCount);
    209            if Pos(UTF8LowerCase(StringGrid.Cells[3, 0]),
    210              UTF8LowerCase(TContact(List.Items[I]).Fields[cfLastName])) > 0 then Inc(FoundCount);
    211            if Pos(UTF8LowerCase(StringGrid.Cells[4, 0]),
    212              UTF8LowerCase(TContact(List.Items[I]).Fields[cfTel])) > 0 then Inc(FoundCount);
    213            if Pos(UTF8LowerCase(StringGrid.Cells[5, 0]),
    214              UTF8LowerCase(TContact(List.Items[I]).Fields[cfTelCell])) > 0 then Inc(FoundCount);
    215            if Pos(UTF8LowerCase(StringGrid.Cells[6, 0]),
    216              UTF8LowerCase(TContact(List.Items[I]).Fields[cfTelHome])) > 0 then Inc(FoundCount);
    217            if Pos(UTF8LowerCase(StringGrid.Cells[7, 0]),
    218              UTF8LowerCase(TContact(List.Items[I]).Fields[cfTelWork])) > 0 then Inc(FoundCount);
    219            if FoundCount <> EnteredCount then List.Delete(I);
    220          end;
     202        FoundCount := 0;
     203        for J := 0 to FilterItems.Count - 1 do begin
     204          if FilterItems[J].FieldIndex = cfNone then begin
     205            for K := 0 to TContact(List.Items[I]).Parent.Fields.Count - 1 do begin
     206              if Pos(UTF8LowerCase(FilterItems[J].Value),
     207                UTF8LowerCase(TContact(List.Items[I]).Fields[TContact(List.Items[I]).Parent.Fields[K].Index])) > 0 then begin
     208                  Inc(FoundCount);
     209                  Break;
     210                end;
     211            end;
     212          end else begin
     213            if Pos(UTF8LowerCase(FilterItems[J].Value),
     214              UTF8LowerCase(TContact(List.Items[I]).Fields[FilterItems[J].FieldIndex])) > 0 then
     215                Inc(FoundCount);
     216          end;
     217        end;
     218        if FoundCount <> FilterItems.Count then List.Delete(I);
    221219      end;
    222220    end else
     
    273271  end;
    274272  StatusBar1.Panels[0].Text := Text;
     273end;
     274
     275procedure TFormContacts.UpdateColumns;
     276var
     277  I: Integer;
     278  Field: TContactField;
     279begin
     280  while ListView1.Columns.Count < ListViewColumns.Count do
     281    ListView1.Columns.Add;
     282  while ListView1.Columns.Count > ListViewColumns.Count do
     283    ListView1.Columns.Delete(ListView1.Columns.Count - 1);
     284  for I := 0 to ListView1.Columns.Count - 1 do begin
     285    if Assigned(Contacts) and Assigned(Contacts.ContactsFile) then begin
     286      Field := Contacts.ContactsFile.Fields.GetByIndex(ListViewColumns[I]);
     287      if Assigned(Field) then
     288        ListView1.Columns[I].Caption := Field.Title;
     289    end;
     290  end;
    275291end;
    276292
     
    512528begin
    513529  BeginUpdate;
    514   ListView1.BeginUpdate;
    515   for I := 0 to ListView1.Items.Count - 1 do
    516     ListView1.Items[I].Selected := True;
    517   //ListView1.SelectAll;
    518   ListView1.EndUpdate;
    519   EndUpdate;
     530  try
     531    ListView1.BeginUpdate;
     532    try
     533      for I := 0 to ListView1.Items.Count - 1 do
     534        ListView1.Items[I].Selected := True;
     535      //ListView1.SelectAll;
     536    finally
     537      ListView1.EndUpdate;
     538    end;
     539  finally
     540    EndUpdate;
     541  end;
    520542end;
    521543
     
    530552  I: Integer;
    531553begin
     554  FilterItems := TContactFilterItems.Create;
     555
     556  ListViewColumns := TContactFieldIndexes.Create;
     557  ListViewColumns.Add(cfFullName);
     558  ListViewColumns.Add(cfFirstName);
     559  ListViewColumns.Add(cfMiddleName);
     560  ListViewColumns.Add(cfLastName);
     561  ListViewColumns.Add(cfTel);
     562  ListViewColumns.Add(cfTelCell);
     563  ListViewColumns.Add(cfTelHome);
     564  ListViewColumns.Add(cfTelWork);
     565  ListViewColumns.Add(cfEmailWork);
     566
    532567  FContacts := nil;
    533568  for I := 0 to ToolBar1.ButtonCount - 1 do begin
     
    535570    ToolBar1.Buttons[I].Hint := ToolBar1.Buttons[I].Caption;
    536571  end;
     572end;
     573
     574procedure TFormContacts.FormDestroy(Sender: TObject);
     575begin
     576  FreeAndNil(ListViewColumns);
     577  FreeAndNil(FilterItems);
     578end;
     579
     580procedure TFormContacts.FormResize(Sender: TObject);
     581begin
     582  ListViewFilter1.UpdateFromListView(ListView1);
    537583end;
    538584
     
    567613  ACut.Enabled := Assigned(Contacts) and Assigned(ListView1.Selected);
    568614  APaste.Enabled := Assigned(Contacts) and (Clipboard.AsText <> '');
     615
     616  UpdateColumns;
    569617end;
    570618
Note: See TracChangeset for help on using the changeset viewer.