#include "PreferencesPanel.h" enum {ACCOUNT_NAME, ACCOUNT_NUMBER, ACCOUNT_SHARED, ACCOUNT_DEFAULT, ACCOUNT_DELETE, NUMBER_COLS_ACCOUNT}; enum {CATEGORY_NAME, CATEGORY_COLOR, CATEGORY_FONT, CATEGORY_DELETE, NUMBER_COLS_CATEGORY}; enum {CATEGORIES_GRID_ID=20, ACCOUNTS_GRID_ID}; BEGIN_EVENT_TABLE(PreferencesPanel, wxPanel) EVT_GRID_CMD_CELL_CHANGE(CATEGORIES_GRID_ID, PreferencesPanel::OnCategoryModified) EVT_GRID_CMD_CELL_CHANGE(ACCOUNTS_GRID_ID, PreferencesPanel::OnAccountModified) END_EVENT_TABLE() PreferencesPanel::PreferencesPanel(KissCount* kiss, wxUI *parent) : wxPanel(&(*parent)), _kiss(kiss), _wxUI(parent) { wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL); //wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL); wxStaticBox* staticUser, *staticAccount, *staticCategories; User* user = _kiss->GetUser(); wxGridBagSizer *gridBagSizer; wxStaticText* label; wxButton* buttonChangeName, *buttonChangePassword; wxStaticBoxSizer * staticBoxSizer; wxTextCtrl* name; SetSizer(vbox); staticUser = new wxStaticBox(this, -1, _("User")); staticAccount = new wxStaticBox(this, -1, _("Accounts")); staticCategories = new wxStaticBox(this, -1, _("Categories")); // User staticBoxSizer = new wxStaticBoxSizer (staticUser, wxVERTICAL); gridBagSizer = new wxGridBagSizer(10, 10); staticBoxSizer->Add(gridBagSizer); label = new wxStaticText(this, -1, _("Name")); gridBagSizer->Add(label, wxGBPosition(0, 0)); name = new wxTextCtrl(this, -1, user->_name); gridBagSizer->Add(name, wxGBPosition(0, 1)); buttonChangeName = new wxButton(this, -1, _("Change Name")); buttonChangePassword = new wxButton(this, -1, _("Change Password")); gridBagSizer->Add(buttonChangeName, wxGBPosition(1, 0)); gridBagSizer->Add(buttonChangePassword, wxGBPosition(1, 1)); vbox->Add(staticBoxSizer); vbox->Add(-1, 20); // Account staticBoxSizer = new wxStaticBoxSizer (staticAccount, wxVERTICAL); _accountsGrid = new wxGrid(this, ACCOUNTS_GRID_ID); InitAccounts(user); staticBoxSizer->Add(_accountsGrid); vbox->Add(staticBoxSizer); vbox->Add(-1, 20); // Categories staticBoxSizer = new wxStaticBoxSizer (staticCategories, wxVERTICAL); _categoriesGrid = new wxGrid(this, CATEGORIES_GRID_ID); staticBoxSizer->Add(_categoriesGrid); InitCategories(user); vbox->Add(staticBoxSizer); Fit(); SetMinSize(GetSize()); Hide(); } void PreferencesPanel::InitAccounts(User* user) { std::vector::iterator it; int curLine = 0; Account account ; DEFAULT_FONT(font); _accountsGrid->CreateGrid(0, NUMBER_COLS_ACCOUNT); _accountsGrid->SetRowLabelSize(0); _accountsGrid->SetColLabelValue(ACCOUNT_NAME, _("Name")); _accountsGrid->SetColLabelValue(ACCOUNT_NUMBER, _("Number")); _accountsGrid->SetColLabelValue(ACCOUNT_SHARED, _("Shared")); _accountsGrid->SetColLabelValue(ACCOUNT_DEFAULT, _("Default")); _accountsGrid->SetColLabelValue(ACCOUNT_DELETE, _("Delete")); _accountsGrid->SetDefaultCellFont(font); for (it = user->_accounts.begin(); it != user->_accounts.end(); it++, curLine++) { _accountsGrid->AppendRows(); _accountsGrid->SetCellValue(curLine, ACCOUNT_NAME, it->name); _accountsGrid->SetCellValue(curLine, ACCOUNT_NUMBER, it->number); _accountsGrid->SetCellRenderer(curLine, ACCOUNT_SHARED, new wxGridCellBoolRenderer ()); _accountsGrid->SetCellEditor(curLine, ACCOUNT_SHARED, new wxGridCellBoolEditor ()); _accountsGrid->SetCellRenderer(curLine, ACCOUNT_DEFAULT, new wxGridCellBoolRenderer ()); _accountsGrid->SetCellEditor(curLine, ACCOUNT_DEFAULT, new wxGridCellBoolEditor ()); _accountsGrid->SetCellRenderer(curLine, ACCOUNT_DELETE, new wxGridCellBoolRenderer ()); _accountsGrid->SetCellEditor(curLine, ACCOUNT_DELETE, new wxGridCellBoolEditor ()); _accountsGrid->SetCellValue(curLine, ACCOUNT_SHARED, (it->shared)?_("1"):_("0")); _accountsGrid->SetCellValue(curLine, ACCOUNT_DEFAULT, (it->_default)?_("1"):_("0")); _accountsGrid->SetCellAlignment(curLine, ACCOUNT_SHARED, wxALIGN_CENTRE, wxALIGN_CENTRE); _accountsGrid->SetCellAlignment(curLine, ACCOUNT_DEFAULT, wxALIGN_CENTRE, wxALIGN_CENTRE); _accountsGrid->SetCellAlignment(curLine, ACCOUNT_DELETE, wxALIGN_CENTRE, wxALIGN_CENTRE); } _accountsGrid->AutoSizeColumns(true); _accountsGrid->AppendRows(); _accountsGrid->SetReadOnly(curLine, ACCOUNT_SHARED, true); _accountsGrid->SetReadOnly(curLine, ACCOUNT_DEFAULT, true); _accountsGrid->SetReadOnly(curLine, ACCOUNT_DELETE, true); } #define SET_ROW_COLOR(row, color) for(int i=0; iSetCellBackgroundColour(row, i, color);\ } void PreferencesPanel::InitCategories(User* user) { std::vector::iterator it; int curLine = 0; DEFAULT_FONT(font); _categoriesGrid->CreateGrid(0, NUMBER_COLS_CATEGORY); _categoriesGrid->SetRowLabelSize(0); _categoriesGrid->SetDefaultCellFont(font); _categoriesGrid->SetColLabelValue(CATEGORY_NAME, _("Name")); _categoriesGrid->SetColLabelValue(CATEGORY_COLOR, _("Color")); _categoriesGrid->SetColLabelValue(CATEGORY_FONT, _("Font")); _categoriesGrid->SetColLabelValue(CATEGORY_DELETE, _("Delete")); for (it=user->_preferences._categories.begin(); it!=user->_preferences._categories.end(); it++, curLine++) { _categoriesGrid->AppendRows(); _categoriesGrid->SetCellValue(curLine, CATEGORY_NAME, it->name); SET_ROW_COLOR(curLine, it->color); if (curLine) { _categoriesGrid->SetCellRenderer(curLine, CATEGORY_DELETE, new wxGridCellBoolRenderer ()); _categoriesGrid->SetCellEditor(curLine, CATEGORY_DELETE, new wxGridCellBoolEditor ()); } _categoriesGrid->SetCellAlignment(curLine, CATEGORY_COLOR, wxALIGN_CENTRE, wxALIGN_CENTRE); _categoriesGrid->SetCellAlignment(curLine, CATEGORY_FONT, wxALIGN_CENTRE, wxALIGN_CENTRE); _categoriesGrid->SetCellAlignment(curLine, CATEGORY_DELETE, wxALIGN_CENTRE, wxALIGN_CENTRE); } _categoriesGrid->SetReadOnly(0, CATEGORY_DELETE, true); _categoriesGrid->AutoSizeColumns(true); _categoriesGrid->AppendRows(); _categoriesGrid->SetReadOnly(curLine, CATEGORY_COLOR, true); _categoriesGrid->SetReadOnly(curLine, CATEGORY_FONT, true); _categoriesGrid->SetReadOnly(curLine, CATEGORY_DELETE, true); SET_ROW_COLOR(curLine, OWN_GREEN); } void PreferencesPanel::OnAccountModified(wxGridEvent& event) { int op_complete = 2; wxString value ; struct Account new_account, account; User* user = _kiss->GetUser(); int row = event.GetRow(); int col = event.GetCol(); static bool inModification = false ; int i; if (inModification) return; inModification = true; value = _accountsGrid->GetCellValue(row, ACCOUNT_NAME); if (value != _("")) { new_account.name = value; op_complete--; } value = _accountsGrid->GetCellValue(row, ACCOUNT_NUMBER); if (value != _("")) { new_account.number = value; op_complete--; } value = _accountsGrid->GetCellValue(row, ACCOUNT_SHARED); if (value != _("") && value != _("0")) new_account.shared = true; else new_account.shared = false; value = _accountsGrid->GetCellValue(row, ACCOUNT_DEFAULT); if (value != _("") && value != _("0")) new_account._default = true; else new_account._default = false; if (col == ACCOUNT_DEFAULT) { new_account.id = user->_accounts[row].id; for (i=0; iGetAccountsNumber(); i++) { if (i != row) { account = user->_accounts[i]; if (account._default) { account._default = false; _kiss->UpdateAccount(account); _accountsGrid->SetCellValue(i, ACCOUNT_DEFAULT, _("")); break; } } _kiss->UpdateAccount(new_account); } } // Account modification if (user->GetAccountsNumber() && row < user->GetAccountsNumber()) { new_account.id = user->_accounts[row].id; if (col == ACCOUNT_DELETE) { wxMessageDialog dialog(_wxUI, _("Are you sure want to delete : \n")+new_account.name, _("KissCount"), wxYES_NO); if (dialog.ShowModal() == wxID_NO) { _accountsGrid->SetCellValue(row, col, _("0")); } else { _accountsGrid->DeleteRows(row, 1); _kiss->DeleteAccount(new_account); } _wxUI->Layout(); inModification = false; return; } _kiss->UpdateAccount(new_account); } // New account else { if (op_complete) { inModification = false; return ; } if (user->GetAccountId(new_account.name) != _("0")) { wxMessageDialog dialog(_wxUI, _("Account ")+new_account.name+_(" already exists"), _("Error"), wxOK); dialog.ShowModal(); inModification = false; return ; } _accountsGrid->SetCellRenderer(row, ACCOUNT_SHARED, new wxGridCellBoolRenderer ()); _accountsGrid->SetCellEditor(row, ACCOUNT_SHARED, new wxGridCellBoolEditor ()); _accountsGrid->SetCellRenderer(row, ACCOUNT_DEFAULT, new wxGridCellBoolRenderer ()); _accountsGrid->SetCellEditor(row, ACCOUNT_DEFAULT, new wxGridCellBoolEditor ()); _accountsGrid->SetCellRenderer(row, ACCOUNT_DELETE, new wxGridCellBoolRenderer ()); _accountsGrid->SetCellEditor(row, ACCOUNT_DELETE, new wxGridCellBoolEditor ()); _accountsGrid->SetCellAlignment(row, ACCOUNT_SHARED, wxALIGN_CENTRE, wxALIGN_CENTRE); _accountsGrid->SetCellAlignment(row, ACCOUNT_DEFAULT, wxALIGN_CENTRE, wxALIGN_CENTRE); _accountsGrid->SetCellAlignment(row, ACCOUNT_DELETE, wxALIGN_CENTRE, wxALIGN_CENTRE); _accountsGrid->SetReadOnly(row, ACCOUNT_SHARED, false); _accountsGrid->SetReadOnly(row, ACCOUNT_DEFAULT, false); _accountsGrid->SetReadOnly(row, ACCOUNT_DELETE, false); if (!user->GetAccountsNumber()) { new_account._default = true; _accountsGrid->SetCellValue(row, ACCOUNT_DEFAULT, _("1")); } _accountsGrid->AutoSizeColumns(true); _accountsGrid->AppendRows(); _accountsGrid->SetReadOnly(row+1, ACCOUNT_SHARED, true); _accountsGrid->SetReadOnly(row+1, ACCOUNT_DEFAULT, true); _accountsGrid->SetReadOnly(row+1, ACCOUNT_DELETE, true); _wxUI->Layout(); _kiss->AddAccount(new_account); } inModification = false; } void PreferencesPanel::OnCategoryModified(wxGridEvent& event) { int op_complete = 1; wxString value; User* user = _kiss->GetUser(); int row = event.GetRow(); int col = event.GetCol(); static bool inModification = false ; struct category new_cat; if (inModification) return; inModification = true; value = _categoriesGrid->GetCellValue(row, CATEGORY_NAME); if (value != _("")) { new_cat.name = value; op_complete--; } new_cat.color = _categoriesGrid->GetCellBackgroundColour(row, col); // Categories modification if (user->GetCategoriesNumber() && row < user->GetCategoriesNumber()) { new_cat.id = user->_preferences._categories[row].id; if (col == CATEGORY_DELETE) { wxMessageDialog dialog(_wxUI, _("Are you sure want to delete : \n")+new_cat.name, _("KissCount"), wxYES_NO); if (dialog.ShowModal() == wxID_NO) { _categoriesGrid->SetCellValue(row, col, _("0")); } else { _categoriesGrid->DeleteRows(row, 1); _kiss->DeleteCategory(user->_preferences._categories[row]); } _wxUI->Layout(); inModification = false; return; } _kiss->UpdateCategory(user->_preferences._categories[row].name, new_cat); } // New category else { if (op_complete) { inModification = false; return ; } _kiss->AddCategory(new_cat); _categoriesGrid->SetReadOnly(row, CATEGORY_COLOR, false); _categoriesGrid->SetReadOnly(row, CATEGORY_FONT, false); _categoriesGrid->SetReadOnly(row, CATEGORY_DELETE, false); _categoriesGrid->SetCellRenderer(row, CATEGORY_DELETE, new wxGridCellBoolRenderer ()); _categoriesGrid->SetCellEditor(row, CATEGORY_DELETE, new wxGridCellBoolEditor ()); _categoriesGrid->SetCellAlignment(row, CATEGORY_COLOR, wxALIGN_CENTRE, wxALIGN_CENTRE); _categoriesGrid->SetCellAlignment(row, CATEGORY_FONT, wxALIGN_CENTRE, wxALIGN_CENTRE); _categoriesGrid->SetCellAlignment(row, CATEGORY_DELETE, wxALIGN_CENTRE, wxALIGN_CENTRE); row++; _categoriesGrid->AppendRows(); _categoriesGrid->SetReadOnly(row, CATEGORY_COLOR, true); _categoriesGrid->SetReadOnly(row, CATEGORY_FONT, true); _categoriesGrid->SetReadOnly(row, CATEGORY_DELETE, true); SET_ROW_COLOR(row, OWN_GREEN); _wxUI->Layout(); } return; }