diff --git a/src/Mod/Spreadsheet/App/Cell.cpp b/src/Mod/Spreadsheet/App/Cell.cpp index 667a47c33..21ac96803 100644 --- a/src/Mod/Spreadsheet/App/Cell.cpp +++ b/src/Mod/Spreadsheet/App/Cell.cpp @@ -118,7 +118,7 @@ Cell::Cell(const Cell &other) Cell &Cell::operator =(const Cell &rhs) { - PropertySheet::Signaller signaller(*owner); + PropertySheet::AtomicPropertyChange signaller(*owner); used = 0; address = rhs.address; @@ -149,7 +149,7 @@ Cell::~Cell() void Cell::setExpression(App::Expression *expr) { - PropertySheet::Signaller signaller(*owner); + PropertySheet::AtomicPropertyChange signaller(*owner); /* Remove dependencies */ owner->removeDependencies(address); @@ -209,7 +209,7 @@ bool Cell::getStringContent(std::string & s) const void Cell::setContent(const char * value) { - PropertySheet::Signaller signaller(*owner); + PropertySheet::AtomicPropertyChange signaller(*owner); App::Expression * expr = 0; setUsed(PARSE_EXCEPTION_SET, false); @@ -258,7 +258,7 @@ void Cell::setContent(const char * value) void Cell::setAlignment(int _alignment) { if (_alignment != alignment) { - PropertySheet::Signaller signaller(*owner); + PropertySheet::AtomicPropertyChange signaller(*owner); alignment = _alignment; setUsed(ALIGNMENT_SET, alignment != (ALIGNMENT_HIMPLIED | ALIGNMENT_LEFT | ALIGNMENT_VIMPLIED | ALIGNMENT_VCENTER)); @@ -284,7 +284,7 @@ bool Cell::getAlignment(int & _alignment) const void Cell::setStyle(const std::set & _style) { if (_style != style) { - PropertySheet::Signaller signaller(*owner); + PropertySheet::AtomicPropertyChange signaller(*owner); style = _style; setUsed(STYLE_SET, style.size() > 0); @@ -310,7 +310,7 @@ bool Cell::getStyle(std::set & _style) const void Cell::setForeground(const App::Color &color) { if (color != foregroundColor) { - PropertySheet::Signaller signaller(*owner); + PropertySheet::AtomicPropertyChange signaller(*owner); foregroundColor = color; setUsed(FOREGROUND_COLOR_SET, foregroundColor != App::Color(0, 0, 0, 1)); @@ -336,7 +336,7 @@ bool Cell::getForeground(App::Color &color) const void Cell::setBackground(const App::Color &color) { if (color != backgroundColor) { - PropertySheet::Signaller signaller(*owner); + PropertySheet::AtomicPropertyChange signaller(*owner); backgroundColor = color; setUsed(BACKGROUND_COLOR_SET, backgroundColor != App::Color(1, 1, 1, 0)); @@ -371,7 +371,7 @@ void Cell::setDisplayUnit(const std::string &unit) } if (newDisplayUnit != displayUnit) { - PropertySheet::Signaller signaller(*owner); + PropertySheet::AtomicPropertyChange signaller(*owner); displayUnit = newDisplayUnit; setUsed(DISPLAY_UNIT_SET, !displayUnit.isEmpty()); @@ -394,7 +394,7 @@ bool Cell::getDisplayUnit(DisplayUnit &unit) const void Cell::setAlias(const std::string &n) { if (alias != n) { - PropertySheet::Signaller signaller(*owner); + PropertySheet::AtomicPropertyChange signaller(*owner); owner->revAliasProp.erase(alias); @@ -426,7 +426,7 @@ bool Cell::getAlias(std::string &n) const void Cell::setComputedUnit(const Base::Unit &unit) { - PropertySheet::Signaller signaller(*owner); + PropertySheet::AtomicPropertyChange signaller(*owner); computedUnit = unit; setUsed(COMPUTED_UNIT_SET, !computedUnit.isEmpty()); @@ -454,7 +454,7 @@ bool Cell::getComputedUnit(Base::Unit & unit) const void Cell::setSpans(int rows, int columns) { if (rows != rowSpan || columns != colSpan) { - PropertySheet::Signaller signaller(*owner); + PropertySheet::AtomicPropertyChange signaller(*owner); rowSpan = rows; colSpan = columns; @@ -538,7 +538,7 @@ void Cell::restore(Base::XMLReader &reader) const char* colSpan = reader.hasAttribute("colSpan") ? reader.getAttribute("colSpan") : 0; // Don't trigger multiple updates below; wait until everything is loaded by calling unfreeze() below. - PropertySheet::Signaller signaller(*owner); + PropertySheet::AtomicPropertyChange signaller(*owner); if (content) { setContent(content); diff --git a/src/Mod/Spreadsheet/App/PropertySheet.cpp b/src/Mod/Spreadsheet/App/PropertySheet.cpp index 063ed06a0..c4d2ca0a6 100644 --- a/src/Mod/Spreadsheet/App/PropertySheet.cpp +++ b/src/Mod/Spreadsheet/App/PropertySheet.cpp @@ -239,18 +239,19 @@ Cell * PropertySheet::createCell(CellAddress address) PropertySheet::PropertySheet(Sheet *_owner) : Property() + , AtomicPropertyChangeInterface() , owner(_owner) - , signalCounter(0) { } PropertySheet::PropertySheet(const PropertySheet &other) - : dirty(other.dirty) + : Property() + , AtomicPropertyChangeInterface() + , dirty(other.dirty) , mergedCells(other.mergedCells) , owner(other.owner) , propertyNameToCellMap(other.propertyNameToCellMap) , documentObjectToCellMap(other.documentObjectToCellMap) - , signalCounter(0) { std::map::const_iterator i = other.data.begin(); @@ -273,7 +274,7 @@ App::Property *PropertySheet::Copy(void) const void PropertySheet::Paste(const Property &from) { - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); const PropertySheet * froms = static_cast(&from); @@ -541,7 +542,7 @@ void PropertySheet::clear(CellAddress address) if (i == data.end()) return; - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); // Spit cell to clean up mergeCells map; all data is in first cell anyway splitCell(address); @@ -571,7 +572,7 @@ void PropertySheet::moveCell(CellAddress currPos, CellAddress newPos, std::map::const_iterator i = data.find(currPos); std::map::const_iterator j = data.find(newPos); - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); if (j != data.end()) clear(newPos); @@ -684,7 +685,7 @@ void PropertySheet::insertRows(int row, int count) RewriteExpressionVisitor visitor(CellAddress(row, CellAddress::MAX_COLUMNS), count, 0); - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); for (std::vector::const_reverse_iterator i = keys.rbegin(); i != keys.rend(); ++i) { std::map::iterator j = data.find(*i); @@ -732,7 +733,7 @@ void PropertySheet::removeRows(int row, int count) RewriteExpressionVisitor visitor(CellAddress(row + count - 1, CellAddress::MAX_COLUMNS), -count, 0); - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); for (std::vector::const_iterator i = keys.begin(); i != keys.end(); ++i) { std::map::iterator j = data.find(*i); @@ -770,7 +771,7 @@ void PropertySheet::insertColumns(int col, int count) RewriteExpressionVisitor visitor(CellAddress(CellAddress::MAX_ROWS, col), 0, count); - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); for (std::vector::const_reverse_iterator i = keys.rbegin(); i != keys.rend(); ++i) { std::map::iterator j = data.find(*i); @@ -818,7 +819,7 @@ void PropertySheet::removeColumns(int col, int count) RewriteExpressionVisitor visitor(CellAddress(CellAddress::MAX_ROWS, col + count - 1), 0, -count); - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); for (std::vector::const_iterator i = keys.begin(); i != keys.end(); ++i) { std::map::iterator j = data.find(*i); @@ -859,7 +860,7 @@ bool PropertySheet::mergeCells(CellAddress from, CellAddress to) } } - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); // Clear cells that will be hidden by the merge for (int r = from.row(); r <= to.row(); ++r) @@ -888,7 +889,7 @@ void PropertySheet::splitCell(CellAddress address) return; CellAddress anchor = i->second; - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); cellAt(anchor)->getSpans(rows, cols); for (int r = anchor.row(); r <= anchor.row() + rows; ++r) @@ -1127,7 +1128,7 @@ void PropertySheet::renamedDocumentObject(const App::DocumentObject * docObj) std::map::iterator i = data.begin(); - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); RelabelDocumentObjectExpressionVisitor v(documentObjectName[docObj], docObj->Label.getValue()); while (i != data.end()) { @@ -1148,7 +1149,7 @@ void PropertySheet::renamedDocument(const App::Document * doc) std::map::iterator i = data.begin(); /* Resolve all cells */ - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); RelabelDocumentExpressionVisitor v(documentName[doc], doc->Label.getValue()); while (i != data.end()) { @@ -1218,7 +1219,7 @@ const std::set &PropertySheet::getDeps(CellAddress pos) const void PropertySheet::recomputeDependencies(CellAddress key) { - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); removeDependencies(key); addDependencies(key); @@ -1227,7 +1228,7 @@ void PropertySheet::recomputeDependencies(CellAddress key) void PropertySheet::rebuildDocDepList() { - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); docDeps.clear(); BuildDocDepsExpressionVisitor v(docDeps); @@ -1255,7 +1256,7 @@ void PropertySheet::resolveAll() std::map::iterator i = data.begin(); /* Resolve all cells */ - Signaller signaller(*this); + AtomicPropertyChange signaller(*this); while (i != data.end()) { recomputeDependencies(i->first); setDirty(i->first); @@ -1263,18 +1264,3 @@ void PropertySheet::resolveAll() } touch(); } - -PropertySheet::Signaller::Signaller(PropertySheet &sheet) - : mSheet(sheet) -{ - if (mSheet.signalCounter == 0) - mSheet.aboutToSetValue(); - mSheet.signalCounter++; -} - -PropertySheet::Signaller::~Signaller() -{ - mSheet.signalCounter--; - if (mSheet.signalCounter == 0) - mSheet.hasSetValue(); -} diff --git a/src/Mod/Spreadsheet/App/PropertySheet.h b/src/Mod/Spreadsheet/App/PropertySheet.h index d032a84f4..c14bbae9e 100644 --- a/src/Mod/Spreadsheet/App/PropertySheet.h +++ b/src/Mod/Spreadsheet/App/PropertySheet.h @@ -37,7 +37,7 @@ class Sheet; class PropertySheet; class SheetObserver; -class PropertySheet : public App::Property { +class PropertySheet : public App::Property, private App::AtomicPropertyChangeInterface { TYPESYSTEM_HEADER(); public: @@ -129,14 +129,6 @@ public: const std::set & getDocDeps() const { return docDeps; } - class Signaller { - public: - Signaller(PropertySheet & sheet); - ~Signaller(); - private: - PropertySheet & mSheet; - }; - void recomputeDependencies(CellAddress key); PyObject *getPyObject(void); @@ -157,10 +149,16 @@ private: PropertySheet(const PropertySheet & other); - friend class Signaller; + /* friends */ + + friend class AtomicPropertyChange; friend class SheetObserver; + friend class Cell; + + friend class Sheet; + Cell *cellAt(CellAddress address); Cell *nonNullCellAt(CellAddress address); @@ -171,8 +169,6 @@ private: bool rowSortFunc(const CellAddress &a, const CellAddress &b); - friend class Cell; - /*! Set of cells that have been marked dirty */ std::set dirty; @@ -230,9 +226,6 @@ private: /*! Mapping of alias property to cell position */ std::map revAliasProp; - /*! Internal counter used to track when to emit aboutToSet and hasSetValue calls */ - int signalCounter; - /*! The associated python object */ Py::Object PythonObject; }; diff --git a/src/Mod/Spreadsheet/App/Sheet.cpp b/src/Mod/Spreadsheet/App/Sheet.cpp index 02e03e821..38500965c 100644 --- a/src/Mod/Spreadsheet/App/Sheet.cpp +++ b/src/Mod/Spreadsheet/App/Sheet.cpp @@ -144,7 +144,7 @@ bool Sheet::importFromFile(const std::string &filename, char delimiter, char quo std::ifstream file; int row = 0; - PropertySheet::Signaller signaller(cells); + PropertySheet::AtomicPropertyChange signaller(cells); clearAll();