Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
frmEventEditor: Added form for editing events
authorSteve Brokenshire <sbrokenshire@xestia.co.uk>
Wed, 11 Jan 2017 18:19:55 +0000 (18:19 +0000)
committerSteve Brokenshire <sbrokenshire@xestia.co.uk>
Wed, 11 Jan 2017 18:19:55 +0000 (18:19 +0000)
source/forms/eventeditor/frmEventEditor.cpp [new file with mode: 0644]
source/forms/eventeditor/frmEventEditor.h [new file with mode: 0644]

diff --git a/source/forms/eventeditor/frmEventEditor.cpp b/source/forms/eventeditor/frmEventEditor.cpp
new file mode 100644 (file)
index 0000000..1130c31
--- /dev/null
@@ -0,0 +1,449 @@
+#include "frmEventEditor.h"
+
+using namespace std;
+
+frmEventEditor::frmEventEditor( wxWindow* parent )
+:
+frmEventEditorADT( parent )
+{
+
+}
+
+void frmEventEditor::SetupForm(CalendarDataStorage *dataStorage, XCALPreferences *preferences){
+       
+       this->preferences = preferences;
+       this->dataStorage = dataStorage;
+       
+       // Go thorugh the accounts and get the list of calendars associated
+       // with the account and add them to the list of available calendars.
+       
+       CDSAccountList accountList = dataStorage->GetAccountList();
+       
+       for (std::vector<CDSGetAccountInfo>::iterator accountSeek = accountList.accountList.begin();
+               accountSeek != accountList.accountList.end(); accountSeek++){
+               
+               CDSCalendarList calendarList = dataStorage->GetCalendarList((*accountSeek).accountID);
+       
+               for (std::vector<int>::iterator calendarSeek = calendarList.calendarList.begin();
+                       calendarSeek != calendarList.calendarList.end(); calendarSeek++){
+       
+                       string combinedName = "";
+                       
+                       combinedName = (*accountSeek).accountName;
+                       combinedName += " : ";
+                               
+                       CDSGetCalendarInfo calendarInfo = dataStorage->GetCalendar((*calendarSeek));
+                               
+                       combinedName += calendarInfo.calendarName;
+                       cmbCalendar->Append((wxString)combinedName);
+                       calendarIDList.push_back(calendarInfo.calendarID);
+                               
+               }
+               
+       }
+       
+       // Check the edit mode and get the event data.
+       
+       if (editMode == true){
+               
+               CDSGetCalendarEntryInfo eventInfo = dataStorage->GetEvent(eventID);
+               
+               // Load the calendar info.
+               
+               cmbCalendar->Show(false);
+               lblCalendar->Show(false);
+               
+               szrDetails->Layout();
+               szrList->Layout();              
+               
+               // Load the data into the form.
+               
+               txtEventName->SetValue(wxString(eventInfo.entryName));
+               txtEventDescription->SetValue(wxString(eventInfo.entryDescription));
+               
+               // Load the start and end dates.
+               
+               wxDateTime startDate;
+               startDate.Set(eventInfo.entryStartDay, (wxDateTime::Month)(eventInfo.entryStartMonth -1), eventInfo.entryStartYear, 0, 0, 0);
+               dapStartDate->SetValue(startDate);
+               
+               wxDateTime endDate;
+               endDate.Set(eventInfo.entryEndDay, (wxDateTime::Month)(eventInfo.entryEndMonth -1), eventInfo.entryEndYear, 0, 0, 0);
+               dapEndDate->SetValue(endDate);
+               
+               // Load the start and end times.
+               
+               string startTime;
+               string endTime;
+               
+               stringstream stringData;
+               
+               stringData << setw(2) << setfill('0') << eventInfo.entryStartHour;
+               stringData << ":";
+               stringData << setw(2) << setfill('0') << eventInfo.entryStartMinute;
+               
+               txtStartTime->SetValue((wxString)stringData.str());
+               stringData.str("");
+               
+               stringData << setw(2) << setfill('0') << eventInfo.entryEndHour;
+               stringData << ":";
+               stringData << setw(2) << setfill('0') << eventInfo.entryEndMinute;              
+               
+               txtEndTime->SetValue((wxString)stringData.str());
+               
+               // Set the filename.
+               
+               eventFilePath = eventInfo.entryFilename;
+               
+               // Load the required data.
+               
+               eventData.LoadFile(eventFilePath);
+               
+               // TODO: Set the duration data.
+               
+               return;
+       }
+       
+       // Setup the date and time with some default values (today's date and time).
+       
+       SetDefaultDateTime();
+
+}
+
+void frmEventEditor::SetEditMode(bool editMode){
+       
+       this->editMode = editMode;
+       
+}
+
+void frmEventEditor::SaveContact(wxCommandEvent &event){
+       
+       SaveContact();
+       
+}
+
+void frmEventEditor::SaveNewContact(wxCommandEvent &event){
+       
+       SaveContact();
+       
+       // Reset the form for a new entry.
+       
+       cmbCalendar->SetSelection(-1);
+
+       editMode = false;
+       eventData.Clear();
+               
+       SetDefaultDateTime();
+       
+       txtEventName->Clear();
+       txtEventDescription->Clear();
+       
+       cmbCalendar->Show(true);
+       lblCalendar->Show(true);
+       szrDetails->Layout();
+       szrList->Layout();
+       
+
+       
+}
+
+void frmEventEditor::SaveContact(){
+
+       // Verify that a calendar has been selected.
+       
+       if (cmbCalendar->GetSelection() == -1 && editMode == false){
+               
+               wxMessageBox("Please select a calendar for this entry.", "No calendar selected", wxOK);
+               return;
+               
+       }
+       
+       // Do verification of entry name (shouldn't be blank).
+       
+       if (txtEventName->GetValue().IsEmpty()){
+               
+               wxMessageBox("The event name cannot be left empty.", "Event name is empty", wxOK);
+               return; 
+               
+       }
+       
+       // Do verification of start time.
+       
+       bool timeValid = false;
+       
+       // TODO: Do verification of end time.
+       
+       timeValid = false;
+       
+       // TODO: Do verification of duration.
+       
+       
+       
+       // TODO: Do verification that end date is later than
+       // the start date.
+       
+       
+       
+       bool durationValid = false;
+       
+       // Set the data into the calendar event object.
+               
+       eventData.SummaryData = txtEventName->GetValue().ToStdString();
+       eventData.DescriptionList.push_back(txtEventDescription->GetValue().ToStdString());
+       eventData.DescriptionListAltRep.push_back("");
+       eventData.DescriptionListLanguage.push_back("");
+       eventData.DescriptionListTokens.push_back("");
+               
+       stringstream stringData;
+               
+       stringData << setw(4) << setfill('0') << dapStartDate->GetValue().GetYear();
+       stringData << setw(2) << setfill('0') << (dapStartDate->GetValue().GetMonth() + 1);
+       stringData << setw(2) << setfill('0') << dapStartDate->GetValue().GetDay();
+       stringData << "T";
+       stringData << txtStartTime->GetValue().ToStdString().substr(0, 2).c_str();
+       stringData << txtStartTime->GetValue().ToStdString().substr(3, 2).c_str();
+       stringData << "00Z";
+
+       eventData.DateTimeStartData = stringData.str();
+       eventData.DateTimeStampData = stringData.str();
+               
+       stringData.str("");
+               
+       stringData << setw(4) << setfill('0') << dapEndDate->GetValue().GetYear();
+       stringData << setw(2) << setfill('0') << (dapEndDate->GetValue().GetMonth() + 1);
+       stringData << setw(2) << setfill('0') << dapEndDate->GetValue().GetDay();
+       stringData << "T";
+       stringData << txtEndTime->GetValue().ToStdString().substr(0, 2).c_str();
+       stringData << txtEndTime->GetValue().ToStdString().substr(3, 2).c_str();
+       stringData << "00Z";    
+
+       eventData.DateTimeEndData = stringData.str();
+       
+       // TODO: Implement Duration.
+       
+       if (editMode == false){
+               
+               // This is a new event so create a new UUID.
+               
+               string NewUUID = GenerateUUID();
+               
+               // Setup the calendar directory path.
+               
+               CDSGetCalendarInfo calendarInfo = dataStorage->GetCalendar(calendarIDList[cmbCalendar->GetSelection()]);
+               CDSGetAccountInfo accountInfo = dataStorage->GetAccount(calendarInfo.accountName);
+               
+               string calendarDirectory = GetUserDir().ToStdString();
+               calendarDirectory += "accounts";
+               calendarDirectory += "/";
+               calendarDirectory += preferences->accounts.GetAccountDirectory(accountInfo.accountPreferencesID).ToStdString();
+               calendarDirectory += ".";
+               calendarDirectory += preferences->accounts.GetAccountType(accountInfo.accountPreferencesID).ToStdString();
+               calendarDirectory += "/";
+               calendarDirectory += calendarInfo.calendarTextID;
+               calendarDirectory += "/";
+
+               string eventFile = calendarDirectory;
+               eventFile += NewUUID;
+               eventFile += ".ics";
+
+               eventData.UniqueID = NewUUID;
+
+               // Write the file.
+
+               CalendarObjectSaveResult saveResult = eventData.SaveFile(eventFile);
+               
+               // Add the event to the calendar data storage.
+               
+               CDSAddEntryResult addEventResult = dataStorage->AddEvent(calendarIDList[cmbCalendar->GetSelection()], eventFile);
+               
+               // Post an event to show the new entry in
+               // the main window.
+               
+               EventProperties *eventInfo = new EventProperties;
+               eventInfo->eventName = txtEventName->GetValue().ToStdString();
+               eventInfo->calendarID = calendarIDList[cmbCalendar->GetSelection()];
+               eventInfo->eventID = addEventResult.calendarEntryID;
+               eventInfo->eventYear = dapStartDate->GetValue().GetYear();
+               eventInfo->eventMonth = dapStartDate->GetValue().GetMonth();
+               eventInfo->eventDay = dapStartDate->GetValue().GetDay();
+               eventInfo->eventHour = atoi(txtStartTime->GetValue().ToStdString().substr(0, 2).c_str());
+               eventInfo->eventMinute = atoi(txtStartTime->GetValue().ToStdString().substr(3, 2).c_str());
+               eventInfo->eventSecond = 0;
+               
+               wxCommandEvent addEvent(XCMAIN_ADDEVENT);
+               addEvent.SetClientData(eventInfo);
+               addEvent.SetId(ID_ADDENTRY);
+               wxPostEvent(this->GetParent(), addEvent);
+               
+               eventFilePath = eventFile;
+               editMode = true;
+               
+               eventID = addEventResult.calendarEntryID;
+               
+               // Hide the calendar selection controls.
+               
+               cmbCalendar->Show(false);
+               lblCalendar->Show(false);
+               
+               szrDetails->Layout();
+               szrList->Layout();
+               
+       } else {
+               
+               // Setup the calendar directory path.
+
+               CDSGetCalendarEntryInfo eventDataInfo = dataStorage->GetEvent(eventID);
+               
+               // Write the file.
+               
+               CalendarObjectSaveResult saveResult = eventData.SaveFile(eventFilePath);
+               
+               // Update the data in the calendar data storage.
+               
+               CDSEditEntryResult editEventResult = dataStorage->UpdateEvent(eventID, eventFilePath);
+               
+               // Post an event to update the new entry in
+               // the main window.
+               
+               EventProperties *eventInfo = new EventProperties;
+               eventInfo->eventName = txtEventName->GetValue().ToStdString();
+               eventInfo->calendarID = calendarIDList[cmbCalendar->GetSelection()];
+               eventInfo->eventID = eventID;
+               eventInfo->eventYear = dapStartDate->GetValue().GetYear();
+               eventInfo->eventMonth = dapStartDate->GetValue().GetMonth();
+               eventInfo->eventDay = dapStartDate->GetValue().GetDay();
+               eventInfo->eventHour = atoi(txtStartTime->GetValue().ToStdString().substr(0, 2).c_str());
+               eventInfo->eventMinute = atoi(txtStartTime->GetValue().ToStdString().substr(3, 2).c_str());
+               eventInfo->eventSecond = 0;
+               
+               wxCommandEvent updateEvent(XCMAIN_UPDATEEVENT);
+               updateEvent.SetClientData(eventInfo);
+               updateEvent.SetId(ID_UPDATEENTRY);
+               wxPostEvent(this->GetParent(), updateEvent);
+               
+       }
+       
+}
+
+void frmEventEditor::CloseWindow(wxCommandEvent &event){
+       
+       this->Close();
+       
+}
+
+bool frmEventEditor::ProcessEvent(wxEvent& event)
+{
+
+       // Process the cut/copy/paste events.
+
+       // This section has been taken from the wxWidgets sample code of richtext.cpp
+       // so that simple Cut/Copy/Paste code can be made.
+    
+       // As this code comes from the samples of the wxWidgets library, this is licenced
+       // under the wxWindows Library Licence and is compatable with the LGPL and is
+       // compatable with Xestia Address Book's licence.
+    
+       if (event.IsCommandEvent() && !event.IsKindOf(CLASSINFO(wxChildFocusEvent))){
+               // Problem: we can get infinite recursion because the events
+               // climb back up to this frame, and repeat.
+               // Assume that command events don't cause another command event
+               // to be called, so we can rely on inCommand not being overwritten
+        
+               static int s_eventType = 0;
+               static wxWindowID s_id = 0;
+        
+               if (s_id != event.GetId() && s_eventType != event.GetEventType()){
+                       
+                       s_eventType = event.GetEventType();
+                       s_id = event.GetId();
+            
+                       wxWindow* focusWin = wxFindFocusDescendant(this);
+                       if (focusWin && focusWin->GetEventHandler()->ProcessEvent(event)){
+                               //s_command = NULL;
+                               s_eventType = 0;
+                               s_id = 0;
+                               return true;
+                       }
+                       s_eventType = 0;
+                       s_id = 0;
+                       
+               } else {
+               
+                       return false;
+                       
+               }
+       }
+    
+       return wxFrame::ProcessEvent(event);
+       
+}
+
+void frmEventEditor::CutText(wxCommandEvent &event){
+       
+}
+
+void frmEventEditor::CopyText(wxCommandEvent &event){
+       
+}
+
+void frmEventEditor::PasteText(wxCommandEvent &event){
+       
+}
+
+void frmEventEditor::SetEventID(int eventID){
+       
+       this->eventID = eventID;
+       
+}
+
+void frmEventEditor::SetDefaultDateTime(){
+       
+       wxDateTime DTNow = wxDateTime::Now();
+       
+       wxTimeSpan oneHour;
+       
+       string formattedTime = "";
+       
+       dapStartDate->SetValue(DTNow);
+       
+       if (DTNow.GetHour() < 10){
+               formattedTime += "0";
+               formattedTime += to_string(DTNow.GetHour());
+       } else {
+               formattedTime += to_string(DTNow.GetHour());
+       }
+       
+       formattedTime += ":";
+       
+       if (DTNow.GetMinute() < 10){
+               formattedTime += "0";
+               formattedTime += to_string(DTNow.GetMinute());          
+       } else {
+               formattedTime += to_string(DTNow.GetMinute());
+       }
+       
+       txtStartTime->SetValue((wxString)formattedTime);
+       
+       dapEndDate->SetValue(DTNow.Add(oneHour));
+
+       formattedTime.clear();
+       
+       if (DTNow.Add(oneHour.Hour()).GetHour() < 10){
+               formattedTime += "0";
+               formattedTime += to_string(DTNow.GetHour());
+       } else {
+               formattedTime += to_string(DTNow.GetHour());
+       }
+       
+       formattedTime += ":";
+       
+       if (DTNow.GetMinute() < 10){
+               formattedTime += "0";
+               formattedTime += to_string(DTNow.GetMinute());
+       } else {
+               formattedTime += to_string(DTNow.GetMinute());
+       }
+       
+       txtEndTime->SetValue((wxString)formattedTime);
+       
+}
\ No newline at end of file
diff --git a/source/forms/eventeditor/frmEventEditor.h b/source/forms/eventeditor/frmEventEditor.h
new file mode 100644 (file)
index 0000000..2728dd9
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef __frmEventEditor__
+#define __frmEventEditor__
+
+/**
+@file
+Subclass of frmEventEditorADT, which is generated by wxFormBuilder.
+*/
+
+#include <vector>
+#include <string>
+#include <sstream>
+
+#include "../../AppXestiaCalendar.h"
+
+#include "uuid.h"
+#include "random.h"
+#include "structs.h"
+#include "events.h"
+#include "dirs.h"
+#include "preferences.h"
+
+#include "../../libraries/CalendarDataStorage/CalendarDataStorage.h"
+#include "../../objects/calendarevent/CalendarEvent.h"
+
+//// end generated include
+
+/** Implementing frmEventEditorADT */
+class frmEventEditor : public frmEventEditorADT
+{
+       private:
+               CalendarDataStorage *dataStorage = nullptr;
+               CalendarEventObject eventData;
+               vector<int> calendarIDList;
+               bool editMode = false;
+               int eventID = 0;
+               string eventFilePath;
+               void SaveContact();
+               XCALPreferences *preferences;
+               void SetDefaultDateTime();
+       protected:
+               void SaveContact(wxCommandEvent &event);
+               void SaveNewContact(wxCommandEvent &event);
+               void CloseWindow(wxCommandEvent &event);
+               void CutText(wxCommandEvent &event);
+               void CopyText(wxCommandEvent &event);
+               void PasteText(wxCommandEvent &event);
+               bool ProcessEvent(wxEvent& event);
+       public:
+               /** Constructor */
+               frmEventEditor( wxWindow* parent );
+               void SetupForm(CalendarDataStorage *dataStorage, XCALPreferences *preferences);
+               void SetEditMode(bool editMode);
+               void SetEventID(int eventID);
+       //// end generated class members
+       
+};
+
+#endif // __frmEventEditor__
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