/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * AttributeEditor.java * * Created on 1. Juli 2004, 13:42 */ package Sirius.navigator.ui.attributes.editor; import Sirius.navigator.connection.*; import Sirius.navigator.exception.*; import Sirius.navigator.method.*; import Sirius.navigator.plugin.interfaces.EmbededControlBar; import Sirius.navigator.resource.*; import Sirius.navigator.types.iterator.*; import Sirius.navigator.types.treenode.*; import Sirius.navigator.ui.*; import Sirius.navigator.ui.attributes.*; import Sirius.navigator.ui.attributes.editor.metaobject.*; import Sirius.navigator.ui.widget.*; import Sirius.server.localserver.attribute.Attribute; import Sirius.server.middleware.types.*; import org.apache.log4j.Logger; import java.awt.*; import java.awt.datatransfer.*; import java.awt.event.*; import java.net.*; import java.util.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; import javax.swing.table.*; import javax.swing.tree.*; import de.cismet.cids.editors.BeanInitializer; import de.cismet.cids.editors.EditorBeanInitializerStore; import de.cismet.tools.CismetThreadPool; import de.cismet.tools.gui.StaticSwingTools; /** * DOCUMENT ME! * * @author pascal * @version $Revision$, $Date$ */ public class AttributeEditor extends javax.swing.JPanel implements EmbededControlBar { //~ Instance fields -------------------------------------------------------- protected TreePath treePath; private final Logger logger = Logger.getLogger(this.getClass()); private final ResourceManager resources = ResourceManager.getManager(); private Object treeNode = null; private ComplexEditor editor = null; private Object commitBlocker = new Object(); // Variables declaration - do not modify//GEN-BEGIN:variables private Sirius.navigator.ui.attributes.AttributeTree attributeTree; private javax.swing.JButton cancelButton; private javax.swing.JButton commitButton; private javax.swing.JPanel controlBar; private javax.swing.JScrollPane editorScrollPane; private javax.swing.JPanel switchPanel; private Sirius.navigator.ui.widget.TitleBar titleBar; // End of variables declaration//GEN-END:variables //~ Constructors ----------------------------------------------------------- /** * Creates new form AttributeEditor. */ public AttributeEditor() { initComponents(); final ActionListener buttonListener = new ButtonListener(); this.cancelButton.addActionListener(buttonListener); this.commitButton.addActionListener(buttonListener); // this.editButton.addActionListener(buttonListener); // this.pinButton.addActionListener(buttonListener); this.attributeTree.addTreeSelectionListener(new MetaObjectListener()); this.attributeTree.setIgnoreInvisibleAttributes(false); } //~ Methods ---------------------------------------------------------------- @Override public void setControlBarVisible(final boolean isVisible) { controlBar.setVisible(isVisible); } @Override public Vector<AbstractButton> getControlBarButtons() { final Vector<AbstractButton> buttons = new Vector<AbstractButton>(); buttons.add(commitButton); buttons.add(cancelButton); return buttons; } /** * DOCUMENT ME! * * @param treePath DOCUMENT ME! * @param node DOCUMENT ME! */ public void setTreeNode(final TreePath treePath, final Object node) { this.treePath = treePath; setTreeNode(node); } /** * DOCUMENT ME! * * @param node DOCUMENT ME! */ public void setTreeNode(final Object node) { this.confirmEdit(); this.attributeTree.setTreeNode(node); // wait for attribute thread synchronized (this.attributeTree) { try { // 10 sec timeout if (logger.isDebugEnabled()) { logger.debug("waiting for attribute thread to finish"); // NOI18N } this.attributeTree.wait(10000); } catch (Throwable t) { logger.error("thread synchronization failed", t); // NOI18N } } this.treeNode = node; if ((this.attributeTree.getRootNode() != null) && (this.attributeTree.getRootNode() instanceof ObjectAttributeNode)) { logger.info("setTreeNode(): initializing editor "); // NOI18N this.editor = new DefaultComplexMetaAttributeEditor(); final ObjectAttributeNode rootNode = (ObjectAttributeNode)this.attributeTree.getRootNode(); final MetaObject metaObject = rootNode.getMetaObject(); final MetaAttributeEditorLocator mael = new MetaAttributeEditorLocator(); try { // HELL if (mael.getEditor(metaObject) != null) { editor = (ComplexEditor)mael.getEditor(metaObject); if (logger.isDebugEnabled()) { logger.debug("Editor :" + ((ObjectTreeNode)treeNode).getMetaClass().getComplexEditor()); // NOI18N } } else { logger.warn("MetaAttributeEditorLocator returned null for object:" + metaObject); // NOI18N } } catch (Exception e) { logger.info("setTreeNode(): initializing editor EXception", e); // NOI18N } // TimEasy: hier wird das Innere des Editors erzeugt und in die Scrollpane gesetzt final Component editorComponent = this.editor.getEditorComponent( null, rootNode.getAttributeKey(), metaObject); this.editorScrollPane.getViewport().setView(editorComponent); this.commitButton.setEnabled(true); this.cancelButton.setEnabled(true); this.titleBar.setTitle(org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.titleBar.title", new Object[] { rootNode })); // NOI18N } else if (logger.isDebugEnabled()) { logger.warn("setTreeNode(): node is null or not of type ObjectAttributeNode"); // NOI18N this.clear(); } } /** * DOCUMENT ME! */ protected void clear() { this.editorScrollPane.getViewport().setView(null); this.editor = null; this.treeNode = null; this.attributeTree.clear(); this.commitButton.setEnabled(false); this.cancelButton.setEnabled(false); this.titleBar.setTitle(org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.titleBar.title")); // NOI18N } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Object getTreeNode() { return this.treeNode; } /** * DOCUMENT ME! */ public void cancel() { if (editor != null) { editor.cancelEditing(); if (logger.isDebugEnabled()) { logger.debug("cancel() rejecting changes in node " + this.treeNode); // NOI18N } // this.clear(); final ObjectTreeNode objectTreeNode = (ObjectTreeNode)this.treeNode; // neuer Knoten if (objectTreeNode.isNew()) { MethodManager.getManager() .deleteTreeNode(ComponentRegistry.getRegistry().getCatalogueTree(), objectTreeNode); } this.attributeTree.setTreeNode(null); this.treeNode = null; this.clear(); } } /** * DOCUMENT ME! */ private void commit() { synchronized (commitBlocker) { editor.stopEditing(); if (logger.isInfoEnabled()) { logger.info("commit() saving changes in node " + this.treeNode); // NOI18N } this.editor.setValueChanged(false); final ObjectTreeNode objectTreeNode = (ObjectTreeNode)this.getTreeNode(); ComponentRegistry.getRegistry().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); CismetThreadPool.execute(new Thread(new Runnable() { @Override public void run() { final MetaObject uneditedMetaObject = objectTreeNode.getMetaObject(); final MetaObject editedMetaObject = (MetaObject)AttributeEditor.this.editor.getValue(); MetaObject savedMetaObject = null; objectTreeNode.setChanged(true); // leere Attribute? final String emptyAttributeName = MethodManager.getManager() .findEmptyAttributes(editedMetaObject); if (emptyAttributeName == null) { try { // neuer Knoten if (objectTreeNode.isNew()) { Link link; final TreeNode parent = objectTreeNode.getParent(); if (parent != null) { link = new Link( ((DefaultMetaTreeNode)parent).getID(), objectTreeNode.getDomain()); } else { logger.warn("commit(): node '" + objectTreeNode + "' has no parent node'"); // NOI18N link = new Link(-1, objectTreeNode.getDomain()); } if (logger.isInfoEnabled()) { logger.info("commit(): insert meta object: " + editedMetaObject.getName()); // NOI18N } savedMetaObject = SessionManager.getProxy() .insertMetaObject(editedMetaObject, objectTreeNode.getDomain()); // neues objekt zuweisen objectTreeNode.setMetaObject(savedMetaObject); if (logger.isInfoEnabled()) { logger.info("commit(): add node: " + objectTreeNode); // NOI18N } final Node node = SessionManager.getProxy() .addNode(objectTreeNode.getNode(), link); // parent permissions zuweisen... node.setPermissions( ((DefaultMetaTreeNode)objectTreeNode.getParent()).getNode() .getPermissions()); objectTreeNode.setNode(node); objectTreeNode.setNew(false); objectTreeNode.setChanged(false); // Component editorComponent = this.editor.getEditorComponent(null, // this.attributeTree.getRootNode().getAttributeKey(), savedMetaObject); // this.editorScrollPane.getViewport().setView(editorComponent); } else { if (logger.isInfoEnabled()) { logger.info("commit(): update meta object: " + editedMetaObject.getName()); // NOI18N } SessionManager.getProxy() .updateMetaObject(editedMetaObject, objectTreeNode.getDomain()); savedMetaObject = editedMetaObject; // neues altes objekt zuweisen objectTreeNode.setMetaObject(savedMetaObject); objectTreeNode.setChanged(false); } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { // XXX event w\u00E4re besser ... if (logger.isDebugEnabled()) { logger.debug("invokeLater() performing GUI update"); // NOI18N } final AttributeViewer attributeViewer = ComponentRegistry.getRegistry() .getAttributeViewer(); if (attributeViewer.getTreeNode() == AttributeEditor.this.getTreeNode()) { if (logger.isDebugEnabled()) { logger.debug( "commit() updating attribute viewer with new tree node"); // NOI18N } attributeViewer.setTreeNode(AttributeEditor.this.getTreeNode()); } // XXX i18n JOptionPane.showMessageDialog( AttributeEditor.this, org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.invokeLater().InfoMessage", new Object[] { objectTreeNode }), // NOI18N org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.invokeLater().InfoTitle"), // NOI18N JOptionPane.INFORMATION_MESSAGE); // AttributeEditor.this.setTreeNodes(objectTreeNode); AttributeEditor.this.clear(); ComponentRegistry.getRegistry() .getMainWindow() .setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); try { ComponentRegistry.getRegistry() .getCatalogueTree() .scrollPathToVisible( ComponentRegistry.getRegistry().getCatalogueTree() .getSelectionPath()); // hier k\u00F6nnte jetzt noch zu dem TAB gewechselt werden das vom // User gew\u00FCnscht ist } catch (Exception e) { logger.warn("can not scroll to selected object.", e); // NOI18N } // ((MutableTreeNode)AttributeEditor.this.getTreeNode()) } }); } catch (Throwable t) { logger.error( "add / insert of meta object '" + objectTreeNode.getMetaObject() + "' failed", t); // NOI18N ExceptionManager.getManager() .showExceptionDialog( ExceptionManager.WARNING, org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.commit().insertError.title"), // NOI18N org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.commit().insertError.message"), t); // NOI18N ComponentRegistry.getRegistry() .getMainWindow() .setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } else { // XXX i18n JOptionPane.showMessageDialog( AttributeEditor.this, org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.commit().ErrorMessage", new Object[] { emptyAttributeName }), // NOI18N org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.commit().ErrorTitle"), // NOI18N JOptionPane.WARNING_MESSAGE); ComponentRegistry.getRegistry() .getMainWindow() .setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } }, "commitEditThread")); // NOI18N } } /** * DOCUMENT ME! */ private void confirmEdit() { if (this.isChanged()) { if (JOptionPane.YES_NO_OPTION == JOptionPane.showOptionDialog( AttributeEditor.this, org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.confirmEdit().JOptionPane.message"), // NOI18N org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.confirmEdit().JOptionPane.title"), // NOI18N JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[] { org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.confirmEdit().JOptionPane.option1"), // NOI18N org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.confirmEdit().JOptionPane.option2") }, // NOI18N org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.confirmEdit().JOptionPane.option1"))) { // NOI18N this.commit(); } else { this.cancel(); } } else { if (logger.isDebugEnabled()) { logger.debug("confirmEdit(): no changes detected"); // NOI18N } this.cancel(); } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isChanged() { if (logger.isDebugEnabled()) { logger.debug("this.editor: " + this.editor); // NOI18N } if (this.editor != null) { if (logger.isDebugEnabled()) { logger.debug("this.editor.isValueChanged(): " + this.editor.isValueChanged()); // NOI18N } } if ((this.editor != null) && (this.editor.isValueChanged() || ((DefaultMetaTreeNode)this.treeNode).isNew())) { return true; } return false; } /** * This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The * content of this method is always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; final javax.swing.JToggleButton pinButton = new javax.swing.JToggleButton(); final javax.swing.JToggleButton editButton = new javax.swing.JToggleButton(); controlBar = new javax.swing.JPanel(); titleBar = new Sirius.navigator.ui.widget.TitleBar(); commitButton = new javax.swing.JButton(); cancelButton = new javax.swing.JButton(); switchPanel = new javax.swing.JPanel(); final javax.swing.JSplitPane splitPane = new javax.swing.JSplitPane(); editorScrollPane = new javax.swing.JScrollPane(); final javax.swing.JScrollPane treeScrollPane = new javax.swing.JScrollPane(); attributeTree = new Sirius.navigator.ui.attributes.AttributeTree(); pinButton.setIcon(resources.getIcon("attr_pin_off.gif")); // NOI18N pinButton.setToolTipText(org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.pinButton.tooltip")); // NOI18N pinButton.setActionCommand("pin"); // NOI18N pinButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); pinButton.setContentAreaFilled(false); pinButton.setFocusPainted(false); pinButton.setMaximumSize(new java.awt.Dimension(16, 16)); pinButton.setMinimumSize(new java.awt.Dimension(16, 16)); pinButton.setPreferredSize(new java.awt.Dimension(16, 16)); pinButton.setRolloverIcon(resources.getIcon("attr_pin_off.gif")); // NOI18N pinButton.setRolloverSelectedIcon(resources.getIcon("attr_pin_on.gif")); // NOI18N pinButton.setSelectedIcon(resources.getIcon("attr_pin_on.gif")); // NOI18N editButton.setIcon(resources.getIcon("objekt_bearbeiten.gif")); // NOI18N editButton.setToolTipText(org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.editButton.tooltip")); // NOI18N editButton.setActionCommand("edit"); // NOI18N editButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); editButton.setContentAreaFilled(false); editButton.setFocusPainted(false); editButton.setMaximumSize(new java.awt.Dimension(16, 16)); editButton.setMinimumSize(new java.awt.Dimension(16, 16)); editButton.setPreferredSize(new java.awt.Dimension(16, 16)); editButton.setRolloverIcon(resources.getIcon("objekt_bearbeiten.gif")); // NOI18N editButton.setRolloverSelectedIcon(resources.getIcon("objekt_bearbeiten.gif")); // NOI18N editButton.setSelectedIcon(resources.getIcon("objekt_bearbeiten.gif")); // NOI18N setLayout(new java.awt.BorderLayout()); controlBar.setLayout(new java.awt.GridBagLayout()); titleBar.setIcon(resources.getIcon("floatingframe.gif")); // NOI18N titleBar.setTitle(org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.titleBar.title")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; controlBar.add(titleBar, gridBagConstraints); commitButton.setIcon(resources.getIcon("save_objekt.gif")); // NOI18N commitButton.setToolTipText(org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.commitButton.tooltip")); // NOI18N commitButton.setActionCommand("commit"); // NOI18N commitButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); commitButton.setContentAreaFilled(false); commitButton.setEnabled(false); commitButton.setFocusPainted(false); commitButton.setMaximumSize(new java.awt.Dimension(16, 16)); commitButton.setMinimumSize(new java.awt.Dimension(16, 16)); commitButton.setPreferredSize(new java.awt.Dimension(16, 16)); commitButton.setRolloverIcon(resources.getIcon("save_objekt.gif")); // NOI18N gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4); controlBar.add(commitButton, gridBagConstraints); cancelButton.setIcon(resources.getIcon("zurueck_objekt.gif")); // NOI18N cancelButton.setToolTipText(org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.cancelButton.tooltip")); // NOI18N cancelButton.setActionCommand("cancel"); // NOI18N cancelButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); cancelButton.setContentAreaFilled(false); cancelButton.setEnabled(false); cancelButton.setFocusPainted(false); cancelButton.setMaximumSize(new java.awt.Dimension(16, 16)); cancelButton.setMinimumSize(new java.awt.Dimension(16, 16)); cancelButton.setPreferredSize(new java.awt.Dimension(16, 16)); cancelButton.setRolloverIcon(resources.getIcon("zurueck_objekt.gif")); // NOI18N controlBar.add(cancelButton, new java.awt.GridBagConstraints()); add(controlBar, java.awt.BorderLayout.NORTH); switchPanel.setLayout(new java.awt.CardLayout()); splitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); splitPane.setResizeWeight(1.0); splitPane.setOneTouchExpandable(PropertyManager.getManager().isAdvancedLayout()); editorScrollPane.setPreferredSize(new java.awt.Dimension(250, 150)); splitPane.setTopComponent(editorScrollPane); treeScrollPane.setPreferredSize(new java.awt.Dimension(250, 150)); treeScrollPane.setRequestFocusEnabled(false); attributeTree.setMaximumSize(null); attributeTree.setMinimumSize(new java.awt.Dimension(100, 50)); attributeTree.setPreferredSize(null); treeScrollPane.setViewportView(attributeTree); splitPane.setBottomComponent(treeScrollPane); switchPanel.add(splitPane, "table"); // NOI18N add(switchPanel, java.awt.BorderLayout.CENTER); } // </editor-fold>//GEN-END:initComponents //~ Inner Classes ---------------------------------------------------------- /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ private class MetaObjectListener implements TreeSelectionListener { //~ Methods ------------------------------------------------------------ @Override public void valueChanged(final TreeSelectionEvent e) { if (AttributeEditor.this.editor != null) { final LinkedList activeChildEditorTree = new LinkedList(); final Object[] objects = e.getPath().getPath(); for (int i = 0; i < objects.length; i++) { if (objects[i] instanceof ObjectAttributeNode) { activeChildEditorTree.addLast(((ObjectAttributeNode)objects[i]).getAttributeKey()); } else if (logger.isDebugEnabled()) { logger.warn("valueChanged(): node '" + objects[i] + "' is no object tree node"); // NOI18N } } if (logger.isDebugEnabled()) { logger.debug("valueChanged(): selection editor for selected object tree node"); // NOI18N } AttributeEditor.this.editor.setActiveChildEditorTree(activeChildEditorTree); /*if(e.isAddedPath()) * { }else if(logger.isDebugEnabled())logger.debug("valueChanged(): ignoring selection event");*/ } else if (logger.isDebugEnabled()) { logger.warn("editor is null"); // NOI18N } } } /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ private class ButtonListener implements ActionListener { //~ Methods ------------------------------------------------------------ @Override public void actionPerformed(final ActionEvent e) { if (logger.isDebugEnabled()) { logger.debug("actionPerformed(): action command: " + e.getActionCommand()); // NOI18N } if (e.getActionCommand().equals("commit")) { // NOI18N // XXX // Alle \u00C4nderungen im Objekt speichern: editor.stopEditing(); if (isChanged()) { final MetaObject editedMetaObject = (MetaObject)AttributeEditor.this.editor.getValue(); if (editedMetaObject.getBean().hasObjectWritePermission(SessionManager.getSession().getUser())) { if (JOptionPane.YES_NO_OPTION == JOptionPane.showOptionDialog( AttributeEditor.this, org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.ButtonListener.JOptionPane.commit.message"), // NOI18N org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.ButtonListener.JOptionPane.commit.title"), // NOI18N JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null)) { commit(); } } else { JOptionPane.showMessageDialog( AttributeEditor.this, org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.ButtonListener.JOptionPane.noobjectpermission.message"), org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.ButtonListener.JOptionPane.noobjectpermission.title"), JOptionPane.WARNING_MESSAGE); return; } } else { AttributeEditor.this.clear(); } } else if (e.getActionCommand().equals("cancel") // NOI18N && (JOptionPane.YES_NO_OPTION == JOptionPane.showOptionDialog( AttributeEditor.this, org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.ButtonListener.JOptionPane.cancel.message"), // NOI18N org.openide.util.NbBundle.getMessage( AttributeEditor.class, "AttributeEditor.ButtonListener.JOptionPane.cancel.title"), // NOI18N JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null))) { logger.error("unknown action command '" + e.getActionCommand() + "'"); // NOI18N cancel(); } else { logger.error("unknown action command '" + e.getActionCommand() + "'"); // NOI18N } /*else if(e.getActionCommand().equals("edit")) * { confirmEdit(); DefaultMetaTreeNode node = * ComponentRegistry.getRegistry().getActiveCatalogue().getSelectedNode(); * AttributeEditor.this.setTreeNodes(node); } else if(e.getActionCommand().equals("pin")) { * AttributeEditor.this.setUpdateEnabled(AttributeEditor.this.pinButton.isSelected()); } * /*if(e.getActionCommand().equals("edit")) { // ask to save or revert changes if(!editButton.isSelected()) * { confirmEdit(); } commitButton.setEnabled(editButton.isSelected()); * cancelButton.setEnabled(editButton.isSelected()); attributeTable.setEditable(editButton.isSelected()); } * else if(e.getActionCommand().equals("commit") && changed && JOptionPane.YES_NO_OPTION == * JOptionPane.showOptionDialog(AttributeEditor.this, * resources.getString("attribute.viewer.commit.message"), * resources.getString("attribute.viewer.commit.tooltip"), JOptionPane.YES_NO_OPTION, * JOptionPane.QUESTION_MESSAGE, null, null, null)) { commit(); } else * if(e.getActionCommand().equals("cancel") && changed && JOptionPane.YES_NO_OPTION == * JOptionPane.showOptionDialog(AttributeEditor.this, * resources.getString("attribute.viewer.cancel.message"), * resources.getString("attribute.viewer.cancel.tooltip"), JOptionPane.YES_NO_OPTION, * JOptionPane.QUESTION_MESSAGE, null, null, null)) { cancel(); } else * if(e.getActionCommand().equals("pin")) { * AttributeEditor.this.setUpdateEnabled(AttributeEditor.this.pinButton.isSelected());}*/ } } }