#include "AccountPanel.h" static wxString colsName[] = {_("Description"), _("Date"), _("Debit"), _("Credit"), _("Category"), _("Account"), _("")}; AccountPanel::AccountPanel(KissCount* kiss, wxUI *parent) : wxPanel(&(*parent)), _kiss(kiss), _wxUI(parent), _tree(this, -1) { wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL); wxChartPanel* chart ; int i ; User* user = _kiss->GetUser(); std::map::iterator accountIt; std::map::iterator it; wxColour categoryColors[] = {wxColour(0x00, 0x45, 0x86), wxColour(0xFF, 0x3E, 0x0E), wxColour(0xFF, 0xD3, 0x20), wxColour(0x58, 0x9D, 0x1B), wxColour(0x7E, 0x00, 0x21), wxColour(0x83, 0xCC, 0xFF), wxColour(0x31, 0x40, 0x04), wxColour(0xB0, 0xCF, 0x00), wxColour(0x4B, 0x1F, 0x6F), wxColour(0xFF, 0x93, 0x0E), wxColour(0xC5, 0x00, 0x0D), wxColour(0x00, 0x84, 0xD1)}; SetSizer(hbox); ColorScheme* colorScheme = new ColorScheme(categoryColors, WXSIZEOF(categoryColors)); _pie = new PiePlot(); _accounts = new wxString[user->_accounts.size()+1]; _accounts[0] = _("Unknown"); for (i=1, accountIt = user->_accounts.begin(); accountIt != user->_accounts.end(); accountIt++, i++) _accounts[i] = user->_accounts[accountIt->first].name; _categories = new wxString[user->GetCategoriesNumber()+1] ; _categories[0] = _("Unknown"); _categoriesIndexes[_("Unknown")] = 0; for(i=1, it = user->_preferences._categories.begin(); it != user->_preferences._categories.end(); it++, i++) { _categories[i] = it->second ; _categoriesIndexes[it->second] = i; } _dataset = new CategorySimpleDataset(_categories, user->GetCategoriesNumber()+1); _categoriesValues = new double[user->GetCategoriesNumber()+1]; for(i=0; iGetCategoriesNumber()+1; i++) _categoriesValues[i] = 1.0; _dataset->AddSerie(_("Serie 1"), _categoriesValues, user->GetCategoriesNumber()+1); _dataset->SetRenderer(new CategoryRenderer(*colorScheme)); _pie->SetDataset(_dataset); _pie->SetColorScheme(colorScheme); _pie->SetLegend(new Legend(wxBOTTOM, wxCENTER)); _grid = new GridAccount(this, -1); _grid->CreateGrid(1, NUMBER_COLS); _grid->SetColLabelSize(0); _grid->SetRowLabelSize(0); chart = new wxChartPanel(this); chart->SetChart(new Chart(_pie, _("Cost repartition"))); chart->Fit(); chart->Layout(); chart->SetMinSize(// chart->GetSize() wxSize(200,500)); hbox->Add(&_tree, 0); hbox->Add(_grid, 0); hbox->Add(chart, 0); ChangeUser(); Fit(); SetMinSize(GetSize()); } AccountPanel::~AccountPanel() { delete[] _categoriesValues; delete[] _categories; delete[] _accounts; } void AccountPanel::ChangeUser() { User* user = _kiss->GetUser(); int curYear = -1; std::map >* >::iterator it; wxDateTime curDate; curDate.SetToCurrent(); for(it = user->_operations.begin(); it != user->_operations.end(); it++) { if ((int)it->first <= curDate.GetYear()) curYear = it->first; _tree.AddRoot(wxString::Format(wxT("%d"), it->first)); } if (curYear != -1) LoadYear(curYear); } void AccountPanel::LoadYear(int year) { User* user = _kiss->GetUser(); int curMonth = -1; std::map >::iterator it; wxDateTime curDate; wxTreeItemId parentNode, curMonthNode; _curYear = year ; if (user->_operations[year] != NULL) { ShowMonth(year, 0); return; } _kiss->LoadYear(year); curDate.SetToCurrent(); parentNode = _tree.GetSelection(); for (it = user->_operations[year]->begin(); it != user->_operations[year]->end(); it++) { if (year == curDate.GetYear() && (int)it->first <= curDate.GetMonth()) { curMonth = it->first; curMonthNode = _tree.AppendItem(parentNode, months[it->first]); } else if(curMonth == -1) { curMonthNode = _tree.AppendItem(parentNode, months[it->first]); curMonth++; } else _tree.AppendItem(parentNode, months[it->first]); } _tree.Expand(parentNode); _tree.SelectItem(curMonthNode, true); ShowMonth(year, curMonth); } #define SET_ROW_COLOR(row, color) for(int i=0; iSetCellBackgroundColour(row, i, color);\ } void AccountPanel::ShowMonth(int year, int month) { std::list operations; std::list::iterator it; int fixCosts = 0; int curLine = 0; User* user = _kiss->GetUser(); wxFont font(DEFAULT_FONT_SIZE, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, DEFAULT_FONT); std::map::iterator categoryIt; wxGridCellChoiceEditor* categoryEditor, *accountEditor; int i; _curMonth = month; _wxUI->SetTitle(user->_name + _(" - ") + months[month]); // Operations are ordered _curOperations = &((*user->_operations[year])[month]); _grid->CreateGrid(1, NUMBER_COLS); // Creating headers _grid->SetColSize (0, _grid->GetColSize(0)*3); _grid->SetDefaultCellFont(font); font.SetWeight(wxFONTWEIGHT_BOLD); for(i=0; iSetCellValue(0, i, colsName[i]); _grid->SetCellBackgroundColour(0, i, OWN_CYAN); _grid->SetCellFont(0, i, font); _grid->SetReadOnly(0, i, true); } // SetCellBackgroundColour (int row, int col, const wxColour &colour); // SetCellFont (int row, int col, const wxFont &font); // SetCellValue (int row, int col, const wxString &s); // GetColSize (int col) const ; // SetColSize (int col, int width); // AppendRows (int numRows=1, bool updateLabels=true); // InsertRows (int pos=0, int numRows=1, bool updateLabels=true); // SetReadOnly(row, col, bool) it = _curOperations->begin(); /* struct operation { wxString id; unsigned int day; unsigned int month; unsigned int year; int amount; wxString description; wxString category; bool fix_cost; enum {DESCRIPTION, DATE, DEBIT, CREDIT, CATEGORY, ACCOUNT, VIEW, NUMBER_COLS}; } ; */ while (it->fix_cost) { _grid->AppendRows(); curLine++; fixCosts++; SET_ROW_COLOR(curLine, OWN_YELLOW); _grid->SetCellValue(curLine, DESCRIPTION, it->description); _grid->SetCellValue(curLine, DATE, wxString::Format(wxT("%02d/%02d/%d"), it->day+1, it->month+1, it->year)); if (it->amount < 0) _grid->SetCellValue(curLine, DEBIT, wxString::Format(wxT("%.2lf"), -it->amount)); else _grid->SetCellValue(curLine, CREDIT, wxString::Format(wxT("%.2lf"), it->amount)); _grid->SetCellEditor(curLine, DEBIT, new wxGridCellFloatEditor(-1, 2)); _grid->SetCellEditor(curLine, CREDIT, new wxGridCellFloatEditor(-1, 2)); categoryEditor = new wxGridCellChoiceEditor(user->GetCategoriesNumber()+1, _categories, false); _grid->SetCellEditor(curLine, CATEGORY, categoryEditor); _grid->SetCellValue(curLine, CATEGORY, user->GetCategoryName(it->category)); accountEditor = new wxGridCellChoiceEditor(user->_accounts.size()+1, _accounts, false); _grid->SetCellEditor(curLine, ACCOUNT, accountEditor); _grid->SetCellValue(curLine, ACCOUNT, user->GetAccountName(it->account)); it++; } _grid->AppendRows(); curLine++; SET_ROW_COLOR(curLine, OWN_YELLOW); categoryEditor = new wxGridCellChoiceEditor(user->_preferences._categories.size()+1, _categories, false); _grid->SetCellEditor(curLine, CATEGORY, categoryEditor); _grid->SetCellEditor(curLine, DEBIT, new wxGridCellFloatEditor(-1, 2)); _grid->SetCellEditor(curLine, CREDIT, new wxGridCellFloatEditor(-1, 2)); accountEditor = new wxGridCellChoiceEditor(user->_accounts.size()+1, _accounts, false); _grid->SetCellEditor(curLine, ACCOUNT, accountEditor); _grid->_fixCosts = ++fixCosts; for (; it != _curOperations->begin(); it++) { _grid->AppendRows(); curLine++; SET_ROW_COLOR(curLine, OWN_GREEN); _grid->SetCellValue(curLine, DESCRIPTION, it->description); _grid->SetCellValue(curLine, DATE, wxString::Format(wxT("%02d/%02d/%d"), it->day+1, it->month+1, it->year)); if (it->amount < 0) _grid->SetCellValue(curLine, DEBIT, wxString::Format(wxT("%.2lf"), -it->amount)); else _grid->SetCellValue(curLine, CREDIT, wxString::Format(wxT("%.2lf"), it->amount)); _grid->SetCellEditor(curLine, DEBIT, new wxGridCellFloatEditor(-1, 2)); _grid->SetCellEditor(curLine, CREDIT, new wxGridCellFloatEditor(-1, 2)); categoryEditor = new wxGridCellChoiceEditor(user->GetCategoriesNumber()+1, _categories, false); _grid->SetCellEditor(curLine, CATEGORY, categoryEditor); _grid->SetCellValue(curLine, CATEGORY, user->GetCategoryName(it->category)); accountEditor = new wxGridCellChoiceEditor(user->_accounts.size()+1, _accounts, false); _grid->SetCellEditor(curLine, ACCOUNT, accountEditor); _grid->SetCellValue(curLine, ACCOUNT, user->GetAccountName(it->account)); it++; } _grid->AppendRows(); curLine++; SET_ROW_COLOR(curLine, OWN_GREEN); categoryEditor = new wxGridCellChoiceEditor(user->_preferences._categories.size()+1, _categories, false); _grid->SetCellEditor(curLine, CATEGORY, categoryEditor); _grid->SetCellEditor(curLine, DEBIT, new wxGridCellFloatEditor(-1, 2)); _grid->SetCellEditor(curLine, CREDIT, new wxGridCellFloatEditor(-1, 2)); accountEditor = new wxGridCellChoiceEditor(user->_accounts.size()+1, _accounts, false); _grid->SetCellEditor(curLine, ACCOUNT, accountEditor); _grid->AutoSizeColumn(CATEGORY, false); _grid->AutoSizeColumn(ACCOUNT, false); UpdateChart(); Fit(); SetMinSize(GetSize()); } void AccountPanel::UpdateChart() { int i; User* user = _kiss->GetUser(); std::list::iterator it; //_dataset->BeginUpdate(); for (i=0; iGetCategoriesNumber(); i++) _categoriesValues[i] = 0.0; // _categoriesValues[0] += 1.0; // _categoriesValues[1] += 2.0; // _categoriesValues[2] += 3.0; for (it=_curOperations->begin(); it!=_curOperations->end(); it++) { if (it->amount > 0) _categoriesValues[_categoriesIndexes[user->GetCategoryName(it->category)]] += it->amount ; //std::cout << _categoriesValues[_categoriesIndexes[it->category]] << "\n"; } //_dataset->EndUpdate(); _pie->DatasetChanged(_dataset); }