You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by an...@apache.org on 2009/12/09 19:34:07 UTC

svn commit: r888911 - in /cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler: editor/ editor/datanode/ undo/ util/

Author: andrey
Date: Wed Dec  9 18:34:07 2009
New Revision: 888911

URL: http://svn.apache.org/viewvc?rev=888911&view=rev
Log:
CAY-1191 Undo/Redo support in modeler. patch by Anton Sakalouski

Added:
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTextFieldUndoable.java
Modified:
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EjbqlQueryScriptsTab.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplateScriptsTab.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/AdapterView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/CustomDataSourceView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DBCPDataSourceView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JDBCDataSourceView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JNDIDataSourceView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/PasswordEncoderView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JTextFieldUndoListener.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneWidgetFactory.java

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EjbqlQueryScriptsTab.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EjbqlQueryScriptsTab.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EjbqlQueryScriptsTab.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EjbqlQueryScriptsTab.java Wed Dec  9 18:34:07 2009
@@ -32,15 +32,14 @@
 
 import org.apache.cayenne.map.event.QueryEvent;
 import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.undo.JTextFieldUndoListener;
 import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.project.validator.EJBQLQueryValidator;
 import org.apache.cayenne.project.validator.EJBQLQueryValidator.PositionException;
 import org.apache.cayenne.query.EJBQLQuery;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.swing.components.textpane.JCayenneTextPane;
 import org.apache.cayenne.util.Util;
-import org.apache.cayenne.validation.ValidationException;
 
 public class EjbqlQueryScriptsTab extends JPanel implements DocumentListener {
 
@@ -64,12 +63,8 @@
 
         scriptArea = CayenneWidgetFactory.createJEJBQLTextPane();
         
-        new TextAdapter(scriptArea.getPane()) {
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
-        
+        scriptArea.getPane().getDocument().addUndoableEditListener(new JTextFieldUndoListener(scriptArea.getPane()));
+         
         scriptArea.getDocument().addDocumentListener(this);
 
         scriptArea.getDocument().addDocumentListener(new DocumentListener() {

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplateScriptsTab.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplateScriptsTab.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplateScriptsTab.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplateScriptsTab.java Wed Dec  9 18:34:07 2009
@@ -45,11 +45,9 @@
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
 import org.apache.cayenne.modeler.util.DbAdapterInfo;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.util.Util;
-import org.apache.cayenne.validation.ValidationException;
 import org.syntax.jedit.JEditTextArea;
 import org.syntax.jedit.KeywordMap;
 import org.syntax.jedit.tokenmarker.PLSQLTokenMarker;
@@ -143,12 +141,6 @@
         
         scriptArea = CayenneWidgetFactory.createJEditTextArea();
         
-        new TextAdapter(scriptArea) {
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
-        
         scriptArea.setTokenMarker(SQL_TEMPLATE_MARKER);
         scriptArea.getDocument().addDocumentListener(this);
         

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/AdapterView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/AdapterView.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/AdapterView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/AdapterView.java Wed Dec  9 18:34:07 2009
@@ -24,22 +24,17 @@
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 
-import org.apache.cayenne.modeler.util.TextAdapter;
-import org.apache.cayenne.validation.ValidationException;
+import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 
 public class AdapterView extends JPanel {
 
-    protected TextAdapter customAdapter;
+    protected JTextField customAdapter;
 
     public AdapterView() {
-        this.customAdapter = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
+        this.customAdapter = CayenneWidgetFactory.createUndoableTextField();
 
         // assemble
 
@@ -49,13 +44,13 @@
         topPanelBuilder.setDefaultDialogBorder();
 
         topPanelBuilder.appendSeparator("DbAdapter Configuration");
-        topPanelBuilder.append("Custom Adapter (optional):", customAdapter.getComponent());
+        topPanelBuilder.append("Custom Adapter (optional):", customAdapter);
 
         setLayout(new BorderLayout());
         add(topPanelBuilder.getPanel(), BorderLayout.CENTER);
     }
 
     public JTextField getCustomAdapter() {
-        return (JTextField) customAdapter.getComponent();
+        return customAdapter;
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/CustomDataSourceView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/CustomDataSourceView.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/CustomDataSourceView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/CustomDataSourceView.java Wed Dec  9 18:34:07 2009
@@ -24,8 +24,7 @@
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 
-import org.apache.cayenne.modeler.util.TextAdapter;
-import org.apache.cayenne.validation.ValidationException;
+import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
@@ -34,16 +33,11 @@
  */
 public class CustomDataSourceView extends JPanel {
 
-    protected TextAdapter locationHint;
+    protected JTextField locationHint;
 
     public CustomDataSourceView() {
 
-        locationHint = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-            
-        };
+        locationHint = CayenneWidgetFactory.createUndoableTextField();
 
         // assemble
         FormLayout layout = new FormLayout("right:80dlu, 3dlu, fill:200dlu", "");
@@ -52,13 +46,13 @@
 
         builder.appendSeparator("Custom Configuration");
 
-        builder.append("Location Hint:", getLocationHint());
+        builder.append("Location Hint:", locationHint);
 
         this.setLayout(new BorderLayout());
         this.add(builder.getPanel(), BorderLayout.CENTER);
     }
 
     public JTextField getLocationHint() {
-        return (JTextField) locationHint.getComponent();
+        return locationHint;
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DBCPDataSourceView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DBCPDataSourceView.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DBCPDataSourceView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DBCPDataSourceView.java Wed Dec  9 18:34:07 2009
@@ -17,6 +17,7 @@
  *  under the License.
  ****************************************************************/
 
+
 package org.apache.cayenne.modeler.editor.datanode;
 
 import java.awt.BorderLayout;
@@ -24,8 +25,7 @@
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 
-import org.apache.cayenne.modeler.util.TextAdapter;
-import org.apache.cayenne.validation.ValidationException;
+import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
@@ -34,16 +34,11 @@
  */
 public class DBCPDataSourceView extends JPanel {
 
-    protected TextAdapter propertiesFile;
+    protected JTextField propertiesFile;
 
     public DBCPDataSourceView() {
 
-        propertiesFile = new TextAdapter(new JTextField()) {
-
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
+        propertiesFile = CayenneWidgetFactory.createUndoableTextField();
 
         // assemble
         FormLayout layout = new FormLayout("right:80dlu, 3dlu, fill:200dlu", "");
@@ -52,13 +47,13 @@
 
         builder.appendSeparator("Apache DBCP Configuration");
 
-        builder.append("DBCP Properties File:", getPropertiesFile());
+        builder.append("DBCP Properties File:", propertiesFile);
 
         setLayout(new BorderLayout());
         add(builder.getPanel(), BorderLayout.CENTER);
     }
 
     public JTextField getPropertiesFile() {
-        return (JTextField) propertiesFile.getComponent();
+        return propertiesFile;
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JDBCDataSourceView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JDBCDataSourceView.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JDBCDataSourceView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JDBCDataSourceView.java Wed Dec  9 18:34:07 2009
@@ -26,8 +26,7 @@
 import javax.swing.JPasswordField;
 import javax.swing.JTextField;
 
-import org.apache.cayenne.modeler.util.TextAdapter;
-import org.apache.cayenne.validation.ValidationException;
+import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
 
 import com.jgoodies.forms.builder.PanelBuilder;
 import com.jgoodies.forms.layout.CellConstraints;
@@ -35,83 +34,59 @@
 
 public class JDBCDataSourceView extends JPanel {
 
-    protected TextAdapter driver;
-    protected TextAdapter url;
-    protected TextAdapter userName;
-
+    protected JTextField     driver;
+    protected JTextField     url;
+    protected JTextField     userName;
     protected JPasswordField password;
 
-    protected TextAdapter minConnections;
-    protected TextAdapter maxConnections;
-
-    protected JButton syncWithLocal;
-
-    public JDBCDataSourceView() {
-
-        driver = new TextAdapter(new JTextField()) {
+    protected JTextField     minConnections;
+    protected JTextField     maxConnections;
+    protected JButton        syncWithLocal;
 
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
 
-        url = new TextAdapter(new JTextField()) {
 
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
 
-        userName = new TextAdapter(new JTextField()) {
 
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
 
-        password = new JPasswordField();
-        minConnections = new TextAdapter(new JTextField(6)) {
 
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
+    public JDBCDataSourceView() {
 
-        maxConnections = new TextAdapter(new JTextField(6)) {
+        driver           = CayenneWidgetFactory.createUndoableTextField();
+        url              = CayenneWidgetFactory.createUndoableTextField();
+        userName         = CayenneWidgetFactory.createUndoableTextField();
+        password         = new JPasswordField();
+        minConnections   = CayenneWidgetFactory.createUndoableTextField(6);
+        maxConnections   = CayenneWidgetFactory.createUndoableTextField(6);
+        syncWithLocal    = new JButton("Sync with Local");
+        syncWithLocal.setToolTipText("Update from local DataSource");
 
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
 
-        syncWithLocal = new JButton("Sync with Local");
-        syncWithLocal.setToolTipText("Update from local DataSource");
 
         // assemble
         CellConstraints cc = new CellConstraints();
-        // FormLayout layout = new FormLayout(
-        // "right:80dlu, 3dlu, fill:50dlu, 3dlu, fill:74dlu, 3dlu, fill:70dlu",
-        // "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p");
-        FormLayout layout = new FormLayout(
-                "right:80dlu, 3dlu, fill:50dlu, 3dlu, fill:74dlu, 3dlu, fill:70dlu", // Columns
-                "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p"); // Rows
+//        FormLayout layout = new FormLayout(
+//                "right:80dlu, 3dlu, fill:50dlu, 3dlu, fill:74dlu, 3dlu, fill:70dlu",
+//                "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p");
+        FormLayout layout =
+          new FormLayout("right:80dlu, 3dlu, fill:50dlu, 3dlu, fill:74dlu, 3dlu, fill:70dlu", // Columns
+                         "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p"); // Rows
 
         PanelBuilder builder = new PanelBuilder(layout);
         builder.setDefaultDialogBorder();
-
+        
         builder.addSeparator("JDBC Configuration", cc.xywh(1, 1, 7, 1));
         builder.addLabel("JDBC Driver:", cc.xy(1, 3));
-        builder.add(getDriver(), cc.xywh(3, 3, 5, 1));
+        builder.add(driver, cc.xywh(3, 3, 5, 1));
         builder.addLabel("DB URL:", cc.xy(1, 5));
-        builder.add(getUrl(), cc.xywh(3, 5, 5, 1));
+        builder.add(url, cc.xywh(3, 5, 5, 1));
         builder.addLabel("Username:", cc.xy(1, 7));
-        builder.add(getUserName(), cc.xywh(3, 7, 5, 1));
+        builder.add(userName, cc.xywh(3, 7, 5, 1));
         builder.addLabel("Password:", cc.xy(1, 9));
         builder.add(password, cc.xywh(3, 9, 5, 1));
         builder.addLabel("Min Connections:", cc.xy(1, 11));
-        builder.add(getMinConnections(), cc.xy(3, 11));
+        builder.add(minConnections, cc.xy(3, 11));
         builder.addLabel("Max Connections:", cc.xy(1, 13));
-        builder.add(getMaxConnections(), cc.xy(3, 13));
+        builder.add(maxConnections, cc.xy(3, 13));
         builder.add(syncWithLocal, cc.xy(7, 15));
 
         this.setLayout(new BorderLayout());
@@ -119,7 +94,7 @@
     }
 
     public JTextField getDriver() {
-        return (JTextField) driver.getComponent();
+        return driver;
     }
 
     public JPasswordField getPassword() {
@@ -127,19 +102,19 @@
     }
 
     public JTextField getUrl() {
-        return (JTextField) url.getComponent();
+        return url;
     }
 
     public JTextField getUserName() {
-        return (JTextField) userName.getComponent();
+        return userName;
     }
 
     public JTextField getMaxConnections() {
-        return (JTextField) maxConnections.getComponent();
+        return maxConnections;
     }
 
     public JTextField getMinConnections() {
-        return (JTextField) minConnections.getComponent();
+        return minConnections;
     }
 
     public JButton getSyncWithLocal() {

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JNDIDataSourceView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JNDIDataSourceView.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JNDIDataSourceView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JNDIDataSourceView.java Wed Dec  9 18:34:07 2009
@@ -24,8 +24,7 @@
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 
-import org.apache.cayenne.modeler.util.TextAdapter;
-import org.apache.cayenne.validation.ValidationException;
+import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
@@ -34,15 +33,11 @@
  */
 public class JNDIDataSourceView extends JPanel {
 
-    protected TextAdapter jndiPath;
+    protected JTextField jndiPath;
 
     public JNDIDataSourceView() {
 
-        jndiPath = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
+        jndiPath = CayenneWidgetFactory.createUndoableTextField();
 
         // assemble
         FormLayout layout = new FormLayout("right:80dlu, 3dlu, fill:200dlu", "");
@@ -51,13 +46,13 @@
 
         builder.appendSeparator("JNDI Configuration");
 
-        builder.append("JNDI Location:", getJndiPath());
+        builder.append("JNDI Location:", jndiPath);
 
         this.setLayout(new BorderLayout());
         this.add(builder.getPanel(), BorderLayout.CENTER);
     }
 
     public JTextField getJndiPath() {
-        return (JTextField) jndiPath.getComponent();
+        return jndiPath;
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java Wed Dec  9 18:34:07 2009
@@ -89,7 +89,7 @@
         super(parent);
 
         this.tabbedPaneController = tabController;
-        this.view = new MainDataNodeView();
+        this.view = new MainDataNodeView((ProjectController) getParent());
         this.datasourceEditors = new HashMap();
         this.localDataSources = new HashMap();
 

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeView.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeView.java Wed Dec  9 18:34:07 2009
@@ -29,9 +29,8 @@
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 
+import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
-import org.apache.cayenne.modeler.util.TextAdapter;
-import org.apache.cayenne.validation.ValidationException;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
@@ -42,8 +41,7 @@
  */
 public class MainDataNodeView extends JPanel {
 
-    protected TextAdapter dataNodeName;
-    
+    protected JTextField dataNodeName;
     protected JComboBox factories;
     protected JPanel dataSourceDetail;
     protected CardLayout dataSourceDetailLayout;
@@ -51,17 +49,13 @@
     protected JButton configLocalDataSources;
     protected JComboBox schemaUpdateStrategy;
 
-    public MainDataNodeView() {
+    public MainDataNodeView(final ProjectController projectController) {
 
         // create widgets
-        this.dataNodeName = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
-        
+        this.dataNodeName = CayenneWidgetFactory.createUndoableTextField();
+
         this.factories = CayenneWidgetFactory.createUndoableComboBox();
-        
+
         this.localDataSources = CayenneWidgetFactory.createUndoableComboBox();
 
         this.schemaUpdateStrategy = CayenneWidgetFactory.createUndoableComboBox();
@@ -107,7 +101,7 @@
     }
 
     public JTextField getDataNodeName() {
-        return (JTextField) dataNodeName.getComponent();
+        return dataNodeName;
     }
 
     public JPanel getDataSourceDetail() {

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/PasswordEncoderView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/PasswordEncoderView.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/PasswordEncoderView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/PasswordEncoderView.java Wed Dec  9 18:34:07 2009
@@ -34,164 +34,148 @@
 import org.apache.cayenne.conf.PasswordEncoding;
 import org.apache.cayenne.conn.DataSourceInfo;
 import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
-import org.apache.cayenne.modeler.util.TextAdapter;
-import org.apache.cayenne.validation.ValidationException;
 
 import com.jgoodies.forms.builder.PanelBuilder;
 import com.jgoodies.forms.layout.CellConstraints;
 import com.jgoodies.forms.layout.FormLayout;
 
-public class PasswordEncoderView extends JPanel {
 
-    protected JComboBox passwordEncoder;
-    protected JComboBox passwordLocation;
-
-    protected TextAdapter passwordKey;
-    protected TextAdapter passwordSource;
-
-    protected JLabel passwordSourceLabel;
-
-    private static final String PASSWORD_CLASSPATH = "Classpath Search (File System)";
+public class PasswordEncoderView extends JPanel{
+    
+    protected JComboBox      passwordEncoder;
+    protected JComboBox      passwordLocation;
+    protected JTextField     passwordKey;
+    protected JTextField     passwordSource;
+    protected JLabel         passwordSourceLabel;
+    
+    private static final String PASSWORD_CLASSPATH  = "Classpath Search (File System)";
     private static final String PASSWORD_EXECUTABLE = "Executable Program";
-    private static final String PASSWORD_MODEL = "Cayenne Model";
-    private static final String PASSWORD_URL = "URL (file:, http:, etc)";
-
+    private static final String PASSWORD_MODEL      = "Cayenne Model";
+    private static final String PASSWORD_URL        = "URL (file:, http:, etc)";
+    
     private static final Object[] PASSWORD_LOCATIONS = new Object[] {
-            DataSourceInfo.PASSWORD_LOCATION_MODEL,
-            DataSourceInfo.PASSWORD_LOCATION_CLASSPATH,
-            DataSourceInfo.PASSWORD_LOCATION_EXECUTABLE,
-            DataSourceInfo.PASSWORD_LOCATION_URL
-    };
-
+        DataSourceInfo.PASSWORD_LOCATION_MODEL,
+        DataSourceInfo.PASSWORD_LOCATION_CLASSPATH,
+        DataSourceInfo.PASSWORD_LOCATION_EXECUTABLE,
+        DataSourceInfo.PASSWORD_LOCATION_URL };
+    
     private static final Map<String, String> passwordSourceLabels = new TreeMap<String, String>();
 
-    static {
-        passwordSourceLabels.put(DataSourceInfo.PASSWORD_LOCATION_MODEL, PASSWORD_MODEL);
-        passwordSourceLabels.put(
-                DataSourceInfo.PASSWORD_LOCATION_CLASSPATH,
-                PASSWORD_CLASSPATH);
-        passwordSourceLabels.put(
-                DataSourceInfo.PASSWORD_LOCATION_EXECUTABLE,
-                PASSWORD_EXECUTABLE);
-        passwordSourceLabels.put(DataSourceInfo.PASSWORD_LOCATION_URL, PASSWORD_URL);
-    }
-
-    final class PasswordLocationRenderer extends DefaultListCellRenderer {
-
-        public Component getListCellRendererComponent(
-                JList list,
-                Object object,
-                int arg2,
-                boolean arg3,
-                boolean arg4) {
-            if (object != null)
-                object = passwordSourceLabels.get(object);
-            else
-                object = PASSWORD_MODEL;
-
-            return super.getListCellRendererComponent(list, object, arg2, arg3, arg4);
-        }
-    }
-
-    public PasswordEncoderView() {
-
-        this.passwordEncoder = CayenneWidgetFactory.createUndoableComboBox();
+    static
+    {
+      passwordSourceLabels.put(DataSourceInfo.PASSWORD_LOCATION_MODEL, PASSWORD_MODEL);
+      passwordSourceLabels.put(DataSourceInfo.PASSWORD_LOCATION_CLASSPATH, PASSWORD_CLASSPATH);
+      passwordSourceLabels.put(DataSourceInfo.PASSWORD_LOCATION_EXECUTABLE, PASSWORD_EXECUTABLE);
+      passwordSourceLabels.put(DataSourceInfo.PASSWORD_LOCATION_URL, PASSWORD_URL);
+    }
+    
+    final class PasswordLocationRenderer extends DefaultListCellRenderer
+    {
+      public Component getListCellRendererComponent(JList list,
+                                                    Object object,
+                                                    int arg2,
+                                                    boolean arg3,
+                                                    boolean arg4)
+      {
+        if (object != null)
+          object = passwordSourceLabels.get(object);
+        else
+          object = PASSWORD_MODEL;
+
+        return super.getListCellRendererComponent(list, object, arg2, arg3, arg4);
+      }
+    }
+    
+    public PasswordEncoderView(){
+        
+        this.passwordEncoder  = CayenneWidgetFactory.createUndoableComboBox();
         this.passwordLocation = CayenneWidgetFactory.createUndoableComboBox();
-
-        this.passwordSource = new TextAdapter(new JTextField()) {
-
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
-
-        this.passwordKey = new TextAdapter(new JTextField()) {
-
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-            }
-        };
-
-        // init combo box choices
-        passwordEncoder.setModel(new DefaultComboBoxModel(
-                PasswordEncoding.standardEncoders));
+        this.passwordSource   = CayenneWidgetFactory.createUndoableTextField();
+        this.passwordKey      = CayenneWidgetFactory.createUndoableTextField();
+        
+
+        
+        // init combo box choices                                                                                                                                                                
+        passwordEncoder.setModel(new DefaultComboBoxModel(PasswordEncoding.standardEncoders));
         passwordEncoder.setEditable(true);
 
         passwordLocation = CayenneWidgetFactory.createUndoableComboBox();
         passwordLocation.setRenderer(new PasswordLocationRenderer());
 
-        DefaultComboBoxModel passwordLocationModel = new DefaultComboBoxModel(
-                PASSWORD_LOCATIONS);
+        DefaultComboBoxModel passwordLocationModel = new DefaultComboBoxModel(PASSWORD_LOCATIONS);
 
         passwordLocation.setModel(passwordLocationModel);
 
+        
         CellConstraints cc = new CellConstraints();
 
-        FormLayout layout = new FormLayout(
-                "right:80dlu, 3dlu, fill:50dlu, 3dlu, fill:74dlu, 3dlu, fill:70dlu", // Columns
-                "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p"); // Rows
-
+        FormLayout layout =
+            new FormLayout("right:80dlu, 3dlu, fill:50dlu, 3dlu, fill:74dlu, 3dlu, fill:70dlu", // Columns
+                   "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p"); // Rows
+        
         PanelBuilder builder = new PanelBuilder(layout);
         builder.setDefaultDialogBorder();
-
+        
         builder.addSeparator("Encoder", cc.xywh(1, 1, 7, 1));
-
+        
         builder.addLabel("Password Encoder:", cc.xy(1, 11));
         builder.add(passwordEncoder, cc.xywh(3, 11, 5, 1));
 
         builder.addLabel("Password Encoder Key:", cc.xy(1, 13));
-        builder.add(getPasswordKey(), cc.xywh(3, 13, 5, 1));
+        builder.add(passwordKey, cc.xywh(3, 13, 5, 1));
 
-        builder.addLabel("Note: Cayenne supplied encoders do not use a key.", cc.xywh(
-                3,
-                15,
-                5,
-                1));
+        builder.addLabel("Note: Cayenne supplied encoders do not use a key.", cc.xywh(3, 15, 5, 1));
 
         builder.addLabel("Password Location:", cc.xy(1, 17));
         builder.add(passwordLocation, cc.xywh(3, 17, 5, 1));
 
         passwordSourceLabel = builder.addLabel("Password Source:", cc.xy(1, 19));
-        builder.add(getPasswordSource(), cc.xywh(3, 19, 5, 1));
+        builder.add(passwordSource, cc.xywh(3, 19, 5, 1));
+
 
         this.setLayout(new BorderLayout());
         this.add(builder.getPanel(), BorderLayout.CENTER);
 
     }
-
+    
     /**
      * @return the passwordEncoder
      */
-    public JComboBox getPasswordEncoder() {
-        return passwordEncoder;
+    public JComboBox getPasswordEncoder()
+    {
+      return passwordEncoder;
     }
 
     /**
      * @return the passwordLocation
      */
-    public JComboBox getPasswordLocation() {
-        return passwordLocation;
+    public JComboBox getPasswordLocation()
+    {
+      return passwordLocation;
     }
 
     /**
      * @return the passwordKey
      */
-    public JTextField getPasswordKey() {
-        return (JTextField) passwordKey.getComponent();
+    public JTextField getPasswordKey()
+    {
+      return passwordKey;
     }
 
     /**
      * @return the passwordSource
      */
-    public JTextField getPasswordSource() {
-        return (JTextField) passwordSource.getComponent();
+    public JTextField getPasswordSource()
+    {
+      return passwordSource;
     }
 
     /**
      * @return the passwordLocationLabel
      */
-    public JLabel getPasswordSourceLabel() {
-        return passwordSourceLabel;
+    public JLabel getPasswordSourceLabel()
+    {
+      return passwordSourceLabel;
     }
 
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JTextFieldUndoListener.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JTextFieldUndoListener.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JTextFieldUndoListener.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JTextFieldUndoListener.java Wed Dec  9 18:34:07 2009
@@ -35,31 +35,32 @@
 public class JTextFieldUndoListener implements UndoableEditListener {
 
     public CompoundEdit compoundEdit;
-    
+
     private TextAdapter adapter;
+    private JTextComponent editor;
 
     private int lastOffset;
     private int lastLength;
 
     public JTextFieldUndoListener(TextAdapter adapter) {
+        this(adapter.getComponent());
         this.adapter = adapter;
+    }
+
+    public JTextFieldUndoListener(JTextComponent editor) {
+        this.editor = editor;
 
-        this.adapter.getComponent().addFocusListener(new FocusAdapter() {
+        this.editor.addFocusListener(new FocusAdapter() {
 
             @Override
             public void focusLost(FocusEvent e) {
-                if (compoundEdit != null) {
-                    compoundEdit.end();
-                    compoundEdit = null;
-                }
+                finishCurrentEdit();
             }
         });
     }
 
     public void undoableEditHappened(UndoableEditEvent e) {
-        
-        JTextComponent editor = adapter.getComponent();
-        
+
         if (compoundEdit == null || !compoundEdit.canUndo()) {
             compoundEdit = startCompoundEdit(e.getEdit());
             lastLength = editor.getDocument().getLength();
@@ -89,17 +90,25 @@
     }
 
     private CompoundEdit startCompoundEdit(UndoableEdit anEdit) {
-        
-        JTextComponent editor = adapter.getComponent();
-        
+
         lastOffset = editor.getCaretPosition();
         lastLength = editor.getDocument().getLength();
 
-        compoundEdit = new TextCompoundEdit(adapter);
+        compoundEdit = (this.adapter != null)
+                ? new TextCompoundEdit(adapter, this)
+                : new TextCompoundEdit(editor, this);
+
         compoundEdit.addEdit(anEdit);
 
         Application.getInstance().getUndoManager().addEdit(compoundEdit);
 
         return compoundEdit;
     }
+
+    public void finishCurrentEdit() {
+        if (compoundEdit != null) {
+            compoundEdit.end();
+            compoundEdit = null;
+        }
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java Wed Dec  9 18:34:07 2009
@@ -45,19 +45,29 @@
 public class TextCompoundEdit extends CompoundEdit implements DocumentListener {
 
     private TextAdapter adapter;
+    private JTextComponent editor;
 
     private TreePath treePath;
     private int selectedTabIndex;
     private JTabbedPane tabbedPane;
-    
+
     private Object targetObject;
 
+    private JTextFieldUndoListener listener;
+
     public Object getTargetObject() {
         return targetObject;
     }
 
-    public TextCompoundEdit(TextAdapter adapter) {
+    public TextCompoundEdit(TextAdapter adapter, JTextFieldUndoListener listener) {
+        this(adapter.getComponent(), listener);
         this.adapter = adapter;
+    }
+
+    public TextCompoundEdit(JTextComponent editor, JTextFieldUndoListener listener) {
+
+        this.editor = editor;
+        this.listener = listener;
 
         EditorView editorView = ((CayenneModelerFrame) Application
                 .getInstance()
@@ -127,17 +137,14 @@
 
             public void run() {
                 int offset = e.getOffset() + e.getLength();
-                offset = Math.min(offset, adapter
-                        .getComponent()
-                        .getDocument()
-                        .getLength());
-                adapter.getComponent().setCaretPosition(offset);
+                offset = Math.min(offset, editor.getDocument().getLength());
+                editor.setCaretPosition(offset);
             }
         });
     }
 
     public void removeUpdate(DocumentEvent e) {
-        adapter.getComponent().setCaretPosition(e.getOffset());
+        editor.setCaretPosition(e.getOffset());
     }
 
     public void changedUpdate(DocumentEvent e) {
@@ -151,22 +158,34 @@
     public void redo() throws CannotRedoException {
         restoreSelections();
 
-        super.redo();
+        if (canRedo()) {
+            super.redo();
+        }
+        else {
+            die();
+        }
 
-        adapter.getComponent().requestFocusInWindow();
+        editor.requestFocusInWindow();
     }
 
     public void undo() throws CannotUndoException {
         restoreSelections();
 
-        end();
+        listener.finishCurrentEdit();
 
-        super.undo();
+        if (canUndo()) {
+            super.undo();
+        }
+        else {
+            die();
+        }
 
-        adapter.updateModel();
+        if (adapter != null) {
+            adapter.updateModel();
+        }
 
-        adapter.getComponent().requestFocusInWindow();
-        adapter.getComponent().selectAll();
+        editor.requestFocusInWindow();
+        editor.selectAll();
     }
 
     @Override
@@ -180,14 +199,14 @@
     }
 
     public JTextComponent getEditor() {
-        return adapter.getComponent();
+        return editor;
     }
 
     public void watchCaretPosition() {
-        adapter.getComponent().getDocument().addDocumentListener(this);
+        editor.getDocument().addDocumentListener(this);
     }
 
     public void stopWatchingCaretPosition() {
-        adapter.getComponent().getDocument().removeDocumentListener(this);
+        editor.getDocument().removeDocumentListener(this);
     }
 }
\ No newline at end of file

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneWidgetFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneWidgetFactory.java?rev=888911&r1=888910&r2=888911&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneWidgetFactory.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneWidgetFactory.java Wed Dec  9 18:34:07 2009
@@ -35,10 +35,11 @@
 import javax.swing.JTextField;
 import javax.swing.SwingConstants;
 import javax.swing.table.TableCellEditor;
-import javax.swing.text.JTextComponent;
 
 import org.apache.cayenne.modeler.ModelerPreferences;
 import org.apache.cayenne.modeler.undo.JComboBoxUndoListener;
+import org.apache.cayenne.modeler.undo.JEditTextAreaUndoableAdapter;
+import org.apache.cayenne.modeler.undo.JTextFieldUndoListener;
 import org.apache.cayenne.modeler.util.combo.AutoCompletion;
 import org.apache.cayenne.modeler.util.combo.ComboBoxCellEditor;
 import org.apache.cayenne.swing.components.textpane.JCayenneTextPane;
@@ -109,6 +110,22 @@
     }
 
     /**
+     * Creates undoable JTextField.
+     * 
+     */
+    public static JTextField createUndoableTextField() {
+        return new JTextFieldUndoable();
+    }
+
+    /**
+     * Creates undoable JTextField.
+     * 
+     */
+    public static JTextField createUndoableTextField(int size) {
+        return new JTextFieldUndoable(size);
+    }
+
+    /**
      * Creates cell editor for text field
      */
     public static DefaultCellEditor createCellEditor(JTextField textField) {
@@ -203,6 +220,9 @@
             area.setInputHandler(new MacInputHandler());
         }
 
+        area.getDocument().addUndoableEditListener(
+                new JTextFieldUndoListener(new JEditTextAreaUndoableAdapter(area)));
+
         return area;
     }
 

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTextFieldUndoable.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTextFieldUndoable.java?rev=888911&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTextFieldUndoable.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTextFieldUndoable.java Wed Dec  9 18:34:07 2009
@@ -0,0 +1,52 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.modeler.util;
+
+import javax.swing.JTextField;
+import javax.swing.event.UndoableEditListener;
+
+import org.apache.cayenne.modeler.undo.JTextFieldUndoListener;
+
+class JTextFieldUndoable extends JTextField {
+    
+    private UndoableEditListener undoListener;
+
+    JTextFieldUndoable() {
+        super();
+        this.undoListener = new JTextFieldUndoListener(this);
+        this.getDocument().addUndoableEditListener(this.undoListener);
+    }
+    
+    JTextFieldUndoable(int size) {
+        super(size);
+        this.undoListener = new JTextFieldUndoListener(this);
+        this.getDocument().addUndoableEditListener(this.undoListener);
+    }
+
+    @Override
+    public void setText(String t) {
+        this.getDocument().removeUndoableEditListener(this.undoListener);
+        try {
+            super.setText(t);
+        }
+        finally {
+            this.getDocument().addUndoableEditListener(this.undoListener);
+        }
+    }
+}