#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); wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL); wxChartPanel* chart ; int i ; User* user = _kiss->GetUser(); std::map::iterator accountIt; std::map::iterator it; DEFAULT_FONT(font); 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] = 0.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); _statsGrid = new wxGrid(this, -1); _statsGrid->CreateGrid(user->GetCategoriesNumber()+1+6, 2); _statsGrid->SetColLabelSize(0); _statsGrid->SetRowLabelSize(0); _statsGrid->EnableEditing(false); _statsGrid->SetDefaultCellFont(font); _statsGrid->SetCellValue(TOTAL_CREDIT, 0, _("Total Credit")); _statsGrid->SetCellValue(TOTAL_DEBIT, 0, _("Total Debit")); _statsGrid->AutoSizeColumn(0, false); for(i=0; iGetCategoriesNumber()+1; i++) _statsGrid->SetCellValue(CATS_STATS+i, 0, _categories[i]); font.SetWeight(wxFONTWEIGHT_BOLD); _statsGrid->SetCellFont(CUR_CREDIT, 0, font); _statsGrid->SetCellFont(CUR_DEBIT, 0, font); _statsGrid->SetCellFont(REMAINS, 0, font); _statsGrid->SetCellFont(REMAINS, 1, font); _statsGrid->SetCellValue(CUR_CREDIT, 0, _("Cur Credit")); _statsGrid->SetCellValue(CUR_DEBIT, 0, _("Cur Debit")); _statsGrid->SetCellValue(REMAINS, 0, _("Remains")); chart = new wxChartPanel(this); chart->SetChart(new Chart(_pie, _("Cost repartition"))); chart->Fit(); chart->Layout(); chart->SetMinSize(// chart->GetSize() wxSize(200,250)); hbox->Add(&_tree, 0); hbox->Add(_grid, 0); vbox->Add(_statsGrid, 0); vbox->Add(-1, 10); vbox->Add(chart, 0); hbox->Add(-1, 10); hbox->Add(vbox, 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(); DEFAULT_FONT(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}; } ; */ for (;it->fix_cost && it != _curOperations->end(); it++) { _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)); } _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->end(); 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)); } _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); UpdateStats(); Fit(); SetMinSize(GetSize()); } void AccountPanel::UpdateStats() { int i; User* user = _kiss->GetUser(); std::list::iterator it; double curCredit, curDebit, totalCredit, totalDebit, remains; wxDateTime curDate; curDate.SetToCurrent(); curCredit = curDebit = totalCredit = totalDebit = 0.0; for (i=0; iGetCategoriesNumber()+1; i++) _categoriesValues[i] = 0.0; for (it=_curOperations->begin(); it!=_curOperations->end(); it++) { if (it->amount > 0) { if (curDate.GetDay() >= it->day && curDate.GetMonth() >= (int)it->month && curDate.GetYear() >= (int)it->year) curCredit += it->amount; totalCredit += it->amount; } else { _categoriesValues[_categoriesIndexes[user->GetCategoryName(it->category)]] += -it->amount ; if (curDate.GetDay() >= it->day && curDate.GetMonth() >= (int)it->month && curDate.GetYear() >= (int)it->year) curDebit += -it->amount; totalDebit += -it->amount; } } remains = totalCredit - totalDebit; _statsGrid->SetCellValue(CUR_CREDIT, 1, wxString::Format(wxT("%.2lf"), curCredit)); _statsGrid->SetCellValue(CUR_DEBIT, 1, wxString::Format(wxT("%.2lf"), curDebit)); _statsGrid->SetCellValue(TOTAL_CREDIT, 1, wxString::Format(wxT("%.2lf"), totalCredit)); _statsGrid->SetCellValue(TOTAL_DEBIT, 1, wxString::Format(wxT("%.2lf"), totalDebit)); _statsGrid->SetCellTextColour(REMAINS, 1, (remains >= 0) ? wxColor(0x00, 0xFF, 0x00) : wxColor(0xFF, 0x00, 0x00)); _statsGrid->SetCellValue(REMAINS, 1, wxString::Format(wxT("%.2lf"), remains)); for(i=0; iGetCategoriesNumber()+1; i++) _statsGrid->SetCellValue(CATS_STATS+i, 1, wxString::Format(wxT("%.2lf"), _categoriesValues[i])); _pie->DatasetChanged(_dataset); }