/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * AttributeTable.java * * Created on 3. Juni 2004, 11:55 */ package Sirius.navigator.ui.attributes; import Sirius.navigator.resource.*; import Sirius.navigator.ui.attributes.renderer.*; import Sirius.server.localserver.attribute.Attribute; import org.apache.log4j.Logger; import org.jdesktop.swingx.JXTable; import java.awt.*; import java.awt.event.*; import java.net.*; import java.util.*; import javax.swing.*; import javax.swing.table.*; /** * DOCUMENT ME! * * @author pascal * @version $Revision$, $Date$ */ public class AttributeTable extends JXTable // implements ComplexContainer { //~ Instance fields -------------------------------------------------------- HyperlinkRenderer hyperlinkRenderer = new HyperlinkRenderer(); private final Logger logger; private final HashMap cellEditors; //~ Constructors ----------------------------------------------------------- /** * protected ComplexContainer complexContainerDelegate; */ public AttributeTable() { this(org.openide.util.NbBundle.getMessage( AttributeTable.class, "AttributeTable.AttributeTable().nameColumnName"), // NOI18N org.openide.util.NbBundle.getMessage( AttributeTable.class, "AttributeTable.AttributeTable().valueColumnName")); // NOI18N } /** * Creates a new AttributeTable object. * * @param nameColumnName DOCUMENT ME! * @param valueColumnName DOCUMENT ME! */ public AttributeTable(final String nameColumnName, final String valueColumnName) { super(new AttributeTableModel(new String[] { nameColumnName, valueColumnName })); this.logger = Logger.getLogger(this.getClass()); this.cellEditors = new HashMap(); // XXX // this.setDefaultRenderer(Object.class, new HyperlinkRenderer()); // this.setDefaultEditor(Integer.class, new HyperlinkRenderer()); // this.setDefaultEditor(Boolean.class, new HyperlinkRenderer()); // this.setDefaultEditor(Double.class, new HyperlinkRenderer()); // this.setDefaultEditor(Float.class, new HyperlinkRenderer()); // this.setDefaultRenderer(String.class, new HyperlinkRenderer()); this.addMouseListener(new CellRendererMouseListener()); if (PropertyManager.getManager().isAdvancedLayout()) { this.setTableHeader(null); } } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @param metaAtributes DOCUMENT ME! */ public void setAttributes(final Collection metaAtributes) { this.getAttributeTableModel().setAttributes(metaAtributes); } /** * DOCUMENT ME! */ public void clear() { // System.out.println("clear attribute table"); if (this.cellEditor != null) { this.cellEditor.cancelCellEditing(); } this.getAttributeTableModel().clear(); this.clearSelection(); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ protected AttributeTableModel getAttributeTableModel() { return (AttributeTableModel)super.getModel(); } @Override public TableCellEditor getCellEditor(final int row, final int column) { TableCellEditor editor = null; if (column == 1) { editor = this.getAttributeTableModel().getCellEditor(row, column); if (editor == null) { editor = getDefaultEditor(this.getAttributeTableModel().getClassAt(row, column)); } } return editor; } @Override public TableCellRenderer getCellRenderer(final int row, final int column) { final TableCellRenderer renderer = null; if (column == 1) { /*renderer = this.getAttributeTableModel().getCellRenderer(row, column); * if(renderer == null) { renderer = getDefaultEditor(this.getAttributeTableModel().getClassAt(row, * column));}*/ if (this.getAttributeTableModel().getValueAt(row, column) != null) { final Attribute attribute = ((Attribute)this.getAttributeTableModel().getValueAt(row, column)); if (attribute.referencesObject() && (attribute.getValue() != null)) { try { new URL(attribute.getValue().toString()); return hyperlinkRenderer; } catch (Throwable exp) { if (logger.isDebugEnabled()) { logger.debug("getCellRenderer() attribute " + attribute.getName() + " is no valid url"); // NOI18N } } } } } return super.getCellRenderer(row, column); } /** * Getter for property editable. * * @return Value of property editable. */ @Override public boolean isEditable() { return this.getAttributeTableModel().isEditable(); } /** * Setter for property editable. * * @param editable New value of property editable. */ @Override public void setEditable(final boolean editable) { this.getAttributeTableModel().setEditable(editable); if (!editable && (this.cellEditor != null)) { this.cellEditor.cancelCellEditing(); } } @Override public String getToolTipText(final MouseEvent e) { String tip = null; final java.awt.Point p = e.getPoint(); final int rowIndex = rowAtPoint(p); final int colIndex = columnAtPoint(p); final int realColumnIndex = convertColumnIndexToModel(colIndex); if (rowIndex != -1) { final Object value = getValueAt(rowIndex, colIndex); if (value != null) { tip = value.toString(); } return tip; } else { return ""; } } // ######################################################################### //~ Inner Classes ---------------------------------------------------------- /** * Gibt MouseEvents an Renderer weiter. * * @version $Revision$, $Date$ */ protected class CellRendererMouseListener extends MouseAdapter { //~ Methods ------------------------------------------------------------ @Override public void mouseClicked(final MouseEvent event) { if (logger.isDebugEnabled()) { logger.debug("mouseClick"); // NOI18N } this.translateMouseEvent(event); } @Override public void mousePressed(final MouseEvent event) { this.translateMouseEvent(event); } @Override public void mouseReleased(final MouseEvent event) { this.translateMouseEvent(event); } /** * DOCUMENT ME! * * @param event DOCUMENT ME! */ protected void translateMouseEvent(final MouseEvent event) { final Point point = event.getPoint(); final int column = columnAtPoint(point); if (column == 1) { final int row = rowAtPoint(point); final TableCellRenderer renderer = getCellRenderer(row, column); if (renderer instanceof HyperlinkRenderer) { // Component component = prepareRenderer(renderer, row, column); final Component component = ((HyperlinkRenderer)renderer).getComponent(); final Rectangle cellRect = getCellRect(row, column, false); point.translate(-cellRect.x, -cellRect.y); // MouseEvent newEvent = new MouseEvent(component, event.getID(), event.getWhen(), // event.getModifiers(), point.x, point.y, event.getClickCount(), event.isPopupTrigger()); final MouseEvent newEvent = SwingUtilities.convertMouseEvent(AttributeTable.this, event, component); component.dispatchEvent(newEvent); } } } } // ComplexContainer implementation /*public final boolean addComplexEditor(ComplexEditor complexChildEditor) * { this.complexContainerDelegate.addComplexEditor(complexChildEditor); } public final java.util.Map * getChildEditors() { return this.complexContainerDelegate.getChildEditors(); } public final java.awt.Component * getComponent() { return this.complexContainerDelegate.getComponent(); } public final BasicContainer * getParentContainer() { return this.complexContainerDelegate.getParentContainer(); } public final java.lang.Object * getValue(java.lang.Object key) { return this.complexContainerDelegate.getValue(key); } public final boolean * hideComplexEditorComponentUI(Component complexChildEditorComponent) { return * this.complexContainerDelegate.hideComplexEditorComponentUI(complexChildEditorComponent); } public final boolean * removeComplexEditor(ComplexEditor complexChildEditor) { return * this.complexContainerDelegate.removeComplexEditor(complexChildEditor); } public final void * setValue(java.lang.Object key, java.lang.Object value) { this.complexContainerDelegate.setValue(key, value); } * public final boolean showComplexEditorComponentUI(Component complexChildEditorComponent) { return * this.complexContainerDelegate.showComplexEditorComponentUI(complexChildEditorComponent);}*/ /** * Delegate -> keine Mehrfachvererbung! :-( */ /*protected class ComplexTableEditorDelegate extends AbstractComplexEditor * { public java.lang.Object getValue(java.lang.Object key) { //return AttributeTable.this.g return null; } * public boolean isEditable(java.util.EventObject anEvent) { AttributeTable.this.isEditable(); } public void * setValue(java.lang.Object key, java.lang.Object value) { }}*/ }