You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2018/11/14 14:27:43 UTC

[12/32] cayenne git commit: Add cgen tab.

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java
deleted file mode 100644
index 9242f21..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.dialog.codegen.cgen;
-
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.swing.BindingBuilder;
-
-import java.awt.Component;
-
-/**
- * @since 4.1
- */
-public class CgenGlobalController extends CayenneController{
-
-    protected CgenDialog view;
-
-    private CgenGlobalPanelController globalPanelController;
-
-    public CgenGlobalController(CayenneController parent){
-        super(parent);
-
-        globalPanelController = new CgenGlobalPanelController(this);
-    }
-
-    public void startup(){
-        this.view = new CgenDialog(globalPanelController.getView());
-        initBindings();
-
-        view.pack();
-        view.setModal(true);
-        centerView();
-        makeCloseableOnEscape();
-        view.setVisible(true);
-    }
-
-    protected void initBindings() {
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        builder.bindToAction(view.getCancelButton(), "cancelAction()");
-    }
-
-    public void cancelAction() {
-        view.dispose();
-    }
-
-    @Override
-    public Component getView() {
-        return view;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
deleted file mode 100644
index c234d70..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.dialog.codegen.cgen;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-import org.apache.cayenne.modeler.ProjectController;
-
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import java.awt.BorderLayout;
-
-/**
- * @since 4.1
- */
-public class CgenGlobalPanel extends JPanel {
-
-    private JButton generateButton;
-
-    private JTextField outputFolder;
-    private JButton selectOutputFolder;
-    private JComboBox<String> generationMode;
-    private JComboBox<String> subclassTemplate;
-    private JComboBox<String> superclassTemplate;
-    private JComboBox<String> embeddableTemplate;
-    private JComboBox<String> embeddableSuperTemplate;
-    private JComboBox<String> dataMapTemplate;
-    private JComboBox<String> dataMapSuperTemplate;
-    private JCheckBox pairs;
-    private JCheckBox overwrite;
-    private JCheckBox usePackagePath;
-    private JTextField outputPattern;
-    private JCheckBox createPropertyNames;
-    private JTextField superclassPackage;
-    private JTextField encoding;
-
-    private JButton resetFolder;
-    private JButton resetMode;
-    private JButton resetDataMapTemplate;
-    private JButton resetDataMapSuperTemplate;
-    private JButton resetTemplate;
-    private JButton resetSuperTemplate;
-    private JButton resetEmbeddableTemplate;
-    private JButton resetEmbeddableSuperTemplate;
-    private JButton resetPattern;
-    private JButton resetEncoding;
-    private JButton resetPairs;
-    private JButton resetPath;
-    private JButton resetOverwrite;
-    private JButton resetNames;
-    private JButton resetPackage;
-
-    CgenGlobalPanel(ProjectController projectController) {
-        this.generateButton = new JButton("Generate All classes");
-        this.outputFolder = new JTextField();
-        this.selectOutputFolder = new JButton("Select");
-        this.generationMode = new JComboBox<>();
-        this.subclassTemplate = new JComboBox<>();
-        this.superclassTemplate = new JComboBox<>();
-        this.embeddableTemplate = new JComboBox<>();
-        this.embeddableSuperTemplate = new JComboBox<>();
-        this.dataMapTemplate = new JComboBox<>();
-        this.dataMapSuperTemplate = new JComboBox<>();
-        this.pairs = new JCheckBox();
-        this.overwrite = new JCheckBox();
-        this.usePackagePath = new JCheckBox();
-        this.outputPattern = new JTextField();
-        this.createPropertyNames = new JCheckBox();
-        this.encoding = new JTextField();
-        this.superclassPackage = new JTextField();
-
-        // assemble
-        FormLayout layout = new FormLayout(
-                "right:100dlu, 3dlu, fill:50:grow, 6dlu, fill:70dlu, 3dlu", "");
-        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
-        builder.setDefaultDialogBorder();
-
-        builder.append("Generate Classes for dataMaps", generateButton);
-        builder.nextLine();
-
-        builder.appendSeparator();
-
-        resetFolder = new JButton("Reset Folder");
-        builder.append("Output Directory:", outputFolder, selectOutputFolder);
-        builder.nextLine();
-        builder.append(resetFolder);
-        builder.nextLine();
-        resetMode = new JButton("Reset Mode");
-        builder.append("Generation Mode:", generationMode, resetMode);
-        builder.nextLine();
-
-        resetDataMapTemplate = new JButton("Reset Template");
-        builder.append("DataMap Template:", dataMapTemplate, resetDataMapTemplate);
-        builder.nextLine();
-
-        resetDataMapSuperTemplate = new JButton("Reset Template");
-        builder.append("DataMap Superclass Template", dataMapSuperTemplate, resetDataMapSuperTemplate);
-        builder.nextLine();
-
-        resetTemplate = new JButton("Reset Template");
-        builder.append("Subclass Template:", subclassTemplate, resetTemplate);
-        builder.nextLine();
-
-        resetSuperTemplate = new JButton("Reset Template");
-        builder.append("Superclass Template:", superclassTemplate, resetSuperTemplate);
-        builder.nextLine();
-
-        resetEmbeddableTemplate = new JButton("Reset Template");
-        builder.append("Embeddable Template", embeddableTemplate, resetEmbeddableTemplate);
-        builder.nextLine();
-
-        resetEmbeddableSuperTemplate = new JButton("Reset Template");
-        builder.append("Embeddable Super Template", embeddableSuperTemplate, resetEmbeddableSuperTemplate);
-        builder.nextLine();
-
-        resetPattern = new JButton("Reset pattern");
-        builder.append("Output Pattern:", outputPattern, resetPattern);
-        builder.nextLine();
-
-        resetEncoding = new JButton("Reset encoding");
-        builder.append("Encoding", encoding, resetEncoding);
-        builder.nextLine();
-
-        resetPairs = new JButton("Reset pairs");
-        builder.append("Make Pairs:", pairs, resetPairs);
-        builder.nextLine();
-
-        resetPath = new JButton("Reset path");
-        builder.append("Use Package Path:", usePackagePath, resetPath);
-        builder.nextLine();
-
-        resetOverwrite = new JButton("Reset overwrite");
-        builder.append("Overwrite Subclasses:", overwrite, resetOverwrite);
-        builder.nextLine();
-
-        resetNames = new JButton("Reset Names");
-        builder.append("Create Property Names:", createPropertyNames, resetNames);
-        builder.nextLine();
-
-        resetPackage = new JButton("Reset Package");
-        builder.append("Superclass package", superclassPackage, resetPackage);
-
-        setLayout(new BorderLayout());
-        add(builder.getPanel(), BorderLayout.CENTER);
-
-        add(builder.getPanel(), BorderLayout.CENTER);
-    }
-
-    public JButton getGenerateButton() {
-        return generateButton;
-    }
-
-    public JTextField getOutputFolder() {
-        return outputFolder;
-    }
-
-    public JButton getSelectOutputFolder() {
-        return selectOutputFolder;
-    }
-
-    public JComboBox<String> getGenerationMode() { return generationMode; }
-
-    public JComboBox<String> getSubclassTemplate() {
-        return subclassTemplate;
-    }
-
-    public JComboBox<String> getSuperclassTemplate() {
-        return superclassTemplate;
-    }
-
-    public JComboBox<String> getEmbeddableTemplate() {
-        return embeddableTemplate;
-    }
-
-    public JComboBox<String> getEmbeddableSuperTemplate() {
-        return embeddableSuperTemplate;
-    }
-
-    public JComboBox<String> getDataMapTemplate() {
-        return dataMapTemplate;
-    }
-
-    public JComboBox<String> getDataMapSuperTemplate() {
-        return dataMapSuperTemplate;
-    }
-
-    public JCheckBox getPairs() {
-        return pairs;
-    }
-
-    public JCheckBox getOverwrite() {
-        return overwrite;
-    }
-
-    public JCheckBox getUsePackagePath() {
-        return usePackagePath;
-    }
-
-    public JTextField getOutputPattern() {
-        return outputPattern;
-    }
-
-    public JCheckBox getCreatePropertyNames() {
-        return createPropertyNames;
-    }
-
-    public JTextField getSuperclassPackage() {
-        return superclassPackage;
-    }
-
-    public JTextField getEncoding() {
-        return encoding;
-    }
-
-    public JButton getResetFolder() {
-        return resetFolder;
-    }
-
-    public JButton getResetMode() {
-        return resetMode;
-    }
-
-    public JButton getResetDataMapTemplate() {
-        return resetDataMapTemplate;
-    }
-
-    public JButton getResetDataMapSuperTemplate() {
-        return resetDataMapSuperTemplate;
-    }
-
-    public JButton getResetTemplate() {
-        return resetTemplate;
-    }
-
-    public JButton getResetSuperTemplate() {
-        return resetSuperTemplate;
-    }
-
-    public JButton getResetEmbeddableTemplate() {
-        return resetEmbeddableTemplate;
-    }
-
-    public JButton getResetEmbeddableSuperTemplate() {
-        return resetEmbeddableSuperTemplate;
-    }
-
-    public JButton getResetPattern() {
-        return resetPattern;
-    }
-
-    public JButton getResetEncoding() {
-        return resetEncoding;
-    }
-
-    public JButton getResetPairs() {
-        return resetPairs;
-    }
-
-    public JButton getResetPath() {
-        return resetPath;
-    }
-
-    public JButton getResetOverwrite() {
-        return resetOverwrite;
-    }
-
-    public JButton getResetNames() {
-        return resetNames;
-    }
-
-    public JButton getResetPackage() {
-        return resetPackage;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
deleted file mode 100644
index f694b73..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.dialog.codegen.cgen;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.xml.DataChannelMetaData;
-import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.CodeTemplateManager;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
-import org.apache.cayenne.modeler.pref.FSPath;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.project.Project;
-import org.apache.cayenne.util.Util;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.swing.*;
-import java.awt.*;
-import java.io.File;
-import java.util.*;
-import java.util.List;
-
-/**
- * @since 4.1
- */
-public class CgenGlobalPanelController extends CayenneController{
-
-    private static final String ALL_MODE_LABEL = "Generate all";
-    private static final Map<String, String> modesByLabel = new HashMap<>();
-    // correspond to non-public constants on MapClassGenerator.
-    private static final String MODE_DATAMAP = "datamap";
-    private static final String MODE_ENTITY = "entity";
-    private static final String MODE_ALL = "all";
-    private static final String DATA_MAP_MODE_LABEL = "DataMap generation";
-    private static final String ENTITY_MODE_LABEL = "Entity and Embeddable generation";
-    private static final Map<String, String> labelByMode = new HashMap<>();
-    private static Logger logObj = LoggerFactory.getLogger(CgenGlobalPanelController.class);
-
-    static {
-        modesByLabel.put(DATA_MAP_MODE_LABEL, MODE_DATAMAP);
-        modesByLabel.put(ENTITY_MODE_LABEL, MODE_ENTITY);
-        modesByLabel.put(ALL_MODE_LABEL, MODE_ALL);
-        labelByMode.put(MODE_DATAMAP, DATA_MAP_MODE_LABEL);
-        labelByMode.put(MODE_ENTITY, ENTITY_MODE_LABEL);
-        labelByMode.put(MODE_ALL, ALL_MODE_LABEL);
-    }
-
-    protected CgenGlobalPanel view;
-    private ProjectController projectController;
-
-    private Collection<ClassGenerationAction> generators;
-
-    CgenGlobalPanelController(CayenneController parent) {
-        super(parent);
-        this.projectController = Application.getInstance().getFrameController().getProjectController();
-
-        this.view = new CgenGlobalPanel(projectController);
-        this.generators = new HashSet<>();
-        initSources();
-
-        updateTemplates();
-        initButtons();
-    }
-
-    private void updateTemplates() {
-        String[] modeChoices = new String[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
-        view.getGenerationMode().setModel(new DefaultComboBoxModel<>(modeChoices));
-
-        CodeTemplateManager templateManager = getApplication().getCodeTemplateManager();
-
-        java.util.List<String> customTemplates = new ArrayList<>(templateManager.getCustomTemplates().keySet());
-        Collections.sort(customTemplates);
-
-        java.util.List<String> superTemplates = new ArrayList<>(templateManager.getStandardSuperclassTemplates());
-        Collections.sort(superTemplates);
-        superTemplates.addAll(customTemplates);
-
-        java.util.List<String> subTemplates = new ArrayList<>(templateManager.getStandardSubclassTemplates());
-        Collections.sort(subTemplates);
-        subTemplates.addAll(customTemplates);
-
-        java.util.List<String> embeddableTemplates = new ArrayList<>(templateManager.getStandartEmbeddableTemplates());
-        Collections.sort(embeddableTemplates);
-        embeddableTemplates.addAll(customTemplates);
-
-        java.util.List<String> embeddableSuperTemplates = new ArrayList<>(templateManager.getStandartEmbeddableSuperclassTemplates());
-        Collections.sort(embeddableSuperTemplates);
-        embeddableSuperTemplates.addAll(customTemplates);
-
-        java.util.List<String> dataMapTemplates = new ArrayList<>(templateManager.getStandartDataMapTemplates());
-        Collections.sort(dataMapTemplates);
-        dataMapTemplates.addAll(customTemplates);
-
-        List<String> dataMapSuperTemplates = new ArrayList<>(templateManager.getStandartDataMapSuperclassTemplates());
-        Collections.sort(dataMapSuperTemplates);
-        dataMapSuperTemplates.addAll(customTemplates);
-
-        this.view.getSubclassTemplate().setModel(new DefaultComboBoxModel<>(subTemplates.toArray(new String[0])));
-        this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel<>(superTemplates.toArray(new String[0])));
-
-        this.view.getEmbeddableTemplate().setModel(new DefaultComboBoxModel<>(embeddableTemplates.toArray(new String[0])));
-        this.view.getEmbeddableSuperTemplate().setModel(new DefaultComboBoxModel<>(embeddableSuperTemplates.toArray(new String[0])));
-
-        this.view.getDataMapTemplate().setModel(new DefaultComboBoxModel<>(dataMapTemplates.toArray(new String[0])));
-        this.view.getDataMapSuperTemplate().setModel(new DefaultComboBoxModel<>(dataMapSuperTemplates.toArray(new String[0])));
-
-        this.view.getOutputPattern().setText("*.java");
-        this.view.getPairs().setSelected(true);
-        this.view.getUsePackagePath().setSelected(true);
-
-        this.view.getOutputFolder().setText(System.getProperty("user.home"));
-    }
-
-    private void initSources() {
-        DataChannelMetaData metaData = getApplication().getMetaData();
-        Project project = projectController.getProject();
-        Collection<DataMap> dataMaps = ((DataChannelDescriptor) project.getRootNode()).getDataMaps();
-        for (DataMap dataMap : dataMaps) {
-            ClassGenerationAction classGenerationAction = metaData.get(dataMap, ClassGenerationAction.class);
-            if (classGenerationAction != null) {
-                generators.add(classGenerationAction);
-            }
-        }
-    }
-
-    private void initButtons() {
-        this.view.getSelectOutputFolder().addActionListener(action -> {
-
-            JTextField outputFolder = view.getOutputFolder();
-
-            String currentDir = outputFolder.getText();
-
-            JFileChooser chooser = new JFileChooser();
-            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
-            chooser.setDialogType(JFileChooser.OPEN_DIALOG);
-
-            // guess start directory
-            if (!Util.isEmptyString(currentDir)) {
-                chooser.setCurrentDirectory(new File(currentDir));
-            } else {
-                FSPath lastDir = Application.getInstance().getFrameController().getLastDirectory();
-                lastDir.updateChooser(chooser);
-            }
-
-                int result = chooser.showOpenDialog(getView());
-                if (result == JFileChooser.APPROVE_OPTION) {
-                    File selected = chooser.getSelectedFile();
-
-                    // update model
-                    String path = selected.getAbsolutePath();
-                    view.getOutputFolder().setText(path);
-                }
-        });
-
-        this.view.getGenerateButton().addActionListener(action -> {
-            try {
-            for(ClassGenerationAction generator : generators) {
-                generator.prepareArtifacts();
-                generator.execute();
-            }
-            JOptionPane.showMessageDialog(
-                    this.getApplication().getFrameController().getView(),
-                    "Class generation finished");
-            } catch (Exception ex) {
-            logObj.error("Error generating classes", ex);
-            JOptionPane.showMessageDialog(
-                    this.getApplication().getFrameController().getView(),
-                    "Error generating classes - " + ex.getMessage());
-            }
-        });
-
-        this.view.getResetFolder().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setDestDir(new File(view.getOutputFolder().getText()));
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetMode().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setArtifactsGenerationMode(modesByLabel.get(String.valueOf(view.getGenerationMode().getSelectedItem())));
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetDataMapTemplate().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setQueryTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getDataMapTemplate().getSelectedItem())));
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetDataMapSuperTemplate().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setQuerySuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getDataMapSuperTemplate().getSelectedItem())));
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetTemplate().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getSubclassTemplate().getSelectedItem())));
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetSuperTemplate().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getSuperclassTemplate().getSelectedItem())));
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetEmbeddableTemplate().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setEmbeddableTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getEmbeddableTemplate().getSelectedItem())));
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetEmbeddableSuperTemplate().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setEmbeddableSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getEmbeddableSuperTemplate().getSelectedItem())));
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetEncoding().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setEncoding(view.getEncoding().getText());
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetPattern().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setOutputPattern(view.getOutputPattern().getText());
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetPairs().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setMakePairs(view.getPairs().isSelected());
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getUsePackagePath().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setUsePkgPath(view.getUsePackagePath().isSelected());
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetOverwrite().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setUsePkgPath(view.getUsePackagePath().isSelected());
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetNames().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setCreatePropertyNames(view.getCreatePropertyNames().isSelected());
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-
-        this.view.getResetPackage().addActionListener(action ->
-                generators.forEach(val -> {
-                    val.setSuperPkg(view.getSuperclassPackage().getText());
-                    update(val.getDataMap());
-                    projectController.setDirty(true);
-                }));
-    }
-
-    private void update(DataMap dataMap) {
-        projectController.fireDataMapDisplayEvent(new DataMapDisplayEvent(this, dataMap, (DataChannelDescriptor)projectController.getProject().getRootNode()));
-
-    }
-
-    @Override
-    public Component getView() {
-        return view;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
index 770c713..388e087 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
@@ -23,8 +23,7 @@ import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.editor.cgen.CodeGeneratorController;
 import org.apache.cayenne.modeler.editor.dbimport.DbImportView;
 
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
+import javax.swing.*;
 
 
 /**
@@ -33,6 +32,7 @@ import javax.swing.JTabbedPane;
  */
 public class DataMapTabbedView extends JTabbedPane {
     ProjectController mediator;
+    private CodeGeneratorController codeGeneratorController;
 
     /**
      * constructor
@@ -41,7 +41,6 @@ public class DataMapTabbedView extends JTabbedPane {
      */
     public DataMapTabbedView(ProjectController mediator) {
         this.mediator = mediator;
-
         initView();
     }
 
@@ -57,11 +56,27 @@ public class DataMapTabbedView extends JTabbedPane {
         // must be wrapped in a scroll pane
         JScrollPane dataMapView = new JScrollPane(new DataMapView(mediator));
         JScrollPane dbImportView = new JScrollPane(new DbImportView(mediator));
-        CodeGeneratorController codeGeneratorController = new CodeGeneratorController(Application.getInstance().getFrameController(), mediator);
+        this.codeGeneratorController = new CodeGeneratorController(Application.getInstance().getFrameController(), mediator);
         JScrollPane cgenView = new JScrollPane(codeGeneratorController.getView());
         addTab("DataMap", dataMapView);
         addTab("DbImport", dbImportView);
-        addTab("Cgen", cgenView);
+        addTab("Class Generation", cgenView);
+
+        addChangeListener(tab -> {
+            if(isCgenTabActive()) {
+                codeGeneratorController.startup(mediator.getCurrentDataMap());
+            }
+        });
+        mediator.addDataMapDisplayListener(e -> {
+            if(isCgenTabActive()) {
+                fireStateChanged();
+            }
+        });
     }
+
+    private boolean isCgenTabActive() {
+        return getSelectedIndex() == 2;
+    }
+
 }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
index a83ef3d..cfa6a57 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
@@ -25,13 +25,11 @@ import org.apache.cayenne.swing.ImageRendererColumn;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.swing.TableBindingBuilder;
 
-import javax.swing.JLabel;
-import java.awt.Component;
+import javax.swing.*;
+import java.awt.*;
 
 public class ClassesTabController extends CayenneController {
 
-    public static final String GENERATE_PROPERTY = "generate";
-
     protected ClassesTabPanel view;
     protected ObjectBinding tableBinding;
 
@@ -48,6 +46,7 @@ public class ClassesTabController extends CayenneController {
 
     public void startup(){
         initBindings();
+        classSelectedAction();
     }
 
     protected CodeGeneratorControllerBase getParentController() {
@@ -98,9 +97,11 @@ public class ClassesTabController extends CayenneController {
      * A callback action that updates the state of Select All checkbox.
      */
     public void classSelectedAction() {
-        int selectedCount = getParentController().getSelectedEntitiesSize() + getParentController().getSelectedEmbeddablesSize() ;
+        int selectedCount = getParentController().getSelectedEntitiesSize()
+                + getParentController().getSelectedEmbeddablesSize()
+                + (getParentController().isDataMapSelected() ? 1 : 0);
 
-        if (selectedCount == 0) {
+        if (selectedCount < getParentController().getClasses().size()) {
             view.getCheckAll().setSelected(false);
         }
         else if (selectedCount == getParentController().getClasses().size()) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
index 7b5776c..403058f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
@@ -19,16 +19,8 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.UIManager;
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
+import javax.swing.*;
+import java.awt.*;
 
 /**
  * @since 4.1

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
new file mode 100644
index 0000000..9f217f0
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
@@ -0,0 +1,40 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.editor.cgen;
+
+import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.gen.ClientClassGenerationAction;
+
+public class ClientModeController extends StandardModeController {
+
+    public ClientModeController(CodeGeneratorControllerBase parent) {
+        super(parent);
+    }
+
+    protected GeneratorControllerPanel createView() {
+        this.view = new StandardModePanel();
+        return view;
+    }
+
+    @Override
+    protected ClassGenerationAction newGenerator() {
+        return new ClientClassGenerationAction();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
index 35aa8d6..db6edb4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
@@ -20,6 +20,7 @@
 package org.apache.cayenne.modeler.editor.cgen;
 
 import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
 import org.apache.cayenne.modeler.util.CayenneController;
@@ -27,8 +28,9 @@ import org.apache.cayenne.swing.BindingBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.JOptionPane;
-import java.awt.Component;
+import javax.swing.*;
+import java.awt.*;
+import java.util.Collections;
 import java.util.function.Predicate;
 
 /**
@@ -47,22 +49,25 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
 
     public CodeGeneratorController(CayenneController parent, ProjectController projectController) {
         super(parent, projectController);
-        initListeners();
         this.classesSelector = new ClassesTabController(this);
         this.generatorSelector = new GeneratorTabController(this);
         view = new CodeGeneratorPane(generatorSelector.getView(), classesSelector.getView());
         initBindings();
+        initListeners();
+    }
+
+    public void startup(DataMap dataMap) {
+        super.startup(dataMap);
+        classesSelectedAction();
+        GeneratorController modeController = generatorSelector.getGeneratorController();
+        ClassGenerationAction classGenerationAction = modeController.createGenerator();
+        modeController.initForm(classGenerationAction);
+        classesSelector.startup();
     }
 
     private void initListeners(){
-        projectController.addDataMapDisplayListener(e -> {
-            super.startup(e.getDataMap());
-            classesSelector.startup();
-
-            GeneratorController modeController = generatorSelector.getGeneratorController();
-            ClassGenerationAction classGenerationAction = modeController.createGenerator();
-            ((CustomModeController)modeController).initForm(classGenerationAction);
-        });
+        projectController.addObjEntityDisplayListener(e -> super.addToSelectedEntities(e.getEntity().getDataMap(), Collections.singleton(e.getEntity().getName())));
+        projectController.addEmbeddableDisplayListener(e -> super.addToSelectedEmbeddables(e.getEmbeddable().getDataMap(), Collections.singleton(e.getEmbeddable().getClassName())));
     }
 
     @Override
@@ -75,7 +80,7 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
                 getApplication().getBindingFactory(),
                 this);
 
-        builder.bindToAction(view.getGenerateButton(), "generateAction()");
+        builder.bindToAction(((GeneratorTabPanel)generatorSelector.getView()).getGenerateButton(), "generateAction()");
         builder.bindToAction(this, "classesSelectedAction()", SELECTED_PROPERTY);
         builder.bindToAction(generatorSelector, "generatorSelectedAction()",
                 GeneratorTabController.GENERATOR_PROPERTY);
@@ -120,26 +125,35 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
             label = label + "One embeddable selected";
         }
         else {
-            label =label + sizeEmb + " embeddables selected";
+            label = label + sizeEmb + " embeddables selected";
         }
-        
-        view.getClassesCount().setText(label);
+
+        label = label.concat("; ");
+
+        if(isDataMapSelected()) {
+            label = label + "DataMap selected";
+        } else {
+            label = label + "No dataMap selected";
+        }
+
+        ((GeneratorTabPanel)generatorSelector.getView()).getClassesCount().setText(label);
         projectController.setDirty(true);
     }
 
     public void generateAction() {
         ClassGenerationAction generator = generatorSelector.getGenerator();
+
         if (generator != null) {
             try {
                 generator.prepareArtifacts();
                 generator.execute();
                 JOptionPane.showMessageDialog(
-                        getView(),
+                        this.getView(),
                         "Class generation finished");
             } catch (Exception e) {
                 logObj.error("Error generating classes", e);
                 JOptionPane.showMessageDialog(
-                        getView(),
+                        this.getView(),
                         "Error generating classes - " + e.getMessage());
             }
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java
index 0642fb9..e9c2965 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java
@@ -44,35 +44,44 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
 
     public static final String SELECTED_PROPERTY = "selected";
 
-    protected Collection<DataMap> dataMaps;
-
     protected DataMap dataMap;
-
     protected ValidationResult validation;
-
     protected List<Object> classes;
-
-    protected Set<String> selectedEntities;
-    protected Set<String> selectedEmbeddables;
-
+    private Set<String> selectedEntities;
+    private Set<String> selectedEmbeddables;
+    private Set<String> isDataMapSelected;
+    private Map<DataMap, Set<String>> selectedEntitiesForDataMap;
+    private Map<DataMap, Set<String>> selectedEmbeddablesForDataMap;
+    private Map<DataMap, Set<String>> selectedDataMaps;
     protected transient Object currentClass;
-
     protected ProjectController projectController;
 
     public CodeGeneratorControllerBase(CayenneController parent, ProjectController projectController) {
         super(parent);
         this.projectController = projectController;
         this.classes = new ArrayList<>();
-
-        this.selectedEntities = new HashSet<>();
-        this.selectedEmbeddables = new HashSet<>();
+        this.selectedEntitiesForDataMap = new HashMap<>();
+        this.selectedEmbeddablesForDataMap = new HashMap<>();
+        this.selectedDataMaps = new HashMap<>();
     }
 
     public void startup(DataMap dataMap){
         this.dataMap = dataMap;
         classes.clear();
+        this.classes.add(dataMap);
         this.classes.addAll(dataMap.getObjEntities());
         this.classes.addAll(dataMap.getEmbeddables());
+
+        initCollectionsForSelection(dataMap);
+    }
+
+    private void initCollectionsForSelection(DataMap dataMap) {
+        selectedEntities = selectedEntitiesForDataMap.compute(dataMap, (key,value) ->
+                value == null ? new HashSet<>() : value);
+        selectedEmbeddables = selectedEmbeddablesForDataMap.compute(dataMap, (key, value) ->
+                value == null ? new HashSet<>() : value);
+        isDataMapSelected = selectedDataMaps.compute(dataMap, (key, value) ->
+                value == null ? new HashSet<>() : value);
     }
 
     public List<Object> getClasses() {
@@ -104,7 +113,6 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
     }
 
     public boolean updateSelection(Predicate<Object> predicate) {
-
         boolean modified = false;
 
         for (Object classObj : classes) {
@@ -112,25 +120,35 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
             if (classObj instanceof ObjEntity) {
 
                 if (select) {
-                    if (selectedEntities.add(((ObjEntity) classObj).getName())) {
+                    if(selectedEntities.add(((ObjEntity) classObj).getName())) {
                         modified = true;
                     }
                 }
                 else {
-                    if (selectedEntities.remove(((ObjEntity) classObj).getName())) {
+                    if(selectedEntities.remove(((ObjEntity) classObj).getName())) {
                         modified = true;
                     }
                 }
             }
             else if (classObj instanceof Embeddable) {
                 if (select) {
-                    if (selectedEmbeddables.add(((Embeddable) classObj).getClassName())) {
+                    if(selectedEmbeddables.add(((Embeddable) classObj).getClassName())) {
                         modified = true;
                     }
                 }
                 else {
-                    if (selectedEmbeddables
-                            .remove(((Embeddable) classObj).getClassName())) {
+                    if(selectedEmbeddables.remove(((Embeddable) classObj).getClassName())) {
+                        modified = true;
+                    }
+                }
+            } else if (classObj instanceof DataMap) {
+                updateArtifactGenerationMode(classObj, select);
+                if(select) {
+                    if(isDataMapSelected.add(((DataMap) classObj).getName())) {
+                        modified = true;
+                    }
+                } else {
+                    if(isDataMapSelected.remove(((DataMap) classObj).getName())) {
                         modified = true;
                     }
                 }
@@ -208,8 +226,11 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
             return selectedEmbeddables
                     .contains(((Embeddable) currentClass).getClassName());
         }
+        if(currentClass instanceof DataMap) {
+            return isDataMapSelected
+                    .contains(((DataMap) currentClass).getName());
+        }
         return false;
-
     }
 
     public void setSelected(boolean selectedFlag) {
@@ -221,8 +242,7 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
                 if (selectedEntities.add(((ObjEntity) currentClass).getName())) {
                     firePropertyChange(SELECTED_PROPERTY, null, null);
                 }
-            }
-            else {
+            } else {
                 if (selectedEntities.remove(((ObjEntity) currentClass).getName())) {
                     firePropertyChange(SELECTED_PROPERTY, null, null);
                 }
@@ -233,14 +253,36 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
                 if (selectedEmbeddables.add(((Embeddable) currentClass).getClassName())) {
                     firePropertyChange(SELECTED_PROPERTY, null, null);
                 }
-            }
-            else {
+            } else {
                 if (selectedEmbeddables
                         .remove(((Embeddable) currentClass).getClassName())) {
                     firePropertyChange(SELECTED_PROPERTY, null, null);
                 }
             }
         }
+        if(currentClass instanceof DataMap) {
+            updateArtifactGenerationMode(currentClass, selectedFlag);
+            if(selectedFlag) {
+                if(isDataMapSelected.add(dataMap.getName())) {
+                    firePropertyChange(SELECTED_PROPERTY, null, null);
+                }
+            } else {
+                if(isDataMapSelected
+                        .remove(((DataMap) currentClass).getName())) {
+                    firePropertyChange(SELECTED_PROPERTY, null, null);
+                }
+            }
+        }
+    }
+
+    private void updateArtifactGenerationMode(Object classObj, boolean selected) {
+        DataMap dataMap = (DataMap) classObj;
+        ClassGenerationAction generator = projectController.getApplication().getMetaData().get(dataMap, ClassGenerationAction.class);
+        if(selected) {
+            generator.setArtifactsGenerationMode("all");
+        } else {
+            generator.setArtifactsGenerationMode("entity");
+        }
     }
 
     public JLabel getItemName(Object obj) {
@@ -249,9 +291,12 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         if (obj instanceof Embeddable) {
             className = ((Embeddable) obj).getClassName();
             icon = CellRenderers.iconForObject(new Embeddable());
-        } else {
+        } else if(obj instanceof ObjEntity) {
             className = ((ObjEntity) obj).getName();
             icon = CellRenderers.iconForObject(new ObjEntity());
+        } else {
+            className = ((DataMap) obj).getName();
+            icon = CellRenderers.iconForObject(new DataMap());
         }
         JLabel labelIcon = new JLabel();
         labelIcon.setIcon(icon);
@@ -270,27 +315,36 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
                     generator.loadEntity(entity.getName());
                 }
             }
-
             for(Embeddable embeddable : getSelectedEmbeddables()) {
                 generator.loadEmbeddable(embeddable.getClassName());
             }
         }
     }
 
-    public void addToSelectedEntities(Collection<String> entities) {
+    public void addToSelectedEntities(DataMap dataMap, Collection<String> entities) {
+        if(selectedEntities == null) {
+            initCollectionsForSelection(dataMap);
+        }
         selectedEntities.addAll(entities);
     }
 
-    public void addToSelectedEmbeddables(Collection<String> embeddables) {
+    public void addToSelectedEmbeddables(DataMap dataMap, Collection<String> embeddables) {
+        if(selectedEmbeddables == null) {
+            initCollectionsForSelection(dataMap);
+        }
         selectedEmbeddables.addAll(embeddables);
     }
 
     public int getSelectedEntitiesSize() {
-        return selectedEntities.size();
+        return selectedEntities != null ? selectedEntities.size() : 0;
     }
 
     public int getSelectedEmbeddablesSize() {
-        return selectedEmbeddables.size();
+        return selectedEmbeddables != null ? selectedEmbeddables.size() : 0;
+    }
+
+    public boolean isDataMapSelected() {
+        return isDataMapSelected != null && isDataMapSelected.size() == 1;
     }
 
     public DataMap getDataMap() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
index cac063c..859cb2d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
@@ -19,38 +19,17 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import org.apache.cayenne.swing.components.TopBorder;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.ScrollPaneConstants;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
+import javax.swing.*;
+import java.awt.*;
 
 /**
  */
 public class CodeGeneratorPane extends JSplitPane {
 
-    protected JSplitPane splitPane;
-
-    protected JButton generateButton;
-    protected JLabel classesCount;
-
     public CodeGeneratorPane(Component generatorPanel, Component entitySelectorPanel) {
         super();
 
-        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
-
-        this.generateButton = new JButton("Generate");
-        this.classesCount = new JLabel("No classes selected");
-        classesCount.setFont(classesCount.getFont().deriveFont(10f));
-
+        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
         JScrollPane scrollPane = new JScrollPane(
                 generatorPanel,
                 ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
@@ -61,25 +40,7 @@ public class CodeGeneratorPane extends JSplitPane {
         splitPane.setRightComponent(scrollPane);
         splitPane.setLeftComponent(entitySelectorPanel);
 
-        JPanel messages = new JPanel(new BorderLayout());
-        messages.add(classesCount, BorderLayout.WEST);
-
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.setBorder(TopBorder.create());
-        buttons.add(classesCount);
-        buttons.add(Box.createHorizontalStrut(50));
-        buttons.add(generateButton);
-
         setLayout(new BorderLayout());
         add(splitPane, BorderLayout.CENTER);
-        add(buttons, BorderLayout.SOUTH);
-    }
-
-    public JButton getGenerateButton() {
-        return generateButton;
-    }
-
-    public JLabel getClassesCount() {
-        return classesCount;
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
index 029f92e..6a081a5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
@@ -26,7 +26,8 @@ import org.apache.cayenne.swing.BindingBuilder;
 
 import javax.swing.*;
 import java.awt.*;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -34,41 +35,21 @@ import java.util.List;
  */
 public class CustomModeController extends GeneratorController {
 
-    // correspond to non-public constants on MapClassGenerator.
-    private static final String MODE_DATAMAP = "datamap";
-    private static final String MODE_ENTITY = "entity";
-    private static final String MODE_ALL = "all";
-
-    private static final String DATA_MAP_MODE_LABEL = "DataMap generation";
-    private static final String ENTITY_MODE_LABEL = "Entity and Embeddable generation";
-    static final String ALL_MODE_LABEL = "Generate all";
-
-    static final Map<String, String> modesByLabel = new HashMap<>();
-
-    private static final Map<String, String> labelByMode = new HashMap<>();
-
-    static {
-        modesByLabel.put(DATA_MAP_MODE_LABEL, MODE_DATAMAP);
-        modesByLabel.put(ENTITY_MODE_LABEL, MODE_ENTITY);
-        modesByLabel.put(ALL_MODE_LABEL, MODE_ALL);
-        labelByMode.put(MODE_DATAMAP, DATA_MAP_MODE_LABEL);
-        labelByMode.put(MODE_ENTITY, ENTITY_MODE_LABEL);
-        labelByMode.put(MODE_ALL, ALL_MODE_LABEL);
-    }
-
     protected CustomModePanel view;
 
-    private ClassGenerationAction classGenerationAction;
-
     public CustomModeController(CodeGeneratorControllerBase parent) {
         super(parent);
-        this.view = new CustomModePanel(parent.getProjectController());
         bind();
         initListeners();
     }
 
+    @Override
+    protected GeneratorControllerPanel createView() {
+        this.view = new CustomModePanel(getApplication().getFrameController().getProjectController());
+        return view;
+    }
+
     private void bind() {
-        initBindings(new BindingBuilder(getApplication().getBindingFactory(), this));
         BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), this);
         builder.bindToAction(view.getManageTemplatesLink(), "popPreferencesAction()");
 
@@ -76,9 +57,6 @@ public class CustomModeController extends GeneratorController {
     }
 
     protected void updateTemplates() {
-        String[] modeChoices = new String[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
-        view.getGenerationMode().getComboBox().setModel(new DefaultComboBoxModel<>(modeChoices));
-
         CodeTemplateManager templateManager = getApplication().getCodeTemplateManager();
 
         List<String> customTemplates = new ArrayList<>(templateManager.getCustomTemplates().keySet());
@@ -92,30 +70,8 @@ public class CustomModeController extends GeneratorController {
         Collections.sort(subTemplates);
         subTemplates.addAll(customTemplates);
 
-        List<String> embeddableTemplates = new ArrayList<>(templateManager.getStandartEmbeddableTemplates());
-        Collections.sort(embeddableTemplates);
-        embeddableTemplates.addAll(customTemplates);
-
-        List<String> embeddableSuperTemplates = new ArrayList<>(templateManager.getStandartEmbeddableSuperclassTemplates());
-        Collections.sort(embeddableSuperTemplates);
-        embeddableSuperTemplates.addAll(customTemplates);
-
-        List<String> dataMapTemplates = new ArrayList<>(templateManager.getStandartDataMapTemplates());
-        Collections.sort(dataMapTemplates);
-        dataMapTemplates.addAll(customTemplates);
-
-        List<String> dataMapSuperTemplates = new ArrayList<>(templateManager.getStandartDataMapSuperclassTemplates());
-        Collections.sort(dataMapSuperTemplates);
-        dataMapSuperTemplates.addAll(customTemplates);
-
         this.view.getSubclassTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(subTemplates.toArray(new String[0])));
         this.view.getSuperclassTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(superTemplates.toArray(new String[0])));
-
-        this.view.getEmbeddableTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(embeddableTemplates.toArray(new String[0])));
-        this.view.getEmbeddableSuperTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(embeddableSuperTemplates.toArray(new String[0])));
-
-        this.view.getDataMapTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(dataMapTemplates.toArray(new String[0])));
-        this.view.getDataMapSuperTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(dataMapSuperTemplates.toArray(new String[0])));
     }
 
     public Component getView() {
@@ -129,21 +85,14 @@ public class CustomModeController extends GeneratorController {
     }
 
     private void updateComboBoxes() {
-        view.getEmbeddableTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getEmbeddableTemplate()));
-        view.getEmbeddableSuperTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getEmbeddableSuperTemplate()));
         view.getSubclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getTemplate()));
         view.getSuperclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getSuperclassTemplate()));
-        view.getGenerationMode().setItem(labelByMode.get(classGenerationAction.getArtifactsGenerationMode()));
-        view.getDataMapTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getQueryTemplate()));
-        view.getDataMapSuperTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getQuerySuperTemplate()));
-
         view.setDisableSuperComboBoxes(view.getPairs().isSelected());
     }
 
     @Override
     protected ClassGenerationAction newGenerator() {
         ClassGenerationAction action = new ClassGenerationAction();
-        action.setDefaults();
         getApplication().getInjector().injectMembers(action);
         return action;
     }
@@ -168,19 +117,25 @@ public class CustomModeController extends GeneratorController {
             classGenerationAction.setUsePkgPath(view.getUsePackagePath().isSelected());
             getParentController().getProjectController().setDirty(true);
         });
+
+        view.getPkProperties().addActionListener(val -> {
+            classGenerationAction.setCreatePKProperties(view.getPkProperties().isSelected());
+            getParentController().getProjectController().setDirty(true);
+        });
     }
 
     public void initForm(ClassGenerationAction classGenerationAction){
-        this.classGenerationAction = classGenerationAction;
-        view.getOutputFolder().setText(classGenerationAction.getDir());
-        view.setDataMapName(classGenerationAction.getDataMap().getName());
+        super.initForm(classGenerationAction);
         view.getOutputPattern().setText(classGenerationAction.getOutputPattern());
         view.getPairs().setSelected(classGenerationAction.isMakePairs());
         view.getUsePackagePath().setSelected(classGenerationAction.isUsePkgPath());
         view.getOverwrite().setSelected(classGenerationAction.isOverwrite());
         view.getCreatePropertyNames().setSelected(classGenerationAction.isCreatePropertyNames());
-        view.getSuperclassPackage().setText(classGenerationAction.getSuperPkg());
-        view.getEncoding().setText(classGenerationAction.getEncoding());
+        view.getPkProperties().setSelected(classGenerationAction.isCreatePKProperties());
+        if(classGenerationAction.getArtifactsGenerationMode().equalsIgnoreCase("all")) {
+            ((CodeGeneratorControllerBase)parent).setCurrentClass(classGenerationAction.getDataMap());
+            ((CodeGeneratorControllerBase)parent).setSelected(true);
+        }
         updateComboBoxes();
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
index 9213a86..a8c0183 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
@@ -29,48 +29,24 @@ import org.apache.cayenne.swing.components.JCayenneCheckBox;
 import org.apache.cayenne.swing.control.ActionLink;
 import org.apache.cayenne.validation.ValidationException;
 
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
+import javax.swing.*;
+import java.awt.*;
 
 public class CustomModePanel extends GeneratorControllerPanel {
 
-    private ComboBoxAdapter<String> generationMode;
     private ComboBoxAdapter<String> subclassTemplate;
     private ComboBoxAdapter<String> superclassTemplate;
-    private ComboBoxAdapter<String> embeddableTemplate;
-    private ComboBoxAdapter<String> embeddableSuperTemplate;
-    private ComboBoxAdapter<String> dataMapTemplate;
-    private ComboBoxAdapter<String> dataMapSuperTemplate;
     private JCheckBox pairs;
     private JCheckBox overwrite;
     private JCheckBox usePackagePath;
     private TextAdapter outputPattern;
     private JCheckBox createPropertyNames;
-    private TextAdapter superclassPackage;
-
-    private TextAdapter encoding;
-
-    private JLabel dataMapName;
+    private JCheckBox pkProperties;
 
     private ActionLink manageTemplatesLink;
 
     CustomModePanel(ProjectController projectController) {
         super(projectController);
-
-        JComboBox<String> modeField = new JComboBox<>();
-        this.generationMode = new ComboBoxAdapter<String>(modeField) {
-            @Override
-            protected void updateModel(String item) throws ValidationException {
-                getCgenByDataMap().setArtifactsGenerationMode(CustomModeController.modesByLabel.get(item));
-                projectController.setDirty(true);
-            }
-        };
-
         JComboBox<String> superclassField = new JComboBox<>();
         this.superclassTemplate = new ComboBoxAdapter<String>(superclassField) {
             @Override
@@ -89,24 +65,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
             }
         };
 
-        JComboBox<String> dataMapField = new JComboBox<>();
-        this.dataMapTemplate = new ComboBoxAdapter<String>(dataMapField) {
-            @Override
-            protected void updateModel(String item) throws ValidationException {
-                getCgenByDataMap().setQueryTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
-                projectController.setDirty(true);
-            }
-        };
-
-        JComboBox<String> dataMapSuperField = new JComboBox<>();
-        this.dataMapSuperTemplate = new ComboBoxAdapter<String>(dataMapSuperField) {
-            @Override
-            protected void updateModel(String item) throws ValidationException {
-                getCgenByDataMap().setQuerySuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
-                projectController.setDirty(true);
-            }
-        };
-
         this.pairs = new JCayenneCheckBox();
         this.overwrite = new JCayenneCheckBox();
         this.usePackagePath = new JCayenneCheckBox();
@@ -114,52 +72,15 @@ public class CustomModePanel extends GeneratorControllerPanel {
         JTextField outputPatternField = new JTextField();
         this.outputPattern = new TextAdapter(outputPatternField) {
             protected void updateModel(String text) {
-                getCgenByDataMap().setOutputPattern(text);
-                projectController.setDirty(true);
+
             }
         };
 
         this.createPropertyNames = new JCayenneCheckBox();
+        this.pkProperties = new JCayenneCheckBox();
         this.manageTemplatesLink = new ActionLink("Customize Templates...");
         this.manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
 
-        JTextField superclassPackageField = new JTextField();
-        this.superclassPackage = new TextAdapter(superclassPackageField) {
-            protected void updateModel(String text) {
-                getCgenByDataMap().setSuperPkg(text);
-                projectController.setDirty(true);
-            }
-        };
-
-        JTextField encodingField = new JTextField();
-        this.encoding = new TextAdapter(encodingField) {
-            protected void updateModel(String text) {
-                getCgenByDataMap().setEncoding(text);
-                projectController.setDirty(true);
-            }
-        };
-
-        JComboBox<String> embeddableField = new JComboBox<>();
-        this.embeddableTemplate = new ComboBoxAdapter<String>(embeddableField) {
-            @Override
-            protected void updateModel(String item) throws ValidationException {
-                getCgenByDataMap().setEmbeddableTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
-                projectController.setDirty(true);
-            }
-        };
-
-        JComboBox<String> embeddableSuperclassField = new JComboBox<>();
-        this.embeddableSuperTemplate = new ComboBoxAdapter<String>(embeddableSuperclassField) {
-            @Override
-            protected void updateModel(String item) throws ValidationException {
-                getCgenByDataMap().setEmbeddableSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
-                projectController.setDirty(true);
-            }
-        };
-
-        this.dataMapName = new JLabel();
-        this.dataMapName.setFont(dataMapName.getFont().deriveFont(1));
-
         pairs.addChangeListener(e -> {
            setDisableSuperComboBoxes(pairs.isSelected());
             overwrite.setEnabled(!pairs.isSelected());
@@ -167,40 +88,22 @@ public class CustomModePanel extends GeneratorControllerPanel {
 
         // assemble
         FormLayout layout = new FormLayout(
-                "right:100dlu, 3dlu, fill:100:grow, 6dlu, fill:50dlu, 3dlu", "");
+                "right:79dlu, 1dlu, fill:300:grow, 1dlu, left:100dlu, 100dlu", "");
         DefaultFormBuilder builder = new DefaultFormBuilder(layout);
         builder.setDefaultDialogBorder();
 
         builder.append("Output Directory:", outputFolder.getComponent(), selectOutputFolder);
         builder.nextLine();
 
-        builder.append("Generation Mode:", generationMode.getComboBox());
-        builder.nextLine();
-
-        builder.append("DataMap Template:", dataMapTemplate.getComboBox());
-        builder.nextLine();
-
-        builder.append("DataMap Superclass Template", dataMapSuperTemplate.getComboBox());
-        builder.nextLine();
-
         builder.append("Subclass Template:", subclassTemplate.getComboBox());
         builder.nextLine();
 
         builder.append("Superclass Template:", superclassTemplate.getComboBox());
         builder.nextLine();
 
-        builder.append("Embeddable Template", embeddableTemplate.getComboBox());
-        builder.nextLine();
-
-        builder.append("Embeddable Super Template", embeddableSuperTemplate.getComboBox());
-        builder.nextLine();
-
         builder.append("Output Pattern:", outputPattern.getComponent());
         builder.nextLine();
 
-        builder.append("Encoding", encoding.getComponent());
-        builder.nextLine();
-
         builder.append("Make Pairs:", pairs);
         builder.nextLine();
 
@@ -213,11 +116,9 @@ public class CustomModePanel extends GeneratorControllerPanel {
         builder.append("Create Property Names:", createPropertyNames);
         builder.nextLine();
 
-        builder.append(dataMapName);
+        builder.append("Create PK properties:", pkProperties);
         builder.nextLine();
 
-        builder.append("Superclass package", superclassPackage.getComponent());
-
         setLayout(new BorderLayout());
         add(builder.getPanel(), BorderLayout.CENTER);
 
@@ -230,12 +131,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
 
     public void setDisableSuperComboBoxes(boolean val){
         superclassTemplate.getComboBox().setEnabled(val);
-        embeddableSuperTemplate.getComboBox().setEnabled(val);
-        dataMapSuperTemplate.getComboBox().setEnabled(val);
-    }
-
-    public ComboBoxAdapter<String> getGenerationMode() {
-        return generationMode;
     }
 
     public ActionLink getManageTemplatesLink() {
@@ -244,18 +139,10 @@ public class CustomModePanel extends GeneratorControllerPanel {
 
     public ComboBoxAdapter<String> getSubclassTemplate() { return subclassTemplate; }
 
-    public ComboBoxAdapter<String> getEmbeddableTemplate() { return embeddableTemplate; }
-
-    public ComboBoxAdapter<String> getEmbeddableSuperTemplate() { return embeddableSuperTemplate; }
-
     public ComboBoxAdapter<String> getSuperclassTemplate() {
         return superclassTemplate;
     }
 
-    public ComboBoxAdapter<String> getDataMapTemplate() { return dataMapTemplate; }
-
-    public ComboBoxAdapter<String> getDataMapSuperTemplate() { return dataMapSuperTemplate; }
-
     public JCheckBox getOverwrite() {
         return overwrite;
     }
@@ -276,13 +163,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         return createPropertyNames;
     }
 
-    public TextAdapter getSuperclassPackage() {
-        return superclassPackage;
-    }
-
-    public TextAdapter getEncoding() { return encoding; }
-
-    public void setDataMapName(String mapName){
-        dataMapName.setText(mapName);
+    public JCheckBox getPkProperties() {
+        return pkProperties;
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
index 7a8b5cb..6b8db21 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
@@ -19,19 +19,11 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.EmbeddableAttribute;
-import org.apache.cayenne.map.EmbeddedAttribute;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.*;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
-import org.apache.cayenne.modeler.pref.DataMapDefaults;
 import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.modeler.util.CodeValidationUtil;
@@ -43,14 +35,15 @@ import org.apache.cayenne.validation.SimpleValidationFailure;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.JButton;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
+import javax.swing.*;
 import java.io.File;
-import java.util.Map;
-import java.util.Set;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.function.Predicate;
 import java.util.prefs.Preferences;
+import java.util.stream.Collectors;
 
 /**
  * A mode-specific part of the code generation dialog.
@@ -59,30 +52,13 @@ import java.util.prefs.Preferences;
 public abstract class GeneratorController extends CayenneController {
 
     protected String mode = ArtifactsGenerationMode.ENTITY.getLabel();
-    protected Map<DataMap, DataMapDefaults> mapPreferences;
-    private String outputPath;
+    protected ClassGenerationAction classGenerationAction;
 
     public GeneratorController(CodeGeneratorControllerBase parent) {
         super(parent);
-    }
 
-    public void setOutputPath(String path) {
-        String old = this.outputPath;
-        this.outputPath = path;
-        if (this.outputPath != null && !this.outputPath.equals(old)) {
-            updatePreferences(path);
-        }
-    }
-
-    public void updatePreferences(String path) {
-        if (mapPreferences == null)
-            return;
-        Set<DataMap> keys = mapPreferences.keySet();
-        for (DataMap key : keys) {
-            mapPreferences
-                    .get(key)
-                    .setOutputPath(path);
-        }
+        createView();
+        initBindings(new BindingBuilder(getApplication().getBindingFactory(), this));
     }
 
     protected void initBindings(BindingBuilder bindingBuilder) {
@@ -94,6 +70,8 @@ public abstract class GeneratorController extends CayenneController {
         return (CodeGeneratorControllerBase) getParent();
     }
 
+    protected abstract GeneratorControllerPanel createView();
+
     /**
      * Creates an appropriate subclass of {@link ClassGenerationAction},
      * returning it in an unconfigured state. Configuration is performed by
@@ -101,55 +79,64 @@ public abstract class GeneratorController extends CayenneController {
      */
     protected abstract ClassGenerationAction newGenerator();
 
+    protected void initForm(ClassGenerationAction classGenerationAction) {
+        this.classGenerationAction = classGenerationAction;
+        classGenerationAction.setRootPath(Paths.get(initOutputFolder()));
+        ((GeneratorControllerPanel)getView()).getOutputFolder().setText(classGenerationAction.getDir());
+    }
+
     /**
      * Creates a class generator for provided selections.
      */
     public ClassGenerationAction createGenerator() {
         DataMap map = getParentController().getProjectController().getCurrentDataMap();
-
         ClassGenerationAction generator = getParentController().projectController.getApplication().getMetaData().get(map, ClassGenerationAction.class);
         if(generator != null){
-            getParentController().addToSelectedEntities(generator.getEntities());
-            getParentController().addToSelectedEmbeddables(generator.getEmbeddables());
+            getParentController().addToSelectedEntities(generator.getDataMap(), generator.getEntities());
+            getParentController().addToSelectedEmbeddables(generator.getDataMap(), generator.getEmbeddables());
             return generator;
         }
 
         try {
             generator = newGenerator();
             generator.setDataMap(map);
-            initOutputFolder();
-            File outputDir = new File(outputPath);
+
+            Path basePath = Paths.get(initOutputFolder());
 
             // no destination folder
-            if (outputDir == null) {
+            if (basePath == null) {
                 JOptionPane.showMessageDialog(this.getView(), "Select directory for source files.");
                 return null;
             }
 
             // no such folder
-            if (!outputDir.exists() && !outputDir.mkdirs()) {
-                JOptionPane.showMessageDialog(this.getView(), "Can't create directory " + outputDir
-                        + ". Select a different one.");
-                return null;
+            if (!Files.exists(basePath)) {
+                Files.createDirectories(basePath);
             }
 
             // not a directory
-            if (!outputDir.isDirectory()) {
-                JOptionPane.showMessageDialog(this.getView(), outputDir + " is not a valid directory.");
+            if (!Files.isDirectory(basePath)) {
+                JOptionPane.showMessageDialog(this.getView(), basePath + " is not a valid directory.");
                 return null;
             }
 
-            generator.setDestDir(outputDir);
-
+            generator.setRootPath(basePath);
             Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, "");
-
             if (preferences != null) {
                 generator.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
             }
-
+            getParentController().addToSelectedEntities(map, map.getObjEntities()
+                    .stream()
+                    .map(Entity::getName)
+                    .collect(Collectors.toList()));
+            getParentController().addToSelectedEmbeddables(map, map.getEmbeddables()
+                    .stream()
+                    .map(Embeddable::getClassName)
+                    .collect(Collectors.toList()));
             getParentController().projectController.getApplication().getMetaData().add(map, generator);
-        } catch (CayenneRuntimeException exception) {
-            JOptionPane.showMessageDialog(this.getView(), exception.getUnlabeledMessage());
+        } catch (IOException exception) {
+            JOptionPane.showMessageDialog(this.getView(), "Can't create directory. " +
+                    ". Select a different one.");
             return null;
         }
 
@@ -202,7 +189,7 @@ public abstract class GeneratorController extends CayenneController {
         return null;
     }
 
-    protected ValidationFailure validateEmbeddable(Embeddable embeddable) {
+    private ValidationFailure validateEmbeddable(Embeddable embeddable) {
 
         String name = embeddable.getClassName();
 
@@ -258,7 +245,7 @@ public abstract class GeneratorController extends CayenneController {
         }
     }
 
-    protected ValidationFailure validateEntity(ObjEntity entity) {
+    private ValidationFailure validateEntity(ObjEntity entity) {
 
         String name = entity.getName();
 
@@ -288,7 +275,7 @@ public abstract class GeneratorController extends CayenneController {
         return null;
     }
 
-    protected ValidationFailure validateAttribute(ObjAttribute attribute) {
+    private ValidationFailure validateAttribute(ObjAttribute attribute) {
 
         String name = attribute.getEntity().getName();
 
@@ -319,7 +306,7 @@ public abstract class GeneratorController extends CayenneController {
         return null;
     }
 
-    protected ValidationFailure validateEmbeddedAttribute(ObjAttribute attribute) {
+    private ValidationFailure validateEmbeddedAttribute(ObjAttribute attribute) {
 
         String name = attribute.getEntity().getName();
 
@@ -368,7 +355,7 @@ public abstract class GeneratorController extends CayenneController {
         return null;
     }
 
-    protected ValidationFailure validateRelationship(ObjRelationship relationship, boolean clientValidation) {
+    private ValidationFailure validateRelationship(ObjRelationship relationship, boolean clientValidation) {
 
         String name = relationship.getSourceEntity().getName();
 
@@ -417,34 +404,17 @@ public abstract class GeneratorController extends CayenneController {
      * Returns a predicate for default entity selection in a given mode.
      */
     public Predicate getDefaultClassFilter() {
-        final ObjEntity selectedEntity = Application.getInstance().getFrameController().getProjectController()
-                .getCurrentObjEntity();
-
-        final Embeddable selectedEmbeddable = Application.getInstance().getFrameController().getProjectController()
-                .getCurrentEmbeddable();
-
-        if (selectedEntity != null) {
-            // select a single entity
-            final boolean hasProblem = getParentController().getProblem(selectedEntity.getName()) != null;
-            return object -> !hasProblem && object == selectedEntity;
-        } else if (selectedEmbeddable != null) {
-            // select a single embeddable
-            final boolean hasProblem = getParentController().getProblem(selectedEmbeddable.getClassName()) != null;
-            return object -> !hasProblem && object == selectedEmbeddable;
-        } else {
-            // select all entities
-            return object -> {
-                if (object instanceof ObjEntity) {
-                    return getParentController().getProblem(((ObjEntity) object).getName()) == null;
-                }
+        return object -> {
+            if (object instanceof ObjEntity) {
+                return getParentController().getProblem(((ObjEntity) object).getName()) == null;
+            }
 
-                if (object instanceof Embeddable) {
-                    return getParentController().getProblem(((Embeddable) object).getClassName()) == null;
-                }
+            if (object instanceof Embeddable) {
+                return getParentController().getProblem(((Embeddable) object).getClassName()) == null;
+            }
 
-                return false;
-            };
-        }
+            return false;
+        };
     }
 
     /**
@@ -452,6 +422,7 @@ public abstract class GeneratorController extends CayenneController {
      * generation directory.
      */
     public void selectOutputFolderAction() {
+
         TextAdapter outputFolder = ((GeneratorControllerPanel) getView()).getOutputFolder();
 
         String currentDir = outputFolder.getComponent().getText();
@@ -479,9 +450,23 @@ public abstract class GeneratorController extends CayenneController {
         }
     }
 
-    private void initOutputFolder() {
-        String pathString = System.getProperty("user.home");
-        setOutputPath(pathString);
+    private String initOutputFolder() {
+        String path;
+        if (System.getProperty("cayenne.cgen.destdir") != null) {
+            return System.getProperty("cayenne.cgen.destdir");
+        } else {
+            // init default directory..
+            FSPath lastPath = Application.getInstance().getFrameController().getLastDirectory();
+
+            path = checkDefaultMavenResourceDir(lastPath, "test");
+
+            if (path != null || (path = checkDefaultMavenResourceDir(lastPath, "main")) != null) {
+                return path;
+            } else {
+                File lastDir = lastPath.getExistingDirectory(false);
+                return lastDir != null ? lastDir.getAbsolutePath() : ".";
+            }
+        }
     }
 
     private String checkDefaultMavenResourceDir(FSPath lastPath, String dirType) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java
index 281046d..98e7841 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java
@@ -23,11 +23,11 @@ import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.TextAdapter;
+import org.apache.cayenne.validation.ValidationException;
 
-import javax.swing.JButton;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import java.io.File;
+import javax.swing.*;
+import java.util.ArrayList;
+import java.util.Collection;
 
 /**
  * A generic panel that is a superclass of generator panels, defining common fields.
@@ -35,27 +35,24 @@ import java.io.File;
  */
 public class GeneratorControllerPanel extends JPanel {
 
+    protected Collection<StandardPanelComponent> dataMapLines;
     protected TextAdapter outputFolder;
     protected JButton selectOutputFolder;
-
-    ProjectController projectController;
+    protected ProjectController projectController;
 
     public GeneratorControllerPanel(ProjectController projectController) {
+        this.dataMapLines = new ArrayList<>();
         this.projectController = projectController;
-        JTextField outputFolderField = new JTextField();
-        this.outputFolder = new TextAdapter(outputFolderField) {
-            protected void updateModel(String text) {
-                getCgenByDataMap().setDestDir(new File(text));
+        this.outputFolder = new TextAdapter(new JTextField()) {
+            @Override
+            protected void updateModel(String text) throws ValidationException {
+                getCgenByDataMap().setRelPath(text);
                 projectController.setDirty(true);
             }
         };
         this.selectOutputFolder = new JButton("Select");
     }
 
-    public ClassGenerationAction getCgenByDataMap() {
-        DataMap dataMap = projectController.getCurrentDataMap();
-        return projectController.getApplication().getMetaData().get(dataMap, ClassGenerationAction.class);
-    }
     public TextAdapter getOutputFolder() {
         return outputFolder;
     }
@@ -63,4 +60,9 @@ public class GeneratorControllerPanel extends JPanel {
     public JButton getSelectOutputFolder() {
         return selectOutputFolder;
     }
+
+    public ClassGenerationAction getCgenByDataMap() {
+        DataMap dataMap = projectController.getCurrentDataMap();
+        return projectController.getApplication().getMetaData().get(dataMap, ClassGenerationAction.class);
+    }
 }