/* 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 "AccountPanel.h" enum {SEARCH_ID=1, GRID_ID, CHANGE_ACCOUNT_ID, CHANGE_CATEGORY_ID, RENAME_ID}; BEGIN_EVENT_TABLE(SearchPanel, wxPanel) EVT_BUTTON(SEARCH_ID, SearchPanel::OnButtonSearch) EVT_GRID_CMD_CELL_CHANGE(GRID_ID, SearchPanel::OnOperationModified) EVT_BUTTON(CHANGE_ACCOUNT_ID, SearchPanel::OnButtonChangeAccount) EVT_BUTTON(CHANGE_CATEGORY_ID, SearchPanel::OnButtonChangeCategory) EVT_BUTTON(RENAME_ID, SearchPanel::OnButtonRename) EVT_SHOW(SearchPanel::OnShow) END_EVENT_TABLE() SearchPanel::SearchPanel(KissCount* kiss, wxUI *parent) : KissPanel(kiss, parent), _operations(NULL) { DEFAULT_FONT(font); std::vector::iterator accountIt; std::vector::iterator categoryIt; wxDateTime firstOfMonth; wxRect rect = wxDisplay().GetGeometry(); wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL); wxBoxSizer *vbox2 = new wxBoxSizer(wxVERTICAL); wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL); SetSizer(vbox); _searchButton = new wxButton(this, SEARCH_ID, _("Search")); _banner = new SearchBanner(kiss, this, this, OnEnter); vbox->Add(_banner, 0, wxGROW|wxALL, 5); vbox->Add(_searchButton, 0, wxALL, 5); _grid = new GridAccount(_kiss, this, GRID_ID, false, false, true); hbox->Add(_grid, 0, wxGROW|wxALL, 5); _changeAccountButton = new wxButton(this, CHANGE_ACCOUNT_ID, _("Change account")); _changeCategoryButton = new wxButton(this, CHANGE_CATEGORY_ID, _("Change category")); _renameButton = new wxButton(this, RENAME_ID, _("Rename")); vbox2->Add(_changeAccountButton, wxALL, 15); vbox2->Add(_changeCategoryButton, wxALL, 15); vbox2->Add(_renameButton, wxALL, 15); hbox->Add(vbox2, 0, wxALL, 15); vbox->Add(hbox, 0, wxGROW|wxALL, 5); Fit(); SetMinSize(wxSize(rect.width-rect.x-15, rect.height-rect.y-128-25)); SetMaxSize(wxSize(rect.width-rect.x-15, rect.height-rect.y-128-25)); SetScrollbars(10, 10, 100/10, 100/10); } SearchPanel::~SearchPanel() { } KissPanel* SearchPanel::CreatePanel() { return new SearchPanel(_kiss, _wxUI); } wxBitmapButton* SearchPanel::GetButton(int id) { if (!_KissButton) _KissButton = new wxBitmapButton(_wxUI, id, wxBitmap(wxT(SEARCH_ICON), wxBITMAP_TYPE_PNG), wxDefaultPosition, wxSize(128, 128)); return _KissButton; } wxString SearchPanel::GetToolTip() { return _("Search"); } void SearchPanel::OnEnter(void* caller, wxCommandEvent& event) { SearchPanel* _this = (SearchPanel*) caller; _this->OnButtonSearch(event); } void SearchPanel::OnButtonSearch(wxCommandEvent& event) { _operations = _banner->Search(); if (!_operations) return; if (_operations->size() > 1) wxMessageBox(wxString::Format(wxT("%d"), _operations->size()) + _(" entries found"), wxT("KissCount"), wxICON_INFORMATION | wxOK); else if (_operations->size() == 1) wxMessageBox(_("1 entry found"), wxT("KissCount"), wxICON_INFORMATION | wxOK); else { wxMessageBox(_("No entry found"), wxT("KissCount"), wxICON_INFORMATION | wxOK); return; } _grid->LoadOperations(_operations, 0, 0); _wxUI->Layout(); } static void ChangeAccount(Operation* op, void** params) { wxString* account = (wxString*) params[0]; op->account = *account; } void SearchPanel::OnButtonChangeAccount(wxCommandEvent& event) { int i, a; std::vector rows; User* user = _kiss->GetUser(); wxString *accounts = new wxString[user->GetAccountsNumber()+1]; std::vector::iterator it; wxString account; void * params[] = {&account}; if (!_operations) return; _grid->GetSelectedOperations(&rows); accounts[0] = _("None"); a = 0; for(i=0; i < user->GetAccountsNumber(); i++) accounts[++a] = user->_accounts[i].name; wxSingleChoiceDialog dialog(_wxUI, _("Choose a new account"), wxT("KissCount"), user->GetAccountsNumber()+1, accounts); if (dialog.ShowModal() == wxID_CANCEL) return; a = dialog.GetSelection(); account = (a) ? user->_accounts[a-1].id : wxT("0"); _grid->MassUpdate(rows, ChangeAccount, params); _wxUI->NeedReload(); } static void ChangeCategory(Operation* op, void** params) { wxString* category = (wxString*) params[0]; bool* fix = (bool*) params[1]; op->category = *category; op->fix_cost = * fix; } void SearchPanel::OnButtonChangeCategory(wxCommandEvent& event) { int i, a; std::vector rows; User* user = _kiss->GetUser(); wxString *categories = new wxString[user->GetCategoriesNumber()+1]; std::vector::iterator it; wxString category; bool fix; void * params[] = {&category, &fix}; if (!_operations) return; _grid->GetSelectedOperations(&rows); categories[0] = _("None"); a = 0; for(i=0; i < user->GetCategoriesNumber(); i++) categories[++a] = wxGetTranslation(user->_categories[i].name); wxSingleChoiceDialog dialog(_wxUI, _("Choose a new category"), wxT("KissCount"), user->GetCategoriesNumber()+1, categories); if (dialog.ShowModal() == wxID_CANCEL) return; a = dialog.GetSelection(); if (a) { category = user->_categories[a-1].id ; fix = user->_categories[a-1].fix_cost; } else { category = wxT("0"); fix = false; } _grid->MassUpdate(rows, ChangeCategory, params); _wxUI->NeedReload(); } static void ChangeName(Operation* op, void** params) { wxString* description = (wxString*) params[0]; op->description = *description; } void SearchPanel::OnButtonRename(wxCommandEvent& event) { std::vector rows; std::vector::iterator it; wxString category; wxString description; void * params[] = {&description}; if (!_operations) return; _grid->GetSelectedOperations(&rows); wxTextEntryDialog u(this, wxT(""), _("Enter a new description")); if (u.ShowModal() == wxID_CANCEL) return; description = u.GetValue(); if (!description.size()) return; _grid->MassUpdate(rows, ChangeName, params); _wxUI->NeedReload(); } void SearchPanel::OnShow(wxShowEvent& event) { _wxUI->SetTitle(_kiss->GetUser()->_name + wxT(" - ") + _("Search")); } void SearchPanel::OnOperationModified(wxGridEvent& event) { _wxUI->NeedReload(); }