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(){
137 void XCCalendarMonthView::ProcessGrid(XCCalendarMonthViewGrid *grid, std::vector<int> *hideAccounts, std::vector<int> *hideCalendars){
139 // TODO: Delete the old calendar entries.
141 // Add the new calendar entries.
145 for (vector<XCCalendarMonthViewGridDayWeek>::iterator WeekIter = grid->WeekList.begin();
146 WeekIter != grid->WeekList.end(); WeekIter++){
150 for (vector<XCCalendarMonthViewGridDayData>::iterator DayIter = (*WeekIter).DayList.begin();
151 DayIter != (*WeekIter).DayList.end(); DayIter++){
153 // TODO: Add CalendarEntries.
155 XCCalendarDay *CalendarDayItem = new XCCalendarDay(this, "XCCalendarMonthView Test", wxPoint(50, 50), wxSize(200, 200));
157 // Setup the control.
159 CalendarDayItem->SetupControl((*DayIter).Day, (*DayIter).Month, (*DayIter).Year, (*DayIter).IsInMonth, this, calendarStorage, hideAccounts, hideCalendars);
161 CalendarDayList.push_back(CalendarDayItem);
162 WindowSizer->Add(CalendarDayItem, 1, wxEXPAND, 5);
168 // Add the Growable Rows.
170 for (int WeekSeek = 0; WeekSeek < Week; WeekSeek++){
172 WindowSizer->AddGrowableRow((WeekSeek + 1));
178 void XCCalendarMonthView::Repaint(){
186 void XCCalendarMonthView::PaintFrameEvent(wxPaintEvent &PaintEvent){
192 void XCCalendarMonthView::ResizeFrameEvent(wxSizeEvent &SizeEvent){
194 // TODO: Check if window size is less than 120 pixels and if it is,
195 // switch to the small block mode.
197 // Refresh the window.
203 void XCCalendarMonthView::DeselectOthersEvent(wxCommandEvent &DeselectEvent){
205 for (vector<XCCalendarDay*>::iterator DayIter = CalendarDayList.begin();
206 DayIter != CalendarDayList.end(); DayIter++){
208 if (DeselectEvent.GetClientData() != (void*)(*DayIter)){
210 wxCommandEvent DeselectEvent(XCCALENDARDAY_DESELECTALLENTRIES);
211 DeselectEvent.SetId(ID_DESELECTALLITEMS);
212 wxPostEvent((*DayIter), DeselectEvent);
220 void XCCalendarMonthView::HideAccountEntries(wxCommandEvent &accountData){
222 for (vector<XCCalendarDay*>::iterator DayIter = CalendarDayList.begin();
223 DayIter != CalendarDayList.end(); DayIter++){
225 wxCommandEvent HideEvent(XCCALENDARDAY_HIDEACCOUNTENTRIES);
226 HideEvent.SetInt(accountData.GetInt());
227 HideEvent.SetId(ID_HIDEENTRIES);
228 wxPostEvent((*DayIter), HideEvent);
234 void XCCalendarMonthView::ShowAccountEntries(wxCommandEvent &accountData){
236 for (vector<XCCalendarDay*>::iterator DayIter = CalendarDayList.begin();
237 DayIter != CalendarDayList.end(); DayIter++){
239 wxCommandEvent ShowEvent(XCCALENDARDAY_SHOWACCOUNTENTRIES);
240 ShowEvent.SetInt(accountData.GetInt());
241 ShowEvent.SetId(ID_SHOWENTRIES);
242 wxPostEvent((*DayIter), ShowEvent);
248 void XCCalendarMonthView::HideCalendarEntries(wxCommandEvent &accountData){
250 for (vector<XCCalendarDay*>::iterator DayIter = CalendarDayList.begin();
251 DayIter != CalendarDayList.end(); DayIter++){
253 wxCommandEvent HideEvent(XCCALENDARDAY_HIDECALENDARENTRIES);
254 HideEvent.SetInt(accountData.GetInt());
255 HideEvent.SetId(ID_HIDECALENDARENTRIES);
256 wxPostEvent((*DayIter), HideEvent);
262 void XCCalendarMonthView::ShowCalendarEntries(wxCommandEvent &accountData){
264 for (vector<XCCalendarDay*>::iterator DayIter = CalendarDayList.begin();
265 DayIter != CalendarDayList.end(); DayIter++){
267 wxCommandEvent HideEvent(XCCALENDARDAY_SHOWCALENDARENTRIES);
268 HideEvent.SetInt(accountData.GetInt());
269 HideEvent.SetId(ID_SHOWCALENDARENTRIES);
270 wxPostEvent((*DayIter), HideEvent);
276 void XCCalendarMonthView::DeleteCalendarEntries(wxCommandEvent &calendarData){
278 for (vector<XCCalendarDay*>::iterator DayIter = CalendarDayList.begin();
279 DayIter != CalendarDayList.end(); DayIter++){
281 wxCommandEvent deleteEvent(XCCALENDARDAY_DELETECALENDARENTRIES);
282 deleteEvent.SetInt(calendarData.GetInt());
283 deleteEvent.SetId(ID_DELETECALENDARENTRIES);
284 wxPostEvent((*DayIter), deleteEvent);
290 void XCCalendarMonthView::DeleteCalendarEntry(wxCommandEvent &eventData){
292 for (vector<XCCalendarDay*>::iterator DayIter = CalendarDayList.begin();
293 DayIter != CalendarDayList.end(); DayIter++){
295 wxCommandEvent deleteEvent(XCCALENDARDAY_DELETEENTRY);
296 deleteEvent.SetInt(eventData.GetInt());
297 deleteEvent.SetId(ID_DELETEENTRY);
298 wxPostEvent((*DayIter), deleteEvent);
304 void XCCalendarMonthView::AddCalendarEntry(wxCommandEvent &eventData){
306 EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
307 bool foundDate = false;
309 for (vector<XCCalendarDay*>::iterator DayIter = CalendarDayList.begin();
310 DayIter != CalendarDayList.end(); DayIter++){
312 // Check if the date matches with the date in the day
313 // widget. If it does, add the widget.
315 if ((*DayIter)->GetCalendarYear() == eventInfo->eventYear &&
316 (*DayIter)->GetCalendarMonth() == (eventInfo->eventMonth + 1) &&
317 (*DayIter)->GetCalendarDay() == eventInfo->eventDay){
319 wxCommandEvent addEvent(XCCALENDARDAY_ADDENTRY);
320 addEvent.SetId(ID_ADDENTRY);
321 addEvent.SetClientData(eventInfo);
322 wxPostEvent((*DayIter), addEvent);
330 if (foundDate == false){
339 void XCCalendarMonthView::UpdateCalendarEntry(wxCommandEvent &eventData){
341 EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
342 bool foundDate = false;
344 for (vector<XCCalendarDay*>::iterator DayIter = CalendarDayList.begin();
345 DayIter != CalendarDayList.end(); DayIter++){
347 // Check if the date matches with the date in the day
348 // widget. If it does, update the widget.
350 if ((*DayIter)->GetCalendarYear() == eventInfo->eventYear &&
351 (*DayIter)->GetCalendarMonth() == (eventInfo->eventMonth + 1) &&
352 (*DayIter)->GetCalendarDay() == eventInfo->eventDay){
354 wxCommandEvent addEvent(XCCALENDARDAY_UPDATEENTRY);
355 addEvent.SetId(ID_UPDATEENTRY);
356 addEvent.SetClientData(eventInfo);
357 wxPostEvent((*DayIter), addEvent);
365 if (foundDate == false){
374 void XCCalendarMonthView::UpdateCalendarColour(wxCommandEvent &colourData){
376 ColourUpdateProperties *colourDataInfo = (ColourUpdateProperties*)colourData.GetClientData();
378 for (vector<XCCalendarDay*>::iterator DayIter = CalendarDayList.begin();
379 DayIter != CalendarDayList.end(); DayIter++){
381 // Check if the date matches with the date in the day
382 // widget. If it does, update the widget.
384 ColourUpdateProperties *colourDataPassInfo = colourDataInfo;
386 wxCommandEvent updateColour(XCCALENDARDAY_UPDATECALENDARCOLOUR);
387 updateColour.SetId(ID_UPDATECOLOUR);
388 updateColour.SetClientData(colourDataPassInfo);
389 wxPostEvent((*DayIter), updateColour);
395 void XCCalendarMonthView::ShowEventMenu(wxCommandEvent &eventData){
397 EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
399 eventMenu->SetEventID(eventInfo->eventID);
400 eventMenu->SetCalendarID(eventInfo->calendarID);
401 eventMenu->SetWindowPointer(this->GetParent()->GetParent());
403 this->PopupMenu(eventMenu, wxDefaultPosition);