3 #include "frmContact.h"
4 #include "search/XABSearchPanel.h"
5 #include "search/frmSearchAccounts.h"
6 #include "common/preferences.h"
7 #include "common/dirs.h"
8 #include "vcard/vcard.h"
11 #include <wx/fs_mem.h>
12 /*#include <boost/filesystem.hpp>
13 #include <boost/filesystem/fstream.hpp>
14 #include <boost/filesystem/path.hpp>*/
15 #include <wx/tokenzr.h>
18 DEFINE_EVENT_TYPE(SE_ADDSEARCHSETTING);
19 DEFINE_EVENT_TYPE(SE_REMOVESEARCHSETTING);
20 DEFINE_EVENT_TYPE(SE_RELOADACCOUNTS);
21 DEFINE_EVENT_TYPE(SE_ADDRESULT);
22 DEFINE_EVENT_TYPE(SE_SBUPDATE);
23 DEFINE_EVENT_TYPE(SE_SEARCHFINISHED);
24 DEFINE_EVENT_TYPE(SE_UPDATERESULT);
25 DEFINE_EVENT_TYPE(SE_DELETERESULT);
26 DEFINE_EVENT_TYPE(SE_OPENCONTACT);
27 DEFINE_EVENT_TYPE(SE_EDITCONTACT);
28 DEFINE_EVENT_TYPE(SE_REVEALCONTACT);
30 BEGIN_EVENT_TABLE(frmSearch, wxFrame)
31 EVT_COMMAND(wxID_ANY, SE_ADDSEARCHSETTING, frmSearch::AddSearchSetting)
32 EVT_COMMAND(wxID_ANY, SE_REMOVESEARCHSETTING, frmSearch::RemoveSearchSetting)
33 EVT_COMMAND(wxID_ANY, SE_RELOADACCOUNTS, frmSearch::ReloadAccountList)
34 EVT_COMMAND(wxID_ANY, SE_ADDRESULT, frmSearch::AddResult)
35 EVT_COMMAND(wxID_ANY, SE_SBUPDATE, frmSearch::SearchBarUpdate)
36 EVT_COMMAND(wxID_ANY, SE_SEARCHFINISHED, frmSearch::SearchFinished)
37 EVT_COMMAND(wxID_ANY, SE_UPDATERESULT, frmSearch::UpdateResult)
38 EVT_COMMAND(wxID_ANY, SE_DELETERESULT, frmSearch::DeleteResult)
39 EVT_COMMAND(wxID_ANY, SE_OPENCONTACT, frmSearch::OpenContact)
40 EVT_COMMAND(wxID_ANY, SE_EDITCONTACT, frmSearch::EditContact)
41 EVT_COMMAND(wxID_ANY, SE_REVEALCONTACT, frmSearch::RevealContact)
44 //namespace boostfs = boost::filesystem;
46 frmSearch::frmSearch( wxWindow* parent )
48 frmSearchADT( parent )
51 XABSearchPanel *InitPanel = new XABSearchPanel( tabSearch );
52 InitPanel->EnableButtons(TRUE, FALSE);
53 InitPanel->SetupPointers(this);
54 InitPanel->SetupInteger(ScrollGen);
55 szrSearch->Add(InitPanel, 1, wxEXPAND, 0);
56 szrSearch->Fit(tabSearch);
57 SearchFrames.insert(std::make_pair(ScrollGen, InitPanel));
60 // Get the list of accounts and mark them as true.
62 wxString preffilename = GetUserPrefDir();
64 XABPreferences preferences(preffilename);
68 wxString AccDirFullSfx;
70 for (int i = 0; i < preferences.accounts.GetCount(); i++){
71 AccDir = preferences.accounts.GetAccountDirectory(i);
72 AccDirFull = preferences.accounts.GetAccountDirectory(i);
74 AccDirFull.Append(wxT("."));
75 AccDirFullSfx.Append(preferences.accounts.GetAccountType(i));
76 AccDirFullSfx.LowerCase();
78 AccDirFull.Append(AccDirFullSfx);
79 SearchAccountsPaths.insert(std::make_pair(AccDir, AccDirFull));
80 SearchAccounts.insert(std::make_pair(AccDir, TRUE));
81 SearchAccountsNames.insert(std::make_pair(AccDir,
82 preferences.accounts.GetAccountName(i)));
84 AccDirFullSfx.clear();
92 item.SetText(_("Name"));
95 lstResults->InsertColumn(0, item);
98 item.SetText(_("Nickname"));
101 lstResults->InsertColumn(1, item);
104 item.SetText(_("Account"));
107 lstResults->InsertColumn(2, item);
111 void frmSearch::SelectAccounts( wxCommandEvent& event )
114 // Create the form and display as modal.
116 frmSearchAccounts *frameSAccount = new frmSearchAccounts ( this );
117 frameSAccount->LoadSearchAccounts(&SearchAccounts, &SearchAccountsNames);
118 frameSAccount->ShowModal();
119 delete frameSAccount;
120 frameSAccount = NULL;
124 void frmSearch::SearchContactsThread(){
126 // Go through each account and find contacts based on the
129 std::map<wxString,bool>::iterator SAiter;
130 std::map<wxString,wxString>::iterator SAPiter;
131 int intResultFound = 0;
133 for (std::map<wxString, wxString>::iterator SALiter = SearchAccountsNames.begin();
134 SALiter != SearchAccountsNames.end();
137 // Double check that we are searching in this account.
138 // If not, skip to the next one.
140 SAiter = SearchAccounts.find(SALiter->first);
141 SAPiter = SearchAccountsPaths.find(SAiter->first);
144 if (SAiter->second == FALSE){
146 // Not looking in this account. Go to next account.
152 wxCommandEvent sbupdate (SE_SBUPDATE);
154 wxString *SBData = new wxString;
155 *SBData = _("Searching ") + SALiter->second + _("...");
157 sbupdate.SetClientData(SBData);
158 wxPostEvent(this, sbupdate);
160 if (StopMode == FALSE){
162 wxCommandEvent sbstop (SE_SBUPDATE);
164 wxString *SBStopStr = new wxString;
165 *SBStopStr = _("Search stopped.");
167 sbstop.SetClientData(SBStopStr);
168 wxPostEvent(this, sbstop);
173 // Get the list of contact files and process each
176 wxString AccountDir = GetAccountDir(SAPiter->second, FALSE);
178 //boostfs::path vcarddir(AccountDir.c_str());
179 //boostfs::directory_iterator dir_end;
181 //boostfs::path vcardfilename;
182 wxString vcardfilenamewxs;
183 wxStringTokenizer vcardfileline;
186 wxString setname, setvalue;
187 long ContactIndex = 1;
188 long ContactSeekPoint = 0;
189 wxString vCardFilename;
190 wxString vCardFilenameFull;
192 //if (boostfs::exists(vcarddir)){
193 if (wxDirExists(AccountDir)){
195 wxDir vcardaccdir(AccountDir);
197 bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES);
199 //for (boostfs::directory_iterator vcarddir_iter(vcarddir);
200 // vcarddir_iter != dir_end ; ++vcarddir_iter){
202 if (StopMode == FALSE){
204 wxCommandEvent sbstop(SE_SBUPDATE);
206 wxString *SBStopStr = new wxString;
207 *SBStopStr = _("Search stopped.");
209 sbstop.SetClientData(SBStopStr);
210 wxPostEvent(this, sbstop);
215 if (vCardFilename.Right(4) == wxT(".vcf") ||
216 vCardFilename.Right(4) == wxT(".VCF") ||
217 vCardFilename.Right(5) == wxT(".vcard") ||
218 vCardFilename.Right(5) == wxT(".VCARD")){
221 vCardFilenameFull.Append(AccountDir);
222 vCardFilenameFull.Append(vCardFilename);
224 Person.LoadFile(vCardFilenameFull);
226 vcardfilenamewxs = vCardFilenameFull;
228 // Check if file has version 4.0, first name (FN)
229 // begin and end vCard portions.
231 // Don't search unless these conditions have been met.
233 if (Person.MeetBaseSpecification()){
235 // Go through each of the search settings and check
236 // if they match with contact details.
238 // If it matches then add to the search results.
244 ArrayvCardOutData ArrayData;
245 ArrayvCardOutData NicknameArrayData;
246 vCardName NameArray = Person.GetName();
247 wxString ContactFinalNickname;
248 NicknameArrayData = Person.GetByPartial(wxT("NICKNAME"));
250 if (NicknameArrayData.PropCount != 0){
251 ContactFinalNickname = NicknameArrayData.PropValues[0];
254 for (std::map<int, void*>::iterator siter = SearchFrames.begin();
255 siter != SearchFrames.end(); siter++){
257 // Get the settings from the form.
259 XABSearchPanel *XABSPPtr = static_cast<XABSearchPanel*>(siter->second);
261 // Get Selected Option and Setting.
263 SelOpt = XABSPPtr->GetSelectionOption();
267 StrOpt = XABSPPtr->GetStringSetting();
268 StrOptLen = StrOpt.Len();
270 if (SelOpt == 0 || SelOpt == 4 || SelOpt == 8){
272 // Matching string that beings with...
274 // Double check the std::map inserts for each section.
278 // Get the forename from the first N.
280 if (NameArray.Forename.Mid(0, StrOptLen) == StrOpt){
282 if (CheckDuplicate(vcardfilenamewxs,
284 &SearchResultAccount,
285 &SearchResultFilename) == TRUE){
291 ArrayData.PropData.Clear();
292 ArrayData.PropValues.Clear();
293 ArrayData.PropCount = 0;
298 SRNotif *sradd = new SRNotif;
299 sradd->ContactName = NameArray;
300 sradd->ContactNickname = ContactFinalNickname;
301 sradd->ContactAccount = SAPiter->second;
302 sradd->ContactAccountName = SALiter->second;
303 sradd->ContactFullFilename = vcardfilenamewxs;
304 sradd->SearchResultID = intResultFound;
306 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
307 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
311 wxCommandEvent sraddenv(SE_ADDRESULT);
312 sraddenv.SetClientData(sradd);
313 wxPostEvent(this, sraddenv);
317 } else if (SelOpt == 4){
319 if (NameArray.Surname.Mid(0, StrOptLen) == StrOpt){
321 if (CheckDuplicate(vcardfilenamewxs,
323 &SearchResultAccount,
324 &SearchResultFilename) == TRUE){
330 ArrayData.PropData.Clear();
331 ArrayData.PropValues.Clear();
332 ArrayData.PropCount = 0;
337 SRNotif *sradd = new SRNotif;
338 sradd->ContactName = NameArray;
339 sradd->ContactNickname = ContactFinalNickname;
340 sradd->ContactAccount = SAPiter->second;
341 sradd->ContactAccountName = SALiter->second;
342 sradd->ContactFullFilename = vcardfilenamewxs;
343 sradd->SearchResultID = intResultFound;
345 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
346 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
350 wxCommandEvent sraddenv(SE_ADDRESULT);
351 sraddenv.SetClientData(sradd);
352 wxPostEvent(this, sraddenv);
356 } else if (SelOpt == 8){
358 wxString NicknameData;
360 for (int i = 0; i < NicknameArrayData.PropCount; i++){
362 NicknameData = NicknameArrayData.PropValues[i];
364 if (NicknameData.Mid(0, StrOptLen) == StrOpt){
366 if (CheckDuplicate(vcardfilenamewxs,
368 &SearchResultAccount,
369 &SearchResultFilename) == TRUE){
375 ArrayData.PropData.Clear();
376 ArrayData.PropValues.Clear();
377 ArrayData.PropCount = 0;
382 SRNotif *sradd = new SRNotif;
383 sradd->ContactName = NameArray;
384 sradd->ContactNickname = ContactFinalNickname;
385 sradd->ContactAccount = SAPiter->second;
386 sradd->ContactAccountName = SALiter->second;
387 sradd->ContactFullFilename = vcardfilenamewxs;
388 sradd->SearchResultID = intResultFound;
390 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
391 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
395 wxCommandEvent sraddenv(SE_ADDRESULT);
396 sraddenv.SetClientData(sradd);
397 wxPostEvent(this, sraddenv);
407 } else if (SelOpt == 1 || SelOpt == 5 || SelOpt == 9){
409 // Matching string that ends with...
413 // Check the forename.
415 if (NameArray.Forename.Right(StrOptLen) == StrOpt){
417 if (CheckDuplicate(vcardfilenamewxs,
419 &SearchResultAccount,
420 &SearchResultFilename) == TRUE){
426 ArrayData.PropData.Clear();
427 ArrayData.PropValues.Clear();
428 ArrayData.PropCount = 0;
433 SRNotif *sradd = new SRNotif;
434 sradd->ContactName = NameArray;
435 sradd->ContactNickname = ContactFinalNickname;
436 sradd->ContactAccount = SAPiter->second;
437 sradd->ContactAccountName = SALiter->second;
438 sradd->ContactFullFilename = vcardfilenamewxs;
439 sradd->SearchResultID = intResultFound;
441 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
442 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
446 wxCommandEvent sraddenv(SE_ADDRESULT);
447 sraddenv.SetClientData(sradd);
448 wxPostEvent(this, sraddenv);
452 } else if (SelOpt == 5){
454 if (NameArray.Surname.Right(StrOptLen) == StrOpt){
456 if (CheckDuplicate(vcardfilenamewxs,
458 &SearchResultAccount,
459 &SearchResultFilename) == TRUE){
465 ArrayData.PropData.Clear();
466 ArrayData.PropValues.Clear();
467 ArrayData.PropCount = 0;
472 SRNotif *sradd = new SRNotif;
473 sradd->ContactName = NameArray;
474 sradd->ContactNickname = ContactFinalNickname;
475 sradd->ContactAccount = SAPiter->second;
476 sradd->ContactAccountName = SALiter->second;
477 sradd->ContactFullFilename = vcardfilenamewxs;
478 sradd->SearchResultID = intResultFound;
480 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
481 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
485 wxCommandEvent sraddenv(SE_ADDRESULT);
486 sraddenv.SetClientData(sradd);
487 wxPostEvent(this, sraddenv);
491 } else if (SelOpt == 9){
493 wxString NicknameData;
495 for (int i = 0; i < NicknameArrayData.PropCount; i++){
497 NicknameData = NicknameArrayData.PropValues[i];
500 if (NicknameData.Right(StrOptLen) == StrOpt){
502 if (CheckDuplicate(vcardfilenamewxs,
504 &SearchResultAccount,
505 &SearchResultFilename) == TRUE){
511 ArrayData.PropData.Clear();
512 ArrayData.PropValues.Clear();
513 ArrayData.PropCount = 0;
518 SRNotif *sradd = new SRNotif;
519 sradd->ContactName = NameArray;
520 sradd->ContactNickname = ContactFinalNickname;
521 sradd->ContactAccount = SAPiter->second;
522 sradd->ContactAccountName = SALiter->second;
523 sradd->ContactFullFilename = vcardfilenamewxs;
524 sradd->SearchResultID = intResultFound;
526 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
527 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
531 wxCommandEvent sraddenv(SE_ADDRESULT);
532 sraddenv.SetClientData(sradd);
533 wxPostEvent(this, sraddenv);
543 } else if (SelOpt == 2 || SelOpt == 6 || SelOpt == 10){
545 // Matching string that contains...
549 if (NameArray.Forename.Find(StrOpt) != wxNOT_FOUND){
551 if (CheckDuplicate(vcardfilenamewxs,
553 &SearchResultAccount,
554 &SearchResultFilename) == TRUE){
560 ArrayData.PropData.Clear();
561 ArrayData.PropValues.Clear();
562 ArrayData.PropCount = 0;
567 SRNotif *sradd = new SRNotif;
568 sradd->ContactName = NameArray;
569 sradd->ContactNickname = ContactFinalNickname;
570 sradd->ContactAccount = SAPiter->second;
571 sradd->ContactAccountName = SALiter->second;
572 sradd->ContactFullFilename = vcardfilenamewxs;
573 sradd->SearchResultID = intResultFound;
575 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
576 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
580 wxCommandEvent sraddenv(SE_ADDRESULT);
581 sraddenv.SetClientData(sradd);
582 wxPostEvent(this, sraddenv);
586 } else if (SelOpt == 6){
588 if (NameArray.Surname.Find(StrOpt) != wxNOT_FOUND){
590 if (CheckDuplicate(vcardfilenamewxs,
592 &SearchResultAccount,
593 &SearchResultFilename) == TRUE){
599 ArrayData.PropData.Clear();
600 ArrayData.PropValues.Clear();
601 ArrayData.PropCount = 0;
606 SRNotif *sradd = new SRNotif;
607 sradd->ContactName = NameArray;
608 sradd->ContactNickname = ContactFinalNickname;
609 sradd->ContactAccount = SAPiter->second;
610 sradd->ContactAccountName = SALiter->second;
611 sradd->ContactFullFilename = vcardfilenamewxs;
612 sradd->SearchResultID = intResultFound;
614 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
615 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
619 wxCommandEvent sraddenv(SE_ADDRESULT);
620 sraddenv.SetClientData(sradd);
621 wxPostEvent(this, sraddenv);
625 } else if (SelOpt == 10){
627 wxString NicknameData;
629 for (int i = 0; i < NicknameArrayData.PropCount; i++){
631 NicknameData = NicknameArrayData.PropValues[i];
634 if (NicknameData.Find(StrOpt) != wxNOT_FOUND){
636 if (CheckDuplicate(vcardfilenamewxs,
638 &SearchResultAccount,
639 &SearchResultFilename) == TRUE){
645 ArrayData.PropData.Clear();
646 ArrayData.PropValues.Clear();
647 ArrayData.PropCount = 0;
652 SRNotif *sradd = new SRNotif;
653 sradd->ContactName = NameArray;
654 sradd->ContactNickname = ContactFinalNickname;
655 sradd->ContactAccount = SAPiter->second;
656 sradd->ContactAccountName = SALiter->second;
657 sradd->ContactFullFilename = vcardfilenamewxs;
658 sradd->SearchResultID = intResultFound;
660 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
661 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
665 wxCommandEvent sraddenv(SE_ADDRESULT);
666 sraddenv.SetClientData(sradd);
667 wxPostEvent(this, sraddenv);
677 } else if (SelOpt == 3 || SelOpt == 7 || SelOpt == 11){
679 // Matching String that doesn't contain...
683 // Process the nickname data.
685 if (NameArray.Forename.Find(StrOpt) == wxNOT_FOUND){
687 if (CheckDuplicate(vcardfilenamewxs,
689 &SearchResultAccount,
690 &SearchResultFilename) == TRUE){
696 ArrayData.PropData.Clear();
697 ArrayData.PropValues.Clear();
698 ArrayData.PropCount = 0;
703 SRNotif *sradd = new SRNotif;
704 sradd->ContactName = NameArray;
705 sradd->ContactNickname = ContactFinalNickname;
706 sradd->ContactAccount = SAPiter->second;
707 sradd->ContactAccountName = SALiter->second;
708 sradd->ContactFullFilename = vcardfilenamewxs;
709 sradd->SearchResultID = intResultFound;
711 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
712 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
716 wxCommandEvent sraddenv(SE_ADDRESULT);
717 sraddenv.SetClientData(sradd);
718 wxPostEvent(this, sraddenv);
722 } else if (SelOpt == 7){
724 if (!NameArray.Surname.Find(StrOpt) == wxNOT_FOUND){
726 if (CheckDuplicate(vcardfilenamewxs,
728 &SearchResultAccount,
729 &SearchResultFilename) == TRUE){
735 ArrayData.PropData.Clear();
736 ArrayData.PropValues.Clear();
737 ArrayData.PropCount = 0;
742 SRNotif *sradd = new SRNotif;
743 sradd->ContactName = NameArray;
744 sradd->ContactNickname = ContactFinalNickname;
745 sradd->ContactAccount = SAPiter->second;
746 sradd->ContactAccountName = SALiter->second;
747 sradd->ContactFullFilename = vcardfilenamewxs;
748 sradd->SearchResultID = intResultFound;
750 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
751 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
755 wxCommandEvent sraddenv(SE_ADDRESULT);
756 sraddenv.SetClientData(sradd);
757 wxPostEvent(this, sraddenv);
761 } else if (SelOpt == 11){
763 wxString NicknameData;
765 for (int i = 0; i < NicknameArrayData.PropCount; i++){
767 NicknameData = NicknameArrayData.PropValues[i];
770 if (NicknameData.Find(StrOpt) == wxNOT_FOUND){
772 if (CheckDuplicate(vcardfilenamewxs,
774 &SearchResultAccount,
775 &SearchResultFilename) == TRUE){
781 ArrayData.PropData.Clear();
782 ArrayData.PropValues.Clear();
783 ArrayData.PropCount = 0;
788 SRNotif *sradd = new SRNotif;
789 sradd->ContactName = NameArray;
790 sradd->ContactNickname = ContactFinalNickname;
791 sradd->ContactAccount = SAPiter->second;
792 sradd->ContactAccountName = SALiter->second;
793 sradd->ContactFullFilename = vcardfilenamewxs;
794 sradd->SearchResultID = intResultFound;
796 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
797 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
801 wxCommandEvent sraddenv(SE_ADDRESULT);
802 sraddenv.SetClientData(sradd);
803 wxPostEvent(this, sraddenv);
817 chkOpt = XABSPPtr->GetCheckboxSetting();
821 // Search should check if it has a photo or not.
823 ArrayData = Person.GetByPartial(wxT("PHOTO"));
825 if ((ArrayData.PropCount >= 1 &&
827 (ArrayData.PropCount == 0 &&
830 if (CheckDuplicate(vcardfilenamewxs,
832 &SearchResultAccount,
833 &SearchResultFilename) == TRUE){
839 ArrayData.PropData.Clear();
840 ArrayData.PropValues.Clear();
841 ArrayData.PropCount = 0;
846 SRNotif *sradd = new SRNotif;
848 sradd->ContactName = NameArray;
849 sradd->ContactNickname = ContactFinalNickname;
850 sradd->ContactAccount = SAPiter->second;
851 sradd->ContactAccountName = SALiter->second;
852 sradd->ContactFullFilename = vcardfilenamewxs;
853 sradd->SearchResultID = intResultFound;
855 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
856 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
860 wxCommandEvent sraddenv(SE_ADDRESULT);
861 sraddenv.SetClientData(sradd);
862 wxPostEvent(this, sraddenv);
866 } else if (SelOpt == 13){
868 // Search should check if it has a logo or not.
870 ArrayData = Person.GetByPartial(wxT("LOGO"));
872 if ((ArrayData.PropCount >= 1 &&
874 (ArrayData.PropCount == 0 &&
877 if (CheckDuplicate(vcardfilenamewxs,
879 &SearchResultAccount,
880 &SearchResultFilename) == TRUE){
886 ArrayData.PropData.Clear();
887 ArrayData.PropValues.Clear();
888 ArrayData.PropCount = 0;
893 SRNotif *sradd = new SRNotif;
895 sradd->ContactName = NameArray;
896 sradd->ContactNickname = ContactFinalNickname;
897 sradd->ContactAccount = SAPiter->second;
898 sradd->ContactAccountName = SALiter->second;
899 sradd->ContactFullFilename = vcardfilenamewxs;
900 sradd->SearchResultID = intResultFound;
902 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
903 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
907 wxCommandEvent sraddenv(SE_ADDRESULT);
908 sraddenv.SetClientData(sradd);
909 wxPostEvent(this, sraddenv);
913 } else if (SelOpt == 14){
915 // Search should check if it has sound or not.
917 ArrayData = Person.GetByPartial(wxT("SOUND"));
919 if ((ArrayData.PropCount >= 1 &&
921 (ArrayData.PropCount == 0 &&
924 if (CheckDuplicate(vcardfilenamewxs,
926 &SearchResultAccount,
927 &SearchResultFilename) == TRUE){
933 ArrayData.PropData.Clear();
934 ArrayData.PropValues.Clear();
935 ArrayData.PropCount = 0;
940 SRNotif *sradd = new SRNotif;
942 sradd->ContactName = NameArray;
943 sradd->ContactNickname = ContactFinalNickname;
944 sradd->ContactAccount = SAPiter->second;
945 sradd->ContactAccountName = SALiter->second;
946 sradd->ContactFullFilename = vcardfilenamewxs;
947 sradd->SearchResultID = intResultFound;
949 SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
950 SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
954 wxCommandEvent sraddenv(SE_ADDRESULT);
955 sraddenv.SetClientData(sradd);
956 wxPostEvent(this, sraddenv);
968 ArrayData.PropData.Clear();
969 ArrayData.PropValues.Clear();
970 ArrayData.PropCount = 0;
980 vCardFilename.Clear();
981 vCardFilenameFull.Clear();
982 ProcFiles = vcardaccdir.GetNext(&vCardFilename);
992 // Finished searching... clear up.
994 wxCommandEvent sbfinstr (SE_SBUPDATE);
996 wxString *SBFinish = new wxString;
998 if (intResultFound == 0){
1000 *SBFinish = _("No contacts found.");
1002 } else if (intResultFound == 1){
1004 *SBFinish = _("1 contact found.");
1008 *SBFinish = wxString::Format(wxT("%i"), intResultFound) + _(" contacts found.");
1012 sbfinstr.SetClientData(SBFinish);
1013 wxPostEvent(this, sbfinstr);
1015 wxCommandEvent sbfinish (SE_SEARCHFINISHED);
1016 wxPostEvent(this, sbfinish);
1020 void frmSearch::SearchContacts( wxCommandEvent& event )
1023 // Change the button to stop.
1025 if (StopMode == FALSE){
1027 // Clear the list of search results.
1029 lstResults->DeleteAllItems();
1030 SearchResultAccount.clear();
1031 SearchResultFilename.clear();
1033 // Button clicked on as 'Search'.
1035 DisableAllSearchSettings(TRUE);
1037 btnSearch->SetLabel(_("Stop"));
1039 // Spawn a thread so that searching can proceed
1040 // without blocking the GUI (and allow the
1041 // search to stop when needed).
1043 std::thread SearchThread(&frmSearch::SearchContactsThread, this);
1044 SearchThread.detach();
1048 // Button clicked on as 'Stop'.
1051 btnSearch->SetLabel(_("Search"));
1052 DisableAllSearchSettings(FALSE);
1058 void frmSearch::ResetContacts( wxCommandEvent& event )
1061 // Clear all the search settings.
1063 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1064 iter != SearchFrames.end(); ++iter){
1066 XABSearchPanel *XABSPPtr;
1068 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1069 szrSearch->Detach(XABSPPtr);
1071 // Remove the frame from the memory and the list.
1076 SearchFrames.erase(iter->first);
1080 // Clear the list of search results.
1082 lstResults->DeleteAllItems();
1084 // Clear the account settings.
1086 for (std::map<wxString, bool>::iterator iter = SearchAccounts.begin();
1087 iter != SearchAccounts.end(); iter++){
1089 iter->second = TRUE;
1093 // Add a search settings with the default things.
1097 XABSearchPanel *NewPanel = new XABSearchPanel( tabSearch );
1098 NewPanel->EnableButtons(TRUE, FALSE);
1099 NewPanel->SetupPointers(this);
1100 NewPanel->SetupInteger(ScrollGen);
1101 szrSearch->Add(NewPanel, 1, wxEXPAND, 0);
1102 szrSearch->Fit(tabSearch);
1103 SearchFrames.insert(std::make_pair(ScrollGen, NewPanel));
1108 void frmSearch::AddSearchSetting( wxCommandEvent& event )
1111 // Add a search setting frame to the list.
1113 XABSearchPanel *NewPanel = new XABSearchPanel( tabSearch );
1114 NewPanel->EnableButtons(TRUE, TRUE);
1115 NewPanel->SetupPointers(this);
1116 NewPanel->SetupInteger(ScrollGen);
1117 szrSearch->Add(NewPanel, 1, wxEXPAND|wxGROW, 5);
1118 //szrSearch->Fit(tabSearch);
1119 szrSearch->FitInside(tabSearch);
1120 szrSearch->Layout();
1121 szrSearch->RecalcSizes();
1122 tabSearch->Layout();
1123 SearchFrames.insert(std::make_pair(ScrollGen, NewPanel));
1126 // Check if number of search settings is 15 (or over).
1127 // If it is, disable the option of adding extra settings
1128 // for all frames until one is removed.
1130 XABSearchPanel *XABSPPtr;
1132 if (SearchFrames.size() >= 15){
1134 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1135 iter != SearchFrames.end(); ++iter){
1137 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1139 XABSPPtr->EnableButtons(FALSE, TRUE);
1143 } else if (SearchFrames.size() >= 2){
1145 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1146 iter != SearchFrames.end(); ++iter){
1148 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1150 XABSPPtr->EnableButtons(TRUE, TRUE);
1156 //tabSearch->SetScrollbar(wxVERTICAL, 32768, 25, 32768, false);
1157 tabSearch->Update();
1158 //tabSearch->ScrollToLine(tabSearch->GetLineCount());
1162 void frmSearch::RemoveSearchSetting( wxCommandEvent& event )
1165 // Get the integer from the event.
1167 std::map<int,void*>::iterator iter;
1168 iter = SearchFrames.find(event.GetInt());
1170 // Remove a search setting frame from the list.
1172 XABSearchPanel *XABSPPtr;
1173 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1175 szrSearch->Detach(XABSPPtr);
1177 // Remove the frame from the memory and the list.
1179 SearchFrames.erase(event.GetInt());
1184 //szrSearch->Fit(tabSearch);
1186 if (SearchFrames.size() < 15 && SearchFrames.size() > 1){
1188 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1189 iter != SearchFrames.end(); ++iter){
1191 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1193 XABSPPtr->EnableButtons(TRUE, TRUE);
1197 } else if (SearchFrames.size() == 1){
1199 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1200 iter != SearchFrames.end(); ++iter){
1202 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1204 XABSPPtr->EnableButtons(TRUE, FALSE);
1210 szrSearch->FitInside(tabSearch);
1211 szrSearch->Layout();
1212 szrSearch->RecalcSizes();
1213 tabSearch->Layout();
1217 void frmSearch::ReloadAccountList( wxCommandEvent& event ){
1219 // Currently unimplemented.
1223 void frmSearch::AddResult( wxCommandEvent& event ){
1225 SRNotif *srnotif = (SRNotif*)event.GetClientData();
1227 // Process Data and add to the list of results.
1231 // Setup the contact name.
1233 wxString ContactNameFinal;
1235 if (!srnotif->ContactName.Title.IsEmpty()){
1237 ContactNameFinal.append(srnotif->ContactName.Title);
1238 ContactNameFinal.Trim();
1239 ContactNameFinal.append(wxT(" "));
1243 if (!srnotif->ContactName.Forename.IsEmpty()){
1245 ContactNameFinal.append(srnotif->ContactName.Forename);
1246 ContactNameFinal.Trim();
1247 ContactNameFinal.append(wxT(" "));
1251 if (!srnotif->ContactName.Surname.IsEmpty()){
1253 ContactNameFinal.append(srnotif->ContactName.Surname);
1254 ContactNameFinal.Trim();
1255 ContactNameFinal.append(wxT(" "));
1259 if (!srnotif->ContactName.Suffix.IsEmpty()){
1261 ContactNameFinal.append(srnotif->ContactName.Suffix);
1262 ContactNameFinal.Trim();
1267 item.SetText(ContactNameFinal);
1268 item.SetData(srnotif->SearchResultID);
1270 long ListCtrlIndex = lstResults->InsertItem(item);
1272 //SearchResultAccount.insert(std::make_pair(srnotif->SearchResultID, srnotif->ContactAccount));
1273 //SearchResultFilename.insert(std::make_pair(srnotif->SearchResultID, srnotif->ContactFullFilename));
1275 srnotif->ContactNickname.Trim();
1277 lstResults->SetItem(ListCtrlIndex, 1, srnotif->ContactNickname);
1278 lstResults->SetItem(ListCtrlIndex, 2, srnotif->ContactAccountName);
1285 void frmSearch::SearchBarUpdate( wxCommandEvent& event ){
1287 wxString *SBData = (wxString*)event.GetClientData();
1289 stbBottom->SetStatusText(*SBData, 0);
1296 void frmSearch::SearchFinished( wxCommandEvent& event ){
1299 btnSearch->SetLabel(_("Search"));
1300 DisableAllSearchSettings(FALSE);
1304 void frmSearch::DisableAllSearchSettings(bool Enable){
1306 for (std::map<int, void*>::iterator siter = SearchFrames.begin();
1307 siter != SearchFrames.end(); siter++){
1309 XABSearchPanel *XABSPPtr = static_cast<XABSearchPanel*>(siter->second);
1311 if (Enable == FALSE){
1313 wxCommandEvent enboxes(XABSP_ENABLECONTROLS);
1314 wxPostEvent(XABSPPtr, enboxes);
1316 } else if (Enable == TRUE){
1318 wxCommandEvent disboxes(XABSP_DISABLECONTROLS);
1319 wxPostEvent(XABSPPtr, disboxes);
1327 void frmSearch::OpenContact( wxCommandEvent& event ){
1329 // Check if a contact has been selected.
1331 long intSelected = -1;
1332 int intSelectedData = 0;
1333 long intContactSeekNum = -1;
1335 intSelected = lstResults->GetNextItem(intSelected,
1337 wxLIST_STATE_SELECTED);
1339 if (intSelected == -1){
1343 intContactSeekNum = lstResults->GetItemData(intSelected);
1345 if (SearchMode == TRUE){
1347 wxMessageBox(SearchResultFilename[intContactSeekNum]);
1351 Person.LoadFile(SearchResultFilename[intContactSeekNum]);
1353 wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
1354 wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
1355 wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
1357 contacticon.CopyFromBitmap(contacticonbmp);
1359 frmContact *Contact = new frmContact( this );
1361 Contact->SetupPointers(&SearchModeMemoryFSPtr);
1362 Contact->SetupContactData(&Person);
1364 Contact->SetIcon(contacticon);
1365 Contact->Show(true);
1369 UCNotif *uc = new UCNotif;
1371 uc->ContactAccount = SearchResultAccount[intContactSeekNum];
1372 uc->ContactFilename = SearchResultFilename[intContactSeekNum];
1374 wxCommandEvent oc(CE_OPENCONTACT);
1375 oc.SetClientData(uc);
1376 wxPostEvent(this->GetParent(), oc);
1382 void frmSearch::EditContact( wxCommandEvent& event ){
1384 // Check if a contact has been selected.
1386 long intSelected = -1;
1387 int intSelectedData = 0;
1388 long intContactSeekNum = -1;
1390 intSelected = lstResults->GetNextItem(intSelected,
1392 wxLIST_STATE_SELECTED);
1394 if (intSelected == -1){
1398 intContactSeekNum = lstResults->GetItemData(intSelected);
1400 UCNotif *uc = new UCNotif;
1402 uc->ContactAccount = SearchResultAccount[intContactSeekNum];
1403 uc->ContactFilename = SearchResultFilename[intContactSeekNum];
1405 wxCommandEvent ec(CE_EDITCONTACT);
1406 ec.SetClientData(uc);
1408 wxPostEvent(this->GetParent(), ec);
1412 void frmSearch::RevealContact( wxCommandEvent& event ){
1414 // Check if a contact has been selected.
1416 long intSelected = -1;
1417 int intSelectedData = 0;
1418 long intContactSeekNum = -1;
1420 intSelected = lstResults->GetNextItem(intSelected,
1422 wxLIST_STATE_SELECTED);
1424 if (intSelected == -1){
1428 intContactSeekNum = lstResults->GetItemData(intSelected);
1430 UCNotif *uc = new UCNotif;
1432 uc->ContactAccount = SearchResultAccount[intContactSeekNum];
1433 uc->ContactFilename = SearchResultFilename[intContactSeekNum];
1435 wxCommandEvent rc(CE_REVEALCONTACT);
1436 rc.SetClientData(uc);
1438 wxPostEvent(this->GetParent(), rc);
1442 void frmSearch::CloseWindow( wxCloseEvent& event ){
1444 // Hide the window so users don't panic
1445 // whilst clearing up.
1451 for (std::map<int,void*>::iterator iter = SearchFrames.begin();
1452 iter != SearchFrames.end(); ++iter){
1454 XABSearchPanel *XABSPPtr;
1456 XABSPPtr = static_cast<XABSearchPanel*>(iter->second);
1457 szrSearch->Detach(XABSPPtr);
1459 // Remove the frame from the memory and the list.
1466 SearchFrames.clear();
1470 WindowData *WData = new WindowData;
1472 WData->DataType = 2;
1473 WData->WindowPointer = this;
1474 WData->WindowID = SearchUID;
1476 wxCommandEvent delevent(WINDOW_CLOSE);
1477 delevent.SetClientData(WData);
1478 wxPostEvent(GetParent(), delevent);
1480 wxCommandEvent rs(CE_REMOVESEARCH);
1481 wxPostEvent(this, rs);
1489 void frmSearch::CloseWindow( wxCommandEvent& event ){
1495 void frmSearch::UpdateResult( wxCommandEvent& event ){
1497 UCNotif *uc = (UCNotif*)event.GetClientData();
1499 long longSelected = -1;
1500 int intSelectedData = 0;
1504 longSelected = lstResults->GetNextItem(longSelected,
1506 wxLIST_STATE_DONTCARE);
1508 if (longSelected == -1){
1514 // Get the filename/ID information.
1516 intSelectedData = lstResults->GetItemData(longSelected);
1518 if (uc->ContactFilename == SearchResultFilename[intSelectedData]){
1520 // Process the contact name
1522 wxString ContactNameFinal;
1524 if (!uc->ContactNameArray.Title.IsEmpty()){
1526 ContactNameFinal.append(uc->ContactNameArray.Title);
1527 ContactNameFinal.Trim();
1528 ContactNameFinal.append(wxT(" "));
1532 if (!uc->ContactNameArray.Forename.IsEmpty()){
1534 ContactNameFinal.append(uc->ContactNameArray.Forename);
1535 ContactNameFinal.Trim();
1536 ContactNameFinal.append(wxT(" "));
1540 if (!uc->ContactNameArray.Surname.IsEmpty()){
1542 ContactNameFinal.append(uc->ContactNameArray.Surname);
1543 ContactNameFinal.Trim();
1544 ContactNameFinal.append(wxT(" "));
1548 if (!uc->ContactNameArray.Suffix.IsEmpty()){
1550 ContactNameFinal.append(uc->ContactNameArray.Suffix);
1551 ContactNameFinal.Trim();
1555 lstResults->SetItem(longSelected, 0, ContactNameFinal);
1556 lstResults->SetItem(longSelected, 1, uc->ContactNickname);
1567 bool frmSearch::CheckDuplicate(wxString Filename,
1569 std::map<long,wxString> *SRAcc,
1570 std::map<long,wxString> *SRFN){
1572 std::map<long,wxString>::iterator fniter;
1574 // Check comparison code.
1576 for (std::map<long,wxString>::iterator aciter = SRAcc->begin();
1577 aciter != SRAcc->end(); aciter++){
1579 fniter = SRFN->find(aciter->first);
1581 if (Filename == fniter->second &&
1582 Account == aciter->second){
1594 void frmSearch::DeleteResult(wxCommandEvent &event){
1596 UCNotif *uc = (UCNotif*)event.GetClientData();
1598 long longSelected = -1;
1599 int intSelectedData = 0;
1603 longSelected = lstResults->GetNextItem(longSelected,
1605 wxLIST_STATE_DONTCARE);
1607 if (longSelected == -1){
1613 // Get the filename/ID information.
1615 intSelectedData = lstResults->GetItemData(longSelected);
1617 if (uc->ContactFilename == SearchResultFilename[intSelectedData]){
1619 // Delete the result from the search list and
1620 // update the total search results.
1622 // Remove DeleteResultEvent and find out where the uc
1623 // data is still being used as it crashes on delete.
1625 lstResults->DeleteItem(longSelected);
1627 // Update the number of search results.
1629 wxCommandEvent sbu(SE_SBUPDATE);
1630 wxString *SBUpdate = new wxString;
1632 // Get the number of results.
1634 int intResultFound = lstResults->GetItemCount();
1636 // Prepare the status bar message.
1638 if (intResultFound == 0){
1640 *SBUpdate = _("No contacts found.");
1642 } else if (intResultFound == 1){
1644 *SBUpdate = _("1 contact found.");
1648 *SBUpdate = wxString::Format(wxT("%i"), intResultFound) + _(" contacts found.");
1652 sbu.SetClientData(SBUpdate);
1653 wxPostEvent(this, sbu);
1666 void frmSearch::SetUID(int UID){
1672 void frmSearch::SetSearchMode(bool SearchModeIn){
1674 SearchMode = SearchModeIn;
1676 if (SearchMode == TRUE){
1678 mnuContactEdit->Enable(FALSE);
1679 mnuContactReveal->Enable(FALSE);
1681 wxFileSystem::AddHandler(new wxMemoryFSHandler);
1684 wxMemoryInputStream ciptostream(icons_cipto_png, sizeof(icons_cipto_png));
1685 ciicon_png.LoadFile(ciptostream, wxBITMAP_TYPE_PNG);
1686 wxMemoryFSHandler::AddFile(wxT("cipto.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1688 wxMemoryInputStream cilogstream(icons_cilog_png, sizeof(icons_cilog_png));
1689 ciicon_png.LoadFile(cilogstream, wxBITMAP_TYPE_PNG);
1690 wxMemoryFSHandler::AddFile(wxT("cilog.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1692 wxMemoryInputStream cisndstream(icons_cisnd_png, sizeof(icons_cisnd_png));
1693 ciicon_png.LoadFile(cisndstream, wxBITMAP_TYPE_PNG);
1694 wxMemoryFSHandler::AddFile(wxT("cisnd.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1696 wxMemoryInputStream cikeystream(icons_cikey_png, sizeof(icons_cikey_png));
1697 ciicon_png.LoadFile(cikeystream, wxBITMAP_TYPE_PNG);
1698 wxMemoryFSHandler::AddFile(wxT("cikey.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1700 wxMemoryInputStream civenstream(icons_civen_png, sizeof(icons_civen_png));
1701 ciicon_png.LoadFile(civenstream, wxBITMAP_TYPE_PNG);
1702 wxMemoryFSHandler::AddFile(wxT("civen.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1704 wxMemoryInputStream ciextstream(icons_ciext_png, sizeof(icons_ciext_png));
1705 ciicon_png.LoadFile(ciextstream, wxBITMAP_TYPE_PNG);
1706 wxMemoryFSHandler::AddFile(wxT("ciext.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1710 mnuContactEdit->Enable(TRUE);
1711 mnuContactReveal->Enable(TRUE);
1717 void frmSearch::ShowContactMenu( wxMouseEvent& event ){
1719 ContactMenu->SetupPointers(this, lstResults);
1721 PopupMenu(ContactMenu->MenuPointer(), wxDefaultPosition);