-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathitem.cpp
More file actions
98 lines (91 loc) · 2.95 KB
/
item.cpp
File metadata and controls
98 lines (91 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "item.h"
#include "spreadsheetapp.h"
#include <QDebug>
#include "parser.h"
#include <sstream>
Item::Item(const QString initFormula)
{
formula = initFormula;
value = 0;
isShowing = false;
}
int Item::checkIfCellDep(QVector<QString>& setOfCells) {
for (int i = 0; i < setOfCells.size(); ++i) {
if (checkIfCellDep(setOfCells[i]))
return i;
}
return -1;
}
void Item::setItemValue(const int newValue, Spreadsheet *spreadsheet) {
if (formula[0] == '=') { //it was formula so it needs to clear all previous dependencies
QString cellId = QString::number(spreadsheet->getCurrentCell().row()) + ';' + QString::number(spreadsheet->getCurrentCell().column());
for (int i = 0; i < spreadsheet->rowCount(); ++i) {
for (int j = 0; j < spreadsheet->columnCount(); ++j) {
QModelIndex ind = spreadsheet->index(i, j);
spreadsheet->setData(ind, cellId, DepCellDelRole);
}
}
}
formula = QString::number(newValue);
value = newValue;
isString = false;
isShowing = true;
}
void Item::setItemFormula(const QString &newFormula, Spreadsheet *spreadsheet)
{
if (newFormula == "") {
value = 0;
isString = false;
isShowing = false;
}
formula = newFormula;
if (evaluate(spreadsheet)) //reset value
isShowing = true;
if (!depCells.isEmpty())
spreadsheet->reevaluateCells();
}
void Item::delDepCell(QString cellDep) {
if (depCells.indexOf(cellDep) >= 0)
depCells.remove(depCells.indexOf(cellDep));
}
void Item::addDepCell(QString cellDep) {
if (depCells.indexOf(cellDep) < 0)
depCells.push_back(cellDep);
}
bool Item::evaluate(Spreadsheet *spreadsheet)
{
if (formula[0] == '=') {
stringstream mac;
QString formulaEq(formula);
formulaEq[0] = ' ';
mac << formulaEq.toStdString() << ";";
Scanner *scan = new Scanner(mac);
Parser *parser = new Parser(*scan, spreadsheet, true);
if (parser->parsed()) {
QString currentCellId = QString::number(spreadsheet->getCurrentCell().row()) + ';' + QString::number(spreadsheet->getCurrentCell().column());
value = parser->getExpValue();
for (CELLStruct cell: parser->getCellsDep()) {
QModelIndex ind = spreadsheet->index(cell.row - 1, cell.col - 1);
spreadsheet->setData(ind, currentCellId, DepCellAddRole);
}
delete scan;
delete parser;
isString = false;
return true;
}
else {
delete scan;
delete parser;
isString = true;
return true;
}
}
else {
bool flag;
value = formula.toInt(&flag);
isString = false;
if (!flag)
isString = true;
return true;
}
}