+ private static void refreshAll(EvaluationContext observer, INode _node) {
+ final TextGridNode node = ProfileVariables.claimChild(_node, "", "TextGridStyle", TextGridNode.class, observer);
+ if (node == null)
+ return;
+
+
+ int row = 0;
+ Map<String, Pair<TextGridStyle, MonitorTextGridResult>> rows = observer.getProperty(_node, "rows");
+ if (rows != null) {
+ List<Pair<TextGridStyle, MonitorTextGridResult>> sortedRows = rows.values().stream().sorted(new Comparator<Pair<TextGridStyle, MonitorTextGridResult>>() {
+ @Override
+ public int compare(Pair<TextGridStyle, MonitorTextGridResult> o1, Pair<TextGridStyle, MonitorTextGridResult> o2) {
+ return Double.compare(o1.first.getPriority(), o2.first.getPriority());
+ }
+ }).collect(Collectors.toList());
+
+
+ for (Pair<TextGridStyle, MonitorTextGridResult> resultPair : sortedRows) {
+ row++;
+ TextGridStyle style = resultPair.first;
+ MonitorTextGridResult result = resultPair.second;
+
+ String value = result != null ? result.getText1() : null;
+
+ String value2 = result != null ? result.getText2() : null;
+ String value3 = result != null ? result.getText3() : null;
+
+ double spacing = result.getSpacing();
+
+ final Function1<String, String> modifier = result != null ? result.getModifier() : null;
+ final Function1<String, String> validator = result != null ? result.getValidator() : null;
+ final Function1<Vec2d, Boolean> translator = result != null ? result.getTranslator() : null;
+ final RVI rvi = result != null ? result.getRVI() : null;
+
+
+ node.setRowId(row, result.getRowId());
+
+ //setCurrentRowNumber(observer, _node, result.getRowId(), row);
+
+ //observer.setTemporaryProperty(_node, "location", row + 1);
+
+ node.setText(2, row, value2);
+ node.setUp(result.getUp());
+
+ //MonitorTextGridResult cache = node.getCache(1, row);
+ //if(cache != null && cache.sameStructure(result)) return;
+
+ node.setCache(1, row, result);
+
+ boolean isConnection = _node instanceof ConnectionNode;
+
+ Rectangle2D elementBounds = isConnection ? EMPTY_BOUNDS : NodeUtil.getLocalElementBounds(_node);
+ if(elementBounds == null) {
+ new Exception("Cannot get local element bounds for node " + _node.toString()).printStackTrace();
+ // This is here for checking why getLocalElementBounds failed in the debugger.
+ NodeUtil.getLocalElementBounds(_node);
+ return;
+ }
+
+ // System.err.println("elementBounds " + elementBounds);
+ // System.err.println("parentTransform " + result.getParentTransform());
+
+ AffineTransform at = style.getTransform(_node,result.getParentTransform(), elementBounds, row, result.getUp());
+ Vec2d offset = result.getOffset();
+
+ Point2D[] cellOffsets = style.getCellOffsets();
+
+ AffineTransform at1 = new AffineTransform(at);
+ at1.translate(cellOffsets[0].getX(),cellOffsets[0].getY());
+ AffineTransform at2 = new AffineTransform(at);
+ at2.translate(cellOffsets[1].getX()+spacing,cellOffsets[1].getY());
+ AffineTransform at3 = new AffineTransform(at);
+ at3.translate(cellOffsets[2].getX()+spacing,cellOffsets[2].getY());
+
+ at1.translate(offset.x, offset.y);
+ at2.translate(offset.x, offset.y);
+ at3.translate(offset.x, offset.y);
+
+ node.setTransform(1, row, at1);
+ node.setTransform(2, row, at2);
+ node.setTransform(3, row, at3);
+
+ Alignment[] alignments = result.getAlignments();
+ if(alignments != null) {
+ node.setHorizontalAlignment(1, row, (byte) alignments[0].ordinal());
+ node.setHorizontalAlignment(2, row, (byte) alignments[1].ordinal());
+ node.setHorizontalAlignment(3, row, (byte) alignments[2].ordinal());
+ } else {
+ node.setHorizontalAlignment(1, row, (byte) style.getAlignment(1).ordinal());
+ node.setHorizontalAlignment(2, row, (byte) style.getAlignment(2).ordinal());
+ node.setHorizontalAlignment(3, row, (byte) style.getAlignment(3).ordinal());
+ }
+
+ Alignment[] verticalAlignments = result.getVerticalAlignments();
+ if(verticalAlignments != null) {
+ node.setVerticalAlignment(1, row, (byte) verticalAlignments[0].ordinal());
+ node.setVerticalAlignment(2, row, (byte) verticalAlignments[1].ordinal());
+ node.setVerticalAlignment(3, row, (byte) verticalAlignments[2].ordinal());
+ } else {
+ node.setVerticalAlignment(1, row, (byte) style.getVerticalAlignment(1).ordinal());
+ node.setVerticalAlignment(2, row, (byte) style.getVerticalAlignment(2).ordinal());
+ node.setVerticalAlignment(3, row, (byte) style.getVerticalAlignment(3).ordinal());
+ }
+
+ node.setZIndex(3000);
+
+ org.simantics.common.color.Color color = result.getColor();
+ Color awtColor = color != null ? Colors.awt(color) : Color.DARK_GRAY;
+ Color bgColor = style.getBackgroundColor();
+ Font font = style.getFont();
+
+ style.setTextNodeData(node, 1, row, value, font, awtColor, bgColor);
+ style.setTextNodeData(node, 2, row, value2, result.getPending(), font, awtColor, bgColor);
+ style.setTextNodeData(node, 3, row, value3, font, awtColor, bgColor);
+
+ node.setEditable(1, row, false);
+ node.setForceEventListening(2, row, true);
+ node.setEditable(2, row, modifier != null);
+ node.setEditable(3, row, false);
+
+ final int finalRow = row;
+
+ if (modifier != null) {
+ node.setTextListener(2, row, new ITextListener() {
+ @Override
+ public void textChanged() {}
+
+ @Override
+ public void textEditingStarted() {}
+
+ @Override
+ public void textEditingCancelled() {
+ }
+
+ @Override
+ public void textEditingEnded() {
+
+ TextNode t = node.get(2, finalRow);
+ if (t == null)
+ return;
+
+ if(!t.getText().equals(t.getTextBeforeEdit()))
+ modifier.apply(t.getText());
+
+ }
+ });
+ } else {
+ node.setTextListener(2, row, null);
+ }
+
+ node.setInputValidator(2, row, validator);
+ node.setTranslator(translator);
+
+ node.setRVI(2, row, rvi);
+
+ style.postProcessNode(node, row);
+ }
+ }
+ // remove excess rows
+ int rowCount = node.computeRows();
+ while (row < rowCount) {
+ row++;
+ node.removeRow(row);
+ }
+
+ }
+