http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/ConfigurationDialog.java
----------------------------------------------------------------------
diff --git 
a/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/ConfigurationDialog.java
 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/ConfigurationDialog.java
new file mode 100644
index 0000000..8670e51
--- /dev/null
+++ 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/ConfigurationDialog.java
@@ -0,0 +1,293 @@
+/*
+ * 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.empire.db.eclipse.ui;
+
+import org.apache.empire.db.eclipse.Plugin;
+import org.apache.empire.db.eclipse.PluginConsts;
+import org.apache.empire.db.eclipse.model.ConfigFile;
+import org.apache.empire.db.eclipse.util.SWTResourceManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+public class ConfigurationDialog extends TitleAreaDialog
+{
+    private Navigator navigator;
+
+    private Page      visiblePage;
+
+    private Button    btnNextPage;
+
+    private Button    btnPreviousPage;
+
+    private Button    btnOk;
+
+    private Button    btnCancel;
+
+    public ConfigurationDialog(Shell shell)
+    {
+        super(shell);
+    }
+
+    @Override
+    public void create()
+    {
+        super.create();
+        UpdateControls();
+    }
+
+    // overriding this methods allows you to set the
+    // title of the custom dialog
+    @Override
+    protected void configureShell(Shell newShell)
+    {
+        super.configureShell(newShell);
+        
newShell.setText(Plugin.getInstance().getMessageService().resolveMessageKey("dialog.title"));
+    }
+
+    @Override
+    protected Point getInitialSize()
+    {
+        return new Point(470, 685);
+    }
+
+    @Override
+    protected void createButtonsForButtonBar(Composite parent)
+    {
+        parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+        this.btnPreviousPage = createButton(parent, 
PluginConsts.BUTTON_PREVIOUS_ID, Plugin.getInstance().getMessageService()
+                                                                               
            .resolveMessageKey("dialog.back"), true);
+        this.btnPreviousPage.addSelectionListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent e)
+                {
+                    ConfigurationDialog.this.navigator.showPreviousPage();
+                    UpdateControls();
+                }
+
+                public void widgetDefaultSelected(SelectionEvent e)
+                {
+                }
+            });
+        this.btnNextPage = createButton(parent, PluginConsts.BUTTON_NEXT_ID,
+                                        
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.next"), 
true);
+        this.btnNextPage.addSelectionListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent e)
+                {
+                    ConfigurationDialog.this.navigator.showNextPage();
+                    UpdateControls();
+                }
+
+                public void widgetDefaultSelected(SelectionEvent e)
+                {
+                }
+            });
+
+        this.btnOk = createButton(parent, PluginConsts.BUTTON_OK, 
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.ok"),
+                                  false);
+        this.btnOk.addSelectionListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent arg0)
+                {
+                    if (checkRequiredFields())
+                    {
+                        saveAction();
+                        setReturnCode(Window.OK);
+                        close();
+                    }
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+                }
+            });
+        this.btnCancel = createButton(parent, PluginConsts.BUTTON_CANCEL,
+                                      
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.close"), 
false);
+        this.btnCancel.addSelectionListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent arg0)
+                {
+                    save();
+                    setReturnCode(Window.CANCEL);
+                    close();
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+                }
+            });
+    }
+
+    @Override
+    protected Control createDialogArea(Composite parent)
+    {
+        setTitleImage(SWTResourceManager.getImage(ConfigurationDialog.class, 
"/icons/empire-db-logo.gif"));
+        Composite area = (Composite) super.createDialogArea(parent);
+        area.setLayout(null);
+        final MainPage mainPage = new MainPage(area, SWT.NONE);
+        mainPage.addExistingConfigsListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent event)
+                {
+                    if (event.widget instanceof Combo)
+                    {
+                        Combo combo = (Combo) event.widget;
+                        save();
+                        
load(Plugin.getInstance().getConfigFileService().getConfig(combo.getText()));
+                    }
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+                }
+            });
+
+        mainPage.addBtnAddListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent arg0)
+                {
+                    save();
+                    
load(Plugin.getInstance().getConfigFileService().getDefaultConfig());
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+
+                }
+            });
+        mainPage.addBtnSaveListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent arg0)
+                {
+                    saveAction();
+                    
mainPage.setConfigTitleList(Plugin.getInstance().getConfigFileService().getConfigTitles());
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+                }
+            });
+        mainPage.addBtnDeleteListener(new SelectionListener()
+            {
+
+                public void widgetSelected(SelectionEvent arg0)
+                {
+                    if (MessageDialog.openConfirm(getShell(), 
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.delete"),
+                                                  
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.delete.msg")))
+                    {
+                        deleteConfig();
+                    }
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+                }
+            });
+        this.visiblePage = mainPage;
+        this.navigator = new Navigator();
+        this.navigator.addPage(this.visiblePage);
+        final SchemaOptionsPage schemaOptions = new SchemaOptionsPage(area, 
SWT.NONE);
+        schemaOptions.addBtnTableDialogListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent arg0)
+                {
+                    ConfigurationDialog.this.navigator.save();
+                    DBTablesDialog dbTablesDialog = new 
DBTablesDialog(getShell(), ConfigurationDialog.this.navigator.getCurrentConfig()
+                                                                               
                                      .getCodeGenConfig());
+                    if (dbTablesDialog.open() == Window.OK)
+                    {
+                        
schemaOptions.getCtlDbTablePattern().setText(dbTablesDialog.getSelectedTables());
+                    }
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+                }
+            });
+        this.navigator.addPage(schemaOptions);
+        ClassParameterPage classParameterPage = new ClassParameterPage(area, 
SWT.NONE);
+        this.navigator.addPage(classParameterPage);
+        this.navigator.setPagesEnabled(false);
+        
+        setHelpAvailable(false);
+        return area;
+    }
+
+    private void UpdateControls()
+    {
+        this.btnPreviousPage.setVisible(this.navigator.hasPreviousPage());
+        this.btnNextPage.setVisible(this.navigator.hasNextPage());
+    }
+
+    public void save()
+    {
+        if (ConfigurationDialog.this.navigator.getCurrentConfig() != null
+            && MessageDialog.openQuestion(getShell(), 
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.save"),
+                                          
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.save.msg")))
+        {
+            saveAction();
+        }
+    }
+
+    public void saveAction()
+    {
+        ConfigFile configFile = this.navigator.save();
+        if (configFile != null)
+        {
+            Plugin.getInstance().getConfigFileService().saveConfig(configFile);
+        }
+    }
+
+    public void load(ConfigFile config)
+    {
+        this.navigator.load(config);
+    }
+
+    public void deleteConfig()
+    {
+        
Plugin.getInstance().getConfigFileService().deleteConfig(this.navigator.getCurrentConfig().getUuid());
+        this.navigator.load(null);
+    }
+
+    public boolean hasConfig()
+    {
+        return this.navigator.getCurrentConfig() != null;
+    }
+
+    public String getConfigFileAbsolutPath()
+    {
+        return 
Plugin.getInstance().getConfigFileService().getConfigFilePath(this.navigator.getCurrentConfig().getUuid());
+    }
+
+    private boolean checkRequiredFields()
+    {
+        return this.navigator.checkRequiredFields();
+    }
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/DBTablesDialog.java
----------------------------------------------------------------------
diff --git 
a/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/DBTablesDialog.java
 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/DBTablesDialog.java
new file mode 100644
index 0000000..585f1d9
--- /dev/null
+++ 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/DBTablesDialog.java
@@ -0,0 +1,350 @@
+/*
+ * 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.empire.db.eclipse.ui;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+
+import org.apache.empire.db.codegen.util.DBUtil;
+import org.apache.empire.db.eclipse.CodeGenConfig;
+import org.apache.empire.db.eclipse.Plugin;
+import org.apache.empire.db.eclipse.PluginConsts;
+import org.apache.empire.db.eclipse.util.SWTResourceManager;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DBTablesDialog extends TitleAreaDialog
+{
+    private CheckboxTableViewer checkboxTableViewer;
+    private Button              btnConnect;
+
+    private final CodeGenConfig config;
+    private Label               lblConnection;
+    private Button              btnOk;
+    private Button              btnSpaceholder;
+
+    private String              selectedTables;
+
+    public DBTablesDialog(Shell parentShell, CodeGenConfig config)
+    {
+        super(parentShell);
+        this.config = config;
+    }
+
+    @Override
+    public void create()
+    {
+        super.create();
+        
setTitle(Plugin.getInstance().getMessageService().resolveMessageKey("dialog.tables.discription"));
+    }
+
+    @Override
+    protected Point getInitialSize()
+    {
+        return new Point(343, 473);
+    }
+
+    // overriding this methods allows you to set the
+    // title of the custom dialog
+    @Override
+    protected void configureShell(Shell newShell)
+    {
+        super.configureShell(newShell);
+        
newShell.setText(Plugin.getInstance().getMessageService().resolveMessageKey("dialog.tables.title"));
+    }
+
+    @Override
+    protected void createButtonsForButtonBar(Composite parent)
+    {
+        parent.setLayoutData(new GridData(SWT.FILL, SWT.RIGHT, true, true));
+
+        this.btnSpaceholder = createButton(parent, 
PluginConsts.BUTTON_PREVIOUS_ID, "     ", true);
+        this.btnSpaceholder.setText("################");
+        this.btnSpaceholder.setVisible(false);
+
+        // Update layout of the parent composite to count the spacer
+        GridLayout layout = (GridLayout) parent.getLayout();
+        layout.makeColumnsEqualWidth = false;
+
+        this.btnOk = createButton(parent, PluginConsts.BUTTON_OK,
+                                  
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.tables.finish"),
 false);
+        this.btnOk.addSelectionListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent arg0)
+                {
+                    StringBuilder sb = new StringBuilder();
+                    Object[] tables = 
DBTablesDialog.this.checkboxTableViewer.getCheckedElements();
+                    for (Object table : tables)
+                    {
+                        sb.append(table).append(",");
+                    }
+                    DBTablesDialog.this.selectedTables = 
sb.toString().substring(0, sb.length() - 1);
+                    setReturnCode(Window.OK);
+                    close();
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+                }
+            });
+        createButton(parent, Window.CANCEL, 
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.close"), 
false);
+
+    }
+
+    @Override
+    protected Control createDialogArea(Composite parent)
+    {
+        setTitleImage(SWTResourceManager.getImage(ConfigurationDialog.class, 
"/icons/logo.png"));
+        Composite composite = (Composite) super.createDialogArea(parent);
+        composite.setLayout(null);
+
+        this.btnConnect = new Button(composite, SWT.NONE);
+        this.btnConnect.setBounds(5, 5, 145, 25);
+        
this.btnConnect.setText(Plugin.getInstance().getMessageService().resolveMessageKey("dialog.tables.connect"));
+        
this.btnConnect.setImage(SWTResourceManager.getImage(ConfigurationDialog.class, 
"/icons/testConnection.gif"));
+        this.btnConnect.addSelectionListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent arg0)
+                {
+                    try
+                    {
+                        Connection con = 
Plugin.getInstance().getJDBCConnection(DBTablesDialog.this.config.getJdbcType(),
+                                                                               
 DBTablesDialog.this.config.getJdbcServer(),
+                                                                               
 DBTablesDialog.this.config.getJdbcPort(),
+                                                                               
 DBTablesDialog.this.config.getJdbcSID(),
+                                                                               
 DBTablesDialog.this.config.getJdbcUser(),
+                                                                               
 DBTablesDialog.this.config.getJdbcPwd());
+                        if (con != null)
+                        {
+                            
DBTablesDialog.this.lblConnection.setText(Plugin.getInstance().getMessageService()
+                                                                            
.resolveMessageKey("connectionSuccess"));
+                            
DBTablesDialog.this.lblConnection.setForeground(new 
Color(getShell().getDisplay(), 0, 255, 0));
+                            
DBTablesDialog.this.checkboxTableViewer.setInput(con);
+                            if (DBTablesDialog.this.config.getDbTablePattern() 
!= null)
+                            {
+                                String[] tablePatterns = 
DBTablesDialog.this.config.getDbTablePattern().split(",");
+                                for (String pattern : tablePatterns)
+                                {
+                                    
DBTablesDialog.this.checkboxTableViewer.setChecked(pattern, true);
+                                }
+                            }
+                        }
+                        con.close();
+                    }
+                    catch (Exception e)
+                    {
+                        
DBTablesDialog.this.lblConnection.setText(Plugin.getInstance().getMessageService()
+                                                                        
.resolveMessageKey("connectionFailed"));
+                        DBTablesDialog.this.lblConnection.setForeground(new 
Color(getShell().getDisplay(), 255, 0, 0));
+                    }
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+                }
+            });
+
+        this.checkboxTableViewer = CheckboxTableViewer.newCheckList(composite, 
SWT.BORDER);
+        final Table table = this.checkboxTableViewer.getTable();
+        table.setBounds(5, 35, 290, 231);
+        table.setLinesVisible(true);
+
+        final Button btnCheckAll = new Button(composite, SWT.NONE);
+        btnCheckAll.setBounds(301, 35, 26, 26);
+        
btnCheckAll.setImage(SWTResourceManager.getImage(ConfigurationDialog.class, 
"/icons/check_all.gif"));
+        btnCheckAll.addSelectionListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent arg0)
+                {
+                    Table table = 
DBTablesDialog.this.checkboxTableViewer.getTable();
+                    for (int i = 0; i < table.getItemCount(); i++)
+                    {
+                        table.getItem(i).setChecked(true);
+                    }
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+                }
+            });
+
+        final Button btnUncheckAll = new Button(composite, SWT.NONE);
+        btnUncheckAll.setBounds(301, 67, 26, 26);
+        
btnUncheckAll.setImage(SWTResourceManager.getImage(ConfigurationDialog.class, 
"/icons/uncheck_all.gif"));
+        btnUncheckAll.addSelectionListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent arg0)
+                {
+                    Table table = 
DBTablesDialog.this.checkboxTableViewer.getTable();
+                    for (int i = 0; i < table.getItemCount(); i++)
+                    {
+                        table.getItem(i).setChecked(false);
+                    }
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+                }
+            });
+
+        this.lblConnection = new Label(composite, SWT.NONE);
+        this.lblConnection.setBounds(156, 10, 139, 15);
+        this.checkboxTableViewer.setContentProvider(new 
DBTablesContentProvider(this.config));
+        this.checkboxTableViewer.setLabelProvider(new DBTablesLabelProvider());
+
+        setHelpAvailable(false);
+        return composite;
+    }
+
+    public String getSelectedTables()
+    {
+        return this.selectedTables;
+    }
+
+    public void setSelectedTables(String selectedTables)
+    {
+        this.selectedTables = selectedTables;
+    }
+}
+
+class DBTablesContentProvider implements IStructuredContentProvider
+{
+    private static final Logger   log   = 
LoggerFactory.getLogger(DBTablesContentProvider.class);
+
+    private static final Object[] EMPTY = new Object[] {};
+
+    private final CodeGenConfig   config;
+
+    public DBTablesContentProvider(CodeGenConfig config)
+    {
+        this.config = config;
+    }
+
+    public Object[] getElements(Object arg0)
+    {
+        Connection con = (Connection) arg0;
+        ResultSet tables = null;
+        ArrayList<String> tableNames = new ArrayList<String>();
+        try
+        {
+            DatabaseMetaData dbMeta = con.getMetaData();
+            // Get table metadata
+            tables = dbMeta.getTables(this.config.getDbCatalog(), 
this.config.getDbSchema(), "%", new String[] { "TABLE", "VIEW" });
+            // Add all tables and views
+            while (tables.next())
+            {
+                String tableName = tables.getString("TABLE_NAME");
+                String tableType = tables.getString("TABLE_TYPE");
+                // Ignore system tables containing a '$' symbol (required for
+                // Oracle!)
+                if (tableName.indexOf('$') >= 0)
+                {
+                    DBTablesContentProvider.log.info("Ignoring system table " 
+ tableName);
+                    continue;
+                }
+                DBTablesContentProvider.log.info(tableType + ": " + tableName);
+                tableNames.add(tableName);
+            }
+            return tableNames.toArray();
+        }
+        catch (SQLException e)
+        {
+            DBTablesContentProvider.log.info("Error loading meta data: " + 
e.getMessage());
+        }
+        finally
+        {
+            DBUtil.close(tables, DBTablesContentProvider.log);
+        }
+        return DBTablesContentProvider.EMPTY;
+    }
+
+    public void dispose()
+    {
+        // Nothing to dispose
+    }
+
+    public void inputChanged(Viewer arg0, Object arg1, Object arg2)
+    {
+        // Nothing to do
+    }
+}
+
+class DBTablesLabelProvider implements ILabelProvider
+{
+    public Image getImage(Object arg0)
+    {
+        return null;
+    }
+
+    /**
+     * Returns the name of the file
+     * 
+     * @param arg0
+     *            the name of the file
+     * @return String
+     */
+    public String getText(Object arg0)
+    {
+        return (String) arg0;
+    }
+
+    public void addListener(ILabelProviderListener arg0)
+    {
+        // Throw it away
+    }
+
+    public void dispose()
+    {
+        // Nothing to dispose
+    }
+
+    public boolean isLabelProperty(Object arg0, String arg1)
+    {
+        return false;
+    }
+
+    public void removeListener(ILabelProviderListener arg0)
+    {
+        // Ignore
+    }
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/INavigator.java
----------------------------------------------------------------------
diff --git 
a/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/INavigator.java
 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/INavigator.java
new file mode 100644
index 0000000..ca366a2
--- /dev/null
+++ 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/INavigator.java
@@ -0,0 +1,46 @@
+/*
+ * 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.empire.db.eclipse.ui;
+
+import org.apache.empire.db.eclipse.model.ConfigFile;
+
+public interface INavigator
+{
+    public void addPage(Page page);
+
+    public boolean removePage(Page page);
+
+    public boolean showNextPage();
+
+    public boolean showPreviousPage();
+
+    public boolean hasNextPage();
+
+    public boolean hasPreviousPage();
+
+    public ConfigFile save();
+
+    public void load(ConfigFile config);
+
+    public ConfigFile getCurrentConfig();
+
+    public void setPagesEnabled(boolean enabled);
+
+    public boolean checkRequiredFields();
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/IPage.java
----------------------------------------------------------------------
diff --git 
a/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/IPage.java
 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/IPage.java
new file mode 100644
index 0000000..550d675
--- /dev/null
+++ 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/IPage.java
@@ -0,0 +1,30 @@
+/*
+ * 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.empire.db.eclipse.ui;
+
+import org.apache.empire.db.eclipse.CodeGenConfig;
+
+public interface IPage
+{
+    public void save(CodeGenConfig config);
+
+    public void load(CodeGenConfig config);
+
+    public boolean checkRequiredFields();
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/MainPage.java
----------------------------------------------------------------------
diff --git 
a/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/MainPage.java
 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/MainPage.java
new file mode 100644
index 0000000..7edeefb
--- /dev/null
+++ 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/MainPage.java
@@ -0,0 +1,305 @@
+/*
+ * 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.empire.db.eclipse.ui;
+
+import java.sql.Connection;
+
+import org.apache.empire.commons.StringUtils;
+import org.apache.empire.db.eclipse.CodeGenConfig;
+import org.apache.empire.db.eclipse.Plugin;
+import org.apache.empire.db.eclipse.util.SWTResourceManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+public class MainPage extends Page
+{
+    private final Text   ctlConfigTitle;
+    private final Text   ctlServerUrl;
+    private final Text   ctlServerPort;
+    private final Text   ctlUser;
+    private final Text   ctlPassword;
+    private final Text   ctlPasswordConfirm;
+    private final Text   ctlSID;
+
+    private final Combo  ctlExistingConfigs;
+    private final Combo  ctlDatabaseType;
+
+    private final Group  groupJdbc;
+
+    private final Button btnAdd;
+    private final Button btnSave;
+    private final Button btnDelete;
+    private final Label  lblDatabaseType;
+    private final Label  lblServerAddress;
+    private final Label  lblServerPort;
+    private final Label  lblUser;
+    private final Label  lblPassword;
+    private final Label  lblPasswordConfirm;
+    private final Label  lblSid;
+    private final Label  lblConfigurationTitle;
+    private final Button btnTestConnection;
+    private final Label  lblTestConResult;
+
+    /**
+     * Create the composite.
+     * 
+     * @param parent
+     * @param style
+     */
+    public MainPage(Composite parent, int style)
+    {
+        super(parent, style);
+        setLayout(null);
+
+        Label lblExistingConfigurations = new Label(this, SWT.NONE);
+        lblExistingConfigurations.setFont(SWTResourceManager.getFont("Segoe 
UI", 9, SWT.BOLD));
+        lblExistingConfigurations.setBounds(6, 31, 154, 15);
+        
lblExistingConfigurations.setText(Plugin.getInstance().getMessageService().resolveMessageKey("existingConfigs"));
+
+        this.ctlExistingConfigs = new Combo(this, SWT.READ_ONLY);
+        
this.ctlExistingConfigs.setItems(Plugin.getInstance().getConfigFileService().getConfigTitles());
+        this.ctlExistingConfigs.setBounds(165, 27, 248, 23);
+        this.btnAdd = new Button(this, SWT.NONE);
+        this.btnAdd.setBounds(419, 25, 26, 26);
+        this.btnAdd.setImage(SWTResourceManager.getImage(MainPage.class, 
"/icons/addButton.png"));
+
+        this.lblConfigurationTitle = new Label(this, SWT.NONE);
+        this.lblConfigurationTitle.setFont(SWTResourceManager.getFont("Segoe 
UI", 9, SWT.BOLD));
+        this.lblConfigurationTitle.setBounds(6, 62, 154, 15);
+        
this.lblConfigurationTitle.setText(Plugin.getInstance().getMessageService().resolveMessageKey("configTitle"));
+
+        this.ctlConfigTitle = new Text(this, SWT.BORDER);
+        this.ctlConfigTitle.setBounds(165, 59, 216, 21);
+
+        this.btnSave = new Button(this, SWT.NONE);
+        this.btnSave.setImage(SWTResourceManager.getImage(MainPage.class, 
"/icons/save.png"));
+        this.btnSave.setBounds(387, 56, 26, 26);
+
+        this.btnDelete = new Button(this, SWT.NONE);
+        this.btnDelete.setBounds(419, 56, 26, 26);
+        this.btnDelete.setImage(SWTResourceManager.getImage(MainPage.class, 
"/icons/deleteButton.png"));
+
+        this.groupJdbc = new Group(this, SWT.NONE);
+        this.groupJdbc.setFont(SWTResourceManager.getFont("Segoe UI", 10, 
SWT.BOLD));
+        
this.groupJdbc.setText(Plugin.getInstance().getMessageService().resolveMessageKey("dbConnection"));
+        this.groupJdbc.setBounds(5, 110, 440, 243);
+
+        this.lblDatabaseType = new Label(this.groupJdbc, SWT.NONE);
+        this.lblDatabaseType.setBounds(10, 21, 154, 15);
+        
this.lblDatabaseType.setText(Plugin.getInstance().getMessageService().resolveMessageKey("dbConnectionType"));
+
+        this.ctlDatabaseType = new Combo(this.groupJdbc, SWT.READ_ONLY);
+        this.ctlDatabaseType.setBounds(180, 18, 250, 23);
+        
this.ctlDatabaseType.setItems(Plugin.getInstance().getDriverClassNames());
+
+        this.lblServerAddress = new Label(this.groupJdbc, SWT.NONE);
+        this.lblServerAddress.setBounds(10, 49, 154, 17);
+        
this.lblServerAddress.setText(Plugin.getInstance().getMessageService().resolveMessageKey("dbServer"));
+
+        this.ctlServerUrl = new Text(this.groupJdbc, SWT.BORDER);
+        this.ctlServerUrl.setBounds(180, 46, 250, 21);
+
+        this.lblServerPort = new Label(this.groupJdbc, SWT.NONE);
+        this.lblServerPort.setBounds(10, 75, 154, 15);
+        
this.lblServerPort.setText(Plugin.getInstance().getMessageService().resolveMessageKey("dbPort"));
+
+        this.ctlServerPort = new Text(this.groupJdbc, SWT.BORDER);
+        this.ctlServerPort.setBounds(180, 72, 78, 21);
+
+        this.ctlSID = new Text(this.groupJdbc, SWT.BORDER);
+        this.ctlSID.setBounds(180, 99, 250, 21);
+
+        this.lblSid = new Label(this.groupJdbc, SWT.NONE);
+        this.lblSid.setBounds(10, 102, 154, 15);
+        
this.lblSid.setText(Plugin.getInstance().getMessageService().resolveMessageKey("dbSid"));
+
+        this.lblUser = new Label(this.groupJdbc, SWT.NONE);
+        this.lblUser.setBounds(10, 129, 154, 15);
+        
this.lblUser.setText(Plugin.getInstance().getMessageService().resolveMessageKey("jdbcUser"));
+
+        this.ctlUser = new Text(this.groupJdbc, SWT.BORDER);
+        this.ctlUser.setBounds(180, 126, 250, 21);
+
+        this.lblPassword = new Label(this.groupJdbc, SWT.NONE);
+        this.lblPassword.setBounds(10, 156, 154, 15);
+        
this.lblPassword.setText(Plugin.getInstance().getMessageService().resolveMessageKey("jdbcPassword"));
+
+        this.ctlPassword = new Text(this.groupJdbc, SWT.BORDER | SWT.PASSWORD);
+        this.ctlPassword.setBounds(180, 153, 250, 21);
+
+        this.lblPasswordConfirm = new Label(this.groupJdbc, SWT.NONE);
+        this.lblPasswordConfirm.setBounds(10, 183, 154, 15);
+        
this.lblPasswordConfirm.setText(Plugin.getInstance().getMessageService().resolveMessageKey("jdbcPasswordConfirm"));
+
+        this.ctlPasswordConfirm = new Text(this.groupJdbc, SWT.BORDER | 
SWT.PASSWORD);
+        this.ctlPasswordConfirm.setBounds(180, 180, 250, 21);
+
+        this.btnTestConnection = new Button(this.groupJdbc, SWT.NONE);
+        
this.btnTestConnection.setImage(SWTResourceManager.getImage(MainPage.class, 
"/icons/testConnection.gif"));
+        
this.btnTestConnection.setText(Plugin.getInstance().getMessageService().resolveMessageKey("testConnection"));
+        
this.btnTestConnection.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.testConnection"));
+        this.btnTestConnection.setBounds(10, 207, 166, 26);
+
+        this.lblTestConResult = new Label(this.groupJdbc, SWT.NONE);
+        this.lblTestConResult.setBounds(180, 213, 250, 15);
+        this.btnTestConnection.addSelectionListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent arg0)
+                {
+                    try
+                    {
+                        if 
(!MainPage.this.ctlPassword.getText().equals(MainPage.this.ctlPasswordConfirm.getText()))
+                        {
+                            MessageDialog.openError(getShell(),
+                                                    
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.passwordMismatch"),
+                                                    
Plugin.getInstance().getMessageService()
+                                                          
.resolveMessageKey("dialog.passwordMismatch.msg"));
+                            return;
+                        }
+                        Connection con = 
Plugin.getInstance().getJDBCConnection(MainPage.this.ctlDatabaseType.getText(),
+                                                                               
 MainPage.this.ctlServerUrl.getText(),
+                                                                               
 MainPage.this.ctlServerPort.getText(),
+                                                                               
 MainPage.this.ctlSID.getText(),
+                                                                               
 MainPage.this.ctlUser.getText(),
+                                                                               
 MainPage.this.ctlPassword.getText());
+                        if (con != null && !con.isClosed())
+                        {
+                            
MainPage.this.lblTestConResult.setText(Plugin.getInstance().getMessageService()
+                                                                         
.resolveMessageKey("connectionSuccess"));
+                            MainPage.this.lblTestConResult.setForeground(new 
Color(getDisplay(), 0, 255, 0));
+                        }
+                        else
+                        {
+                            
MainPage.this.lblTestConResult.setText(Plugin.getInstance().getMessageService()
+                                                                         
.resolveMessageKey("connectionFailed"));
+                            MainPage.this.lblTestConResult.setForeground(new 
Color(getDisplay(), 255, 0, 0));
+                        }
+                        if (con != null)
+                        {
+                            con.close();
+                        }
+                    }
+                    catch (Exception e)
+                    {
+                        
MainPage.this.lblTestConResult.setText(Plugin.getInstance().getMessageService()
+                                                                     
.resolveMessageKey("connectionFailed"));
+                        MainPage.this.lblTestConResult.setForeground(new 
Color(getDisplay(), 255, 0, 0));
+                    }
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+                }
+            });
+    }
+
+    public void save(CodeGenConfig config)
+    {
+        config.setConfigTitle(this.ctlConfigTitle.getText());
+        config.setJdbcServer(this.ctlServerUrl.getText());
+        config.setJdbcPort(this.ctlServerPort.getText());
+        config.setJdbcSID(this.ctlSID.getText());
+        config.setJdbcUser(this.ctlUser.getText());
+        config.setJdbcPwd(this.ctlPassword.getText());
+        config.setJdbcType(this.ctlDatabaseType.getText());
+    }
+
+    public void load(CodeGenConfig config)
+    {
+        setControlText(this.ctlConfigTitle, config.getConfigTitle());
+        setControlText(this.ctlServerUrl, config.getJdbcServer());
+        setControlText(this.ctlServerPort, config.getJdbcPort());
+        setControlText(this.ctlSID, config.getJdbcSID());
+        setControlText(this.ctlUser, config.getJdbcUser());
+        setControlText(this.ctlPassword, config.getJdbcPwd());
+        
this.ctlDatabaseType.setText(!StringUtils.isEmpty(config.getJdbcType()) ? 
config.getJdbcType() : " ");
+        this.lblTestConResult.setText(" ");
+    }
+
+    @Override
+    public void setEnabled(boolean enabled)
+    {
+        this.ctlConfigTitle.setEnabled(enabled);
+        this.ctlServerUrl.setEnabled(enabled);
+        this.ctlServerPort.setEnabled(enabled);
+        this.ctlUser.setEnabled(enabled);
+        this.ctlPassword.setEnabled(enabled);
+        this.ctlPasswordConfirm.setEnabled(enabled);
+        this.ctlSID.setEnabled(enabled);
+        this.ctlDatabaseType.setEnabled(enabled);
+        this.btnTestConnection.setEnabled(enabled);
+    }
+
+    public boolean checkRequiredFields()
+    {
+        if 
(!this.ctlPassword.getText().equals(this.ctlPasswordConfirm.getText()))
+        {
+            MessageDialog.openError(getShell(), 
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.passwordMismatch"),
+                                    
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.passwordMismatch.msg"));
+            return false;
+        }
+        return checkControlFilled(this.ctlConfigTitle, 
this.lblConfigurationTitle.getText())
+               && checkControlFilled(this.ctlServerUrl, 
this.lblServerAddress.getText())
+               && checkControlFilled(this.ctlServerPort, 
this.lblServerPort.getText())
+               && checkControlFilled(this.ctlUser, this.lblUser.getText())
+               && checkControlFilled(this.ctlPassword, 
this.lblPassword.getText())
+               && checkControlFilled(this.ctlPasswordConfirm, 
this.lblPasswordConfirm.getText())
+               && checkControlFilled(this.ctlSID, this.lblSid.getText());
+    }
+
+    public void addExistingConfigsListener(SelectionListener listener)
+    {
+        this.ctlExistingConfigs.addSelectionListener(listener);
+    }
+
+    public void addBtnAddListener(SelectionListener listener)
+    {
+        this.btnAdd.addSelectionListener(listener);
+    }
+
+    public void addBtnSaveListener(SelectionListener listener)
+    {
+        this.btnSave.addSelectionListener(listener);
+    }
+
+    public void addBtnDeleteListener(SelectionListener listener)
+    {
+        this.btnDelete.addSelectionListener(listener);
+    }
+
+    public void setConfigTitleList(String[] configTitleList)
+    {
+        this.ctlExistingConfigs.setItems(configTitleList);
+    }
+
+    @Override
+    protected void checkSubclass()
+    {
+        // Disable the check that prevents subclassing of SWT components
+    }
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/Navigator.java
----------------------------------------------------------------------
diff --git 
a/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/Navigator.java
 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/Navigator.java
new file mode 100644
index 0000000..28534d7
--- /dev/null
+++ 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/Navigator.java
@@ -0,0 +1,145 @@
+/*
+ * 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.empire.db.eclipse.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.empire.db.eclipse.CodeGenConfig;
+import org.apache.empire.db.eclipse.model.ConfigFile;
+
+public class Navigator implements INavigator
+{
+    private final List<Page> pages;
+
+    private int              currentPage;
+
+    private ConfigFile       currentConfig;
+
+    public Navigator()
+    {
+        this.pages = new ArrayList<Page>();
+        this.currentPage = 0;
+    }
+
+    public void addPage(Page page)
+    {
+        if (this.pages.size() > 0)
+        {
+            page.setVisible(false);
+        }
+        this.pages.add(page);
+    }
+
+    public boolean removePage(Page page)
+    {
+        if (!this.pages.contains(page))
+        {
+            return false;
+        }
+        return this.pages.remove(page);
+    }
+
+    public boolean showNextPage()
+    {
+        if (!hasNextPage())
+        {
+            return false;
+        }
+        this.pages.get(this.currentPage).setVisible(false);
+        this.currentPage++;
+        this.pages.get(this.currentPage).setVisible(true);
+        return true;
+    }
+
+    public boolean showPreviousPage()
+    {
+        if (!hasPreviousPage())
+        {
+            return false;
+        }
+        this.pages.get(this.currentPage).setVisible(false);
+        this.currentPage--;
+        this.pages.get(this.currentPage).setVisible(true);
+        return true;
+    }
+
+    public boolean hasNextPage()
+    {
+        return this.currentPage < this.pages.size() - 1;
+    }
+
+    public boolean hasPreviousPage()
+    {
+        return this.currentPage > 0;
+    }
+
+    public ConfigFile save()
+    {
+        if (this.currentConfig == null)
+        {
+            return null;
+        }
+        for (Page page : this.pages)
+        {
+            page.save(this.currentConfig.getCodeGenConfig());
+        }
+        return this.currentConfig;
+    }
+
+    public void load(ConfigFile config)
+    {
+        setCurrentConfig(config);
+        for (Page page : this.pages)
+        {
+            page.load(config != null ? config.getCodeGenConfig() : new 
CodeGenConfig());
+        }
+    }
+
+    public ConfigFile getCurrentConfig()
+    {
+        return this.currentConfig;
+    }
+
+    private void setCurrentConfig(ConfigFile currentConfig)
+    {
+        setPagesEnabled(currentConfig != null);
+        this.currentConfig = currentConfig;
+    }
+
+    public void setPagesEnabled(boolean enabled)
+    {
+        for (Page page : this.pages)
+        {
+            page.setEnabled(enabled);
+        }
+    }
+
+    public boolean checkRequiredFields()
+    {
+        for (Page page : this.pages)
+        {
+            if (!page.checkRequiredFields())
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/Page.java
----------------------------------------------------------------------
diff --git 
a/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/Page.java
 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/Page.java
new file mode 100644
index 0000000..badca1a
--- /dev/null
+++ 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/Page.java
@@ -0,0 +1,51 @@
+/*
+ * 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.empire.db.eclipse.ui;
+
+import org.apache.empire.commons.StringUtils;
+import org.apache.empire.db.eclipse.Plugin;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+
+public abstract class Page extends Composite implements IPage
+{
+    public Page(Composite parent, int style)
+    {
+        super(parent, style);
+        this.setSize(450, 500);
+        this.setBounds(10, 0, 450, 500);
+    }
+
+    protected void setControlText(Text ctlText, String value)
+    {
+        ctlText.setText(value != null ? value : "");
+    }
+
+    protected boolean checkControlFilled(Text ctlText, String field)
+    {
+        if (StringUtils.isNotEmpty(ctlText.getText()))
+        {
+            return true;
+        }
+        MessageDialog.openError(getShell(), 
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.errorFieldRequired"),
+                                
Plugin.getInstance().getMessageService().resolveMessageKey("dialog.errorFieldRequired.msg",
 field));
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/SchemaOptionsPage.java
----------------------------------------------------------------------
diff --git 
a/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/SchemaOptionsPage.java
 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/SchemaOptionsPage.java
new file mode 100644
index 0000000..69ce3c3
--- /dev/null
+++ 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/ui/SchemaOptionsPage.java
@@ -0,0 +1,241 @@
+/*
+ * 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.empire.db.eclipse.ui;
+
+import org.apache.empire.db.eclipse.CodeGenConfig;
+import org.apache.empire.db.eclipse.Plugin;
+import org.apache.empire.db.eclipse.util.SWTResourceManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+public class SchemaOptionsPage extends Page
+{
+    private final Text   ctlDbCatalog;
+    private final Text   ctlDbSchema;
+    private final Text   ctlTimestampCol;
+    private final Text   ctlDbTablePattern;
+
+    private final Text   ctlTargetFolder;
+    private final Text   ctlPackageName;
+    private final Text   ctlTablePackageName;
+    private final Text   ctlViewPackageName;
+    private final Text   ctlRecordPackageName;
+
+    private final Group  groupRequired;
+
+    private final Label  lblTargetFolder;
+    private final Label  lblPackageName;
+    private final Label  lblTablePackageName;
+    private final Label  lblViewPackageName;
+    private final Label  lblRecordPackageName;
+    private final Button btnDirectoryDialog;
+    private final Button btnOpenTableDialog;
+
+    public SchemaOptionsPage(Composite parent, int style)
+    {
+        super(parent, style);
+        setLayout(null);
+
+        Group grpSchemaOptions = new Group(this, SWT.NONE);
+        grpSchemaOptions.setFont(SWTResourceManager.getFont("Segoe UI", 10, 
SWT.BOLD));
+        
grpSchemaOptions.setText(Plugin.getInstance().getMessageService().resolveMessageKey("schemaOptions"));
+        grpSchemaOptions.setBounds(5, 30, 440, 128);
+
+        Label lblDbCatalog = new Label(grpSchemaOptions, SWT.NONE);
+        lblDbCatalog.setBounds(10, 23, 154, 17);
+        
lblDbCatalog.setText(Plugin.getInstance().getMessageService().resolveMessageKey("dbCatalog"));
+        
lblDbCatalog.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.dbCatalog"));
+
+        this.ctlDbCatalog = new Text(grpSchemaOptions, SWT.BORDER);
+        this.ctlDbCatalog.setBounds(180, 20, 250, 21);
+        
this.ctlDbCatalog.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.dbCatalog"));
+
+        Label lblDbSchema = new Label(grpSchemaOptions, SWT.NONE);
+        
lblDbSchema.setText(Plugin.getInstance().getMessageService().resolveMessageKey("dbSchema"));
+        
lblDbSchema.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.dbSchema"));
+        lblDbSchema.setBounds(10, 49, 154, 17);
+
+        this.ctlDbSchema = new Text(grpSchemaOptions, SWT.BORDER);
+        this.ctlDbSchema.setBounds(180, 46, 250, 21);
+        
this.ctlDbSchema.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.dbSchema"));
+
+        Label lblDbTablePattern = new Label(grpSchemaOptions, SWT.NONE);
+        
lblDbTablePattern.setText(Plugin.getInstance().getMessageService().resolveMessageKey("dbTablePattern"));
+        
lblDbTablePattern.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.dbTablePattern"));
+        lblDbTablePattern.setBounds(10, 75, 154, 17);
+
+        this.ctlDbTablePattern = new Text(grpSchemaOptions, SWT.BORDER);
+        
this.ctlDbTablePattern.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.dbTablePattern"));
+        this.getCtlDbTablePattern().setBounds(180, 72, 218, 21);
+
+        Label lblTimestampCol = new Label(grpSchemaOptions, SWT.NONE);
+        
lblTimestampCol.setText(Plugin.getInstance().getMessageService().resolveMessageKey("timestampColumn"));
+        
lblTimestampCol.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.timestampColumn"));
+        lblTimestampCol.setBounds(10, 98, 154, 17);
+
+        this.ctlTimestampCol = new Text(grpSchemaOptions, SWT.BORDER);
+        
this.ctlTimestampCol.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.timestampColumn"));
+        this.ctlTimestampCol.setBounds(180, 98, 250, 21);
+
+        this.btnOpenTableDialog = new Button(grpSchemaOptions, SWT.NONE);
+        this.btnOpenTableDialog.setBounds(404, 69, 26, 26);
+        
this.btnOpenTableDialog.setImage(SWTResourceManager.getImage(SchemaOptionsPage.class,
 "/icons/db_element.gif"));
+
+        this.groupRequired = new Group(this, SWT.NONE);
+        
this.groupRequired.setText(Plugin.getInstance().getMessageService().resolveMessageKey("requiredParams"));
+        this.groupRequired.setFont(SWTResourceManager.getFont("Segoe UI", 10, 
SWT.BOLD));
+        this.groupRequired.setBounds(5, 180, 440, 149);
+
+        this.lblTargetFolder = new Label(this.groupRequired, SWT.NONE);
+        this.lblTargetFolder.setBounds(10, 18, 154, 15);
+        
this.lblTargetFolder.setText(Plugin.getInstance().getMessageService().resolveMessageKey("targetFolder"));
+        
this.lblTargetFolder.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.targetFolder"));
+        
+        this.ctlTargetFolder = new Text(this.groupRequired, SWT.BORDER);
+        
this.ctlTargetFolder.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.targetFolder"));
+        this.ctlTargetFolder.setBounds(180, 15, 218, 21);
+        
+
+        this.btnDirectoryDialog = new Button(this.groupRequired, SWT.NONE);
+        
this.btnDirectoryDialog.setImage(SWTResourceManager.getImage(SchemaOptionsPage.class,
 "/icons/folder.gif"));
+        this.btnDirectoryDialog.setBounds(404, 12, 26, 26);
+        this.btnDirectoryDialog.addSelectionListener(new SelectionListener()
+            {
+                public void widgetSelected(SelectionEvent arg0)
+                {
+                    DirectoryDialog directoryDialog = new 
DirectoryDialog(getShell());
+                    
directoryDialog.setFilterPath(SchemaOptionsPage.this.ctlTargetFolder.getText());
+                    String path = directoryDialog.open();
+                    if (path != null)
+                    {
+                        SchemaOptionsPage.this.ctlTargetFolder.setText(path);
+                    }
+                }
+
+                public void widgetDefaultSelected(SelectionEvent arg0)
+                {
+                }
+            });
+
+        this.lblPackageName = new Label(this.groupRequired, SWT.NONE);
+        this.lblPackageName.setBounds(10, 45, 154, 15);
+        
this.lblPackageName.setText(Plugin.getInstance().getMessageService().resolveMessageKey("packageName"));
+        
this.lblPackageName.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.packageName"));
+        
+        this.ctlPackageName = new Text(this.groupRequired, SWT.BORDER);
+        this.ctlPackageName.setBounds(180, 42, 250, 21);
+        
this.ctlPackageName.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.packageName"));
+        
+        this.lblTablePackageName = new Label(this.groupRequired, SWT.NONE);
+        this.lblTablePackageName.setBounds(10, 72, 154, 15);
+        
this.lblTablePackageName.setText(Plugin.getInstance().getMessageService().resolveMessageKey("tablePackageName"));
+        
this.lblTablePackageName.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.tablePackageName"));
+        
+        this.ctlTablePackageName = new Text(this.groupRequired, SWT.BORDER);
+        this.ctlTablePackageName.setBounds(180, 69, 250, 21);
+        
this.ctlTablePackageName.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.tablePackageName"));
+
+        this.lblViewPackageName = new Label(this.groupRequired, SWT.NONE);
+        this.lblViewPackageName.setBounds(10, 99, 154, 15);
+        
this.lblViewPackageName.setText(Plugin.getInstance().getMessageService().resolveMessageKey("viewPackageName"));
+        
this.lblViewPackageName.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.viewPackageName"));
+        
+        this.ctlViewPackageName = new Text(this.groupRequired, SWT.BORDER);
+        this.ctlViewPackageName.setBounds(180, 96, 250, 21);
+        
this.ctlViewPackageName.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.viewPackageName"));
+
+        this.lblRecordPackageName = new Label(this.groupRequired, SWT.NONE);
+        this.lblRecordPackageName.setBounds(10, 126, 154, 15);
+        
this.lblRecordPackageName.setText(Plugin.getInstance().getMessageService().resolveMessageKey("recordPackageName"));
+        
this.lblRecordPackageName.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.recordPackageName"));
+        
+        this.ctlRecordPackageName = new Text(this.groupRequired, SWT.BORDER);
+        this.ctlRecordPackageName.setBounds(180, 123, 250, 21);
+        
this.ctlRecordPackageName.setToolTipText(Plugin.getInstance().getMessageService().resolveMessageKey("tooltip.recordPackageName"));
+    }
+
+    public void save(CodeGenConfig config)
+    {
+        config.setDbCatalog(this.ctlDbCatalog.getText());
+        config.setDbSchema(this.ctlDbSchema.getText());
+        config.setTimestampColumn(this.ctlTimestampCol.getText());
+        config.setDbTablePattern(this.getCtlDbTablePattern().getText());
+        config.setTargetFolder(this.ctlTargetFolder.getText());
+        config.setPackageName(this.ctlPackageName.getText());
+        config.setTablePackageName(this.ctlTablePackageName.getText());
+        config.setViewPackageName(this.ctlViewPackageName.getText());
+        config.setRecordPackageName(this.ctlRecordPackageName.getText());
+    }
+
+    public void load(CodeGenConfig config)
+    {
+        setControlText(this.ctlDbCatalog, config.getDbCatalog());
+        setControlText(this.ctlDbSchema, config.getDbSchema());
+        setControlText(this.ctlTimestampCol, config.getTimestampColumn());
+        setControlText(this.getCtlDbTablePattern(), 
config.getDbTablePattern());
+        setControlText(this.ctlTargetFolder, config.getTargetFolder());
+        setControlText(this.ctlPackageName, config.getPackageName());
+        setControlText(this.ctlTablePackageName, config.getTablePackageName());
+        setControlText(this.ctlViewPackageName, config.getViewPackageName());
+        setControlText(this.ctlRecordPackageName, 
config.getRecordPackageName());
+
+    }
+
+    @Override
+    public void setEnabled(boolean enabled)
+    {
+        this.ctlDbCatalog.setEnabled(enabled);
+        this.ctlDbSchema.setEnabled(enabled);
+        this.ctlTimestampCol.setEnabled(enabled);
+        this.getCtlDbTablePattern().setEnabled(enabled);
+        this.ctlTargetFolder.setEnabled(enabled);
+        this.ctlPackageName.setEnabled(enabled);
+        this.ctlTablePackageName.setEnabled(enabled);
+        this.ctlViewPackageName.setEnabled(enabled);
+        this.ctlRecordPackageName.setEnabled(enabled);
+        this.btnDirectoryDialog.setEnabled(enabled);
+        this.btnOpenTableDialog.setEnabled(enabled);
+    }
+
+    public boolean checkRequiredFields()
+    {
+        return checkControlFilled(this.ctlTargetFolder, 
this.lblTargetFolder.getText())
+               && checkControlFilled(this.ctlPackageName, 
this.lblPackageName.getText())
+               && checkControlFilled(this.ctlTablePackageName, 
this.lblTablePackageName.getText())
+               && checkControlFilled(this.ctlViewPackageName, 
this.lblViewPackageName.getText())
+               && checkControlFilled(this.ctlRecordPackageName, 
this.lblRecordPackageName.getText());
+    }
+
+    public void addBtnTableDialogListener(SelectionListener selectionListener)
+    {
+        this.btnOpenTableDialog.addSelectionListener(selectionListener);
+    }
+
+    public Text getCtlDbTablePattern()
+    {
+        return this.ctlDbTablePattern;
+    }
+}

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/util/SWTResourceManager.java
----------------------------------------------------------------------
diff --git 
a/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/util/SWTResourceManager.java
 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/util/SWTResourceManager.java
new file mode 100644
index 0000000..8217af2
--- /dev/null
+++ 
b/empire-db-eclipse-codegen/src/main/java/org/apache/empire/db/eclipse/util/SWTResourceManager.java
@@ -0,0 +1,455 @@
+/*
+ * 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.empire.db.eclipse.util;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Utility class for managing OS resources associated with SWT controls such 
as colors, fonts, images, etc.
+ * <p>
+ * !!! IMPORTANT !!! Application code must explicitly invoke the 
<code>dispose()</code> method to release the
+ * operating system resources managed by cached objects when those objects and 
OS resources are no longer
+ * needed (e.g. on application shutdown)
+ * <p>
+ * This class may be freely distributed as part of any application or plugin.
+ * <p>
+ * @author scheglov_ke
+ * @author Dan Rubel
+ */
+public class SWTResourceManager {
+       
////////////////////////////////////////////////////////////////////////////
+       //
+       // Color
+       //
+       
////////////////////////////////////////////////////////////////////////////
+       private static Map<RGB, Color> m_colorMap = new HashMap<RGB, Color>();
+       /**
+        * Returns the system {@link Color} matching the specific ID.
+        * 
+        * @param systemColorID
+        *            the ID value for the color
+        * @return the system {@link Color} matching the specific ID
+        */
+       public static Color getColor(int systemColorID) {
+               Display display = Display.getCurrent();
+               return display.getSystemColor(systemColorID);
+       }
+       /**
+        * Returns a {@link Color} given its red, green and blue component 
values.
+        * 
+        * @param r
+        *            the red component of the color
+        * @param g
+        *            the green component of the color
+        * @param b
+        *            the blue component of the color
+        * @return the {@link Color} matching the given red, green and blue 
component values
+        */
+       public static Color getColor(int r, int g, int b) {
+               return getColor(new RGB(r, g, b));
+       }
+       /**
+        * Returns a {@link Color} given its RGB value.
+        * 
+        * @param rgb
+        *            the {@link RGB} value of the color
+        * @return the {@link Color} matching the RGB value
+        */
+       public static Color getColor(RGB rgb) {
+               Color color = m_colorMap.get(rgb);
+               if (color == null) {
+                       Display display = Display.getCurrent();
+                       color = new Color(display, rgb);
+                       m_colorMap.put(rgb, color);
+               }
+               return color;
+       }
+       /**
+        * Dispose of all the cached {@link Color}'s.
+        */
+       public static void disposeColors() {
+               for (Color color : m_colorMap.values()) {
+                       color.dispose();
+               }
+               m_colorMap.clear();
+       }
+       
////////////////////////////////////////////////////////////////////////////
+       //
+       // Image
+       //
+       
////////////////////////////////////////////////////////////////////////////
+       /**
+        * Maps image paths to images.
+        */
+       private static Map<String, Image> m_imageMap = new HashMap<String, 
Image>();
+       /**
+        * Returns an {@link Image} encoded by the specified {@link 
InputStream}.
+        * 
+        * @param stream
+        *            the {@link InputStream} encoding the image data
+        * @return the {@link Image} encoded by the specified input stream
+        */
+       protected static Image getImage(InputStream stream) throws IOException {
+               try {
+                       Display display = Display.getCurrent();
+                       ImageData data = new ImageData(stream);
+                       if (data.transparentPixel > 0) {
+                               return new Image(display, data, 
data.getTransparencyMask());
+                       }
+                       return new Image(display, data);
+               } finally {
+                       stream.close();
+               }
+       }
+       /**
+        * Returns an {@link Image} stored in the file at the specified path.
+        * 
+        * @param path
+        *            the path to the image file
+        * @return the {@link Image} stored in the file at the specified path
+        */
+       public static Image getImage(String path) {
+               Image image = m_imageMap.get(path);
+               if (image == null) {
+                       try {
+                               image = getImage(new FileInputStream(path));
+                               m_imageMap.put(path, image);
+                       } catch (Exception e) {
+                               image = getMissingImage();
+                               m_imageMap.put(path, image);
+                       }
+               }
+               return image;
+       }
+       /**
+        * Returns an {@link Image} stored in the file at the specified path 
relative to the specified class.
+        * 
+        * @param clazz
+        *            the {@link Class} relative to which to find the image
+        * @param path
+        *            the path to the image file, if starts with 
<code>'/'</code>
+        * @return the {@link Image} stored in the file at the specified path
+        */
+       public static Image getImage(Class<?> clazz, String path) {
+               String key = clazz.getName() + '|' + path;
+               Image image = m_imageMap.get(key);
+               if (image == null) {
+                       try {
+                               image = 
getImage(clazz.getResourceAsStream(path));
+                               m_imageMap.put(key, image);
+                       } catch (Exception e) {
+                               image = getMissingImage();
+                               m_imageMap.put(key, image);
+                       }
+               }
+               return image;
+       }
+       private static final int MISSING_IMAGE_SIZE = 10;
+       /**
+        * @return the small {@link Image} that can be used as placeholder for 
missing image.
+        */
+       private static Image getMissingImage() {
+               Image image = new Image(Display.getCurrent(), 
MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE);
+               //
+               GC gc = new GC(image);
+               gc.setBackground(getColor(SWT.COLOR_RED));
+               gc.fillRectangle(0, 0, MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE);
+               gc.dispose();
+               //
+               return image;
+       }
+       /**
+        * Style constant for placing decorator image in top left corner of 
base image.
+        */
+       public static final int TOP_LEFT = 1;
+       /**
+        * Style constant for placing decorator image in top right corner of 
base image.
+        */
+       public static final int TOP_RIGHT = 2;
+       /**
+        * Style constant for placing decorator image in bottom left corner of 
base image.
+        */
+       public static final int BOTTOM_LEFT = 3;
+       /**
+        * Style constant for placing decorator image in bottom right corner of 
base image.
+        */
+       public static final int BOTTOM_RIGHT = 4;
+       /**
+        * Internal value.
+        */
+       protected static final int LAST_CORNER_KEY = 5;
+       /**
+        * Maps images to decorated images.
+        */
+       @SuppressWarnings("unchecked")
+       private static Map<Image, Map<Image, Image>>[] m_decoratedImageMap = 
new Map[LAST_CORNER_KEY];
+       /**
+        * Returns an {@link Image} composed of a base image decorated by 
another image.
+        * 
+        * @param baseImage
+        *            the base {@link Image} that should be decorated
+        * @param decorator
+        *            the {@link Image} to decorate the base image
+        * @return {@link Image} The resulting decorated image
+        */
+       public static Image decorateImage(Image baseImage, Image decorator) {
+               return decorateImage(baseImage, decorator, BOTTOM_RIGHT);
+       }
+       /**
+        * Returns an {@link Image} composed of a base image decorated by 
another image.
+        * 
+        * @param baseImage
+        *            the base {@link Image} that should be decorated
+        * @param decorator
+        *            the {@link Image} to decorate the base image
+        * @param corner
+        *            the corner to place decorator image
+        * @return the resulting decorated {@link Image}
+        */
+       public static Image decorateImage(final Image baseImage, final Image 
decorator, final int corner) {
+               if (corner <= 0 || corner >= LAST_CORNER_KEY) {
+                       throw new IllegalArgumentException("Wrong decorate 
corner");
+               }
+               Map<Image, Map<Image, Image>> cornerDecoratedImageMap = 
m_decoratedImageMap[corner];
+               if (cornerDecoratedImageMap == null) {
+                       cornerDecoratedImageMap = new HashMap<Image, Map<Image, 
Image>>();
+                       m_decoratedImageMap[corner] = cornerDecoratedImageMap;
+               }
+               Map<Image, Image> decoratedMap = 
cornerDecoratedImageMap.get(baseImage);
+               if (decoratedMap == null) {
+                       decoratedMap = new HashMap<Image, Image>();
+                       cornerDecoratedImageMap.put(baseImage, decoratedMap);
+               }
+               //
+               Image result = decoratedMap.get(decorator);
+               if (result == null) {
+                       Rectangle bib = baseImage.getBounds();
+                       Rectangle dib = decorator.getBounds();
+                       //
+                       result = new Image(Display.getCurrent(), bib.width, 
bib.height);
+                       //
+                       GC gc = new GC(result);
+                       gc.drawImage(baseImage, 0, 0);
+                       if (corner == TOP_LEFT) {
+                               gc.drawImage(decorator, 0, 0);
+                       } else if (corner == TOP_RIGHT) {
+                               gc.drawImage(decorator, bib.width - dib.width, 
0);
+                       } else if (corner == BOTTOM_LEFT) {
+                               gc.drawImage(decorator, 0, bib.height - 
dib.height);
+                       } else if (corner == BOTTOM_RIGHT) {
+                               gc.drawImage(decorator, bib.width - dib.width, 
bib.height - dib.height);
+                       }
+                       gc.dispose();
+                       //
+                       decoratedMap.put(decorator, result);
+               }
+               return result;
+       }
+       /**
+        * Dispose all of the cached {@link Image}'s.
+        */
+       public static void disposeImages() {
+               // dispose loaded images
+               {
+                       for (Image image : m_imageMap.values()) {
+                               image.dispose();
+                       }
+                       m_imageMap.clear();
+               }
+               // dispose decorated images
+               for (int i = 0; i < m_decoratedImageMap.length; i++) {
+                       Map<Image, Map<Image, Image>> cornerDecoratedImageMap = 
m_decoratedImageMap[i];
+                       if (cornerDecoratedImageMap != null) {
+                               for (Map<Image, Image> decoratedMap : 
cornerDecoratedImageMap.values()) {
+                                       for (Image image : 
decoratedMap.values()) {
+                                               image.dispose();
+                                       }
+                                       decoratedMap.clear();
+                               }
+                               cornerDecoratedImageMap.clear();
+                       }
+               }
+       }
+       
////////////////////////////////////////////////////////////////////////////
+       //
+       // Font
+       //
+       
////////////////////////////////////////////////////////////////////////////
+       /**
+        * Maps font names to fonts.
+        */
+       private static Map<String, Font> m_fontMap = new HashMap<String, 
Font>();
+       /**
+        * Maps fonts to their bold versions.
+        */
+       private static Map<Font, Font> m_fontToBoldFontMap = new HashMap<Font, 
Font>();
+       /**
+        * Returns a {@link Font} based on its name, height and style.
+        * 
+        * @param name
+        *            the name of the font
+        * @param height
+        *            the height of the font
+        * @param style
+        *            the style of the font
+        * @return {@link Font} The font matching the name, height and style
+        */
+       public static Font getFont(String name, int height, int style) {
+               return getFont(name, height, style, false, false);
+       }
+       /**
+        * Returns a {@link Font} based on its name, height and style. 
Windows-specific strikeout and underline
+        * flags are also supported.
+        * 
+        * @param name
+        *            the name of the font
+        * @param size
+        *            the size of the font
+        * @param style
+        *            the style of the font
+        * @param strikeout
+        *            the strikeout flag (warning: Windows only)
+        * @param underline
+        *            the underline flag (warning: Windows only)
+        * @return {@link Font} The font matching the name, height, style, 
strikeout and underline
+        */
+       public static Font getFont(String name, int size, int style, boolean 
strikeout, boolean underline) {
+               String fontName = name + '|' + size + '|' + style + '|' + 
strikeout + '|' + underline;
+               Font font = m_fontMap.get(fontName);
+               if (font == null) {
+                       FontData fontData = new FontData(name, size, style);
+                       if (strikeout || underline) {
+                               try {
+                                       Class<?> logFontClass = 
Class.forName("org.eclipse.swt.internal.win32.LOGFONT"); //$NON-NLS-1$
+                                       Object logFont = 
FontData.class.getField("data").get(fontData); //$NON-NLS-1$
+                                       if (logFont != null && logFontClass != 
null) {
+                                               if (strikeout) {
+                                                       
logFontClass.getField("lfStrikeOut").set(logFont, Byte.valueOf((byte) 1)); 
//$NON-NLS-1$
+                                               }
+                                               if (underline) {
+                                                       
logFontClass.getField("lfUnderline").set(logFont, Byte.valueOf((byte) 1)); 
//$NON-NLS-1$
+                                               }
+                                       }
+                               } catch (Throwable e) {
+                                       System.err.println("Unable to set 
underline or strikeout" + " (probably on a non-Windows platform). " + e); 
//$NON-NLS-1$ //$NON-NLS-2$
+                               }
+                       }
+                       font = new Font(Display.getCurrent(), fontData);
+                       m_fontMap.put(fontName, font);
+               }
+               return font;
+       }
+       /**
+        * Returns a bold version of the given {@link Font}.
+        * 
+        * @param baseFont
+        *            the {@link Font} for which a bold version is desired
+        * @return the bold version of the given {@link Font}
+        */
+       public static Font getBoldFont(Font baseFont) {
+               Font font = m_fontToBoldFontMap.get(baseFont);
+               if (font == null) {
+                       FontData fontDatas[] = baseFont.getFontData();
+                       FontData data = fontDatas[0];
+                       font = new Font(Display.getCurrent(), data.getName(), 
data.getHeight(), SWT.BOLD);
+                       m_fontToBoldFontMap.put(baseFont, font);
+               }
+               return font;
+       }
+       /**
+        * Dispose all of the cached {@link Font}'s.
+        */
+       public static void disposeFonts() {
+               // clear fonts
+               for (Font font : m_fontMap.values()) {
+                       font.dispose();
+               }
+               m_fontMap.clear();
+               // clear bold fonts
+               for (Font font : m_fontToBoldFontMap.values()) {
+                       font.dispose();
+               }
+               m_fontToBoldFontMap.clear();
+       }
+       
////////////////////////////////////////////////////////////////////////////
+       //
+       // Cursor
+       //
+       
////////////////////////////////////////////////////////////////////////////
+       /**
+        * Maps IDs to cursors.
+        */
+       private static Map<Integer, Cursor> m_idToCursorMap = new 
HashMap<Integer, Cursor>();
+       /**
+        * Returns the system cursor matching the specific ID.
+        * 
+        * @param id
+        *            int The ID value for the cursor
+        * @return Cursor The system cursor matching the specific ID
+        */
+       public static Cursor getCursor(int id) {
+               Integer key = Integer.valueOf(id);
+               Cursor cursor = m_idToCursorMap.get(key);
+               if (cursor == null) {
+                       cursor = new Cursor(Display.getDefault(), id);
+                       m_idToCursorMap.put(key, cursor);
+               }
+               return cursor;
+       }
+       /**
+        * Dispose all of the cached cursors.
+        */
+       public static void disposeCursors() {
+               for (Cursor cursor : m_idToCursorMap.values()) {
+                       cursor.dispose();
+               }
+               m_idToCursorMap.clear();
+       }
+       
////////////////////////////////////////////////////////////////////////////
+       //
+       // General
+       //
+       
////////////////////////////////////////////////////////////////////////////
+       /**
+        * Dispose of cached objects and their underlying OS resources. This 
should only be called when the cached
+        * objects are no longer needed (e.g. on application shutdown).
+        */
+       public static void dispose() {
+               disposeColors();
+               disposeImages();
+               disposeFonts();
+               disposeCursors();
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/resources/defaultConfig.xml
----------------------------------------------------------------------
diff --git a/empire-db-eclipse-codegen/src/main/resources/defaultConfig.xml 
b/empire-db-eclipse-codegen/src/main/resources/defaultConfig.xml
new file mode 100644
index 0000000..33c77bf
--- /dev/null
+++ b/empire-db-eclipse-codegen/src/main/resources/defaultConfig.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<config>
+       <properties>
+               <!-- provider name must match the property-section containing 
the connection data -->
+               <jdbcClass></jdbcClass>
+               <jdbcURL></jdbcURL>
+               <jdbcServer></jdbcServer>
+               <jdbcPort></jdbcPort>
+               <jdbcSID></jdbcSID>
+               <jdbcUser></jdbcUser>
+               <jdbcPwd></jdbcPwd>
+
+               <!-- Schema options -->
+               <dbCatalog></dbCatalog>
+               <dbSchema></dbSchema>
+               <dbTablePattern></dbTablePattern>
+               <timestampColumn>CREATIONDATE</timestampColumn>
+               
+               <!-- generation options -->
+               <targetFolder></targetFolder>
+               <packageName>org.apache.empire.db</packageName>
+               <tablePackageName>org.apache.empire.db.table</tablePackageName>
+               <viewPackageName>org.apache.empire.db.view</viewPackageName>
+               
<recordPackageName>org.apache.empire.db.record</recordPackageName>
+               <dbClassName>EmpireDB</dbClassName>
+               <tableBaseName>BaseTable</tableBaseName>
+               <viewBaseName>BaseView</viewBaseName>
+               <recordBaseName>BaseRecord</recordBaseName>
+               <tableNamePrefix></tableNamePrefix>
+               <tableClassPrefix>T_</tableClassPrefix>
+               <tableClassSuffix></tableClassSuffix>
+               <viewNamePrefix></viewNamePrefix>
+               <viewClassPrefix>V_</viewClassPrefix>
+               <viewClassSuffix></viewClassSuffix>
+               <columnNamePrefix></columnNamePrefix>
+               <nestTables>true</nestTables>
+               <nestViews>false</nestViews>
+               <createRecordProperties>true</createRecordProperties>
+               <preserverCharacterCase>false</preserverCharacterCase>
+               <preserveRelationNames>false</preserveRelationNames>
+       </properties>
+       
+       <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/";>
+
+               <appender name="default" 
class="org.apache.log4j.ConsoleAppender">
+                       <!-- layout class="org.apache.log4j.TTCCLayout"/ -->
+                       <layout class="org.apache.log4j.PatternLayout">
+                               <!-- param name="ConversionPattern" 
value="NSB(%c) %-5p %m      at %l%n"/ -->
+                               <param name="ConversionPattern" value="%-5p 
[%d{yyyy/MM/dd HH:mm}]: %m          at %l %n"/>
+                       </layout>
+               </appender>
+       
+               <!-- log detail configuration -->
+               <logger name="org.apache.empire.commons" additivity="false">
+                       <level value="warn"/>
+                       <appender-ref ref="default"/>
+               </logger>
+       
+               <root>
+                       <priority value="info"/>
+                       <appender-ref ref="default"/>
+               </root>
+
+       </log4j:configuration>
+       
+</config>

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/resources/icons/addButton.png
----------------------------------------------------------------------
diff --git a/empire-db-eclipse-codegen/src/main/resources/icons/addButton.png 
b/empire-db-eclipse-codegen/src/main/resources/icons/addButton.png
new file mode 100644
index 0000000..c6aeae4
Binary files /dev/null and 
b/empire-db-eclipse-codegen/src/main/resources/icons/addButton.png differ

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/resources/icons/check_all.gif
----------------------------------------------------------------------
diff --git a/empire-db-eclipse-codegen/src/main/resources/icons/check_all.gif 
b/empire-db-eclipse-codegen/src/main/resources/icons/check_all.gif
new file mode 100644
index 0000000..4370bf1
Binary files /dev/null and 
b/empire-db-eclipse-codegen/src/main/resources/icons/check_all.gif differ

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/resources/icons/db_element.gif
----------------------------------------------------------------------
diff --git a/empire-db-eclipse-codegen/src/main/resources/icons/db_element.gif 
b/empire-db-eclipse-codegen/src/main/resources/icons/db_element.gif
new file mode 100644
index 0000000..1d459ce
Binary files /dev/null and 
b/empire-db-eclipse-codegen/src/main/resources/icons/db_element.gif differ

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/resources/icons/deleteButton.png
----------------------------------------------------------------------
diff --git 
a/empire-db-eclipse-codegen/src/main/resources/icons/deleteButton.png 
b/empire-db-eclipse-codegen/src/main/resources/icons/deleteButton.png
new file mode 100644
index 0000000..5f00385
Binary files /dev/null and 
b/empire-db-eclipse-codegen/src/main/resources/icons/deleteButton.png differ

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/resources/icons/empire-db-logo.gif
----------------------------------------------------------------------
diff --git 
a/empire-db-eclipse-codegen/src/main/resources/icons/empire-db-logo.gif 
b/empire-db-eclipse-codegen/src/main/resources/icons/empire-db-logo.gif
new file mode 100644
index 0000000..3d60d76
Binary files /dev/null and 
b/empire-db-eclipse-codegen/src/main/resources/icons/empire-db-logo.gif differ

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/resources/icons/empire_db_icon.png
----------------------------------------------------------------------
diff --git 
a/empire-db-eclipse-codegen/src/main/resources/icons/empire_db_icon.png 
b/empire-db-eclipse-codegen/src/main/resources/icons/empire_db_icon.png
new file mode 100644
index 0000000..30ac6e9
Binary files /dev/null and 
b/empire-db-eclipse-codegen/src/main/resources/icons/empire_db_icon.png differ

http://git-wip-us.apache.org/repos/asf/empire-db/blob/83302f08/empire-db-eclipse-codegen/src/main/resources/icons/folder.gif
----------------------------------------------------------------------
diff --git a/empire-db-eclipse-codegen/src/main/resources/icons/folder.gif 
b/empire-db-eclipse-codegen/src/main/resources/icons/folder.gif
new file mode 100644
index 0000000..42e027c
Binary files /dev/null and 
b/empire-db-eclipse-codegen/src/main/resources/icons/folder.gif differ

Reply via email to