// XCCalendarList.cpp - Xestia Calendar XCCalendarList widget class.
//
// (c) 2016 Xestia Software Development.
//
// This file is part of Xestia Calendar.
//
// Xestia Address Book is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by the
// Free Software Foundation, version 3 of the license.
//
// Xestia Address Book is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with Xestia Calendar. If not, see
#include "XCCalendarList.h"
XCCalendarList::XCCalendarList(wxWindow *parent)
: wxPopupTransientWindow (parent){
// Setup the controls.
szrMain = new wxBoxSizer( wxVERTICAL );
this->SetSizer(szrMain);
this->SetSize(wxSize(350, 500));
}
XCCalendarList::~XCCalendarList(){
// Delete the calendar lists.
for (vector::iterator accountCtrlIter = accountControlList.begin();
accountCtrlIter != accountControlList.end(); accountCtrlIter++){
delete *accountCtrlIter;
}
accountControlList.clear();
this->SetSizer(nullptr, true);
}
void XCCalendarList::UpdateCalendarList(CalendarDataStorage *dataStorage){
// Verify if the generated code has changed. Return if not.
CDSGetChecksumResult currentChecksum = dataStorage->GetChecksum("internal_updatedata");
if (checksumUpdate == currentChecksum.checksumValue){
// Checksum matches so return.
return;
}
// Delete the old controls. Remember which setting the checkboxes were hidden so they
// can be restored later on.
vector calendarHiddenAccountsList = GetHiddenAccountsList();
vector calendarHiddenCalendarsList = GetHiddenCalendarsList();
for (vector::iterator accountCtrlIter = accountControlList.begin();
accountCtrlIter != accountControlList.end(); accountCtrlIter++){
delete *accountCtrlIter;
}
accountControlList.clear();
// Get the list of accounts and create them one by one.
CDSAccountList accountListData = dataStorage->GetAccountList();
for (int AccountSeek = 0; AccountSeek < accountListData.accountList.size(); AccountSeek++){
// Create the control and add it to the list.
XCCalendarListAccountCtrl *newAccountCtrl = new XCCalendarListAccountCtrl(this, accountListData.accountList[AccountSeek].accountName);
newAccountCtrl->SetAccountID(accountListData.accountList[AccountSeek].accountID);
newAccountCtrl->SetAccountPreferencesID(accountListData.accountList[AccountSeek].accountPreferencesID);
szrMain->Add(newAccountCtrl, 0, wxEXPAND, 5);
if (find(calendarHiddenAccountsList.begin(), calendarHiddenAccountsList.end(), accountListData.accountList[AccountSeek].accountID) != calendarHiddenAccountsList.end()){
newAccountCtrl->SetCheckBoxValue(wxCHK_UNCHECKED);
}
accountControlList.push_back(newAccountCtrl);
// Get the list of calendars and create controls.
CDSCalendarList accountCalendarList = dataStorage->GetCalendarList(accountListData.accountList[AccountSeek].accountID);
for (int calendarSeek = 0; calendarSeek < accountCalendarList.calendarList.size(); calendarSeek++){
CDSGetCalendarInfo calendarInfo = dataStorage->GetCalendar(accountListData.accountList[AccountSeek].accountName, accountCalendarList.calendarListTextID[calendarSeek]);
XCCalendarListCalendarCtrl *newCalendarCtrl = new XCCalendarListCalendarCtrl(this, calendarInfo.calendarName, calendarInfo.calendarColour);
newCalendarCtrl->SetCalendarID(accountCalendarList.calendarList[calendarSeek]);
newCalendarCtrl->SetAccountPreferencesID(accountListData.accountList[AccountSeek].accountPreferencesID);
if (find(calendarHiddenCalendarsList.begin(), calendarHiddenCalendarsList.end(), accountCalendarList.calendarList[calendarSeek]) != calendarHiddenCalendarsList.end()){
newCalendarCtrl->SetCheckBoxValue(wxCHK_UNCHECKED);
}
newAccountCtrl->AddCalendar(newCalendarCtrl);
szrMain->Add(newCalendarCtrl, 0, wxEXPAND, 5);
}
}
// Set the updated checksum.
checksumUpdate = currentChecksum.checksumValue;
this->Layout();
}
std::vector XCCalendarList::GetHiddenAccountsList(){
std::vector accountList;
// Go through each of the account controls and work
// out which entries should be hidden based on account.
for (std::vector::iterator accountListIter = accountControlList.begin();
accountListIter != accountControlList.end(); accountListIter++){
if ((*accountListIter)->GetShowCheckboxState() == wxCHK_UNCHECKED){
accountList.push_back((*accountListIter)->GetAccountID());
}
}
return accountList;
}
std::vector XCCalendarList::GetHiddenCalendarsList(){
std::vector calendarList;
// Go through each of the calendar controls and
// work out which entries should be hidden based on
// calendar.
for (std::vector::iterator accountListIter = accountControlList.begin();
accountListIter != accountControlList.end(); accountListIter++){
// Get the list of hidden calendars.
vector calendarHiddenList = (*accountListIter)->GetHiddenCalendarList();
for (vector::iterator calendarHiddenIter = calendarHiddenList.begin();
calendarHiddenIter != calendarHiddenList.end(); calendarHiddenIter++){
vector::iterator calendarHiddenFind = find(calendarList.begin(), calendarList.end(), *calendarHiddenIter);
if (calendarHiddenFind == calendarList.end()){
calendarList.push_back(*calendarHiddenIter);
}
}
}
return calendarList;
}