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