http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbMigrateOptionsDialog.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbMigrateOptionsDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbMigrateOptionsDialog.java
deleted file mode 100644
index f53bf9c..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbMigrateOptionsDialog.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*****************************************************************
- *   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.dialog.db;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Collection;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.CayenneDialog;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-
-public class DbMigrateOptionsDialog extends CayenneDialog {
-       private static final long serialVersionUID = 1L;
-       public static final int CANCEL = 0;
-    public static final int SELECT = 1;
-
-       protected JLabel schemaLabel;
-       protected JLabel catalogLabel;
-    protected JComboBox<String> catalogSelector;
-    protected JComboBox<String> schemaSelector;
-    protected JButton selectButton;
-    protected JButton cancelButton;
-    protected int choice;
-    
-    public DbMigrateOptionsDialog(Collection<String> catalogs, 
Collection<String> schemas, String dbUserName) {
-        super(Application.getFrame(), "Migrate DB Schema: Select Catalog and 
Schema");
-        init();
-        initController();
-        initFromModel(catalogs, schemas, dbUserName);
-
-        pack();
-        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-        setModal(true);
-        centerWindow();        
-    }
-    
-    protected void init() {
-        selectButton = new JButton("Continue");
-        cancelButton = new JButton("Cancel");
-        catalogSelector = new JComboBox<>();
-        schemaSelector = new JComboBox<>();
-        FormLayout layout = new FormLayout(
-                "right:pref, 3dlu, fill:max(170dlu;pref):grow",
-                "");
-        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
-        builder.setDefaultDialogBorder();
-
-        catalogLabel = builder.append("Select Catalog:", catalogSelector, 
true);
-        schemaLabel = builder.append("Select Schema:", schemaSelector);
-
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.add(selectButton);
-        buttons.add(cancelButton);
-        
-        getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
-        getContentPane().add(buttons, BorderLayout.SOUTH);        
-    }
-    
-    protected void initController() {
-        selectButton.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent e) {
-                processSelect();
-            }
-        });
-
-        cancelButton.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent e) {
-                processCancel();
-            }
-        });
-    }
-    
-    private void processSelect() {
-        choice = SELECT;
-        setVisible(false);
-    }
-
-    private void processCancel() {
-       schemaSelector.setSelectedItem(null);
-        choice = CANCEL;
-        setVisible(false);
-    }
-    
-    protected void initFromModel(Collection<String> catalogs, 
Collection<String> schemas, String dbUserName) {
-
-        this.choice = CANCEL;
-
-        if(!schemas.isEmpty()) {
-            schemaLabel.setVisible(true);
-            schemaSelector.setModel(new 
DefaultComboBoxModel<>(schemas.toArray(new String[0])));
-            schemaSelector.setVisible(true);
-        } else {
-            schemaLabel.setVisible(false);
-            schemaSelector.setVisible(false);
-        }
-
-        if(!catalogs.isEmpty()) {
-            catalogLabel.setVisible(true);
-            catalogSelector.setModel(new 
DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
-            catalogSelector.setVisible(true);
-        } else {
-            catalogLabel.setVisible(false);
-            catalogSelector.setVisible(false);
-        }
-
-        if (dbUserName == null) {
-            return;
-        }
-
-        // select schema belonging to the user
-        for (String schema : schemas) {
-            if (dbUserName.equalsIgnoreCase(schema)) {
-                schemaSelector.setSelectedItem(schema);
-                break;
-            }
-        }
-
-        for(String catalog : catalogs) {
-            if(dbUserName.equalsIgnoreCase(catalog)) {
-                catalogSelector.setSelectedItem(catalog);
-                break;
-            }
-        }
-    }
-    
-    /**
-     * Returns selected schema.
-     */
-    public String getSelectedSchema() {
-       return (String) schemaSelector.getSelectedItem();
-    }
-
-    public String getSelectedCatalog() {
-        return (String) catalogSelector.getSelectedItem();
-    }
-    
-    public int getChoice() {
-       return choice;
-    }
-    
-    public void showDialog() {
-       setVisible(true);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
deleted file mode 100644
index 52a3666..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- * 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.dialog.db;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.configuration.event.DataMapEvent;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbsync.merge.AbstractToDbToken;
-import org.apache.cayenne.dbsync.merge.DbMerger;
-import org.apache.cayenne.dbsync.merge.DefaultModelMergeDelegate;
-import org.apache.cayenne.dbsync.merge.MergeDirection;
-import org.apache.cayenne.dbsync.merge.MergerContext;
-import org.apache.cayenne.dbsync.merge.MergerToken;
-import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
-import org.apache.cayenne.dbsync.merge.ProxyModelMergeDelegate;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
-import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
-import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
-import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
-import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
-import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.project.Project;
-import org.apache.cayenne.resource.Resource;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
-import org.apache.cayenne.validation.ValidationResult;
-import org.apache.commons.logging.LogFactory;
-
-import javax.sql.DataSource;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.WindowConstants;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import java.awt.Component;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-public class MergerOptions extends CayenneController {
-
-    protected MergerOptionsView view;
-    protected ObjectBinding sqlBinding;
-
-    protected DBConnectionInfo connectionInfo;
-    protected DataMap dataMap;
-    protected DbAdapter adapter;
-    protected String textForSQL;
-
-    protected MergerTokenSelectorController tokens;
-    protected String defaultCatalog;
-    protected String defaultSchema;
-    private MergerTokenFactoryProvider mergerTokenFactoryProvider;
-
-    public MergerOptions(ProjectController parent,
-                         String title,
-                         DBConnectionInfo connectionInfo,
-                         DataMap dataMap,
-                         String defaultCatalog,
-                         String defaultSchema,
-                         MergerTokenFactoryProvider 
mergerTokenFactoryProvider) {
-        super(parent);
-
-        this.mergerTokenFactoryProvider = mergerTokenFactoryProvider;
-        this.dataMap = dataMap;
-        this.tokens = new MergerTokenSelectorController(parent);
-        this.view = new MergerOptionsView(tokens.getView());
-        this.connectionInfo = connectionInfo;
-        this.defaultCatalog = defaultCatalog;
-        this.defaultSchema = defaultSchema;
-        this.view.setTitle(title);
-        initController();
-
-        prepareMigrator();
-        createSQL();
-        refreshView();
-    }
-
-    public Component getView() {
-        return view;
-    }
-
-    public String getTextForSQL() {
-        return textForSQL;
-    }
-
-    protected void initController() {
-
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        sqlBinding = builder.bindToTextArea(view.getSql(), "textForSQL");
-
-        builder.bindToAction(view.getGenerateButton(), 
"generateSchemaAction()");
-        builder.bindToAction(view.getSaveSqlButton(), "storeSQLAction()");
-        builder.bindToAction(view.getCancelButton(), "closeAction()");
-
-        // refresh SQL if different tables were selected
-        view.getTabs().addChangeListener(new ChangeListener() {
-
-            public void stateChanged(ChangeEvent e) {
-                if (view.getTabs().getSelectedIndex() == 1) {
-                    // this assumes that some tables where 
checked/unchecked... not very
-                    // efficient
-                    refreshGeneratorAction();
-                }
-            }
-        });
-    }
-
-    /**
-     * check database and create the {@link List} of {@link MergerToken}s
-     */
-    protected void prepareMigrator() {
-        try {
-            adapter = 
connectionInfo.makeAdapter(getApplication().getClassLoadingService());
-
-            MergerTokenFactory mergerTokenFactory = 
mergerTokenFactoryProvider.get(adapter);
-            tokens.setMergerTokenFactory(mergerTokenFactory);
-
-
-            FiltersConfig filters = FiltersConfig.create(defaultCatalog, 
defaultSchema, TableFilter.everything(),
-                    PatternFilter.INCLUDE_NOTHING);
-
-            DbMerger merger = DbMerger.builder(mergerTokenFactory)
-                    .filters(filters)
-                    .build();
-
-            DbLoaderConfiguration config = new DbLoaderConfiguration();
-            config.setFiltersConfig(filters);
-
-            DataSource dataSource = 
connectionInfo.makeDataSource(getApplication().getClassLoadingService());
-
-            DataMap dbImport = new DataMap();
-            try (Connection conn = dataSource.getConnection();) {
-                new DbLoader(conn,
-                        adapter,
-                        new 
LoggingDbLoaderDelegate(LogFactory.getLog(DbLoader.class)),
-                        new 
DefaultObjectNameGenerator(NoStemStemmer.getInstance()))
-                        .load(dbImport, config);
-
-            } catch (SQLException e) {
-                throw new CayenneRuntimeException("Can't doLoad dataMap from 
db.", e);
-            }
-
-            tokens.setTokens(merger.createMergeTokens(dataMap, dbImport));
-        } catch (Exception ex) {
-            reportError("Error loading adapter", ex);
-        }
-    }
-
-    /**
-     * Returns SQL statements generated for selected schema generation options.
-     */
-    protected void createSQL() {
-        // convert them to string representation for display
-        StringBuilder buf = new StringBuilder();
-
-        Iterator<MergerToken> it = tokens.getSelectedTokens().iterator();
-        String batchTerminator = adapter.getBatchTerminator();
-
-        String lineEnd = batchTerminator != null ? "\n" + batchTerminator + 
"\n\n" : "\n\n";
-        while (it.hasNext()) {
-            MergerToken token = it.next();
-
-            if (token instanceof AbstractToDbToken) {
-                AbstractToDbToken tdb = (AbstractToDbToken) token;
-                for (String sql : tdb.createSql(adapter)) {
-                    buf.append(sql);
-                    buf.append(lineEnd);
-                }
-            }
-        }
-
-        textForSQL = buf.toString();
-    }
-
-    protected void refreshView() {
-        sqlBinding.updateView();
-    }
-
-    // ===============
-    // Actions
-    // ===============
-
-    /**
-     * Starts options dialog.
-     */
-    public void startupAction() {
-        view.pack();
-        view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
-        view.setModal(true);
-        makeCloseableOnEscape();
-        centerView();
-        view.setVisible(true);
-    }
-
-    public void refreshGeneratorAction() {
-        refreshSQLAction();
-    }
-
-    /**
-     * Updates a text area showing generated SQL.
-     */
-    public void refreshSQLAction() {
-        createSQL();
-        sqlBinding.updateView();
-    }
-
-    /**
-     * Performs configured schema operations via DbGenerator.
-     */
-    public void generateSchemaAction() {
-        refreshGeneratorAction();
-
-        // sanity check...
-        List<MergerToken> tokensToMigrate = tokens.getSelectedTokens();
-        if (tokensToMigrate.isEmpty()) {
-            JOptionPane.showMessageDialog(getView(), "Nothing to migrate.");
-            return;
-        }
-
-        DataSource dataSource;
-        try {
-            dataSource = connectionInfo.makeDataSource(getApplication()
-                    .getClassLoadingService());
-        } catch (SQLException ex) {
-            reportError("Migration Error", ex);
-            return;
-        }
-
-        final Collection<ObjEntity> loadedObjEntities = new LinkedList<>();
-
-        MergerContext mergerContext = MergerContext.builder(dataMap)
-                .syntheticDataNode(dataSource, adapter)
-                .delegate(createDelegate(loadedObjEntities))
-                .build();
-
-        boolean modelChanged = applyTokens(tokensToMigrate, mergerContext);
-
-        DefaultDbImportAction.flattenManyToManyRelationships(
-                dataMap,
-                loadedObjEntities,
-                mergerContext.getNameGenerator());
-
-        notifyProjectModified(modelChanged);
-
-        reportFailures(mergerContext);
-    }
-
-    private ModelMergeDelegate createDelegate(final Collection<ObjEntity> 
loadedObjEntities) {
-        return new ProxyModelMergeDelegate(new DefaultModelMergeDelegate()) {
-            @Override
-            public void objEntityAdded(ObjEntity ent) {
-                loadedObjEntities.add(ent);
-                super.objEntityAdded(ent);
-            }
-        };
-    }
-
-    private boolean applyTokens(List<MergerToken> tokensToMigrate, 
MergerContext mergerContext) {
-        boolean modelChanged = false;
-
-        try {
-            for (MergerToken tok : tokensToMigrate) {
-                int numOfFailuresBefore = getFailuresCount(mergerContext);
-
-                tok.execute(mergerContext);
-
-                if (!modelChanged && 
tok.getDirection().equals(MergeDirection.TO_MODEL)) {
-                    modelChanged = true;
-                }
-                if (numOfFailuresBefore == getFailuresCount(mergerContext)) {
-                    // looks like the token executed without failures
-                    tokens.removeToken(tok);
-                }
-            }
-        } catch (Throwable th) {
-            reportError("Migration Error", th);
-        }
-
-        return modelChanged;
-    }
-
-    private int getFailuresCount(MergerContext mergerContext) {
-        return mergerContext.getValidationResult().getFailures().size();
-    }
-
-    private void reportFailures(MergerContext mergerContext) {
-        ValidationResult failures = mergerContext.getValidationResult();
-        if (failures == null || !failures.hasFailures()) {
-            JOptionPane.showMessageDialog(getView(), "Migration Complete.");
-        } else {
-            new ValidationResultBrowser(this).startupAction(
-                    "Migration Complete",
-                    "Migration finished. The following problem(s) were 
ignored.",
-                    failures);
-        }
-    }
-
-    private void notifyProjectModified(boolean modelChanged) {
-        if(!modelChanged) {
-            return;
-        }
-
-        // mark the model as unsaved
-        Project project = getApplication().getProject();
-        project.setModified(true);
-
-        ProjectController projectController = getProjectController();
-        projectController.setDirty(true);
-
-        projectController.fireDataMapEvent(new 
DataMapEvent(Application.getFrame(),
-                dataMap, MapEvent.REMOVE));
-        projectController.fireDataMapEvent(new 
DataMapEvent(Application.getFrame(),
-                dataMap, MapEvent.ADD));
-    }
-
-    /**
-     * Allows user to save generated SQL in a file.
-     */
-    public void storeSQLAction() {
-        JFileChooser fc = new JFileChooser();
-        fc.setDialogType(JFileChooser.SAVE_DIALOG);
-        fc.setDialogTitle("Save SQL Script");
-
-        Resource projectDir = 
getApplication().getProject().getConfigurationResource();
-
-        if (projectDir != null) {
-            fc.setCurrentDirectory(new File(projectDir.getURL().getPath()));
-        }
-
-        if (fc.showSaveDialog(getView()) == JFileChooser.APPROVE_OPTION) {
-            refreshGeneratorAction();
-
-            try {
-                File file = fc.getSelectedFile();
-                FileWriter fw = new FileWriter(file);
-                PrintWriter pw = new PrintWriter(fw);
-                pw.print(textForSQL);
-                pw.flush();
-                pw.close();
-            } catch (IOException ex) {
-                reportError("Error Saving SQL", ex);
-            }
-        }
-    }
-
-    private ProjectController getProjectController() {
-        return getApplication().getFrameController().getProjectController();
-    }
-
-    public void closeAction() {
-        view.dispose();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptionsView.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptionsView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptionsView.java
deleted file mode 100644
index 24069da..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptionsView.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*****************************************************************
- *   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.dialog.db;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.JTextArea;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.SwingConstants;
-
-import org.apache.cayenne.modeler.Application;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- * Wizard for altering the database to match the data map.
- */
-public class MergerOptionsView extends JDialog {
-
-    protected JTextArea sql;
-    protected JButton generateButton;
-    protected JButton cancelButton;
-    protected JButton saveSqlButton;
-
-    protected Component tables;
-    protected JTabbedPane tabs;
-
-    public MergerOptionsView(Component tables) {
-        super(Application.getFrame());
-        
-        // create widgets
-        this.generateButton = new JButton("Migrate");
-        this.cancelButton = new JButton("Close");
-        this.saveSqlButton = new JButton("Save SQL");
-
-        this.tables = tables;
-        this.tabs = new JTabbedPane(SwingConstants.TOP);
-        this.sql = new JTextArea();
-        sql.setEditable(false);
-        sql.setLineWrap(true);
-        sql.setWrapStyleWord(true);
-
-        JPanel sqlTextPanel = new JPanel(new BorderLayout());
-        sqlTextPanel.add(new JScrollPane(
-                sql,
-                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
-                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), 
BorderLayout.CENTER);
-
-        CellConstraints cc = new CellConstraints();
-        PanelBuilder builder = new PanelBuilder(new FormLayout(
-                "fill:min(50dlu;pref):grow",
-                "p, 9dlu, p, 3dlu, fill:40dlu:grow"));
-        builder.setDefaultDialogBorder();
-        builder.addSeparator("Generated SQL", cc.xywh(1, 3, 1, 1));
-        builder.add(sqlTextPanel, cc.xy(1, 5));
-
-        tabs.addTab("Operations", new JScrollPane(
-                tables,
-                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
-                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
-        tabs.addTab("Generated SQL", builder.getPanel());
-
-        // we need the right preferred size so that dialog "pack()" produces 
decent
-        // default size...
-        tabs.setPreferredSize(new Dimension(600, 350));
-
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.add(saveSqlButton);
-        buttons.add(Box.createHorizontalStrut(20));
-        buttons.add(cancelButton);
-        buttons.add(generateButton);
-
-        Container contentPane = this.getContentPane();
-        contentPane.setLayout(new BorderLayout());
-        contentPane.add(tabs, BorderLayout.CENTER);
-        contentPane.add(buttons, BorderLayout.SOUTH);
-    }
-
-    public JButton getCancelButton() {
-        return cancelButton;
-    }
-
-    public JTabbedPane getTabs() {
-        return tabs;
-    }
-
-    /*
-     * public JCheckBox getCreateFK() { return createFK; } public JCheckBox 
getCreatePK() {
-     * return createPK; } public JCheckBox getCreateTables() { return 
createTables; }
-     * public JCheckBox getDropPK() { return dropPK; } public JCheckBox 
getDropTables() {
-     * return dropTables; }
-     */
-
-    public JButton getGenerateButton() {
-        return generateButton;
-    }
-
-    public JButton getSaveSqlButton() {
-        return saveSqlButton;
-    }
-
-    public JTextArea getSql() {
-        return sql;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java
deleted file mode 100644
index 666b113..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*****************************************************************
- *   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.dialog.db;
-
-import org.apache.cayenne.dbsync.merge.MergeDirection;
-import org.apache.cayenne.dbsync.merge.MergerToken;
-import org.apache.cayenne.dbsync.merge.TokenComparator;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-
-import javax.swing.*;
-import javax.swing.table.AbstractTableModel;
-import javax.swing.table.TableColumn;
-import javax.swing.table.TableColumnModel;
-import javax.swing.table.TableModel;
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class MergerTokenSelectorController extends CayenneController {
-
-    protected MergerTokenSelectorView view;
-    protected ObjectBinding tableBinding;
-
-    protected MergerToken token;
-    protected int permanentlyExcludedCount;
-    protected Set<MergerToken> excludedTokens;
-    protected List<MergerToken> selectableTokensList;
-    protected MergerTokenFactory mergerTokenFactory;
-
-    public MergerTokenSelectorController(CayenneController parent) {
-        super(parent);
-        this.view = new MergerTokenSelectorView();
-        this.excludedTokens = new HashSet<MergerToken>();
-        this.selectableTokensList = new ArrayList<MergerToken>();
-        initController();
-    }
-
-    public void setMergerTokenFactory(MergerTokenFactory mergerTokenFactory) {
-        this.mergerTokenFactory = mergerTokenFactory;
-    }
-
-    public void setTokens(List<MergerToken> tokens) {
-        selectableTokensList.clear();
-        selectableTokensList.addAll(tokens);
-        excludedTokens.addAll(tokens);
-    }
-
-    public List<MergerToken> getSelectedTokens() {
-        List<MergerToken> t = new ArrayList<MergerToken>(selectableTokensList);
-        t.removeAll(excludedTokens);
-        return Collections.unmodifiableList(t);
-    }
-
-    public List<MergerToken> getSelectableTokens() {
-        return Collections.unmodifiableList(selectableTokensList);
-    }
-    
-    public void removeToken(MergerToken token) {
-        selectableTokensList.remove(token);
-        excludedTokens.remove(token);
-
-        AbstractTableModel model = (AbstractTableModel) 
view.getTokens().getModel();
-        model.fireTableDataChanged();
-    }
-
-    // ----- properties -----
-
-    public Component getView() {
-        return view;
-    }
-
-    /**
-     * Called by table binding script to set current token.
-     */
-    public void setToken(MergerToken token) {
-        this.token = token;
-    }
-
-    /**
-     * Returns {@link MergerToken}s that are excluded from DB generation.
-     */
-    /*
-     * public Collection getExcludedTokens() { return excludedTokens; }
-     */
-
-    public boolean isIncluded() {
-        if (token == null) {
-            return false;
-        }
-
-        return !excludedTokens.contains(token);
-    }
-
-    public void setIncluded(boolean b) {
-        if (token == null) {
-            return;
-        }
-
-        if (b) {
-            excludedTokens.remove(token);
-        }
-        else {
-            excludedTokens.add(token);
-        }
-
-        tableSelectedAction();
-    }
-
-    /**
-     * A callback action that updates the state of Select All checkbox.
-     */
-    public void tableSelectedAction() {
-        int unselectedCount = excludedTokens.size() - permanentlyExcludedCount;
-
-        if (unselectedCount == selectableTokensList.size()) {
-            view.getCheckAll().setSelected(false);
-        }
-        else if (unselectedCount == 0) {
-            view.getCheckAll().setSelected(true);
-        }
-    }
-
-    // ------ other stuff ------
-
-    protected void initController() {
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
-        builder.bindToAction(view.getReverseAll(), "reverseAllAction()");
-
-        TableModel model = new MergerTokenTableModel(this);
-
-        MergeDirection[] dirs = new MergeDirection[] {
-                MergeDirection.TO_DB, MergeDirection.TO_MODEL
-        };
-
-        view.getTokens().setModel(model);
-
-        TableColumnModel columnModel = view.getTokens().getColumnModel();
-        
-        // dropdown for direction column
-        JComboBox directionCombo = 
Application.getWidgetFactory().createComboBox(dirs, false);
-        directionCombo.setEditable(false);
-        TableColumn directionColumn = columnModel.getColumn(
-                MergerTokenTableModel.COL_DIRECTION);
-        directionColumn.setCellEditor(new DefaultCellEditor(directionCombo));
-
-        
columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setPreferredWidth(50);
-        
columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setPreferredWidth(100);
-        
columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setMaxWidth(50);
-        
columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setMaxWidth(100);
-    }
-
-    public boolean isSelected(MergerToken token) {
-        return (selectableTokensList.contains(token) && 
!excludedTokens.contains(token));
-    }
-
-    public void select(MergerToken token, boolean select) {
-        if (select) {
-            excludedTokens.remove(token);
-        }
-        else {
-            excludedTokens.add(token);
-        }
-    }
-
-    public void setDirection(MergerToken token, MergeDirection direction) {
-        if (token.getDirection().equals(direction)) {
-            return;
-        }
-        int i = selectableTokensList.indexOf(token);
-        MergerToken reverse = token.createReverse(mergerTokenFactory);
-        selectableTokensList.set(i, reverse);
-        if (excludedTokens.remove(token)) {
-            excludedTokens.add(reverse);
-        }
-        
-        /**
-         * Repaint, so that "Operation" column updates properly
-         */
-        view.getTokens().repaint();
-    }
-
-    public void checkAllAction() {
-
-        boolean isCheckAllSelected = view.getCheckAll().isSelected();
-
-        if (isCheckAllSelected) {
-            excludedTokens.clear();
-        }
-        else {
-            excludedTokens.addAll(selectableTokensList);
-        }
-
-        AbstractTableModel model = (AbstractTableModel) 
view.getTokens().getModel();
-        model.fireTableDataChanged();
-    }
-
-    public void reverseAllAction() {
-        
-        for (int i = 0; i < selectableTokensList.size(); i++) {
-            MergerToken token = selectableTokensList.get(i);
-            MergerToken reverse = token.createReverse(mergerTokenFactory);
-            selectableTokensList.set(i, reverse);
-            if (excludedTokens.remove(token)) {
-                excludedTokens.add(reverse);
-            }
-        }
-
-        Collections.sort(selectableTokensList, new TokenComparator());
-        AbstractTableModel model = (AbstractTableModel) 
view.getTokens().getModel();
-        model.fireTableDataChanged();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorView.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorView.java
deleted file mode 100644
index a644a48..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorView.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*****************************************************************
- *   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.dialog.db;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.factories.ButtonBarFactory;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- */
-public class MergerTokenSelectorView extends JPanel {
-
-    protected JTable tokens;
-    protected JCheckBox checkAll;
-    protected JLabel checkAllLabel;
-    protected JButton reverseAll;
-
-    public MergerTokenSelectorView() {
-
-        this.checkAll = new JCheckBox();
-        this.checkAllLabel = new JLabel("Check All Operations");
-        this.reverseAll = new JButton("Reverse All Operations");
-
-        checkAll.addItemListener(new ItemListener() {
-
-            public void itemStateChanged(ItemEvent event) {
-                if (checkAll.isSelected()) {
-                    checkAllLabel.setText("Uncheck All Operations");
-                }
-                else {
-                    checkAllLabel.setText("Check All Operations");
-                }
-            }
-        });
-
-        // assemble
-        JPanel checkAllPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
-        checkAllPanel.add(checkAll);
-        checkAllPanel.add(checkAllLabel);
-        JPanel topPanel = new JPanel();
-        topPanel.setLayout(new BorderLayout());
-        topPanel.add(checkAllPanel, BorderLayout.WEST);
-        topPanel.add(ButtonBarFactory.buildRightAlignedBar(reverseAll), 
BorderLayout.EAST);
-
-        tokens = new JTable();
-        tokens.setRowHeight(25);
-        tokens.setRowMargin(3);
-
-        CellConstraints cc = new CellConstraints();
-        PanelBuilder builder = new PanelBuilder(new FormLayout(
-                "fill:min(50dlu;pref):grow",
-                "p, 3dlu, fill:40dlu:grow"));
-        builder.setDefaultDialogBorder();
-        builder.addSeparator("Select Operations", cc.xy(1, 1));
-        builder.add(new JScrollPane(
-                tokens,
-                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
-                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), cc.xy(1, 3));
-
-        setLayout(new BorderLayout());
-        add(topPanel, BorderLayout.NORTH);
-        add(builder.getPanel(), BorderLayout.CENTER);
-    }
-
-    public JTable getTokens() {
-        return tokens;
-    }
-
-    public JCheckBox getCheckAll() {
-        return checkAll;
-    }
-    
-    public JButton getReverseAll() {
-        return reverseAll;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenTableModel.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenTableModel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenTableModel.java
deleted file mode 100644
index 488b1e8..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenTableModel.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*****************************************************************
- *   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.dialog.db;
-
-import org.apache.cayenne.dbsync.merge.MergeDirection;
-import org.apache.cayenne.dbsync.merge.MergerToken;
-
-import javax.swing.table.AbstractTableModel;
-import java.util.List;
-
-
-public class MergerTokenTableModel extends AbstractTableModel {
-
-    public static final int COL_SELECT = 0;
-    public static final int COL_DIRECTION = 1;
-    public static final int COL_NAME = 2;
-    public static final int COL_VALUE = 3;
-
-    private MergerTokenSelectorController controller;
-
-    private List<MergerToken> tokens;
-
-    public MergerTokenTableModel(MergerTokenSelectorController controller) {
-        this.controller = controller;
-        this.tokens = controller.getSelectableTokens();
-    }
-
-    private MergerTokenSelectorController getController() {
-        return controller;
-    }
-
-    public Class getColumnClass(int columnIndex) {
-        switch (columnIndex) {
-            case COL_SELECT:
-                return Boolean.class;
-            case COL_DIRECTION:
-                // TODO: correct?
-                return String.class;
-            case COL_NAME:
-            case COL_VALUE:
-                return String.class;
-        }
-
-        return null;
-    }
-
-    public int getColumnCount() {
-        return 4;
-    }
-
-    public String getColumnName(int columnIndex) {
-        switch (columnIndex) {
-            case COL_SELECT:
-                return "";
-            case COL_NAME:
-                return "Operation";
-            case COL_DIRECTION:
-                return "Direction";
-            case COL_VALUE:
-                return "";
-        }
-
-        return null;
-    }
-
-    public int getRowCount() {
-        return tokens.size();
-    }
-
-    public MergerToken getToken(int rowIndex) {
-        return tokens.get(rowIndex);
-    }
-
-    public Object getValueAt(int rowIndex, int columnIndex) {
-        MergerToken token = getToken(rowIndex);
-        switch (columnIndex) {
-            case COL_SELECT:
-                return Boolean.valueOf(getController().isSelected(token));
-            case COL_NAME:
-                return token.getTokenName();
-            case COL_DIRECTION:
-                return token.getDirection();
-            case COL_VALUE:
-                return token.getTokenValue();
-        }
-        return null;
-    }
-
-    public boolean isCellEditable(int rowIndex, int columnIndex) {
-        switch (columnIndex) {
-            case COL_SELECT:
-            case COL_DIRECTION:
-                return true;
-        }
-        return false;
-    }
-
-    public void setValueAt(Object value, int rowIndex, int columnIndex) {
-        MergerToken token = getToken(rowIndex);
-        switch (columnIndex) {
-            case COL_SELECT:
-                Boolean val = (Boolean) value;
-                getController().select(token, val.booleanValue());
-                break;
-            case COL_DIRECTION:
-                MergeDirection direction = (MergeDirection) value;
-                getController().setDirection(token, direction);
-                break;
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
deleted file mode 100644
index 1b271bb..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.dialog.db;
-
-import org.apache.cayenne.configuration.server.DataSourceFactory;
-import org.apache.cayenne.configuration.server.DbAdapterFactory;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
-import org.apache.cayenne.dbsync.reverse.db.DbLoaderDelegate;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.MapLoader;
-import org.apache.cayenne.project.ProjectSaver;
-import org.apache.cayenne.tools.dbimport.DbImportConfiguration;
-import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
-import org.apache.commons.logging.Log;
-
-import java.io.IOException;
-import java.sql.Connection;
-
-public class ModelerDbImportAction extends DefaultDbImportAction {
-
-    private DataMap targetMap;
-    private DbLoader dbLoader;
-
-    public ModelerDbImportAction(Log logger,
-                                 ProjectSaver projectSaver,
-                                 DataSourceFactory dataSourceFactory,
-                                 DbAdapterFactory adapterFactory,
-                                 MapLoader mapLoader,
-                                 MergerTokenFactoryProvider 
mergerTokenFactoryProvider,
-                                 DataMap targetMap,
-                                 DbLoader dbLoader
-                                 ) {
-
-        super(logger, projectSaver, dataSourceFactory, adapterFactory, 
mapLoader, mergerTokenFactoryProvider);
-
-        this.targetMap = targetMap;
-        this.dbLoader = dbLoader;
-    }
-
-    @Override
-    protected DbLoader createDbLoader(DbAdapter adapter,
-                                      Connection connection,
-                                      DbLoaderDelegate dbLoaderDelegate,
-                                      ObjectNameGenerator objectNameGenerator) 
{
-        return dbLoader;
-    }
-
-    @Override
-    protected DataMap existingTargetMap(DbImportConfiguration configuration) 
throws IOException {
-        return targetMap;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorController.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorController.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorController.java
deleted file mode 100644
index f9690c2..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorController.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*****************************************************************
- *   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.dialog.db;
-
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.project.Project;
-import org.apache.cayenne.project.validation.ProjectValidator;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.swing.TableBindingBuilder;
-import org.apache.cayenne.validation.ValidationFailure;
-import org.apache.cayenne.validation.ValidationResult;
-
-import java.awt.Component;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- */
-public class TableSelectorController extends CayenneController {
-
-    protected TableSelectorView view;
-    protected ObjectBinding tableBinding;
-
-    protected DbEntity table;
-    protected List<DbEntity> tables;
-    protected int permanentlyExcludedCount;
-    protected Map<String, DbEntity> excludedTables;
-    protected List<DbEntity> selectableTablesList;
-
-    protected Map<String, String> validationMessages;
-
-    public TableSelectorController(ProjectController parent) {
-        super(parent);
-        this.view = new TableSelectorView();
-        this.excludedTables = new HashMap<>();
-        this.selectableTablesList = new ArrayList<>();
-        this.validationMessages = new HashMap<>();
-        initController();
-    }
-
-    public Component getView() {
-        return view;
-    }
-
-    /**
-     * Called by table binding script to set current table.
-     */
-    public void setTable(DbEntity table) {
-        this.table = table;
-    }
-
-    /**
-     * Returns DbEntities that are excluded from DB generation.
-     */
-    public Collection<DbEntity> getExcludedTables() {
-        return excludedTables.values();
-    }
-
-    public List<DbEntity> getTables() {
-        return tables;
-    }
-
-    public boolean isIncluded() {
-        if (table == null) {
-            return false;
-        }
-
-        return !excludedTables.containsKey(table.getName());
-    }
-
-    public void setIncluded(boolean b) {
-        if (table == null) {
-            return;
-        }
-
-        if (b) {
-            excludedTables.remove(table.getName());
-        }
-        else {
-            excludedTables.put(table.getName(), table);
-        }
-
-        tableSelectedAction();
-    }
-
-    /**
-     * A callback action that updates the state of Select All checkbox.
-     */
-    public void tableSelectedAction() {
-        int unselectedCount = excludedTables.size() - permanentlyExcludedCount;
-
-        if (unselectedCount == selectableTablesList.size()) {
-            view.getCheckAll().setSelected(false);
-        }
-        else if (unselectedCount == 0) {
-            view.getCheckAll().setSelected(true);
-        }
-    }
-
-    public Object getProblem() {
-        return (table != null) ? validationMessages.get(table.getName()) : 
null;
-    }
-
-    // ------ other stuff ------
-
-    protected void initController() {
-
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
-
-        TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
-
-        tableBuilder.addColumn(
-                "",
-                "setTable(#item), included",
-                Boolean.class,
-                true,
-                Boolean.TRUE);
-        tableBuilder.addColumn(
-                "Table",
-                "#item.name",
-                String.class,
-                false,
-                "XXXXXXXXXXXXXXXX");
-        tableBuilder.addColumn(
-                "Problems",
-                "setTable(#item), problem",
-                String.class,
-                false,
-                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
-
-        this.tableBinding = tableBuilder.bindToTable(view.getTables(), 
"tables");
-    }
-
-    /**
-     * Performs validation of DbEntities in the current DataMap. Returns a 
collection of
-     * ValidationInfo objects describing the problems.
-     */
-    public void updateTables(Collection<DataMap> dataMaps) {
-        this.tables = new ArrayList<DbEntity>();
-
-        for (DataMap dataMap : dataMaps) {
-            this.tables.addAll(dataMap.getDbEntities());
-        }
-
-        excludedTables.clear();
-        validationMessages.clear();
-
-        // if there were errors, filter out those related to
-        // non-derived DbEntities...
-
-        // TODO: this is inefficient.. we need targeted validation
-        // instead of doing it on the whole project
-
-        Project project = getApplication().getProject();
-
-        ProjectValidator projectValidator = 
getApplication().getInjector().getInstance(
-                ProjectValidator.class);
-        ValidationResult validationResult = projectValidator.validate(project
-                .getRootNode());
-
-        if (validationResult.getFailures().size() > 0) {
-
-            for (ValidationFailure nextProblem : 
validationResult.getFailures()) {
-                DbEntity failedEntity = null;
-
-                if (nextProblem.getSource() instanceof DbAttribute) {
-                    DbAttribute failedAttribute = (DbAttribute) 
nextProblem.getSource();
-                    failedEntity = (DbEntity) failedAttribute.getEntity();
-                }
-                else if (nextProblem.getSource() instanceof DbRelationship) {
-                    DbRelationship failedRelationship = (DbRelationship) 
nextProblem
-                            .getSource();
-                    failedEntity = (DbEntity) 
failedRelationship.getSourceEntity();
-                }
-                else if (nextProblem.getSource() instanceof DbEntity) {
-                    failedEntity = (DbEntity) nextProblem.getSource();
-                }
-
-                if (failedEntity == null) {
-                    continue;
-                }
-
-                excludedTables.put(failedEntity.getName(), failedEntity);
-                validationMessages.put(failedEntity.getName(), nextProblem
-                        .getDescription());
-            }
-        }
-
-        // Find selectable tables
-        permanentlyExcludedCount = excludedTables.size();
-        selectableTablesList.clear();
-        for (DbEntity table : tables) {
-            if (false == excludedTables.containsKey(table.getName())) {
-                selectableTablesList.add(table);
-            }
-        }
-
-        tableBinding.updateView();
-        tableSelectedAction();
-    }
-
-    public void checkAllAction() {
-
-        boolean isCheckAllSelected = view.getCheckAll().isSelected();
-
-        if (isCheckAllSelected) {
-            selectableTablesList.clear();
-            selectableTablesList.addAll(tables);
-            excludedTables.clear();
-        }
-        else {
-            excludedTables.clear();
-            for (DbEntity table : tables) {
-                excludedTables.put(table.getName(), table);
-            }
-            selectableTablesList.clear();
-        }
-
-        tableBinding.updateView();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorView.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorView.java
deleted file mode 100644
index 80bab48..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorView.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*****************************************************************
- *   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.dialog.db;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- */
-public class TableSelectorView extends JPanel {
-
-    protected JTable tables;
-    protected JCheckBox checkAll;
-    protected JLabel checkAllLabel;
-
-    public TableSelectorView() {
-
-        this.checkAll = new JCheckBox();
-        this.checkAllLabel = new JLabel("Check All Tables");
-
-        checkAll.addItemListener(new ItemListener() {
-
-            public void itemStateChanged(ItemEvent event) {
-                if (checkAll.isSelected()) {
-                    checkAllLabel.setText("Uncheck All Tables");
-                }
-                else {
-                    checkAllLabel.setText("Check All Tables");
-                }
-            }
-        });
-
-        // assemble
-        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
-        topPanel.add(checkAll);
-        topPanel.add(checkAllLabel);
-
-        tables = new JTable();
-        tables.setRowHeight(25);
-        tables.setRowMargin(3);
-
-        CellConstraints cc = new CellConstraints();
-        PanelBuilder builder = new PanelBuilder(new FormLayout(
-                "fill:min(50dlu;pref):grow",
-                "p, 3dlu, fill:40dlu:grow"));
-        builder.setDefaultDialogBorder();
-        builder.addSeparator("Select Tables", cc.xy(1, 1));
-        builder.add(new JScrollPane(
-                tables,
-                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
-                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), cc.xy(1, 3));
-
-        setLayout(new BorderLayout());
-        add(topPanel, BorderLayout.NORTH);
-        add(builder.getPanel(), BorderLayout.CENTER);
-    }
-
-    public JTable getTables() {
-        return tables;
-    }
-
-    public JCheckBox getCheckAll() {
-        return checkAll;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
new file mode 100644
index 0000000..441aba7
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
@@ -0,0 +1,332 @@
+/*****************************************************************
+ *   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.dialog.db.gen;
+
+import org.apache.cayenne.access.DbGenerator;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.log.NoopJdbcEventLogger;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.pref.DBGeneratorDefaults;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.modeler.util.DbAdapterInfo;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.swing.ObjectBinding;
+import org.apache.cayenne.validation.ValidationResult;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.WindowConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.Component;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ */
+public class DBGeneratorOptions extends CayenneController {
+
+    protected DBGeneratorOptionsView view;
+    protected ObjectBinding[] optionBindings;
+    protected ObjectBinding sqlBinding;
+    protected ObjectBinding adapterBinding;
+
+    protected DBConnectionInfo connectionInfo;
+    protected Collection<DataMap> dataMaps;
+    protected DBGeneratorDefaults generatorDefaults;
+    protected Collection<DbGenerator> generators;
+    protected String textForSQL;
+
+    protected TableSelectorController tables;
+
+    public DBGeneratorOptions(ProjectController parent, String title, 
Collection<DataMap> dataMaps) {
+        super(parent);
+
+        this.dataMaps = dataMaps;
+        this.tables = new TableSelectorController(parent);
+        this.view = new DBGeneratorOptionsView(tables.getView());
+        this.connectionInfo = new DBConnectionInfo();
+        this.generatorDefaults = new DBGeneratorDefaults(parent
+                .getPreferenceForProject()
+                .node("DbGenerator"));
+
+        this.view.setTitle(title);
+        initController();
+        connectionInfo.setDbAdapter((String) 
view.getAdapters().getSelectedItem());
+
+        tables.updateTables(dataMaps);
+        prepareGenerator();
+        generatorDefaults.configureGenerator(generators);
+        createSQL();
+        refreshView();
+    }
+
+    public Component getView() {
+        return view;
+    }
+
+    public DBGeneratorDefaults getGeneratorDefaults() {
+        return generatorDefaults;
+    }
+
+    public String getTextForSQL() {
+        return textForSQL;
+    }
+
+    protected void initController() {
+
+        DefaultComboBoxModel<String> adapterModel = new DefaultComboBoxModel<>(
+                DbAdapterInfo.getStandardAdapters());
+        view.getAdapters().setModel(adapterModel);
+        view.getAdapters().setSelectedIndex(0);
+
+        BindingBuilder builder = new BindingBuilder(
+                getApplication().getBindingFactory(),
+                this);
+
+        sqlBinding = builder.bindToTextArea(view.getSql(), "textForSQL");
+        adapterBinding = builder.bindToComboSelection(
+                view.getAdapters(),
+                "connectionInfo.dbAdapter",
+                "refreshSQLAction()",
+                "org.apache.cayenne.dba.JdbcAdapter");
+
+        optionBindings = new ObjectBinding[5];
+        optionBindings[0] = builder.bindToStateChangeAndAction(
+                view.getCreateFK(),
+                "generatorDefaults.createFK",
+                "refreshSQLAction()");
+        optionBindings[1] = builder.bindToStateChangeAndAction(
+                view.getCreatePK(),
+                "generatorDefaults.createPK",
+                "refreshSQLAction()");
+        optionBindings[2] = builder.bindToStateChangeAndAction(
+                view.getCreateTables(),
+                "generatorDefaults.createTables",
+                "refreshSQLAction()");
+        optionBindings[3] = builder.bindToStateChangeAndAction(
+                view.getDropPK(),
+                "generatorDefaults.dropPK",
+                "refreshSQLAction()");
+        optionBindings[4] = builder.bindToStateChangeAndAction(
+                view.getDropTables(),
+                "generatorDefaults.dropTables",
+                "refreshSQLAction()");
+
+        builder.bindToAction(view.getGenerateButton(), 
"generateSchemaAction()");
+        builder.bindToAction(view.getSaveSqlButton(), "storeSQLAction()");
+        builder.bindToAction(view.getCancelButton(), "closeAction()");
+
+        // refresh SQL if different tables were selected
+        view.getTabs().addChangeListener(new ChangeListener() {
+
+            public void stateChanged(ChangeEvent e) {
+                if (view.getTabs().getSelectedIndex() == 0) {
+                    // this assumes that some tables where 
checked/unchecked... not very
+                    // efficient
+                    refreshGeneratorAction();
+                }
+            }
+        });
+    }
+
+    /**
+     * Creates new internal DbGenerator instance.
+     */
+    protected void prepareGenerator() {
+        try {
+            DbAdapter adapter = connectionInfo.makeAdapter(getApplication()
+                    .getClassLoadingService());
+            generators = new ArrayList<>();
+            for (DataMap dataMap : dataMaps) {
+                this.generators.add(new DbGenerator(
+                        adapter,
+                        dataMap,
+                        tables.getExcludedTables(),
+                        null,
+                        NoopJdbcEventLogger.getInstance()));
+            }
+        } catch (Exception ex) {
+            reportError("Error loading adapter", ex);
+        }
+    }
+
+    /**
+     * Returns SQL statements generated for selected schema generation options.
+     */
+    protected void createSQL() {
+        // convert them to string representation for display
+        StringBuilder buf = new StringBuilder();
+        for (DbGenerator generator : generators) {
+            Iterator<String> it = generator.configuredStatements().iterator();
+            String batchTerminator = 
generator.getAdapter().getBatchTerminator();
+
+            String lineEnd = (batchTerminator != null)
+                    ? "\n" + batchTerminator + "\n\n"
+                    : "\n\n";
+
+            while (it.hasNext()) {
+                buf.append(it.next()).append(lineEnd);
+            }
+        }
+
+        textForSQL = buf.toString();
+    }
+
+    protected void refreshView() {
+        getView().setEnabled(connectionInfo != null);
+
+        for (ObjectBinding optionBinding : optionBindings) {
+            optionBinding.updateView();
+        }
+
+        sqlBinding.updateView();
+    }
+
+    // ===============
+    // Actions
+    // ===============
+
+    /**
+     * Starts options dialog.
+     */
+    public void startupAction() {
+        view.pack();
+        view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+        view.setModal(true);
+        makeCloseableOnEscape();
+        centerView();
+        view.setVisible(true);
+    }
+
+    public void refreshGeneratorAction() {
+        prepareGenerator();
+        refreshSQLAction();
+    }
+
+    /**
+     * Updates a text area showing generated SQL.
+     */
+    public void refreshSQLAction() {
+        // sync generator with defaults, make SQL, then sync the view...
+        adapterBinding.updateView();
+        connectionInfo.setDbAdapter((String) 
view.getAdapters().getSelectedItem());
+        prepareGenerator();
+        generatorDefaults.configureGenerator(generators);
+        createSQL();
+        sqlBinding.updateView();
+    }
+
+    /**
+     * Performs configured schema operations via DbGenerator.
+     */
+    public void generateSchemaAction() {
+
+        DataSourceWizard connectWizard = new DataSourceWizard(
+                this.getParent(),
+                "Generate DB Schema: Connect to Database");
+        if (!connectWizard.startupAction()) {
+            return;
+        }
+
+        this.connectionInfo = connectWizard.getConnectionInfo();
+
+        refreshGeneratorAction();
+
+        Collection<ValidationResult> failures = new 
ArrayList<ValidationResult>();
+
+        // sanity check...
+        for (DbGenerator generator : generators) {
+            if (generator.isEmpty(true)) {
+                JOptionPane.showMessageDialog(getView(), "Nothing to 
generate.");
+                return;
+            }
+
+            try {
+                generator.runGenerator(connectWizard.getDataSource());
+                failures.add(generator.getFailures());
+            } catch (Throwable th) {
+                reportError("Schema Generation Error", th);
+            }
+        }
+
+        if (failures.size() == 0) {
+            JOptionPane.showMessageDialog(getView(), "Schema Generation 
Complete.");
+        } else {
+            new ValidationResultBrowser(this)
+                    .startupAction(
+                            "Schema Generation Complete",
+                            "Schema generation finished. The following 
problem(s) were ignored.",
+                            failures);
+        }
+    }
+
+    /**
+     * Allows user to save generated SQL in a file.
+     */
+    public void storeSQLAction() {
+        JFileChooser fc = new JFileChooser();
+        fc.setDialogType(JFileChooser.SAVE_DIALOG);
+        fc.setDialogTitle("Save SQL Script");
+
+        File projectDir = new File(getApplication()
+                .getProject()
+                .getConfigurationResource()
+                .getURL()
+                .getPath());
+        fc.setCurrentDirectory(projectDir);
+        if (fc.showSaveDialog(getView()) == JFileChooser.APPROVE_OPTION) {
+            refreshGeneratorAction();
+            try {
+                File file = fc.getSelectedFile();
+                FileWriter fw = new FileWriter(file);
+                PrintWriter pw = new PrintWriter(fw);
+                pw.print(textForSQL);
+                pw.flush();
+                pw.close();
+            } catch (IOException ex) {
+                reportError("Error Saving SQL", ex);
+            }
+        }
+    }
+
+    public void closeAction() {
+        view.dispose();
+    }
+
+    public DBConnectionInfo getConnectionInfo() {
+        return this.connectionInfo;
+    }
+
+    public void setConnectionInfo(DBConnectionInfo connectionInfo) {
+        this.connectionInfo = connectionInfo;
+        refreshView();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptionsView.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptionsView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptionsView.java
new file mode 100644
index 0000000..724d3f1
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptionsView.java
@@ -0,0 +1,178 @@
+/*****************************************************************
+ *   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.dialog.db.gen;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextArea;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.SwingConstants;
+
+import com.jgoodies.forms.builder.PanelBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+
+/**
+ * Wizard for generating the database from the data map.
+ */
+public class DBGeneratorOptionsView extends JDialog {
+
+    protected JTextArea sql;
+    protected JButton generateButton;
+    protected JButton cancelButton;
+    protected JButton saveSqlButton;
+    protected JCheckBox dropTables;
+    protected JCheckBox createTables;
+    protected JCheckBox createFK;
+    protected JCheckBox createPK;
+    protected JCheckBox dropPK;
+    protected Component tables;
+    protected JTabbedPane tabs;
+    protected JComboBox<String> adapters;
+
+    public DBGeneratorOptionsView(Component tables) {
+        // create widgets
+        this.generateButton = new JButton("Generate");
+        this.cancelButton = new JButton("Close");
+        this.saveSqlButton = new JButton("Save SQL");
+        this.dropTables = new JCheckBox("Drop Tables");
+        this.createTables = new JCheckBox("Create Tables");
+        this.createFK = new JCheckBox("Create FK Support");
+        this.createPK = new JCheckBox("Create Primary Key Support");
+        this.dropPK = new JCheckBox("Drop Primary Key Support");
+        this.tables = tables;
+        this.tabs = new JTabbedPane(SwingConstants.TOP);
+        this.adapters = new JComboBox<>();
+        adapters.setEditable(true);
+        this.sql = new JTextArea();
+        sql.setEditable(false);
+        sql.setLineWrap(true);
+        sql.setWrapStyleWord(true);
+
+        // assemble...
+        JPanel optionsPane = new JPanel(new GridLayout(3, 2));
+        optionsPane.add(dropTables);
+        optionsPane.add(createTables);
+        optionsPane.add(new JLabel());
+        optionsPane.add(createFK);
+        optionsPane.add(dropPK);
+        optionsPane.add(createPK);
+
+        JPanel sqlTextPanel = new JPanel(new BorderLayout());
+        sqlTextPanel.add(new JScrollPane(
+                sql,
+                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), 
BorderLayout.CENTER);
+        
+        JPanel adapterPanel = new JPanel(new BorderLayout());
+        adapterPanel.add(adapters);
+
+        CellConstraints cc = new CellConstraints();
+        PanelBuilder builder = new PanelBuilder(new FormLayout(
+                "fill:min(50dlu;pref):grow",
+                "p, 3dlu, p, 9dlu, p, 3dlu, p, 3dlu, p, 3dlu, 
fill:40dlu:grow"));
+        builder.setDefaultDialogBorder();
+        builder.addSeparator("Options", cc.xywh(1, 1, 1, 1));
+        builder.add(optionsPane, cc.xy(1, 3, "left,fill"));
+        builder.addSeparator("Adapter", cc.xywh(1, 5, 1, 1));
+        builder.add(adapterPanel, cc.xy(1, 7));
+        builder.addSeparator("Generated SQL", cc.xywh(1, 9, 1, 1));
+        builder.add(sqlTextPanel, cc.xy(1, 11));
+
+        tabs.addTab("SQL Options", builder.getPanel());
+        tabs.addTab("Tables", new JScrollPane(
+                tables,
+                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
+
+        // we need the right preferred size so that dialog "pack()" produces 
decent
+        // default size...
+        tabs.setPreferredSize(new Dimension(450, 500));
+
+        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+        buttons.add(saveSqlButton);
+        buttons.add(Box.createHorizontalStrut(20));
+        buttons.add(cancelButton);
+        buttons.add(generateButton);
+
+        Container contentPane = this.getContentPane();
+        contentPane.setLayout(new BorderLayout());
+        contentPane.add(tabs, BorderLayout.CENTER);
+        contentPane.add(buttons, BorderLayout.SOUTH);
+    }
+
+    public JButton getCancelButton() {
+        return cancelButton;
+    }
+
+    public JTabbedPane getTabs() {
+        return tabs;
+    }
+
+    public JCheckBox getCreateFK() {
+        return createFK;
+    }
+
+    public JCheckBox getCreatePK() {
+        return createPK;
+    }
+
+    public JCheckBox getCreateTables() {
+        return createTables;
+    }
+
+    public JCheckBox getDropPK() {
+        return dropPK;
+    }
+
+    public JCheckBox getDropTables() {
+        return dropTables;
+    }
+
+    public JButton getGenerateButton() {
+        return generateButton;
+    }
+
+    public JButton getSaveSqlButton() {
+        return saveSqlButton;
+    }
+
+    public JTextArea getSql() {
+        return sql;
+    }
+    
+    public JComboBox<String> getAdapters() {
+        return adapters;
+    }
+}

Reply via email to