/* Copyright 2010 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 "wxGridCellFormulaEditor.h" wxGridCellFormulaEditor::wxGridCellFormulaEditor(const wxString& formula) : _formula(formula) {} void wxGridCellFormulaEditor::BeginEdit (int row, int col, wxGrid *grid) { static bool inModification = false; Operation op; if (inModification) return ; inModification = true; op = ((GridAccount*) grid)->_displayedOperations[row]; if (op.formula.Length()) { grid->SetCellValue(row, col, op.formula); _formula = op.formula; } wxGridCellTextEditor::BeginEdit(row, col, grid); inModification = false; } bool wxGridCellFormulaEditor::EndEdit (int row, int col, wxGrid *grid/*, const wxString &oldval, wxString *newval*/) { wxString res = GetValue(); Operation op; char* str, *str2; struct parse_opt opt, *r; bool ret; res = res.Trim(); if (res.StartsWith(wxT("="))) { str = (char*) std::string(res.mb_str()).c_str(); str2 = new char[strlen(str)]; strcpy(str2, str+1); r = &opt; str = str2; try { ParseExp(&str2, r, false); } catch(...) { wxMessageBox(_("Invalid formula !"), _("Error"), wxICON_ERROR | wxOK); delete str; return false; } delete str; _formula = res; ret = wxGridCellTextEditor::EndEdit(row, col, grid); grid->SetCellValue(row, col, wxString::Format(wxT("%.2lf"), EvaluateExpr(&opt, true))); } else { _formula = wxT(""); ret = wxGridCellTextEditor::EndEdit(row, col, grid); } return ret; } wxString wxGridCellFormulaEditor::GetFormula() { return _formula; }