1 // XCCalendarMonthView.cpp - Xestia Calendar XCCalendarMonthView widget class.
3 // (c) 2016 Xestia Software Development.
5 // This file is part of Xestia Calendar.
7 // Xestia Address Book is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by the
9 // Free Software Foundation, version 3 of the license.
11 // Xestia Address Book is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Calendar. If not, see <http://www.gnu.org/licenses/>
19 #include "XCCalendarMonthView.h"
23 BEGIN_EVENT_TABLE(XCCalendarMonthView, wxPanel)
24 EVT_PAINT(XCCalendarMonthView::PaintFrameEvent)
27 XCCalendarMonthView::XCCalendarMonthView(wxWindow *parent, const wxString& title, const wxPoint& pos, const wxSize& size, XCCalendarMonthViewGrid *grid, CalendarDataStorage *dataStorage, std::vector<int> *hideAccounts, std::vector<int> *hideCalendars)
28 : wxPanel(parent, wxID_ANY, pos, size, wxTAB_TRAVERSAL){
30 calendarStorage = dataStorage;
32 mondayText = new XCCalendarMonthViewDayTitle(this, _("Monday"), wxDefaultPosition, wxDefaultSize);
33 tuesdayText = new XCCalendarMonthViewDayTitle(this, _("Tuesday"), wxDefaultPosition, wxDefaultSize);
34 wednesdayText = new XCCalendarMonthViewDayTitle(this, _("Wednesday"), wxDefaultPosition, wxDefaultSize);
35 thursdayText = new XCCalendarMonthViewDayTitle(this, _("Thursday"), wxDefaultPosition, wxDefaultSize);
36 fridayText = new XCCalendarMonthViewDayTitle(this, _("Friday"), wxDefaultPosition, wxDefaultSize);
37 saturdayText = new XCCalendarMonthViewDayTitle(this, _("Saturday"), wxDefaultPosition, wxDefaultSize);
38 sundayText = new XCCalendarMonthViewDayTitle(this, _("Sunday"), wxDefaultPosition, wxDefaultSize);
40 eventMenu = new XCEventMenu;
42 windowSizer->Add(mondayText, 1, wxEXPAND|wxALL, 0);
43 windowSizer->Add(tuesdayText, 1, wxEXPAND|wxALL, 0);
44 windowSizer->Add(wednesdayText, 1, wxEXPAND|wxALL, 0);
45 windowSizer->Add(thursdayText, 1, wxEXPAND|wxALL, 0);
46 windowSizer->Add(fridayText, 1, wxEXPAND|wxALL, 0);
47 windowSizer->Add(saturdayText, 1, wxEXPAND|wxALL, 0);
48 windowSizer->Add(sundayText, 1, wxEXPAND|wxALL, 0);
50 ProcessGrid(grid, hideAccounts, hideCalendars);
54 // Setup the growable rows and columns.
56 windowSizer->AddGrowableCol(0);
57 windowSizer->AddGrowableCol(1);
58 windowSizer->AddGrowableCol(2);
59 windowSizer->AddGrowableCol(3);
60 windowSizer->AddGrowableCol(4);
61 windowSizer->AddGrowableCol(5);
62 windowSizer->AddGrowableCol(6);
63 windowSizer->SetFlexibleDirection( wxBOTH );
64 windowSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
66 this->SetSizer(windowSizer);
67 windowSizer->Fit(this);
69 this->SetBackgroundColour(wxColour(0,0,0));
71 Connect(ID_MONTHVIEWCLEARSELECTION, XCCALENDARMONTH_DESELECTOTHERENTRIES, wxCommandEventHandler(XCCalendarMonthView::DeselectOthersEvent));
72 Connect(ID_HIDEENTRIES, XCCALENDARMONTH_HIDEACCOUNTENTRIES, wxCommandEventHandler(XCCalendarMonthView::HideAccountEntries));
73 Connect(ID_SHOWENTRIES, XCCALENDARMONTH_SHOWACCOUNTENTRIES, wxCommandEventHandler(XCCalendarMonthView::ShowAccountEntries));
74 Connect(ID_HIDECALENDARENTRIES, XCCALENDARMONTH_HIDECALENDARENTRIES, wxCommandEventHandler(XCCalendarMonthView::HideCalendarEntries));
75 Connect(ID_SHOWCALENDARENTRIES, XCCALENDARMONTH_SHOWCALENDARENTRIES, wxCommandEventHandler(XCCalendarMonthView::ShowCalendarEntries));
76 Connect(ID_DELETECALENDARENTRIES, XCCALENDARMONTH_DELETECALENDARENTRIES, wxCommandEventHandler(XCCalendarMonthView::DeleteCalendarEntries));
77 Connect(ID_DISPLAYEVENTMENU, XCCALENDARMONTH_DISPLAYEVENTMENU, wxCommandEventHandler(XCCalendarMonthView::ShowEventMenu));
78 Connect(ID_DELETEENTRY, XCCALENDARMONTH_DELETEENTRY, wxCommandEventHandler(XCCalendarMonthView::DeleteCalendarEntry));
79 Connect(ID_ADDENTRY, XCCALENDARMONTH_ADDENTRY, wxCommandEventHandler(XCCalendarMonthView::AddCalendarEntry));
80 Connect(ID_UPDATEENTRY, XCCALENDARMONTH_UPDATEENTRY, wxCommandEventHandler(XCCalendarMonthView::UpdateCalendarEntry));
81 Connect(ID_UPDATECOLOUR, XCCALENDARMONTH_UPDATECALENDARCOLOUR, wxCommandEventHandler(XCCalendarMonthView::UpdateCalendarColour));
85 XCCalendarMonthView::XCCalendarMonthView(XCCalendarMonthViewGrid *grid, CalendarDataStorage *dataStorage, std::vector<int> *hideAccounts, std::vector<int> *hideCalendars)
86 : wxPanel(NULL, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL){
88 Connect(ID_MONTHVIEWCLEARSELECTION, XCCALENDARMONTH_DESELECTOTHERENTRIES, wxCommandEventHandler(XCCalendarMonthView::DeselectOthersEvent));
90 calendarStorage = dataStorage;
92 mondayText = new XCCalendarMonthViewDayTitle(this, _("Monday"), wxDefaultPosition, wxDefaultSize);
93 tuesdayText = new XCCalendarMonthViewDayTitle(this, _("Tuesday"), wxDefaultPosition, wxDefaultSize);
94 wednesdayText = new XCCalendarMonthViewDayTitle(this, _("Wednesday"), wxDefaultPosition, wxDefaultSize);
95 thursdayText = new XCCalendarMonthViewDayTitle(this, _("Thursday"), wxDefaultPosition, wxDefaultSize);
96 fridayText = new XCCalendarMonthViewDayTitle(this, _("Friday"), wxDefaultPosition, wxDefaultSize);
97 saturdayText = new XCCalendarMonthViewDayTitle(this, _("Saturday"), wxDefaultPosition, wxDefaultSize);
98 sundayText = new XCCalendarMonthViewDayTitle(this, _("Sunday"), wxDefaultPosition, wxDefaultSize);
100 windowSizer->Add(mondayText, 1, wxEXPAND|wxALL, 0);
101 windowSizer->Add(tuesdayText, 1, wxEXPAND|wxALL, 0);
102 windowSizer->Add(wednesdayText, 1, wxEXPAND|wxALL, 0);
103 windowSizer->Add(thursdayText, 1, wxEXPAND|wxALL, 0);
104 windowSizer->Add(fridayText, 1, wxEXPAND|wxALL, 0);
105 windowSizer->Add(saturdayText, 1, wxEXPAND|wxALL, 0);
106 windowSizer->Add(sundayText, 1, wxEXPAND|wxALL, 0);
108 ProcessGrid(grid, hideAccounts, hideCalendars);
112 // Setup the growable rows and columns.
114 windowSizer->AddGrowableCol(0);
115 windowSizer->AddGrowableCol(1);
116 windowSizer->AddGrowableCol(2);
117 windowSizer->AddGrowableCol(3);
118 windowSizer->AddGrowableCol(4);
119 windowSizer->AddGrowableCol(5);
120 windowSizer->AddGrowableCol(6);
121 windowSizer->SetFlexibleDirection( wxBOTH );
122 windowSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
124 this->SetSizer(windowSizer);
125 windowSizer->Fit(this);
127 this->SetBackgroundColour(wxColour(0,0,0));
131 XCCalendarMonthView::~XCCalendarMonthView(){
135 delete wednesdayText;
141 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
142 dayIter != calendarDayList.end(); dayIter++){
150 void XCCalendarMonthView::ProcessGrid(XCCalendarMonthViewGrid *grid, std::vector<int> *hideAccounts, std::vector<int> *hideCalendars){
152 // TODO: Delete the old calendar entries.
154 // Add the new calendar entries.
158 for (vector<XCCalendarMonthViewGridDayWeek>::iterator weekIter = grid->weekList.begin();
159 weekIter != grid->weekList.end(); weekIter++){
163 for (vector<XCCalendarMonthViewGridDayData>::iterator dayIter = (*weekIter).dayList.begin();
164 dayIter != (*weekIter).dayList.end(); dayIter++){
166 // Add Calendar entries.
168 XCCalendarDay *calendarDayItem = new XCCalendarDay(this, "XCCalendarMonthView Test", wxPoint(50, 50), wxSize(200, 200));
170 // Setup the control.
172 calendarDayItem->SetupControl((*dayIter).day, (*dayIter).month, (*dayIter).year, (*dayIter).isInMonth, this, calendarStorage, hideAccounts, hideCalendars);
174 calendarDayList.push_back(calendarDayItem);
175 windowSizer->Add(calendarDayItem, 1, wxEXPAND, 5);
181 // Add the Growable Rows.
183 for (int weekSeek = 0; weekSeek < week; weekSeek++){
185 windowSizer->AddGrowableRow((weekSeek + 1));
191 void XCCalendarMonthView::Repaint(){
199 void XCCalendarMonthView::PaintFrameEvent(wxPaintEvent &PaintEvent){
205 void XCCalendarMonthView::ResizeFrameEvent(wxSizeEvent &SizeEvent){
207 // TODO: Check if window size is less than 120 pixels and if it is,
208 // switch to the small block mode.
210 // Refresh the window.
216 void XCCalendarMonthView::DeselectOthersEvent(wxCommandEvent &deselectEvent){
218 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
219 dayIter != calendarDayList.end(); dayIter++){
221 if (deselectEvent.GetClientData() != (void*)(*dayIter)){
223 wxCommandEvent deselectEvent(XCCALENDARDAY_DESELECTALLENTRIES);
224 deselectEvent.SetId(ID_DESELECTALLITEMS);
225 wxPostEvent((*dayIter), deselectEvent);
233 void XCCalendarMonthView::HideAccountEntries(wxCommandEvent &accountData){
235 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
236 dayIter != calendarDayList.end(); dayIter++){
238 wxCommandEvent hideEvent(XCCALENDARDAY_HIDEACCOUNTENTRIES);
239 hideEvent.SetInt(accountData.GetInt());
240 hideEvent.SetId(ID_HIDEENTRIES);
241 wxPostEvent((*dayIter), hideEvent);
247 void XCCalendarMonthView::ShowAccountEntries(wxCommandEvent &accountData){
249 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
250 dayIter != calendarDayList.end(); dayIter++){
252 wxCommandEvent showEvent(XCCALENDARDAY_SHOWACCOUNTENTRIES);
253 showEvent.SetInt(accountData.GetInt());
254 showEvent.SetId(ID_SHOWENTRIES);
255 wxPostEvent((*dayIter), showEvent);
261 void XCCalendarMonthView::HideCalendarEntries(wxCommandEvent &accountData){
263 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
264 dayIter != calendarDayList.end(); dayIter++){
266 wxCommandEvent hideEvent(XCCALENDARDAY_HIDECALENDARENTRIES);
267 hideEvent.SetInt(accountData.GetInt());
268 hideEvent.SetId(ID_HIDECALENDARENTRIES);
269 wxPostEvent((*dayIter), hideEvent);
275 void XCCalendarMonthView::ShowCalendarEntries(wxCommandEvent &accountData){
277 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
278 dayIter != calendarDayList.end(); dayIter++){
280 wxCommandEvent hideEvent(XCCALENDARDAY_SHOWCALENDARENTRIES);
281 hideEvent.SetInt(accountData.GetInt());
282 hideEvent.SetId(ID_SHOWCALENDARENTRIES);
283 wxPostEvent((*dayIter), hideEvent);
289 void XCCalendarMonthView::DeleteCalendarEntries(wxCommandEvent &calendarData){
291 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
292 dayIter != calendarDayList.end(); dayIter++){
294 wxCommandEvent deleteEvent(XCCALENDARDAY_DELETECALENDARENTRIES);
295 deleteEvent.SetInt(calendarData.GetInt());
296 deleteEvent.SetId(ID_DELETECALENDARENTRIES);
297 wxPostEvent((*dayIter), deleteEvent);
303 void XCCalendarMonthView::DeleteCalendarEntry(wxCommandEvent &eventData){
305 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
306 dayIter != calendarDayList.end(); dayIter++){
308 wxCommandEvent deleteEvent(XCCALENDARDAY_DELETEENTRY);
309 deleteEvent.SetInt(eventData.GetInt());
310 deleteEvent.SetId(ID_DELETEENTRY);
311 wxPostEvent((*dayIter), deleteEvent);
317 void XCCalendarMonthView::AddCalendarEntry(wxCommandEvent &eventData){
319 EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
320 bool foundDate = false;
322 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
323 dayIter != calendarDayList.end(); dayIter++){
325 // Check if the date matches with the date in the day
326 // widget. If it does, add the widget.
328 if ((*dayIter)->GetCalendarYear() == eventInfo->eventYear &&
329 (*dayIter)->GetCalendarMonth() == (eventInfo->eventMonth + 1) &&
330 (*dayIter)->GetCalendarDay() == eventInfo->eventDay){
332 wxCommandEvent addEvent(XCCALENDARDAY_ADDENTRY);
333 addEvent.SetId(ID_ADDENTRY);
334 addEvent.SetClientData(eventInfo);
335 wxPostEvent((*dayIter), addEvent);
343 if (foundDate == false){
352 void XCCalendarMonthView::UpdateCalendarEntry(wxCommandEvent &eventData){
354 EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
355 bool foundDate = false;
357 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
358 dayIter != calendarDayList.end(); dayIter++){
360 wxCommandEvent addEvent(XCCALENDARDAY_DELETEENTRY);
361 addEvent.SetId(ID_DELETEENTRY);
362 addEvent.SetInt(eventInfo->eventID);
363 wxPostEvent((*dayIter), addEvent);
367 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
368 dayIter != calendarDayList.end(); dayIter++){
370 // Check if the date matches with the date in the day
371 // widget. If it does, update the widget.
373 if ((*dayIter)->GetCalendarYear() == eventInfo->eventYear &&
374 (*dayIter)->GetCalendarMonth() == (eventInfo->eventMonth + 1) &&
375 (*dayIter)->GetCalendarDay() == eventInfo->eventDay){
377 wxCommandEvent addEvent(XCCALENDARDAY_ADDENTRY);
378 addEvent.SetId(ID_ADDENTRY);
379 addEvent.SetClientData(eventInfo);
380 wxPostEvent((*dayIter), addEvent);
388 if (foundDate == false){
397 void XCCalendarMonthView::UpdateCalendarColour(wxCommandEvent &colourData){
399 ColourUpdateProperties *colourDataInfo = (ColourUpdateProperties*)colourData.GetClientData();
401 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
402 dayIter != calendarDayList.end(); dayIter++){
404 // Check if the date matches with the date in the day
405 // widget. If it does, update the widget.
407 ColourUpdateProperties *colourDataPassInfo = colourDataInfo;
409 wxCommandEvent updateColour(XCCALENDARDAY_UPDATECALENDARCOLOUR);
410 updateColour.SetId(ID_UPDATECOLOUR);
411 updateColour.SetClientData(colourDataPassInfo);
412 wxPostEvent((*dayIter), updateColour);
418 void XCCalendarMonthView::ShowEventMenu(wxCommandEvent &eventData){
420 EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
422 eventMenu->SetEventID(eventInfo->eventID);
423 eventMenu->SetCalendarID(eventInfo->calendarID);
424 eventMenu->SetWindowPointer(this->GetParent()->GetParent());
426 this->PopupMenu(eventMenu, wxDefaultPosition);