// frmSearch.cpp - Search form.
//
// (c) 2012-2015 Xestia Software Development.
//
// This file is part of Xestia Address Book.
//
// Xestia Address Book is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by the
// Free Software Foundation, version 3 of the license.
//
// Xestia Address Book is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with Xestia Address Book. If not, see
#include "frmSearch.h"
#include "frmMain.h"
#include "frmContact.h"
#include "search/XABSearchPanel.h"
#include "search/frmSearchAccounts.h"
#include "common/preferences.h"
#include "common/dirs.h"
#include "vcard/vcard.h"
#include
#include
/*#include
#include
#include */
#include
#include
DEFINE_EVENT_TYPE(SE_ADDSEARCHSETTING);
DEFINE_EVENT_TYPE(SE_REMOVESEARCHSETTING);
DEFINE_EVENT_TYPE(SE_RELOADACCOUNTS);
DEFINE_EVENT_TYPE(SE_ADDRESULT);
DEFINE_EVENT_TYPE(SE_SBUPDATE);
DEFINE_EVENT_TYPE(SE_SEARCHFINISHED);
DEFINE_EVENT_TYPE(SE_UPDATERESULT);
DEFINE_EVENT_TYPE(SE_DELETERESULT);
DEFINE_EVENT_TYPE(SE_OPENCONTACT);
DEFINE_EVENT_TYPE(SE_EDITCONTACT);
DEFINE_EVENT_TYPE(SE_REVEALCONTACT);
BEGIN_EVENT_TABLE(frmSearch, wxFrame)
EVT_COMMAND(wxID_ANY, SE_ADDSEARCHSETTING, frmSearch::AddSearchSetting)
EVT_COMMAND(wxID_ANY, SE_REMOVESEARCHSETTING, frmSearch::RemoveSearchSetting)
EVT_COMMAND(wxID_ANY, SE_RELOADACCOUNTS, frmSearch::ReloadAccountList)
EVT_COMMAND(wxID_ANY, SE_ADDRESULT, frmSearch::AddResult)
EVT_COMMAND(wxID_ANY, SE_SBUPDATE, frmSearch::SearchBarUpdate)
EVT_COMMAND(wxID_ANY, SE_SEARCHFINISHED, frmSearch::SearchFinished)
EVT_COMMAND(wxID_ANY, SE_UPDATERESULT, frmSearch::UpdateResult)
EVT_COMMAND(wxID_ANY, SE_DELETERESULT, frmSearch::DeleteResult)
EVT_COMMAND(wxID_ANY, SE_OPENCONTACT, frmSearch::OpenContact)
EVT_COMMAND(wxID_ANY, SE_EDITCONTACT, frmSearch::EditContact)
EVT_COMMAND(wxID_ANY, SE_REVEALCONTACT, frmSearch::RevealContact)
END_EVENT_TABLE()
//namespace boostfs = boost::filesystem;
frmSearch::frmSearch( wxWindow* parent )
:
frmSearchADT( parent )
{
XABSearchPanel *InitPanel = new XABSearchPanel( tabSearch );
InitPanel->EnableButtons(TRUE, FALSE);
InitPanel->SetupPointers(this);
InitPanel->SetupInteger(ScrollGen);
szrSearch->Add(InitPanel, 1, wxEXPAND, 0);
szrSearch->Fit(tabSearch);
SearchFrames.insert(std::make_pair(ScrollGen, InitPanel));
ScrollGen++;
// Get the list of accounts and mark them as true.
wxString preffilename = GetUserPrefDir();
XABPreferences preferences(preffilename);
wxString AccDir;
wxString AccDirFull;
wxString AccDirFullSfx;
for (int i = 0; i < preferences.accounts.GetCount(); i++){
AccDir = preferences.accounts.GetAccountDirectory(i);
AccDirFull = preferences.accounts.GetAccountDirectory(i);
AccDirFull.Trim();
AccDirFull.Append(wxT("."));
AccDirFullSfx.Append(preferences.accounts.GetAccountType(i));
AccDirFullSfx.LowerCase();
AccDirFullSfx.Trim();
AccDirFull.Append(AccDirFullSfx);
SearchAccountsPaths.insert(std::make_pair(AccDir, AccDirFull));
SearchAccounts.insert(std::make_pair(AccDir, TRUE));
SearchAccountsNames.insert(std::make_pair(AccDir,
preferences.accounts.GetAccountName(i)));
AccDirFull.clear();
AccDirFullSfx.clear();
AccDir.clear();
}
// Setup the columns.
wxListItem item;
item.SetId(0);
item.SetText(_("Name"));
item.SetWidth(228);
lstResults->InsertColumn(0, item);
item.SetId(1);
item.SetText(_("Nickname"));
item.SetWidth(128);
lstResults->InsertColumn(1, item);
item.SetId(2);
item.SetText(_("Account"));
item.SetWidth(128);
lstResults->InsertColumn(2, item);
}
void frmSearch::SelectAccounts( wxCommandEvent& event )
{
// Create the form and display as modal.
frmSearchAccounts *frameSAccount = new frmSearchAccounts ( this );
frameSAccount->LoadSearchAccounts(&SearchAccounts, &SearchAccountsNames);
frameSAccount->ShowModal();
delete frameSAccount;
frameSAccount = NULL;
}
void frmSearch::SearchContactsThread(){
// Go through each account and find contacts based on the
// matched settings.
std::map::iterator SAiter;
std::map::iterator SAPiter;
int intResultFound = 0;
for (std::map::iterator SALiter = SearchAccountsNames.begin();
SALiter != SearchAccountsNames.end();
SALiter++){
// Double check that we are searching in this account.
// If not, skip to the next one.
SAiter = SearchAccounts.find(SALiter->first);
SAPiter = SearchAccountsPaths.find(SAiter->first);
if (SAiter->second == FALSE){
// Not looking in this account. Go to next account.
continue;
}
wxCommandEvent sbupdate (SE_SBUPDATE);
wxString *SBData = new wxString;
*SBData = _("Searching ") + SALiter->second + _("...");
sbupdate.SetClientData(SBData);
wxPostEvent(this, sbupdate);
if (StopMode == FALSE){
wxCommandEvent sbstop (SE_SBUPDATE);
wxString *SBStopStr = new wxString;
*SBStopStr = _("Search stopped.");
sbstop.SetClientData(SBStopStr);
wxPostEvent(this, sbstop);
return;
}
// Get the list of contact files and process each
// one of them.
wxString AccountDir = GetAccountDir(SAPiter->second, FALSE);
//boostfs::path vcarddir(AccountDir.c_str());
//boostfs::directory_iterator dir_end;
//boostfs::path vcardfilename;
wxString vcardfilenamewxs;
wxStringTokenizer vcardfileline;
//std::string l;
wxString lwxs;
wxString setname, setvalue;
long ContactIndex = 1;
long ContactSeekPoint = 0;
wxString vCardFilename;
wxString vCardFilenameFull;
//if (boostfs::exists(vcarddir)){
if (wxDirExists(AccountDir)){
wxDir vcardaccdir(AccountDir);
bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES);
while(ProcFiles){
//for (boostfs::directory_iterator vcarddir_iter(vcarddir);
// vcarddir_iter != dir_end ; ++vcarddir_iter){
if (StopMode == FALSE){
wxCommandEvent sbstop(SE_SBUPDATE);
wxString *SBStopStr = new wxString;
*SBStopStr = _("Search stopped.");
sbstop.SetClientData(SBStopStr);
wxPostEvent(this, sbstop);
return;
}
if (vCardFilename.Right(4) == wxT(".vcf") ||
vCardFilename.Right(4) == wxT(".VCF") ||
vCardFilename.Right(5) == wxT(".vcard") ||
vCardFilename.Right(5) == wxT(".VCARD")){
vCard Person;
vCardFilenameFull.Append(AccountDir);
vCardFilenameFull.Append(vCardFilename);
Person.LoadFile(vCardFilenameFull);
/*if (boostfs::path(vcarddir_iter->path()).extension() == ".vcf" ||
boostfs::path(vcarddir_iter->path()).extension() == ".VCF" ||
boostfs::path(vcarddir_iter->path()).extension() == ".vcard" ||
boostfs::path(vcarddir_iter->path()).extension() == ".VCARD"){*/
vcardfilenamewxs = vCardFilenameFull;
/*vCard Person;
std::fstream vcardfile;
vcardfilename = boostfs::path(vcarddir_iter->path()).filename();
vcardfilenamewxs.Append(AccountDir);
vcardfilenamewxs.Append(wxString::FromUTF8(vcardfilename.c_str()));
// Open the vCard file up and get the setting names and values from the
// file.
vcardfile.open(vcardfilenamewxs.mb_str(), std::ios::in);
while(getline(vcardfile, l)){
lwxs.Clear();
setname.Clear();
setvalue.Clear();
lwxs.Append(wxString::FromUTF8(l.c_str()));
vcardfileline.SetString(lwxs, wxT(":"));
setname = vcardfileline.GetNextToken();
setvalue = vcardfileline.GetString();
Person.Add(setname, setvalue, TRUE);
}
vcardfile.close();*/
// Check if file has version 4.0, first name (FN)
// begin and end vCard portions.
// Don't search unless these conditions have been met.
if (Person.MeetBaseSpecification()){
// Go through each of the search settings and check
// if they match with contact details.
// If it matches then add to the search results.
int SelOpt = 0;
bool chkOpt = FALSE;
wxString StrOpt;
int StrOptLen = 0;
ArrayvCardOutData ArrayData;
ArrayvCardOutData NicknameArrayData;
vCardName NameArray = Person.GetName();
wxString ContactFinalNickname;
NicknameArrayData = Person.GetByPartial(wxT("NICKNAME"));
if (NicknameArrayData.PropCount != 0){
ContactFinalNickname = NicknameArrayData.PropValues[0];
}
for (std::map::iterator siter = SearchFrames.begin();
siter != SearchFrames.end(); siter++){
// Get the settings from the form.
XABSearchPanel *XABSPPtr = static_cast(siter->second);
// Get Selected Option and Setting.
SelOpt = XABSPPtr->GetSelectionOption();
if (SelOpt < 12){
StrOpt = XABSPPtr->GetStringSetting();
StrOptLen = StrOpt.Len();
if (SelOpt == 0 || SelOpt == 4 || SelOpt == 8){
// Matching string that beings with...
// Double check the std::map inserts for each section.
if (SelOpt == 0){
// Get the forename from the first N.
if (NameArray.Forename.Mid(0, StrOptLen) == StrOpt){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
}
} else if (SelOpt == 4){
if (NameArray.Surname.Mid(0, StrOptLen) == StrOpt){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
}
} else if (SelOpt == 8){
wxString NicknameData;
for (int i = 0; i < NicknameArrayData.PropCount; i++){
NicknameData = NicknameArrayData.PropValues[i];
if (NicknameData.Mid(0, StrOptLen) == StrOpt){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
break;
}
}
}
} else if (SelOpt == 1 || SelOpt == 5 || SelOpt == 9){
// Matching string that ends with...
if (SelOpt == 1){
// Check the forename.
if (NameArray.Forename.Right(StrOptLen) == StrOpt){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
}
} else if (SelOpt == 5){
if (NameArray.Surname.Right(StrOptLen) == StrOpt){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
}
} else if (SelOpt == 9){
wxString NicknameData;
for (int i = 0; i < NicknameArrayData.PropCount; i++){
NicknameData = NicknameArrayData.PropValues[i];
NicknameData.Trim();
if (NicknameData.Right(StrOptLen) == StrOpt){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
break;
}
}
}
} else if (SelOpt == 2 || SelOpt == 6 || SelOpt == 10){
// Matching string that contains...
if (SelOpt == 2){
if (NameArray.Forename.Find(StrOpt) != wxNOT_FOUND){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
}
} else if (SelOpt == 6){
if (NameArray.Surname.Find(StrOpt) != wxNOT_FOUND){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
}
} else if (SelOpt == 10){
wxString NicknameData;
for (int i = 0; i < NicknameArrayData.PropCount; i++){
NicknameData = NicknameArrayData.PropValues[i];
NicknameData.Trim();
if (NicknameData.Find(StrOpt) != wxNOT_FOUND){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
break;
}
}
}
} else if (SelOpt == 3 || SelOpt == 7 || SelOpt == 11){
// Matching String that doesn't contain...
if (SelOpt == 3){
// Process the nickname data.
if (NameArray.Forename.Find(StrOpt) == wxNOT_FOUND){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
}
} else if (SelOpt == 7){
if (!NameArray.Surname.Find(StrOpt) == wxNOT_FOUND){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
}
} else if (SelOpt == 11){
wxString NicknameData;
for (int i = 0; i < NicknameArrayData.PropCount; i++){
NicknameData = NicknameArrayData.PropValues[i];
NicknameData.Trim();
if (NicknameData.Find(StrOpt) == wxNOT_FOUND){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
break;
}
}
}
}
} else {
chkOpt = XABSPPtr->GetCheckboxSetting();
if (SelOpt == 12){
// Search should check if it has a photo or not.
ArrayData = Person.GetByPartial(wxT("PHOTO"));
if ((ArrayData.PropCount >= 1 &&
chkOpt == TRUE) ||
(ArrayData.PropCount == 0 &&
chkOpt == FALSE)){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
}
} else if (SelOpt == 13){
// Search should check if it has a logo or not.
ArrayData = Person.GetByPartial(wxT("LOGO"));
if ((ArrayData.PropCount >= 1 &&
chkOpt == TRUE) ||
(ArrayData.PropCount == 0 &&
chkOpt == FALSE)){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
}
} else if (SelOpt == 14){
// Search should check if it has sound or not.
ArrayData = Person.GetByPartial(wxT("SOUND"));
if ((ArrayData.PropCount >= 1 &&
chkOpt == TRUE) ||
(ArrayData.PropCount == 0 &&
chkOpt == FALSE)){
if (CheckDuplicate(vcardfilenamewxs,
SAPiter->second,
&SearchResultAccount,
&SearchResultFilename) == TRUE){
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
continue;
}
SRNotif *sradd = new SRNotif;
sradd->ContactName = NameArray;
sradd->ContactNickname = ContactFinalNickname;
sradd->ContactAccount = SAPiter->second;
sradd->ContactAccountName = SALiter->second;
sradd->ContactFullFilename = vcardfilenamewxs;
sradd->SearchResultID = intResultFound;
SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount));
SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename));
intResultFound++;
wxCommandEvent sraddenv(SE_ADDRESULT);
sraddenv.SetClientData(sradd);
wxPostEvent(this, sraddenv);
}
}
}
SelOpt = 0;
chkOpt = FALSE;
StrOpt.Clear();
StrOptLen = 0;
ArrayData.PropData.Clear();
ArrayData.PropValues.Clear();
ArrayData.PropCount = 0;
}
} else {
}
}
vCardFilename.Clear();
vCardFilenameFull.Clear();
ProcFiles = vcardaccdir.GetNext(&vCardFilename);
}
} else {
}
}
// Finished searching... clear up.
wxCommandEvent sbfinstr (SE_SBUPDATE);
wxString *SBFinish = new wxString;
if (intResultFound == 0){
*SBFinish = _("No contacts found.");
} else if (intResultFound == 1){
*SBFinish = _("1 contact found.");
} else {
*SBFinish = wxString::Format(wxT("%i"), intResultFound) + _(" contacts found.");
}
sbfinstr.SetClientData(SBFinish);
wxPostEvent(this, sbfinstr);
wxCommandEvent sbfinish (SE_SEARCHFINISHED);
wxPostEvent(this, sbfinish);
}
void frmSearch::SearchContacts( wxCommandEvent& event )
{
// Change the button to stop.
if (StopMode == FALSE){
// Clear the list of search results.
lstResults->DeleteAllItems();
SearchResultAccount.clear();
SearchResultFilename.clear();
// Button clicked on as 'Search'.
DisableAllSearchSettings(TRUE);
StopMode = TRUE;
btnSearch->SetLabel(_("Stop"));
// Spawn a thread so that searching can proceed
// without blocking the GUI (and allow the
// search to stop when needed).
std::thread SearchThread(&frmSearch::SearchContactsThread, this);
SearchThread.detach();
} else {
// Button clicked on as 'Stop'.
StopMode = FALSE;
btnSearch->SetLabel(_("Search"));
DisableAllSearchSettings(FALSE);
}
}
void frmSearch::ResetContacts( wxCommandEvent& event )
{
// Clear all the search settings.
for (std::map::iterator iter = SearchFrames.begin();
iter != SearchFrames.end(); ++iter){
XABSearchPanel *XABSPPtr;
XABSPPtr = static_cast(iter->second);
szrSearch->Detach(XABSPPtr);
// Remove the frame from the memory and the list.
delete XABSPPtr;
XABSPPtr = NULL;
SearchFrames.erase(iter->first);
}
// Clear the list of search results.
lstResults->DeleteAllItems();
// Clear the account settings.
for (std::map::iterator iter = SearchAccounts.begin();
iter != SearchAccounts.end(); iter++){
iter->second = TRUE;
}
// Add a search settings with the default things.
ScrollGen = 0;
XABSearchPanel *NewPanel = new XABSearchPanel( tabSearch );
NewPanel->EnableButtons(TRUE, FALSE);
NewPanel->SetupPointers(this);
NewPanel->SetupInteger(ScrollGen);
szrSearch->Add(NewPanel, 1, wxEXPAND, 0);
szrSearch->Fit(tabSearch);
SearchFrames.insert(std::make_pair(ScrollGen, NewPanel));
ScrollGen++;
}
void frmSearch::AddSearchSetting( wxCommandEvent& event )
{
// Add a search setting frame to the list.
XABSearchPanel *NewPanel = new XABSearchPanel( tabSearch );
NewPanel->EnableButtons(TRUE, TRUE);
NewPanel->SetupPointers(this);
NewPanel->SetupInteger(ScrollGen);
szrSearch->Add(NewPanel, 1, wxEXPAND|wxGROW, 5);
//szrSearch->Fit(tabSearch);
szrSearch->FitInside(tabSearch);
szrSearch->Layout();
szrSearch->RecalcSizes();
tabSearch->Layout();
SearchFrames.insert(std::make_pair(ScrollGen, NewPanel));
ScrollGen++;
// Check if number of search settings is 15 (or over).
// If it is, disable the option of adding extra settings
// for all frames until one is removed.
XABSearchPanel *XABSPPtr;
if (SearchFrames.size() >= 15){
for (std::map::iterator iter = SearchFrames.begin();
iter != SearchFrames.end(); ++iter){
XABSPPtr = static_cast(iter->second);
XABSPPtr->EnableButtons(FALSE, TRUE);
}
} else if (SearchFrames.size() >= 2){
for (std::map::iterator iter = SearchFrames.begin();
iter != SearchFrames.end(); ++iter){
XABSPPtr = static_cast(iter->second);
XABSPPtr->EnableButtons(TRUE, TRUE);
}
}
//tabSearch->SetScrollbar(wxVERTICAL, 32768, 25, 32768, false);
tabSearch->Update();
//tabSearch->ScrollToLine(tabSearch->GetLineCount());
}
void frmSearch::RemoveSearchSetting( wxCommandEvent& event )
{
// Get the integer from the event.
std::map::iterator iter;
iter = SearchFrames.find(event.GetInt());
// Remove a search setting frame from the list.
XABSearchPanel *XABSPPtr;
XABSPPtr = static_cast(iter->second);
szrSearch->Detach(XABSPPtr);
// Remove the frame from the memory and the list.
SearchFrames.erase(event.GetInt());
delete XABSPPtr;
XABSPPtr = NULL;
//szrSearch->Fit(tabSearch);
if (SearchFrames.size() < 15 && SearchFrames.size() > 1){
for (std::map::iterator iter = SearchFrames.begin();
iter != SearchFrames.end(); ++iter){
XABSPPtr = static_cast(iter->second);
XABSPPtr->EnableButtons(TRUE, TRUE);
}
} else if (SearchFrames.size() == 1){
for (std::map::iterator iter = SearchFrames.begin();
iter != SearchFrames.end(); ++iter){
XABSPPtr = static_cast(iter->second);
XABSPPtr->EnableButtons(TRUE, FALSE);
}
}
szrSearch->FitInside(tabSearch);
szrSearch->Layout();
szrSearch->RecalcSizes();
tabSearch->Layout();
}
void frmSearch::ReloadAccountList( wxCommandEvent& event ){
// Currently unimplemented.
}
void frmSearch::AddResult( wxCommandEvent& event ){
SRNotif *srnotif = (SRNotif*)event.GetClientData();
// Process Data and add to the list of results.
wxListItem item;
// Setup the contact name.
wxString ContactNameFinal;
if (!srnotif->ContactName.Title.IsEmpty()){
ContactNameFinal.append(srnotif->ContactName.Title);
ContactNameFinal.Trim();
ContactNameFinal.append(wxT(" "));
}
if (!srnotif->ContactName.Forename.IsEmpty()){
ContactNameFinal.append(srnotif->ContactName.Forename);
ContactNameFinal.Trim();
ContactNameFinal.append(wxT(" "));
}
if (!srnotif->ContactName.Surname.IsEmpty()){
ContactNameFinal.append(srnotif->ContactName.Surname);
ContactNameFinal.Trim();
ContactNameFinal.append(wxT(" "));
}
if (!srnotif->ContactName.Suffix.IsEmpty()){
ContactNameFinal.append(srnotif->ContactName.Suffix);
ContactNameFinal.Trim();
}
item.SetId(0);
item.SetText(ContactNameFinal);
item.SetData(srnotif->SearchResultID);
long ListCtrlIndex = lstResults->InsertItem(item);
//SearchResultAccount.insert(std::make_pair(srnotif->SearchResultID, srnotif->ContactAccount));
//SearchResultFilename.insert(std::make_pair(srnotif->SearchResultID, srnotif->ContactFullFilename));
srnotif->ContactNickname.Trim();
lstResults->SetItem(ListCtrlIndex, 1, srnotif->ContactNickname);
lstResults->SetItem(ListCtrlIndex, 2, srnotif->ContactAccountName);
delete srnotif;
srnotif = NULL;
}
void frmSearch::SearchBarUpdate( wxCommandEvent& event ){
wxString *SBData = (wxString*)event.GetClientData();
stbBottom->SetStatusText(*SBData, 0);
delete SBData;
SBData = NULL;
}
void frmSearch::SearchFinished( wxCommandEvent& event ){
StopMode = FALSE;
btnSearch->SetLabel(_("Search"));
DisableAllSearchSettings(FALSE);
}
void frmSearch::DisableAllSearchSettings(bool Enable){
for (std::map::iterator siter = SearchFrames.begin();
siter != SearchFrames.end(); siter++){
XABSearchPanel *XABSPPtr = static_cast(siter->second);
if (Enable == FALSE){
wxCommandEvent enboxes(XABSP_ENABLECONTROLS);
wxPostEvent(XABSPPtr, enboxes);
} else if (Enable == TRUE){
wxCommandEvent disboxes(XABSP_DISABLECONTROLS);
wxPostEvent(XABSPPtr, disboxes);
}
}
}
void frmSearch::OpenContact( wxCommandEvent& event ){
// Check if a contact has been selected.
long intSelected = -1;
int intSelectedData = 0;
long intContactSeekNum = -1;
intSelected = lstResults->GetNextItem(intSelected,
wxLIST_NEXT_ALL,
wxLIST_STATE_SELECTED);
if (intSelected == -1){
return;
}
intContactSeekNum = lstResults->GetItemData(intSelected);
if (SearchMode == TRUE){
wxMessageBox(SearchResultFilename[intContactSeekNum]);
vCard Person;
Person.LoadFile(SearchResultFilename[intContactSeekNum]);
wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
wxIcon contacticon;
contacticon.CopyFromBitmap(contacticonbmp);
frmContact *Contact = new frmContact( this );
Contact->SetupPointers(&SearchModeMemoryFSPtr);
Contact->SetupContactData(&Person);
Contact->SetIcon(contacticon);
Contact->Show(true);
} else {
UCNotif *uc = new UCNotif;
uc->ContactAccount = SearchResultAccount[intContactSeekNum];
uc->ContactFilename = SearchResultFilename[intContactSeekNum];
wxCommandEvent oc(CE_OPENCONTACT);
oc.SetClientData(uc);
wxPostEvent(this->GetParent(), oc);
}
}
void frmSearch::EditContact( wxCommandEvent& event ){
// Check if a contact has been selected.
long intSelected = -1;
int intSelectedData = 0;
long intContactSeekNum = -1;
intSelected = lstResults->GetNextItem(intSelected,
wxLIST_NEXT_ALL,
wxLIST_STATE_SELECTED);
if (intSelected == -1){
return;
}
intContactSeekNum = lstResults->GetItemData(intSelected);
UCNotif *uc = new UCNotif;
uc->ContactAccount = SearchResultAccount[intContactSeekNum];
uc->ContactFilename = SearchResultFilename[intContactSeekNum];
wxCommandEvent ec(CE_EDITCONTACT);
ec.SetClientData(uc);
ec.SetInt(1);
wxPostEvent(this->GetParent(), ec);
}
void frmSearch::RevealContact( wxCommandEvent& event ){
// Check if a contact has been selected.
long intSelected = -1;
int intSelectedData = 0;
long intContactSeekNum = -1;
intSelected = lstResults->GetNextItem(intSelected,
wxLIST_NEXT_ALL,
wxLIST_STATE_SELECTED);
if (intSelected == -1){
return;
}
intContactSeekNum = lstResults->GetItemData(intSelected);
UCNotif *uc = new UCNotif;
uc->ContactAccount = SearchResultAccount[intContactSeekNum];
uc->ContactFilename = SearchResultFilename[intContactSeekNum];
wxCommandEvent rc(CE_REVEALCONTACT);
rc.SetClientData(uc);
rc.SetInt(1);
wxPostEvent(this->GetParent(), rc);
}
void frmSearch::CloseWindow( wxCloseEvent& event ){
// Hide the window so users don't panic
// whilst clearing up.
this->Hide();
// Clear up.
for (std::map::iterator iter = SearchFrames.begin();
iter != SearchFrames.end(); ++iter){
XABSearchPanel *XABSPPtr;
XABSPPtr = static_cast(iter->second);
szrSearch->Detach(XABSPPtr);
// Remove the frame from the memory and the list.
delete XABSPPtr;
XABSPPtr = NULL;
}
SearchFrames.clear();
// Close window.
WindowData *WData = new WindowData;
WData->DataType = 2;
WData->WindowPointer = this;
WData->WindowID = SearchUID;
wxCommandEvent delevent(WINDOW_CLOSE);
delevent.SetClientData(WData);
wxPostEvent(GetParent(), delevent);
wxCommandEvent rs(CE_REMOVESEARCH);
wxPostEvent(this, rs);
WData = NULL;
this->Destroy();
}
void frmSearch::CloseWindow( wxCommandEvent& event ){
this->Close();
}
void frmSearch::UpdateResult( wxCommandEvent& event ){
UCNotif *uc = (UCNotif*)event.GetClientData();
long longSelected = -1;
int intSelectedData = 0;
for (;;){
longSelected = lstResults->GetNextItem(longSelected,
wxLIST_NEXT_ALL,
wxLIST_STATE_DONTCARE);
if (longSelected == -1){
break;
}
// Get the filename/ID information.
intSelectedData = lstResults->GetItemData(longSelected);
if (uc->ContactFilename == SearchResultFilename[intSelectedData]){
// Process the contact name
wxString ContactNameFinal;
if (!uc->ContactNameArray.Title.IsEmpty()){
ContactNameFinal.append(uc->ContactNameArray.Title);
ContactNameFinal.Trim();
ContactNameFinal.append(wxT(" "));
}
if (!uc->ContactNameArray.Forename.IsEmpty()){
ContactNameFinal.append(uc->ContactNameArray.Forename);
ContactNameFinal.Trim();
ContactNameFinal.append(wxT(" "));
}
if (!uc->ContactNameArray.Surname.IsEmpty()){
ContactNameFinal.append(uc->ContactNameArray.Surname);
ContactNameFinal.Trim();
ContactNameFinal.append(wxT(" "));
}
if (!uc->ContactNameArray.Suffix.IsEmpty()){
ContactNameFinal.append(uc->ContactNameArray.Suffix);
ContactNameFinal.Trim();
}
lstResults->SetItem(longSelected, 0, ContactNameFinal);
lstResults->SetItem(longSelected, 1, uc->ContactNickname);
}
}
delete uc;
uc = NULL;
}
bool frmSearch::CheckDuplicate(wxString Filename,
wxString Account,
std::map *SRAcc,
std::map *SRFN){
std::map::iterator fniter;
// Check comparison code.
for (std::map::iterator aciter = SRAcc->begin();
aciter != SRAcc->end(); aciter++){
fniter = SRFN->find(aciter->first);
if (Filename == fniter->second &&
Account == aciter->second){
return TRUE;
}
}
return FALSE;
}
void frmSearch::DeleteResult(wxCommandEvent &event){
UCNotif *uc = (UCNotif*)event.GetClientData();
long longSelected = -1;
int intSelectedData = 0;
for (;;){
longSelected = lstResults->GetNextItem(longSelected,
wxLIST_NEXT_ALL,
wxLIST_STATE_DONTCARE);
if (longSelected == -1){
break;
}
// Get the filename/ID information.
intSelectedData = lstResults->GetItemData(longSelected);
if (uc->ContactFilename == SearchResultFilename[intSelectedData]){
// Delete the result from the search list and
// update the total search results.
// Remove DeleteResultEvent and find out where the uc
// data is still being used as it crashes on delete.
lstResults->DeleteItem(longSelected);
// Update the number of search results.
wxCommandEvent sbu(SE_SBUPDATE);
wxString *SBUpdate = new wxString;
// Get the number of results.
int intResultFound = lstResults->GetItemCount();
// Prepare the status bar message.
if (intResultFound == 0){
*SBUpdate = _("No contacts found.");
} else if (intResultFound == 1){
*SBUpdate = _("1 contact found.");
} else {
*SBUpdate = wxString::Format(wxT("%i"), intResultFound) + _(" contacts found.");
}
sbu.SetClientData(SBUpdate);
wxPostEvent(this, sbu);
break;
}
}
delete uc;
uc = NULL;
}
void frmSearch::SetUID(int UID){
SearchUID = UID;
}
void frmSearch::SetSearchMode(bool SearchModeIn){
SearchMode = SearchModeIn;
if (SearchMode == TRUE){
mnuContactEdit->Enable(FALSE);
mnuContactReveal->Enable(FALSE);
wxFileSystem::AddHandler(new wxMemoryFSHandler);
wxImage ciicon_png;
wxMemoryInputStream ciptostream(icons_cipto_png, sizeof(icons_cipto_png));
ciicon_png.LoadFile(ciptostream, wxBITMAP_TYPE_PNG);
wxMemoryFSHandler::AddFile(wxT("cipto.png"), ciicon_png, wxBITMAP_TYPE_PNG);
wxMemoryInputStream cilogstream(icons_cilog_png, sizeof(icons_cilog_png));
ciicon_png.LoadFile(cilogstream, wxBITMAP_TYPE_PNG);
wxMemoryFSHandler::AddFile(wxT("cilog.png"), ciicon_png, wxBITMAP_TYPE_PNG);
wxMemoryInputStream cisndstream(icons_cisnd_png, sizeof(icons_cisnd_png));
ciicon_png.LoadFile(cisndstream, wxBITMAP_TYPE_PNG);
wxMemoryFSHandler::AddFile(wxT("cisnd.png"), ciicon_png, wxBITMAP_TYPE_PNG);
wxMemoryInputStream cikeystream(icons_cikey_png, sizeof(icons_cikey_png));
ciicon_png.LoadFile(cikeystream, wxBITMAP_TYPE_PNG);
wxMemoryFSHandler::AddFile(wxT("cikey.png"), ciicon_png, wxBITMAP_TYPE_PNG);
wxMemoryInputStream civenstream(icons_civen_png, sizeof(icons_civen_png));
ciicon_png.LoadFile(civenstream, wxBITMAP_TYPE_PNG);
wxMemoryFSHandler::AddFile(wxT("civen.png"), ciicon_png, wxBITMAP_TYPE_PNG);
wxMemoryInputStream ciextstream(icons_ciext_png, sizeof(icons_ciext_png));
ciicon_png.LoadFile(ciextstream, wxBITMAP_TYPE_PNG);
wxMemoryFSHandler::AddFile(wxT("ciext.png"), ciicon_png, wxBITMAP_TYPE_PNG);
} else {
mnuContactEdit->Enable(TRUE);
mnuContactReveal->Enable(TRUE);
}
}
void frmSearch::ShowContactMenu( wxMouseEvent& event ){
ContactMenu->SetupPointers(this, lstResults);
PopupMenu(ContactMenu->MenuPointer(), wxDefaultPosition);
}