Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
frmEventEditor: Don't setup new empty event if saving failed
[xestiacalendar/.git] / source / forms / eventeditor / frmEventEditor.cpp
1 // frmEventEditor.cpp - frmEventEditor 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 "frmEventEditor.h"
21 using namespace std;
23 frmEventEditor::frmEventEditor( wxWindow* parent )
24 :
25 frmEventEditorADT( parent )
26 {
28 }
30 void frmEventEditor::SetupForm(CalendarDataStorage *dataStorage, XCALPreferences *preferences){
31         
32         this->preferences = preferences;
33         this->dataStorage = dataStorage;
34         
35         // Go thorugh the accounts and get the list of calendars associated
36         // with the account and add them to the list of available calendars.
37         
38         CDSAccountList accountList = dataStorage->GetAccountList();
39         
40         for (std::vector<CDSGetAccountInfo>::iterator accountSeek = accountList.accountList.begin();
41                 accountSeek != accountList.accountList.end(); accountSeek++){
42                 
43                 CDSCalendarList calendarList = dataStorage->GetCalendarList((*accountSeek).accountID);
44         
45                 for (std::vector<int>::iterator calendarSeek = calendarList.calendarList.begin();
46                         calendarSeek != calendarList.calendarList.end(); calendarSeek++){
47         
48                         string combinedName = "";
49                         
50                         combinedName = (*accountSeek).accountName;
51                         combinedName += " : ";
52                                 
53                         CDSGetCalendarInfo calendarInfo = dataStorage->GetCalendar((*calendarSeek));
54                                 
55                         combinedName += calendarInfo.calendarName;
56                         cmbCalendar->Append((wxString)combinedName);
57                         calendarIDList.push_back(calendarInfo.calendarID);
58                                 
59                 }
60                 
61         }
62         
63         // Check the edit mode and get the event data.
64         
65         if (editMode == true){
66                 
67                 CDSGetCalendarEntryInfo eventInfo = dataStorage->GetEvent(eventID);
68                 
69                 // Set the calendar ID.
70                 
71                 calendarID = eventInfo.calendarID;
72                 
73                 // Set the calendar combination box to the name.
74                 
75                 string combinedName = dataStorage->GetCalendar(calendarID).accountName;
76                 combinedName += " : ";
77                 combinedName += dataStorage->GetCalendar(eventInfo.calendarID).calendarName;
78                 
79                 // Load the calendar info.
80                 
81                 cmbCalendar->SetSelection(cmbCalendar->FindString(combinedName));
82                 cmbCalendar->Show(false);
83                 lblCalendar->Show(false);
84                 
85                 szrDetails->Layout();
86                 szrList->Layout();      
87                 
88                 // Load the data into the form.
89                 
90                 txtEventName->SetValue(wxString(eventInfo.entryName));
91                 txtEventDescription->SetValue(wxString(eventInfo.entryDescription));
92                 
93                 // Load the start and end dates.
94                 
95                 wxDateTime startDate;
96                 startDate.Set(eventInfo.entryStartDay, (wxDateTime::Month)(eventInfo.entryStartMonth -1), eventInfo.entryStartYear, 0, 0, 0);
97                 dapStartDate->SetValue(startDate);
98                 
99                 wxDateTime endDate;
100                 endDate.Set(eventInfo.entryEndDay, (wxDateTime::Month)(eventInfo.entryEndMonth -1), eventInfo.entryEndYear, 0, 0, 0);
101                 dapEndDate->SetValue(endDate);
102                 
103                 // Load the start and end times.
104                 
105                 string startTime;
106                 string endTime;
107                 
108                 stringstream stringData;
109                 
110                 stringData << setw(2) << setfill('0') << eventInfo.entryStartHour;
111                 stringData << ":";
112                 stringData << setw(2) << setfill('0') << eventInfo.entryStartMinute;
113                 
114                 txtStartTime->SetValue((wxString)stringData.str());
115                 stringData.str("");
116                 
117                 stringData << setw(2) << setfill('0') << eventInfo.entryEndHour;
118                 stringData << ":";
119                 stringData << setw(2) << setfill('0') << eventInfo.entryEndMinute;              
120                 
121                 txtEndTime->SetValue((wxString)stringData.str());
122                 
123                 // Set the filename.
124                 
125                 eventFilePath = eventInfo.entryFilename;
126                 
127                 // Load the required data.
128                 
129                 eventData.LoadFile(eventFilePath);
130                 
131                 // TODO: Set the duration data.
133         } else {
134         
135                 // Setup the date and time with some default values (today's date and time).
137                 SetDefaultDateTime();
138                 
139         }
141         // Enable window updating and update window name.
143         UpdateWindowName();
144         enableUpdates = true;
145         
148 void frmEventEditor::SetEditMode(bool editMode){
149         
150         this->editMode = editMode;
151         
154 void frmEventEditor::SaveContact(wxCommandEvent &event){
155         
156         SaveContact();
157         
160 void frmEventEditor::SaveNewContact(wxCommandEvent &event){
161         
162         if (!SaveContact())
163         {
164                 return;
165         }
166         
167         // Reset the form for a new entry.
168         
169         cmbCalendar->SetSelection(-1);
171         editMode = false;
172         eventData.Clear();
173                 
174         SetDefaultDateTime();
175         
176         txtEventName->Clear();
177         txtEventDescription->Clear();
178         
179         cmbCalendar->Show(true);
180         lblCalendar->Show(true);
181         szrDetails->Layout();
182         szrList->Layout();
183         
186 bool frmEventEditor::SaveContact(){
188         // Verify that a calendar has been selected.
189         
190         if (cmbCalendar->GetSelection() == -1 && editMode == false){
191                 
192                 wxMessageBox("Please select a calendar for this entry.", "No calendar selected", wxOK);
193                 return false;
194                 
195         }
196         
197         // Do verification of entry name (shouldn't be blank).
198         
199         if (txtEventName->GetValue().IsEmpty()){
200                 
201                 wxMessageBox("The event name cannot be left empty.", "Event name is empty", wxOK);
202                 return false;
203                 
204         }
205         
206         // Do verification of start time.
207         
208         bool timeValid = false;
209         
210         // TODO: Do verification of end time.
211         
212         timeValid = false;
213         
214         // TODO: Do verification of duration.
215         
216         
217         
218         // TODO: Do verification that end date is later than
219         // the start date.
220         
221         
222         
223         bool durationValid = false;
224         
225         // Set the data into the calendar event object.
226                 
227         eventData.summaryData = txtEventName->GetValue().ToStdString();
228         eventData.descriptionList.push_back(txtEventDescription->GetValue().ToStdString());
229         eventData.descriptionListAltRep.push_back("");
230         eventData.descriptionListLanguage.push_back("");
231         eventData.descriptionListTokens.push_back("");
232                 
233         stringstream stringData;
234                 
235         stringData << setw(4) << setfill('0') << dapStartDate->GetValue().GetYear();
236         stringData << setw(2) << setfill('0') << (dapStartDate->GetValue().GetMonth() + 1);
237         stringData << setw(2) << setfill('0') << dapStartDate->GetValue().GetDay();
238         stringData << "T";
239         stringData << txtStartTime->GetValue().ToStdString().substr(0, 2).c_str();
240         stringData << txtStartTime->GetValue().ToStdString().substr(3, 2).c_str();
241         stringData << "00Z";
243         eventData.dateTimeStartData = stringData.str();
244         eventData.dateTimeStampData = stringData.str();
245                 
246         stringData.str("");
247                 
248         stringData << setw(4) << setfill('0') << dapEndDate->GetValue().GetYear();
249         stringData << setw(2) << setfill('0') << (dapEndDate->GetValue().GetMonth() + 1);
250         stringData << setw(2) << setfill('0') << dapEndDate->GetValue().GetDay();
251         stringData << "T";
252         stringData << txtEndTime->GetValue().ToStdString().substr(0, 2).c_str();
253         stringData << txtEndTime->GetValue().ToStdString().substr(3, 2).c_str();
254         stringData << "00Z";    
256         eventData.dateTimeEndData = stringData.str();
257         
258         // TODO: Implement Duration.
259         
260         if (editMode == false){
261                 
262                 // This is a new event so create a new UUID.
263                 
264                 string NewUUID = GenerateUUID();
265                 
266                 // Setup the calendar directory path.
267                 
268                 CDSGetCalendarInfo calendarInfo = dataStorage->GetCalendar(calendarIDList[cmbCalendar->GetSelection()]);
269                 CDSGetAccountInfo accountInfo = dataStorage->GetAccount(calendarInfo.accountName);
270                 
271                 string calendarDirectory = GetUserDir().ToStdString();
272                 calendarDirectory += "accounts";
273                 calendarDirectory += "/";
274                 calendarDirectory += preferences->accounts.GetAccountDirectory(accountInfo.accountPreferencesID).ToStdString();
275                 calendarDirectory += ".";
276                 calendarDirectory += preferences->accounts.GetAccountType(accountInfo.accountPreferencesID).ToStdString();
277                 calendarDirectory += "/";
278                 calendarDirectory += calendarInfo.calendarTextID;
279                 calendarDirectory += "/";
281                 string eventFile = calendarDirectory;
282                 eventFile += NewUUID;
283                 eventFile += ".ics";
285                 eventData.uniqueID = NewUUID;
287                 // Write the file.
289                 CalendarObjectSaveResult saveResult = eventData.SaveFile(eventFile);
290                 
291                 // Add the event to the calendar data storage.
292                 
293                 CDSAddEntryResult addEventResult = dataStorage->AddEvent(calendarIDList[cmbCalendar->GetSelection()], eventFile);
294                 
295                 // Post an event to show the new entry in
296                 // the main window.
297                 
298                 EventProperties *eventInfo = new EventProperties;
299                 eventInfo->eventName = txtEventName->GetValue().ToStdString();
300                 eventInfo->calendarID = calendarIDList[cmbCalendar->GetSelection()];
301                 eventInfo->eventID = addEventResult.calendarEntryID;
302                 eventInfo->eventYear = dapStartDate->GetValue().GetYear();
303                 eventInfo->eventMonth = dapStartDate->GetValue().GetMonth();
304                 eventInfo->eventDay = dapStartDate->GetValue().GetDay();
305                 eventInfo->eventHour = atoi(txtStartTime->GetValue().ToStdString().substr(0, 2).c_str());
306                 eventInfo->eventMinute = atoi(txtStartTime->GetValue().ToStdString().substr(3, 2).c_str());
307                 eventInfo->eventSecond = 0;
308                 
309                 wxCommandEvent addEvent(XCMAIN_ADDEVENT);
310                 addEvent.SetClientData(eventInfo);
311                 addEvent.SetId(ID_ADDENTRY);
312                 wxPostEvent(this->GetParent(), addEvent);
313                 
314                 eventFilePath = eventFile;
315                 editMode = true;
316                 calendarID = eventInfo->calendarID;
317                 
318                 eventID = addEventResult.calendarEntryID;
319                 
320                 // Hide the calendar selection controls.
321                 
322                 cmbCalendar->Show(false);
323                 lblCalendar->Show(false);
324                 
325                 szrDetails->Layout();
326                 szrList->Layout();
327                 
328         } else {
329                 
330                 // Setup the calendar directory path.
332                 CDSGetCalendarEntryInfo eventDataInfo = dataStorage->GetEvent(eventID);
333                 
334                 // Write the file.
335                 
336                 CalendarObjectSaveResult saveResult = eventData.SaveFile(eventFilePath);
337                 
338                 // Update the data in the calendar data storage.
339                 
340                 CDSEditEntryResult editEventResult = dataStorage->UpdateEvent(eventID, eventFilePath);
341                 
342                 // Post an event to update the new entry in
343                 // the main window.
344                 
345                 EventProperties *eventInfo = new EventProperties;
346                 eventInfo->eventName = txtEventName->GetValue().ToStdString();
347                 eventInfo->calendarID = calendarID;
348                 eventInfo->eventID = eventID;
349                 eventInfo->eventYear = dapStartDate->GetValue().GetYear();
350                 eventInfo->eventMonth = dapStartDate->GetValue().GetMonth();
351                 eventInfo->eventDay = dapStartDate->GetValue().GetDay();
352                 eventInfo->eventHour = atoi(txtStartTime->GetValue().ToStdString().substr(0, 2).c_str());
353                 eventInfo->eventMinute = atoi(txtStartTime->GetValue().ToStdString().substr(3, 2).c_str());
354                 eventInfo->eventSecond = 0;
355                 
356                 wxCommandEvent updateEvent(XCMAIN_UPDATEEVENT);
357                 updateEvent.SetClientData(eventInfo);
358                 updateEvent.SetId(ID_UPDATEENTRY);
359                 wxPostEvent(this->GetParent(), updateEvent);
360                 
361         }
362         
363         return true;
364         
367 void frmEventEditor::CloseWindow(wxCommandEvent &event)
369         
370         this->Close();
371         
374 void frmEventEditor::CloseWindow(wxCloseEvent &event)
377         WindowData *deleteWindowData = new WindowData;
378     
379         deleteWindowData->DataType = 1;
380         deleteWindowData->WindowPointer = (void*)this;
381         deleteWindowData->WindowID = windowID;
382         
383         // Delete the window from the window list.
384         
385         wxCommandEvent deleteEvent(XCMAIN_DELETEWINDOWINFO);
386         deleteEvent.SetId(ID_DELETEWINDOW);
387         deleteEvent.SetClientData(deleteWindowData);
388         wxPostEvent(this->GetParent(), deleteEvent);
389         
390         this->Destroy();
391         
394 bool frmEventEditor::ProcessEvent(wxEvent& event)
397         // Process the cut/copy/paste events.
399         // This section has been taken from the wxWidgets sample code of richtext.cpp
400         // so that simple Cut/Copy/Paste code can be made.
401     
402         // As this code comes from the samples of the wxWidgets library, this is licenced
403         // under the wxWindows Library Licence and is compatable with the LGPL and is
404         // compatable with Xestia Address Book's licence.
405     
406         if (event.IsCommandEvent() && !event.IsKindOf(CLASSINFO(wxChildFocusEvent))){
407                 // Problem: we can get infinite recursion because the events
408                 // climb back up to this frame, and repeat.
409                 // Assume that command events don't cause another command event
410                 // to be called, so we can rely on inCommand not being overwritten
411         
412                 static int s_eventType = 0;
413                 static wxWindowID s_id = 0;
414         
415                 if (s_id != event.GetId() && s_eventType != event.GetEventType()){
416                         
417                         s_eventType = event.GetEventType();
418                         s_id = event.GetId();
419             
420                         wxWindow* focusWin = wxFindFocusDescendant(this);
421                         if (focusWin && focusWin->GetEventHandler()->ProcessEvent(event)){
422                                 //s_command = NULL;
423                                 s_eventType = 0;
424                                 s_id = 0;
425                                 return true;
426                         }
427                         s_eventType = 0;
428                         s_id = 0;
429                         
430                 } else {
431                 
432                         return false;
433                         
434                 }
435         }
436     
437         return wxFrame::ProcessEvent(event);
438         
441 void frmEventEditor::CutText(wxCommandEvent &event){
442         
445 void frmEventEditor::CopyText(wxCommandEvent &event){
446         
449 void frmEventEditor::PasteText(wxCommandEvent &event){
450         
453 void frmEventEditor::SetEventID(int eventID){
454         
455         this->eventID = eventID;
456         
459 void frmEventEditor::SetDefaultDateTime(){
460         
461         wxDateTime DTNow = wxDateTime::Now();
462         
463         wxTimeSpan oneHour;
464         
465         string formattedTime = "";
466         
467         dapStartDate->SetValue(DTNow);
468         
469         if (DTNow.GetHour() < 10){
470                 formattedTime += "0";
471                 formattedTime += to_string(DTNow.GetHour());
472         } else {
473                 formattedTime += to_string(DTNow.GetHour());
474         }
475         
476         formattedTime += ":";
477         
478         if (DTNow.GetMinute() < 10){
479                 formattedTime += "0";
480                 formattedTime += to_string(DTNow.GetMinute());          
481         } else {
482                 formattedTime += to_string(DTNow.GetMinute());
483         }
484         
485         txtStartTime->SetValue((wxString)formattedTime);
486         
487         dapEndDate->SetValue(DTNow.Add(oneHour));
489         formattedTime.clear();
490         
491         if (DTNow.Add(oneHour.Hour()).GetHour() < 10){
492                 formattedTime += "0";
493                 formattedTime += to_string(DTNow.GetHour());
494         } else {
495                 formattedTime += to_string(DTNow.GetHour());
496         }
497         
498         formattedTime += ":";
499         
500         if (DTNow.GetMinute() < 10){
501                 formattedTime += "0";
502                 formattedTime += to_string(DTNow.GetMinute());
503         } else {
504                 formattedTime += to_string(DTNow.GetMinute());
505         }
506         
507         txtEndTime->SetValue((wxString)formattedTime);
508         
511 void frmEventEditor::SetWindowMenuItemID(int windowID)
513         
514         this->windowID = windowID;
515         
518 void frmEventEditor::ProcessCalendarControl(wxCommandEvent &event)
520         
521         UpdateWindowName();
522         
525 void frmEventEditor::ProcessEventName(wxCommandEvent &event)
527         
528         UpdateWindowName();
529         
532 void frmEventEditor::UpdateWindowName()
534         
535         // Generate the window title.
536         
537         string windowTitle;
538         
539         if (cmbCalendar->GetSelection() == -1)
540         {
541                 windowTitle += "(calendar not selected)";
542         }
543         else
544         {
545                 windowTitle += cmbCalendar->GetStringSelection().ToStdString();
546         }
547         
548         if (txtEventName->IsEmpty())
549         {
550                 windowTitle += " - ";
551                 windowTitle += "(unamed event)";
552         }
553         else
554         {
555                 windowTitle += " - ";
556                 windowTitle += txtEventName->GetValue().ToStdString();
557         }
558         
559         SetTitle(windowTitle);
561         // Check if post window title updating is enabled before
562         // going any further.
563         
564         if (enableUpdates == false)
565         {
566                 return;
567         }
568         
569         WindowData *updateWindowData = new WindowData;
571         updateWindowData->DataType = 1;
572         updateWindowData->WindowPointer = (void*)this;
573         updateWindowData->WindowID = windowID;
574         
575         // Delete the window from the window list.
576         
577         wxCommandEvent updateEvent(XCMAIN_UPDATEWINDOWINFO);
578         updateEvent.SetId(ID_UPDATEWINDOW);
579         updateEvent.SetClientData(updateWindowData);
580         wxPostEvent(this->GetParent(), updateEvent);
581         
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