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 wxDEFINE_EVENT(XCCALENDARMONTH_DESELECTOTHERENTRIES, wxCommandEvent);
24 wxDEFINE_EVENT(XCCALENDARMONTH_HIDEACCOUNTENTRIES, wxCommandEvent);
25 wxDEFINE_EVENT(XCCALENDARMONTH_SHOWACCOUNTENTRIES, wxCommandEvent);
26 wxDEFINE_EVENT(XCCALENDARMONTH_HIDECALENDARENTRIES, wxCommandEvent);
27 wxDEFINE_EVENT(XCCALENDARMONTH_SHOWCALENDARENTRIES, wxCommandEvent);
28 wxDEFINE_EVENT(XCCALENDARMONTH_DELETECALENDARENTRIES, wxCommandEvent);
29 wxDEFINE_EVENT(XCCALENDARMONTH_DISPLAYEVENTMENU, wxCommandEvent);
30 wxDEFINE_EVENT(XCCALENDARMONTH_DELETEENTRY, wxCommandEvent);
31 wxDEFINE_EVENT(XCCALENDARMONTH_ADDENTRY, wxCommandEvent);
32 wxDEFINE_EVENT(XCCALENDARMONTH_UPDATEENTRY, wxCommandEvent);
33 wxDEFINE_EVENT(XCCALENDARMONTH_UPDATECALENDARCOLOUR, wxCommandEvent);
35 BEGIN_EVENT_TABLE(XCCalendarMonthView, wxPanel)
36 EVT_PAINT(XCCalendarMonthView::PaintFrameEvent)
39 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)
40 : wxPanel(parent, wxID_ANY, pos, size, wxTAB_TRAVERSAL){
41 calendarStorage = dataStorage;
43 mondayText = new XCCalendarMonthViewDayTitle(this, _("Monday"), wxDefaultPosition, wxDefaultSize);
44 tuesdayText = new XCCalendarMonthViewDayTitle(this, _("Tuesday"), wxDefaultPosition, wxDefaultSize);
45 wednesdayText = new XCCalendarMonthViewDayTitle(this, _("Wednesday"), wxDefaultPosition, wxDefaultSize);
46 thursdayText = new XCCalendarMonthViewDayTitle(this, _("Thursday"), wxDefaultPosition, wxDefaultSize);
47 fridayText = new XCCalendarMonthViewDayTitle(this, _("Friday"), wxDefaultPosition, wxDefaultSize);
48 saturdayText = new XCCalendarMonthViewDayTitle(this, _("Saturday"), wxDefaultPosition, wxDefaultSize);
49 sundayText = new XCCalendarMonthViewDayTitle(this, _("Sunday"), wxDefaultPosition, wxDefaultSize);
51 eventMenu = new XCEventMenu;
53 windowSizer->Add(mondayText, 1, wxEXPAND|wxALL, 0);
54 windowSizer->Add(tuesdayText, 1, wxEXPAND|wxALL, 0);
55 windowSizer->Add(wednesdayText, 1, wxEXPAND|wxALL, 0);
56 windowSizer->Add(thursdayText, 1, wxEXPAND|wxALL, 0);
57 windowSizer->Add(fridayText, 1, wxEXPAND|wxALL, 0);
58 windowSizer->Add(saturdayText, 1, wxEXPAND|wxALL, 0);
59 windowSizer->Add(sundayText, 1, wxEXPAND|wxALL, 0);
61 ProcessGrid(grid, hideAccounts, hideCalendars);
65 // Setup the growable rows and columns.
67 windowSizer->AddGrowableCol(0);
68 windowSizer->AddGrowableCol(1);
69 windowSizer->AddGrowableCol(2);
70 windowSizer->AddGrowableCol(3);
71 windowSizer->AddGrowableCol(4);
72 windowSizer->AddGrowableCol(5);
73 windowSizer->AddGrowableCol(6);
74 windowSizer->SetFlexibleDirection( wxBOTH );
75 windowSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
77 this->SetSizer(windowSizer);
78 windowSizer->Fit(this);
80 this->SetBackgroundColour(wxColour(0,0,0));
82 // Bind events to the control.
84 Bind(XCCALENDARMONTH_DELETECALENDARENTRIES, &XCCalendarMonthView::DeselectOthersEvent, this, ID_MONTHVIEWCLEARSELECTION);
85 Bind(XCCALENDARMONTH_HIDEACCOUNTENTRIES, &XCCalendarMonthView::HideAccountEntries, this, ID_HIDEENTRIES);
86 Bind(XCCALENDARMONTH_SHOWACCOUNTENTRIES, &XCCalendarMonthView::ShowAccountEntries, this, ID_SHOWENTRIES);
87 Bind(XCCALENDARMONTH_HIDECALENDARENTRIES, &XCCalendarMonthView::HideCalendarEntries, this, ID_HIDECALENDARENTRIES);
88 Bind(XCCALENDARMONTH_SHOWCALENDARENTRIES, &XCCalendarMonthView::ShowCalendarEntries, this, ID_SHOWCALENDARENTRIES);
89 Bind(XCCALENDARMONTH_DELETECALENDARENTRIES, &XCCalendarMonthView::DeleteCalendarEntries, this, ID_DELETECALENDARENTRIES);
90 Bind(XCCALENDARMONTH_DISPLAYEVENTMENU, &XCCalendarMonthView::ShowEventMenu, this, ID_DISPLAYEVENTMENU);
91 Bind(XCCALENDARMONTH_DELETEENTRY, &XCCalendarMonthView::DeleteCalendarEntry, this, ID_DELETEENTRY);
92 Bind(XCCALENDARMONTH_ADDENTRY, &XCCalendarMonthView::AddCalendarEntry, this, ID_ADDENTRY);
93 Bind(XCCALENDARMONTH_UPDATEENTRY, &XCCalendarMonthView::UpdateCalendarEntry, this, ID_UPDATEENTRY);
94 Bind(XCCALENDARMONTH_UPDATECALENDARCOLOUR, &XCCalendarMonthView::UpdateCalendarColour, this, ID_UPDATECOLOUR);
97 XCCalendarMonthView::XCCalendarMonthView(XCCalendarMonthViewGrid *grid, CalendarDataStorage *dataStorage, std::vector<int> *hideAccounts, std::vector<int> *hideCalendars)
98 : wxPanel(NULL, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL){
100 Connect(ID_MONTHVIEWCLEARSELECTION, XCCALENDARMONTH_DESELECTOTHERENTRIES, wxCommandEventHandler(XCCalendarMonthView::DeselectOthersEvent));
102 calendarStorage = dataStorage;
104 mondayText = new XCCalendarMonthViewDayTitle(this, _("Monday"), wxDefaultPosition, wxDefaultSize);
105 tuesdayText = new XCCalendarMonthViewDayTitle(this, _("Tuesday"), wxDefaultPosition, wxDefaultSize);
106 wednesdayText = new XCCalendarMonthViewDayTitle(this, _("Wednesday"), wxDefaultPosition, wxDefaultSize);
107 thursdayText = new XCCalendarMonthViewDayTitle(this, _("Thursday"), wxDefaultPosition, wxDefaultSize);
108 fridayText = new XCCalendarMonthViewDayTitle(this, _("Friday"), wxDefaultPosition, wxDefaultSize);
109 saturdayText = new XCCalendarMonthViewDayTitle(this, _("Saturday"), wxDefaultPosition, wxDefaultSize);
110 sundayText = new XCCalendarMonthViewDayTitle(this, _("Sunday"), wxDefaultPosition, wxDefaultSize);
112 windowSizer->Add(mondayText, 1, wxEXPAND|wxALL, 0);
113 windowSizer->Add(tuesdayText, 1, wxEXPAND|wxALL, 0);
114 windowSizer->Add(wednesdayText, 1, wxEXPAND|wxALL, 0);
115 windowSizer->Add(thursdayText, 1, wxEXPAND|wxALL, 0);
116 windowSizer->Add(fridayText, 1, wxEXPAND|wxALL, 0);
117 windowSizer->Add(saturdayText, 1, wxEXPAND|wxALL, 0);
118 windowSizer->Add(sundayText, 1, wxEXPAND|wxALL, 0);
120 ProcessGrid(grid, hideAccounts, hideCalendars);
124 // Setup the growable rows and columns.
126 windowSizer->AddGrowableCol(0);
127 windowSizer->AddGrowableCol(1);
128 windowSizer->AddGrowableCol(2);
129 windowSizer->AddGrowableCol(3);
130 windowSizer->AddGrowableCol(4);
131 windowSizer->AddGrowableCol(5);
132 windowSizer->AddGrowableCol(6);
133 windowSizer->SetFlexibleDirection( wxBOTH );
134 windowSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
136 this->SetSizer(windowSizer);
137 windowSizer->Fit(this);
139 this->SetBackgroundColour(wxColour(0,0,0));
143 XCCalendarMonthView::~XCCalendarMonthView(){
147 delete wednesdayText;
153 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
154 dayIter != calendarDayList.end(); dayIter++){
162 void XCCalendarMonthView::ProcessGrid(XCCalendarMonthViewGrid *grid, std::vector<int> *hideAccounts, std::vector<int> *hideCalendars){
164 // TODO: Delete the old calendar entries.
166 // Add the new calendar entries.
170 for (vector<XCCalendarMonthViewGridDayWeek>::iterator weekIter = grid->weekList.begin();
171 weekIter != grid->weekList.end(); weekIter++){
175 for (vector<XCCalendarMonthViewGridDayData>::iterator dayIter = (*weekIter).dayList.begin();
176 dayIter != (*weekIter).dayList.end(); dayIter++){
178 // Add Calendar entries.
180 XCCalendarDay *calendarDayItem = new XCCalendarDay(this, "XCCalendarMonthView Test", wxPoint(50, 50), wxSize(200, 200));
182 // Setup the control.
184 calendarDayItem->SetupControl((*dayIter).day, (*dayIter).month, (*dayIter).year, (*dayIter).isInMonth, this, calendarStorage, hideAccounts, hideCalendars);
186 calendarDayList.push_back(calendarDayItem);
187 windowSizer->Add(calendarDayItem, 1, wxEXPAND, 5);
193 // Add the Growable Rows.
195 for (int weekSeek = 0; weekSeek < week; weekSeek++){
197 windowSizer->AddGrowableRow((weekSeek + 1));
203 void XCCalendarMonthView::Repaint(){
211 void XCCalendarMonthView::PaintFrameEvent(wxPaintEvent &PaintEvent){
217 void XCCalendarMonthView::ResizeFrameEvent(wxSizeEvent &SizeEvent){
219 // TODO: Check if window size is less than 120 pixels and if it is,
220 // switch to the small block mode.
222 // Refresh the window.
228 void XCCalendarMonthView::DeselectOthersEvent(wxCommandEvent &deselectEvent){
230 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
231 dayIter != calendarDayList.end(); dayIter++){
233 if (deselectEvent.GetClientData() != (void*)(*dayIter)){
235 wxCommandEvent deselectEvent(XCCALENDARDAY_DESELECTALLENTRIES);
236 deselectEvent.SetId(ID_DESELECTALLITEMS);
237 wxPostEvent((*dayIter), deselectEvent);
245 void XCCalendarMonthView::HideAccountEntries(wxCommandEvent &accountData){
247 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
248 dayIter != calendarDayList.end(); dayIter++){
250 wxCommandEvent hideEvent(XCCALENDARDAY_HIDEACCOUNTENTRIES);
251 hideEvent.SetInt(accountData.GetInt());
252 hideEvent.SetId(ID_HIDEENTRIES);
253 wxPostEvent((*dayIter), hideEvent);
259 void XCCalendarMonthView::ShowAccountEntries(wxCommandEvent &accountData){
261 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
262 dayIter != calendarDayList.end(); dayIter++){
264 wxCommandEvent showEvent(XCCALENDARDAY_SHOWACCOUNTENTRIES);
265 showEvent.SetInt(accountData.GetInt());
266 showEvent.SetId(ID_SHOWENTRIES);
267 wxPostEvent((*dayIter), showEvent);
273 void XCCalendarMonthView::HideCalendarEntries(wxCommandEvent &accountData){
275 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
276 dayIter != calendarDayList.end(); dayIter++){
278 wxCommandEvent hideEvent(XCCALENDARDAY_HIDECALENDARENTRIES);
279 hideEvent.SetInt(accountData.GetInt());
280 hideEvent.SetId(ID_HIDECALENDARENTRIES);
281 wxPostEvent((*dayIter), hideEvent);
287 void XCCalendarMonthView::ShowCalendarEntries(wxCommandEvent &accountData){
289 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
290 dayIter != calendarDayList.end(); dayIter++){
292 wxCommandEvent hideEvent(XCCALENDARDAY_SHOWCALENDARENTRIES);
293 hideEvent.SetInt(accountData.GetInt());
294 hideEvent.SetId(ID_SHOWCALENDARENTRIES);
295 wxPostEvent((*dayIter), hideEvent);
301 void XCCalendarMonthView::DeleteCalendarEntries(wxCommandEvent &calendarData){
303 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
304 dayIter != calendarDayList.end(); dayIter++){
306 wxCommandEvent deleteEvent(XCCALENDARDAY_DELETECALENDARENTRIES);
307 deleteEvent.SetInt(calendarData.GetInt());
308 deleteEvent.SetId(ID_DELETECALENDARENTRIES);
309 wxPostEvent((*dayIter), deleteEvent);
315 void XCCalendarMonthView::DeleteCalendarEntry(wxCommandEvent &eventData){
317 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
318 dayIter != calendarDayList.end(); dayIter++){
320 wxCommandEvent deleteEvent(XCCALENDARDAY_DELETEENTRY);
321 deleteEvent.SetInt(eventData.GetInt());
322 deleteEvent.SetId(ID_DELETEENTRY);
323 wxPostEvent((*dayIter), deleteEvent);
329 void XCCalendarMonthView::AddCalendarEntry(wxCommandEvent &eventData){
331 EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
332 bool foundDate = false;
334 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
335 dayIter != calendarDayList.end(); dayIter++){
337 // Check if the date matches with the date in the day
338 // widget. If it does, add the widget.
340 if ((*dayIter)->GetCalendarYear() == eventInfo->eventYear &&
341 (*dayIter)->GetCalendarMonth() == (eventInfo->eventMonth + 1) &&
342 (*dayIter)->GetCalendarDay() == eventInfo->eventDay){
344 wxCommandEvent addEvent(XCCALENDARDAY_ADDENTRY);
345 addEvent.SetId(ID_ADDENTRY);
346 addEvent.SetClientData(eventInfo);
347 wxPostEvent((*dayIter), addEvent);
355 if (foundDate == false){
364 void XCCalendarMonthView::UpdateCalendarEntry(wxCommandEvent &eventData){
366 EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
367 bool foundDate = false;
369 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
370 dayIter != calendarDayList.end(); dayIter++){
372 wxCommandEvent addEvent(XCCALENDARDAY_DELETEENTRY);
373 addEvent.SetId(ID_DELETEENTRY);
374 addEvent.SetInt(eventInfo->eventID);
375 wxPostEvent((*dayIter), addEvent);
379 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
380 dayIter != calendarDayList.end(); dayIter++){
382 // Check if the date matches with the date in the day
383 // widget. If it does, update the widget.
385 if ((*dayIter)->GetCalendarYear() == eventInfo->eventYear &&
386 (*dayIter)->GetCalendarMonth() == (eventInfo->eventMonth + 1) &&
387 (*dayIter)->GetCalendarDay() == eventInfo->eventDay){
389 wxCommandEvent addEvent(XCCALENDARDAY_ADDENTRY);
390 addEvent.SetId(ID_ADDENTRY);
391 addEvent.SetClientData(eventInfo);
392 wxPostEvent((*dayIter), addEvent);
400 if (foundDate == false){
409 void XCCalendarMonthView::UpdateCalendarColour(wxCommandEvent &colourData){
411 ColourUpdateProperties *colourDataInfo = (ColourUpdateProperties*)colourData.GetClientData();
413 for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
414 dayIter != calendarDayList.end(); dayIter++){
416 // Check if the date matches with the date in the day
417 // widget. If it does, update the widget.
419 ColourUpdateProperties *colourDataPassInfo = colourDataInfo;
421 wxCommandEvent updateColour(XCCALENDARDAY_UPDATECALENDARCOLOUR);
422 updateColour.SetId(ID_UPDATECOLOUR);
423 updateColour.SetClientData(colourDataPassInfo);
424 wxPostEvent((*dayIter), updateColour);
430 void XCCalendarMonthView::ShowEventMenu(wxCommandEvent &eventData){
432 EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
434 eventMenu->SetEventID(eventInfo->eventID);
435 eventMenu->SetCalendarID(eventInfo->calendarID);
436 eventMenu->SetWindowPointer(this->GetParent()->GetParent());
438 this->PopupMenu(eventMenu, wxDefaultPosition);