diff options
Diffstat (limited to 'kspread/manipulator_data.cpp')
-rw-r--r-- | kspread/manipulator_data.cpp | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/kspread/manipulator_data.cpp b/kspread/manipulator_data.cpp new file mode 100644 index 00000000..af231722 --- /dev/null +++ b/kspread/manipulator_data.cpp @@ -0,0 +1,197 @@ +/* This file is part of the KDE project + Copyright (C) 2006 Tomas Mecir <[email protected]> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + + +#include "manipulator_data.h" + +#include <tdelocale.h> + +#include "kspread_cell.h" +#include "kspread_sheet.h" + +using namespace KSpread; + +AbstractDataManipulator::AbstractDataManipulator () +{ + m_format = false; +} + +AbstractDataManipulator::~AbstractDataManipulator () +{ + oldData.clear (); +} + +bool AbstractDataManipulator::process (Element* element) +{ + TQRect range = element->rect().normalize(); + for (int col = range.left(); col <= range.right(); ++col) + for (int row = range.top(); row <= range.bottom(); ++row) { + Value val; + TQString text; + bool parse = false; + FormatType fmtType = No_format; + if (m_reverse) { + // reverse - use the stored value + if (oldData.contains (col) && oldData[col].contains (row)) { + val = oldData[col][row].val; + text = oldData[col][row].text; + fmtType = oldData[col][row].format; + parse = false; + } + } else { + val = newValue (element, col, row, &parse, &fmtType); + if (parse) + text = val.asString(); + } + + // we have the data - set it ! + if (parse) { + Cell *cell = m_sheet->nonDefaultCell (col, row); + cell->setCellText (text); + } else { + Cell *cell = m_sheet->cellAt (col, row); + if (!(val.isEmpty() && cell->isDefault())) + // nothing if value and cell both empty + { + Cell *cell = m_sheet->nonDefaultCell (col, row); + cell->setCellValue (val, fmtType, text); + } + } + } + return true; +} + +bool AbstractDataManipulator::preProcessing () +{ + // not the first run - data already stored ... + if (!m_firstrun) return true; + + Region::Iterator endOfList(cells().end()); + for (Region::Iterator it = cells().begin(); it != endOfList; ++it) + { + TQRect range = (*it)->rect().normalize(); + for (int col = range.left(); col <= range.right(); ++col) + for (int row = range.top(); row <= range.bottom(); ++row) + { + Cell* cell = m_sheet->cellAt(col, row); + if (cell != m_sheet->defaultCell()) // non-default cell - remember it + { + ADMStorage st; + + if (cell->isFormula()) + st.text = cell->text(); + st.val = m_sheet->value (col, row); + st.format = cell->formatType(); + oldData[col][row] = st; + } + } + } + return true; +} + +DataManipulator::DataManipulator () + : m_format (No_format), + m_parsing (false) +{ + // default name for DataManipulator, can be changed using setName + m_name = i18n ("Change Value"); +} + +DataManipulator::~DataManipulator () +{ +} + +Value DataManipulator::newValue (Element *element, int col, int row, + bool *parsing, FormatType *formatType) +{ + *parsing = m_parsing; + if (m_format != No_format) + *formatType = m_format; + TQRect range = element->rect().normalize(); + int colidx = range.left() - col; + int rowidx = range.top() - row; + return data.element (colidx, rowidx); +} + +ArrayFormulaManipulator::ArrayFormulaManipulator () +{ + m_name = i18n ("Set Array Formula"); +} + +ArrayFormulaManipulator::~ArrayFormulaManipulator () +{ +} + +Value ArrayFormulaManipulator::newValue (Element *element, int col, int row, + bool *parsing, FormatType *) +{ + *parsing = true; + TQRect range = element->rect().normalize(); + int colidx = col - range.left(); + int rowidx = row - range.top(); + + // fill in the cells ... top-left one gets the formula, the rest gets =INDEX + // TODO: also fill in information about cells being a part of a range for GUI + if (colidx || rowidx) { + return (cellRef + TQString::number (rowidx+1) + ";" + + TQString::number (colidx+1) + ")"); + } else { + Cell *cell = m_sheet->nonDefaultCell (col, row); + cellRef = "=INDEX(" + cell->name() + ";"; + return m_text; + } +} + +ProtectedCheck::ProtectedCheck () +{ +} + +ProtectedCheck::~ProtectedCheck () +{ +} + +bool ProtectedCheck::check () +{ + if (!m_sheet->isProtected()) + return false; + + bool prot = false; + Region::Iterator endOfList(cells().end()); + for (Region::Iterator it = cells().begin(); it != endOfList; ++it) + { + Region::Element *element = *it; + TQRect range = element->rect().normalize(); + + for (int col = range.left(); col <= range.right(); ++col) + { + for (int row = range.top(); row <= range.bottom(); ++row) + { + Cell *cell = m_sheet->cellAt (col, row); + if (!cell->format()->notProtected (col, row)) + { + prot = true; + break; + } + } + if (prot) break; + } + } + return prot; +} + |