1 // frmSearch.cpp - Search form.
3 // (c) 2012-2015 Xestia Software Development.
5 // This file is part of Xestia Address Book.
7 // Xestia Address Book is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by the
9 // Free Software Foundation, version 3 of the license.
11 // Xestia Address Book is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Address Book. If not, see <http://www.gnu.org/licenses/>
19 #include "frmSearch.h"
21 #include "frmContact.h"
22 #include "search/XABSearchPanel.h"
23 #include "search/frmSearchAccounts.h"
24 #include "common/preferences.h"
25 #include "common/dirs.h"
26 #include "vcard/vcard.h"
29 #include <wx/fs_mem.h>
30 /*#include <boost/filesystem.hpp>
31 #include <boost/filesystem/fstream.hpp>
32 #include <boost/filesystem/path.hpp>*/
33 #include <wx/tokenzr.h>
36 DEFINE_EVENT_TYPE(SE_ADDSEARCHSETTING);
37 DEFINE_EVENT_TYPE(SE_REMOVESEARCHSETTING);
38 DEFINE_EVENT_TYPE(SE_RELOADACCOUNTS);
39 DEFINE_EVENT_TYPE(SE_ADDRESULT);
40 DEFINE_EVENT_TYPE(SE_SBUPDATE);
41 DEFINE_EVENT_TYPE(SE_SEARCHFINISHED);
42 DEFINE_EVENT_TYPE(SE_UPDATERESULT);
43 DEFINE_EVENT_TYPE(SE_DELETERESULT);
44 DEFINE_EVENT_TYPE(SE_OPENCONTACT);
45 DEFINE_EVENT_TYPE(SE_EDITCONTACT);
46 DEFINE_EVENT_TYPE(SE_REVEALCONTACT);
48 BEGIN_EVENT_TABLE(frmSearch, wxFrame)
49 EVT_COMMAND(wxID_ANY, SE_ADDSEARCHSETTING, frmSearch::AddSearchSetting)
50 EVT_COMMAND(wxID_ANY, SE_REMOVESEARCHSETTING, frmSearch::RemoveSearchSetting)
51 EVT_COMMAND(wxID_ANY, SE_RELOADACCOUNTS, frmSearch::ReloadAccountList)
52 EVT_COMMAND(wxID_ANY, SE_ADDRESULT, frmSearch::AddResult)
53 EVT_COMMAND(wxID_ANY, SE_SBUPDATE, frmSearch::SearchBarUpdate)
54 EVT_COMMAND(wxID_ANY, SE_SEARCHFINISHED, frmSearch::SearchFinished)
55 EVT_COMMAND(wxID_ANY, SE_UPDATERESULT, frmSearch::UpdateResult)
56 EVT_COMMAND(wxID_ANY, SE_DELETERESULT, frmSearch::DeleteResult)
57 EVT_COMMAND(wxID_ANY, SE_OPENCONTACT, frmSearch::OpenContact)
58 EVT_COMMAND(wxID_ANY, SE_EDITCONTACT, frmSearch::EditContact)
59 EVT_COMMAND(wxID_ANY, SE_REVEALCONTACT, frmSearch::RevealContact)
62 //namespace boostfs = boost::filesystem;
64 frmSearch::frmSearch( wxWindow* parent )
66 frmSearchADT( parent )
69 XABSearchPanel *InitPanel = new XABSearchPanel( tabSearch );
70 InitPanel->EnableButtons(TRUE, FALSE);
71 InitPanel->SetupPointers(this);
72 InitPanel->SetupInteger(ScrollGen);
73 szrSearch->Add(InitPanel, 1, wxEXPAND, 0);
74 szrSearch->Fit(tabSearch);
75 SearchFrames.insert(std::make_pair(ScrollGen, InitPanel));
78 // Get the list of accounts and mark them as true.
80 wxString preffilename = GetUserPrefDir();
82 XABPreferences preferences(preffilename);
86 wxString AccDirFullSfx;
88 for (int i = 0; i < preferences.accounts.GetCount(); i++){
89 AccDir = preferences.accounts.GetAccountDirectory(i);
90 AccDirFull = preferences.accounts.GetAccountDirectory(i);
92 AccDirFull.Append(wxT("."));
93 AccDirFullSfx.Append(preferences.accounts.GetAccountType(i));
94 AccDirFullSfx.LowerCase();
96 AccDirFull.Append(AccDirFullSfx);
97 SearchAccountsPaths.insert(std::make_pair(AccDir, AccDirFull));
98 SearchAccounts.insert(std::make_pair(AccDir, TRUE));
99 SearchAccountsNames.insert(std::make_pair(AccDir,
100 preferences.accounts.GetAccountName(i)));
102 AccDirFullSfx.clear();
106 // Setup the columns.
110 item.SetText(_("Name"));
113 lstResults->InsertColumn(0, item);
116 item.SetText(_("Nickname"));
119 lstResults->InsertColumn(1, item);
122 item.SetText(_("Account"));
125 lstResults->InsertColumn(2, item);
129 void frmSearch::SelectAccounts( wxCommandEvent& event )
132 // Create the form and display as modal.
134 frmSearchAccounts *frameSAccount = new frmSearchAccounts ( this );
135 frameSAccount->LoadSearchAccounts(&SearchAccounts, &SearchAccountsNames);
136 frameSAccount->ShowModal();
137 delete frameSAccount;
138 frameSAccount = NULL;
142 void frmSearch::SearchContactsThread(){
144 // Go through each account and find contacts based on the
147 std::map<wxString,bool>::iterator SAiter;
148 std::map<wxString,wxString>::iterator SAPiter;
149 int intResultFound = 0;
151 for (std::map<wxString, wxString>::iterator SALiter = SearchAccountsNames.begin();
152 SALiter != SearchAccountsNames.end();
155 // Double check that we are searching in this account.
156 // If not, skip to the next one.
158 SAiter = SearchAccounts.find(SALiter->first);
159 SAPiter = SearchAccountsPaths.find(SAiter->first);
162 if (SAiter->second == FALSE){
164 // Not looking in this account. Go to next account.
170 wxCommandEvent sbupdate (SE_SBUPDATE);
172 wxString *SBData = new wxString;
173 *SBData = _("Searching ") + SALiter->second + _("...");
175 sbupdate.SetClientData(SBData);
176 wxPostEvent(this, sbupdate);
178 if (StopMode == FALSE){
180 wxCommandEvent sbstop (SE_SBUPDATE);
182 wxString *SBStopStr = new wxString;
183 *SBStopStr = _("Search stopped.");
185 sbstop.SetClientData(SBStopStr);
186 wxPostEvent(this, sbstop);
191 // Get the list of contact files and process each
194 wxString AccountDir = GetAccountDir(SAPiter->second, FALSE);
196 //boostfs::path vcarddir(AccountDir.c_str());
197 //boostfs::directory_iterator dir_end;
199 //boostfs::path vcardfilename;
200 wxString vcardfilenamewxs;
201 wxStringTokenizer vcardfileline;
204 wxString setname, setvalue;
205 long ContactIndex = 1;
206 long ContactSeekPoint = 0;
207 wxString vCardFilename;
208 wxString vCardFilenameFull;
210 //if (boostfs::exists(vcarddir)){
211 if (wxDirExists(AccountDir)){
213 wxDir vcardaccdir(AccountDir);
215 bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES);
217 //for (boostfs::directory_iterator vcarddir_iter(vcarddir);
218 // vcarddir_iter != dir_end ; ++vcarddir_iter){
220 if (StopMode == FALSE){
222 wxCommandEvent sbstop(SE_SBUPDATE);
224 wxString *SBStopStr = new wxString;
225 *SBStopStr = _("Search stopped.");
227 sbstop.SetClientData(SBStopStr);
228 wxPostEvent(this, sbstop);
233 if (vCardFilename.Right(4) == wxT(".vcf") ||
234 vCardFilename.Right(4) == wxT(".VCF") ||
235 vCardFilename.Right(5) == wxT(".vcard") ||
236 vCardFilename.Right(5) == wxT(".VCARD")){
239 vCardFilenameFull.Append(AccountDir);
240 vCardFilenameFull.Append(vCardFilename);
243 Person.LoadFile(vCardFilenameFull);
245 /*if (boostfs::path(vcarddir_iter->path()).extension() == ".vcf" ||
246 boostfs::path(vcarddir_iter->path()).extension() == ".VCF" ||
247 boostfs::path(vcarddir_iter->path()).extension() == ".vcard" ||
248 boostfs::path(vcarddir_iter->path()).extension() == ".VCARD"){*/
250 vcardfilenamewxs = vCardFilenameFull;
253 std::fstream vcardfile;
255 vcardfilename = boostfs::path(vcarddir_iter->path()).filename();
256 vcardfilenamewxs.Append(AccountDir);
257 vcardfilenamewxs.Append(wxString::FromUTF8(vcardfilename.c_str()));
259 // Open the vCard file up and get the setting names and values from the
262 vcardfile.open(vcardfilenamewxs.mb_str(), std::ios::in);
264 while(getline(vcardfile, l)){
269 lwxs.Append(wxString::FromUTF8(l.c_str()));
270 vcardfileline.SetString(lwxs, wxT(":"));
271 setname = vcardfileline.GetNextToken();
272 setvalue = vcardfileline.GetString();
274 Person.Add(setname, setvalue, TRUE);
280 // Check if file has version 4.0, first name (FN)
281 // begin and end vCard portions.
283 // Don't search unless these conditions have been met.
285 if (Person.MeetBaseSpecification()){
287 // Go through each of the search settings and check
288 // if they match with contact details.
290 // If it matches then add to the search results.
296 ArrayvCardOutData ArrayData;
297 ArrayvCardOutData NicknameArrayData;
298 vCardName NameArray = Person.GetName();
299 wxString ContactFinalNickname;
300 NicknameArrayData = Person.GetByPartial(wxT("NICKNAME"));
302 if (NicknameArrayData.PropCount != 0){
303 ContactFinalNickname = NicknameArrayData.PropValues[0];
306 for (std::map<int, void*>::iterator siter = SearchFrames.begin();
307 siter != SearchFrames.end(); siter++){
309 // Get the settings from the form.
311 XABSearchPanel *XABSPPtr = static_cast<XABSearchPanel*>(siter->second);
313 // Get Selected Option and Setting.
315 SelOpt = XABSPPtr->GetSelectionOption();
319 StrOpt = XABSPPtr->GetStringSetting();
320 StrOptLen = StrOpt.Len();
322 if (SelOpt == 0 || SelOpt == 4 || SelOpt == 8){
324 // Matching string that beings with...
326 // Double check the std::map inserts for each section.
330 // Get the forename from the first N.
332 if (NameArray.Forename.Mid(0, StrOptLen) == StrOpt){
334 if (CheckDuplicate(vcardfilenamewxs,
336 &SearchResultAccount,
337 &SearchResultFilename) == TRUE){
343 ArrayData.PropData.Clear();
344 ArrayData.PropValues.Clear();
345 ArrayData.PropCount = 0;
350 SRNotif *sradd = new SRNotif;
351 sradd->ContactName = NameArray;
352 sradd->ContactNickname = ContactFinalNickname;
353 sradd->ContactAccount = SAPiter->second;
354 sradd->ContactAccountName = SALiter->second;
355 sradd->ContactFullFilename = vcardfilenamewxs;
356 sradd->SearchResultID = intResultFound;
358 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
359 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
363 wxCommandEvent sraddenv(SE_ADDRESULT);
364 sraddenv.SetClientData(sradd);
365 wxPostEvent(this, sraddenv);
369 } else if (SelOpt == 4){
371 if (NameArray.Surname.Mid(0, StrOptLen) == StrOpt){
373 if (CheckDuplicate(vcardfilenamewxs,
375 &SearchResultAccount,
376 &SearchResultFilename) == TRUE){
382 ArrayData.PropData.Clear();
383 ArrayData.PropValues.Clear();
384 ArrayData.PropCount = 0;
389 SRNotif *sradd = new SRNotif;
390 sradd->ContactName = NameArray;
391 sradd->ContactNickname = ContactFinalNickname;
392 sradd->ContactAccount = SAPiter->second;
393 sradd->ContactAccountName = SALiter->second;
394 sradd->ContactFullFilename = vcardfilenamewxs;
395 sradd->SearchResultID = intResultFound;
397 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
398 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
402 wxCommandEvent sraddenv(SE_ADDRESULT);
403 sraddenv.SetClientData(sradd);
404 wxPostEvent(this, sraddenv);
408 } else if (SelOpt == 8){
410 wxString NicknameData;
412 for (int i = 0; i < NicknameArrayData.PropCount; i++){
414 NicknameData = NicknameArrayData.PropValues[i];
416 if (NicknameData.Mid(0, StrOptLen) == StrOpt){
418 if (CheckDuplicate(vcardfilenamewxs,
420 &SearchResultAccount,
421 &SearchResultFilename) == TRUE){
427 ArrayData.PropData.Clear();
428 ArrayData.PropValues.Clear();
429 ArrayData.PropCount = 0;
434 SRNotif *sradd = new SRNotif;
435 sradd->ContactName = NameArray;
436 sradd->ContactNickname = ContactFinalNickname;
437 sradd->ContactAccount = SAPiter->second;
438 sradd->ContactAccountName = SALiter->second;
439 sradd->ContactFullFilename = vcardfilenamewxs;
440 sradd->SearchResultID = intResultFound;
442 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
443 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
447 wxCommandEvent sraddenv(SE_ADDRESULT);
448 sraddenv.SetClientData(sradd);
449 wxPostEvent(this, sraddenv);
459 } else if (SelOpt == 1 || SelOpt == 5 || SelOpt == 9){
461 // Matching string that ends with...
465 // Check the forename.
467 if (NameArray.Forename.Right(StrOptLen) == StrOpt){
469 if (CheckDuplicate(vcardfilenamewxs,
471 &SearchResultAccount,
472 &SearchResultFilename) == TRUE){
478 ArrayData.PropData.Clear();
479 ArrayData.PropValues.Clear();
480 ArrayData.PropCount = 0;
485 SRNotif *sradd = new SRNotif;
486 sradd->ContactName = NameArray;
487 sradd->ContactNickname = ContactFinalNickname;
488 sradd->ContactAccount = SAPiter->second;
489 sradd->ContactAccountName = SALiter->second;
490 sradd->ContactFullFilename = vcardfilenamewxs;
491 sradd->SearchResultID = intResultFound;
493 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
494 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
498 wxCommandEvent sraddenv(SE_ADDRESULT);
499 sraddenv.SetClientData(sradd);
500 wxPostEvent(this, sraddenv);
504 } else if (SelOpt == 5){
506 if (NameArray.Surname.Right(StrOptLen) == StrOpt){
508 if (CheckDuplicate(vcardfilenamewxs,
510 &SearchResultAccount,
511 &SearchResultFilename) == TRUE){
517 ArrayData.PropData.Clear();
518 ArrayData.PropValues.Clear();
519 ArrayData.PropCount = 0;
524 SRNotif *sradd = new SRNotif;
525 sradd->ContactName = NameArray;
526 sradd->ContactNickname = ContactFinalNickname;
527 sradd->ContactAccount = SAPiter->second;
528 sradd->ContactAccountName = SALiter->second;
529 sradd->ContactFullFilename = vcardfilenamewxs;
530 sradd->SearchResultID = intResultFound;
532 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
533 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
537 wxCommandEvent sraddenv(SE_ADDRESULT);
538 sraddenv.SetClientData(sradd);
539 wxPostEvent(this, sraddenv);
543 } else if (SelOpt == 9){
545 wxString NicknameData;
547 for (int i = 0; i < NicknameArrayData.PropCount; i++){
549 NicknameData = NicknameArrayData.PropValues[i];
552 if (NicknameData.Right(StrOptLen) == StrOpt){
554 if (CheckDuplicate(vcardfilenamewxs,
556 &SearchResultAccount,
557 &SearchResultFilename) == TRUE){
563 ArrayData.PropData.Clear();
564 ArrayData.PropValues.Clear();
565 ArrayData.PropCount = 0;
570 SRNotif *sradd = new SRNotif;
571 sradd->ContactName = NameArray;
572 sradd->ContactNickname = ContactFinalNickname;
573 sradd->ContactAccount = SAPiter->second;
574 sradd->ContactAccountName = SALiter->second;
575 sradd->ContactFullFilename = vcardfilenamewxs;
576 sradd->SearchResultID = intResultFound;
578 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
579 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
583 wxCommandEvent sraddenv(SE_ADDRESULT);
584 sraddenv.SetClientData(sradd);
585 wxPostEvent(this, sraddenv);
595 } else if (SelOpt == 2 || SelOpt == 6 || SelOpt == 10){
597 // Matching string that contains...
601 if (NameArray.Forename.Find(StrOpt) != wxNOT_FOUND){
603 if (CheckDuplicate(vcardfilenamewxs,
605 &SearchResultAccount,
606 &SearchResultFilename) == TRUE){
612 ArrayData.PropData.Clear();
613 ArrayData.PropValues.Clear();
614 ArrayData.PropCount = 0;
619 SRNotif *sradd = new SRNotif;
620 sradd->ContactName = NameArray;
621 sradd->ContactNickname = ContactFinalNickname;
622 sradd->ContactAccount = SAPiter->second;
623 sradd->ContactAccountName = SALiter->second;
624 sradd->ContactFullFilename = vcardfilenamewxs;
625 sradd->SearchResultID = intResultFound;
627 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
628 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
632 wxCommandEvent sraddenv(SE_ADDRESULT);
633 sraddenv.SetClientData(sradd);
634 wxPostEvent(this, sraddenv);
638 } else if (SelOpt == 6){
640 if (NameArray.Surname.Find(StrOpt) != wxNOT_FOUND){
642 if (CheckDuplicate(vcardfilenamewxs,
644 &SearchResultAccount,
645 &SearchResultFilename) == TRUE){
651 ArrayData.PropData.Clear();
652 ArrayData.PropValues.Clear();
653 ArrayData.PropCount = 0;
658 SRNotif *sradd = new SRNotif;
659 sradd->ContactName = NameArray;
660 sradd->ContactNickname = ContactFinalNickname;
661 sradd->ContactAccount = SAPiter->second;
662 sradd->ContactAccountName = SALiter->second;
663 sradd->ContactFullFilename = vcardfilenamewxs;
664 sradd->SearchResultID = intResultFound;
666 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
667 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
671 wxCommandEvent sraddenv(SE_ADDRESULT);
672 sraddenv.SetClientData(sradd);
673 wxPostEvent(this, sraddenv);
677 } else if (SelOpt == 10){
679 wxString NicknameData;
681 for (int i = 0; i < NicknameArrayData.PropCount; i++){
683 NicknameData = NicknameArrayData.PropValues[i];
686 if (NicknameData.Find(StrOpt) != wxNOT_FOUND){
688 if (CheckDuplicate(vcardfilenamewxs,
690 &SearchResultAccount,
691 &SearchResultFilename) == TRUE){
697 ArrayData.PropData.Clear();
698 ArrayData.PropValues.Clear();
699 ArrayData.PropCount = 0;
704 SRNotif *sradd = new SRNotif;
705 sradd->ContactName = NameArray;
706 sradd->ContactNickname = ContactFinalNickname;
707 sradd->ContactAccount = SAPiter->second;
708 sradd->ContactAccountName = SALiter->second;
709 sradd->ContactFullFilename = vcardfilenamewxs;
710 sradd->SearchResultID = intResultFound;
712 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
713 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
717 wxCommandEvent sraddenv(SE_ADDRESULT);
718 sraddenv.SetClientData(sradd);
719 wxPostEvent(this, sraddenv);
729 } else if (SelOpt == 3 || SelOpt == 7 || SelOpt == 11){
731 // Matching String that doesn't contain...
735 // Process the nickname data.
737 if (NameArray.Forename.Find(StrOpt) == wxNOT_FOUND){
739 if (CheckDuplicate(vcardfilenamewxs,
741 &SearchResultAccount,
742 &SearchResultFilename) == TRUE){
748 ArrayData.PropData.Clear();
749 ArrayData.PropValues.Clear();
750 ArrayData.PropCount = 0;
755 SRNotif *sradd = new SRNotif;
756 sradd->ContactName = NameArray;
757 sradd->ContactNickname = ContactFinalNickname;
758 sradd->ContactAccount = SAPiter->second;
759 sradd->ContactAccountName = SALiter->second;
760 sradd->ContactFullFilename = vcardfilenamewxs;
761 sradd->SearchResultID = intResultFound;
763 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
764 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
768 wxCommandEvent sraddenv(SE_ADDRESULT);
769 sraddenv.SetClientData(sradd);
770 wxPostEvent(this, sraddenv);
774 } else if (SelOpt == 7){
776 if (!NameArray.Surname.Find(StrOpt) == wxNOT_FOUND){
778 if (CheckDuplicate(vcardfilenamewxs,
780 &SearchResultAccount,
781 &SearchResultFilename) == TRUE){
787 ArrayData.PropData.Clear();
788 ArrayData.PropValues.Clear();
789 ArrayData.PropCount = 0;
794 SRNotif *sradd = new SRNotif;
795 sradd->ContactName = NameArray;
796 sradd->ContactNickname = ContactFinalNickname;
797 sradd->ContactAccount = SAPiter->second;
798 sradd->ContactAccountName = SALiter->second;
799 sradd->ContactFullFilename = vcardfilenamewxs;
800 sradd->SearchResultID = intResultFound;
802 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
803 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
807 wxCommandEvent sraddenv(SE_ADDRESULT);
808 sraddenv.SetClientData(sradd);
809 wxPostEvent(this, sraddenv);
813 } else if (SelOpt == 11){
815 wxString NicknameData;
817 for (int i = 0; i < NicknameArrayData.PropCount; i++){
819 NicknameData = NicknameArrayData.PropValues[i];
822 if (NicknameData.Find(StrOpt) == wxNOT_FOUND){
824 if (CheckDuplicate(vcardfilenamewxs,
826 &SearchResultAccount,
827 &SearchResultFilename) == TRUE){
833 ArrayData.PropData.Clear();
834 ArrayData.PropValues.Clear();
835 ArrayData.PropCount = 0;
840 SRNotif *sradd = new SRNotif;
841 sradd->ContactName = NameArray;
842 sradd->ContactNickname = ContactFinalNickname;
843 sradd->ContactAccount = SAPiter->second;
844 sradd->ContactAccountName = SALiter->second;
845 sradd->ContactFullFilename = vcardfilenamewxs;
846 sradd->SearchResultID = intResultFound;
848 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
849 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
853 wxCommandEvent sraddenv(SE_ADDRESULT);
854 sraddenv.SetClientData(sradd);
855 wxPostEvent(this, sraddenv);
869 chkOpt = XABSPPtr->GetCheckboxSetting();
873 // Search should check if it has a photo or not.
875 ArrayData = Person.GetByPartial(wxT("PHOTO"));
877 if ((ArrayData.PropCount >= 1 &&
879 (ArrayData.PropCount == 0 &&
882 if (CheckDuplicate(vcardfilenamewxs,
884 &SearchResultAccount,
885 &SearchResultFilename) == TRUE){
891 ArrayData.PropData.Clear();
892 ArrayData.PropValues.Clear();
893 ArrayData.PropCount = 0;
898 SRNotif *sradd = new SRNotif;
900 sradd->ContactName = NameArray;
901 sradd->ContactNickname = ContactFinalNickname;
902 sradd->ContactAccount = SAPiter->second;
903 sradd->ContactAccountName = SALiter->second;
904 sradd->ContactFullFilename = vcardfilenamewxs;
905 sradd->SearchResultID = intResultFound;
907 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
908 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
912 wxCommandEvent sraddenv(SE_ADDRESULT);
913 sraddenv.SetClientData(sradd);
914 wxPostEvent(this, sraddenv);
918 } else if (SelOpt == 13){
920 // Search should check if it has a logo or not.
922 ArrayData = Person.GetByPartial(wxT("LOGO"));
924 if ((ArrayData.PropCount >= 1 &&
926 (ArrayData.PropCount == 0 &&
929 if (CheckDuplicate(vcardfilenamewxs,
931 &SearchResultAccount,
932 &SearchResultFilename) == TRUE){
938 ArrayData.PropData.Clear();
939 ArrayData.PropValues.Clear();
940 ArrayData.PropCount = 0;
945 SRNotif *sradd = new SRNotif;
947 sradd->ContactName = NameArray;
948 sradd->ContactNickname = ContactFinalNickname;
949 sradd->ContactAccount = SAPiter->second;
950 sradd->ContactAccountName = SALiter->second;
951 sradd->ContactFullFilename = vcardfilenamewxs;
952 sradd->SearchResultID = intResultFound;
954 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
955 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
959 wxCommandEvent sraddenv(SE_ADDRESULT);
960 sraddenv.SetClientData(sradd);
961 wxPostEvent(this, sraddenv);
965 } else if (SelOpt == 14){
967 // Search should check if it has sound or not.
969 ArrayData = Person.GetByPartial(wxT("SOUND"));
971 if ((ArrayData.PropCount >= 1 &&
973 (ArrayData.PropCount == 0 &&
976 if (CheckDuplicate(vcardfilenamewxs,
978 &SearchResultAccount,
979 &SearchResultFilename) == TRUE){
985 ArrayData.PropData.Clear();
986 ArrayData.PropValues.Clear();
987 ArrayData.PropCount = 0;
992 SRNotif *sradd = new SRNotif;
994 sradd->ContactName = NameArray;
995 sradd->ContactNickname = ContactFinalNickname;
996 sradd->ContactAccount = SAPiter->second;
997 sradd->ContactAccountName = SALiter->second;
998 sradd->ContactFullFilename = vcardfilenamewxs;
999 sradd->SearchResultID = intResultFound;
1001 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
1002 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
1006 wxCommandEvent sraddenv(SE_ADDRESULT);
1007 sraddenv.SetClientData(sradd);
1008 wxPostEvent(this, sraddenv);
1020 ArrayData.PropData.Clear();
1021 ArrayData.PropValues.Clear();
1022 ArrayData.PropCount = 0;
1032 vCardFilename.Clear();
1033 vCardFilenameFull.Clear();
1034 ProcFiles = vcardaccdir.GetNext(&vCardFilename);
1044 // Finished searching... clear up.
1046 wxCommandEvent sbfinstr (SE_SBUPDATE);
1048 wxString *SBFinish = new wxString;
1050 if (intResultFound == 0){
1052 *SBFinish = _("No contacts found.");
1054 } else if (intResultFound == 1){
1056 *SBFinish = _("1 contact found.");
1060 *SBFinish = wxString::Format(wxT("%i"), intResultFound) + _(" contacts found.");
1064 sbfinstr.SetClientData(SBFinish);
1065 wxPostEvent(this, sbfinstr);
1067 wxCommandEvent sbfinish (SE_SEARCHFINISHED);
1068 wxPostEvent(this, sbfinish);
1072 void frmSearch::SearchContacts( wxCommandEvent& event )
1075 // Change the button to stop.
1077 if (StopMode == FALSE){
1079 // Clear the list of search results.
1081 lstResults->DeleteAllItems();
1082 SearchResultAccount.clear();
1083 SearchResultFilename.clear();
1085 // Button clicked on as 'Search'.
1087 DisableAllSearchSettings(TRUE);
1089 btnSearch->SetLabel(_("Stop"));
1091 // Spawn a thread so that searching can proceed
1092 // without blocking the GUI (and allow the
1093 // search to stop when needed).
1095 std::thread SearchThread(&frmSearch::SearchContactsThread, this);
1096 SearchThread.detach();
1100 // Button clicked on as 'Stop'.
1103 btnSearch->SetLabel(_("Search"));
1104 DisableAllSearchSettings(FALSE);
1110 void frmSearch::ResetContacts( wxCommandEvent& event )
1113 // Clear all the search settings.
1115 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1116 iter != SearchFrames.end(); ++iter){
1118 XABSearchPanel *XABSPPtr;
1120 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1121 szrSearch->Detach(XABSPPtr);
1123 // Remove the frame from the memory and the list.
1128 SearchFrames.erase(iter->first);
1132 // Clear the list of search results.
1134 lstResults->DeleteAllItems();
1136 // Clear the account settings.
1138 for (std::map<wxString, bool>::iterator iter = SearchAccounts.begin();
1139 iter != SearchAccounts.end(); iter++){
1141 iter->second = TRUE;
1145 // Add a search settings with the default things.
1149 XABSearchPanel *NewPanel = new XABSearchPanel( tabSearch );
1150 NewPanel->EnableButtons(TRUE, FALSE);
1151 NewPanel->SetupPointers(this);
1152 NewPanel->SetupInteger(ScrollGen);
1153 szrSearch->Add(NewPanel, 1, wxEXPAND, 0);
1154 szrSearch->Fit(tabSearch);
1155 SearchFrames.insert(std::make_pair(ScrollGen, NewPanel));
1160 void frmSearch::AddSearchSetting( wxCommandEvent& event )
1163 // Add a search setting frame to the list.
1165 XABSearchPanel *NewPanel = new XABSearchPanel( tabSearch );
1166 NewPanel->EnableButtons(TRUE, TRUE);
1167 NewPanel->SetupPointers(this);
1168 NewPanel->SetupInteger(ScrollGen);
1169 szrSearch->Add(NewPanel, 1, wxEXPAND|wxGROW, 5);
1170 //szrSearch->Fit(tabSearch);
1171 szrSearch->FitInside(tabSearch);
1172 szrSearch->Layout();
1173 szrSearch->RecalcSizes();
1174 tabSearch->Layout();
1175 SearchFrames.insert(std::make_pair(ScrollGen, NewPanel));
1178 // Check if number of search settings is 15 (or over).
1179 // If it is, disable the option of adding extra settings
1180 // for all frames until one is removed.
1182 XABSearchPanel *XABSPPtr;
1184 if (SearchFrames.size() >= 15){
1186 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1187 iter != SearchFrames.end(); ++iter){
1189 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1191 XABSPPtr->EnableButtons(FALSE, TRUE);
1195 } else if (SearchFrames.size() >= 2){
1197 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1198 iter != SearchFrames.end(); ++iter){
1200 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1202 XABSPPtr->EnableButtons(TRUE, TRUE);
1208 //tabSearch->SetScrollbar(wxVERTICAL, 32768, 25, 32768, false);
1209 tabSearch->Update();
1210 //tabSearch->ScrollToLine(tabSearch->GetLineCount());
1214 void frmSearch::RemoveSearchSetting( wxCommandEvent& event )
1217 // Get the integer from the event.
1219 std::map<int,void*>::iterator iter;
1220 iter = SearchFrames.find(event.GetInt());
1222 // Remove a search setting frame from the list.
1224 XABSearchPanel *XABSPPtr;
1225 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1227 szrSearch->Detach(XABSPPtr);
1229 // Remove the frame from the memory and the list.
1231 SearchFrames.erase(event.GetInt());
1236 //szrSearch->Fit(tabSearch);
1238 if (SearchFrames.size() < 15 && SearchFrames.size() > 1){
1240 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1241 iter != SearchFrames.end(); ++iter){
1243 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1245 XABSPPtr->EnableButtons(TRUE, TRUE);
1249 } else if (SearchFrames.size() == 1){
1251 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1252 iter != SearchFrames.end(); ++iter){
1254 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1256 XABSPPtr->EnableButtons(TRUE, FALSE);
1262 szrSearch->FitInside(tabSearch);
1263 szrSearch->Layout();
1264 szrSearch->RecalcSizes();
1265 tabSearch->Layout();
1269 void frmSearch::ReloadAccountList( wxCommandEvent& event ){
1271 // Currently unimplemented.
1275 void frmSearch::AddResult( wxCommandEvent& event ){
1277 SRNotif *srnotif = (SRNotif*)event.GetClientData();
1279 // Process Data and add to the list of results.
1283 // Setup the contact name.
1285 wxString ContactNameFinal;
1287 if (!srnotif->ContactName.Title.IsEmpty()){
1289 ContactNameFinal.append(srnotif->ContactName.Title);
1290 ContactNameFinal.Trim();
1291 ContactNameFinal.append(wxT(" "));
1295 if (!srnotif->ContactName.Forename.IsEmpty()){
1297 ContactNameFinal.append(srnotif->ContactName.Forename);
1298 ContactNameFinal.Trim();
1299 ContactNameFinal.append(wxT(" "));
1303 if (!srnotif->ContactName.Surname.IsEmpty()){
1305 ContactNameFinal.append(srnotif->ContactName.Surname);
1306 ContactNameFinal.Trim();
1307 ContactNameFinal.append(wxT(" "));
1311 if (!srnotif->ContactName.Suffix.IsEmpty()){
1313 ContactNameFinal.append(srnotif->ContactName.Suffix);
1314 ContactNameFinal.Trim();
1319 item.SetText(ContactNameFinal);
1320 item.SetData(srnotif->SearchResultID);
1322 long ListCtrlIndex = lstResults->InsertItem(item);
1324 //SearchResultAccount.insert(std::make_pair(srnotif->SearchResultID, srnotif->ContactAccount));
1325 //SearchResultFilename.insert(std::make_pair(srnotif->SearchResultID, srnotif->ContactFullFilename));
1327 srnotif->ContactNickname.Trim();
1329 lstResults->SetItem(ListCtrlIndex, 1, srnotif->ContactNickname);
1330 lstResults->SetItem(ListCtrlIndex, 2, srnotif->ContactAccountName);
1337 void frmSearch::SearchBarUpdate( wxCommandEvent& event ){
1339 wxString *SBData = (wxString*)event.GetClientData();
1341 stbBottom->SetStatusText(*SBData, 0);
1348 void frmSearch::SearchFinished( wxCommandEvent& event ){
1351 btnSearch->SetLabel(_("Search"));
1352 DisableAllSearchSettings(FALSE);
1356 void frmSearch::DisableAllSearchSettings(bool Enable){
1358 for (std::map<int, void*>::iterator siter = SearchFrames.begin();
1359 siter != SearchFrames.end(); siter++){
1361 XABSearchPanel *XABSPPtr = static_cast<XABSearchPanel*>(siter->second);
1363 if (Enable == FALSE){
1365 wxCommandEvent enboxes(XABSP_ENABLECONTROLS);
1366 wxPostEvent(XABSPPtr, enboxes);
1368 } else if (Enable == TRUE){
1370 wxCommandEvent disboxes(XABSP_DISABLECONTROLS);
1371 wxPostEvent(XABSPPtr, disboxes);
1379 void frmSearch::OpenContact( wxCommandEvent& event ){
1381 // Check if a contact has been selected.
1383 long intSelected = -1;
1384 int intSelectedData = 0;
1385 long intContactSeekNum = -1;
1387 intSelected = lstResults->GetNextItem(intSelected,
1389 wxLIST_STATE_SELECTED);
1391 if (intSelected == -1){
1395 intContactSeekNum = lstResults->GetItemData(intSelected);
1397 if (SearchMode == TRUE){
1399 wxMessageBox(SearchResultFilename[intContactSeekNum]);
1403 Person.LoadFile(SearchResultFilename[intContactSeekNum]);
1405 wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
1406 wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
1407 wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
1409 contacticon.CopyFromBitmap(contacticonbmp);
1411 frmContact *Contact = new frmContact( this );
1413 Contact->SetupPointers(&SearchModeMemoryFSPtr);
1414 Contact->SetupContactData(&Person);
1416 Contact->SetIcon(contacticon);
1417 Contact->Show(true);
1421 UCNotif *uc = new UCNotif;
1423 uc->ContactAccount = SearchResultAccount[intContactSeekNum];
1424 uc->ContactFilename = SearchResultFilename[intContactSeekNum];
1426 wxCommandEvent oc(CE_OPENCONTACT);
1427 oc.SetClientData(uc);
1428 wxPostEvent(this->GetParent(), oc);
1434 void frmSearch::EditContact( wxCommandEvent& event ){
1436 // Check if a contact has been selected.
1438 long intSelected = -1;
1439 int intSelectedData = 0;
1440 long intContactSeekNum = -1;
1442 intSelected = lstResults->GetNextItem(intSelected,
1444 wxLIST_STATE_SELECTED);
1446 if (intSelected == -1){
1450 intContactSeekNum = lstResults->GetItemData(intSelected);
1452 UCNotif *uc = new UCNotif;
1454 uc->ContactAccount = SearchResultAccount[intContactSeekNum];
1455 uc->ContactFilename = SearchResultFilename[intContactSeekNum];
1457 wxCommandEvent ec(CE_EDITCONTACT);
1458 ec.SetClientData(uc);
1460 wxPostEvent(this->GetParent(), ec);
1464 void frmSearch::RevealContact( wxCommandEvent& event ){
1466 // Check if a contact has been selected.
1468 long intSelected = -1;
1469 int intSelectedData = 0;
1470 long intContactSeekNum = -1;
1472 intSelected = lstResults->GetNextItem(intSelected,
1474 wxLIST_STATE_SELECTED);
1476 if (intSelected == -1){
1480 intContactSeekNum = lstResults->GetItemData(intSelected);
1482 UCNotif *uc = new UCNotif;
1484 uc->ContactAccount = SearchResultAccount[intContactSeekNum];
1485 uc->ContactFilename = SearchResultFilename[intContactSeekNum];
1487 wxCommandEvent rc(CE_REVEALCONTACT);
1488 rc.SetClientData(uc);
1490 wxPostEvent(this->GetParent(), rc);
1494 void frmSearch::CloseWindow( wxCloseEvent& event ){
1496 // Hide the window so users don't panic
1497 // whilst clearing up.
1503 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1504 iter != SearchFrames.end(); ++iter){
1506 XABSearchPanel *XABSPPtr;
1508 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1509 szrSearch->Detach(XABSPPtr);
1511 // Remove the frame from the memory and the list.
1518 SearchFrames.clear();
1522 WindowData *WData = new WindowData;
1524 WData->DataType = 2;
1525 WData->WindowPointer = this;
1526 WData->WindowID = SearchUID;
1528 wxCommandEvent delevent(WINDOW_CLOSE);
1529 delevent.SetClientData(WData);
1530 wxPostEvent(GetParent(), delevent);
1532 wxCommandEvent rs(CE_REMOVESEARCH);
1533 wxPostEvent(this, rs);
1541 void frmSearch::CloseWindow( wxCommandEvent& event ){
1547 void frmSearch::UpdateResult( wxCommandEvent& event ){
1549 UCNotif *uc = (UCNotif*)event.GetClientData();
1551 long longSelected = -1;
1552 int intSelectedData = 0;
1556 longSelected = lstResults->GetNextItem(longSelected,
1558 wxLIST_STATE_DONTCARE);
1560 if (longSelected == -1){
1566 // Get the filename/ID information.
1568 intSelectedData = lstResults->GetItemData(longSelected);
1570 if (uc->ContactFilename == SearchResultFilename[intSelectedData]){
1572 // Process the contact name
1574 wxString ContactNameFinal;
1576 if (!uc->ContactNameArray.Title.IsEmpty()){
1578 ContactNameFinal.append(uc->ContactNameArray.Title);
1579 ContactNameFinal.Trim();
1580 ContactNameFinal.append(wxT(" "));
1584 if (!uc->ContactNameArray.Forename.IsEmpty()){
1586 ContactNameFinal.append(uc->ContactNameArray.Forename);
1587 ContactNameFinal.Trim();
1588 ContactNameFinal.append(wxT(" "));
1592 if (!uc->ContactNameArray.Surname.IsEmpty()){
1594 ContactNameFinal.append(uc->ContactNameArray.Surname);
1595 ContactNameFinal.Trim();
1596 ContactNameFinal.append(wxT(" "));
1600 if (!uc->ContactNameArray.Suffix.IsEmpty()){
1602 ContactNameFinal.append(uc->ContactNameArray.Suffix);
1603 ContactNameFinal.Trim();
1607 lstResults->SetItem(longSelected, 0, ContactNameFinal);
1608 lstResults->SetItem(longSelected, 1, uc->ContactNickname);
1619 bool frmSearch::CheckDuplicate(wxString Filename,
1621 std::map<long,wxString> *SRAcc,
1622 std::map<long,wxString> *SRFN){
1624 std::map<long,wxString>::iterator fniter;
1626 // Check comparison code.
1628 for (std::map<long,wxString>::iterator aciter = SRAcc->begin();
1629 aciter != SRAcc->end(); aciter++){
1631 fniter = SRFN->find(aciter->first);
1633 if (Filename == fniter->second &&
1634 Account == aciter->second){
1646 void frmSearch::DeleteResult(wxCommandEvent &event){
1648 UCNotif *uc = (UCNotif*)event.GetClientData();
1650 long longSelected = -1;
1651 int intSelectedData = 0;
1655 longSelected = lstResults->GetNextItem(longSelected,
1657 wxLIST_STATE_DONTCARE);
1659 if (longSelected == -1){
1665 // Get the filename/ID information.
1667 intSelectedData = lstResults->GetItemData(longSelected);
1669 if (uc->ContactFilename == SearchResultFilename[intSelectedData]){
1671 // Delete the result from the search list and
1672 // update the total search results.
1674 // Remove DeleteResultEvent and find out where the uc
1675 // data is still being used as it crashes on delete.
1677 lstResults->DeleteItem(longSelected);
1679 // Update the number of search results.
1681 wxCommandEvent sbu(SE_SBUPDATE);
1682 wxString *SBUpdate = new wxString;
1684 // Get the number of results.
1686 int intResultFound = lstResults->GetItemCount();
1688 // Prepare the status bar message.
1690 if (intResultFound == 0){
1692 *SBUpdate = _("No contacts found.");
1694 } else if (intResultFound == 1){
1696 *SBUpdate = _("1 contact found.");
1700 *SBUpdate = wxString::Format(wxT("%i"), intResultFound) + _(" contacts found.");
1704 sbu.SetClientData(SBUpdate);
1705 wxPostEvent(this, sbu);
1718 void frmSearch::SetUID(int UID){
1724 void frmSearch::SetSearchMode(bool SearchModeIn){
1726 SearchMode = SearchModeIn;
1728 if (SearchMode == TRUE){
1730 mnuContactEdit->Enable(FALSE);
1731 mnuContactReveal->Enable(FALSE);
1733 wxFileSystem::AddHandler(new wxMemoryFSHandler);
1736 wxMemoryInputStream ciptostream(icons_cipto_png, sizeof(icons_cipto_png));
1737 ciicon_png.LoadFile(ciptostream, wxBITMAP_TYPE_PNG);
1738 wxMemoryFSHandler::AddFile(wxT("cipto.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1740 wxMemoryInputStream cilogstream(icons_cilog_png, sizeof(icons_cilog_png));
1741 ciicon_png.LoadFile(cilogstream, wxBITMAP_TYPE_PNG);
1742 wxMemoryFSHandler::AddFile(wxT("cilog.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1744 wxMemoryInputStream cisndstream(icons_cisnd_png, sizeof(icons_cisnd_png));
1745 ciicon_png.LoadFile(cisndstream, wxBITMAP_TYPE_PNG);
1746 wxMemoryFSHandler::AddFile(wxT("cisnd.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1748 wxMemoryInputStream cikeystream(icons_cikey_png, sizeof(icons_cikey_png));
1749 ciicon_png.LoadFile(cikeystream, wxBITMAP_TYPE_PNG);
1750 wxMemoryFSHandler::AddFile(wxT("cikey.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1752 wxMemoryInputStream civenstream(icons_civen_png, sizeof(icons_civen_png));
1753 ciicon_png.LoadFile(civenstream, wxBITMAP_TYPE_PNG);
1754 wxMemoryFSHandler::AddFile(wxT("civen.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1756 wxMemoryInputStream ciextstream(icons_ciext_png, sizeof(icons_ciext_png));
1757 ciicon_png.LoadFile(ciextstream, wxBITMAP_TYPE_PNG);
1758 wxMemoryFSHandler::AddFile(wxT("ciext.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1762 mnuContactEdit->Enable(TRUE);
1763 mnuContactReveal->Enable(TRUE);
1769 void frmSearch::ShowContactMenu( wxMouseEvent& event ){
1771 ContactMenu->SetupPointers(this, lstResults);
1773 PopupMenu(ContactMenu->MenuPointer(), wxDefaultPosition);