/* Copyright 2010-2011 Grégory Soutadé This file is part of KissCount. KissCount 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, either version 3 of the License, or (at your option) any later version. KissCount 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 KissCount. If not, see . */ #include "SearchBanner.h" enum {DESCRIPTION_ID=1, CALENDAR_FROM_ID, CALENDAR_TO_ID}; BEGIN_EVENT_TABLE(SearchBanner, wxPanel) EVT_CALENDAR_SEL_CHANGED(CALENDAR_TO_ID, SearchBanner::OnCalendarToChange) EVT_TEXT_ENTER(DESCRIPTION_ID, SearchBanner::OnEnter) END_EVENT_TABLE() SearchBanner::SearchBanner(KissCount* kiss, wxPanel *parent, void* caller, OnButtonEnter enterCallback) : wxPanel(parent), _kiss(kiss), _caller(caller), _enterCallback(enterCallback), _operations(NULL) { DEFAULT_FONT(font); User* user = _kiss->GetUser(); std::vector::iterator accountIt; std::vector::iterator categoryIt; wxDateTime firstOfMonth; wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL); SetSizer(vbox); _checkDateFrom = new wxCheckBox(this, wxID_ANY, _("Date from")); _checkDateTo = new wxCheckBox(this, wxID_ANY, _("Date to")); _checkDateFrom->SetValue(wxT("1")); _checkDateTo->SetValue(wxT("1")); wxGridBagSizer *gridBagSizer = new wxGridBagSizer(3, 10); firstOfMonth.SetToCurrent(); firstOfMonth.SetDay(1); _calendarFrom = new wxCalendarCtrl(this, CALENDAR_FROM_ID, firstOfMonth, wxDefaultPosition, wxDefaultSize, wxCAL_MONDAY_FIRST); _calendarTo = new wxCalendarCtrl(this, CALENDAR_TO_ID, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_MONDAY_FIRST); _description = new wxTextCtrl(this, DESCRIPTION_ID); _description->SetWindowStyle(_description->GetWindowStyle() | wxTE_PROCESS_ENTER); wxSize size = _description->GetSize(); size.SetWidth(size.GetWidth()*2); _description->SetMinSize(size); _amountFrom = new wxTextCtrl(this, wxID_ANY); _amountTo = new wxTextCtrl(this, wxID_ANY); _category = new wxCheckListBox(this, wxID_ANY); _category->Append(_("Unknown")); for(categoryIt = user->_categories.begin(); categoryIt != user->_categories.end(); categoryIt++) _category->Append(wxGetTranslation(categoryIt->name)); wxString stypes[] = {_("Fix"), _("Non fix"), _("Checked"), _("Not checked")}; _optype = new wxCheckListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 4, stypes); _account = new wxCheckListBox(this, wxID_ANY); _account->Append(_("Unknown")); for(accountIt = user->_accounts.begin(); accountIt != user->_accounts.end(); accountIt++) _account->Append(accountIt->name); wxStaticText* labelDescription = new wxStaticText(this, wxID_ANY, _("Description")); wxStaticText* labelAmountFrom = new wxStaticText(this, wxID_ANY, _("Amount from")); wxStaticText* labelAmountTo = new wxStaticText(this, wxID_ANY, _("Amount to")); wxStaticText* labelCategory = new wxStaticText(this, wxID_ANY, _("Category")); wxStaticText* labelOperations = new wxStaticText(this, wxID_ANY, _("Operations")); wxStaticText* labelAccount = new wxStaticText(this, wxID_ANY, _("Account")); gridBagSizer->Add(labelDescription, wxGBPosition(0, 0)); gridBagSizer->Add(_description, wxGBPosition(1, 0)); gridBagSizer->Add(_checkDateFrom, wxGBPosition(0, 1)); gridBagSizer->Add(_calendarFrom, wxGBPosition(1, 1)); gridBagSizer->Add(_checkDateTo, wxGBPosition(0, 2)); gridBagSizer->Add(_calendarTo, wxGBPosition(1, 2)); gridBagSizer->Add(labelAmountFrom, wxGBPosition(0, 3)); gridBagSizer->Add(_amountFrom, wxGBPosition(1, 3)); gridBagSizer->Add(labelAmountTo, wxGBPosition(0, 4)); gridBagSizer->Add(_amountTo, wxGBPosition(1, 4)); gridBagSizer->Add(labelCategory, wxGBPosition(0, 5)); gridBagSizer->Add(_category, wxGBPosition(1, 5)); gridBagSizer->Add(labelOperations, wxGBPosition(0, 6)); gridBagSizer->Add(_optype, wxGBPosition(1, 6)); gridBagSizer->Add(labelAccount, wxGBPosition(0, 7)); gridBagSizer->Add(_account, wxGBPosition(1, 7)); vbox->Add(gridBagSizer, 0, wxGROW|wxALL, 5); } SearchBanner::~SearchBanner() { if (_operations) delete _operations; } std::vector * SearchBanner::Search() { wxString *description=NULL, *amountFrom=NULL, *amountTo=NULL; std::vector categories, accounts; wxDateTime *dateFrom=NULL, *dateTo=NULL; User* user= _kiss->GetUser(); int i, types=0; std::vector::iterator it; double af, at; if (_operations) { delete _operations; _operations = NULL; } if (_checkDateFrom->IsChecked()) { dateFrom = new wxDateTime; *dateFrom = _calendarFrom->GetDate(); } if (_checkDateTo->IsChecked()) { dateTo = new wxDateTime; *dateTo = _calendarTo->GetDate(); } if (dateFrom && dateTo && *dateFrom > *dateTo) { wxMessageBox(_("Invalid date range"), _("Error"), wxICON_ERROR | wxOK); goto end; } if (_amountFrom->GetLineText(0).Length()) { amountFrom = new wxString; *amountFrom = _amountFrom->GetLineText(0); if (!amountFrom->ToDouble(&af)) { wxMessageBox(_("Invalid amount from"), _("Error"), wxICON_ERROR | wxOK); goto end; } if (af < 0) af *= -1; } if (_amountTo->GetLineText(0).Length()) { amountTo = new wxString; *amountTo = _amountTo->GetLineText(0); if (!amountTo->ToDouble(&at)) { wxMessageBox(_("Invalid amount to"), _("Error"), wxICON_ERROR | wxOK); goto end; } if (at < 0) at *= -1; } if (amountFrom && amountTo && af > at) { wxMessageBox(_("Invalid amount range"), _("Error"), wxICON_ERROR | wxOK); goto end; } if (_description->GetLineText(0).Length()) { description = new wxString; *description = _description->GetLineText(0); } for(i=0; iGetCategoriesNumber(); i++) if (_category->IsChecked(i)) categories.push_back((i) ? user->_categories[i-1].id : wxT("0")); types |= (_optype->IsChecked(0)) ? FIX_OP : 0; types |= (_optype->IsChecked(1)) ? NON_FIX_OP : 0; types |= (_optype->IsChecked(2)) ? CHECKED_OP : 0; types |= (_optype->IsChecked(3)) ? NOT_CHECKED_OP : 0; for(i=0; iGetAccountsNumber(); i++) if (_account->IsChecked(i)) accounts.push_back((i) ? user->_accounts[i-1].id : wxT("0")); _operations = _kiss->Search(description, dateFrom, dateTo, amountFrom, amountTo, categories,types, accounts); end: delete dateFrom; delete dateTo; delete amountFrom; delete amountTo; return _operations; } void SearchBanner::OnEnter(wxCommandEvent& event) { if (_enterCallback) _enterCallback(_caller, event); } void SearchBanner::OnCalendarFromChange(wxCalendarEvent& event) { _checkDateFrom->SetValue(true); } void SearchBanner::OnCalendarToChange(wxCalendarEvent& event) { _checkDateTo->SetValue(true); }