// frmContactEditor-Load.cpp - frmContactEditor load contact subroutines. // // (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 #include #include #include #include #include "frmContactEditor.h" #include "../enums.h" #include "../version.h" #include "../vcard/vcard.h" #include "../common/textprocessing.h" #include "../common/dirs.h" #include "cdo/ContactDataObject.h" bool frmContactEditor::LoadContact(wxString Filename){ // Load the contact into the contact editor. wxFFile ContactFile; wxString wxSContactString; wxString ContactLine; vCard ContactData; XABViewMode XVMData; if (StartupEditMode == FALSE){ XVMData = MainPtr->GetViewMode(); } wxSContactFilename = Filename; ContactLoadStatus LoadResult = ContactEditorData.LoadFile(Filename); switch(LoadResult){ case CONTACTLOAD_OK: break; case CONTACTLOAD_FILEMISSING: wxMessageBox(_("The file with the filename given does not exist."), _("Contact not found"), wxICON_ERROR); this->Close(); return FALSE; break; case CONTACTLOAD_FILEERROR: wxMessageBox(_("The file with the filename given cannot be opened due to an error while trying open it."), _("Error loading contact"), wxICON_ERROR); this->Close(); return FALSE; break; case CONTACTLOAD_FILEINVALIDFORMAT: wxMessageBox(_("This file is not a vCard 4.0 contact and is not supported under Xestia Address Book."), _("Contact not supported"), wxICON_ERROR); this->Close(); return FALSE; break; case CONTACTLOAD_FILEBASESPECFAIL: wxMessageBox(_("This file is not a vCard 4.0 contact and is not supported under Xestia Address Book."), _("Contact not supported"), wxICON_ERROR); this->Close(); return FALSE; break; }; // Get the line. wxString wxSProperty; wxString wxSPropertySeg1; wxString wxSPropertySeg2; wxString wxSPropertyNextLine; int NicknameCount = 0; int ADRCount = 0; int EmailCount = 0; int IMPPCount = 0; int TelCount = 0; int LangCount = 0; int TZCount = 0; int GeoCount = 0; int URLCount = 0; int RelatedCount = 0; int TitleCount = 0; int RoleCount = 0; int OrgCount = 0; int NoteCount = 0; int CategoryCount = 0; int PhotoCount = 0; int LogoCount = 0; int SoundCount = 0; int CalAdrCount = 0; int CalReqAdrCount = 0; int FreeBusyCount = 0; int KeyCount = 0; int VendorCount = 0; int XTokenCount = 0; // Process the unique ID (UID) // Do nothing at the moment. // Process the contact type (KIND) (frmContactEditor-LoadGroup.cpp) LoadKind(&ContactEditorData.ContactKind); // Process the Birthday (BDAY) (frmContactEditor-LoadBADays.cpp) LoadBirthday(&ContactEditorData.Birthday, &ContactEditorData.BirthdayText); // Process the Anniversary (ANNIVERSARY) (frmContactEditor-LoadBADays.cpp) LoadAnniversary(&ContactEditorData.Anniversary, &ContactEditorData.AnniversaryText); // Process the Gender (GENDER) (frmContactEditor-LoadGender.cpp) LoadGender(&ContactEditorData.Gender, &ContactEditorData.GenderDetails); // Process the Name (N) (frmContactEditor-LoadName.cpp) LoadName(&ContactEditorData.NameTitle, &ContactEditorData.NameForename, &ContactEditorData.NameSurname, &ContactEditorData.NameOtherNames, &ContactEditorData.NameSuffix); // Process the group members (MEMBER) (frmContactEditor-LoadGroup.cpp) LoadMember(&ContactEditorData.GroupsList); // Process the addresses (ADR) (frmContactEditor-LoadAddress.cpp) LoadAddress(&ContactEditorData.GeneralAddressList, &ContactEditorData.GeneralAddressListTown, &ContactEditorData.GeneralAddressListCounty, &ContactEditorData.GeneralAddressListPostCode, &ContactEditorData.GeneralAddressListPref, &ContactEditorData.HomeAddressList, &ContactEditorData.HomeAddressListTown, &ContactEditorData.HomeAddressListCounty, &ContactEditorData.HomeAddressListPostCode, &ContactEditorData.HomeAddressListPref, &ContactEditorData.BusinessAddressList, &ContactEditorData.BusinessAddressListTown, &ContactEditorData.BusinessAddressListCounty, &ContactEditorData.BusinessAddressListPostCode, &ContactEditorData.BusinessAddressListPref, &ADRCount); // Process the timezones (TZ). LoadData(&ContactEditorData.GeneralTZList, &ContactEditorData.GeneralTZListPref, lboTimezones, &ContactEditorData.HomeTZList, &ContactEditorData.HomeTZListPref, lboHomeTimezones, &ContactEditorData.BusinessTZList, &ContactEditorData.BusinessTZListPref, lboBusinessTimezones, &TZCount); // Process the emails (EMAIL). LoadData(&ContactEditorData.GeneralEmailList, &ContactEditorData.GeneralEmailListPref, lboEmails, &ContactEditorData.HomeEmailList, &ContactEditorData.HomeEmailListPref, lboHomeEmails, &ContactEditorData.BusinessEmailList, &ContactEditorData.BusinessEmailListPref, lboBusinessEmail, &EmailCount); // Process the nicknames (NICKNAME). LoadData(&ContactEditorData.GeneralNicknamesList, &ContactEditorData.GeneralNicknamesListPref, lboNicknames, &ContactEditorData.HomeNicknamesList, &ContactEditorData.HomeNicknamesListPref, lboHomeNicknames, &ContactEditorData.BusinessNicknamesList, &ContactEditorData.BusinessNicknamesListPref, lboBusinessNicknames, &NicknameCount); // Process the languages (LANG). LoadData(&ContactEditorData.GeneralLanguageList, &ContactEditorData.GeneralLanguageListPref, lboLanguages, &ContactEditorData.HomeLanguageList, &ContactEditorData.HomeLanguageListPref, lboHomeLanguages, &ContactEditorData.BusinessLanguageList, &ContactEditorData.BusinessLanguageListPref, lboBusinessLanguages, &LangCount); // Process the geopositiosn (GEO). LoadData(&ContactEditorData.GeneralGeographyList, &ContactEditorData.GeneralGeographyListPref, lboGeoposition, &ContactEditorData.HomeGeographyList, &ContactEditorData.HomeGeographyListPref, lboHomeGeoposition, &ContactEditorData.BusinessGeographyList, &ContactEditorData.BusinessGeographyListPref, lboBusinessGeoposition, &GeoCount); // Process the websites (URL). LoadData(&ContactEditorData.GeneralWebsiteList, &ContactEditorData.GeneralWebsiteListPref, lboWebsites, &ContactEditorData.HomeWebsiteList, &ContactEditorData.HomeWebsiteListPref, lboHomeWebsites, &ContactEditorData.BusinessWebsiteList, &ContactEditorData.BusinessWebsiteListPref, lboBusinessWebsites, &URLCount); // Process the titles (TITLE). LoadData(&ContactEditorData.GeneralTitleList, &ContactEditorData.GeneralTitleListPref, lboTitles, &ContactEditorData.HomeTitleList, &ContactEditorData.HomeTitleListPref, lboHomeTitles, &ContactEditorData.BusinessTitleList, &ContactEditorData.BusinessTitleListPref, lboBusinessTitles, &TitleCount); // Process the roles (ROLE). LoadData(&ContactEditorData.GeneralRoleList, &ContactEditorData.GeneralRoleListPref, lboRoles, &ContactEditorData.HomeRoleList, &ContactEditorData.HomeRoleListPref, lboHomeRoles, &ContactEditorData.BusinessRoleList, &ContactEditorData.BusinessRoleListPref, lboBusinessRoles, &RoleCount); // Process the roles (ORG). LoadData(&ContactEditorData.GeneralOrganisationsList, &ContactEditorData.GeneralOrganisationsListPref, lboOrganisations, &ContactEditorData.HomeOrganisationsList, &ContactEditorData.HomeOrganisationsListPref, lboHomeOrganisations, &ContactEditorData.BusinessOrganisationsList, &ContactEditorData.BusinessOrganisationsListPref, lboBusinessOrganisations, &OrgCount); // Process the notes (NOTE). LoadData(&ContactEditorData.GeneralNoteList, &ContactEditorData.GeneralNoteListPref, lboNotes, &ContactEditorData.HomeNoteList, &ContactEditorData.HomeNoteListPref, lboHomeNotes, &ContactEditorData.BusinessNoteList, &ContactEditorData.BusinessNoteListPref, lboBusinessNotes, &NoteCount); // Process the categories (CATEGORIES). LoadData(&ContactEditorData.CategoriesList, &ContactEditorData.CategoriesListPref, lboCategories, &CategoryCount); // Process the telephone numbers (TEL). LoadData(&ContactEditorData.GeneralTelephoneList, &ContactEditorData.GeneralTelephoneListPref, &ContactEditorData.GeneralTelephoneListTypeInfo, lboTelephone, &ContactEditorData.HomeTelephoneList, &ContactEditorData.HomeTelephoneListPref, &ContactEditorData.HomeTelephoneListTypeInfo, lboHomeTelephone, &ContactEditorData.BusinessTelephoneList, &ContactEditorData.BusinessTelephoneListPref, &ContactEditorData.BusinessTelephoneListTypeInfo, lboBusinessTelephone, &TelCount); // Process the instant messaging (IMPP). LoadData(&ContactEditorData.GeneralIMListTypeInfo, &ContactEditorData.GeneralIMListPref, &ContactEditorData.GeneralIMList, lboIM, &ContactEditorData.HomeIMListTypeInfo, &ContactEditorData.HomeIMListPref, &ContactEditorData.HomeIMList, lboHomeIM, &ContactEditorData.BusinessIMListTypeInfo, &ContactEditorData.BusinessIMListPref, &ContactEditorData.BusinessIMList, lboBusinessIM, &IMPPCount); // Process the photos (PHOTO). LoadPictureData("PHOTO", &ContactEditorData.PicturesList, &ContactEditorData.PicturesListPref, &ContactEditorData.PicturesListType, lboPictures, &PhotoCount); // Process the logos (LOGO). LoadPictureData("LOGO", &ContactEditorData.LogosList, &ContactEditorData.LogosListPref, &ContactEditorData.LogosListType, lboLogos, &LogoCount); // Process the sounds (SOUND). LoadPictureData("SOUND", &ContactEditorData.SoundsList, &ContactEditorData.SoundsListPref, &ContactEditorData.SoundsListType, lboSounds, &SoundCount); // Process the calendar addresses (CALURI). LoadData("CALURI", &ContactEditorData.CalendarList, &ContactEditorData.CalendarListPref, &ContactEditorData.CalendarListType, NULL, lboCalendarAddresses, &CalAdrCount); // Process the calendar request addresses (CALADRURI). LoadData("CALADRURI", &ContactEditorData.CalendarRequestList, &ContactEditorData.CalendarRequestListPref, &ContactEditorData.CalendarRequestListType, NULL, lboCalendarRequestAddress, &CalReqAdrCount); // Process the free busy addresses (FBURL). LoadData("FBURL", &ContactEditorData.FreeBusyList, &ContactEditorData.FreeBusyListPref, &ContactEditorData.FreeBusyListType, NULL, lboFreeBusyAddresses, &FreeBusyCount); // Process the keys. (KEY) LoadData("KEY", &ContactEditorData.KeyList, &ContactEditorData.KeyListPref, &ContactEditorData.KeyListType, &ContactEditorData.KeyListDataType, lboKeys, &KeyCount); // Process the vendor specific information (VND-*). LoadVendorData(&ContactEditorData.VendorListPEN, &ContactEditorData.VendorListElement, lboVendorNamespace, &VendorCount); // Process the X-Tokens (X-*). LoadXTokenData(&ContactEditorData.XTokenListTokens, lboXToken, &XTokenCount); // Process the related people (RELATED). LoadRelatedData(&ContactEditorData.GeneralRelatedList, &ContactEditorData.GeneralRelatedListPref, &ContactEditorData.GeneralRelatedListType, lboRelated, &RelatedCount); // Process the full name (FN). LoadData(&ContactEditorData.FullNamesList, cmbDisplayAs); FMTimer.SetFilename(Filename); FMTimer.Start(10000, FALSE); EditMode = TRUE; return TRUE; } void frmContactEditor::SplitValues(wxString *PropertyLine, std::map *SplitPoints, std::map *SplitLength, int intSize){ // Split the values. size_t intPropertyLen = PropertyLine->Len(); int intSplitsFound = 0; int intSplitSize = 0; int intSplitSeek = 0; for (int i = intSize; i <= intPropertyLen; i++){ intSplitSize++; if (PropertyLine->Mid(i, 1) == wxT(";") && PropertyLine->Mid((i - 1), 1) != wxT("\\")){ if (intSplitsFound == 0){ SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize))); } else { SplitLength->insert(std::make_pair(intSplitsFound, (intSplitSize - 1))); } SplitPoints->insert(std::make_pair(intSplitsFound, (i + 1))); intSplitsFound++; intSplitSeek = i; intSplitSize = 0; } } if (intSplitsFound == 0){ SplitPoints->insert(std::make_pair(intSplitsFound, (8 + 1))); SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize)); } else { SplitPoints->insert(std::make_pair(intSplitsFound, (intSplitSeek + 1))); SplitLength->insert(std::make_pair(intSplitsFound, intSplitSize)); } } void frmContactEditor::LoadData(std::map *GeneralList, std::map *GeneralListPref, wxListCtrl *GeneralListCtrl, std::map *HomeList, std::map *HomeListPref, wxListCtrl *HomeListCtrl, std::map *BusinessList, std::map *BusinessListPref, wxListCtrl *BusinessListCtrl, int *DataCount){ // Load data into the controls (first section of data and preference // only). long ListCtrlIndex = -1; // Deal with the general items. for (std::map::iterator Iter = GeneralList->begin(); Iter != GeneralList->end(); Iter++){ wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); coldata.SetText(Iter->second); ListCtrlIndex = GeneralListCtrl->InsertItem(coldata); if (MapDataExists(DataCount, GeneralListPref)){ GeneralListCtrl->SetItem(ListCtrlIndex, 1, wxString::Format("%i", GeneralListPref->find(*DataCount)->second)); } (*DataCount)++; } // Deal with the home items. for (std::map::iterator Iter = HomeList->begin(); Iter != HomeList->end(); Iter++){ wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); coldata.SetText(Iter->second); ListCtrlIndex = HomeListCtrl->InsertItem(coldata); if (MapDataExists(DataCount, HomeListPref)){ HomeListCtrl->SetItem(ListCtrlIndex, 1, wxString::Format("%i", HomeListPref->find(*DataCount)->second)); } (*DataCount)++; } // Deal with the work items. for (std::map::iterator Iter = BusinessList->begin(); Iter != BusinessList->end(); Iter++){ wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); coldata.SetText(Iter->second); ListCtrlIndex = BusinessListCtrl->InsertItem(coldata); if (MapDataExists(DataCount, BusinessListPref)){ BusinessListCtrl->SetItem(ListCtrlIndex, 1, wxString::Format("%i", BusinessListPref->find(*DataCount)->second)); } (*DataCount)++; } } void frmContactEditor::LoadData(std::map *GeneralList, std::map *GeneralListPref, std::map *GeneralListType, wxListCtrl *GeneralListCtrl, std::map *HomeList, std::map *HomeListPref, std::map *HomeListType, wxListCtrl *HomeListCtrl, std::map *BusinessList, std::map *BusinessListPref, std::map *BusinessListType, wxListCtrl *BusinessListCtrl, int *DataCount){ // Load data into the controls (first section of data, // type and preference). long ListCtrlIndex = -1; // Deal with the general items. for (std::map::iterator Iter = GeneralList->begin(); Iter != GeneralList->end(); Iter++){ wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); coldata.SetText(Iter->second); ListCtrlIndex = GeneralListCtrl->InsertItem(coldata); if (MapDataExists(DataCount, GeneralListPref)){ GeneralListCtrl->SetItem(ListCtrlIndex, 2, wxString::Format("%i", GeneralListPref->find(*DataCount)->second)); } if (MapDataExists(DataCount, GeneralListType)){ GeneralListCtrl->SetItem(ListCtrlIndex, 1, GeneralListType->find(*DataCount)->second); } (*DataCount)++; } // Deal with the home items. for (std::map::iterator Iter = HomeList->begin(); Iter != HomeList->end(); Iter++){ wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); coldata.SetText(Iter->second); ListCtrlIndex = HomeListCtrl->InsertItem(coldata); if (MapDataExists(DataCount, HomeListPref)){ HomeListCtrl->SetItem(ListCtrlIndex, 2, wxString::Format("%i", HomeListPref->find(*DataCount)->second)); } if (MapDataExists(DataCount, HomeListType)){ HomeListCtrl->SetItem(ListCtrlIndex, 1, HomeListType->find(*DataCount)->second); } (*DataCount)++; } // Deal with the work items. for (std::map::iterator Iter = BusinessList->begin(); Iter != BusinessList->end(); Iter++){ wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); coldata.SetText(Iter->second); ListCtrlIndex = BusinessListCtrl->InsertItem(coldata); if (MapDataExists(DataCount, BusinessListPref)){ BusinessListCtrl->SetItem(ListCtrlIndex, 2, wxString::Format("%i", BusinessListPref->find(*DataCount)->second)); } if (MapDataExists(DataCount, BusinessListType)){ BusinessListCtrl->SetItem(ListCtrlIndex, 1, BusinessListType->find(*DataCount)->second); } (*DataCount)++; } } void frmContactEditor::LoadData(std::map *ItemList, std::map *ItemListPref, wxListCtrl *ItemCtrl, int *DataCount){ // Load the data (name and preference only). long ListCtrlIndex = -1; for (std::map::iterator Iter = ItemList->begin(); Iter != ItemList->end(); Iter++){ wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); coldata.SetText(Iter->second); ListCtrlIndex = ItemCtrl->InsertItem(coldata); if (MapDataExists(DataCount, ItemListPref)){ ItemCtrl->SetItem(ListCtrlIndex, 1, wxString::Format("%i", ItemListPref->find(*DataCount)->second)); } (*DataCount)++; } } void frmContactEditor::LoadData(std::map *ItemList, std::map *ItemListPref, std::map *ItemListType, wxListCtrl *ItemCtrl, int *DataCount){ // Load the data (name, preference and type). long ListCtrlIndex = -1; for (std::map::iterator Iter = ItemList->begin(); Iter != ItemList->end(); Iter++){ wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); coldata.SetText(Iter->second); ListCtrlIndex = ItemCtrl->InsertItem(coldata); if (MapDataExists(DataCount, ItemListType)){ ItemCtrl->SetItem(ListCtrlIndex, 1, ItemListType->find(*DataCount)->second); } if (MapDataExists(DataCount, ItemListPref)){ ItemCtrl->SetItem(ListCtrlIndex, 2, wxString::Format("%i", ItemListPref->find(*DataCount)->second)); } (*DataCount)++; } } void frmContactEditor::LoadData(wxString ItemName, std::map *ItemList, std::map *ItemListPref, std::map *ItemListType, std::map *ItemListDataType, wxListCtrl *ItemCtrl, int *DataCount){ // Load data (name, preference, type and data type). long ListCtrlIndex = -1; for (std::map::iterator Iter = ItemList->begin(); Iter != ItemList->end(); Iter++){ wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); coldata.SetText(Iter->second); if (ItemName == "KEY"){ // Get the key type, if any. if (MapDataExists(DataCount, ItemListDataType)){ if (ItemListDataType->find(*DataCount)->second == "application/pgp-keys"){ coldata.SetText(_("PGP Key")); } } else { coldata.SetText(_("Key")); } } ListCtrlIndex = ItemCtrl->InsertItem(coldata); if (MapDataExists(DataCount, ItemListType)){ if (ItemListType->find(*DataCount)->second == "home"){ ItemCtrl->SetItem(ListCtrlIndex, 1, _("Home")); } else if (ItemListType->find(*DataCount)->second == "work"){ ItemCtrl->SetItem(ListCtrlIndex, 1, _("Work")); } } if (MapDataExists(DataCount, ItemListPref)){ ItemCtrl->SetItem(ListCtrlIndex, 2, wxString::Format("%i", ItemListPref->find(*DataCount)->second)); } (*DataCount)++; } } void frmContactEditor::LoadPictureData(wxString ItemName, std::map *ItemList, std::map *ItemListPref, std::map *ItemListType, wxListCtrl *ItemCtrl, int *DataCount){ // Load the picture data. long ListCtrlIndex = -1; for (std::map::iterator Iter = ItemList->begin(); Iter != ItemList->end(); Iter++){ wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); if (ItemName == "PHOTO"){ coldata.SetText("Picture"); } else if (ItemName == "LOGO"){ coldata.SetText("Logo"); } else if (ItemName == "SOUND"){ coldata.SetText("Sound"); } else { coldata.SetText("Object"); } ListCtrlIndex = ItemCtrl->InsertItem(coldata); if (MapDataExists(DataCount, ItemListType)){ if (ItemListType->find(*DataCount)->second == "home"){ ItemCtrl->SetItem(ListCtrlIndex, 1, _("Home")); } else if (ItemListType->find(*DataCount)->second == "work"){ ItemCtrl->SetItem(ListCtrlIndex, 1, _("Work")); } } if (MapDataExists(DataCount, ItemListPref)){ ItemCtrl->SetItem(ListCtrlIndex, 2, wxString::Format("%i", ItemListPref->find(*DataCount)->second)); } (*DataCount)++; } } void frmContactEditor::LoadVendorData(std::map *ItemListPEN, std::map *ItemListElement, wxListCtrl *ItemCtrl, int *DataCount){ // Load the vendor data. long ListCtrlIndex = -1; wxString ItemValue; for (std::map::iterator Iter = ItemListPEN->begin(); Iter != ItemListPEN->end(); Iter++){ ItemValue.clear(); wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); ItemValue.Append(ItemListPEN->find(*DataCount)->second); ItemValue.Append("-"); ItemValue.Append(ItemListElement->find(*DataCount)->second); coldata.SetText(ItemValue); ListCtrlIndex = ItemCtrl->InsertItem(coldata); (*DataCount)++; } } void frmContactEditor::LoadXTokenData(std::map *ItemListTokens, wxListCtrl *ItemCtrl, int *DataCount){ // Load the X-Token data. long ListCtrlIndex = -1; wxString ItemValue; for (std::map::iterator Iter = ItemListTokens->begin(); Iter != ItemListTokens->end(); Iter++){ ItemValue.clear(); wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); ItemValue.Append(ItemListTokens->find(*DataCount)->second); coldata.SetText(ItemValue); ListCtrlIndex = ItemCtrl->InsertItem(coldata); (*DataCount)++; } } void frmContactEditor::LoadData(std::map *ItemList, wxComboBox *ItemCtrl){ // Load data into a wxComboBox. int ItemIndex = 0; if (MapDataExists(&ItemIndex, ItemList)){ cmbDisplayAs->SetValue(ItemList->find(0)->second); } } void frmContactEditor::LoadRelatedData(std::map *ItemList, std::map *ItemListPref, std::map *ItemListType, wxListCtrl *ItemCtrl, int *DataCount){ // Load related data (name, preference and type). long ListCtrlIndex = -1; wxString RelatedType; for (std::map::iterator Iter = ItemList->begin(); Iter != ItemList->end(); Iter++){ RelatedType.clear(); wxListItem coldata; coldata.SetId(*DataCount); coldata.SetData(*DataCount); if (MapDataExists(DataCount, ItemListType)){ std::map::iterator TypeIter = ItemListType->find(*DataCount); if (TypeIter->second == wxT("contact")){ RelatedType = _("Contact"); } else if (TypeIter->second == wxT("acquaintance")){ RelatedType = _("Acquaintance"); } else if (TypeIter->second == wxT("friend")){ RelatedType = _("Friend"); } else if (TypeIter->second == wxT("met")){ RelatedType = _("Met"); } else if (TypeIter->second == wxT("co-worker")){ RelatedType = _("Co-worker"); } else if (TypeIter->second == wxT("colleague")){ RelatedType = _("Colleague"); } else if (TypeIter->second == wxT("co-resident")){ RelatedType = _("Co-resident"); } else if (TypeIter->second == wxT("neighbor")){ RelatedType = _("Neighbour"); } else if (TypeIter->second == wxT("child")){ RelatedType = _("Child"); } else if (TypeIter->second == wxT("parent")){ RelatedType = _("Parent"); } else if (TypeIter->second == wxT("sibling")){ RelatedType = _("Sibling"); } else if (TypeIter->second == wxT("spouse")){ RelatedType = _("Spouse"); } else if (TypeIter->second == wxT("kin")){ RelatedType = _("Kin"); } else if (TypeIter->second == wxT("muse")){ RelatedType = _("Muse"); } else if (TypeIter->second == wxT("crush")){ RelatedType = _("Crush"); } else if (TypeIter->second == wxT("date")){ RelatedType = _("Date"); } else if (TypeIter->second == wxT("sweetheart")){ RelatedType = _("Sweetheart"); } else if (TypeIter->second == wxT("me")){ RelatedType = _("Me"); } else if (TypeIter->second == wxT("agent")){ RelatedType = _("Agent"); } else if (TypeIter->second == wxT("emergency")){ RelatedType = _("Emergency"); } else { RelatedType = TypeIter->second; } } coldata.SetText(RelatedType); ListCtrlIndex = ItemCtrl->InsertItem(coldata); if (MapDataExists(DataCount, ItemList)){ ItemCtrl->SetItem(ListCtrlIndex, 1, ItemList->find(*DataCount)->second); } if (MapDataExists(DataCount, ItemListPref)){ ItemCtrl->SetItem(ListCtrlIndex, 2, wxString::Format("%i", ItemListPref->find(*DataCount)->second)); } (*DataCount)++; } } void frmContactEditor::LoadKind(ContactKindType *KindType){ // Load contact kind. switch (*KindType){ case CONTACTKIND_INDIVIDUAL: cmbType->SetSelection(1); break; case CONTACTKIND_GROUP: cmbType->SetSelection(2); break; case CONTACTKIND_ORGANISATION: cmbType->SetSelection(3); break; case CONTACTKIND_LOCATION: cmbType->SetSelection(4); break; case CONTACTKIND_NONE: cmbType->SetSelection(0); break; } wxCommandEvent nullevent; UpdateMembersTab(nullevent); } void frmContactEditor::LoadBirthday(wxString *BirthdayData, bool *BirthdayText){ // Load Birthday. if (BirthdayData->IsEmpty()){ return; } if (*BirthdayText == FALSE){ int DateYear = 0; wxDateTime::Month DateMonth; unsigned int DateDay; wxString wxSData; if (BirthdayData->Mid(0, 2) == wxT("--")){ // Skip year. } else { DateYear = wxAtoi(BirthdayData->Mid(0,4)); } DateMonth = (wxDateTime::Month)(wxAtoi(BirthdayData->Mid(4,2)) - 1); DateDay = wxAtoi(BirthdayData->Mid(6,2)); wxDateTime BDayDate(DateDay,DateMonth,DateYear); dapBirthday->SetValue(BDayDate); } else { txtBirthday->SetValue(*BirthdayData); } } void frmContactEditor::LoadAnniversary(wxString *AnniversaryData, bool *AnniversaryText){ // Load Anniversary. if (AnniversaryData->IsEmpty()){ return; } if (*AnniversaryText == FALSE){ int DateYear = 0; wxDateTime::Month DateMonth; int DateDay; wxString wxSData; if (AnniversaryData->Mid(0, 2) == wxT("--")){ // Skip year. } else { DateYear = wxAtoi(AnniversaryData->Mid(0,4)); } DateMonth = (wxDateTime::Month)(wxAtoi(AnniversaryData->Mid(4,2)) - 1); DateDay = wxAtoi(AnniversaryData->Mid(6,2)); wxDateTime ADayDate(DateDay,DateMonth,DateYear); dapAnniversary->SetValue(ADayDate); } else { txtAnniversary->SetValue(*AnniversaryData); } } void frmContactEditor::LoadGender(wxString *GenderComponent, wxString *GenderIdentity){ // Load Gender. // Deal with the Gender Component. if (*GenderComponent == wxT("M")){ // Gender is Male. cmbGender->SetSelection(1); } else if (*GenderComponent == wxT("F")){ // Gender is Female. cmbGender->SetSelection(2); } else if (*GenderComponent == wxT("O")){ // Gender is Other. cmbGender->SetSelection(3); } else if (*GenderComponent == wxT("N")){ // Gender is None/Not Applicable. cmbGender->SetSelection(4); } else if (*GenderComponent == wxT("U")){ // Gender is Unknown. cmbGender->SetSelection(5); } // Deal with the Gender Identity. txtGenderDescription->SetValue(*GenderIdentity); } void frmContactEditor::LoadName(wxString *NameTitle, wxString *NameForename, wxString *NameSurname, wxString *NameOtherNames, wxString *NameSuffix){ // Load Name. txtTitle->SetValue(*NameTitle); txtForename->SetValue(*NameForename); txtSurname->SetValue(*NameSurname); txtOtherNames->SetValue(*NameOtherNames); txtSuffix->SetValue(*NameSuffix); } void frmContactEditor::LoadMember(std::map *GroupList){ // Load group data. // Go through the list of contacts for the account and find the matching UID. // If contact with UID doesn't match then say (unknown contact). XABViewMode XVMData; if (StartupEditMode == FALSE){ XVMData = MainPtr->GetViewMode(); } wxString AccountDirFinal = GetAccountDir(wxSContactAccount, FALSE); wxString vCardFilename; wxString vCardFilenameFull; wxString vCardDataString; wxString lwxs; wxString setname, setvalue; wxString MemberData; bool FoundContact = FALSE; std::multimap> vCardNamesAsc; std::multimap> vCardNamesDsc; wxDir vcardaccdir(AccountDirFinal); for (std::map::iterator MemberIter = GroupList->begin(); MemberIter != GroupList->end(); MemberIter++){ MemberData = MemberIter->second; bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES); while(ProcFiles){ 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(AccountDirFinal); vCardFilenameFull.Append(wxT("/")); vCardFilenameFull.Append(vCardFilename); Person.LoadFile(vCardFilenameFull); if (MemberData.Left(9) == wxT("urn:uuid:")){ wxString NewPropValue; NewPropValue = MemberData.Mid(9, wxString::npos); MemberData = NewPropValue; } if (Person.MeetBaseSpecification()){ wxString KindStatus = Person.Get(wxT("KIND")); if (KindStatus == wxT("group")){ vCardFilename.Clear(); vCardFilenameFull.Clear(); vCardDataString.Clear(); ProcFiles = vcardaccdir.GetNext(&vCardFilename); continue; } wxString PersonName = Person.Get(wxT("N")); wxString PersonUID = Person.Get(wxT("UID")); wxString PersonFilename = vCardFilenameFull; if (PersonUID != MemberData){ vCardFilename.Clear(); vCardFilenameFull.Clear(); vCardDataString.Clear(); ProcFiles = vcardaccdir.GetNext(&vCardFilename); continue; } else { FoundContact = TRUE; } //ContactsNames.insert(std::make_pair(PersonName, ContactIndex)); //ContactsUIDs.insert(std::make_pair(ContactIndex, PersonUID)); if (XVMData.SortMode == 1){ // Split the name into sections. vCardDataString = Person.Get(wxT("N")); vCardName NameData = Person.GetName(); vCardDataString = NameData.Forename + wxT(" ") + NameData.Surname; } else if (XVMData.SortMode == 2){ // Split the name into sections. vCardName NameData = Person.GetName(); vCardDataString = NameData.Surname + wxT(", ") + NameData.Forename; } else if (XVMData.SortMode == 3){ // Check and make sure that the top most nickname is used. vCardDataString = Person.Get(wxT("NICKNAME")); if (vCardDataString.IsEmpty()){ vCardDataString = wxT("(no nickname)"); } } else if (XVMData.SortMode == 4){ vCardDataString = Person.Get(wxT("FN")); } if (XVMData.AscendingMode == TRUE){ vCardNamesAsc.insert(std::make_pair(vCardDataString, PersonUID)); } else { vCardNamesDsc.insert(std::make_pair(vCardDataString, PersonUID)); } } else { } } vCardFilename.Clear(); vCardFilenameFull.Clear(); vCardDataString.Clear(); ProcFiles = vcardaccdir.GetNext(&vCardFilename); } if (FoundContact == FALSE){ if (XVMData.AscendingMode == TRUE){ vCardNamesAsc.insert(std::make_pair(MemberIter->second, MemberIter->second)); } else { vCardNamesDsc.insert(std::make_pair(MemberIter->second, MemberIter->second)); } } if (XVMData.AscendingMode == TRUE){ for (std::map::iterator iter = vCardNamesAsc.begin(); iter != vCardNamesAsc.end(); ++iter){ wxListItem ItemData; ItemData.SetId(0); ItemData.SetText(iter->first); lboGroups->InsertItem(ItemData); } } else { for (std::map::iterator iter = vCardNamesDsc.begin(); iter != vCardNamesDsc.end(); ++iter){ wxListItem ItemData; ItemData.SetId(0); ItemData.SetText(iter->first); lboGroups->InsertItem(ItemData); } } } } void frmContactEditor::LoadAddress(std::map *GeneralAddressList, std::map *GeneralAddressListTown, std::map *GeneralAddressListCounty, std::map *GeneralAddressListPostCode, std::map *GeneralAddressListPref, std::map *HomeAddressList, std::map *HomeAddressListTown, std::map *HomeAddressListCounty, std::map *HomeAddressListPostCode, std::map *HomeAddressListPref, std::map *BusinessAddressList, std::map *BusinessAddressListTown, std::map *BusinessAddressListCounty, std::map *BusinessAddressListPostCode, std::map *BusinessAddressListPref, int *AddressCount){ // Load address. long ListCtrlIndex = -1; // Deal with the general addresses. for (std::map::iterator Iter = GeneralAddressList->begin(); Iter != GeneralAddressList->end(); Iter++){ wxListItem coldata; coldata.SetId(*AddressCount); coldata.SetData(*AddressCount); coldata.SetText(Iter->second); ListCtrlIndex = lboAddresses->InsertItem(coldata); if (MapDataExists(AddressCount, GeneralAddressListTown)){ lboAddresses->SetItem(ListCtrlIndex, 1, GeneralAddressListTown->find(*AddressCount)->second); } if (MapDataExists(AddressCount, GeneralAddressListCounty)){ lboAddresses->SetItem(ListCtrlIndex, 2, GeneralAddressListCounty->find(*AddressCount)->second); } if (MapDataExists(AddressCount, GeneralAddressListPostCode)){ lboAddresses->SetItem(ListCtrlIndex, 3, GeneralAddressListPostCode->find(*AddressCount)->second); } if (MapDataExists(AddressCount, GeneralAddressListPref)){ lboAddresses->SetItem(ListCtrlIndex, 4, wxString::Format("%i", GeneralAddressListPref->find(*AddressCount)->second)); } (*AddressCount)++; } // Deal with the home addresses. for (std::map::iterator Iter = HomeAddressList->begin(); Iter != HomeAddressList->end(); Iter++){ wxListItem coldata; coldata.SetId(*AddressCount); coldata.SetData(*AddressCount); coldata.SetText(Iter->second); ListCtrlIndex = lboHomeAddresses->InsertItem(coldata); if (MapDataExists(AddressCount, HomeAddressListTown)){ lboHomeAddresses->SetItem(ListCtrlIndex, 1, HomeAddressListTown->find(*AddressCount)->second); } if (MapDataExists(AddressCount, HomeAddressListCounty)){ lboHomeAddresses->SetItem(ListCtrlIndex, 2, HomeAddressListCounty->find(*AddressCount)->second); } if (MapDataExists(AddressCount, HomeAddressListPostCode)){ lboHomeAddresses->SetItem(ListCtrlIndex, 3, HomeAddressListPostCode->find(*AddressCount)->second); } if (MapDataExists(AddressCount, HomeAddressListPref)){ lboHomeAddresses->SetItem(ListCtrlIndex, 4, wxString::Format("%i", HomeAddressListPref->find(*AddressCount)->second)); } (*AddressCount)++; } // Deal with the work addresses. for (std::map::iterator Iter = BusinessAddressList->begin(); Iter != BusinessAddressList->end(); Iter++){ wxListItem coldata; coldata.SetId(*AddressCount); coldata.SetData(*AddressCount); coldata.SetText(Iter->second); ListCtrlIndex = lboBusinessAddresses->InsertItem(coldata); if (MapDataExists(AddressCount, BusinessAddressListTown)){ lboBusinessAddresses->SetItem(ListCtrlIndex, 1, BusinessAddressListTown->find(*AddressCount)->second); } if (MapDataExists(AddressCount, BusinessAddressListCounty)){ lboBusinessAddresses->SetItem(ListCtrlIndex, 2, BusinessAddressListCounty->find(*AddressCount)->second); } if (MapDataExists(AddressCount, BusinessAddressListPostCode)){ lboBusinessAddresses->SetItem(ListCtrlIndex, 3, BusinessAddressListPostCode->find(*AddressCount)->second); } if (MapDataExists(AddressCount, BusinessAddressListPref)){ lboBusinessAddresses->SetItem(ListCtrlIndex, 4, wxString::Format("%i", BusinessAddressListPref->find(*AddressCount)->second)); } (*AddressCount)++; } }