Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
Events: Now using wxDEFINE_EVENT, wxDECLARE_EVENT and Bind
[xestiacalendar/.git] / source / widgets / XCCalendarMonthView.cpp
1 // XCCalendarMonthView.cpp - Xestia Calendar XCCalendarMonthView widget class.
2 //
3 // (c) 2016 Xestia Software Development.
4 //
5 // This file is part of Xestia Calendar.
6 //
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.
10 //
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.
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 "XCCalendarMonthView.h"
21 using namespace std;
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)
37 END_EVENT_TABLE()
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;
42                 
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);
50                 
51         eventMenu = new XCEventMenu;
52         
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);
60         
61         ProcessGrid(grid, hideAccounts, hideCalendars);
62         
63         // Setup the days.
64         
65         // Setup the growable rows and columns.
66         
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 );
76         
77         this->SetSizer(windowSizer);
78         windowSizer->Fit(this);
79         this->Layout();
80         this->SetBackgroundColour(wxColour(0,0,0));
81         
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);
95 }
97 XCCalendarMonthView::XCCalendarMonthView(XCCalendarMonthViewGrid *grid, CalendarDataStorage *dataStorage, std::vector<int> *hideAccounts, std::vector<int> *hideCalendars)
98         : wxPanel(NULL, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL){
99         
100         Connect(ID_MONTHVIEWCLEARSELECTION, XCCALENDARMONTH_DESELECTOTHERENTRIES, wxCommandEventHandler(XCCalendarMonthView::DeselectOthersEvent));
101         
102         calendarStorage = dataStorage;
103                 
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);
111         
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);
119         
120         ProcessGrid(grid, hideAccounts, hideCalendars);
121         
122         // Setup the days.
123         
124         // Setup the growable rows and columns.
125         
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 );
135         
136         this->SetSizer(windowSizer);
137         windowSizer->Fit(this);
138         this->Layout();
139         this->SetBackgroundColour(wxColour(0,0,0));
140         
143 XCCalendarMonthView::~XCCalendarMonthView(){
144         
145         delete mondayText;
146         delete tuesdayText;
147         delete wednesdayText;
148         delete thursdayText;
149         delete fridayText;
150         delete saturdayText;
151         delete sundayText;
152         
153         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
154                 dayIter != calendarDayList.end(); dayIter++){
155                         
156                 delete ((*dayIter));
157                         
158         }
159         
162 void XCCalendarMonthView::ProcessGrid(XCCalendarMonthViewGrid *grid, std::vector<int> *hideAccounts, std::vector<int> *hideCalendars){
163         
164         // TODO: Delete the old calendar entries.
165         
166         // Add the new calendar entries.
167         
168         int week = 0;
169         
170         for (vector<XCCalendarMonthViewGridDayWeek>::iterator weekIter = grid->weekList.begin();
171                 weekIter != grid->weekList.end(); weekIter++){
172                         
173                 week++;
174                         
175                 for (vector<XCCalendarMonthViewGridDayData>::iterator dayIter = (*weekIter).dayList.begin();
176                         dayIter != (*weekIter).dayList.end(); dayIter++){
177                                 
178                         // Add Calendar entries.
179                                 
180                         XCCalendarDay *calendarDayItem = new XCCalendarDay(this, "XCCalendarMonthView Test", wxPoint(50, 50), wxSize(200, 200));
181                                 
182                         // Setup the control.
183                                 
184                         calendarDayItem->SetupControl((*dayIter).day, (*dayIter).month, (*dayIter).year, (*dayIter).isInMonth, this, calendarStorage, hideAccounts, hideCalendars);
185                                 
186                         calendarDayList.push_back(calendarDayItem);
187                         windowSizer->Add(calendarDayItem, 1, wxEXPAND, 5);
188                                 
189                 }
190                         
191         }
192         
193         // Add the Growable Rows.
194         
195         for (int weekSeek = 0; weekSeek < week; weekSeek++){
196                 
197                 windowSizer->AddGrowableRow((weekSeek + 1));
198                 
199         }
200         
203 void XCCalendarMonthView::Repaint(){
204         
205         // Draw the border.
206         
207         this->Layout();
211 void XCCalendarMonthView::PaintFrameEvent(wxPaintEvent &PaintEvent){
213         Repaint();
214         
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.
221         
222         // Refresh the window.
223         
224         this->Refresh();
225         
228 void XCCalendarMonthView::DeselectOthersEvent(wxCommandEvent &deselectEvent){
229         
230         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
231                 dayIter != calendarDayList.end(); dayIter++){
232                         
233                 if (deselectEvent.GetClientData() != (void*)(*dayIter)){
234                         
235                         wxCommandEvent deselectEvent(XCCALENDARDAY_DESELECTALLENTRIES);
236                         deselectEvent.SetId(ID_DESELECTALLITEMS);
237                         wxPostEvent((*dayIter), deselectEvent);
238                         
239                 }
240                         
241         }
242         
245 void XCCalendarMonthView::HideAccountEntries(wxCommandEvent &accountData){
246         
247         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
248                 dayIter != calendarDayList.end(); dayIter++){
249                         
250                 wxCommandEvent hideEvent(XCCALENDARDAY_HIDEACCOUNTENTRIES);
251                 hideEvent.SetInt(accountData.GetInt());
252                 hideEvent.SetId(ID_HIDEENTRIES);
253                 wxPostEvent((*dayIter), hideEvent);
254                         
255         }
256         
259 void XCCalendarMonthView::ShowAccountEntries(wxCommandEvent &accountData){
260         
261         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
262                 dayIter != calendarDayList.end(); dayIter++){
263                         
264                 wxCommandEvent showEvent(XCCALENDARDAY_SHOWACCOUNTENTRIES);
265                 showEvent.SetInt(accountData.GetInt());
266                 showEvent.SetId(ID_SHOWENTRIES);
267                 wxPostEvent((*dayIter), showEvent);
268                         
269         }
270         
273 void XCCalendarMonthView::HideCalendarEntries(wxCommandEvent &accountData){
274         
275         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
276                 dayIter != calendarDayList.end(); dayIter++){
277                         
278                 wxCommandEvent hideEvent(XCCALENDARDAY_HIDECALENDARENTRIES);
279                 hideEvent.SetInt(accountData.GetInt());
280                 hideEvent.SetId(ID_HIDECALENDARENTRIES);
281                 wxPostEvent((*dayIter), hideEvent);
282                         
283         }
284         
287 void XCCalendarMonthView::ShowCalendarEntries(wxCommandEvent &accountData){
288         
289         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
290                 dayIter != calendarDayList.end(); dayIter++){
291                         
292                 wxCommandEvent hideEvent(XCCALENDARDAY_SHOWCALENDARENTRIES);
293                 hideEvent.SetInt(accountData.GetInt());
294                 hideEvent.SetId(ID_SHOWCALENDARENTRIES);
295                 wxPostEvent((*dayIter), hideEvent);
296                         
297         }
298         
301 void XCCalendarMonthView::DeleteCalendarEntries(wxCommandEvent &calendarData){
302         
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);
310                         
311         }
312         
315 void XCCalendarMonthView::DeleteCalendarEntry(wxCommandEvent &eventData){
316         
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);
324                         
325         }       
326         
329 void XCCalendarMonthView::AddCalendarEntry(wxCommandEvent &eventData){
330         
331         EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
332         bool foundDate = false;
333         
334         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
335                 dayIter != calendarDayList.end(); dayIter++){
336                         
337                 // Check if the date matches with the date in the day
338                 // widget. If it does, add the widget.
339                         
340                 if ((*dayIter)->GetCalendarYear() == eventInfo->eventYear &&
341                         (*dayIter)->GetCalendarMonth() == (eventInfo->eventMonth + 1) &&
342                         (*dayIter)->GetCalendarDay() == eventInfo->eventDay){
343                         
344                         wxCommandEvent addEvent(XCCALENDARDAY_ADDENTRY);
345                         addEvent.SetId(ID_ADDENTRY);
346                         addEvent.SetClientData(eventInfo);
347                         wxPostEvent((*dayIter), addEvent);
348                         foundDate = true;
349                         break;
350                         
351                 }
352                         
353         }
354         
355         if (foundDate == false){
356                 
357                 delete eventInfo;
358                 eventInfo = nullptr;
359                 
360         }
361         
364 void XCCalendarMonthView::UpdateCalendarEntry(wxCommandEvent &eventData){
365         
366         EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
367         bool foundDate = false;
368         
369         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
370                 dayIter != calendarDayList.end(); dayIter++){
371         
372                 wxCommandEvent addEvent(XCCALENDARDAY_DELETEENTRY);
373                 addEvent.SetId(ID_DELETEENTRY);
374                 addEvent.SetInt(eventInfo->eventID);
375                 wxPostEvent((*dayIter), addEvent);
376                         
377         }
378         
379         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
380                 dayIter != calendarDayList.end(); dayIter++){
381                         
382                 // Check if the date matches with the date in the day
383                 // widget. If it does, update the widget.
384                         
385                 if ((*dayIter)->GetCalendarYear() == eventInfo->eventYear &&
386                         (*dayIter)->GetCalendarMonth() == (eventInfo->eventMonth + 1) &&
387                         (*dayIter)->GetCalendarDay() == eventInfo->eventDay){
388                         
389                         wxCommandEvent addEvent(XCCALENDARDAY_ADDENTRY);
390                         addEvent.SetId(ID_ADDENTRY);
391                         addEvent.SetClientData(eventInfo);
392                         wxPostEvent((*dayIter), addEvent);
393                         foundDate = true;
394                         break;
395                         
396                 }
397                         
398         }
399         
400         if (foundDate == false){
401                 
402                 delete eventInfo;
403                 eventInfo = nullptr;
404                 
405         }
406         
409 void XCCalendarMonthView::UpdateCalendarColour(wxCommandEvent &colourData){
410         
411         ColourUpdateProperties *colourDataInfo = (ColourUpdateProperties*)colourData.GetClientData();
412         
413         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
414                 dayIter != calendarDayList.end(); dayIter++){
415                         
416                 // Check if the date matches with the date in the day
417                 // widget. If it does, update the widget.
419                 ColourUpdateProperties *colourDataPassInfo = colourDataInfo;
420                         
421                 wxCommandEvent updateColour(XCCALENDARDAY_UPDATECALENDARCOLOUR);
422                 updateColour.SetId(ID_UPDATECOLOUR);
423                 updateColour.SetClientData(colourDataPassInfo);
424                 wxPostEvent((*dayIter), updateColour);
425                         
426         }
427         
430 void XCCalendarMonthView::ShowEventMenu(wxCommandEvent &eventData){
431         
432         EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
433         
434         eventMenu->SetEventID(eventInfo->eventID);
435         eventMenu->SetCalendarID(eventInfo->calendarID);
436         eventMenu->SetWindowPointer(this->GetParent()->GetParent());
437         
438         this->PopupMenu(eventMenu, wxDefaultPosition);
439         
440         delete eventInfo;
441         eventInfo = nullptr;
442         
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