/* 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 "grid/wxGridCellBitmapRenderer.hpp" // #include "GenerateDialog.hpp" #include #include #include "AccountPanel.hpp" enum {ACCOUNT_NUMBER, ACCOUNT_NAME, ACCOUNT_INIT, ACCOUNT_CUR, ACCOUNT_FINAL, NUMBER_COLS_ACCOUNTS}; enum {CUR_CREDIT, CUR_DEBIT, TOTAL_CREDIT, TOTAL_DEBIT, BALANCE, STATS_ROW, CATS_STATS, NON_FIX}; enum {VIRTUAL_MODE=0, REAL_MODE, CHECK_MODE}; AccountPanel::AccountPanel(KissCount* kiss, wxUI *parent) : KissPanel(kiss, parent), _curMonth(-1), _curYear(-1) { QHBoxLayout *hbox = new QHBoxLayout; QHBoxLayout *hbox2 = new QHBoxLayout; QVBoxLayout *vbox = new QVBoxLayout; QVBoxLayout *vbox2 = new QVBoxLayout; QVBoxLayout *vbox3 = new QVBoxLayout; // wxChartPanel* chart ; int i ; User* user = _kiss->GetUser(); std::vector::iterator accountIt; std::vector::iterator categoryIt; DEFAULT_FONT(font); int nbCategories; setLayout(hbox); _tree = new QTreeWidget(this); _tree->headerItem()->setHidden(true); _tree->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); // ColorScheme* colorScheme = new ColorScheme(wxUI::categoryColors, WXSIZEOF(wxUI::categoryColors)); _pie = new PieView; _calendar = new QCalendarWidget(this); _calendar->setGridVisible(false); _calendar->setFirstDayOfWeek(Qt::Monday); _calendar->setNavigationBarVisible(false); _calendar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); _accounts = new QString[user->GetAccountsNumber()]; for (i=0, accountIt = user->_accounts.begin(); accountIt != user->_accounts.end(); accountIt++, i++) _accounts[i] = accountIt->name; _categories = new QString[user->GetCategoriesNumber()] ; for(i=0, categoryIt = user->_categories.begin(); categoryIt != user->_categories.end(); categoryIt++, i++) { _categories[i] = _(categoryIt->name.toStdString().c_str()) ; _categoriesIndexes[categoryIt->name] = i; } nbCategories = (user->GetCategoriesNumber() <= wxUI::MAX_CATEGORY) ? user->GetCategoriesNumber() : wxUI::MAX_CATEGORY; _dataset = new QStandardItemModel(user->GetCategoriesNumber(), 2, this); _categoriesValues = new double[user->GetCategoriesNumber()]; for(i=0; iGetCategoriesNumber(); i++) { _categoriesValues[i] = 0.0; _dataset->setData(_dataset->index(i, 0, QModelIndex()), _categories[i]); _dataset->setData(_dataset->index(i, 1, QModelIndex()), 0.0); _dataset->setData(_dataset->index(i, 0, QModelIndex()), wxUI::categoryColors[i], Qt::DecorationRole); } // _dataset = new CategorySimpleDataset(_categories, nbCategories); // _dataset->AddSerie(_("Serie 1"), _categoriesValues, nbCategories); // _dataset->SetRenderer(new CategoryRenderer(*colorScheme)); // _pie->SetDataset(_dataset); // _pie->SetColorScheme(colorScheme); _pie->setModel(_dataset); _pie->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); // _pie->SetLegend(new Legend(wxBOTTOM, wxCENTER)); // _grid = new GridAccount(_kiss, this, OPS_GRID_ID, true, true, true); _accountsGrid = new QTableWidget(this); _accountsGrid->setColumnCount(NUMBER_COLS_ACCOUNTS); _accountsGrid->setRowCount(0); _accountsGrid->verticalHeader()->setHidden(true); _accountsGrid->setHorizontalHeaderItem(ACCOUNT_NUMBER, new QTableWidgetItem(_("Account number"))); _accountsGrid->setHorizontalHeaderItem(ACCOUNT_NAME, new QTableWidgetItem(_("Account name"))); _accountsGrid->setHorizontalHeaderItem(ACCOUNT_INIT, new QTableWidgetItem(_("Initial value"))); _accountsGrid->setHorizontalHeaderItem(ACCOUNT_CUR, new QTableWidgetItem(_("Current value"))); _accountsGrid->setHorizontalHeaderItem(ACCOUNT_FINAL, new QTableWidgetItem(_("Final value"))); _accountsGrid->resizeColumnsToContents(); _accountsGrid->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); for(i=0; ihorizontalHeaderItem(i)->font(); font.setBold(true); _accountsGrid->horizontalHeaderItem(i)->setFont(font); } _statsGrid = new QTableWidget(this); _statsGrid->verticalHeader()->setHidden(true); _statsGrid->horizontalHeader()->setHidden(true); _statsGrid->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); // chart = new wxChartPanel(this); // chart->SetChart(new Chart(_pie, _("Cost repartition"))); // chart->Fit(); // chart->Layout(); // chart->SetMinSize(// chart->GetSize() // wxSize(200,300)); QGroupBox *groupBox = new QGroupBox(_("Mode")); _virtual = new QRadioButton(_("Virtual")); _real = new QRadioButton(_("Real")); _check = new QRadioButton(_("Check")); _virtual->setChecked(true); { QVBoxLayout *vbox = new QVBoxLayout; vbox->addWidget(_virtual); vbox->addWidget(_real); vbox->addWidget(_check); groupBox->setLayout(vbox); } connect(_virtual, SIGNAL(clicked()), this, SLOT(OnModeChange())); connect(_real, SIGNAL(clicked()), this, SLOT(OnModeChange())); connect(_check, SIGNAL(clicked()), this, SLOT(OnModeChange())); // _tree.SetIndent(5); // wxButton* buttonGroup = new wxButton(this, GROUP_ID, _("Group")); // wxButton* buttonUnGroup = new wxButton(this, UNGROUP_ID, _("UnGroup")); // wxButton* buttonUpdateNextMonths = new wxButton(this, UPDATE_NEXT_MONTHS_ID, _("Update next months")); vbox3->addWidget(_tree); // vbox3->Add(buttonUpdateNextMonths, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10); // vbox3->Add(buttonGroup, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10); // vbox3->Add(buttonUnGroup, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10); vbox3->addStretch(1); vbox3->addWidget(groupBox); hbox->addLayout(vbox3); hbox2->addWidget(_accountsGrid, 2); hbox2->addWidget(_calendar); vbox2->addLayout(hbox2); // vbox2->Add(_grid, 0, wxGROW|wxALL, 2); hbox->addLayout(vbox2); vbox->addWidget(_statsGrid); vbox->addWidget(_pie); hbox->addLayout(vbox); ChangeUser(); layout(); // 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); } AccountPanel::~AccountPanel() { delete[] _categoriesValues; delete[] _categories; delete[] _accounts; } KissPanel* AccountPanel::CreatePanel() { return new AccountPanel(_kiss, _wxUI); } QPushButton* AccountPanel::GetButton() { if (!_KissButton) { _KissButton = new QPushButton(QIcon(ACCOUNT_ICON), "", this); _KissButton->setFixedSize(128, 128); _KissButton->setIconSize(QSize(128, 128)); } return _KissButton; } QString AccountPanel::GetToolTip() { return _("Operations"); } void AccountPanel::InitStatsGrid(User* user) { int i; int nb_categories = user->GetCategoriesNumber(); QFont font; if (!_statsGrid->rowCount()) { _statsGrid->setColumnCount(2); //_statsGrid->EnableEditing(false); } else { _statsGrid->clear(); } _statsGrid->setRowCount(nb_categories+CATS_STATS+1); // Headers + blank + categories + non fix // _statsGrid->SetDefaultCellFont(font); _statsGrid->setItem(TOTAL_CREDIT, 0, new QTableWidgetItem(_("Total Credit"))); _statsGrid->setItem(TOTAL_DEBIT, 0, new QTableWidgetItem(_("Total Debit"))); font = _statsGrid->item(TOTAL_DEBIT, 0)->font(); for(i=0; isetItem(CATS_STATS+i+1, 0, new QTableWidgetItem(_categories[i])); _statsGrid->setItem(CATS_STATS+i+1, 1, new QTableWidgetItem("")); _statsGrid->item(CATS_STATS+i+1, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); } else { _statsGrid->setItem(CATS_STATS+i, 0, new QTableWidgetItem(_categories[i])); _statsGrid->setItem(CATS_STATS+i, 1, new QTableWidgetItem("")); _statsGrid->item(CATS_STATS+i, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); } } font.setBold(true); _statsGrid->setItem(CUR_CREDIT, 0, new QTableWidgetItem(_("Cur Credit"))); _statsGrid->setItem(CUR_DEBIT, 0, new QTableWidgetItem(_("Cur Debit"))); _statsGrid->setItem(TOTAL_CREDIT, 0, new QTableWidgetItem(_("Total Credit"))); _statsGrid->setItem(TOTAL_DEBIT, 0, new QTableWidgetItem(_("Total Debit"))); _statsGrid->setItem(BALANCE, 0, new QTableWidgetItem(_("Balance"))); _statsGrid->setItem(NON_FIX, 0, new QTableWidgetItem(_("Non fix"))); _statsGrid->setItem(CUR_CREDIT, 1, new QTableWidgetItem(_(""))); _statsGrid->setItem(CUR_DEBIT, 1, new QTableWidgetItem(_(""))); _statsGrid->setItem(TOTAL_CREDIT, 1, new QTableWidgetItem(_(""))); _statsGrid->setItem(TOTAL_DEBIT, 1, new QTableWidgetItem(_(""))); _statsGrid->setItem(BALANCE, 1, new QTableWidgetItem(_(""))); _statsGrid->setItem(NON_FIX, 1, new QTableWidgetItem(_(""))); _statsGrid->item(CUR_DEBIT, 0)->setFont(font); _statsGrid->item(CUR_CREDIT, 0)->setFont(font); _statsGrid->item(BALANCE, 0)->setFont(font); _statsGrid->item(BALANCE, 1)->setFont(font); _statsGrid->item(CUR_CREDIT, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); _statsGrid->item(CUR_DEBIT, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); _statsGrid->item(TOTAL_CREDIT, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); _statsGrid->item(TOTAL_DEBIT, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); _statsGrid->item(BALANCE, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); _statsGrid->item(NON_FIX, 1)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); _accountsGrid->resizeColumnToContents(0); } void AccountPanel::ChangeUser() { User* user = _kiss->GetUser(); int curYear = -1; QDate curDate = QDate::currentDate(); QTreeWidgetItem* curNode; std::map > ops; std::map >::iterator it; ops = _kiss->GetAllOperations(); InitStatsGrid(user); _tree->clear(); if (ops.size()) { for(it = ops.begin(); it != ops.end(); it++) { if ((int)it->first <= curDate.year()) curYear = it->first; curNode = new QTreeWidgetItem(QStringList(QString::number(it->first))); _tree->addTopLevelItem(curNode); } layout(); if (curYear != -1) { _tree->setCurrentItem(curNode); LoadYear(curYear); } } else { curNode = new QTreeWidgetItem(QStringList(QString::number(curDate.year()))); _tree->addTopLevelItem(curNode); layout(); } } void AccountPanel::LoadYear(int year, bool showMonth) { User* user = _kiss->GetUser(); int curMonth = -1; QDate curDate = QDate::currentDate(); QTreeWidgetItem* parentNode, *curMonthNode; std::map > ops ; std::vector::iterator it; if (user->_operations[year] && _tree->currentItem()->childCount()) { if (showMonth) ShowMonth(-1, year); return; } _curYear = year ; _kiss->LoadYear(year); ops = _kiss->GetAllOperations(); parentNode = _tree->currentItem(); for (it = ops[year].begin(); it != ops[year].end(); it++) { if (curMonth == -1 || (year == curDate.year() && *it <= curDate.month())) { curMonth = *it; curMonthNode = new QTreeWidgetItem(QStringList(wxUI::months[*it])); parentNode->addChild(curMonthNode); } else _tree->topLevelItem(0)->addChild(new QTreeWidgetItem(QStringList(wxUI::months[*it]))); } _tree->expandItem(parentNode); layout(); if (showMonth) { _tree->setCurrentItem(curMonthNode); ShowMonth(curMonth, year); } _wxUI->layout(); } void AccountPanel::ShowMonth(int month, int year) { // std::vector operations; // _fixCosts = 0; User* user = _kiss->GetUser(); // DEFAULT_FONT(font); // std::vector::iterator categoryIt; std::map >::iterator monthIt; QDate curDate = QDate::currentDate(); QDate dateStart = QDate::currentDate(); QDate dateEnd = QDate::currentDate(); if (month == -1) { // Near month if (year == curDate.year()) { for (monthIt = user->_operations[year]->begin(); monthIt != user->_operations[year]->end(); monthIt++) { if ((int)monthIt->first <= curDate.month()) { month = monthIt->first; } } } // First month if (month == -1) { monthIt = user->_operations[year]->begin(); if (user->_operations[year]->size() == 0 && year == curDate.year()) month = curDate.month(); else month = monthIt->first; } } _curYear = year; _curMonth = month; _wxUI->setWindowTitle(user->_name + " - " + wxUI::months[month-1] + " " + QString::number(year)); // if (_grid->GetNumberRows() > 1) // _grid->DeleteRows(1, _grid->GetNumberRows()-1); // Operations are ordered _curOperations = &((*user->_operations[year])[month]); // _grid->LoadOperations(_curOperations, _curMonth, _curYear); InitAccountsGrid(user, month, year); dateStart.setDate(dateStart.year(), dateStart.month(), 1); dateEnd.setDate(dateEnd.year(), dateEnd.month(), dateStart.daysInMonth()); _calendar->setDateRange(dateStart, dateEnd); if ((curDate.month()-1) == month && curDate.year() == year) _calendar->showToday(); else if ((curDate.month()-1) > month || curDate.year() > year) _calendar->setSelectedDate (dateEnd) ; else if ((curDate.month()-1) < month || curDate.year() < year) _calendar->setSelectedDate(dateStart) ; UpdateStats(); layout(); } void AccountPanel::InitAccountsGrid(User* user, int month, int year) { std::vector::iterator it; int curLine = 0; double value; int i, a; QTableWidgetItem* item; QString v; QFont font; if (_accountsGrid->rowCount()) _accountsGrid->clear(); _accountsGrid->setRowCount(user->_accounts.size()); for (i=0, it = user->_accounts.begin(); it != user->_accounts.end(); i++, it++, curLine++) { if (it->shared) _accountsGrid->setItem(curLine, ACCOUNT_NUMBER, new QTableWidgetItem(it->number + "*")); else _accountsGrid->setItem(curLine, ACCOUNT_NUMBER, new QTableWidgetItem(it->number)); _accountsGrid->setItem(curLine, ACCOUNT_NAME, new QTableWidgetItem(it->name)); value = _kiss->GetAccountAmount(it->id, month, year); // _accountsGrid->SetCellEditor(curLine, ACCOUNT_INIT, new wxGridCellFloatEditor(-1, 2)); // _accountsGrid->setItem(curLine, ACCOUNT_INIT, wxString::Format(wxT("%.2lf"), value)); _accountsGrid->setItem(curLine, ACCOUNT_INIT, new QTableWidgetItem(v.sprintf("%.2lf", value))); _accountsGrid->setItem(curLine, ACCOUNT_CUR, new QTableWidgetItem("")); _accountsGrid->setItem(curLine, ACCOUNT_FINAL, new QTableWidgetItem("")); for (a=0; aitem(curLine, a); if (a != ACCOUNT_INIT) item->setFlags(item->flags() & ~Qt::ItemIsEditable); if (a == ACCOUNT_CUR) { font = item->font(); font.setBold(true); item->setFont(font); } } _accountsInitValues[it->id] = value; _accountsGrid->item(curLine, ACCOUNT_INIT)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); _accountsGrid->item(curLine, ACCOUNT_CUR)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); _accountsGrid->item(curLine, ACCOUNT_FINAL)->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); } _accountsGrid->resizeColumnsToContents(); } void AccountPanel::UpdateStats() { int i; User* user = _kiss->GetUser(); std::vector::iterator it; double curCredit, curDebit, totalCredit, totalDebit, balance, value, value2, percents; std::map curAccountAmount, finalAccountAmount; std::map::iterator doubleIt; std::map::iterator intIt; std::vector::iterator accountIt; unsigned int day; int mode; std::map* notChecked = 0; std::map* virtuals = 0; Account account; Operation op; bool blocked_account ; QString v; if (_virtual->isChecked()) mode = VIRTUAL_MODE; else if (_real->isChecked()) mode = REAL_MODE; else if (_check->isChecked()) mode = CHECK_MODE; curCredit = curDebit = totalCredit = totalDebit = percents = 0.0; if (mode == CHECK_MODE) notChecked = _kiss->GetNotChecked(_curMonth, _curYear); if (mode == REAL_MODE || mode == CHECK_MODE) virtuals = _kiss->GetVirtualAmount(_curMonth, _curYear); day = _calendar->selectedDate().day()-1; for (i=0; iGetCategoriesNumber(); i++) _categoriesValues[i] = 0.0; for (doubleIt=_accountsInitValues.begin(); doubleIt!=_accountsInitValues.end(); doubleIt++) { curAccountAmount[doubleIt->first] = _accountsInitValues[doubleIt->first]; finalAccountAmount[doubleIt->first] = _accountsInitValues[doubleIt->first]; if (mode == REAL_MODE || mode == CHECK_MODE) { curAccountAmount[doubleIt->first] += -(*virtuals)[doubleIt->first]; finalAccountAmount[doubleIt->first] += -(*virtuals)[doubleIt->first]; } } for (it=_curOperations->begin(); it!=_curOperations->end(); it++) { if (it->meta) continue; op = *it; blocked_account = false; // A credit on a blocked account must be considered as a debit if (op.transfert && op.amount > 0) { account = user->GetAccount(op.account); if (account.blocked) { op.amount = -op.amount; op.transfert = 0; blocked_account = true; } } switch(mode) { case VIRTUAL_MODE: if (op.amount >= 0) { if (!op.transfert) totalCredit += op.amount; if (day >= op.day) { if (!op.transfert) curCredit += op.amount; curAccountAmount[op.account] += op.amount; } finalAccountAmount[op.account] += op.amount; } else { if (!op.transfert && user->GetCategoryName(op.category) != _("Unknown")) _categoriesValues[_categoriesIndexes[user->GetCategoryName(op.category)]] += -op.amount ; if (!op.transfert) totalDebit += -op.amount; if (blocked_account) op.amount = -op.amount; if (day >= op.day) { if (!op.transfert) curDebit += -op.amount; curAccountAmount[op.account] += op.amount; } finalAccountAmount[op.account] += op.amount; } break; case REAL_MODE: if (op.amount >= 0) { if (!op.transfert) totalCredit += op.amount; if (day >= op.day) { if (!op.transfert) curCredit += op.amount; if (!op._virtual) curAccountAmount[op.account] += op.amount; } if (!op._virtual) finalAccountAmount[op.account] += op.amount; } else { if (!op.transfert && user->GetCategoryName(op.category) != _("Unknown")) _categoriesValues[_categoriesIndexes[user->GetCategoryName(op.category)]] += -op.amount ; if (!op.transfert && !op._virtual) totalDebit += -op.amount; if (blocked_account) op.amount = -op.amount; if (day >= op.day) { if (!op.transfert && !op._virtual) curDebit += -op.amount; if (!op._virtual) curAccountAmount[op.account] += op.amount; } if (!op._virtual) finalAccountAmount[op.account] += op.amount; } break; case CHECK_MODE: if (op.amount >= 0) { if (!op.transfert && !op._virtual) totalCredit += op.amount; if (day >= op.day) { if (!op.transfert && !op._virtual) curCredit += op.amount; if (op.checked && !op._virtual) curAccountAmount[op.account] += op.amount; } if (op.checked && !op._virtual) finalAccountAmount[op.account] += op.amount; } else { if (!op.transfert && user->GetCategoryName(op.category) != _("Unknown")) _categoriesValues[_categoriesIndexes[user->GetCategoryName(op.category)]] += -op.amount ; if (!op.transfert && !op._virtual) totalDebit += -op.amount; if (blocked_account) op.amount = -op.amount; if (day >= op.day) { if (!op.transfert && !op._virtual) curDebit += -op.amount; if (op.checked && !op._virtual) curAccountAmount[op.account] += op.amount; } if (op.checked && !op._virtual) finalAccountAmount[op.account] += op.amount; } break; } } balance = totalCredit - totalDebit; _statsGrid->item(CUR_CREDIT, 1)->setText(v.sprintf("%.2lf", curCredit)); _statsGrid->item(CUR_DEBIT, 1)->setText(v.sprintf("%.2lf", curDebit)); _statsGrid->item(TOTAL_CREDIT, 1)->setText(v.sprintf("%.2lf", totalCredit)); _statsGrid->item(TOTAL_DEBIT, 1)->setText(v.sprintf("%.2lf", totalDebit)); _statsGrid->item(BALANCE, 1)->setText(v.sprintf("%.2lf", balance)); _statsGrid->item(BALANCE, 1)->setForeground((balance >= 0) ? QBrush(Qt::green) : QBrush(Qt::red)); for(i=0; iGetCategoriesNumber(); i++) { if (totalDebit != 0) percents = ((double) (_categoriesValues[i]*100))/totalDebit; else percents = 0.0; if (i) _statsGrid->item(CATS_STATS+i+1, 1)->setText(v.sprintf("%.2lf (%02d %%)", _categoriesValues[i], (int)percents)); else _statsGrid->item(CATS_STATS+i, 1)->setText(v.sprintf("%.2lf (%02d %%)", _categoriesValues[i], (int)percents)); _dataset->setData(_dataset->index(i, 1, QModelIndex()), _categoriesValues[i]); } value = totalDebit - _categoriesValues[0]; if (totalDebit != 0) percents = ((double) (value*100))/totalDebit; else percents = 0.0; _statsGrid->item(NON_FIX, 1)->setText(v.sprintf("%.2lf (%02d %%)", value, (int)percents)); for (i=0, accountIt=user->_accounts.begin(); accountIt!=user->_accounts.end(); accountIt++, i++) { if (mode != CHECK_MODE) { value = _accountsInitValues[accountIt->id]; if (mode == REAL_MODE) value -= (*virtuals)[accountIt->id]; _accountsGrid->item(i, ACCOUNT_INIT)->setText(v.sprintf("%.2lf", value)); value = curAccountAmount[accountIt->id]; _accountsGrid->item(i, ACCOUNT_CUR)->setText(v.sprintf("%.2lf", value)); _accountsGrid->item(i, ACCOUNT_CUR)->setForeground((value >= 0) ? QBrush(Qt::black) : QBrush(Qt::red)); value = finalAccountAmount[accountIt->id]; _accountsGrid->item(i, ACCOUNT_FINAL)->setText(v.sprintf("%.2lf", value)); } else { value = _accountsInitValues[accountIt->id] - (*virtuals)[accountIt->id]; value2 = (*notChecked)[accountIt->id]; _accountsGrid->item(i, ACCOUNT_INIT)->setText(v.sprintf("%.2lf (%.2lf)", value, value-value2)); value = curAccountAmount[accountIt->id]; _accountsGrid->item(i, ACCOUNT_CUR)->setText(v.sprintf("%.2lf (%.2lf)", value, value-value2)); _accountsGrid->item(i, ACCOUNT_CUR)->setForeground((value >= 0) ? QBrush(Qt::black) : QBrush(Qt::red)); value = finalAccountAmount[accountIt->id]; _accountsGrid->item(i, ACCOUNT_FINAL)->setText(v.sprintf("%.2lf (%.2lf)", value, value-value2)); } } _accountsGrid->resizeColumnToContents(ACCOUNT_INIT); _accountsGrid->resizeColumnToContents(ACCOUNT_CUR); _accountsGrid->resizeColumnToContents(ACCOUNT_FINAL); if (notChecked) delete notChecked; if (virtuals) delete virtuals; _statsGrid->resizeColumnToContents(1); layout(); } void AccountPanel::OnOperationModified() { UpdateStats(); layout(); } void AccountPanel::OnAccountModified() { // User* user = _kiss->GetUser(); // int row = event.GetRow(); // double amount; // wxString id = user->GetAccountId(_accounts[row]); // static bool inModification = false; // if (inModification) return ; // inModification = true; // _accountsGrid->GetCellValue(row, event.GetCol()).ToDouble(&amount); // _kiss->SetAccountAmount(id, _curMonth, _curYear, amount); // _accountsInitValues[id] = amount; // UpdateStats(); // inModification = false; } void AccountPanel::OnTreeRightClick() { // wxMenu menu(0); // menu.Append(MENU_GENERATE_ID, _("Generate month")); // menu.AppendSeparator(); // if (_tree.GetCount() > 1) // menu.Append(MENU_DELETE_ID, _("Delete")); // PopupMenu(&menu, event.GetPoint()); } void AccountPanel::OnTreeChange() { // int month=-1, year; // int i; // wxString monthString; // static bool inModification = false ; // if (inModification) return; // inModification = true; // monthString = _tree.GetItemText(event.GetItem()); // for (i=0; i<12; i++) // if (monthString == wxUI::months[i]) // { // month = i; // break; // } // if (month == -1) // { // year = wxAtoi(monthString); // // Error // if (year == 0) // { // inModification = false; // return; // } // if (year == _curYear) // { // inModification = false; // return; // } // // _tree.CollapseAll(); // // _tree.Expand(event.GetItem()); // LoadYear(year, false); // } // else // { // year = wxAtoi(_tree.GetItemText(_tree.GetItemParent(event.GetItem()))); // // Error // if (year == 0) // { // inModification = false; // return; // } // if (year != _curYear || month != _curMonth) // { // ShowMonth(month, year); // } // } // inModification = false; } void AccountPanel::GetTreeSelection(int* month, int* year) { // wxString monthString; // int i; // *month = -1; *year = -1; // monthString = _tree.GetItemText(_tree.GetSelection()); // for (i=0; i<12; i++) // if (monthString == wxUI::months[i]) // { // *month = i; // break; // } // if (*month == -1) // { // *year = wxAtoi(monthString); // // Error // if (year == 0) // { // *month = -1; // *year = -1; // return; // } // } // else // { // *year = wxAtoi(_tree.GetItemText(_tree.GetItemParent(_tree.GetSelection()))); // // Error // if (year == 0) // { // *month = -1; // *year = -1; // return; // } // } } void AccountPanel::OnMenuGenerate() { // int month, year; // wxDateTime curDate; // curDate.SetToCurrent(); // GetTreeSelection(&month, &year); // if (month == -1 && year == curDate.GetYear()) // { // month = _curMonth; // } // GenerateDialog g(_kiss, _wxUI, month, year); // g.ShowModal(); } void AccountPanel::OnMenuDelete() { // int month, year; // wxString message; // wxTreeItemId curNode, node ; // std::map > ops ; // GetTreeSelection(&month, &year); // ops = _kiss->GetAllOperations(); // if (ops.size() == 1 && (ops[year].size() == 1 || month == -1)) // { // wxMessageBox(_("It must be at least one month !"), _("Error"), wxICON_ERROR | wxOK); // return; // } // message = _("Are you sure want to delete "); // if (month != -1) // message += wxUI::months[month] + wxT(" "); // message += wxString::Format(wxT("%d"), year); // message += _(" operations ?"); // wxMessageDialog dialog(_wxUI, message, wxT("KissCount"), wxYES_NO); // if (dialog.ShowModal() == wxID_NO) // return; // curNode = _tree.GetSelection(); // if (ops[year].size() == 1 && month != -1) // curNode = _tree.GetItemParent(curNode); // _kiss->DeleteOperations(month, year); // node = _tree.GetNextSibling(curNode); // if (!node.IsOk()) // node = _tree.GetPrevSibling(curNode); // _tree.Delete(curNode); // if (!node.IsOk()) // ChangeUser(); // else // { // _tree.SelectItem(node); // GetTreeSelection(&month, &year); // if (month == -1) // month = ops[year][0]; // ShowMonth(month, year); // } // _wxUI->NeedReload(); } void AccountPanel::GenerateMonth(int month, int year) { // wxTreeItemId root, years, node ; // wxTreeItemIdValue cookie; // wxString monthString, yearString; // std::map > ops ; // std::vector::iterator it ; // int i; // root = _tree.GetRootItem(); // yearString = wxString::Format(wxT("%d"), year); // monthString = wxUI::months[month]; // ops = _kiss->GetAllOperations(); // if (_tree.GetChildrenCount(root, true) < 1) // { // node = _tree.AppendItem(root, yearString); // node = _tree.AppendItem(node, monthString); // _tree.SelectItem(node, true); // ShowMonth(month, year); // return ; // } // years = _tree.GetFirstChild(root, cookie); // while (years.IsOk()) // { // if (_tree.GetItemText(years) == yearString) // break; // if (wxAtoi(_tree.GetItemText(years)) > year) // { // years = _tree.GetPrevSibling(years); // if (!years.IsOk()) // years = _tree.PrependItem(root, yearString); // else // years = _tree.InsertItem(root, years, yearString); // break; // } // years = _tree.GetNextSibling(years); // } // if (!years.IsOk()) // { // years = _tree.GetFirstChild(root, cookie); // if (wxAtoi(_tree.GetItemText(years)) > year) // years = _tree.PrependItem(root, yearString); // else // years = _tree.AppendItem(root, yearString); // } // if (!_tree.GetChildrenCount(years, true)) // node = _tree.AppendItem(years, monthString); // else // { // for(i=0, it = ops[year].begin(); // it != ops[year].end(); // it++, i++) // { // if (*it > month) // break; // } // if (it == ops[year].end()) // years = _tree.AppendItem(years, monthString); // else // years = _tree.InsertItem(years, i-1, monthString); // } // _tree.SelectItem(node, true); // ShowMonth(month, year); // _wxUI->NeedReload(); } void AccountPanel::OnShow() { // if (_curMonth != -1) // _wxUI->SetTitle(_kiss->GetUser()->_name + wxT(" - ") + wxUI::months[_curMonth] + wxT(" ") + wxString::Format(wxT("%d"), _curYear)); // else // _wxUI->SetTitle(_kiss->GetUser()->_name); } void AccountPanel::OnCalendarChange() { UpdateStats(); } void AccountPanel::OnModeChange() { UpdateStats(); } void AccountPanel::OnGroup() { // _grid->Group(); } void AccountPanel::OnUnGroup() { // _grid->UnGroup(); } void AccountPanel::OnUpdateNextMonths() { // double* deltas, *cur_amounts, amount; // int i, a; // User* user = _kiss->GetUser(); // bool had_values, accounts_updated = false; // int last_month = 0, last_year = 0, account_updated = 0; // std::map > operations; // deltas = new double[user->_accounts.size()] ; // cur_amounts = new double[user->_accounts.size()] ; // operations = _kiss->GetAllOperations(); // if (_curMonth == 11) // { // last_month = 0; // last_year = _curYear+1; // } // else // { // last_month = _curMonth+1; // last_year = _curYear; // } // for (i=0; i<(int)user->_accounts.size(); i++) // { // deltas[i] = _kiss->GetAccountAmount(user->_accounts[i].id, _curMonth, _curYear); // cur_amounts[i] = deltas[i] += _kiss->CalcAccountAmount(user->_accounts[i].id, _curMonth, _curYear, &had_values); // for (a=0; a<(int)operations[last_year].size(); a++) // if (operations[last_year][a] == last_month) break; // if (a == (int)operations[last_year].size()) // { // deltas[i] = 0; // continue; // } // amount = _kiss->GetAccountAmount(user->_accounts[i].id, last_month, last_year); // deltas[i] -= amount; // account_updated++; // } // if (!account_updated) // goto end; // last_month = _curMonth; // last_year = _curYear; // while (1) // { // account_updated = 0; // if (last_month == 11) // { // last_month = 0; // last_year = last_year+1; // } // else // last_month++; // for (i=0; i<(int)user->_accounts.size(); i++) // { // if (deltas[i] == 0.0) continue; // amount = _kiss->GetAccountAmount(user->_accounts[i].id, last_month, last_year); // if ((cur_amounts[i] - amount) != deltas[i]) continue; // cur_amounts[i] = amount + deltas[i]; // _kiss->SetAccountAmount(user->_accounts[i].id, last_month, last_year, cur_amounts[i]); // cur_amounts[i] += _kiss->CalcAccountAmount(user->_accounts[i].id, last_month, last_year, &had_values); // account_updated++; // } // if (!account_updated) break; // accounts_updated = true; // } // if (last_month == 0) // { // last_month = 11; // last_year--; // } // else // last_month--; // end: // if (accounts_updated) // { // wxString message = _("Accounts updated until ") + wxUI::months[last_month]; // message += wxT(" ") + wxString::Format(wxT("%d"), last_year); // wxMessageBox(message, wxT("KissCount"), wxICON_INFORMATION | wxOK); // } // else // wxMessageBox(_("Any account updated !"), wxT("KissCount"), wxICON_INFORMATION | wxOK); // delete[] deltas; // delete[] cur_amounts; }