1 // frmMain.cpp - Main window form.
3 // (c) 2012-2015 Xestia Software Development.
5 // This file is part of Xestia Address Book.
7 // Xestia Address Book is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by the
9 // Free Software Foundation, version 3 of the license.
11 // Xestia Address Book is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Address Book. If not, see <http://www.gnu.org/licenses/>
25 #include <wx/tokenzr.h>
27 #include <wx/mstream.h>
28 #include <wx/fs_mem.h>
30 #include <wx/filesys.h>
32 #include <wx/stdpaths.h>
33 #include <wx/fileconf.h>
34 #include <wx/gdicmn.h>
40 #include "frmPreferences.h"
41 #include "frmNewAccount.h"
42 #include "actmgr/frmActivityMgr.h"
43 #include "frmContact.h"
44 #include "frmConflictResolution.h"
45 #include "frmInvalidSSLCertificate.h"
46 #include "frmSearch.h"
47 #include "frmSSLCertificate.h"
48 #include "frmUpdate.h"
49 #include "import/frmImportResults.h"
52 #include "common/preferences.h"
53 #include "common/getcontactinfo.h"
54 #include "common/events.h"
55 #include "common/dirs.h"
56 #include "vcard/vcard.h"
57 #include "carddav/carddav.h"
58 #include "contacteditor/frmContactEditor.h"
59 #include "import/import.h"
60 #include "export/export.h"
61 #include "widgets/XABContactMenu.h"
62 #include "widgets/XABAccountView.h"
66 //extern const wxEventType MyHaremEvent = wxNewEventType();
68 //#define CE_UPDATECONTACTLIST 7700
69 //#define CE_UPDATEACCOUNTLIST 7701
71 DEFINE_EVENT_TYPE(CE_UPDATECONTACTLIST);
72 DEFINE_EVENT_TYPE(CE_UPDATEACCOUNTLIST);
73 DEFINE_EVENT_TYPE(SE_UPDATECONTACTNOTIF);
74 DEFINE_EVENT_TYPE(CE_OPENCONTACT);
75 DEFINE_EVENT_TYPE(CE_OPENCONTACTLIST);
76 DEFINE_EVENT_TYPE(CE_NEWCONTACT);
77 DEFINE_EVENT_TYPE(CE_EDITCONTACT);
78 DEFINE_EVENT_TYPE(CE_DELETECONTACT);
79 DEFINE_EVENT_TYPE(CE_REVEALCONTACT);
80 DEFINE_EVENT_TYPE(CE_REMOVECONTACT);
81 DEFINE_EVENT_TYPE(CE_REMOVESEARCH);
82 DEFINE_EVENT_TYPE(SYNC_EMPTYSERVER);
83 DEFINE_EVENT_TYPE(ACTMGR_START);
84 DEFINE_EVENT_TYPE(ACTMGR_SHUFFLE);
85 DEFINE_EVENT_TYPE(ACTMGR_STOP);
86 DEFINE_EVENT_TYPE(WINDOW_ADD);
87 DEFINE_EVENT_TYPE(WINDOW_EDIT);
88 DEFINE_EVENT_TYPE(WINDOW_CLOSE);
89 DEFINE_EVENT_TYPE(CONNSTAT_UPDATE);
90 DEFINE_EVENT_TYPE(INVALIDSSLCERT);
91 DEFINE_EVENT_TYPE(GETSELECTEDLIST);
92 DEFINE_EVENT_TYPE(SYNCACCOUNT);
93 DEFINE_EVENT_TYPE(IMPORT_RESULTSSHOW);
94 DEFINE_EVENT_TYPE(RELOADCONTACTLIST);
95 DEFINE_EVENT_TYPE(REFRESHADDRESSBOOK);
97 BEGIN_EVENT_TABLE(frmMain, wxFrame)
98 EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, frmMain::ConflictResolution)
99 EVT_COMMAND(wxID_ANY, CE_UPDATECONTACTLIST, frmMain::UpdateContactList)
100 EVT_COMMAND(wxID_ANY, CE_UPDATEACCOUNTLIST, frmMain::UpdateAccountList)
101 EVT_COMMAND(wxID_ANY, SE_UPDATECONTACTNOTIF, frmMain::UpdateSearchContactLists)
102 EVT_COMMAND(wxID_ANY, CE_OPENCONTACT, frmMain::OpenContactInfo)
103 EVT_COMMAND(wxID_ANY, CE_OPENCONTACTLIST, frmMain::OpenContactInfoList)
104 EVT_COMMAND(wxID_ANY, CE_NEWCONTACT, frmMain::ShowContactEditorNew)
105 EVT_COMMAND(wxID_ANY, CE_EDITCONTACT, frmMain::ShowContactEditorEdit)
106 EVT_COMMAND(wxID_ANY, CE_DELETECONTACT, frmMain::DeleteContact)
107 EVT_COMMAND(wxID_ANY, CE_REVEALCONTACT, frmMain::RevealContact)
108 EVT_COMMAND(wxID_ANY, CE_REMOVESEARCH, frmMain::RemoveContactsWindowPointer)
109 EVT_COMMAND(wxID_ANY, SYNC_EMPTYSERVER, frmMain::EmptyServerDialog)
110 EVT_COMMAND(wxID_ANY, ACTMGR_START, frmMain::ActivityIconStart)
111 EVT_COMMAND(wxID_ANY, ACTMGR_SHUFFLE, frmMain::ActivityIconShuffle)
112 EVT_COMMAND(wxID_ANY, ACTMGR_STOP, frmMain::ActivityIconStop)
113 EVT_COMMAND(wxID_ANY, WINDOW_ADD, frmMain::WindowAdd)
114 EVT_COMMAND(wxID_ANY, WINDOW_EDIT, frmMain::WindowEdit)
115 EVT_COMMAND(wxID_ANY, WINDOW_CLOSE, frmMain::WindowDelete)
116 EVT_COMMAND(wxID_ANY, CONNSTAT_UPDATE, frmMain::UpdateConnectionStatus)
117 EVT_COMMAND(wxID_ANY, INVALIDSSLCERT, frmMain::InvalidSSLCertificate)
118 EVT_COMMAND(wxID_ANY, GETSELECTEDLIST, frmMain::GetSelectedList)
119 EVT_COMMAND(wxID_ANY, SYNCACCOUNT, frmMain::SyncAccount)
120 EVT_COMMAND(wxID_ANY, IMPORT_RESULTSSHOW, frmMain::ShowImportResults)
121 EVT_COMMAND(wxID_ANY, RELOADCONTACTLIST, frmMain::ReloadContactList)
122 EVT_COMMAND(wxID_ANY, REFRESHADDRESSBOOK, frmMain::RefreshAddressBook)
125 frmMain::frmMain( wxWindow* parent )
130 // Setup the account icons.
132 wxMemoryInputStream astream(icons_accinet_png, sizeof(icons_accinet_png));
133 wxMemoryInputStream bstream(icons_acclocal_png, sizeof(icons_acclocal_png));
134 wxMemoryInputStream cstream(icons_accgroup_png, sizeof(icons_accgroup_png));
135 wxMemoryInputStream dstream(icons_accnone_png, sizeof(icons_accnone_png));
137 wxImage icons_accinet_png(astream, wxBITMAP_TYPE_PNG);
138 wxBitmap AccInet(icons_accinet_png, -1);
140 wxIAccInet.CopyFromBitmap(AccInet);
142 wxImage icons_acclocal_png(bstream, wxBITMAP_TYPE_PNG);
143 wxBitmap AccNIcon(icons_acclocal_png, -1);
145 wxIAccNIcon.CopyFromBitmap(AccNIcon);
147 wxImage icons_accgroup_png(cstream, wxBITMAP_TYPE_PNG);
148 wxBitmap AccGrp(icons_accgroup_png, -1);
150 wxIAccGrp.CopyFromBitmap(AccGrp);
152 wxImage icons_accnone_png(dstream, wxBITMAP_TYPE_PNG);
153 wxBitmap AccNone(icons_accnone_png, -1);
155 wxIAccNone.CopyFromBitmap(AccNone);
157 AccountID = AccImgList->Add(wxIAccNIcon);
158 AccountNetID = AccImgList->Add(wxIAccInet);
159 AccountGrpID = AccImgList->Add(wxIAccGrp);
160 AccountNoneID = AccImgList->Add(wxIAccNone);
162 bmpIcon->SetIcon(AccImgList->GetIcon(AccountNoneID));
164 // Setup the status bar icons.
168 wxMemoryInputStream sslstream(icons_ssl_png, sizeof(icons_ssl_png));
169 wxMemoryInputStream sslwarningstream(icons_sslwarning_png, sizeof(icons_sslwarning_png));
170 wxMemoryInputStream nosslstream(icons_nossl_png, sizeof(icons_nossl_png));
172 wxImage icons_ssl_png(sslstream, wxBITMAP_TYPE_PNG);
173 imgSSL = new wxBitmap(icons_ssl_png, -1);
175 wxImage icons_sslwarning_png(sslwarningstream, wxBITMAP_TYPE_PNG);
176 imgSSLWarning = new wxBitmap(icons_sslwarning_png, -1);
178 wxImage icons_nossl_png(nosslstream, wxBITMAP_TYPE_PNG);
179 imgNoSSL = new wxBitmap(icons_nossl_png, -1);
183 wxMemoryInputStream act1(icons_act1_png, sizeof(icons_act1_png));
184 wxMemoryInputStream act2(icons_act2_png, sizeof(icons_act2_png));
185 wxMemoryInputStream act3(icons_act3_png, sizeof(icons_act3_png));
186 wxMemoryInputStream act4(icons_act4_png, sizeof(icons_act4_png));
187 wxMemoryInputStream actsleep(icons_actsleep_png, sizeof(icons_actsleep_png));
189 wxImage icons_actsleep_png(actsleep, wxBITMAP_TYPE_PNG);
190 imgActIconSleep = new wxBitmap (icons_actsleep_png, -1);
192 wxImage icons_act1_png(act1, wxBITMAP_TYPE_PNG);
193 imgActIcon1 = new wxBitmap (icons_act1_png, -1);
195 wxIAct1icon.CopyFromBitmap(*imgActIcon1);
197 wxImage icons_act2_png(act2, wxBITMAP_TYPE_PNG);
198 imgActIcon2 = new wxBitmap (icons_act2_png, -1);
200 wxIAct2icon.CopyFromBitmap(*imgActIcon2);
202 wxImage icons_act3_png(act3, wxBITMAP_TYPE_PNG);
203 imgActIcon3 = new wxBitmap (icons_act3_png, -1);
205 wxIAct3icon.CopyFromBitmap(*imgActIcon3);
207 wxImage icons_act4_png(act4, wxBITMAP_TYPE_PNG);
208 imgActIcon4 = new wxBitmap (icons_act4_png, -1);
210 wxIAct4icon.CopyFromBitmap(*imgActIcon4);
212 // Online/Offline icons.
214 wxMemoryInputStream onlinestream(icons_online_png, sizeof(icons_online_png));
215 wxMemoryInputStream offlinestream(icons_offline_png, sizeof(icons_offline_png));
217 wxImage icons_online_png(onlinestream, wxBITMAP_TYPE_PNG);
218 imgOnline = new wxBitmap(icons_online_png, -1);
220 wxImage icons_offline_png(offlinestream, wxBITMAP_TYPE_PNG);
221 imgOffline = new wxBitmap(icons_offline_png, -1);
223 // Setup the account view.
225 AccCtrl->SetPopupControl(treAccounts);
226 AccCtrl->SetPopupMaxHeight(175);
227 AccCtrl->SetPopupMinWidth(250);
228 treAccounts->AssignImageList(AccImgList);
231 /*wxStaticBitmap* BeepBoop = new wxStaticBitmap(AccCtrl, wxID_ANY, wxNullBitmap, wxPoint(AccTextCtrlSize.GetX() + 3, AccTextCtrlSize.GetY() + 2), wxDefaultSize, 0);
233 icons_accgroup_png.SetMask(new wxMask(icons_accgroup_png, wxSystemSettings::GetColour(wxSYS_COLOUR_BACKGROUND)));
235 BeepBoop->SetBackgroundColour(AccCtrl->GetBackgroundColour());
236 BeepBoop->SetBitmap(icons_accgroup_png);*/
238 //szrContactList->Insert(0, XABV2, 1, wxEXPAND | wxALL, 0);
240 /*AccControl->UseAltPopupWindow();
241 AccControl->SetPopupControl(treAccounts);
242 AccControl->SetPopupMaxHeight(175);
244 treAccounts->AssignImageList(AccImgList);
245 szrContactList->Insert(0, AccControl, 1, wxEXPAND|wxALL, 0);
246 szrAccList->Add(AccIcon, 0, wxLEFT|wxTOP|wxEXPAND, 3);
250 //szrContactList->Layout();
251 //szrContactList->RecalcSizes();
253 wxListItem ColumnData;
255 ColumnData.SetText(wxT("Name0"));
256 ColumnData.SetWidth(320);
257 lstContacts->InsertColumn(0, ColumnData);
259 //Connect(wxID_ANY, ContactConflictCmdEnv,
260 // ContactConflictEventHandler(frmMain::ConflictResolution), NULL, this);
262 //Connect(wxID_ANY, MyFooCommandEvent,
263 // MyFooEventHandler(frmMain::DoSomething), NULL, this);
265 //Bind(ContactConflictCmdEnv, ContactConflictEventHandler(frmMain::ConflictResolution), this, wxID_ANY);
267 treAccounts->Connect(wxEVT_LEFT_DCLICK, wxTreeEventHandler(frmMain::LoadContactList), NULL, this);
268 treAccounts->Connect(wxEVT_TREE_SEL_CHANGED, wxTreeEventHandler(frmMain::LoadContactList), NULL, this);
270 #if defined(__HAIKU__)
272 #elif defined(__WIN32__)
274 int stbBottomData [4] = { -1, 8, 8, 8 };
278 int stbBottomData [4] = { -1, 20, 20, 20 };
282 stbBottom->SetFieldsCount(4, stbBottomData);
283 stbBottom->SetMinHeight(16);
288 stbBottom->GetFieldRect(1, rectOnline);
289 stbBottom->GetFieldRect(2, rectSSL);
290 stbBottom->GetFieldRect(3, rectActivity);
292 SSLToolTip = new wxToolTip(wxT(""));
294 imgConnStatus = new wxStaticBitmap(stbBottom, wxID_ANY, wxNullBitmap, wxPoint((rectOnline.GetX()),(rectOnline.GetY())), wxDefaultSize, 0 );
295 imgConnStatus->SetBitmap(*imgOnline);
296 imgConnStatus->Connect( wxEVT_LEFT_DCLICK, wxCommandEventHandler( frmMain::ToggleConnectionStatus ), NULL, this );
298 imgSSLStatus = new wxStaticBitmap(stbBottom, wxID_ANY, wxNullBitmap, wxPoint((rectSSL.GetX()),(rectSSL.GetY())), wxDefaultSize, 0 );
299 imgSSLStatus->SetBitmap(*imgNoSSL);
300 imgSSLStatus->SetToolTip(SSLToolTip);
301 imgSSLStatus->Connect( wxEVT_LEFT_DCLICK, wxCommandEventHandler( frmMain::ShowSSLCertificates ), NULL, this );
303 imgActivityStatus = new wxStaticBitmap(stbBottom, wxID_ANY, wxNullBitmap, wxPoint((rectActivity.GetX()),(rectActivity.GetY())), wxDefaultSize, 0);
304 imgActivityStatus->SetBitmap(*imgActIconSleep);
305 imgActivityStatus->Connect( wxEVT_LEFT_DCLICK, wxCommandEventHandler( frmMain::ShowActivityWindow ), NULL, this );
307 // Setup the window menu.
309 // By default should be:
314 // Contact editor windows:
320 mnuContactWindows = new wxMenuItem( mnuManage, wxID_ANY, wxString( _("Contact windows:") ), wxEmptyString, wxITEM_NORMAL );
321 mnuWindow->Append( mnuContactWindows );
323 mnuWindow->AppendSeparator();
325 mnuContactEditorWindows = new wxMenuItem( mnuManage, wxID_ANY, wxString( _("Contact editor windows:") ), wxEmptyString, wxITEM_NORMAL );
326 mnuWindow->Append( mnuContactEditorWindows );
328 mnuWindow->AppendSeparator();
330 mnuSearchWindows = new wxMenuItem( mnuManage, wxID_ANY, wxString( wxT("Search windows:") ), wxEmptyString, wxITEM_NORMAL );
331 mnuWindow->Append( mnuSearchWindows );
333 #if defined(__WIN32__)
338 mnuContactWindows->SetFont(fontstyle);
339 mnuContactEditorWindows->SetFont(fontstyle);
340 mnuSearchWindows->SetFont(fontstyle);
344 mnuContactWindows->Enable(FALSE);
345 mnuContactEditorWindows->Enable(FALSE);
346 mnuSearchWindows->Enable(FALSE);
350 // Hide unimplemented functions.
356 void frmMain::QuitApp( wxCloseEvent& event )
363 void frmMain::QuitApp( wxCommandEvent& event )
370 void frmMain::QuitApp()
372 //-------------------------------------------------------------------
373 // frmMain::QuitApp: Quits the application by simply closing this
374 // window which causes the exit as frmMain is the main window.
376 // wxCommandEvent Accepts a referenced event command.
377 //-------------------------------------------------------------------
379 //-------------------------------------------------------------------
380 // frmMain::QuitApp: Quits the application by simply closing this
381 // window which causes the exit as frmMain is the main window.
383 // wxCommandEvent Accepts a referenced event command.
384 //-------------------------------------------------------------------
386 //Go through the windows and close each one (be it search
387 //or contact editor). Abort if user wants to cancel.
389 // Close the contact editor windows.
391 // Close the contact windows.
393 // Close the search windows.
395 // Write out the ETag databases.
397 // Save Preferences: Save the window position if that option is enabled.
399 wxString SetFilename = GetUserPrefDir();
401 #if defined(__HAIKU__)
405 #elif defined(__WIN32__)
407 SetFilename.Append(wxT("settings"));
413 SetFilename.Append(wxT("settings"));
417 wxFileConfig *cfgfile = new wxFileConfig("", "", SetFilename);
419 bool SaveWindowPos = FALSE;
420 wxString SaveWindowInc;
421 cfgfile->Read(wxT("SaveWindowPosition"), &SaveWindowInc);
423 if (SaveWindowInc == wxT("true")){
425 SaveWindowPos = TRUE;
429 if (SaveWindowPos == TRUE){
431 wxRect frmMainPos = this->GetRect();
433 cfgfile->Write(wxT("WindowPositionX"), frmMainPos.GetX());
434 cfgfile->Write(wxT("WindowPositionY"), frmMainPos.GetY());
435 cfgfile->Write(wxT("WindowPositionHeight"), frmMainPos.GetHeight());
436 cfgfile->Write(wxT("WindowPositionWidth"), frmMainPos.GetWidth());
444 //Everything closed... exit.
452 void frmMain::ShowActivityWindow( wxCommandEvent& event )
455 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
456 frameActMgr->OpenWindow();
461 void frmMain::ShowAboutWindow( wxCommandEvent& event )
463 //-------------------------------------------------------------------
464 // frmMain::ShowAboutWindow: Shows the About window as a modal
465 // dialog and then cleans up when finished.
467 // wxCommandEvent Accepts a referenced event command.
468 //-------------------------------------------------------------------
470 frmAbout *frameAbout = new frmAbout ( this );
471 frameAbout->SetupAboutWindow();
472 frameAbout->ShowModal();
478 void frmMain::OpenPreferences( wxCommandEvent& event)
480 //-------------------------------------------------------------------
481 // frmMain::ShowAboutWindow: Opens the Preferences window as a modal
482 // dialog and then cleans up when finished.
484 // wxCommandEvent Accepts a referenced event command.
485 //-------------------------------------------------------------------
487 ReloadAccounts = FALSE;
489 frmPreferences *framePreferences = new frmPreferences ( this );
490 framePreferences->SetupPointers(&ReloadAccounts);
491 framePreferences->ShowModal();
492 delete framePreferences;
493 framePreferences = NULL;
495 if (ReloadAccounts == TRUE){
497 // Reload the accounts as a change has been made within
500 this->LoadPreferences();
506 void frmMain::OpenNewABDialog( wxCommandEvent& event)
508 //-------------------------------------------------------------------
509 // frmMain::ShowAboutWindow: Opens the Preferences window as a modal
510 // dialog and then cleans up when finished.
512 // wxCommandEvent Accepts a referenced event command.
513 //-------------------------------------------------------------------
515 ReloadAccounts = FALSE;
517 frmNewAccount *frameNewAccount = new frmNewAccount ( this );
518 frameNewAccount->SetupPointers(&ReloadAccounts);
519 frameNewAccount->ShowModal();
520 delete frameNewAccount;
521 frameNewAccount = NULL;
523 if (ReloadAccounts == TRUE){
525 // Reload the accounts as a change has been made within
528 this->LoadPreferences();
534 void frmMain::LoadContactList( wxTreeEvent& event )
537 // Clear all existing variables.
539 lstContacts->DeleteAllItems();
541 treAccounts->SetAccount();
543 wxTreeItemIdValue cookie;
544 wxTreeItemId next = treAccounts->GetRootItem();
545 wxString AccountName;
546 wxString AccountDir, AccountType, AccountDirFinal, AccountTypeFinal;
547 wxString AccountDirCmb;
548 long selectedaccount = 0;
550 wxTreeItemId selectedChild = treAccounts->GetSelection();
551 wxTreeItemId nextChild;
553 wxTreeItemId ActiveItemId = treAccounts->GetFocusedItem();
554 int ActiveItemIcon = treAccounts->GetItemImage(ActiveItemId, wxTreeItemIcon_Normal);
556 int SCImg = treAccounts->GetItemImage(selectedChild);
557 int AccountIndex = 0;
559 bmpIcon->SetIcon(AccImgList->GetIcon(SCImg));
561 for (int i = 0; i < prefaccounts.GetCount(); i++){
563 if (ActiveItemIcon == 2){
565 std::multimap<wxTreeItemId, int>::iterator AGTiter = AccountGroupTreeId.find(ActiveItemId);
566 std::multimap<int, int>::iterator AGLiter = AccountGroupList.find(AGTiter->second);
567 int ActiveAccountG = AGLiter->second;
569 if (i == ActiveAccountG){
571 AccountDir.Append(prefaccounts.GetAccountDirectory(i));
572 AccountType.Append(prefaccounts.GetAccountType(i));
577 if (AccountType == wxT("CardDAV")){
578 AccountTypeFinal.Append(wxT("carddav"));
580 else if (AccountType == wxT("Local")){
581 imgSSLStatus->SetBitmap(*imgOffline);
582 SSLToolTip->SetTip(wxT("SSL status is not applicable for this account"));
583 AccountTypeFinal.Append(wxT("local"));
594 nextChild = treAccounts->GetFirstChild(next, cookie);
597 nextChild = treAccounts->GetNextSibling(nextChild);
600 AccountName = treAccounts->GetItemText(nextChild);
602 if (nextChild == selectedChild){
603 AccountDir.Append(prefaccounts.GetAccountDirectory(i));
604 AccountType.Append(prefaccounts.GetAccountType(i));
609 if (AccountType == wxT("CardDAV")){
610 AccountTypeFinal.Append(wxT("carddav"));
612 else if (AccountType == wxT("Local")){
613 SSLToolTip->SetTip(wxT("SSL status is not applicable for this account"));
614 AccountTypeFinal.Append(wxT("local"));
623 if (selectedaccount >= prefaccounts.GetCount()){
625 // The account selected isn't there so return.
633 // Open the directory and get the list of .vcf files
634 // in that directory.
636 ActiveAccount = AccountDir + wxT(".") + AccountTypeFinal;
637 ActiveAccountType = AccountType;
639 SetupSSLStatus(AccountIndex);
641 AccountDirFinal.Clear();
642 AccountDirFinal = GetAccountDir(AccountDir + wxT(".") + AccountTypeFinal, FALSE);
644 ContactsFileIndex.Clear();
646 //wxString vcardfilenamewxs;
647 wxString vCardFilename;
648 wxString vCardFilenameFull;
649 wxString vCardDataString;
650 wxStringTokenizer vcardfileline;
652 wxString setname, setvalue;
653 //vCardNames = new std::map<wxString, wxString, std::greater<wxString>>;
654 std::multimap<wxString, wxString, std::greater<wxString>> vCardNamesAsc;
655 std::multimap<wxString, wxString, std::less<wxString>> vCardNamesDsc;
656 long ContactIndex = 1;
657 long ContactSeekPoint = 0;
659 wxDir vcardaccdir(AccountDirFinal);
661 // Get the wxTreeItemId and image icon and compare it to the list.
663 if (ActiveItemIcon == AccountGrpID){
665 // It's a group so load the file containing the group and
666 // get the members of the group.
671 std::multimap<wxTreeItemId, int>::iterator AGTiter = AccountGroupTreeId.find(ActiveItemId);
672 std::multimap<int, wxString>::iterator AGFiter = AccountGroupFilename.find(AGTiter->second);
673 //std::multimap<wxTreeItemId, int>::iterator AGFiter = AccountGroupTreeId.find(ActiveItemId);
675 Group.LoadFile(AGFiter->second);
677 ArrayvCardOutData vCardMember = Group.GetByPartial(wxT("MEMBER"));
679 for (int i = 0; i < vCardMember.PropCount; i++){
681 vCardMember.PropValues[i].Trim();
682 if (vCardMember.PropValues[i].Left(9) == wxT("urn:uuid:")){
684 wxString NewPropValue;
685 NewPropValue = vCardMember.PropValues[i].Mid(9, wxString::npos);
686 vCardMember.PropValues[i] = NewPropValue;
693 bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES);
696 if (vCardFilename.Right(4) == wxT(".vcf") ||
697 vCardFilename.Right(4) == wxT(".VCF") ||
698 vCardFilename.Right(5) == wxT(".vcard") ||
699 vCardFilename.Right(5) == wxT(".VCARD")){
702 bool FoundMember = FALSE;
704 vCardFilenameFull.Append(AccountDirFinal);
705 vCardFilenameFull.Append(wxT("/"));
706 vCardFilenameFull.Append(vCardFilename);
708 Person.LoadFile(vCardFilenameFull);
710 UIDCode = Person.Get(wxT("UID"));
712 for (int i = 0; i < vCardMember.PropCount; i++){
714 if (vCardMember.PropValues[i] == UIDCode){
722 if (FoundMember == FALSE){
724 vCardFilename.Clear();
725 vCardFilenameFull.Clear();
726 vCardDataString.Clear();
727 ProcFiles = vcardaccdir.GetNext(&vCardFilename);
732 if (Person.MeetBaseSpecification()){
736 // Split the name into sections.
738 vCardDataString = Person.Get(wxT("N"));
740 vCardName NameData = Person.GetName();
742 vCardDataString = NameData.Forename + wxT(" ") + NameData.Surname;
744 } else if (SortMode == 2){
746 // Split the name into sections.
748 vCardName NameData = Person.GetName();
750 vCardDataString = NameData.Surname + wxT(", ") + NameData.Forename;
752 } else if (SortMode == 3){
754 // Check and make sure that the top most nickname is used.
756 vCardDataString = Person.Get(wxT("NICKNAME"));
758 if (vCardDataString.IsEmpty()){
760 vCardDataString = wxT("(no nickname)");
764 } else if (SortMode == 4){
766 vCardDataString = Person.Get(wxT("FN"));
770 if (AscendingMode == TRUE){
771 vCardNamesAsc.insert(std::make_pair(vCardDataString, vCardFilenameFull));
773 vCardNamesDsc.insert(std::make_pair(vCardDataString, vCardFilenameFull));
782 vCardFilename.Clear();
783 vCardFilenameFull.Clear();
784 vCardDataString.Clear();
785 ProcFiles = vcardaccdir.GetNext(&vCardFilename);
790 bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES);
793 if (vCardFilename.Right(4) == wxT(".vcf") ||
794 vCardFilename.Right(4) == wxT(".VCF") ||
795 vCardFilename.Right(5) == wxT(".vcard") ||
796 vCardFilename.Right(5) == wxT(".VCARD")){
800 vCardFilenameFull.Append(AccountDirFinal);
801 vCardFilenameFull.Append(vCardFilename);
803 Person.LoadFile(vCardFilenameFull);
805 if (Person.MeetBaseSpecification()){
809 // Split the name into sections.
811 vCardDataString = Person.Get(wxT("N"));
813 vCardName NameData = Person.GetName();
815 vCardDataString = NameData.Forename + wxT(" ") + NameData.Surname;
817 } else if (SortMode == 2){
819 // Split the name into sections.
821 vCardName NameData = Person.GetName();
823 vCardDataString = NameData.Surname + wxT(", ") + NameData.Forename;
825 } else if (SortMode == 3){
827 // Check and make sure that the top most nickname is used.
829 vCardDataString = Person.Get(wxT("NICKNAME"));
831 if (vCardDataString.IsEmpty()){
833 vCardDataString = wxT("(no nickname)");
837 } else if (SortMode == 4){
839 vCardDataString = Person.Get(wxT("FN"));
843 if (AscendingMode == TRUE){
844 vCardNamesAsc.insert(std::make_pair(vCardDataString, vCardFilenameFull));
846 vCardNamesDsc.insert(std::make_pair(vCardDataString, vCardFilenameFull));
855 vCardFilename.Clear();
856 vCardFilenameFull.Clear();
857 vCardDataString.Clear();
858 ProcFiles = vcardaccdir.GetNext(&vCardFilename);
865 // Insert the data into the control.
867 if (AscendingMode == TRUE){
868 for (std::map<wxString, wxString>::iterator iter = vCardNamesAsc.begin();
869 iter != vCardNamesAsc.end(); ++iter){
871 wxListItem ContactInfo;
873 ContactInfo.SetId(0);
874 ContactInfo.SetText(_("Mooo"));
875 ContactInfo.SetData(ContactSeekPoint);
876 ContactIndex = lstContacts->InsertItem(ContactInfo);
878 lstContacts->SetItem(ContactIndex, 0, iter->first);
879 ContactsFileIndex.Insert(iter->second, ContactSeekPoint);
886 for (std::map<wxString, wxString>::iterator iter = vCardNamesDsc.begin();
887 iter != vCardNamesDsc.end(); ++iter){
889 wxListItem ContactInfo;
891 ContactInfo.SetId(0);
892 ContactInfo.SetText(_("Mooo"));
893 ContactInfo.SetData(ContactSeekPoint);
894 ContactIndex = lstContacts->InsertItem(ContactInfo);
896 lstContacts->SetItem(ContactIndex, 0, iter->first);
897 ContactsFileIndex.Insert(iter->second, ContactSeekPoint);
906 void frmMain::ShowContactInfo( wxListEvent& event )
909 long intSelected = -1;
910 long ContactSeekNum = -1;
912 // intSelected = lstContacts->GetSelection();
914 // Check if several contacts have been selected.
916 int ContactTotal = 0;
920 intSelected = lstContacts->GetNextItem(intSelected,
922 wxLIST_STATE_SELECTED);
924 if (intSelected == -1){
934 if (ContactTotal == 0){
935 htmContactData->SetPage(wxT(""));
939 if (ContactTotal > 1){
941 htmContactData->SetPage(wxString::Format(wxT("%i contacts selected."), ContactTotal));
942 ActiveFilename.Clear();
947 intSelected = lstContacts->GetNextItem(intSelected,
949 wxLIST_STATE_SELECTED);
951 ContactSeekNum = lstContacts->GetItemData(intSelected);
954 wxString wxSContactString;
955 wxString ContactLine;
958 size_t ContactLineLen;
959 bool ExtraLineSeek = FALSE;
960 int QuoteBreakPoint = 0;
962 bool PropertyFind = FALSE;
963 bool QuoteMode = FALSE;
965 wxString wxSPropertyNextLine;
966 wxString wxSProperty;
967 wxString wxSPropertySeg1;
968 wxString wxSPropertySeg2;
970 // Check if we are using wxWidgets version 2.8 or less and
971 // execute the required command accordingly.
973 #if wxABI_VERSION < 20900
974 ContactFile.Open(ContactsFileIndex[ContactSeekNum].c_str(), wxT("r"));
976 ContactFile.Open(ContactsFileIndex[ContactSeekNum], wxT("r"));
979 if (ContactFile.IsOpened() == FALSE){
985 ContactFile.ReadAll(&wxSContactString, wxConvAuto());
989 std::map<int, wxString> ContactFileLines;
990 std::map<int, wxString>::iterator striter;
992 wxStringTokenizer wSTContactFileLines(wxSContactString, wxT("\r\n"));
994 int ContactLineSeek = 0;
996 while (wSTContactFileLines.HasMoreTokens() == TRUE){
998 ContactLine = wSTContactFileLines.GetNextToken();
999 ContactFileLines.insert(std::make_pair(ContactLineSeek, ContactLine));
1004 if (ContactSeekNum < 0){
1008 for (std::map<int, wxString>::iterator iter = ContactFileLines.begin();
1009 iter != ContactFileLines.end(); ++iter){
1011 // Find the colon which splits the start bit from the data part.
1013 ContactLine = iter->second;
1015 while (ExtraLineSeek == TRUE){
1017 // Check if there is extra data on the next line
1018 // (indicated by space or tab at the start) and add data.
1022 if (iter == ContactFileLines.end()){
1029 wxSPropertyNextLine = iter->second;
1032 if (wxSPropertyNextLine.Mid(0, 1) == wxT(" ") || wxSPropertyNextLine.Mid(0, 1) == wxT("\t")){
1034 wxSPropertyNextLine.Remove(0, 1);
1035 //wxSPropertyNextLine.Trim(FALSE);
1036 //ContactLine.Trim();
1037 ContactLine.Append(wxSPropertyNextLine);
1042 ExtraLineSeek = FALSE;
1048 ContactLineLen = ContactLine.Len();
1050 // Make sure we are not in quotation mode.
1051 // Make sure colon does not have \ or \\ before it.
1053 for (int i = 0; i <= ContactLineLen; i++){
1055 if ((ContactLine.Mid(i, 1) == wxT(";") || ContactLine.Mid(i, 1) == wxT(":")) && PropertyFind == TRUE){
1057 PropertyFind = FALSE;
1059 } else if (PropertyFind == TRUE){
1061 wxSProperty.Append(ContactLine.Mid(i, 1));
1065 if (ContactLine.Mid(i, 1) == wxT("\"")){
1067 if (QuoteMode == TRUE){
1079 if (ContactLine.Mid(i, 1) == wxT(":") && ContactLine.Mid((i - 1), 1) != wxT("\\") && QuoteMode == FALSE){
1081 QuoteBreakPoint = i;
1088 // Split that line at the point into two variables (ignore the colon).
1090 wxSPropertySeg1 = ContactLine.Mid(0, QuoteBreakPoint);
1091 wxSPropertySeg2 = ContactLine.Mid((QuoteBreakPoint + 1));
1093 // Insert both into the vCard data file.
1095 Person.AddRaw(wxSPropertySeg1, wxSPropertySeg2);
1098 PropertyFind = TRUE;
1099 ExtraLineSeek = TRUE;
1101 QuoteBreakPoint = 0;
1102 ContactLine.Clear();
1103 wxSProperty.Clear();
1107 OldSessionID = SessionID;
1108 SessionID = wxString::Format(wxT("%i"), rand() % 32768);
1109 LoadContactData(&Person, htmContactData, SessionID, OldSessionID, &MemoryFileList);
1110 ActiveFilename = ContactsFileIndex[ContactSeekNum];
1114 void frmMain::ShowContactEditorNew( wxCommandEvent& event )
1117 // Check if there is an account selected and if not
1118 // return immediately.
1120 if (ActiveAccount.IsEmpty()){
1126 // Add Pointer to SetupPointers for the ETagDB.
1128 wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
1129 wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
1130 wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
1132 contacticon.CopyFromBitmap(contacticonbmp);
1134 frmContactEditor *ContactEditor = new frmContactEditor( this );
1138 ContactEditor->SetUID(WindowMenuItemID);
1140 WindowData *WData = new WindowData;
1142 WData->DataType = 1;
1143 WData->WindowPointer = (void*)ContactEditor;
1144 WData->WindowID = WindowMenuItemID;
1146 wxCommandEvent addevent(WINDOW_ADD);
1147 addevent.SetClientData(WData);
1148 wxPostEvent(this, addevent);
1150 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
1151 ContactEditor->SetupHeaders();
1152 ContactEditor->SetupContact(ActiveAccount);
1153 ContactEditor->SetIcon(contacticon);
1154 ContactEditor->SetupPointers(frameActMgr, &ETagProcTimer, this);
1155 ContactEditor->Show(true);
1159 void frmMain::ShowContactEditorEdit( wxCommandEvent& event )
1162 // Check if there is an account selected and if not
1163 // return immediately.
1165 int DataCheck = event.GetInt();
1167 if (ActiveAccount.IsEmpty() && DataCheck == 0){
1173 wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
1174 wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
1175 wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
1177 contacticon.CopyFromBitmap(contacticonbmp);
1179 // Check if a contact has been selected.
1181 long intSelected = -1;
1182 long intContactSeekNum = -1;
1184 // intSelected = lstContacts->GetSelection();
1186 intSelected = lstContacts->GetNextItem(intSelected,
1188 wxLIST_STATE_SELECTED);
1190 if (intSelected == -1){
1194 intContactSeekNum = lstContacts->GetItemData(intSelected);
1196 // Get the filename of the selected contact.
1198 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
1199 frmContactEditor *ContactEditor = new frmContactEditor( this );
1203 ContactEditor->SetUID(WindowMenuItemID);
1205 WindowData *WData = new WindowData;
1207 WData->DataType = 1;
1208 WData->WindowPointer = (void*)ContactEditor;
1209 WData->WindowID = WindowMenuItemID;
1211 wxCommandEvent addevent(WINDOW_ADD);
1212 addevent.SetClientData(WData);
1213 wxPostEvent(this, addevent);
1215 ContactEditor->SetupPointers(frameActMgr, &ETagProcTimer, this);
1216 ContactEditor->SetupHeaders();
1218 // Check if pointer is NULL (not from the search forms) or not.
1220 if (DataCheck == 0){
1222 ContactEditor->LoadContact(ContactsFileIndex[intContactSeekNum]);
1223 ContactEditor->SetupContact(ActiveAccount);
1227 UCNotif *uc = (UCNotif*)event.GetClientData();
1231 ContactEditor->SetupContact(ActiveAccount);
1232 ContactEditor->LoadContact(ContactsFileIndex[intContactSeekNum]);
1236 ContactEditor->SetupContact(uc->ContactAccount);
1237 ContactEditor->LoadContact(uc->ContactFilename);
1247 ContactEditor->SetIcon(contacticon);
1248 ContactEditor->Show(true);
1252 void frmMain::RefreshAddressBook( wxCommandEvent& event ){
1254 // Check if ActiveAccount is empty. If not then check if
1255 // account type is not local otherwise continue.
1257 if (!ActiveAccount.IsEmpty()){
1259 if (ActiveAccountType != wxT("Local")){
1261 // Account type is not local.
1263 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
1264 frameActMgr->AddTask(3, wxT(""), ActiveAccount,
1265 wxT(""), wxT(""), wxT(""), wxT(""));
1269 wxMessageBox(_("The refresh address book command is not supported with this type of account."), wxT("Not supported for this type of account"));
1277 void frmMain::OpenContactInfoList( wxListEvent& event )
1280 wxStringTokenizer vcardfileline;
1283 wxString setname, setvalue;
1287 long intSelected = -1;
1288 long intContactSeekNum = -1;
1290 intSelected = lstContacts->GetNextItem(intSelected,
1292 wxLIST_STATE_SELECTED);
1294 intContactSeekNum = lstContacts->GetItemData(intSelected);
1296 if (intContactSeekNum == -1){
1300 Person.LoadFile(ContactsFileIndex[intContactSeekNum]);
1302 wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
1303 wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
1304 wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
1306 contacticon.CopyFromBitmap(contacticonbmp);
1308 frmContact *Contact = new frmContact( this );
1310 // Add to window list.
1314 Contact->SetUID(WindowMenuItemID);
1316 WindowData *WData = new WindowData;
1318 WData->DataType = 0;
1319 WData->WindowPointer = (void*)Contact;
1320 WData->WindowID = WindowMenuItemID;
1322 wxCommandEvent addevent(WINDOW_ADD);
1323 addevent.SetClientData(WData);
1324 wxPostEvent(this, addevent);
1326 Contact->SetupPointers(&MemoryFileList);
1327 Contact->SetupContactData(&Person);
1329 Contact->SetIcon(contacticon);
1330 Contact->Show(true);
1334 void frmMain::OpenContactInfoList( wxCommandEvent& event ){
1337 OpenContactInfoList(pevent);
1341 void frmMain::OpenContactInfo( wxCommandEvent& event )
1344 UCNotif *uc = (UCNotif*)event.GetClientData();
1346 wxStringTokenizer vcardfileline;
1349 wxString setname, setvalue;
1352 //std::fstream vcardfile;
1354 Person.LoadFile(uc->ContactFilename);
1356 wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
1357 wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
1358 wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
1360 contacticon.CopyFromBitmap(contacticonbmp);
1362 frmContact *Contact = new frmContact( this );
1364 // Add to window list.
1368 Contact->SetUID(WindowMenuItemID);
1370 WindowData *WData = new WindowData;
1372 WData->DataType = 0;
1373 WData->WindowPointer = (void*)Contact;
1374 WData->WindowID = WindowMenuItemID;
1376 wxCommandEvent addevent(WINDOW_ADD);
1377 addevent.SetClientData(WData);
1378 wxPostEvent(this, addevent);
1380 Contact->SetupPointers(&MemoryFileList);
1381 Contact->SetupContactData(&Person);
1383 Contact->SetIcon(contacticon);
1384 Contact->Show(true);
1389 void frmMain::LoadPreferences( wxActivateEvent& event)
1391 this->LoadPreferences();
1394 void frmMain::LoadPreferences(){
1396 // Load the preferences.
1398 wxString preffilename = GetUserPrefDir();
1400 XABPreferences preferences(preffilename);
1402 // Setup the main window position (if needed).
1404 bool SaveWindowPos = preferences.GetBoolData(wxT("SaveWindowPosition"));
1405 bool HideLocalABs = preferences.GetBoolData(wxT("HideLocalAddressBooks"));
1407 if (SaveWindowPos == TRUE){
1409 this->SetSize(preferences.GetMainWindowData());
1413 treAccounts->DeleteAllItems();
1415 wxTreeItemId RootNode = treAccounts->AddRoot(wxT("Root Item"), AccountNoneID);
1417 // Stop all account timers and remove the accounts.
1419 for (std::map<wxString, wxAccountSyncTimer*>::iterator iter = AccountSyncTimers.begin();
1420 iter != AccountSyncTimers.end(); iter++){
1422 wxAccountSyncTimer *AccTmrPtr = iter->second;
1430 AccountSyncTimers.clear();
1433 for (int i = (preferences.accounts.GetCount() - 1); i > 0; --i){
1434 treAccounts->AppendItem(RootNode, preferences.accounts.GetAccountName(i));
1439 wxString AccDirFull;
1440 wxString AccDirFullSfx;
1442 wxString AccDirFinal;
1443 AccountAccDirList.clear();
1444 AccountGroupList.clear();
1445 AccountGroupFilename.clear();
1446 AccountGroupTreeId.clear();
1447 wxTreeItemId AccountTreeId;
1448 wxTreeItemId GroupTreeId;
1451 for (int i = 0; i < preferences.accounts.GetCount(); i++){
1453 if ((preferences.accounts.GetAccountType(i) == wxT("Local") ||
1454 preferences.accounts.GetAccountType(i) == wxT("local")) && HideLocalABs == TRUE){
1460 if (preferences.accounts.GetAccountDirectory(i).IsEmpty()){
1466 AccDir = preferences.accounts.GetAccountDirectory(i);
1467 AccDirFull = preferences.accounts.GetAccountDirectory(i);
1469 AccDirFull.Append(wxT("."));
1470 AccDirFullSfx.Append(preferences.accounts.GetAccountType(i));
1471 AccDirFullSfx.LowerCase();
1472 AccDirFullSfx.Trim();
1473 AccDirFull.Append(AccDirFullSfx);
1474 AccName = preferences.accounts.GetAccountName(i);
1476 AccountAccDirList.insert(std::make_pair(i, AccDirFull));
1478 if (preferences.accounts.GetAccountType(i) == wxT("CardDAV") ||
1479 preferences.accounts.GetAccountType(i) == wxT("carddav")){
1481 // Check if the directory exists before doing anything.
1485 // Add a new timer using the existing account details.
1487 wxAccountSyncTimer *ActTmrPtr = new wxAccountSyncTimer;
1489 ActTmrPtr->SetupData(AccDirFull, AccName);
1490 ActTmrPtr->SetupPointers(this, ActMgrPtr, ETagProcTimer.GetPointer(AccDirFull));
1491 ActTmrPtr->Start((int)(preferences.accounts.GetAccountRefresh(i) * 1000));
1492 ActTmrPtr->SetOwner(this);
1493 ActTmrPtr->Notify();
1495 // Add the timer to the list of timers.
1497 AccountSyncTimers.insert(std::make_pair(AccDirFull, ActTmrPtr));
1499 AccountTreeId = treAccounts->AppendItem(RootNode, preferences.accounts.GetAccountName(i), AccountNetID, -1);
1503 AccountTreeId = treAccounts->AppendItem(RootNode, preferences.accounts.GetAccountName(i), AccountID, -1);
1507 // Go through the account directory and find contact files with
1508 // 'KIND:group' set and add them to the list of groups for the account.
1510 AccDirFinal = GetAccountDir(AccDirFull, FALSE);
1512 wxDir vcardaccdir(AccDirFinal);
1514 wxString vCardFilename;
1515 wxString vCardDataString;
1516 wxString vCardFilenameFull;
1517 //bool ProcFiles = FALSE;
1519 bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES);
1522 if (vCardFilename.Right(4) == wxT(".vcf") ||
1523 vCardFilename.Right(4) == wxT(".VCF") ||
1524 vCardFilename.Right(5) == wxT(".vcard") ||
1525 vCardFilename.Right(5) == wxT(".VCARD")){
1529 vCardFilenameFull.Append(AccDirFinal);
1530 vCardFilenameFull.Append(wxT("/"));
1531 vCardFilenameFull.Append(vCardFilename);
1533 Person.LoadFile(vCardFilenameFull);
1535 if (Person.MeetBaseSpecification()){
1537 vCardDataString = Person.Get(wxT("KIND"));
1539 if (vCardDataString == wxT("group")){
1541 // The vCard kind is a group. Add to the account's group list.
1543 GroupTreeId = treAccounts->AppendItem(AccountTreeId, Person.Get(wxT("FN")), AccountGrpID, -1);
1544 treAccounts->SetItemHasChildren(AccountTreeId, TRUE);
1545 AccountGroupList.insert(std::make_pair(intGroupID, i));
1546 AccountGroupFilename.insert(std::make_pair(intGroupID, vCardFilenameFull));
1547 AccountGroupTreeId.insert(std::make_pair(GroupTreeId, intGroupID));
1559 vCardFilename.Clear();
1560 vCardFilenameFull.Clear();
1561 vCardDataString.Clear();
1562 ProcFiles = vcardaccdir.GetNext(&vCardFilename);
1566 // Clearup for next account.
1570 AccDirFullSfx.clear();
1571 AccDirFinal.clear();
1576 // Load the account settings as they are needed for connecting
1579 prefaccounts = preferences.accounts;
1583 void frmMain::ConflictResolution(wxCommandEvent& event){
1585 frmConflictResolution *frameCR = new frmConflictResolution ( this );
1586 vCardConflictObj *vCardConfObj = (vCardConflictObj*)event.GetClientData();
1587 vCard *ClientDataPtr = vCardConfObj->vCardLocalData;
1588 vCard *ServerDataPtr = vCardConfObj->vCardServerData;
1589 //vCard *ServerDataPtr = vCardConfObj->vCardServerData;
1590 //wxString Moo = ClientDataPtr->WriteString();
1591 //vCard *ServerDataPtr = vCardConfObj->vCardServerData;
1592 frameCR->LoadData(ClientDataPtr, ServerDataPtr, &MemoryFileList);
1593 //frameCR->LoadData(vCardConfObj->vCardLocalData, vCardConfObj->vCardServerData, &MemoryFileList);
1594 frameCR->ShowModal();
1596 int FinalConflictResult = frameCR->GetResult();
1598 wxCommandEvent event2(ACTMGR_RESUMEPROC);
1599 event2.SetClientData(vCardConfObj->QRNotifData);
1600 event2.SetInt(FinalConflictResult);
1605 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
1606 wxPostEvent(frameActMgr, event2);
1610 void frmMain::UpdateContactList(wxCommandEvent& event){
1612 UCNotif *ucd = (UCNotif*)event.GetClientData();
1614 // Check if the active account is being displayed in the
1615 // main window. If not, skip and delete the data.
1617 long longSelected = -1;
1618 int intSelectedData = 0;
1620 if (ActiveAccount == ucd->ContactAccount){
1622 // Look at the list of contacts and if it matches the
1623 // filename then update the name.
1627 longSelected = lstContacts->GetNextItem(longSelected,
1629 wxLIST_STATE_DONTCARE);
1631 if (longSelected == -1){
1637 intSelectedData = (int)lstContacts->GetItemData(longSelected);
1639 if (ucd->ContactFilename == ContactsFileIndex[intSelectedData]){
1641 // Work out which sorting mode we are in.
1645 // First Name, Last Name.
1647 lstContacts->SetItem(longSelected, 0, ucd->ContactNameArray.Forename + wxT(" ") + ucd->ContactNameArray.Surname);
1649 } else if (SortMode == 2){
1651 // Last Name, First Name.
1653 lstContacts->SetItem(longSelected, 0, ucd->ContactNameArray.Surname + wxT(", ") + ucd->ContactNameArray.Forename);
1655 } else if (SortMode == 3){
1659 lstContacts->SetItem(longSelected, 0, ucd->ContactNickname);
1661 } else if (SortMode == 4){
1665 lstContacts->SetItem(longSelected, 0, ucd->ContactName);
1672 // If the filename is the one loaded into the
1673 // browser control, then update this too.
1675 if (ActiveFilename == ContactsFileIndex[intSelectedData]){
1677 wxListEvent nullevent;
1678 ShowContactInfo(nullevent);
1686 for (std::map<int, void*>::iterator WindowIter = WindowListPointers.begin();
1687 WindowIter != WindowListPointers.end(); WindowIter++){
1689 if (WindowListType[WindowIter->first] != 0){
1695 frmContact *frmContactPtr = static_cast<frmContact*>(WindowIter->second);
1697 if (frmContactPtr->GetFilename() == ucd->ContactFilename){
1699 vCard UpdatedPerson;
1700 UpdatedPerson.LoadFile(ucd->ContactFilename);
1701 frmContactPtr->SetupContactData(&UpdatedPerson);
1707 // Send message to search window controller subroutine and
1708 // pass that notification onto the search windows.
1710 // Setup the new pointer to use the existing UCNotif without
1713 UCNotif *ucd2 = ucd;
1715 wxCommandEvent sup(SE_UPDATECONTACTNOTIF);
1716 sup.SetClientData(ucd2);
1717 wxPostEvent(this, sup);
1719 // Clear up the unused pointer.
1725 void frmMain::UpdateAccountList(wxCommandEvent& event){
1729 void frmMain::SetupPointers(void *ActMgrPtrInc){
1731 ActMgrPtr = ActMgrPtrInc;
1735 void frmMain::SetupForm(){
1737 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
1738 frameActMgr->SetupPointers(&ETagProcTimer, this);
1740 // Setup the contact information icons for later.
1742 wxFileSystem::AddHandler(new wxMemoryFSHandler);
1746 wxMemoryInputStream ciptostream(icons_cipto_png, sizeof(icons_cipto_png));
1747 ciicon_png.LoadFile(ciptostream, wxBITMAP_TYPE_PNG);
1748 wxMemoryFSHandler::AddFile(wxT("cipto.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1750 wxMemoryInputStream cilogstream(icons_cilog_png, sizeof(icons_cilog_png));
1751 ciicon_png.LoadFile(cilogstream, wxBITMAP_TYPE_PNG);
1752 wxMemoryFSHandler::AddFile(wxT("cilog.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1754 wxMemoryInputStream cisndstream(icons_cisnd_png, sizeof(icons_cisnd_png));
1755 ciicon_png.LoadFile(cisndstream, wxBITMAP_TYPE_PNG);
1756 wxMemoryFSHandler::AddFile(wxT("cisnd.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1758 wxMemoryInputStream cikeystream(icons_cikey_png, sizeof(icons_cikey_png));
1759 ciicon_png.LoadFile(cikeystream, wxBITMAP_TYPE_PNG);
1760 wxMemoryFSHandler::AddFile(wxT("cikey.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1762 wxMemoryInputStream civenstream(icons_civen_png, sizeof(icons_civen_png));
1763 ciicon_png.LoadFile(civenstream, wxBITMAP_TYPE_PNG);
1764 wxMemoryFSHandler::AddFile(wxT("civen.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1766 wxMemoryInputStream ciextstream(icons_ciext_png, sizeof(icons_ciext_png));
1767 ciicon_png.LoadFile(ciextstream, wxBITMAP_TYPE_PNG);
1768 wxMemoryFSHandler::AddFile(wxT("ciext.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1774 void frmMain::UpdateSearchContactLists(wxCommandEvent& event){
1776 // Go through each of the search windows and
1777 // send the required notification to update the
1778 // contact information.
1780 // Get the event notification data.
1782 UCNotif *ucd = (UCNotif*)event.GetClientData();
1784 // Process each search window giving the new details.
1786 for (std::map<void*,wxString>::iterator switer = SearchWindowList.begin();
1787 switer != SearchWindowList.end(); switer++){
1789 // Duplicate the event notification data.
1791 UCNotif *ucd2 = new UCNotif;
1793 ucd2->ContactAccount = ucd->ContactAccount;
1794 ucd2->ContactFilename = ucd->ContactFilename;
1795 ucd2->ContactName = ucd->ContactName;
1796 ucd2->ContactNickname = ucd->ContactNickname;
1797 ucd2->ContactNameArray = ucd->ContactNameArray;
1799 // Pass the data to the search window for processing.
1801 frmSearch *frameSCH = static_cast<frmSearch*>(switer->first);
1802 wxCommandEvent schupdate(SE_UPDATERESULT);
1803 schupdate.SetClientData(ucd2);
1804 wxPostEvent(frameSCH, schupdate);
1806 // Clear up the pointer prior to variable deletion.
1817 void frmMain::OpenFindContactsWindow(wxCommandEvent& event){
1821 frmSearch *frameSCH = new frmSearch ( this );
1822 frameSCH->SetUID(WindowMenuItemID);
1823 frameSCH->Show(true);
1825 WindowData *WData = new WindowData;
1827 WData->DataType = 2;
1828 WData->WindowPointer = (void*)frameSCH;
1829 WData->WindowID = WindowMenuItemID;
1831 wxCommandEvent addevent(WINDOW_ADD);
1832 addevent.SetClientData(WData);
1833 wxPostEvent(this, addevent);
1835 // Add pointer to the list of open search windows.
1837 SearchWindowList.insert(std::make_pair(frameSCH, wxT("Search")));
1843 void frmMain::RemoveContactsWindowPointer(wxCommandEvent& event){
1845 //frmSearch *frameSCH = static_cast<frmSearch*>(ActMgrPtr);
1846 void *frameSCH = (void*)event.GetClientData();
1848 SearchWindowList.erase(frameSCH);
1854 void frmMain::RemoveContactEditorWindowPointer(wxCommandEvent& event){
1856 void *frameSCH = (void*)event.GetClientData();
1858 SearchWindowList.erase(frameSCH);
1864 void frmMain::UpdateWindowList(wxCommandEvent& event){
1866 // Update the Window List.
1868 // Delete the existing items in the window menu.
1870 // Get the list of contacts.
1872 // Insert a separator.
1874 // Get the list of search windows.
1878 void frmMain::RevealContact(wxCommandEvent& event){
1880 UCNotif *uc = (UCNotif*)event.GetClientData();
1882 // Switch the account to the one passed.
1884 wxTreeItemIdValue cookie;
1885 wxTreeItemId next = treAccounts->GetRootItem();
1886 wxTreeItemId nextChild;
1888 for (int i = 0; i < prefaccounts.GetCount(); i++){
1891 nextChild = treAccounts->GetFirstChild(next, cookie);
1893 nextChild = treAccounts->GetNextSibling(nextChild);
1896 //AccountName = treAccounts->GetItemText(nextChild);
1898 if (uc->ContactAccount == AccountAccDirList[i]){
1901 treAccounts->SelectItem(nextChild, TRUE);
1902 AccCtrl->SetText(treAccounts->GetItemText(nextChild));
1908 // Switch the contact to the one passed.
1910 long longSelected = -1;
1911 int intSelectedData = 0;
1915 longSelected = lstContacts->GetNextItem(longSelected,
1917 wxLIST_STATE_DONTCARE);
1919 if (longSelected == -1){
1925 intSelectedData = (int)lstContacts->GetItemData(longSelected);
1927 // Compare the filename with the one received.
1928 // If they match then select it.
1930 if (ContactsFileIndex[intSelectedData] == uc->ContactFilename){
1934 lstContacts->SetItemState(longSelected, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
1935 lstContacts->EnsureVisible(longSelected);
1939 lstContacts->SetItemState(longSelected, 0, wxLIST_STATE_SELECTED);
1947 void frmMain::DeleteContact(wxCommandEvent& event){
1949 // Check if a contact is selected.
1951 long intSelected = -1;
1952 long intContactSeekNum = -1;
1953 wxString wxSContactName;
1955 intSelected = lstContacts->GetNextItem(intSelected,
1957 wxLIST_STATE_SELECTED);
1959 if (intSelected == -1){
1963 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
1965 // Get the item data of the contact.
1967 intContactSeekNum = lstContacts->GetItemData(intSelected);
1969 // Get the name of the contact.
1971 wxSContactName = lstContacts->GetItemText(intSelected);
1973 // Display a message confirming if the contact should
1976 int QuestionResponse;
1978 QuestionResponse = wxMessageBox(_("Are you sure you want to delete this contact?"), _("Delete contact"), wxYES_NO, this);
1980 if (QuestionResponse == wxNO){
1982 // Exit the subroutine
1988 // Delete the contact.
1990 if (!wxRemoveFile(ContactsFileIndex[intContactSeekNum])){
1992 wxMessageBox(_("Unable to delete the contact."), _("Cannot delete contact"), wxOK, this);
1997 // Remove the contact from the list.
1999 lstContacts->DeleteItem(intSelected);
2001 // Update the search windows, removing the deleted
2004 UCNotif *ucd = new UCNotif;
2006 ucd->ContactAccount = ActiveAccount;
2007 ucd->ContactFilename = ContactsFileIndex[intContactSeekNum];
2009 for (std::map<void*,wxString>::iterator switer = SearchWindowList.begin();
2010 switer != SearchWindowList.end(); switer++){
2012 // Duplicate the event notification data.
2014 UCNotif *ucd2 = new UCNotif;
2016 ucd2->ContactAccount = ucd->ContactAccount;
2017 ucd2->ContactFilename = ucd->ContactFilename;
2019 // Pass the data to the search window for processing.
2021 frmSearch *frameSCH = static_cast<frmSearch*>(switer->first);
2022 wxCommandEvent schdelete(SE_DELETERESULT);
2023 schdelete.SetClientData(ucd2);
2024 wxPostEvent(frameSCH, schdelete);
2026 // Clear up the pointer prior to variable deletion.
2033 // Clear the wxHTMLWindow.
2035 wxString EmptyPage = wxT("");
2037 htmContactData->SetPage(EmptyPage);
2039 wxStringTokenizer wSTFilename(ContactsFileIndex[intContactSeekNum], wxT("/"));
2041 wxString wxSplitFilename;
2042 wxString wxSDataURL;
2044 while(wSTFilename.HasMoreTokens()){
2046 wxSplitFilename = wSTFilename.GetNextToken();
2050 if (ActiveAccountType == wxT("CardDAV") || ActiveAccountType == wxT("carddav")){
2052 // Update the ETagDB and mark it as deleted.
2054 ETagDB *ETagDBPtr = ETagProcTimer.GetPointer(ActiveAccount);
2056 ETagDBPtr->UpdateETag(wxSplitFilename, wxT("DELETED"));
2058 // Get the Data URL.
2060 wxTreeItemIdValue cookie;
2061 wxTreeItemId next = treAccounts->GetRootItem();
2063 wxTreeItemId selectedChild = treAccounts->GetSelection();
2064 wxTreeItemId nextChild;
2066 for (int i = 0; i < prefaccounts.GetCount(); i++){
2069 nextChild = treAccounts->GetFirstChild(next, cookie);
2072 nextChild = treAccounts->GetNextSibling(nextChild);
2075 if (nextChild == selectedChild){
2076 wxSDataURL = prefaccounts.GetAccountDirPrefix(i) + wxT("/") + wxSplitFilename;
2082 // Add task to the activity monitor to delete the contact.
2084 frameActMgr->AddTask(2, wxSContactName, ActiveAccount, wxSDataURL, wxSplitFilename, ContactsFileIndex[intContactSeekNum], wxT(""));
2088 // Clear the variable. Don't delete as it will mess things up.
2090 ContactsFileIndex[intContactSeekNum] = wxT("");
2097 void frmMain::EmptyServerDialog(wxCommandEvent& event){
2099 QRNotif *qrn = (QRNotif *)event.GetClientData();
2101 int QResponse = wxMessageBox(_("The list of contacts on the server is empty. Upload all locally stored contacts for this account now?"), _("No contacts on server"), wxYES_NO, this);
2103 if (QResponse == wxNO){
2109 wxCommandEvent event2(ACTMGR_RESUMEPROC);
2110 event2.SetInt(*qrn->QResponse);
2111 event2.SetClientData(qrn->PausePtr);
2113 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
2115 wxPostEvent(frameActMgr, event2);
2119 void frmMain::DeleteContactSync(wxString &Account, wxString &Filename){
2121 // Remove the contact from the window after syncronising.
2123 // Check which account is currently active in the window.
2124 // If it is different from the one passed to this subroutine then
2125 // exit from the subroutine.
2127 if (Account != ActiveAccount){
2131 long longSelected = -1;
2132 int intSelectedData = 0;
2136 longSelected = lstContacts->GetNextItem(longSelected,
2138 wxLIST_STATE_DONTCARE);
2140 if (longSelected == -1){
2146 intSelectedData = (int)lstContacts->GetItemData(longSelected);
2148 // Compare the filename with the one received.
2149 // If they match then select it.
2151 if (ContactsFileIndex[intSelectedData] == Filename){
2153 // Remove the contact from the window.
2155 lstContacts->DeleteItem(intSelectedData);
2157 // Check if contact is the selected contact in the HTML window and
2158 // if it is then clear the window.
2160 if (ActiveFilename == Filename){
2162 wxString EmptyPage = wxT("");
2163 htmContactData->SetPage(EmptyPage);
2177 void frmMain::SortFNLN( wxCommandEvent& event ) {
2179 wxTreeEvent NullEvent;
2181 LoadContactList(NullEvent);
2185 void frmMain::SortLNFN( wxCommandEvent& event ) {
2187 wxTreeEvent NullEvent;
2189 LoadContactList(NullEvent);
2193 void frmMain::SortNickname( wxCommandEvent& event ) {
2195 wxTreeEvent NullEvent;
2197 LoadContactList(NullEvent);
2201 void frmMain::SortDisplayAs( wxCommandEvent& event ) {
2203 wxTreeEvent NullEvent;
2205 LoadContactList(NullEvent);
2209 void frmMain::SortAscending( wxCommandEvent& event ) {
2211 wxTreeEvent NullEvent;
2212 AscendingMode = TRUE;
2213 LoadContactList(NullEvent);
2217 void frmMain::SortDescending( wxCommandEvent& event ) {
2219 wxTreeEvent NullEvent;
2220 AscendingMode = FALSE;
2221 LoadContactList(NullEvent);
2225 void frmMain::ToggleStatusBar( wxCommandEvent& event ) {
2227 if (stbBottom->IsShown() == TRUE){
2241 void frmMain::ActivityIconStart( wxCommandEvent& event ){
2243 // Display the activity icon.
2245 imgActivityStatus->SetBitmap(*imgActIcon1);
2246 ActivityIconStatus = 0;
2250 void frmMain::ActivityIconShuffle( wxCommandEvent& event ){
2252 switch (ActivityIconStatus){
2255 imgActivityStatus->SetBitmap(*imgActIcon1);
2256 ActivityIconStatus = 1;
2259 imgActivityStatus->SetBitmap(*imgActIcon2);
2260 ActivityIconStatus = 2;
2263 imgActivityStatus->SetBitmap(*imgActIcon3);
2264 ActivityIconStatus = 3;
2267 imgActivityStatus->SetBitmap(*imgActIcon4);
2268 ActivityIconStatus = 0;
2271 ActivityIconStatus = 0;
2277 void frmMain::ActivityIconStop( wxCommandEvent& event ){
2279 // Display the sleep icon.
2281 imgActivityStatus->SetBitmap(*imgActIconSleep);
2285 void frmMain::UpdateSBIconPlacement( wxSizeEvent& event ){
2287 if (imgConnStatus == 0 || imgSSLStatus == 0 || imgActivityStatus == 0){
2295 wxRect rectActivity;
2296 stbBottom->GetFieldRect(1, rectOnline);
2297 stbBottom->GetFieldRect(2, rectSSL);
2298 stbBottom->GetFieldRect(3, rectActivity);
2300 imgConnStatus->Move(rectOnline.GetX(),rectOnline.GetY());
2301 imgSSLStatus->Move(rectSSL.GetX(),rectSSL.GetY());
2302 imgActivityStatus->Move(rectActivity.GetX(),rectActivity.GetY());
2306 XABViewMode frmMain::GetViewMode(){
2310 xvm.SortMode = SortMode;
2311 xvm.AscendingMode = AscendingMode;
2317 void frmMain::WindowAdd( wxCommandEvent &event ){
2319 WindowData *WData = (WindowData*)event.GetClientData();
2323 if (WData->DataType == 0){
2327 int intID = mnuContactWindows->GetId();
2329 mnuWindow->FindChildItem(intID, &pos);
2330 wxMenuItem *mnuNewItem = new wxMenuItem(NULL, WData->WindowID, wxT("Contact Window #") + wxString::Format(wxT("%i"), WData->WindowID), wxEmptyString, wxITEM_NORMAL, NULL);
2331 mnuNewItem->SetId(WData->WindowID);
2332 WindowListPointersMenu.insert(std::make_pair(WData->WindowID, mnuNewItem));
2333 WindowListPointers.insert(std::make_pair(WData->WindowID, WData->WindowPointer));
2334 WindowListType.insert(std::make_pair(WData->WindowID, 0));
2335 mnuWindow->Insert((pos + 1), mnuNewItem);
2336 this->Connect(mnuNewItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(frmMain::ShowContactWindow));
2338 } else if (WData->DataType == 1){
2340 // Contact Editor Window
2342 int intID = mnuContactEditorWindows->GetId();
2344 mnuWindow->FindChildItem(intID, &pos);
2345 wxMenuItem *mnuNewItem = new wxMenuItem(NULL, WData->WindowID, wxT("Contact Editor Window #") + wxString::Format(wxT("%i"), WData->WindowID), wxEmptyString, wxITEM_NORMAL, NULL);
2346 mnuNewItem->SetId(WData->WindowID);
2347 WindowListPointersMenu.insert(std::make_pair(WData->WindowID, mnuNewItem));
2348 WindowListPointers.insert(std::make_pair(WData->WindowID, WData->WindowPointer));
2349 WindowListType.insert(std::make_pair(WData->WindowID, 1));
2350 mnuWindow->Insert((pos + 1), mnuNewItem);
2351 this->Connect(mnuNewItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(frmMain::ShowContactEditorWindow));
2353 } else if (WData->DataType == 2){
2357 int intID = mnuSearchWindows->GetId();
2359 mnuWindow->FindChildItem(intID, &pos);
2360 wxMenuItem *mnuNewItem = new wxMenuItem(NULL, WData->WindowID, wxT("Search Window #") + wxString::Format(wxT("%i"), WData->WindowID), wxEmptyString, wxITEM_NORMAL, NULL);
2361 mnuNewItem->SetId(WData->WindowID);
2362 WindowListPointersMenu.insert(std::make_pair(WData->WindowID, mnuNewItem));
2363 WindowListPointers.insert(std::make_pair(WData->WindowID, WData->WindowPointer));
2364 WindowListType.insert(std::make_pair(WData->WindowID, 2));
2365 mnuWindow->Insert((pos + 1), mnuNewItem);
2366 this->Connect(mnuNewItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(frmMain::ShowSearchWindow));
2375 void frmMain::WindowEdit( wxCommandEvent &event ){
2377 WindowData *WData = (WindowData*)event.GetClientData();
2379 if (WData->DataType == 0){
2381 // Get the window title and use that.
2383 frmContact *frmContactPtr = static_cast<frmContact*>(WData->WindowPointer);
2385 wxString WindowTitle = frmContactPtr->GetTitle();
2387 std::map<int, wxMenuItem*>::iterator MenuIter = WindowListPointersMenu.find(WData->WindowID);
2389 MenuIter->second->SetItemLabel(WindowTitle);
2391 //mnuWindow->FindChildItem(intID, &pos);
2392 //wxMenuItem *mnuNewItem = new wxMenuItem(NULL, WData->WindowID, WindowTitle, WData->WindowID), wxEmptyString, wxITEM_NORMAL, NULL);
2393 //mnuNewItem->SetId(WData->WindowID);
2394 //ContactWindowListPointersMenu.insert(std::make_pair(WData->WindowID, mnuNewItem));
2395 //ContactWindowListPointers.insert(std::make_pair(WData->WindowID, WData->WindowPointer));
2396 //mnuWindow->Insert((pos + 1), mnuNewItem);
2397 //this->Connect(mnuNewItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(frmMain::ShowContactWindow));
2399 } else if (WData->DataType == 1){
2401 // Get the window title and use that.
2403 frmContactEditor *frmCEPtr = static_cast<frmContactEditor*>(WData->WindowPointer);
2405 wxString WindowTitle = frmCEPtr->GetTitle();
2407 std::map<int, wxMenuItem*>::iterator MenuIter = WindowListPointersMenu.find(WData->WindowID);
2409 if (WindowTitle.IsEmpty()){
2411 MenuIter->second->SetItemLabel(_("Unnamed Contact"));
2415 MenuIter->second->SetItemLabel(WindowTitle);
2419 //mnuWindow->FindChildItem(intID, &pos);
2420 //wxMenuItem *mnuNewItem = new wxMenuItem(NULL, WData->WindowID, WindowTitle, WData->WindowID), wxEmptyString, wxITEM_NORMAL, NULL);
2421 //mnuNewItem->SetId(WData->WindowID);
2422 //ContactEditorWindowListPointersMenu.insert(std::make_pair(WData->WindowID, mnuNewItem));
2423 //ContactEditorWindowListPointers.insert(std::make_pair(WData->WindowID, WData->WindowPointer));
2424 //mnuWindow->Insert((pos + 1), mnuNewItem);
2425 //this->Connect(mnuNewItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(frmMain::ShowContactEditorWindow));
2434 void frmMain::WindowDelete( wxCommandEvent &event ){
2436 WindowData *WData = (WindowData*)event.GetClientData();
2438 std::map<int, wxMenuItem*>::iterator MenuIter = WindowListPointersMenu.find(WData->WindowID);
2440 mnuWindow->Remove(MenuIter->second);
2442 delete MenuIter->second;
2443 MenuIter->second = NULL;
2445 WindowListPointersMenu.erase(WData->WindowID);
2446 WindowListPointers.erase(WData->WindowID);
2447 WindowListType.erase(WData->WindowID);
2454 void frmMain::ShowContactWindow( wxCommandEvent &event ){
2456 std::map<int, void*>::iterator WindowIter = WindowListPointers.find(event.GetId());
2458 frmContact *frmContactPtr = static_cast<frmContact*>(WindowIter->second);
2460 frmContactPtr->Show();
2461 frmContactPtr->Raise();
2465 void frmMain::ShowContactEditorWindow( wxCommandEvent &event ){
2467 std::map<int, void*>::iterator WindowIter = WindowListPointers.find(event.GetId());
2469 frmContactEditor *frmCEPtr = static_cast<frmContactEditor*>(WindowIter->second);
2476 void frmMain::ShowSearchWindow( wxCommandEvent &event ){
2478 // Look through the Search Window List Pointers, grab the
2479 // window point and show the window.
2481 std::map<int, void*>::iterator WindowIter = WindowListPointers.find(event.GetId());
2483 frmSearch *frmSearchPtr = static_cast<frmSearch*>(WindowIter->second);
2485 frmSearchPtr->Show();
2486 frmSearchPtr->Raise();
2490 void frmMain::ToggleConnectionStatus( wxCommandEvent &event ){
2492 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
2493 wxCommandEvent toggconn(ACTMGR_TOGGLECONN);
2494 wxPostEvent(frameActMgr, toggconn);
2498 void frmMain::ShowSSLCertificates( wxCommandEvent &event ){
2500 // Check the account type before continuing.
2502 wxString SeekAccount;
2503 wxString AccTypeLower;
2506 std::map<int, SSLCertCollection>::iterator SSLColIter;
2508 for (int i = 0; i < prefaccounts.GetCount(); i++){
2510 SeekAccount.Append(prefaccounts.GetAccountDirectory(i));
2511 AccType.Append(prefaccounts.GetAccountType(i));
2512 AccountSSL = prefaccounts.GetAccountSSL(i);
2513 AccTypeLower = AccType.MakeLower();
2514 SeekAccount.Append(wxT("."));
2515 SeekAccount.Append(AccTypeLower);
2517 if (SeekAccount == ActiveAccount){
2519 if (AccTypeLower == wxT("local")){
2525 if (AccountSSL == false){
2531 SSLColIter = AccountSSLData.find(i);
2533 SSLCertCollection SSLCertInfo = SSLColIter->second;
2535 frmSSLCertificate *frameSSLCert = new frmSSLCertificate ( this );
2536 frameSSLCert->StartCertFrom(0);
2537 frameSSLCert->SetupCerts(SSLCertInfo);
2538 frameSSLCert->ShowModal();
2540 delete frameSSLCert;
2541 frameSSLCert = NULL;
2545 SeekAccount.Clear();
2546 AccTypeLower.Clear();
2553 void frmMain::ShowSSLInfo( wxCommandEvent &event ){
2555 // Check the account type before continuing.
2559 void frmMain::HideSSLInfo( wxCommandEvent &event ){
2561 // Check the account type before continuing.
2565 void frmMain::UpdateConnectionStatus( wxCommandEvent &event ){
2567 if (event.GetInt() == 0){
2569 imgConnStatus->SetBitmap(*imgOnline);
2573 imgConnStatus->SetBitmap(*imgOffline);
2579 void frmMain::SetupSSLStatus( int AccountID ){
2581 // Check if account ID given is
2582 // the active account and if not, do nothing.
2585 wxString AccTypeLower;
2587 AccType = prefaccounts.GetAccountType(AccountID);
2588 AccTypeLower = AccType.MakeLower();
2590 wxString AccountIDName = prefaccounts.GetAccountDirectory(AccountID) + wxT(".") +
2593 if (AccountIDName != ActiveAccount){
2599 // Check if the account has SSL enabled.
2601 bool SSLInUse = prefaccounts.GetAccountSSL(AccountID);
2603 if (SSLInUse == FALSE){
2605 SSLToolTip->SetTip(wxT("SSL is not enabled for this account"));
2606 imgSSLStatus->SetBitmap(*imgNoSSL);
2610 // Get the SSL Collection Data.
2612 std::map<int,int>::iterator SSLResultIter = AccountSSLResult.find(AccountID);
2614 if (SSLResultIter->second == 1){
2616 imgSSLStatus->SetBitmap(*imgSSLWarning);
2617 SSLToolTip->SetTip(wxT("Invalid certificate(s) received for '") +
2618 prefaccounts.GetAccountName(AccountID) +
2619 wxT("' (Connection denied by user)\n\nDouble click for more information."));
2622 } else if (SSLResultIter->second == 0){
2624 imgSSLStatus->SetBitmap(*imgSSL);
2625 SSLToolTip->SetTip(wxT("Account '") +
2626 prefaccounts.GetAccountName(AccountID) +
2627 wxT("' secured using SSL\n\nDouble click for more information."));
2635 void frmMain::InvalidSSLCertificate( wxCommandEvent &event ){
2637 frmInvalidSSLCertificate *frameISC = new frmInvalidSSLCertificate ( this );
2638 SSLInvalidCertNotifObj *SSLICNObj = (SSLInvalidCertNotifObj*)event.GetClientData();
2639 SSLCertCollection SSLCCData = SSLICNObj->CertCollection;
2640 wxString AccountName = SSLICNObj->AccountName;
2641 frameISC->LoadData(SSLCCData, AccountName);
2642 frameISC->ShowModal();
2644 int FinalConflictResult = frameISC->GetResult();
2646 wxCommandEvent event2(ACTMGR_RESUMEPROC);
2647 event2.SetClientData(SSLICNObj->QRNotifData);
2648 event2.SetInt(FinalConflictResult);
2653 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
2654 wxPostEvent(frameActMgr, event2);
2657 void frmMain::PauseAllTimers(){
2659 for (std::map<wxString, wxAccountSyncTimer*>::iterator ASTiter = AccountSyncTimers.begin();
2660 ASTiter != AccountSyncTimers.end(); ASTiter++){
2662 ASTiter->second->Stop();
2668 void frmMain::ResumeAllTimers(){
2670 for (std::map<wxString, wxAccountSyncTimer*>::iterator ASTiter = AccountSyncTimers.begin();
2671 ASTiter != AccountSyncTimers.end(); ASTiter++){
2673 ASTiter->second->Start();
2679 void frmMain::UpdateSSLAccountStatus(int AccountID, int SSLStatus, SSLCertCollection SSLCertInc){
2681 // Delete existing data.
2683 AccountSSLData.erase(AccountID);
2684 AccountSSLResult.erase(AccountID);
2688 AccountSSLData.insert(std::make_pair(AccountID, SSLCertInc));
2689 AccountSSLResult.insert(std::make_pair(AccountID, SSLStatus));
2693 void frmMain::CheckUpdates( wxCommandEvent& event ){
2695 frmUpdate *frameUpdate = new frmUpdate ( this );
2696 frameUpdate->FetchData();
2697 frameUpdate->ShowModal();
2701 void frmMain::OpenImportDialog( wxCommandEvent& event ){
2703 // Run the import contacts system.
2709 void frmMain::OpenExportDialog( wxCommandEvent& event ){
2711 // Check if an account and at least one contact is selected
2712 // before continuing.
2714 wxArrayString ArrData;
2716 if (ActiveAccount.IsEmpty()){
2722 int ContactSelected = 0;
2723 int ContactsCollected = 0;
2724 long longSelected = -1;
2728 longSelected = lstContacts->GetNextItem(longSelected,
2730 wxLIST_STATE_SELECTED);
2732 if (longSelected == -1){
2738 int FileID = (int)lstContacts->GetItemData(longSelected);
2740 ArrData.Insert(ContactsFileIndex[FileID],
2741 ContactsCollected, 1);
2747 if (ContactSelected == 0){
2753 // Run the export contacts system.
2755 ExportRun(this, &ArrData);
2759 void frmMain::GetListControl(wxListCtrl *lstContactsPtr,
2760 wxArrayString *ContactsFileIndexPtr){
2762 lstContactsPtr = lstContacts;
2763 ContactsFileIndexPtr = &ContactsFileIndex;
2767 void frmMain::GetSelectedList( wxCommandEvent& event ){
2769 // Get the array of contact filenames.
2771 wxArrayString *ArrData = (wxArrayString*)event.GetClientData();
2773 // Process them into an array of files.
2775 long longSelected = -1;
2776 int ContactsCollected = 0;
2777 wxString ContactFilename;
2781 longSelected = lstContacts->GetNextItem(longSelected,
2783 wxLIST_STATE_SELECTED);
2785 if (longSelected == -1){
2791 // Get the file information and add to the list.
2793 int FileID = (int)lstContacts->GetItemData(longSelected);
2795 ArrData->Insert(ContactsFileIndex[FileID],
2796 ContactsCollected, 1);
2798 ContactsCollected++;
2799 ContactFilename.Clear();
2807 void frmMain::SyncAccount( wxCommandEvent& event ){
2809 wxString AccNameInc = event.GetString();
2811 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
2812 frameActMgr->AddTask(3, wxT(""), AccNameInc,
2813 wxT(""), wxT(""), wxT(""), wxT(""));
2817 void frmMain::ShowHelp( wxCommandEvent& event ){
2819 // Based on the operating system, work out where
2820 // the documentation should be.
2824 #if defined(__HAIKU__)
2826 #elif defined(__WIN32__)
2832 if (wxFileExists("/usr/share/doc/xestiaab/index.html")){
2834 wxLaunchDefaultBrowser(wxT("file:///usr/share/doc/xestiaab/index.html"));
2837 #if XSDAB_RELEASE == 0
2839 } else if (wxFileExists("/usr/local/share/doc/xestiaab/index.html")){
2841 wxLaunchDefaultBrowser(wxT("file:///usr/local/share/doc/xestiaab/index.html"));
2850 #if XSDAB_RELEASE == 0
2852 wxMessageBox(_("The help documentation is not available.\n\nYou can view the documentation that came with your source package."), _("Help documentation missing!"));
2856 wxMessageBox(_("The help documentation is not available in the usual locations on the system. Please visit http://documentation.xestia.co.uk/xestiaab/ for documentation"), _("Help documentation missing!"));
2862 void frmMain::ShowImportResults( wxCommandEvent &event ){
2864 std::map<int,wxString> *ResultData = (std::map<int,wxString>*)event.GetClientData();
2866 frmImportResults *frmIR = new frmImportResults(this);
2867 frmIR->LoadData(ResultData, event.GetInt(), (int)event.GetExtraLong());
2878 void frmMain::ReloadContactList( wxCommandEvent &event ){
2880 // Check if the account name given is the current
2881 // account selected.
2883 if (ActiveAccount == event.GetString()){
2885 wxTreeEvent NullEvent;
2886 LoadContactList(NullEvent);
2892 void frmMain::ShowContactMenu( wxMouseEvent& event ){
2894 bool EnableRefresh = FALSE;
2896 if (!ActiveAccount.IsEmpty()){
2898 EnableRefresh = TRUE;
2902 ContactMenu->SetupPointers(this, lstContacts, EnableRefresh);
2904 this->PopupMenu(ContactMenu->MenuPointer(), wxDefaultPosition);