Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
Win32: implement further UTF8 support
[xestiacalendar/.git] / source / forms / preferences / frmPreferences.cpp
1 // frmPreferences.cpp - frmPreferences form functions
2 //
3 // (c) 2016-2017 Xestia Software Development.
4 //
5 // This file is part of Xestia Calendar.
6 //
7 // Xestia Calendar 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.
10 //
11 // Xestia Calendar 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.
15 //
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Calendar. If not, see <http://www.gnu.org/licenses/>
19 #include "frmPreferences.h"
21 frmPreferences::frmPreferences( wxWindow* parent )
22 :
23 frmPreferencesADT( parent )
24 {
26         wxMemoryInputStream bstream(icons_acclocal_png, sizeof(icons_acclocal_png));
27         wxMemoryInputStream cstream(icons_accunsupported_png, sizeof(icons_accunsupported_png));
29         wxImage icons_acclocal_png(bstream, wxBITMAP_TYPE_PNG);
30         wxBitmap accNIcon(icons_acclocal_png, -1);
31         wxIcon wxIAccNIcon;
32         wxIAccNIcon.CopyFromBitmap(accNIcon);
33         
34         wxImage icons_accunsupported_png(cstream, wxBITMAP_TYPE_PNG);
35         wxBitmap accUIcon(icons_accunsupported_png, -1);
36         wxIcon wxIAccUIcon;
37         wxIAccUIcon.CopyFromBitmap(accUIcon);
38         
39         accountID = accImgList->Add(wxIAccNIcon);
40         accountUnsupportedID = accImgList->Add(wxIAccUIcon);
42         NbtPreferences->RemovePage(1);
43         btnAccountAdd->Show(false);
44         NbtPreferences->ChangeSelection(0);
45         
46 }
48 void frmPreferences::LoadPreferences( wxInitDialogEvent& event )
49 {
50         
51         // Setup the preferences filename string. Default is the
52         // *nix systems one (/home/$USER/.xestiacal/preferences)
53     
54         prefFilename = GetUserPrefDir();
56         preferences = new XCALPreferences(prefFilename);
57   
58         // Setup the General Tab.
59     
60         bool saveWindowPos = preferences->GetBoolData(wxT("SaveWindowPosition"));
61         bool hideLocalABs = preferences->GetBoolData(wxT("HideLocalCalendars"));
62     
63         if (saveWindowPos == TRUE){
64     
65                 chkSaveWindowPosition->SetValue(TRUE);
66     
67         }
68     
69         if (hideLocalABs == TRUE){
70     
71                 chkHideLocal->SetValue(TRUE);
72     
73         }
74     
75         // Setup the Themes tab.
77         wxListItem themecol0;
78     
79         themecol0.SetId(0);
80         themecol0.SetWidth(250);
81         themecol0.SetText(_("Theme"));
82         lstThemes->InsertColumn(0,themecol0);
83     
84         // Setup the Accounts tab.
85     
86         ReloadAccounts();
87         
88 }
90 frmPreferences::~frmPreferences(){
91         
92         // Destory the preferences window.
93         
94         delete accImgList;
95         accImgList = NULL;
96         
97 }
99 void frmPreferences::ReloadAccounts(){
101         // Reload the accounts in the accounts list.
102         
103         if (firstLoad == FALSE){
104                 delete preferences;
105                 preferences = NULL;
106                 preferences = new XCALPreferences(prefFilename);
107         } else {
108                 firstLoad = FALSE;
109         }
111         wxListItem accountscol0, accountscol1, accountscol2, accountscol3;
113         lstAccounts->ClearAll();
115         accountscol0.SetId(0);
116         accountscol0.SetWidth(24);
117         lstAccounts->InsertColumn(0,accountscol0);
118         lstAccounts->SetImageList(accImgList, wxIMAGE_LIST_SMALL);
120         accountscol1.SetId(1);
121         accountscol1.SetText(_("Name"));
122         accountscol1.SetWidth(224);    
123         lstAccounts->InsertColumn(1,accountscol1);   
125         accountscol2.SetId(2);
126         accountscol2.SetText(_("Type"));
127         accountscol2.SetWidth(96);
128         lstAccounts->InsertColumn(2,accountscol2);
129     
130         wxString accType;
131     
132         for (int i = 0; i < preferences->accounts.GetCount() ; i++){
134                 wxListItem col0;
135                 col0.SetId(i);
136                 
137                 /* if (preferences->accounts.GetAccountType(i) == wxT("CalDAV")){
138         
139                         col0.SetImage(AccountNetID);
140         
141                 } else  */
142                 
143                 if (preferences->accounts.GetAccountType(i) == wxT("Local")){
144         
145                         col0.SetImage(accountID);
146         
147                 } else {
149                         col0.SetImage(accountUnsupportedID);
150                         
151                 }
152         
153                 long itemindex = lstAccounts->InsertItem( col0 );
154         
155                 lstAccounts->SetItem(itemindex, 1, preferences->accounts.GetAccountName(i));
156                 lstAccounts->SetItem(itemindex, 2, preferences->accounts.GetAccountType(i));
157                 lstAccounts->SetItemData(itemindex, i);
158         
159         }
160     
163 void frmPreferences::DisableButtons( wxListEvent& event )
165         
166         // Disable the account buttons.
167         
168         btnAccountModify->Enable(FALSE);
169         btnAccountDelete->Enable(FALSE);
170         
173 void frmPreferences::EnableButtons( wxListEvent& event )
175         
176         // Enable the account buttons.
177         
178         btnAccountModify->Enable(TRUE);
179         btnAccountDelete->Enable(TRUE);
180         
183 void frmPreferences::AddAccount( wxCommandEvent& event )
185 // TODO: Implement AddABAccount
188 void frmPreferences::ModifyAccount( wxCommandEvent& event )
191         // Get the settings for the account, setup the form for
192         // editing the account and then display the window
193         // with the settings.
194     
195         long lstAccountsIndex = -1;
196         wxString accFilename = GetAccountsFile();
197         wxString accName;
198         wxString accType;
199     
200         wxFileConfig *cfgFile = new wxFileConfig("", "", accFilename);
201         
202         // Get the account name.
203     
204         lstAccountsIndex = lstAccounts->GetNextItem(lstAccountsIndex,
205                 wxLIST_NEXT_ALL,
206                 wxLIST_STATE_SELECTED);
207         
208         // Check that the account type is a supported account type.
209         
210         accType = preferences->accounts.GetAccountType((int)lstAccountsIndex);
211         
212         if (accType != "CardDAV" && accType != "carddav" &&
213                 accType != "Local" && accType != "local"){
214         
215                 wxMessageBox(_("Cannot modify the selected account settings as the account type is unsupported."), _("Unsupported account type"), wxICON_ERROR);
216                 return;
217                         
218         }
219     
220         accName = preferences->accounts.GetAccountName((int)lstAccountsIndex);
221     
222         frmEditAccount *frameEditAccount = new frmEditAccount ( this );
223         frameEditAccount->LoadPointers(cfgFile);
224         frameEditAccount->LoadSettings(accName);
225         frameEditAccount->ShowModal();
227         bool dialogResult = frameEditAccount->GetDialogResult();
229         delete frameEditAccount;
230         frameEditAccount = NULL;
231         delete cfgFile;
232         cfgFile = NULL;
234         if (dialogResult == false){
235                 return;
236         }
238         // Reload the account list in the preferences window.
240         ReloadAccounts();
241         *reloadAccountConfig = TRUE;
242         btnAccountModify->Enable(FALSE);
243         btnAccountDelete->Enable(FALSE);
244         
247 void frmPreferences::DeleteAccount( wxCommandEvent& event )
249         
250         // Display a confirmation dialog to confirm deletion.
251     
252         long lstAccountsIndex = -1;
253         wxMessageDialog dlgdel(this, wxT("Are you sure you want to delete this account?\r\n\r\nAll data that is stored locally will be removed."), wxT("Delete account"), wxYES_NO | wxICON_EXCLAMATION);
254     
255         if (dlgdel.ShowModal() == wxID_YES){
256                 
257                 // Remove the selected item from the accounts list
258                 // and mark in the accounts list as deleted (Don't write to
259                 // accounts file).
260         
261                 lstAccountsIndex = lstAccounts->GetNextItem(lstAccountsIndex,
262                         wxLIST_NEXT_ALL,
263                         wxLIST_STATE_SELECTED);
264         
265                 bool continueAcc = TRUE;
266                 wxString accountDir;
267                 wxString accountType;
268                 wxString accountDirFull;
269                 wxString accountDirDelFull;
270                 wxString accountName;
271                 wxString accName;
272                 long itemIndex = 0;
273         
274                 wxString accFilename = GetAccountsFile();
275     
276                 wxFileConfig *cfgFile = new wxFileConfig("", "", accFilename);
277         
278                 accName = preferences->accounts.GetAccountName((int)lstAccounts->GetItemData(lstAccountsIndex));
279         
280                 // Get the account directory name and account type..
281         
282                 continueAcc = cfgFile->GetFirstGroup(accountName, itemIndex);
283         
284                 while (continueAcc){
286                         if (accountName == accName){
288                                 cfgFile->SetPath(accountName);
289                         
290                                 cfgFile->Read("accountdir", &accountDir);
291                                 cfgFile->Read("type", &accountType);
292                 
293                                 break;
295                         }
296                 
297                         cfgFile->SetPath(wxT("/"));
298                         continueAcc = cfgFile->GetNextGroup(accountName, itemIndex);
299         
300                 }
301         
302                 accountDirFull.Append(accountDir);
303                 accountDirFull.Append(wxT("."));
304         
305                 /*if (AccountType == wxT("CalDAV")){
306         
307                         AccountDirFull.Append(wxT("local"));
308         
309                 } else */
310                 
311                 if (accountType == wxT("Local")){
312         
313                         accountDirFull.Append(wxT("Local"));
314         
315                 }/*else {
316                         
317                         AccountDirFull.Append(AccountType.Lower());
318                         
319                 }*/
320         
321                 lstAccounts->DeleteItem(lstAccountsIndex);
322         
323                 // Delete the directory that contains the account information.
324         
325                 if (!accountDirFull.IsEmpty()){
326         
327                         accountDirDelFull.Append(GetAccountDir(accountDirFull, false));
328         
329                         DeleteDirectory(accountDirDelFull);
330         
331                 }
332         
333                 // Delete the account from the configuration file.
334         
335                 cfgFile->SetPath(wxT("/"));
336                 cfgFile->DeleteGroup(accountName);
337                 cfgFile->Flush();
338         
339                 // Set flag for reloading accounts on window closure.
340     
341                 *reloadAccountConfig = TRUE;
342     
343         }
345         btnAccountModify->Enable(FALSE);
346         btnAccountDelete->Enable(FALSE);
347         
350 void frmPreferences::SavePreferences( wxCommandEvent& event )
353         // Load up the preferences file.
355         wxString setFilename = GetSettingsFile();
357         wxFileConfig *cfgFile = new wxFileConfig("", "", setFilename);
359         // Update the settings file.
360                 
361         cfgFile->DeleteEntry(wxT("SaveWindowPosition"));
362         cfgFile->DeleteEntry(wxT("WindowPositionX"));
363         cfgFile->DeleteEntry(wxT("WindowPositionY"));
364         cfgFile->DeleteEntry(wxT("WindowPositionHeight"));
365         cfgFile->DeleteEntry(wxT("WindowPositionWidth"));
366         
367         if (chkSaveWindowPosition->GetValue() == TRUE){
368         
369                 cfgFile->Write(wxT("SaveWindowPosition"), wxT("true"));
370         
371                 // Get parent window details.
372                 
373                 frmMain *frmMainPtr = (frmMain*)this->GetParent();
375                 // Get main window position data and save it.
376         
377                 wxRect frmMainPos = frmMainPtr->GetRect();
378         
379                 cfgFile->Write(wxT("WindowPositionX"), frmMainPos.GetX());
380                 cfgFile->Write(wxT("WindowPositionY"), frmMainPos.GetY());
381                 cfgFile->Write(wxT("WindowPositionHeight"), frmMainPos.GetHeight());
382                 cfgFile->Write(wxT("WindowPositionWidth"), frmMainPos.GetWidth());
384         } else {
385         
386                 cfgFile->Write(wxT("SaveWindowPosition"), wxT("false"));
387         
388         }
389         
390         cfgFile->DeleteEntry(wxT("HideLocalCalendars"));
391         
392         if (chkHideLocal->GetValue() == TRUE){
394                 cfgFile->Write(wxT("HideLocalCalendars"), wxT("true"));
395                 *reloadAccountConfig = TRUE;
396         
397         } else {
398         
399                 cfgFile->Write(wxT("HideLocalCalendars"), wxT("false"));
400                 *reloadAccountConfig = TRUE;
401         
402         }
404         delete cfgFile;
405         cfgFile = NULL;
407         this->Close();
408         
411 void frmPreferences::CloseWindow( wxCommandEvent& event )
413         
414         // Close the preferences window.
415         
416         this->Close();
417         
420 void frmPreferences::SetupPointers(bool *reloadAccountInc){
422         // Setup the pointers for the preferences form.
423         
424         reloadAccountConfig = reloadAccountInc;
428 void frmPreferences::DeleteDirectory(wxString directoryPath)
430         
431         // Open the directory and look for files and directories 
432         // to delete.
433         
434         wxDir directoryHandle(directoryPath);
435         
436         if (!directoryHandle.IsOpened())
437         {
438                 return;
439         }
440         
441         wxString directoryFilename;
442         
443         bool continueProcessing = directoryHandle.GetFirst(&directoryFilename, wxEmptyString, wxDIR_FILES|wxDIR_DIRS|wxDIR_HIDDEN);
444         while (continueProcessing)
445         {
446                 wxString directoryFilenameFull = directoryPath + "/" + directoryFilename;
447                 if (wxDir::Exists(directoryFilenameFull))
448                 {
449                         DeleteDirectory(directoryFilenameFull);
450                         continueProcessing = directoryHandle.GetNext(&directoryFilename);
451                         continue;
452                 }
453                 wxRemoveFile(directoryFilenameFull);
454                 continueProcessing = directoryHandle.GetNext(&directoryFilename);
455         }
456         directoryHandle.Close();
457         
458         wxRmDir(directoryPath); 
Xestia Software Development
Yn Maystri
© 2006 - 2019 Xestia Software Development
Software

Xestia Address Book
Xestia Calendar
Development

Xestia Gelforn
Everything else

About
News
Privacy Policy