X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.spreadsheet.graph%2Fsrc%2Forg%2Fsimantics%2Fspreadsheet%2Fgraph%2FSpreadsheetNodeManager.java;h=64d002f831d81c7198406b877ef21b7cb46cd3e9;hp=caa6dc23f4602d10589187018c99f66a9f1f9a24;hb=5c67a96d34fe904b8c4b0375cd08ff1d543bf369;hpb=9a37dabc6c0212ed3e14499c88df3208cd06f9b0 diff --git a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetNodeManager.java b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetNodeManager.java index caa6dc23f..64d002f83 100644 --- a/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetNodeManager.java +++ b/bundles/org.simantics.spreadsheet.graph/src/org/simantics/spreadsheet/graph/SpreadsheetNodeManager.java @@ -1,22 +1,52 @@ package org.simantics.spreadsheet.graph; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.simantics.databoard.binding.Binding; +import org.simantics.databoard.binding.mutable.Variant; import org.simantics.layer0.Layer0; -import org.simantics.simulator.toolkit.StandardNodeManager; +import org.simantics.simulator.toolkit.db.StandardVariableNodeManager; import org.simantics.simulator.variable.exceptions.NodeManagerException; +import org.simantics.spreadsheet.SpreadsheetCellStyle; import org.simantics.spreadsheet.resource.SpreadsheetResource; +import org.simantics.spreadsheet.solver.SheetNode; +import org.simantics.spreadsheet.solver.SpreadsheetBook; +import org.simantics.spreadsheet.solver.SpreadsheetBook.SpreadsheetBookListener; +import org.simantics.spreadsheet.solver.SpreadsheetCell; +import org.simantics.spreadsheet.solver.SpreadsheetCellContent; +import org.simantics.spreadsheet.solver.SpreadsheetCellContentExpression; +import org.simantics.spreadsheet.solver.SpreadsheetCellEditable; +import org.simantics.spreadsheet.solver.SpreadsheetFormula; +import org.simantics.spreadsheet.solver.SpreadsheetSCLConstant; +import org.simantics.spreadsheet.solver.SpreadsheetTypeNode; import org.simantics.structural.stubs.StructuralResource2; @SuppressWarnings("rawtypes") -public class SpreadsheetNodeManager extends StandardNodeManager { +public class SpreadsheetNodeManager extends StandardVariableNodeManager { public SpreadsheetNodeManager(SpreadsheetRealm realm) { super(realm, realm.getEngine()); + realm.getEngine().registerListener(new SpreadsheetBookListener() { + + @Override + public void cellsChanged(Collection cells) { + realm.asyncExec(new Runnable() { + @Override + public void run() { + for(SpreadsheetCell cell : cells) { + refreshVariable(new SpreadsheetCellContent(cell)); + Object content = cell.getContent(); + if(content instanceof SpreadsheetFormula || content instanceof SpreadsheetSCLConstant) + refreshVariable(new SpreadsheetCellContentExpression(cell)); + } + } + }); + } + }); } static final Set COMPONENT_CLASS = Collections.singleton(StructuralResource2.URIs.Component); @@ -52,6 +82,12 @@ public class SpreadsheetNodeManager extends StandardNodeManager dirtyNodeContents = findDirtyNodeContents(node); super.setValueAndFireSelectedListeners(node, value, binding, dirtyNodeContents); + if(value instanceof SpreadsheetFormula) { + SpreadsheetCellContent scc = (SpreadsheetCellContent)node; + SpreadsheetCellContentExpression scce = new SpreadsheetCellContentExpression(scc.cell); + // We need to also refresh the expression variable in this case + refreshVariable(scce); + } } //Find the cells that are used by this cell and their SpreadsheetContents, so that they can be marked as dirty later @@ -78,4 +114,18 @@ public class SpreadsheetNodeManager extends StandardNodeManager