1 package org.simantics.modeling.ui.diagram;
\r
3 import java.awt.Graphics2D;
\r
4 import java.awt.Rectangle;
\r
5 import java.awt.event.ActionEvent;
\r
6 import java.awt.event.ActionListener;
\r
7 import java.awt.event.FocusEvent;
\r
8 import java.awt.event.FocusListener;
\r
9 import java.beans.PropertyChangeEvent;
\r
11 import javax.swing.event.TableModelListener;
\r
12 import javax.swing.table.TableModel;
\r
14 import org.simantics.scenegraph.g2d.G2DRenderingHints;
\r
15 import org.simantics.scenegraph.g2d.nodes.ComponentNode;
\r
16 import org.simantics.spreadsheet.Cell;
\r
17 import org.simantics.spreadsheet.Model;
\r
18 import org.simantics.spreadsheet.ui.Spreadsheet.SpreadsheetModel;
\r
20 public class SheetNode extends ComponentNode implements ActionListener, FocusListener {
\r
22 private static final long serialVersionUID = -8212264868316567181L;
\r
24 private SpreadsheetModel sm;
\r
26 class Proxy implements Model, TableModel {
\r
28 TableModelListener listener;
\r
30 TableModel tableModel;
\r
32 Proxy(Model model, TableModel tableModel) {
\r
34 this.tableModel = tableModel;
\r
38 public Cell get(int row, int column) {
\r
43 public <T> T getAdapter(Class<?> clazz) {
\r
44 return model.getAdapter(clazz);
\r
48 public void dispose() {
\r
53 public void addTableModelListener(TableModelListener l) {
\r
54 assert(listener == null);
\r
59 public Class<?> getColumnClass(int columnIndex) {
\r
60 return tableModel.getColumnClass(columnIndex);
\r
64 public int getColumnCount() {
\r
69 public String getColumnName(int columnIndex) {
\r
70 return "" + columnIndex;
\r
74 public int getRowCount() {
\r
79 public Object getValueAt(int rowIndex, int columnIndex) {
\r
80 return tableModel.getValueAt(rowIndex, columnIndex);
\r
84 public boolean isCellEditable(int rowIndex, int columnIndex) {
\r
89 public void removeTableModelListener(TableModelListener l) {
\r
94 public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
\r
100 public void init(Model model, TableModel tableModel) {
\r
102 Proxy proxy = new Proxy(model, tableModel);
\r
104 sm = new SpreadsheetModel(proxy, proxy, null);
\r
105 component = sm.createComponent(false);
\r
106 component.addFocusListener(this);
\r
107 super.propertyChange(new PropertyChangeEvent(this, "component", null, component));
\r
111 protected ActionListener actionListener = null;
\r
113 public void setActionListener(ActionListener actionListener) {
\r
114 this.actionListener = actionListener;
\r
119 public void actionPerformed(ActionEvent e) {
\r
120 if(actionListener != null)
\r
121 actionListener.actionPerformed(e);
\r
122 if(container.getParent() != null)
\r
123 container.getParent().requestFocusInWindow(); // Loose focus
\r
127 @SyncField({"width", "height"})
\r
128 public void setSize(int width, int height) {
\r
129 this.width = width;
\r
130 this.height = height;
\r
131 // container.setBounds(0, 0, width, height);
\r
132 // component.setBounds(0, 0, width, height);
\r
133 // component.validate();
\r
134 // container.validate();
\r
135 // System.out.println("table bounds=" + sm.getTable().getBounds());
\r
140 public void focusGained(FocusEvent arg0) {
\r
144 public void focusLost(FocusEvent arg0) {
\r
148 public void render(Graphics2D g2d) {
\r
149 Rectangle bounds = (Rectangle)g2d.getRenderingHint(G2DRenderingHints.KEY_CONTROL_BOUNDS);
\r
150 width = (int)bounds.getWidth();
\r
151 height = (int)bounds.getHeight();
\r