Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
XCCalendarDay/XCCalendarMonthView: Fixed browse after deleting event
[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 BEGIN_EVENT_TABLE(XCCalendarMonthView, wxPanel)
24 EVT_PAINT(XCCalendarMonthView::PaintFrameEvent)
25 END_EVENT_TABLE()
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){
29         
30         calendarStorage = dataStorage;
31                 
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);
39                 
40         eventMenu = new XCEventMenu;
41         
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);
49         
50         ProcessGrid(grid, hideAccounts, hideCalendars);
51         
52         // Setup the days.
53         
54         // Setup the growable rows and columns.
55         
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 );
65         
66         this->SetSizer(windowSizer);
67         windowSizer->Fit(this);
68         this->Layout();
69         this->SetBackgroundColour(wxColour(0,0,0));
70         
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));
83 }
85 XCCalendarMonthView::XCCalendarMonthView(XCCalendarMonthViewGrid *grid, CalendarDataStorage *dataStorage, std::vector<int> *hideAccounts, std::vector<int> *hideCalendars)
86         : wxPanel(NULL, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL){
87         
88         Connect(ID_MONTHVIEWCLEARSELECTION, XCCALENDARMONTH_DESELECTOTHERENTRIES, wxCommandEventHandler(XCCalendarMonthView::DeselectOthersEvent));
89         
90         calendarStorage = dataStorage;
91                 
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);
99         
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);
107         
108         ProcessGrid(grid, hideAccounts, hideCalendars);
109         
110         // Setup the days.
111         
112         // Setup the growable rows and columns.
113         
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 );
123         
124         this->SetSizer(windowSizer);
125         windowSizer->Fit(this);
126         this->Layout();
127         this->SetBackgroundColour(wxColour(0,0,0));
128         
131 XCCalendarMonthView::~XCCalendarMonthView(){
132         
133         delete mondayText;
134         delete tuesdayText;
135         delete wednesdayText;
136         delete thursdayText;
137         delete fridayText;
138         delete saturdayText;
139         delete sundayText;
140         
141         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
142                 dayIter != calendarDayList.end(); dayIter++){
143                         
144                 delete ((*dayIter));
145                         
146         }
147         
150 void XCCalendarMonthView::ProcessGrid(XCCalendarMonthViewGrid *grid, std::vector<int> *hideAccounts, std::vector<int> *hideCalendars){
151         
152         // TODO: Delete the old calendar entries.
153         
154         // Add the new calendar entries.
155         
156         int week = 0;
157         
158         for (vector<XCCalendarMonthViewGridDayWeek>::iterator weekIter = grid->weekList.begin();
159                 weekIter != grid->weekList.end(); weekIter++){
160                         
161                 week++;
162                         
163                 for (vector<XCCalendarMonthViewGridDayData>::iterator dayIter = (*weekIter).dayList.begin();
164                         dayIter != (*weekIter).dayList.end(); dayIter++){
165                                 
166                         // Add Calendar entries.
167                                 
168                         XCCalendarDay *calendarDayItem = new XCCalendarDay(this, "XCCalendarMonthView Test", wxPoint(50, 50), wxSize(200, 200));
169                                 
170                         // Setup the control.
171                                 
172                         calendarDayItem->SetupControl((*dayIter).day, (*dayIter).month, (*dayIter).year, (*dayIter).isInMonth, this, calendarStorage, hideAccounts, hideCalendars);
173                                 
174                         calendarDayList.push_back(calendarDayItem);
175                         windowSizer->Add(calendarDayItem, 1, wxEXPAND, 5);
176                                 
177                 }
178                         
179         }
180         
181         // Add the Growable Rows.
182         
183         for (int weekSeek = 0; weekSeek < week; weekSeek++){
184                 
185                 windowSizer->AddGrowableRow((weekSeek + 1));
186                 
187         }
188         
191 void XCCalendarMonthView::Repaint(){
192         
193         // Draw the border.
194         
195         this->Layout();
199 void XCCalendarMonthView::PaintFrameEvent(wxPaintEvent &PaintEvent){
201         Repaint();
202         
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.
209         
210         // Refresh the window.
211         
212         this->Refresh();
213         
216 void XCCalendarMonthView::DeselectOthersEvent(wxCommandEvent &deselectEvent){
217         
218         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
219                 dayIter != calendarDayList.end(); dayIter++){
220                         
221                 if (deselectEvent.GetClientData() != (void*)(*dayIter)){
222                         
223                         wxCommandEvent deselectEvent(XCCALENDARDAY_DESELECTALLENTRIES);
224                         deselectEvent.SetId(ID_DESELECTALLITEMS);
225                         wxPostEvent((*dayIter), deselectEvent);
226                         
227                 }
228                         
229         }
230         
233 void XCCalendarMonthView::HideAccountEntries(wxCommandEvent &accountData){
234         
235         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
236                 dayIter != calendarDayList.end(); dayIter++){
237                         
238                 wxCommandEvent hideEvent(XCCALENDARDAY_HIDEACCOUNTENTRIES);
239                 hideEvent.SetInt(accountData.GetInt());
240                 hideEvent.SetId(ID_HIDEENTRIES);
241                 wxPostEvent((*dayIter), hideEvent);
242                         
243         }
244         
247 void XCCalendarMonthView::ShowAccountEntries(wxCommandEvent &accountData){
248         
249         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
250                 dayIter != calendarDayList.end(); dayIter++){
251                         
252                 wxCommandEvent showEvent(XCCALENDARDAY_SHOWACCOUNTENTRIES);
253                 showEvent.SetInt(accountData.GetInt());
254                 showEvent.SetId(ID_SHOWENTRIES);
255                 wxPostEvent((*dayIter), showEvent);
256                         
257         }
258         
261 void XCCalendarMonthView::HideCalendarEntries(wxCommandEvent &accountData){
262         
263         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
264                 dayIter != calendarDayList.end(); dayIter++){
265                         
266                 wxCommandEvent hideEvent(XCCALENDARDAY_HIDECALENDARENTRIES);
267                 hideEvent.SetInt(accountData.GetInt());
268                 hideEvent.SetId(ID_HIDECALENDARENTRIES);
269                 wxPostEvent((*dayIter), hideEvent);
270                         
271         }
272         
275 void XCCalendarMonthView::ShowCalendarEntries(wxCommandEvent &accountData){
276         
277         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
278                 dayIter != calendarDayList.end(); dayIter++){
279                         
280                 wxCommandEvent hideEvent(XCCALENDARDAY_SHOWCALENDARENTRIES);
281                 hideEvent.SetInt(accountData.GetInt());
282                 hideEvent.SetId(ID_SHOWCALENDARENTRIES);
283                 wxPostEvent((*dayIter), hideEvent);
284                         
285         }
286         
289 void XCCalendarMonthView::DeleteCalendarEntries(wxCommandEvent &calendarData){
290         
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);
298                         
299         }
300         
303 void XCCalendarMonthView::DeleteCalendarEntry(wxCommandEvent &eventData){
304         
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);
312                         
313         }       
314         
317 void XCCalendarMonthView::AddCalendarEntry(wxCommandEvent &eventData){
318         
319         EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
320         bool foundDate = false;
321         
322         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
323                 dayIter != calendarDayList.end(); dayIter++){
324                         
325                 // Check if the date matches with the date in the day
326                 // widget. If it does, add the widget.
327                         
328                 if ((*dayIter)->GetCalendarYear() == eventInfo->eventYear &&
329                         (*dayIter)->GetCalendarMonth() == (eventInfo->eventMonth + 1) &&
330                         (*dayIter)->GetCalendarDay() == eventInfo->eventDay){
331                         
332                         wxCommandEvent addEvent(XCCALENDARDAY_ADDENTRY);
333                         addEvent.SetId(ID_ADDENTRY);
334                         addEvent.SetClientData(eventInfo);
335                         wxPostEvent((*dayIter), addEvent);
336                         foundDate = true;
337                         break;
338                         
339                 }
340                         
341         }
342         
343         if (foundDate == false){
344                 
345                 delete eventInfo;
346                 eventInfo = nullptr;
347                 
348         }
349         
352 void XCCalendarMonthView::UpdateCalendarEntry(wxCommandEvent &eventData){
353         
354         EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
355         bool foundDate = false;
356         
357         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
358                 dayIter != calendarDayList.end(); dayIter++){
359         
360                 wxCommandEvent addEvent(XCCALENDARDAY_DELETEENTRY);
361                 addEvent.SetId(ID_DELETEENTRY);
362                 addEvent.SetInt(eventInfo->eventID);
363                 wxPostEvent((*dayIter), addEvent);
364                         
365         }
366         
367         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
368                 dayIter != calendarDayList.end(); dayIter++){
369                         
370                 // Check if the date matches with the date in the day
371                 // widget. If it does, update the widget.
372                         
373                 if ((*dayIter)->GetCalendarYear() == eventInfo->eventYear &&
374                         (*dayIter)->GetCalendarMonth() == (eventInfo->eventMonth + 1) &&
375                         (*dayIter)->GetCalendarDay() == eventInfo->eventDay){
376                         
377                         wxCommandEvent addEvent(XCCALENDARDAY_ADDENTRY);
378                         addEvent.SetId(ID_ADDENTRY);
379                         addEvent.SetClientData(eventInfo);
380                         wxPostEvent((*dayIter), addEvent);
381                         foundDate = true;
382                         break;
383                         
384                 }
385                         
386         }
387         
388         if (foundDate == false){
389                 
390                 delete eventInfo;
391                 eventInfo = nullptr;
392                 
393         }
394         
397 void XCCalendarMonthView::UpdateCalendarColour(wxCommandEvent &colourData){
398         
399         ColourUpdateProperties *colourDataInfo = (ColourUpdateProperties*)colourData.GetClientData();
400         
401         for (vector<XCCalendarDay*>::iterator dayIter = calendarDayList.begin();
402                 dayIter != calendarDayList.end(); dayIter++){
403                         
404                 // Check if the date matches with the date in the day
405                 // widget. If it does, update the widget.
407                 ColourUpdateProperties *colourDataPassInfo = colourDataInfo;
408                         
409                 wxCommandEvent updateColour(XCCALENDARDAY_UPDATECALENDARCOLOUR);
410                 updateColour.SetId(ID_UPDATECOLOUR);
411                 updateColour.SetClientData(colourDataPassInfo);
412                 wxPostEvent((*dayIter), updateColour);
413                         
414         }
415         
418 void XCCalendarMonthView::ShowEventMenu(wxCommandEvent &eventData){
419         
420         EventProperties *eventInfo = (EventProperties*)eventData.GetClientData();
421         
422         eventMenu->SetEventID(eventInfo->eventID);
423         eventMenu->SetCalendarID(eventInfo->calendarID);
424         eventMenu->SetWindowPointer(this->GetParent()->GetParent());
425         
426         this->PopupMenu(eventMenu, wxDefaultPosition);
427         
428         delete eventInfo;
429         eventInfo = nullptr;
430         
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