7 #include <wx/tokenzr.h>
9 #include <wx/mstream.h>
10 #include <wx/fs_mem.h>
12 #include <wx/filesys.h>
14 #include <wx/stdpaths.h>
15 #include <wx/fileconf.h>
16 //#include <boost/filesystem/fstream.hpp>
22 #include "frmPreferences.h"
23 #include "frmNewAccount.h"
24 #include "frmActivityMgr.h"
25 #include "frmContact.h"
26 #include "frmConflictResolution.h"
27 #include "frmInvalidSSLCertificate.h"
28 #include "frmSearch.h"
29 #include "frmSSLCertificate.h"
30 #include "frmUpdate.h"
31 #include "import/frmImportResults.h"
34 #include "common/preferences.h"
35 #include "common/getcontactinfo.h"
36 #include "common/events.h"
37 #include "common/dirs.h"
38 #include "vcard/vcard.h"
39 #include "carddav/carddav.h"
40 #include "contacteditor/frmContactEditor.h"
41 #include "import/import.h"
42 #include "export/export.h"
43 #include "widgets/XABAccountView.h"
47 //extern const wxEventType MyHaremEvent = wxNewEventType();
49 //#define CE_UPDATECONTACTLIST 7700
50 //#define CE_UPDATEACCOUNTLIST 7701
52 DEFINE_EVENT_TYPE(CE_UPDATECONTACTLIST);
53 DEFINE_EVENT_TYPE(CE_UPDATEACCOUNTLIST);
54 DEFINE_EVENT_TYPE(SE_UPDATECONTACTNOTIF);
55 DEFINE_EVENT_TYPE(CE_OPENCONTACT);
56 DEFINE_EVENT_TYPE(CE_EDITCONTACT);
57 DEFINE_EVENT_TYPE(CE_REVEALCONTACT);
58 DEFINE_EVENT_TYPE(CE_REMOVECONTACT);
59 DEFINE_EVENT_TYPE(CE_REMOVESEARCH);
60 DEFINE_EVENT_TYPE(SYNC_EMPTYSERVER);
61 DEFINE_EVENT_TYPE(ACTMGR_START);
62 DEFINE_EVENT_TYPE(ACTMGR_SHUFFLE);
63 DEFINE_EVENT_TYPE(ACTMGR_STOP);
64 DEFINE_EVENT_TYPE(WINDOW_ADD);
65 DEFINE_EVENT_TYPE(WINDOW_EDIT);
66 //DEFINE_EVENT_TYPE(WINDOW_DELETE);
67 DEFINE_EVENT_TYPE(WINDOW_CLOSE);
68 DEFINE_EVENT_TYPE(CONNSTAT_UPDATE);
69 DEFINE_EVENT_TYPE(INVALIDSSLCERT);
70 DEFINE_EVENT_TYPE(GETSELECTEDLIST);
71 DEFINE_EVENT_TYPE(SYNCACCOUNT);
72 DEFINE_EVENT_TYPE(IMPORT_RESULTSSHOW);
73 DEFINE_EVENT_TYPE(RELOADCONTACTLIST);
75 BEGIN_EVENT_TABLE(frmMain, wxFrame)
76 EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, frmMain::ConflictResolution)
77 EVT_COMMAND(wxID_ANY, CE_UPDATECONTACTLIST, frmMain::UpdateContactList)
78 EVT_COMMAND(wxID_ANY, CE_UPDATEACCOUNTLIST, frmMain::UpdateAccountList)
79 EVT_COMMAND(wxID_ANY, SE_UPDATECONTACTNOTIF, frmMain::UpdateSearchContactLists)
80 EVT_COMMAND(wxID_ANY, CE_OPENCONTACT, frmMain::OpenContactInfo)
81 EVT_COMMAND(wxID_ANY, CE_EDITCONTACT, frmMain::ShowContactEditorEdit)
82 EVT_COMMAND(wxID_ANY, CE_REVEALCONTACT, frmMain::RevealContact)
83 EVT_COMMAND(wxID_ANY, CE_REMOVESEARCH, frmMain::RemoveContactsWindowPointer)
84 EVT_COMMAND(wxID_ANY, SYNC_EMPTYSERVER, frmMain::EmptyServerDialog)
85 EVT_COMMAND(wxID_ANY, ACTMGR_START, frmMain::ActivityIconStart)
86 EVT_COMMAND(wxID_ANY, ACTMGR_SHUFFLE, frmMain::ActivityIconShuffle)
87 EVT_COMMAND(wxID_ANY, ACTMGR_STOP, frmMain::ActivityIconStop)
88 EVT_COMMAND(wxID_ANY, WINDOW_ADD, frmMain::WindowAdd)
89 EVT_COMMAND(wxID_ANY, WINDOW_EDIT, frmMain::WindowEdit)
90 EVT_COMMAND(wxID_ANY, WINDOW_CLOSE, frmMain::WindowDelete)
91 EVT_COMMAND(wxID_ANY, CONNSTAT_UPDATE, frmMain::UpdateConnectionStatus)
92 EVT_COMMAND(wxID_ANY, INVALIDSSLCERT, frmMain::InvalidSSLCertificate)
93 EVT_COMMAND(wxID_ANY, GETSELECTEDLIST, frmMain::GetSelectedList)
94 EVT_COMMAND(wxID_ANY, SYNCACCOUNT, frmMain::SyncAccount)
95 EVT_COMMAND(wxID_ANY, IMPORT_RESULTSSHOW, frmMain::ShowImportResults)
96 EVT_COMMAND(wxID_ANY, RELOADCONTACTLIST, frmMain::ReloadContactList)
99 frmMain::frmMain( wxWindow* parent )
104 // Setup the account icons.
106 wxMemoryInputStream astream(icons_accinet_png, sizeof(icons_accinet_png));
107 wxMemoryInputStream bstream(icons_acclocal_png, sizeof(icons_acclocal_png));
108 wxMemoryInputStream cstream(icons_accgroup_png, sizeof(icons_accgroup_png));
109 wxMemoryInputStream dstream(icons_accnone_png, sizeof(icons_accnone_png));
111 wxImage icons_accinet_png(astream, wxBITMAP_TYPE_PNG);
112 wxBitmap AccInet(icons_accinet_png, -1);
114 wxIAccInet.CopyFromBitmap(AccInet);
116 wxImage icons_acclocal_png(bstream, wxBITMAP_TYPE_PNG);
117 wxBitmap AccNIcon(icons_acclocal_png, -1);
119 wxIAccNIcon.CopyFromBitmap(AccNIcon);
121 wxImage icons_accgroup_png(cstream, wxBITMAP_TYPE_PNG);
122 wxBitmap AccGrp(icons_accgroup_png, -1);
124 wxIAccGrp.CopyFromBitmap(AccGrp);
126 wxImage icons_accnone_png(dstream, wxBITMAP_TYPE_PNG);
127 wxBitmap AccNone(icons_accnone_png, -1);
129 wxIAccNone.CopyFromBitmap(AccNone);
131 AccountID = AccImgList->Add(wxIAccNIcon);
132 AccountNetID = AccImgList->Add(wxIAccInet);
133 AccountGrpID = AccImgList->Add(wxIAccGrp);
134 AccountNoneID = AccImgList->Add(wxIAccNone);
136 bmpIcon->SetIcon(AccImgList->GetIcon(AccountNoneID));
138 // Setup the status bar icons.
142 wxMemoryInputStream sslstream(icons_ssl_png, sizeof(icons_ssl_png));
143 wxMemoryInputStream sslwarningstream(icons_sslwarning_png, sizeof(icons_sslwarning_png));
144 wxMemoryInputStream nosslstream(icons_nossl_png, sizeof(icons_nossl_png));
146 wxImage icons_ssl_png(sslstream, wxBITMAP_TYPE_PNG);
147 imgSSL = new wxBitmap(icons_ssl_png, -1);
149 wxImage icons_sslwarning_png(sslwarningstream, wxBITMAP_TYPE_PNG);
150 imgSSLWarning = new wxBitmap(icons_sslwarning_png, -1);
152 wxImage icons_nossl_png(nosslstream, wxBITMAP_TYPE_PNG);
153 imgNoSSL = new wxBitmap(icons_nossl_png, -1);
157 wxMemoryInputStream act1(icons_act1_png, sizeof(icons_act1_png));
158 wxMemoryInputStream act2(icons_act2_png, sizeof(icons_act2_png));
159 wxMemoryInputStream act3(icons_act3_png, sizeof(icons_act3_png));
160 wxMemoryInputStream act4(icons_act4_png, sizeof(icons_act4_png));
161 wxMemoryInputStream actsleep(icons_actsleep_png, sizeof(icons_actsleep_png));
163 wxImage icons_actsleep_png(actsleep, wxBITMAP_TYPE_PNG);
164 imgActIconSleep = new wxBitmap (icons_actsleep_png, -1);
166 wxImage icons_act1_png(act1, wxBITMAP_TYPE_PNG);
167 imgActIcon1 = new wxBitmap (icons_act1_png, -1);
169 wxIAct1icon.CopyFromBitmap(*imgActIcon1);
171 wxImage icons_act2_png(act2, wxBITMAP_TYPE_PNG);
172 imgActIcon2 = new wxBitmap (icons_act2_png, -1);
174 wxIAct2icon.CopyFromBitmap(*imgActIcon2);
176 wxImage icons_act3_png(act3, wxBITMAP_TYPE_PNG);
177 imgActIcon3 = new wxBitmap (icons_act3_png, -1);
179 wxIAct3icon.CopyFromBitmap(*imgActIcon3);
181 wxImage icons_act4_png(act4, wxBITMAP_TYPE_PNG);
182 imgActIcon4 = new wxBitmap (icons_act4_png, -1);
184 wxIAct4icon.CopyFromBitmap(*imgActIcon4);
186 // Online/Offline icons.
188 wxMemoryInputStream onlinestream(icons_online_png, sizeof(icons_online_png));
189 wxMemoryInputStream offlinestream(icons_offline_png, sizeof(icons_offline_png));
191 wxImage icons_online_png(onlinestream, wxBITMAP_TYPE_PNG);
192 imgOnline = new wxBitmap(icons_online_png, -1);
194 wxImage icons_offline_png(offlinestream, wxBITMAP_TYPE_PNG);
195 imgOffline = new wxBitmap(icons_offline_png, -1);
197 // Setup the account view.
199 AccCtrl->SetPopupControl(treAccounts);
200 AccCtrl->SetPopupMaxHeight(175);
201 AccCtrl->SetPopupMinWidth(250);
202 treAccounts->AssignImageList(AccImgList);
205 /*wxStaticBitmap* BeepBoop = new wxStaticBitmap(AccCtrl, wxID_ANY, wxNullBitmap, wxPoint(AccTextCtrlSize.GetX() + 3, AccTextCtrlSize.GetY() + 2), wxDefaultSize, 0);
207 icons_accgroup_png.SetMask(new wxMask(icons_accgroup_png, wxSystemSettings::GetColour(wxSYS_COLOUR_BACKGROUND)));
209 BeepBoop->SetBackgroundColour(AccCtrl->GetBackgroundColour());
210 BeepBoop->SetBitmap(icons_accgroup_png);*/
212 //szrContactList->Insert(0, XABV2, 1, wxEXPAND | wxALL, 0);
214 /*AccControl->UseAltPopupWindow();
215 AccControl->SetPopupControl(treAccounts);
216 AccControl->SetPopupMaxHeight(175);
218 treAccounts->AssignImageList(AccImgList);
219 szrContactList->Insert(0, AccControl, 1, wxEXPAND|wxALL, 0);
220 szrAccList->Add(AccIcon, 0, wxLEFT|wxTOP|wxEXPAND, 3);
224 //szrContactList->Layout();
225 //szrContactList->RecalcSizes();
227 wxListItem ColumnData;
229 ColumnData.SetText(wxT("Name0"));
230 ColumnData.SetWidth(320);
231 lstContacts->InsertColumn(0, ColumnData);
233 //Connect(wxID_ANY, ContactConflictCmdEnv,
234 // ContactConflictEventHandler(frmMain::ConflictResolution), NULL, this);
236 //Connect(wxID_ANY, MyFooCommandEvent,
237 // MyFooEventHandler(frmMain::DoSomething), NULL, this);
239 //Bind(ContactConflictCmdEnv, ContactConflictEventHandler(frmMain::ConflictResolution), this, wxID_ANY);
241 treAccounts->Connect(wxEVT_LEFT_DCLICK, wxTreeEventHandler(frmMain::LoadContactList), NULL, this);
242 treAccounts->Connect(wxEVT_TREE_SEL_CHANGED, wxTreeEventHandler(frmMain::LoadContactList), NULL, this);
244 #if defined(__HAIKU__)
246 #elif defined(__WIN32__)
248 int stbBottomData [4] = { -1, 8, 8, 8 };
252 int stbBottomData [4] = { -1, 20, 20, 20 };
256 stbBottom->SetFieldsCount(4, stbBottomData);
257 stbBottom->SetMinHeight(16);
262 stbBottom->GetFieldRect(1, rectOnline);
263 stbBottom->GetFieldRect(2, rectSSL);
264 stbBottom->GetFieldRect(3, rectActivity);
266 SSLToolTip = new wxToolTip(wxT(""));
268 imgConnStatus = new wxStaticBitmap(stbBottom, wxID_ANY, wxNullBitmap, wxPoint((rectOnline.GetX()),(rectOnline.GetY())), wxDefaultSize, 0 );
269 imgConnStatus->SetBitmap(*imgOnline);
270 imgConnStatus->Connect( wxEVT_LEFT_DCLICK, wxCommandEventHandler( frmMain::ToggleConnectionStatus ), NULL, this );
272 imgSSLStatus = new wxStaticBitmap(stbBottom, wxID_ANY, wxNullBitmap, wxPoint((rectSSL.GetX()),(rectSSL.GetY())), wxDefaultSize, 0 );
273 imgSSLStatus->SetBitmap(*imgNoSSL);
274 imgSSLStatus->SetToolTip(SSLToolTip);
275 imgSSLStatus->Connect( wxEVT_LEFT_DCLICK, wxCommandEventHandler( frmMain::ShowSSLCertificates ), NULL, this );
277 imgActivityStatus = new wxStaticBitmap(stbBottom, wxID_ANY, wxNullBitmap, wxPoint((rectActivity.GetX()),(rectActivity.GetY())), wxDefaultSize, 0);
278 imgActivityStatus->SetBitmap(*imgActIconSleep);
279 imgActivityStatus->Connect( wxEVT_LEFT_DCLICK, wxCommandEventHandler( frmMain::ShowActivityWindow ), NULL, this );
281 // Setup the window menu.
283 // By default should be:
288 // Contact editor windows:
294 mnuContactWindows = new wxMenuItem( mnuManage, wxID_ANY, wxString( _("Contact windows:") ), wxEmptyString, wxITEM_NORMAL );
295 mnuWindow->Append( mnuContactWindows );
297 mnuWindow->AppendSeparator();
299 mnuContactEditorWindows = new wxMenuItem( mnuManage, wxID_ANY, wxString( _("Contact editor windows:") ), wxEmptyString, wxITEM_NORMAL );
300 mnuWindow->Append( mnuContactEditorWindows );
302 mnuWindow->AppendSeparator();
304 mnuSearchWindows = new wxMenuItem( mnuManage, wxID_ANY, wxString( wxT("Search windows:") ), wxEmptyString, wxITEM_NORMAL );
305 mnuWindow->Append( mnuSearchWindows );
307 #if defined(__WIN32__)
312 mnuContactWindows->SetFont(fontstyle);
313 mnuContactEditorWindows->SetFont(fontstyle);
314 mnuSearchWindows->SetFont(fontstyle);
318 mnuContactWindows->Enable(FALSE);
319 mnuContactEditorWindows->Enable(FALSE);
320 mnuSearchWindows->Enable(FALSE);
324 // Hide unimplemented functions.
330 void frmMain::QuitApp( wxCloseEvent& event )
337 void frmMain::QuitApp( wxCommandEvent& event )
344 void frmMain::QuitApp()
346 //-------------------------------------------------------------------
347 // frmMain::QuitApp: Quits the application by simply closing this
348 // window which causes the exit as frmMain is the main window.
350 // wxCommandEvent Accepts a referenced event command.
351 //-------------------------------------------------------------------
353 //-------------------------------------------------------------------
354 // frmMain::QuitApp: Quits the application by simply closing this
355 // window which causes the exit as frmMain is the main window.
357 // wxCommandEvent Accepts a referenced event command.
358 //-------------------------------------------------------------------
360 //Go through the windows and close each one (be it search
361 //or contact editor). Abort if user wants to cancel.
363 // Close the contact editor windows.
365 // Close the contact windows.
367 // Close the search windows.
369 // Write out the ETag databases.
371 // Save Preferences: Save the window position if that option is enabled.
373 wxString SetFilename = GetUserPrefDir();
375 #if defined(__HAIKU__)
379 #elif defined(__WIN32__)
381 SetFilename.Append(wxT("settings"));
387 SetFilename.Append(wxT("settings"));
391 wxFileConfig *cfgfile = new wxFileConfig("", "", SetFilename);
393 bool SaveWindowPos = FALSE;
394 wxString SaveWindowInc;
395 cfgfile->Read(wxT("SaveWindowPosition"), &SaveWindowInc);
397 if (SaveWindowInc == wxT("true")){
399 SaveWindowPos = TRUE;
403 if (SaveWindowPos == TRUE){
405 wxRect frmMainPos = this->GetRect();
407 cfgfile->Write(wxT("WindowPositionX"), frmMainPos.GetX());
408 cfgfile->Write(wxT("WindowPositionY"), frmMainPos.GetY());
409 cfgfile->Write(wxT("WindowPositionHeight"), frmMainPos.GetHeight());
410 cfgfile->Write(wxT("WindowPositionWidth"), frmMainPos.GetWidth());
418 //Everything closed... exit.
426 void frmMain::ShowActivityWindow( wxCommandEvent& event )
429 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
430 frameActMgr->OpenWindow();
435 void frmMain::ShowAboutWindow( wxCommandEvent& event )
437 //-------------------------------------------------------------------
438 // frmMain::ShowAboutWindow: Shows the About window as a modal
439 // dialog and then cleans up when finished.
441 // wxCommandEvent Accepts a referenced event command.
442 //-------------------------------------------------------------------
444 frmAbout *frameAbout = new frmAbout ( this );
445 frameAbout->SetupAboutWindow();
446 frameAbout->ShowModal();
452 void frmMain::OpenPreferences( wxCommandEvent& event)
454 //-------------------------------------------------------------------
455 // frmMain::ShowAboutWindow: Opens the Preferences window as a modal
456 // dialog and then cleans up when finished.
458 // wxCommandEvent Accepts a referenced event command.
459 //-------------------------------------------------------------------
461 ReloadAccounts = FALSE;
463 frmPreferences *framePreferences = new frmPreferences ( this );
464 framePreferences->SetupPointers(&ReloadAccounts);
465 framePreferences->ShowModal();
466 delete framePreferences;
467 framePreferences = NULL;
469 if (ReloadAccounts == TRUE){
471 // Reload the accounts as a change has been made within
474 this->LoadPreferences();
480 void frmMain::OpenNewABDialog( wxCommandEvent& event)
482 //-------------------------------------------------------------------
483 // frmMain::ShowAboutWindow: Opens the Preferences window as a modal
484 // dialog and then cleans up when finished.
486 // wxCommandEvent Accepts a referenced event command.
487 //-------------------------------------------------------------------
489 ReloadAccounts = FALSE;
491 frmNewAccount *frameNewAccount = new frmNewAccount ( this );
492 frameNewAccount->SetupPointers(&ReloadAccounts);
493 frameNewAccount->ShowModal();
494 delete frameNewAccount;
495 frameNewAccount = NULL;
497 if (ReloadAccounts == TRUE){
499 // Reload the accounts as a change has been made within
502 this->LoadPreferences();
508 void frmMain::LoadContactList( wxTreeEvent& event )
511 // Clear all existing variables.
513 lstContacts->DeleteAllItems();
515 treAccounts->SetAccount();
517 wxTreeItemIdValue cookie;
518 wxTreeItemId next = treAccounts->GetRootItem();
519 wxString AccountName;
520 wxString AccountDir, AccountType, AccountDirFinal, AccountTypeFinal;
521 wxString AccountDirCmb;
522 long selectedaccount = 0;
524 wxTreeItemId selectedChild = treAccounts->GetSelection();
525 wxTreeItemId nextChild;
527 wxTreeItemId ActiveItemId = treAccounts->GetFocusedItem();
528 int ActiveItemIcon = treAccounts->GetItemImage(ActiveItemId, wxTreeItemIcon_Normal);
530 int SCImg = treAccounts->GetItemImage(selectedChild);
531 int AccountIndex = 0;
533 bmpIcon->SetIcon(AccImgList->GetIcon(SCImg));
535 for (int i = 0; i < prefaccounts.GetCount(); i++){
537 if (ActiveItemIcon == 2){
539 std::multimap<wxTreeItemId, int>::iterator AGTiter = AccountGroupTreeId.find(ActiveItemId);
540 std::multimap<int, int>::iterator AGLiter = AccountGroupList.find(AGTiter->second);
541 int ActiveAccountG = AGLiter->second;
543 if (i == ActiveAccountG){
545 AccountDir.Append(prefaccounts.GetAccountDirectory(i));
546 AccountType.Append(prefaccounts.GetAccountType(i));
551 if (AccountType == wxT("CardDAV")){
552 AccountTypeFinal.Append(wxT("carddav"));
554 else if (AccountType == wxT("Local")){
555 imgSSLStatus->SetBitmap(*imgOffline);
556 SSLToolTip->SetTip(wxT("SSL status is not applicable for this account"));
557 AccountTypeFinal.Append(wxT("local"));
568 nextChild = treAccounts->GetFirstChild(next, cookie);
571 nextChild = treAccounts->GetNextSibling(nextChild);
574 AccountName = treAccounts->GetItemText(nextChild);
576 if (nextChild == selectedChild){
577 AccountDir.Append(prefaccounts.GetAccountDirectory(i));
578 AccountType.Append(prefaccounts.GetAccountType(i));
583 if (AccountType == wxT("CardDAV")){
584 AccountTypeFinal.Append(wxT("carddav"));
586 else if (AccountType == wxT("Local")){
587 SSLToolTip->SetTip(wxT("SSL status is not applicable for this account"));
588 AccountTypeFinal.Append(wxT("local"));
597 if (selectedaccount >= prefaccounts.GetCount()){
599 // The account selected isn't there so return.
607 // Open the directory and get the list of .vcf files
608 // in that directory.
610 ActiveAccount = AccountDir + wxT(".") + AccountTypeFinal;
611 ActiveAccountType = AccountType;
613 SetupSSLStatus(AccountIndex);
615 AccountDirFinal.Clear();
616 AccountDirFinal = GetAccountDir(AccountDir + wxT(".") + AccountTypeFinal, FALSE);
618 ContactsFileIndex.Clear();
620 //wxString vcardfilenamewxs;
621 wxString vCardFilename;
622 wxString vCardFilenameFull;
623 wxString vCardDataString;
624 wxStringTokenizer vcardfileline;
626 wxString setname, setvalue;
627 //vCardNames = new std::map<wxString, wxString, std::greater<wxString>>;
628 std::multimap<wxString, wxString, std::greater<wxString>> vCardNamesAsc;
629 std::multimap<wxString, wxString, std::less<wxString>> vCardNamesDsc;
630 long ContactIndex = 1;
631 long ContactSeekPoint = 0;
633 wxDir vcardaccdir(AccountDirFinal);
635 // Get the wxTreeItemId and image icon and compare it to the list.
637 if (ActiveItemIcon == AccountGrpID){
639 // It's a group so load the file containing the group and
640 // get the members of the group.
645 std::multimap<wxTreeItemId, int>::iterator AGTiter = AccountGroupTreeId.find(ActiveItemId);
646 std::multimap<int, wxString>::iterator AGFiter = AccountGroupFilename.find(AGTiter->second);
647 //std::multimap<wxTreeItemId, int>::iterator AGFiter = AccountGroupTreeId.find(ActiveItemId);
649 Group.LoadFile(AGFiter->second);
651 ArrayvCardOutData vCardMember = Group.GetByPartial(wxT("MEMBER"));
653 for (int i = 0; i < vCardMember.PropCount; i++){
655 vCardMember.PropValues[i].Trim();
656 if (vCardMember.PropValues[i].Left(9) == wxT("urn:uuid:")){
658 wxString NewPropValue;
659 NewPropValue = vCardMember.PropValues[i].Mid(9, wxString::npos);
660 vCardMember.PropValues[i] = NewPropValue;
667 bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES);
670 if (vCardFilename.Right(4) == wxT(".vcf") ||
671 vCardFilename.Right(4) == wxT(".VCF") ||
672 vCardFilename.Right(5) == wxT(".vcard") ||
673 vCardFilename.Right(5) == wxT(".VCARD")){
676 bool FoundMember = FALSE;
678 vCardFilenameFull.Append(AccountDirFinal);
679 vCardFilenameFull.Append(wxT("/"));
680 vCardFilenameFull.Append(vCardFilename);
682 Person.LoadFile(vCardFilenameFull);
684 UIDCode = Person.Get(wxT("UID"));
686 for (int i = 0; i < vCardMember.PropCount; i++){
688 if (vCardMember.PropValues[i] == UIDCode){
696 if (FoundMember == FALSE){
698 vCardFilename.Clear();
699 vCardFilenameFull.Clear();
700 vCardDataString.Clear();
701 ProcFiles = vcardaccdir.GetNext(&vCardFilename);
706 if (Person.MeetBaseSpecification()){
710 // Split the name into sections.
712 vCardDataString = Person.Get(wxT("N"));
714 vCardName NameData = Person.GetName();
716 vCardDataString = NameData.Forename + wxT(" ") + NameData.Surname;
718 } else if (SortMode == 2){
720 // Split the name into sections.
722 vCardName NameData = Person.GetName();
724 vCardDataString = NameData.Surname + wxT(", ") + NameData.Forename;
726 } else if (SortMode == 3){
728 // Check and make sure that the top most nickname is used.
730 vCardDataString = Person.Get(wxT("NICKNAME"));
732 if (vCardDataString.IsEmpty()){
734 vCardDataString = wxT("(no nickname)");
738 } else if (SortMode == 4){
740 vCardDataString = Person.Get(wxT("FN"));
744 if (AscendingMode == TRUE){
745 vCardNamesAsc.insert(std::make_pair(vCardDataString, vCardFilenameFull));
747 vCardNamesDsc.insert(std::make_pair(vCardDataString, vCardFilenameFull));
756 vCardFilename.Clear();
757 vCardFilenameFull.Clear();
758 vCardDataString.Clear();
759 ProcFiles = vcardaccdir.GetNext(&vCardFilename);
764 bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES);
767 if (vCardFilename.Right(4) == wxT(".vcf") ||
768 vCardFilename.Right(4) == wxT(".VCF") ||
769 vCardFilename.Right(5) == wxT(".vcard") ||
770 vCardFilename.Right(5) == wxT(".VCARD")){
774 vCardFilenameFull.Append(AccountDirFinal);
775 vCardFilenameFull.Append(vCardFilename);
777 Person.LoadFile(vCardFilenameFull);
779 if (Person.MeetBaseSpecification()){
783 // Split the name into sections.
785 vCardDataString = Person.Get(wxT("N"));
787 vCardName NameData = Person.GetName();
789 vCardDataString = NameData.Forename + wxT(" ") + NameData.Surname;
791 } else if (SortMode == 2){
793 // Split the name into sections.
795 vCardName NameData = Person.GetName();
797 vCardDataString = NameData.Surname + wxT(", ") + NameData.Forename;
799 } else if (SortMode == 3){
801 // Check and make sure that the top most nickname is used.
803 vCardDataString = Person.Get(wxT("NICKNAME"));
805 if (vCardDataString.IsEmpty()){
807 vCardDataString = wxT("(no nickname)");
811 } else if (SortMode == 4){
813 vCardDataString = Person.Get(wxT("FN"));
817 if (AscendingMode == TRUE){
818 vCardNamesAsc.insert(std::make_pair(vCardDataString, vCardFilenameFull));
820 vCardNamesDsc.insert(std::make_pair(vCardDataString, vCardFilenameFull));
829 vCardFilename.Clear();
830 vCardFilenameFull.Clear();
831 vCardDataString.Clear();
832 ProcFiles = vcardaccdir.GetNext(&vCardFilename);
839 // Insert the data into the control.
841 if (AscendingMode == TRUE){
842 for (std::map<wxString, wxString>::iterator iter = vCardNamesAsc.begin();
843 iter != vCardNamesAsc.end(); ++iter){
845 wxListItem ContactInfo;
847 ContactInfo.SetId(0);
848 ContactInfo.SetText(_("Mooo"));
849 ContactInfo.SetData(ContactSeekPoint);
850 ContactIndex = lstContacts->InsertItem(ContactInfo);
852 lstContacts->SetItem(ContactIndex, 0, iter->first);
853 ContactsFileIndex.Insert(iter->second, ContactSeekPoint);
860 for (std::map<wxString, wxString>::iterator iter = vCardNamesDsc.begin();
861 iter != vCardNamesDsc.end(); ++iter){
863 wxListItem ContactInfo;
865 ContactInfo.SetId(0);
866 ContactInfo.SetText(_("Mooo"));
867 ContactInfo.SetData(ContactSeekPoint);
868 ContactIndex = lstContacts->InsertItem(ContactInfo);
870 lstContacts->SetItem(ContactIndex, 0, iter->first);
871 ContactsFileIndex.Insert(iter->second, ContactSeekPoint);
880 void frmMain::ShowContactInfo( wxListEvent& event )
883 long intSelected = -1;
884 long ContactSeekNum = -1;
886 // intSelected = lstContacts->GetSelection();
888 // Check if several contacts have been selected.
890 int ContactTotal = 0;
894 intSelected = lstContacts->GetNextItem(intSelected,
896 wxLIST_STATE_SELECTED);
898 if (intSelected == -1){
908 if (ContactTotal == 0){
909 htmContactData->SetPage(wxT(""));
913 if (ContactTotal > 1){
915 htmContactData->SetPage(wxString::Format(wxT("%i contacts selected."), ContactTotal));
916 ActiveFilename.Clear();
921 intSelected = lstContacts->GetNextItem(intSelected,
923 wxLIST_STATE_SELECTED);
925 ContactSeekNum = lstContacts->GetItemData(intSelected);
928 wxString wxSContactString;
929 wxString ContactLine;
932 size_t ContactLineLen;
933 bool ExtraLineSeek = FALSE;
934 int QuoteBreakPoint = 0;
936 bool PropertyFind = FALSE;
937 bool QuoteMode = FALSE;
939 wxString wxSPropertyNextLine;
940 wxString wxSProperty;
941 wxString wxSPropertySeg1;
942 wxString wxSPropertySeg2;
944 // Check if we are using wxWidgets version 2.8 or less and
945 // execute the required command accordingly.
947 #if wxABI_VERSION < 20900
948 ContactFile.Open(ContactsFileIndex[ContactSeekNum].c_str(), wxT("r"));
950 ContactFile.Open(ContactsFileIndex[ContactSeekNum], wxT("r"));
953 if (ContactFile.IsOpened() == FALSE){
959 ContactFile.ReadAll(&wxSContactString, wxConvAuto());
963 std::map<int, wxString> ContactFileLines;
964 std::map<int, wxString>::iterator striter;
966 wxStringTokenizer wSTContactFileLines(wxSContactString, wxT("\r\n"));
968 int ContactLineSeek = 0;
970 while (wSTContactFileLines.HasMoreTokens() == TRUE){
972 ContactLine = wSTContactFileLines.GetNextToken();
973 ContactFileLines.insert(std::make_pair(ContactLineSeek, ContactLine));
978 if (ContactSeekNum < 0){
982 for (std::map<int, wxString>::iterator iter = ContactFileLines.begin();
983 iter != ContactFileLines.end(); ++iter){
985 // Find the colon which splits the start bit from the data part.
987 ContactLine = iter->second;
989 while (ExtraLineSeek == TRUE){
991 // Check if there is extra data on the next line
992 // (indicated by space or tab at the start) and add data.
996 if (iter == ContactFileLines.end()){
1003 wxSPropertyNextLine = iter->second;
1006 if (wxSPropertyNextLine.Mid(0, 1) == wxT(" ") || wxSPropertyNextLine.Mid(0, 1) == wxT("\t")){
1008 wxSPropertyNextLine.Remove(0, 1);
1009 //wxSPropertyNextLine.Trim(FALSE);
1010 //ContactLine.Trim();
1011 ContactLine.Append(wxSPropertyNextLine);
1016 ExtraLineSeek = FALSE;
1022 ContactLineLen = ContactLine.Len();
1024 // Make sure we are not in quotation mode.
1025 // Make sure colon does not have \ or \\ before it.
1027 for (int i = 0; i <= ContactLineLen; i++){
1029 if ((ContactLine.Mid(i, 1) == wxT(";") || ContactLine.Mid(i, 1) == wxT(":")) && PropertyFind == TRUE){
1031 PropertyFind = FALSE;
1033 } else if (PropertyFind == TRUE){
1035 wxSProperty.Append(ContactLine.Mid(i, 1));
1039 if (ContactLine.Mid(i, 1) == wxT("\"")){
1041 if (QuoteMode == TRUE){
1053 if (ContactLine.Mid(i, 1) == wxT(":") && ContactLine.Mid((i - 1), 1) != wxT("\\") && QuoteMode == FALSE){
1055 QuoteBreakPoint = i;
1062 // Split that line at the point into two variables (ignore the colon).
1064 wxSPropertySeg1 = ContactLine.Mid(0, QuoteBreakPoint);
1065 wxSPropertySeg2 = ContactLine.Mid((QuoteBreakPoint + 1));
1067 // Insert both into the vCard data file.
1069 Person.AddRaw(wxSPropertySeg1, wxSPropertySeg2);
1072 PropertyFind = TRUE;
1073 ExtraLineSeek = TRUE;
1075 QuoteBreakPoint = 0;
1076 ContactLine.Clear();
1077 wxSProperty.Clear();
1081 OldSessionID = SessionID;
1082 SessionID = wxString::Format(wxT("%i"), rand() % 32768);
1083 LoadContactData(&Person, htmContactData, SessionID, OldSessionID, &MemoryFileList);
1084 ActiveFilename = ContactsFileIndex[ContactSeekNum];
1088 void frmMain::ShowContactEditorNew( wxCommandEvent& event )
1091 // Check if there is an account selected and if not
1092 // return immediately.
1094 if (ActiveAccount.IsEmpty()){
1100 // Add Pointer to SetupPointers for the ETagDB.
1102 wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
1103 wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
1104 wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
1106 contacticon.CopyFromBitmap(contacticonbmp);
1108 frmContactEditor *ContactEditor = new frmContactEditor( this );
1112 ContactEditor->SetUID(WindowMenuItemID);
1114 WindowData *WData = new WindowData;
1116 WData->DataType = 1;
1117 WData->WindowPointer = (void*)ContactEditor;
1118 WData->WindowID = WindowMenuItemID;
1120 wxCommandEvent addevent(WINDOW_ADD);
1121 addevent.SetClientData(WData);
1122 wxPostEvent(this, addevent);
1124 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
1125 ContactEditor->SetupHeaders();
1126 ContactEditor->SetupContact(ActiveAccount);
1127 ContactEditor->SetIcon(contacticon);
1128 ContactEditor->SetupPointers(frameActMgr, &ETagProcTimer, this);
1129 ContactEditor->Show(true);
1133 void frmMain::ShowContactEditorEdit( wxCommandEvent& event )
1136 // Check if there is an account selected and if not
1137 // return immediately.
1139 int DataCheck = event.GetInt();
1141 if (ActiveAccount.IsEmpty() && DataCheck == 0){
1147 wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
1148 wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
1149 wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
1151 contacticon.CopyFromBitmap(contacticonbmp);
1153 // Check if a contact has been selected.
1155 long intSelected = -1;
1156 long intContactSeekNum = -1;
1158 // intSelected = lstContacts->GetSelection();
1160 intSelected = lstContacts->GetNextItem(intSelected,
1162 wxLIST_STATE_SELECTED);
1164 if (intSelected == -1){
1168 intContactSeekNum = lstContacts->GetItemData(intSelected);
1170 // Get the filename of the selected contact.
1172 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
1173 frmContactEditor *ContactEditor = new frmContactEditor( this );
1177 ContactEditor->SetUID(WindowMenuItemID);
1179 WindowData *WData = new WindowData;
1181 WData->DataType = 1;
1182 WData->WindowPointer = (void*)ContactEditor;
1183 WData->WindowID = WindowMenuItemID;
1185 wxCommandEvent addevent(WINDOW_ADD);
1186 addevent.SetClientData(WData);
1187 wxPostEvent(this, addevent);
1189 ContactEditor->SetupPointers(frameActMgr, &ETagProcTimer, this);
1190 ContactEditor->SetupHeaders();
1192 // Check if pointer is NULL (not from the search forms) or not.
1194 if (DataCheck == 0){
1196 ContactEditor->LoadContact(ContactsFileIndex[intContactSeekNum]);
1197 ContactEditor->SetupContact(ActiveAccount);
1201 UCNotif *uc = (UCNotif*)event.GetClientData();
1205 ContactEditor->SetupContact(ActiveAccount);
1206 ContactEditor->LoadContact(ContactsFileIndex[intContactSeekNum]);
1210 ContactEditor->SetupContact(uc->ContactAccount);
1211 ContactEditor->LoadContact(uc->ContactFilename);
1221 ContactEditor->SetIcon(contacticon);
1222 ContactEditor->Show(true);
1226 void frmMain::RefreshAddressBook( wxCommandEvent& event ){
1228 // Check if ActiveAccount is empty. If not then check if
1229 // account type is not local otherwise continue.
1231 if (!ActiveAccount.IsEmpty()){
1233 if (ActiveAccountType != wxT("Local")){
1235 // Account type is not local.
1237 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
1238 frameActMgr->AddTask(3, wxT(""), ActiveAccount,
1239 wxT(""), wxT(""), wxT(""), wxT(""));
1243 wxMessageBox(_("The refresh address book command is not supported with this type of account."), wxT("Not supported for this type of account"));
1251 void frmMain::OpenContactInfo( wxListEvent& event )
1254 wxStringTokenizer vcardfileline;
1257 wxString setname, setvalue;
1261 long intSelected = -1;
1262 long intContactSeekNum = -1;
1264 intSelected = lstContacts->GetNextItem(intSelected,
1266 wxLIST_STATE_SELECTED);
1268 intContactSeekNum = lstContacts->GetItemData(intSelected);
1270 if (intContactSeekNum == -1){
1274 Person.LoadFile(ContactsFileIndex[intContactSeekNum]);
1276 wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
1277 wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
1278 wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
1280 contacticon.CopyFromBitmap(contacticonbmp);
1282 frmContact *Contact = new frmContact( this );
1284 // Add to window list.
1288 Contact->SetUID(WindowMenuItemID);
1290 WindowData *WData = new WindowData;
1292 WData->DataType = 0;
1293 WData->WindowPointer = (void*)Contact;
1294 WData->WindowID = WindowMenuItemID;
1296 wxCommandEvent addevent(WINDOW_ADD);
1297 addevent.SetClientData(WData);
1298 wxPostEvent(this, addevent);
1300 Contact->SetupPointers(&MemoryFileList);
1301 Contact->SetupContactData(&Person);
1303 Contact->SetIcon(contacticon);
1304 Contact->Show(true);
1308 void frmMain::OpenContactInfo( wxCommandEvent& event )
1311 UCNotif *uc = (UCNotif*)event.GetClientData();
1313 wxStringTokenizer vcardfileline;
1316 wxString setname, setvalue;
1319 //std::fstream vcardfile;
1321 Person.LoadFile(uc->ContactFilename);
1323 wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
1324 wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
1325 wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
1327 contacticon.CopyFromBitmap(contacticonbmp);
1329 frmContact *Contact = new frmContact( this );
1331 // Add to window list.
1335 Contact->SetUID(WindowMenuItemID);
1337 WindowData *WData = new WindowData;
1339 WData->DataType = 0;
1340 WData->WindowPointer = (void*)Contact;
1341 WData->WindowID = WindowMenuItemID;
1343 wxCommandEvent addevent(WINDOW_ADD);
1344 addevent.SetClientData(WData);
1345 wxPostEvent(this, addevent);
1347 Contact->SetupPointers(&MemoryFileList);
1348 Contact->SetupContactData(&Person);
1350 Contact->SetIcon(contacticon);
1351 Contact->Show(true);
1356 void frmMain::LoadPreferences( wxActivateEvent& event)
1358 this->LoadPreferences();
1361 void frmMain::LoadPreferences(){
1363 // Load the preferences.
1365 wxString preffilename = GetUserPrefDir();
1367 XABPreferences preferences(preffilename);
1369 // Setup the main window position (if needed).
1371 bool SaveWindowPos = preferences.GetBoolData(wxT("SaveWindowPosition"));
1372 bool HideLocalABs = preferences.GetBoolData(wxT("HideLocalAddressBooks"));
1374 if (SaveWindowPos == TRUE){
1376 this->SetSize(preferences.GetMainWindowData());
1380 treAccounts->DeleteAllItems();
1382 wxTreeItemId RootNode = treAccounts->AddRoot(wxT("Root Item"), AccountNoneID);
1384 // Stop all account timers and remove the accounts.
1386 for (std::map<wxString, wxAccountSyncTimer*>::iterator iter = AccountSyncTimers.begin();
1387 iter != AccountSyncTimers.end(); iter++){
1389 wxAccountSyncTimer *AccTmrPtr = iter->second;
1397 AccountSyncTimers.clear();
1400 for (int i = (preferences.accounts.GetCount() - 1); i > 0; --i){
1401 treAccounts->AppendItem(RootNode, preferences.accounts.GetAccountName(i));
1406 wxString AccDirFull;
1407 wxString AccDirFullSfx;
1409 wxString AccDirFinal;
1410 AccountAccDirList.clear();
1411 AccountGroupList.clear();
1412 AccountGroupFilename.clear();
1413 AccountGroupTreeId.clear();
1414 wxTreeItemId AccountTreeId;
1415 wxTreeItemId GroupTreeId;
1418 for (int i = 0; i < preferences.accounts.GetCount(); i++){
1420 if ((preferences.accounts.GetAccountType(i) == wxT("Local") ||
1421 preferences.accounts.GetAccountType(i) == wxT("local")) && HideLocalABs == TRUE){
1427 if (preferences.accounts.GetAccountDirectory(i).IsEmpty()){
1433 AccDir = preferences.accounts.GetAccountDirectory(i);
1434 AccDirFull = preferences.accounts.GetAccountDirectory(i);
1436 AccDirFull.Append(wxT("."));
1437 AccDirFullSfx.Append(preferences.accounts.GetAccountType(i));
1438 AccDirFullSfx.LowerCase();
1439 AccDirFullSfx.Trim();
1440 AccDirFull.Append(AccDirFullSfx);
1441 AccName = preferences.accounts.GetAccountName(i);
1443 AccountAccDirList.insert(std::make_pair(i, AccDirFull));
1445 if (preferences.accounts.GetAccountType(i) == wxT("CardDAV") ||
1446 preferences.accounts.GetAccountType(i) == wxT("carddav")){
1448 // Check if the directory exists before doing anything.
1452 // Add a new timer using the existing account details.
1454 wxAccountSyncTimer *ActTmrPtr = new wxAccountSyncTimer;
1456 ActTmrPtr->SetupData(AccDirFull, AccName);
1457 ActTmrPtr->SetupPointers(this, ActMgrPtr, ETagProcTimer.GetPointer(AccDirFull));
1458 ActTmrPtr->Start((int)(preferences.accounts.GetAccountRefresh(i) * 1000));
1459 ActTmrPtr->SetOwner(this);
1460 ActTmrPtr->Notify();
1462 // Add the timer to the list of timers.
1464 AccountSyncTimers.insert(std::make_pair(AccDirFull, ActTmrPtr));
1466 AccountTreeId = treAccounts->AppendItem(RootNode, preferences.accounts.GetAccountName(i), AccountNetID, -1);
1470 AccountTreeId = treAccounts->AppendItem(RootNode, preferences.accounts.GetAccountName(i), AccountID, -1);
1474 // Go through the account directory and find contact files with
1475 // 'KIND:group' set and add them to the list of groups for the account.
1477 AccDirFinal = GetAccountDir(AccDirFull, FALSE);
1479 wxDir vcardaccdir(AccDirFinal);
1481 wxString vCardFilename;
1482 wxString vCardDataString;
1483 wxString vCardFilenameFull;
1484 //bool ProcFiles = FALSE;
1486 bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES);
1489 if (vCardFilename.Right(4) == wxT(".vcf") ||
1490 vCardFilename.Right(4) == wxT(".VCF") ||
1491 vCardFilename.Right(5) == wxT(".vcard") ||
1492 vCardFilename.Right(5) == wxT(".VCARD")){
1496 vCardFilenameFull.Append(AccDirFinal);
1497 vCardFilenameFull.Append(wxT("/"));
1498 vCardFilenameFull.Append(vCardFilename);
1500 Person.LoadFile(vCardFilenameFull);
1502 if (Person.MeetBaseSpecification()){
1504 vCardDataString = Person.Get(wxT("KIND"));
1506 if (vCardDataString == wxT("group")){
1508 // The vCard kind is a group. Add to the account's group list.
1510 GroupTreeId = treAccounts->AppendItem(AccountTreeId, Person.Get(wxT("FN")), AccountGrpID, -1);
1511 treAccounts->SetItemHasChildren(AccountTreeId, TRUE);
1512 AccountGroupList.insert(std::make_pair(intGroupID, i));
1513 AccountGroupFilename.insert(std::make_pair(intGroupID, vCardFilenameFull));
1514 AccountGroupTreeId.insert(std::make_pair(GroupTreeId, intGroupID));
1526 vCardFilename.Clear();
1527 vCardFilenameFull.Clear();
1528 vCardDataString.Clear();
1529 ProcFiles = vcardaccdir.GetNext(&vCardFilename);
1533 // Clearup for next account.
1537 AccDirFullSfx.clear();
1538 AccDirFinal.clear();
1543 // Load the account settings as they are needed for connecting
1546 prefaccounts = preferences.accounts;
1550 void frmMain::ConflictResolution(wxCommandEvent& event){
1552 frmConflictResolution *frameCR = new frmConflictResolution ( this );
1553 vCardConflictObj *vCardConfObj = (vCardConflictObj*)event.GetClientData();
1554 vCard *ClientDataPtr = vCardConfObj->vCardLocalData;
1555 vCard *ServerDataPtr = vCardConfObj->vCardServerData;
1556 //vCard *ServerDataPtr = vCardConfObj->vCardServerData;
1557 //wxString Moo = ClientDataPtr->WriteString();
1558 //vCard *ServerDataPtr = vCardConfObj->vCardServerData;
1559 frameCR->LoadData(ClientDataPtr, ServerDataPtr, &MemoryFileList);
1560 //frameCR->LoadData(vCardConfObj->vCardLocalData, vCardConfObj->vCardServerData, &MemoryFileList);
1561 frameCR->ShowModal();
1563 int FinalConflictResult = frameCR->GetResult();
1565 wxCommandEvent event2(ACTMGR_RESUMEPROC);
1566 event2.SetClientData(vCardConfObj->QRNotifData);
1567 event2.SetInt(FinalConflictResult);
1572 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
1573 wxPostEvent(frameActMgr, event2);
1577 void frmMain::UpdateContactList(wxCommandEvent& event){
1579 UCNotif *ucd = (UCNotif*)event.GetClientData();
1581 // Check if the active account is being displayed in the
1582 // main window. If not, skip and delete the data.
1584 long longSelected = -1;
1585 int intSelectedData = 0;
1587 if (ActiveAccount == ucd->ContactAccount){
1589 // Look at the list of contacts and if it matches the
1590 // filename then update the name.
1594 longSelected = lstContacts->GetNextItem(longSelected,
1596 wxLIST_STATE_DONTCARE);
1598 if (longSelected == -1){
1604 intSelectedData = (int)lstContacts->GetItemData(longSelected);
1606 if (ucd->ContactFilename == ContactsFileIndex[intSelectedData]){
1608 // Work out which sorting mode we are in.
1612 // First Name, Last Name.
1614 lstContacts->SetItem(longSelected, 0, ucd->ContactNameArray.Forename + wxT(" ") + ucd->ContactNameArray.Surname);
1616 } else if (SortMode == 2){
1618 // Last Name, First Name.
1620 lstContacts->SetItem(longSelected, 0, ucd->ContactNameArray.Surname + wxT(", ") + ucd->ContactNameArray.Forename);
1622 } else if (SortMode == 3){
1626 lstContacts->SetItem(longSelected, 0, ucd->ContactNickname);
1628 } else if (SortMode == 4){
1632 lstContacts->SetItem(longSelected, 0, ucd->ContactName);
1639 // If the filename is the one loaded into the
1640 // browser control, then update this too.
1642 if (ActiveFilename == ContactsFileIndex[intSelectedData]){
1644 wxListEvent nullevent;
1645 ShowContactInfo(nullevent);
1653 for (std::map<int, void*>::iterator WindowIter = WindowListPointers.begin();
1654 WindowIter != WindowListPointers.end(); WindowIter++){
1656 if (WindowListType[WindowIter->first] != 0){
1662 frmContact *frmContactPtr = static_cast<frmContact*>(WindowIter->second);
1664 if (frmContactPtr->GetFilename() == ucd->ContactFilename){
1666 vCard UpdatedPerson;
1667 UpdatedPerson.LoadFile(ucd->ContactFilename);
1668 frmContactPtr->SetupContactData(&UpdatedPerson);
1674 // Send message to search window controller subroutine and
1675 // pass that notification onto the search windows.
1677 // Setup the new pointer to use the existing UCNotif without
1680 UCNotif *ucd2 = ucd;
1682 wxCommandEvent sup(SE_UPDATECONTACTNOTIF);
1683 sup.SetClientData(ucd2);
1684 wxPostEvent(this, sup);
1686 // Clear up the unused pointer.
1692 void frmMain::UpdateAccountList(wxCommandEvent& event){
1696 void frmMain::SetupPointers(void *ActMgrPtrInc){
1698 ActMgrPtr = ActMgrPtrInc;
1702 void frmMain::SetupForm(){
1704 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
1705 frameActMgr->SetupPointers(&ETagProcTimer, this);
1707 // Setup the contact information icons for later.
1709 wxFileSystem::AddHandler(new wxMemoryFSHandler);
1713 wxMemoryInputStream ciptostream(icons_cipto_png, sizeof(icons_cipto_png));
1714 ciicon_png.LoadFile(ciptostream, wxBITMAP_TYPE_PNG);
1715 wxMemoryFSHandler::AddFile(wxT("cipto.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1717 wxMemoryInputStream cilogstream(icons_cilog_png, sizeof(icons_cilog_png));
1718 ciicon_png.LoadFile(cilogstream, wxBITMAP_TYPE_PNG);
1719 wxMemoryFSHandler::AddFile(wxT("cilog.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1721 wxMemoryInputStream cisndstream(icons_cisnd_png, sizeof(icons_cisnd_png));
1722 ciicon_png.LoadFile(cisndstream, wxBITMAP_TYPE_PNG);
1723 wxMemoryFSHandler::AddFile(wxT("cisnd.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1725 wxMemoryInputStream cikeystream(icons_cikey_png, sizeof(icons_cikey_png));
1726 ciicon_png.LoadFile(cikeystream, wxBITMAP_TYPE_PNG);
1727 wxMemoryFSHandler::AddFile(wxT("cikey.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1729 wxMemoryInputStream civenstream(icons_civen_png, sizeof(icons_civen_png));
1730 ciicon_png.LoadFile(civenstream, wxBITMAP_TYPE_PNG);
1731 wxMemoryFSHandler::AddFile(wxT("civen.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1733 wxMemoryInputStream ciextstream(icons_ciext_png, sizeof(icons_ciext_png));
1734 ciicon_png.LoadFile(ciextstream, wxBITMAP_TYPE_PNG);
1735 wxMemoryFSHandler::AddFile(wxT("ciext.png"), ciicon_png, wxBITMAP_TYPE_PNG);
1741 void frmMain::UpdateSearchContactLists(wxCommandEvent& event){
1743 // Go through each of the search windows and
1744 // send the required notification to update the
1745 // contact information.
1747 // Get the event notification data.
1749 UCNotif *ucd = (UCNotif*)event.GetClientData();
1751 // Process each search window giving the new details.
1753 for (std::map<void*,wxString>::iterator switer = SearchWindowList.begin();
1754 switer != SearchWindowList.end(); switer++){
1756 // Duplicate the event notification data.
1758 UCNotif *ucd2 = new UCNotif;
1760 ucd2->ContactAccount = ucd->ContactAccount;
1761 ucd2->ContactFilename = ucd->ContactFilename;
1762 ucd2->ContactName = ucd->ContactName;
1763 ucd2->ContactNickname = ucd->ContactNickname;
1764 ucd2->ContactNameArray = ucd->ContactNameArray;
1766 // Pass the data to the search window for processing.
1768 frmSearch *frameSCH = static_cast<frmSearch*>(switer->first);
1769 wxCommandEvent schupdate(SE_UPDATERESULT);
1770 schupdate.SetClientData(ucd2);
1771 wxPostEvent(frameSCH, schupdate);
1773 // Clear up the pointer prior to variable deletion.
1784 void frmMain::OpenFindContactsWindow(wxCommandEvent& event){
1788 frmSearch *frameSCH = new frmSearch ( this );
1789 frameSCH->SetUID(WindowMenuItemID);
1790 frameSCH->Show(true);
1792 WindowData *WData = new WindowData;
1794 WData->DataType = 2;
1795 WData->WindowPointer = (void*)frameSCH;
1796 WData->WindowID = WindowMenuItemID;
1798 wxCommandEvent addevent(WINDOW_ADD);
1799 addevent.SetClientData(WData);
1800 wxPostEvent(this, addevent);
1802 // Add pointer to the list of open search windows.
1804 SearchWindowList.insert(std::make_pair(frameSCH, wxT("Search")));
1810 void frmMain::RemoveContactsWindowPointer(wxCommandEvent& event){
1812 //frmSearch *frameSCH = static_cast<frmSearch*>(ActMgrPtr);
1813 void *frameSCH = (void*)event.GetClientData();
1815 SearchWindowList.erase(frameSCH);
1821 void frmMain::RemoveContactEditorWindowPointer(wxCommandEvent& event){
1823 void *frameSCH = (void*)event.GetClientData();
1825 SearchWindowList.erase(frameSCH);
1831 void frmMain::UpdateWindowList(wxCommandEvent& event){
1833 // Update the Window List.
1835 // Delete the existing items in the window menu.
1837 // Get the list of contacts.
1839 // Insert a separator.
1841 // Get the list of search windows.
1845 void frmMain::RevealContact(wxCommandEvent& event){
1847 UCNotif *uc = (UCNotif*)event.GetClientData();
1849 // Switch the account to the one passed.
1851 wxTreeItemIdValue cookie;
1852 wxTreeItemId next = treAccounts->GetRootItem();
1853 wxTreeItemId nextChild;
1855 for (int i = 0; i < prefaccounts.GetCount(); i++){
1858 nextChild = treAccounts->GetFirstChild(next, cookie);
1860 nextChild = treAccounts->GetNextSibling(nextChild);
1863 //AccountName = treAccounts->GetItemText(nextChild);
1865 if (uc->ContactAccount == AccountAccDirList[i]){
1868 treAccounts->SelectItem(nextChild, TRUE);
1869 AccCtrl->SetText(treAccounts->GetItemText(nextChild));
1875 // Switch the contact to the one passed.
1877 long longSelected = -1;
1878 int intSelectedData = 0;
1882 longSelected = lstContacts->GetNextItem(longSelected,
1884 wxLIST_STATE_DONTCARE);
1886 if (longSelected == -1){
1892 intSelectedData = (int)lstContacts->GetItemData(longSelected);
1894 // Compare the filename with the one received.
1895 // If they match then select it.
1897 if (ContactsFileIndex[intSelectedData] == uc->ContactFilename){
1901 lstContacts->SetItemState(longSelected, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
1902 lstContacts->EnsureVisible(longSelected);
1906 lstContacts->SetItemState(longSelected, 0, wxLIST_STATE_SELECTED);
1914 void frmMain::DeleteContact(wxCommandEvent& event){
1916 // Check if a contact is selected.
1918 long intSelected = -1;
1919 long intContactSeekNum = -1;
1920 wxString wxSContactName;
1922 intSelected = lstContacts->GetNextItem(intSelected,
1924 wxLIST_STATE_SELECTED);
1926 if (intSelected == -1){
1930 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
1932 // Get the item data of the contact.
1934 intContactSeekNum = lstContacts->GetItemData(intSelected);
1936 // Get the name of the contact.
1938 wxSContactName = lstContacts->GetItemText(intSelected);
1940 // Display a message confirming if the contact should
1943 int QuestionResponse;
1945 QuestionResponse = wxMessageBox(_("Are you sure you want to delete this contact?"), _("Delete contact"), wxYES_NO, this);
1947 if (QuestionResponse == wxNO){
1949 // Exit the subroutine
1955 // Delete the contact.
1957 if (!wxRemoveFile(ContactsFileIndex[intContactSeekNum])){
1959 wxMessageBox(_("Unable to delete the contact."), _("Cannot delete contact"), wxOK, this);
1964 // Remove the contact from the list.
1966 lstContacts->DeleteItem(intSelected);
1968 // Update the search windows, removing the deleted
1971 UCNotif *ucd = new UCNotif;
1973 ucd->ContactAccount = ActiveAccount;
1974 ucd->ContactFilename = ContactsFileIndex[intContactSeekNum];
1976 for (std::map<void*,wxString>::iterator switer = SearchWindowList.begin();
1977 switer != SearchWindowList.end(); switer++){
1979 // Duplicate the event notification data.
1981 UCNotif *ucd2 = new UCNotif;
1983 ucd2->ContactAccount = ucd->ContactAccount;
1984 ucd2->ContactFilename = ucd->ContactFilename;
1986 // Pass the data to the search window for processing.
1988 frmSearch *frameSCH = static_cast<frmSearch*>(switer->first);
1989 wxCommandEvent schdelete(SE_DELETERESULT);
1990 schdelete.SetClientData(ucd2);
1991 wxPostEvent(frameSCH, schdelete);
1993 // Clear up the pointer prior to variable deletion.
2000 // Clear the wxHTMLWindow.
2002 wxString EmptyPage = wxT("");
2004 htmContactData->SetPage(EmptyPage);
2006 wxStringTokenizer wSTFilename(ContactsFileIndex[intContactSeekNum], wxT("/"));
2008 wxString wxSplitFilename;
2009 wxString wxSDataURL;
2011 while(wSTFilename.HasMoreTokens()){
2013 wxSplitFilename = wSTFilename.GetNextToken();
2017 if (ActiveAccountType == wxT("CardDAV") || ActiveAccountType == wxT("carddav")){
2019 // Update the ETagDB and mark it as deleted.
2021 ETagDB *ETagDBPtr = ETagProcTimer.GetPointer(ActiveAccount);
2023 ETagDBPtr->UpdateETag(wxSplitFilename, wxT("DELETED"));
2025 // Get the Data URL.
2027 wxTreeItemIdValue cookie;
2028 wxTreeItemId next = treAccounts->GetRootItem();
2030 wxTreeItemId selectedChild = treAccounts->GetSelection();
2031 wxTreeItemId nextChild;
2033 for (int i = 0; i < prefaccounts.GetCount(); i++){
2036 nextChild = treAccounts->GetFirstChild(next, cookie);
2039 nextChild = treAccounts->GetNextSibling(nextChild);
2042 if (nextChild == selectedChild){
2043 wxSDataURL = prefaccounts.GetAccountDirPrefix(i) + wxT("/") + wxSplitFilename;
2049 // Add task to the activity monitor to delete the contact.
2051 frameActMgr->AddTask(2, wxSContactName, ActiveAccount, wxSDataURL, wxSplitFilename, ContactsFileIndex[intContactSeekNum], wxT(""));
2055 // Clear the variable. Don't delete as it will mess things up.
2057 ContactsFileIndex[intContactSeekNum] = wxT("");
2064 void frmMain::EmptyServerDialog(wxCommandEvent& event){
2066 QRNotif *qrn = (QRNotif *)event.GetClientData();
2068 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);
2070 if (QResponse == wxNO){
2076 wxCommandEvent event2(ACTMGR_RESUMEPROC);
2077 event2.SetInt(*qrn->QResponse);
2078 event2.SetClientData(qrn->PausePtr);
2080 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
2082 wxPostEvent(frameActMgr, event2);
2086 void frmMain::DeleteContactSync(wxString &Account, wxString &Filename){
2088 // Remove the contact from the window after syncronising.
2090 // Check which account is currently active in the window.
2091 // If it is different from the one passed to this subroutine then
2092 // exit from the subroutine.
2094 if (Account != ActiveAccount){
2098 long longSelected = -1;
2099 int intSelectedData = 0;
2103 longSelected = lstContacts->GetNextItem(longSelected,
2105 wxLIST_STATE_DONTCARE);
2107 if (longSelected == -1){
2113 intSelectedData = (int)lstContacts->GetItemData(longSelected);
2115 // Compare the filename with the one received.
2116 // If they match then select it.
2118 if (ContactsFileIndex[intSelectedData] == Filename){
2120 // Remove the contact from the window.
2122 lstContacts->DeleteItem(intSelectedData);
2124 // Check if contact is the selected contact in the HTML window and
2125 // if it is then clear the window.
2127 if (ActiveFilename == Filename){
2129 wxString EmptyPage = wxT("");
2130 htmContactData->SetPage(EmptyPage);
2144 void frmMain::SortFNLN( wxCommandEvent& event ) {
2146 wxTreeEvent NullEvent;
2148 LoadContactList(NullEvent);
2152 void frmMain::SortLNFN( wxCommandEvent& event ) {
2154 wxTreeEvent NullEvent;
2156 LoadContactList(NullEvent);
2160 void frmMain::SortNickname( wxCommandEvent& event ) {
2162 wxTreeEvent NullEvent;
2164 LoadContactList(NullEvent);
2168 void frmMain::SortDisplayAs( wxCommandEvent& event ) {
2170 wxTreeEvent NullEvent;
2172 LoadContactList(NullEvent);
2176 void frmMain::SortAscending( wxCommandEvent& event ) {
2178 wxTreeEvent NullEvent;
2179 AscendingMode = TRUE;
2180 LoadContactList(NullEvent);
2184 void frmMain::SortDescending( wxCommandEvent& event ) {
2186 wxTreeEvent NullEvent;
2187 AscendingMode = FALSE;
2188 LoadContactList(NullEvent);
2192 void frmMain::ToggleStatusBar( wxCommandEvent& event ) {
2194 if (stbBottom->IsShown() == TRUE){
2208 void frmMain::ActivityIconStart( wxCommandEvent& event ){
2210 // Display the activity icon.
2212 imgActivityStatus->SetBitmap(*imgActIcon1);
2213 ActivityIconStatus = 0;
2217 void frmMain::ActivityIconShuffle( wxCommandEvent& event ){
2219 switch (ActivityIconStatus){
2222 imgActivityStatus->SetBitmap(*imgActIcon1);
2223 ActivityIconStatus = 1;
2226 imgActivityStatus->SetBitmap(*imgActIcon2);
2227 ActivityIconStatus = 2;
2230 imgActivityStatus->SetBitmap(*imgActIcon3);
2231 ActivityIconStatus = 3;
2234 imgActivityStatus->SetBitmap(*imgActIcon4);
2235 ActivityIconStatus = 0;
2238 ActivityIconStatus = 0;
2244 void frmMain::ActivityIconStop( wxCommandEvent& event ){
2246 // Display the sleep icon.
2248 imgActivityStatus->SetBitmap(*imgActIconSleep);
2252 void frmMain::UpdateSBIconPlacement( wxSizeEvent& event ){
2254 if (imgConnStatus == 0 || imgSSLStatus == 0 || imgActivityStatus == 0){
2262 wxRect rectActivity;
2263 stbBottom->GetFieldRect(1, rectOnline);
2264 stbBottom->GetFieldRect(2, rectSSL);
2265 stbBottom->GetFieldRect(3, rectActivity);
2267 imgConnStatus->Move(rectOnline.GetX(),rectOnline.GetY());
2268 imgSSLStatus->Move(rectSSL.GetX(),rectSSL.GetY());
2269 imgActivityStatus->Move(rectActivity.GetX(),rectActivity.GetY());
2273 XABViewMode frmMain::GetViewMode(){
2277 xvm.SortMode = SortMode;
2278 xvm.AscendingMode = AscendingMode;
2284 void frmMain::WindowAdd( wxCommandEvent &event ){
2286 WindowData *WData = (WindowData*)event.GetClientData();
2290 if (WData->DataType == 0){
2294 int intID = mnuContactWindows->GetId();
2296 mnuWindow->FindChildItem(intID, &pos);
2297 wxMenuItem *mnuNewItem = new wxMenuItem(NULL, WData->WindowID, wxT("Contact Window #") + wxString::Format(wxT("%i"), WData->WindowID), wxEmptyString, wxITEM_NORMAL, NULL);
2298 mnuNewItem->SetId(WData->WindowID);
2299 WindowListPointersMenu.insert(std::make_pair(WData->WindowID, mnuNewItem));
2300 WindowListPointers.insert(std::make_pair(WData->WindowID, WData->WindowPointer));
2301 WindowListType.insert(std::make_pair(WData->WindowID, 0));
2302 mnuWindow->Insert((pos + 1), mnuNewItem);
2303 this->Connect(mnuNewItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(frmMain::ShowContactWindow));
2305 } else if (WData->DataType == 1){
2307 // Contact Editor Window
2309 int intID = mnuContactEditorWindows->GetId();
2311 mnuWindow->FindChildItem(intID, &pos);
2312 wxMenuItem *mnuNewItem = new wxMenuItem(NULL, WData->WindowID, wxT("Contact Editor Window #") + wxString::Format(wxT("%i"), WData->WindowID), wxEmptyString, wxITEM_NORMAL, NULL);
2313 mnuNewItem->SetId(WData->WindowID);
2314 WindowListPointersMenu.insert(std::make_pair(WData->WindowID, mnuNewItem));
2315 WindowListPointers.insert(std::make_pair(WData->WindowID, WData->WindowPointer));
2316 WindowListType.insert(std::make_pair(WData->WindowID, 1));
2317 mnuWindow->Insert((pos + 1), mnuNewItem);
2318 this->Connect(mnuNewItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(frmMain::ShowContactEditorWindow));
2320 } else if (WData->DataType == 2){
2324 int intID = mnuSearchWindows->GetId();
2326 mnuWindow->FindChildItem(intID, &pos);
2327 wxMenuItem *mnuNewItem = new wxMenuItem(NULL, WData->WindowID, wxT("Search Window #") + wxString::Format(wxT("%i"), WData->WindowID), wxEmptyString, wxITEM_NORMAL, NULL);
2328 mnuNewItem->SetId(WData->WindowID);
2329 WindowListPointersMenu.insert(std::make_pair(WData->WindowID, mnuNewItem));
2330 WindowListPointers.insert(std::make_pair(WData->WindowID, WData->WindowPointer));
2331 WindowListType.insert(std::make_pair(WData->WindowID, 2));
2332 mnuWindow->Insert((pos + 1), mnuNewItem);
2333 this->Connect(mnuNewItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(frmMain::ShowSearchWindow));
2342 void frmMain::WindowEdit( wxCommandEvent &event ){
2344 WindowData *WData = (WindowData*)event.GetClientData();
2346 if (WData->DataType == 0){
2348 // Get the window title and use that.
2350 frmContact *frmContactPtr = static_cast<frmContact*>(WData->WindowPointer);
2352 wxString WindowTitle = frmContactPtr->GetTitle();
2354 std::map<int, wxMenuItem*>::iterator MenuIter = WindowListPointersMenu.find(WData->WindowID);
2356 MenuIter->second->SetItemLabel(WindowTitle);
2358 //mnuWindow->FindChildItem(intID, &pos);
2359 //wxMenuItem *mnuNewItem = new wxMenuItem(NULL, WData->WindowID, WindowTitle, WData->WindowID), wxEmptyString, wxITEM_NORMAL, NULL);
2360 //mnuNewItem->SetId(WData->WindowID);
2361 //ContactWindowListPointersMenu.insert(std::make_pair(WData->WindowID, mnuNewItem));
2362 //ContactWindowListPointers.insert(std::make_pair(WData->WindowID, WData->WindowPointer));
2363 //mnuWindow->Insert((pos + 1), mnuNewItem);
2364 //this->Connect(mnuNewItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(frmMain::ShowContactWindow));
2366 } else if (WData->DataType == 1){
2368 // Get the window title and use that.
2370 frmContactEditor *frmCEPtr = static_cast<frmContactEditor*>(WData->WindowPointer);
2372 wxString WindowTitle = frmCEPtr->GetTitle();
2374 std::map<int, wxMenuItem*>::iterator MenuIter = WindowListPointersMenu.find(WData->WindowID);
2376 if (WindowTitle.IsEmpty()){
2378 MenuIter->second->SetItemLabel(_("Unnamed Contact"));
2382 MenuIter->second->SetItemLabel(WindowTitle);
2386 //mnuWindow->FindChildItem(intID, &pos);
2387 //wxMenuItem *mnuNewItem = new wxMenuItem(NULL, WData->WindowID, WindowTitle, WData->WindowID), wxEmptyString, wxITEM_NORMAL, NULL);
2388 //mnuNewItem->SetId(WData->WindowID);
2389 //ContactEditorWindowListPointersMenu.insert(std::make_pair(WData->WindowID, mnuNewItem));
2390 //ContactEditorWindowListPointers.insert(std::make_pair(WData->WindowID, WData->WindowPointer));
2391 //mnuWindow->Insert((pos + 1), mnuNewItem);
2392 //this->Connect(mnuNewItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(frmMain::ShowContactEditorWindow));
2401 void frmMain::WindowDelete( wxCommandEvent &event ){
2403 WindowData *WData = (WindowData*)event.GetClientData();
2405 std::map<int, wxMenuItem*>::iterator MenuIter = WindowListPointersMenu.find(WData->WindowID);
2407 mnuWindow->Remove(MenuIter->second);
2409 delete MenuIter->second;
2410 MenuIter->second = NULL;
2412 WindowListPointersMenu.erase(WData->WindowID);
2413 WindowListPointers.erase(WData->WindowID);
2414 WindowListType.erase(WData->WindowID);
2421 void frmMain::ShowContactWindow( wxCommandEvent &event ){
2423 std::map<int, void*>::iterator WindowIter = WindowListPointers.find(event.GetId());
2425 frmContact *frmContactPtr = static_cast<frmContact*>(WindowIter->second);
2427 frmContactPtr->Show();
2428 frmContactPtr->Raise();
2432 void frmMain::ShowContactEditorWindow( wxCommandEvent &event ){
2434 std::map<int, void*>::iterator WindowIter = WindowListPointers.find(event.GetId());
2436 frmContactEditor *frmCEPtr = static_cast<frmContactEditor*>(WindowIter->second);
2443 void frmMain::ShowSearchWindow( wxCommandEvent &event ){
2445 // Look through the Search Window List Pointers, grab the
2446 // window point and show the window.
2448 std::map<int, void*>::iterator WindowIter = WindowListPointers.find(event.GetId());
2450 frmSearch *frmSearchPtr = static_cast<frmSearch*>(WindowIter->second);
2452 frmSearchPtr->Show();
2453 frmSearchPtr->Raise();
2457 void frmMain::ToggleConnectionStatus( wxCommandEvent &event ){
2459 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
2460 wxCommandEvent toggconn(ACTMGR_TOGGLECONN);
2461 wxPostEvent(frameActMgr, toggconn);
2465 void frmMain::ShowSSLCertificates( wxCommandEvent &event ){
2467 // Check the account type before continuing.
2469 wxString SeekAccount;
2470 wxString AccTypeLower;
2473 std::map<int, SSLCertCollection>::iterator SSLColIter;
2475 for (int i = 0; i < prefaccounts.GetCount(); i++){
2477 SeekAccount.Append(prefaccounts.GetAccountDirectory(i));
2478 AccType.Append(prefaccounts.GetAccountType(i));
2479 AccountSSL = prefaccounts.GetAccountSSL(i);
2480 AccTypeLower = AccType.MakeLower();
2481 SeekAccount.Append(wxT("."));
2482 SeekAccount.Append(AccTypeLower);
2484 if (SeekAccount == ActiveAccount){
2486 if (AccTypeLower == wxT("local")){
2492 if (AccountSSL == false){
2498 SSLColIter = AccountSSLData.find(i);
2500 SSLCertCollection SSLCertInfo = SSLColIter->second;
2502 frmSSLCertificate *frameSSLCert = new frmSSLCertificate ( this );
2503 frameSSLCert->StartCertFrom(0);
2504 frameSSLCert->SetupCerts(SSLCertInfo);
2505 frameSSLCert->ShowModal();
2507 delete frameSSLCert;
2508 frameSSLCert = NULL;
2512 SeekAccount.Clear();
2513 AccTypeLower.Clear();
2520 void frmMain::ShowSSLInfo( wxCommandEvent &event ){
2522 // Check the account type before continuing.
2526 void frmMain::HideSSLInfo( wxCommandEvent &event ){
2528 // Check the account type before continuing.
2532 void frmMain::UpdateConnectionStatus( wxCommandEvent &event ){
2534 if (event.GetInt() == 0){
2536 imgConnStatus->SetBitmap(*imgOnline);
2540 imgConnStatus->SetBitmap(*imgOffline);
2546 void frmMain::SetupSSLStatus( int AccountID ){
2548 // Check if account ID given is
2549 // the active account and if not, do nothing.
2552 wxString AccTypeLower;
2554 AccType = prefaccounts.GetAccountType(AccountID);
2555 AccTypeLower = AccType.MakeLower();
2557 wxString AccountIDName = prefaccounts.GetAccountDirectory(AccountID) + wxT(".") +
2560 if (AccountIDName != ActiveAccount){
2566 // Check if the account has SSL enabled.
2568 bool SSLInUse = prefaccounts.GetAccountSSL(AccountID);
2570 if (SSLInUse == FALSE){
2572 SSLToolTip->SetTip(wxT("SSL is not enabled for this account"));
2573 imgSSLStatus->SetBitmap(*imgNoSSL);
2577 // Get the SSL Collection Data.
2579 std::map<int,int>::iterator SSLResultIter = AccountSSLResult.find(AccountID);
2581 if (SSLResultIter->second == 1){
2583 imgSSLStatus->SetBitmap(*imgSSLWarning);
2584 SSLToolTip->SetTip(wxT("Invalid certificate(s) received for '") +
2585 prefaccounts.GetAccountName(AccountID) +
2586 wxT("' (Connection denied by user)\n\nDouble click for more information."));
2589 } else if (SSLResultIter->second == 0){
2591 imgSSLStatus->SetBitmap(*imgSSL);
2592 SSLToolTip->SetTip(wxT("Account '") +
2593 prefaccounts.GetAccountName(AccountID) +
2594 wxT("' secured using SSL\n\nDouble click for more information."));
2602 void frmMain::InvalidSSLCertificate( wxCommandEvent &event ){
2604 frmInvalidSSLCertificate *frameISC = new frmInvalidSSLCertificate ( this );
2605 SSLInvalidCertNotifObj *SSLICNObj = (SSLInvalidCertNotifObj*)event.GetClientData();
2606 SSLCertCollection SSLCCData = SSLICNObj->CertCollection;
2607 wxString AccountName = SSLICNObj->AccountName;
2608 frameISC->LoadData(SSLCCData, AccountName);
2609 frameISC->ShowModal();
2611 int FinalConflictResult = frameISC->GetResult();
2613 wxCommandEvent event2(ACTMGR_RESUMEPROC);
2614 event2.SetClientData(SSLICNObj->QRNotifData);
2615 event2.SetInt(FinalConflictResult);
2620 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
2621 wxPostEvent(frameActMgr, event2);
2624 void frmMain::PauseAllTimers(){
2626 for (std::map<wxString, wxAccountSyncTimer*>::iterator ASTiter = AccountSyncTimers.begin();
2627 ASTiter != AccountSyncTimers.end(); ASTiter++){
2629 ASTiter->second->Stop();
2635 void frmMain::ResumeAllTimers(){
2637 for (std::map<wxString, wxAccountSyncTimer*>::iterator ASTiter = AccountSyncTimers.begin();
2638 ASTiter != AccountSyncTimers.end(); ASTiter++){
2640 ASTiter->second->Start();
2646 void frmMain::UpdateSSLAccountStatus(int AccountID, int SSLStatus, SSLCertCollection SSLCertInc){
2648 // Delete existing data.
2650 AccountSSLData.erase(AccountID);
2651 AccountSSLResult.erase(AccountID);
2655 AccountSSLData.insert(std::make_pair(AccountID, SSLCertInc));
2656 AccountSSLResult.insert(std::make_pair(AccountID, SSLStatus));
2660 void frmMain::CheckUpdates( wxCommandEvent& event ){
2662 frmUpdate *frameUpdate = new frmUpdate ( this );
2663 frameUpdate->FetchData();
2664 frameUpdate->ShowModal();
2668 void frmMain::OpenImportDialog( wxCommandEvent& event ){
2670 // Run the import contacts system.
2676 void frmMain::OpenExportDialog( wxCommandEvent& event ){
2678 // Check if an account and at least one contact is selected
2679 // before continuing.
2681 wxArrayString ArrData;
2683 if (ActiveAccount.IsEmpty()){
2689 int ContactSelected = 0;
2690 int ContactsCollected = 0;
2691 long longSelected = -1;
2695 longSelected = lstContacts->GetNextItem(longSelected,
2697 wxLIST_STATE_SELECTED);
2699 if (longSelected == -1){
2705 int FileID = (int)lstContacts->GetItemData(longSelected);
2707 ArrData.Insert(ContactsFileIndex[FileID],
2708 ContactsCollected, 1);
2714 if (ContactSelected == 0){
2720 // Run the export contacts system.
2722 ExportRun(this, &ArrData);
2726 void frmMain::GetListControl(wxListCtrl *lstContactsPtr,
2727 wxArrayString *ContactsFileIndexPtr){
2729 lstContactsPtr = lstContacts;
2730 ContactsFileIndexPtr = &ContactsFileIndex;
2734 void frmMain::GetSelectedList( wxCommandEvent& event ){
2736 // Get the array of contact filenames.
2738 wxArrayString *ArrData = (wxArrayString*)event.GetClientData();
2740 // Process them into an array of files.
2742 long longSelected = -1;
2743 int ContactsCollected = 0;
2744 wxString ContactFilename;
2748 longSelected = lstContacts->GetNextItem(longSelected,
2750 wxLIST_STATE_SELECTED);
2752 if (longSelected == -1){
2758 // Get the file information and add to the list.
2760 int FileID = (int)lstContacts->GetItemData(longSelected);
2762 ArrData->Insert(ContactsFileIndex[FileID],
2763 ContactsCollected, 1);
2765 ContactsCollected++;
2766 ContactFilename.Clear();
2774 void frmMain::SyncAccount( wxCommandEvent& event ){
2776 wxString AccNameInc = event.GetString();
2778 frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
2779 frameActMgr->AddTask(3, wxT(""), AccNameInc,
2780 wxT(""), wxT(""), wxT(""), wxT(""));
2784 void frmMain::ShowHelp( wxCommandEvent& event ){
2786 // Based on the operating system, work out where
2787 // the documentation should be.
2791 #if defined(__HAIKU__)
2793 #elif defined(__WIN32__)
2799 if (wxFileExists("/usr/share/doc/xestiaab/index.html")){
2801 wxLaunchDefaultBrowser(wxT("file:///usr/share/doc/xestiaab/index.html"));
2804 #if XSDAB_RELEASE == 0
2806 } else if (wxFileExists("/usr/local/share/doc/xestiaab/index.html")){
2808 wxLaunchDefaultBrowser(wxT("file:///usr/local/share/doc/xestiaab/index.html"));
2817 #if XSDAB_RELEASE == 0
2819 wxMessageBox(_("The help documentation is not available.\n\nYou can view the documentation that came with your source package."), _("Help documentation missing!"));
2823 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!"));
2829 void frmMain::ShowImportResults( wxCommandEvent &event ){
2831 std::map<int,wxString> *ResultData = (std::map<int,wxString>*)event.GetClientData();
2833 frmImportResults *frmIR = new frmImportResults(this);
2834 frmIR->LoadData(ResultData, event.GetInt(), (int)event.GetExtraLong());
2845 void frmMain::ReloadContactList( wxCommandEvent &event ){
2847 // Check if the account name given is the current
2848 // account selected.
2850 if (ActiveAccount == event.GetString()){
2852 wxTreeEvent NullEvent;
2853 LoadContactList(NullEvent);