--- /dev/null
+package org.simantics.modeling.ui.diagram;\r
+\r
+import java.awt.Graphics2D;\r
+import java.awt.Rectangle;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.awt.event.FocusEvent;\r
+import java.awt.event.FocusListener;\r
+import java.beans.PropertyChangeEvent;\r
+\r
+import javax.swing.event.TableModelListener;\r
+import javax.swing.table.TableModel;\r
+\r
+import org.simantics.scenegraph.g2d.G2DRenderingHints;\r
+import org.simantics.scenegraph.g2d.nodes.ComponentNode;\r
+import org.simantics.spreadsheet.Cell;\r
+import org.simantics.spreadsheet.Model;\r
+import org.simantics.spreadsheet.ui.Spreadsheet.SpreadsheetModel;\r
+\r
+public class SheetNode extends ComponentNode implements ActionListener, FocusListener {\r
+\r
+ private static final long serialVersionUID = -8212264868316567181L;\r
+\r
+ private SpreadsheetModel sm;\r
+\r
+ class Proxy implements Model, TableModel {\r
+\r
+ TableModelListener listener;\r
+ Model model;\r
+ TableModel tableModel;\r
+\r
+ Proxy(Model model, TableModel tableModel) {\r
+ this.model = model;\r
+ this.tableModel = tableModel;\r
+ }\r
+\r
+ @Override\r
+ public Cell get(int row, int column) {\r
+ throw new Error();\r
+ }\r
+\r
+ @Override\r
+ public <T> T getAdapter(Class<?> clazz) {\r
+ return model.getAdapter(clazz);\r
+ }\r
+\r
+ @Override\r
+ public void dispose() {\r
+ throw new Error();\r
+ }\r
+\r
+ @Override\r
+ public void addTableModelListener(TableModelListener l) {\r
+ assert(listener == null);\r
+ listener = l;\r
+ }\r
+\r
+ @Override\r
+ public Class<?> getColumnClass(int columnIndex) {\r
+ return tableModel.getColumnClass(columnIndex);\r
+ }\r
+\r
+ @Override\r
+ public int getColumnCount() {\r
+ return 2;\r
+ }\r
+\r
+ @Override\r
+ public String getColumnName(int columnIndex) {\r
+ return "" + columnIndex;\r
+ }\r
+\r
+ @Override\r
+ public int getRowCount() {\r
+ return 15;\r
+ }\r
+\r
+ @Override\r
+ public Object getValueAt(int rowIndex, int columnIndex) {\r
+ return tableModel.getValueAt(rowIndex, columnIndex);\r
+ }\r
+\r
+ @Override\r
+ public boolean isCellEditable(int rowIndex, int columnIndex) {\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ public void removeTableModelListener(TableModelListener l) {\r
+ throw new Error();\r
+ }\r
+\r
+ @Override\r
+ public void setValueAt(Object aValue, int rowIndex, int columnIndex) {\r
+ throw new Error();\r
+ }\r
+\r
+ }\r
+\r
+ public void init(Model model, TableModel tableModel) {\r
+\r
+ Proxy proxy = new Proxy(model, tableModel);\r
+\r
+ sm = new SpreadsheetModel(proxy, proxy, null);\r
+ component = sm.createComponent(false);\r
+ component.addFocusListener(this);\r
+ super.propertyChange(new PropertyChangeEvent(this, "component", null, component));\r
+\r
+ }\r
+\r
+ protected ActionListener actionListener = null;\r
+\r
+ public void setActionListener(ActionListener actionListener) {\r
+ this.actionListener = actionListener;\r
+ }\r
+\r
+ @ServerSide\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ if(actionListener != null)\r
+ actionListener.actionPerformed(e);\r
+ if(container.getParent() != null)\r
+ container.getParent().requestFocusInWindow(); // Loose focus\r
+ }\r
+\r
+ @Override\r
+ @SyncField({"width", "height"})\r
+ public void setSize(int width, int height) {\r
+ this.width = width;\r
+ this.height = height;\r
+// container.setBounds(0, 0, width, height);\r
+// component.setBounds(0, 0, width, height);\r
+// component.validate();\r
+// container.validate();\r
+// System.out.println("table bounds=" + sm.getTable().getBounds());\r
+//\r
+ }\r
+\r
+ @Override\r
+ public void focusGained(FocusEvent arg0) {\r
+ }\r
+\r
+ @Override\r
+ public void focusLost(FocusEvent arg0) {\r
+ }\r
+\r
+ @Override\r
+ public void render(Graphics2D g2d) {\r
+ Rectangle bounds = (Rectangle)g2d.getRenderingHint(G2DRenderingHints.KEY_CONTROL_BOUNDS);\r
+ width = (int)bounds.getWidth();\r
+ height = (int)bounds.getHeight();\r
+ super.render(g2d);\r
+ }\r
+\r
+}\r