summaryrefslogtreecommitdiffstats
path: root/kspread/manipulator_data.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kspread/manipulator_data.cpp')
-rw-r--r--kspread/manipulator_data.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/kspread/manipulator_data.cpp b/kspread/manipulator_data.cpp
new file mode 100644
index 000000000..af2317225
--- /dev/null
+++ b/kspread/manipulator_data.cpp
@@ -0,0 +1,197 @@
+/* This file is part of the KDE project
+ Copyright (C) 2006 Tomas Mecir <mecirt@gmail.com>
+
+ 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;
+}
+