Add dialog to create missing templates or using default.
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/397d29fa Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/397d29fa Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/397d29fa Branch: refs/heads/master Commit: 397d29fa98d1c74ac37732b9243d5cc1366fd98e Parents: c813e76 Author: Arseni Bulatski <ancars...@gmail.com> Authored: Tue Nov 13 16:27:56 2018 +0300 Committer: Arseni Bulatski <ancars...@gmail.com> Committed: Tue Nov 13 16:27:56 2018 +0300 ---------------------------------------------------------------------- .../cayenne/modeler/CodeTemplateManager.java | 12 +- .../modeler/dialog/cgen/TemplateDialog.java | 87 ++++++++++++ .../modeler/dialog/cgen/TemplateDialogView.java | 136 +++++++++++++++++++ .../modeler/dialog/pref/PreferenceDialog.java | 18 ++- .../dialog/pref/TemplatePreferences.java | 37 +++-- .../editor/cgen/CustomModeController.java | 44 ++++-- .../modeler/editor/cgen/CustomModePanel.java | 17 +-- 7 files changed, 308 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java index ccb4980..7579d5d 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java @@ -25,6 +25,8 @@ import org.apache.cayenne.modeler.pref.FSPath; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -155,9 +157,10 @@ public class CodeTemplateManager { // TODO: andrus, 12/5/2007 - this should also take a "pairs" parameter to // correctly // assign standard templates - public String getTemplatePath(String name) { + public String getTemplatePath(String name, Path rootPath) { Object value = customTemplates.get(name); if (value != null) { + value = rootPath.relativize(Paths.get((String)value)); return value.toString(); } @@ -165,9 +168,10 @@ public class CodeTemplateManager { return value != null ? value.toString() : null; } - public String getNameByPath(String name) { - if(reverseCustomTemplate.containsKey(name)){ - return reverseCustomTemplate.get(name); + public String getNameByPath(String name, Path rootPath) { + String fullPath = rootPath.resolve(Paths.get(name)).toString(); + if(reverseCustomTemplate.containsKey(fullPath)){ + return reverseCustomTemplate.get(fullPath); } else { Object value = reverseStandartTemplates.get(name); return value != null ? value.toString() : null; http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialog.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialog.java new file mode 100644 index 0000000..bd81368 --- /dev/null +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialog.java @@ -0,0 +1,87 @@ +/***************************************************************** + * 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.cgen; + +import org.apache.cayenne.gen.CgenConfiguration; +import org.apache.cayenne.gen.ClassGenerationAction; +import org.apache.cayenne.modeler.editor.cgen.CustomModeController; +import org.apache.cayenne.modeler.util.CayenneController; + +import javax.swing.JDialog; +import javax.swing.SwingUtilities; +import java.awt.Component; +import java.awt.Dialog; +import java.awt.Frame; +import java.awt.Window; + +/** + * @since 4.1 + */ +public class TemplateDialog extends CayenneController { + + protected TemplateDialogView view; + private CgenConfiguration cgenConfiguration; + private String template; + private String superTemplate; + + public TemplateDialog(final CayenneController parent, CgenConfiguration cgenConfiguration, String template, String superTemplate) { + super(parent); + this.cgenConfiguration = cgenConfiguration; + this.template = template; + this.superTemplate = superTemplate; + final Window parentView = parent.getView() instanceof Window + ? (Window) parent.getView() + : SwingUtilities.getWindowAncestor(parent.getView()); + this.view = (parentView instanceof Dialog) + ? new TemplateDialogView((Dialog) parentView, template, superTemplate) + : new TemplateDialogView((Frame) parentView, template, superTemplate); + initListeners(); + } + + public void startupAction() { + view.pack(); + // show + centerView(); + makeCloseableOnEscape(); + view.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + view.setModal(true); + view.setVisible(true); + } + + @Override + public Component getView() { + return view; + } + + private void initListeners() { + view.getUseDefault().addActionListener(action -> { + if(template != null) { + cgenConfiguration.setTemplate(ClassGenerationAction.SUBCLASS_TEMPLATE); + } + if(superTemplate != null) { + cgenConfiguration.setSuperTemplate(ClassGenerationAction.SUPERCLASS_TEMPLATE); + } + view.dispose(); + }); + view.getAddTemplate().addActionListener(action -> { + ((CustomModeController)parent).addTemplateAction(template, superTemplate); + view.dispose(); + }); + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialogView.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialogView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialogView.java new file mode 100644 index 0000000..48a80f9 --- /dev/null +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialogView.java @@ -0,0 +1,136 @@ +/***************************************************************** + * 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.cgen; + +import com.jgoodies.forms.builder.PanelBuilder; +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import org.apache.cayenne.modeler.util.CayenneDialog; + +import javax.swing.JButton; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.AbstractTableModel; +import java.awt.BorderLayout; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.util.ArrayList; +import java.util.List; + +/** + * @since 4.1 + */ +public class TemplateDialogView extends CayenneDialog { + + private JTable pathTable; + private JButton useDefault; + private JButton addTemplate; + private List<String> missingPathes; + + public TemplateDialogView(Dialog parent, String templatePath, String superTemplatePath) { + super(parent); + initPathes(templatePath, superTemplatePath); + init(); + } + + public TemplateDialogView(Frame parent, String templatePath, String superTemplatePath) { + super(parent); + initPathes(templatePath, superTemplatePath); + init(); + } + + private void initPathes(String templatePath, String superTemplatePath) { + this.missingPathes = new ArrayList<>(); + if(templatePath != null) { + missingPathes.add(templatePath); + } + if(superTemplatePath != null) { + missingPathes.add(superTemplatePath); + } + } + + private void init() { + useDefault = new JButton("Use default"); + addTemplate = new JButton("Add template"); + + pathTable = new JTable(); + pathTable.setRowHeight(25); + pathTable.setRowMargin(3); + pathTable.setCellSelectionEnabled(false); + + + // assemble + CellConstraints cc = new CellConstraints(); + PanelBuilder builder = new PanelBuilder(new FormLayout("fill:200dlu:grow", "pref, 3dlu, fill:40dlu:grow")); + + builder.setDefaultDialogBorder(); + + builder.addLabel("This templates are missing: ", cc.xy(1, 1)); + builder.add(new JScrollPane(pathTable), cc.xy(1, 3)); + + JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + buttons.add(useDefault); + buttons.add(addTemplate); + + getContentPane().setLayout(new BorderLayout()); + getContentPane().add(builder.getPanel(), BorderLayout.CENTER); + getContentPane().add(buttons, BorderLayout.SOUTH); + pathTable.setModel(new MissingPathTableModel()); + + setPreferredSize(new Dimension(450, 350)); + } + + public JButton getUseDefault() { + return useDefault; + } + + public JButton getAddTemplate() { + return addTemplate; + } + + class MissingPathTableModel extends AbstractTableModel { + + public int getRowCount() { + return missingPathes.size(); + } + + public int getColumnCount() { + return 1; + } + + public Object getValueAt(int row, int col) { + return missingPathes.get(row); + } + + public boolean isCellEditable(int row, int col) { + return false; + } + + public String getColumnName(int column) { + return " "; + } + + public Class getColumnClass(int columnIndex) { + return String.class; + } + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/PreferenceDialog.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/PreferenceDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/PreferenceDialog.java index 2e2ab38..677cc5e 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/PreferenceDialog.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/PreferenceDialog.java @@ -19,6 +19,12 @@ package org.apache.cayenne.modeler.dialog.pref; +import org.apache.cayenne.modeler.util.CayenneController; +import org.apache.cayenne.pref.PreferenceEditor; + +import javax.swing.JDialog; +import javax.swing.JList; +import javax.swing.SwingUtilities; import java.awt.Component; import java.awt.Dialog; import java.awt.Frame; @@ -26,13 +32,6 @@ import java.awt.Window; import java.util.HashMap; import java.util.Map; -import javax.swing.JDialog; -import javax.swing.JList; -import javax.swing.SwingUtilities; - -import org.apache.cayenne.modeler.util.CayenneController; -import org.apache.cayenne.pref.PreferenceEditor; - /** * A controller for editing Modeler preferences. * @@ -133,6 +132,11 @@ public class PreferenceDialog extends CayenneController { view.setVisible(true); } + public void startupToCreateTemplate(String template, String superTemplate) { + configure(); + ((TemplatePreferences) detailControllers.get(TEMPLATES_KEY)).addTemplateAction(template, superTemplate); + } + protected void configure() { // init known panels registerPanel(GENERAL_KEY, new GeneralPreferences(this)); http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/TemplatePreferences.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/TemplatePreferences.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/TemplatePreferences.java index e76aa5c..1b29183 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/TemplatePreferences.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/TemplatePreferences.java @@ -19,14 +19,6 @@ package org.apache.cayenne.modeler.dialog.pref; -import java.awt.Component; -import java.util.ArrayList; -import java.util.List; -import java.util.prefs.BackingStoreException; -import java.util.prefs.Preferences; - -import javax.swing.table.AbstractTableModel; - import org.apache.cayenne.modeler.CodeTemplateManager; import org.apache.cayenne.modeler.pref.FSPath; import org.apache.cayenne.modeler.util.CayenneController; @@ -38,6 +30,14 @@ import org.apache.cayenne.swing.TableBindingBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.swing.table.AbstractTableModel; +import java.awt.Component; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.prefs.BackingStoreException; +import java.util.prefs.Preferences; + public class TemplatePreferences extends CayenneController { protected TemplatePreferencesView view; @@ -120,9 +120,28 @@ public class TemplatePreferences extends CayenneController { } public void addTemplateAction() { - FSPath path = new TemplateCreator(this).startupAction(); + addToTemplateEntries(path); + } + + void addTemplateAction(String templatePath, String superTemplatePath) { + if(templatePath != null) { + createTemplate(templatePath); + } + if(superTemplatePath != null) { + createTemplate(superTemplatePath); + } + } + + private void createTemplate(String templatePath) { + TemplateCreator templateCreator = new TemplateCreator(this); + TemplateCreatorView creatorView = (TemplateCreatorView)templateCreator.getView(); + creatorView.getTemplateChooser().setFile(Paths.get(templatePath).toFile()); + FSPath path = templateCreator.startupAction(); + addToTemplateEntries(path); + } + private void addToTemplateEntries(FSPath path) { if (path != null) { int len = templateEntries.size(); templateEntries.add(path); http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/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 c591584..a6be13b 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 @@ -22,12 +22,12 @@ package org.apache.cayenne.modeler.editor.cgen; import org.apache.cayenne.gen.CgenConfiguration; import org.apache.cayenne.gen.ClassGenerationAction; import org.apache.cayenne.modeler.CodeTemplateManager; +import org.apache.cayenne.modeler.dialog.cgen.TemplateDialog; import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog; import org.apache.cayenne.swing.BindingBuilder; -import javax.swing.*; -import java.awt.*; -import java.nio.file.Path; +import javax.swing.DefaultComboBoxModel; +import java.awt.Component; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; @@ -82,22 +82,44 @@ public class CustomModeController extends GeneratorController { return view; } + public void missTemplateDialog(CgenConfiguration cgenConfiguration, String template, String superTemplate) { + new TemplateDialog(this, cgenConfiguration, template, superTemplate).startupAction(); + updateComboBoxes(); + } + public void popPreferencesAction() { new PreferenceDialog(getApplication().getFrameController()).startupAction(PreferenceDialog.TEMPLATES_KEY); updateTemplates(); updateComboBoxes(); } - private void updateComboBoxes() { - view.getSubclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath( - getAbsoluteTemplatePath(cgenConfiguration.getTemplate(), cgenConfiguration.getRootPath()))); - view.getSuperclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath( - getAbsoluteTemplatePath(cgenConfiguration.getSuperTemplate(), cgenConfiguration.getRootPath()))); - view.setDisableSuperComboBoxes(view.getPairs().isSelected()); + public void addTemplateAction(String template, String superTemplate) { + new PreferenceDialog(getApplication().getFrameController()).startupToCreateTemplate(template, superTemplate); + updateTemplates(); } - private String getAbsoluteTemplatePath(String relTemplatePath, Path rootPath) { - return rootPath.resolve(Paths.get(relTemplatePath)).toString(); + private void updateComboBoxes() { + String templateName = getApplication().getCodeTemplateManager().getNameByPath( + cgenConfiguration.getTemplate(), cgenConfiguration.getRootPath()); + String superTemplateName = getApplication().getCodeTemplateManager().getNameByPath( + cgenConfiguration.getSuperTemplate(), cgenConfiguration.getRootPath()); + String path = cgenConfiguration.getRootPath().resolve(Paths.get(cgenConfiguration.getTemplate())).toString(); + String superPath = cgenConfiguration.getRootPath().resolve(Paths.get(cgenConfiguration.getSuperTemplate())).toString(); + if(templateName == null && superTemplateName == null) { + view.getSubclassTemplate().setItem(null); + view.getSuperclassTemplate().setItem(null); + missTemplateDialog(cgenConfiguration, path, superPath); + } else if(templateName == null) { + view.getSubclassTemplate().setItem(null); + missTemplateDialog(cgenConfiguration, path, null); + } else if(superTemplateName == null) { + view.getSuperclassTemplate().setItem(null); + missTemplateDialog(cgenConfiguration, null, superPath); + } else { + view.getSubclassTemplate().setItem(templateName); + view.getSuperclassTemplate().setItem(superTemplateName); + } + view.setDisableSuperComboBoxes(view.getPairs().isSelected()); } private void initListeners(){ http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/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 16c8edf..ea5f1ce 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 @@ -27,13 +27,10 @@ import org.apache.cayenne.modeler.ProjectController; import org.apache.cayenne.modeler.util.ComboBoxAdapter; import org.apache.cayenne.modeler.util.TextAdapter; import org.apache.cayenne.swing.components.JCayenneCheckBox; -import org.apache.cayenne.swing.control.ActionLink; import org.apache.cayenne.validation.ValidationException; import javax.swing.*; import java.awt.*; -import java.nio.file.Path; -import java.nio.file.Paths; /** * @since 4.1 @@ -49,7 +46,7 @@ public class CustomModePanel extends GeneratorControllerPanel { private JCheckBox createPropertyNames; private JCheckBox pkProperties; - private ActionLink manageTemplatesLink; + private JButton manageTemplatesLink; CustomModePanel(ProjectController projectController, CodeGeneratorControllerBase codeGeneratorControllerBase) { super(projectController, codeGeneratorControllerBase); @@ -58,7 +55,7 @@ public class CustomModePanel extends GeneratorControllerPanel { @Override protected void updateModel(String item) throws ValidationException { CgenConfiguration cgenConfiguration = getCgenByDataMap(); - cgenConfiguration.setSuperTemplate(getTemplatePath(cgenConfiguration.getRootPath(), item)); + cgenConfiguration.setSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(item, cgenConfiguration.getRootPath())); if(!codeGeneratorControllerBase.isInitFromModel()) { projectController.setDirty(true); } @@ -70,7 +67,7 @@ public class CustomModePanel extends GeneratorControllerPanel { @Override protected void updateModel(String item) throws ValidationException { CgenConfiguration cgenConfiguration = getCgenByDataMap(); - cgenConfiguration.setTemplate(getTemplatePath(cgenConfiguration.getRootPath(), item)); + cgenConfiguration.setTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(item, cgenConfiguration.getRootPath())); if(!codeGeneratorControllerBase.isInitFromModel()) { projectController.setDirty(true); } @@ -93,7 +90,7 @@ public class CustomModePanel extends GeneratorControllerPanel { this.createPropertyNames = new JCayenneCheckBox(); this.pkProperties = new JCayenneCheckBox(); - this.manageTemplatesLink = new ActionLink("Customize Templates..."); + this.manageTemplatesLink = new JButton("Customize Templates..."); this.manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f)); pairs.addChangeListener(e -> { @@ -144,15 +141,11 @@ public class CustomModePanel extends GeneratorControllerPanel { add(builder.getPanel(), BorderLayout.CENTER); } - private String getTemplatePath(Path rootPath, String templatePath) { - return rootPath.relativize(Paths.get(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(templatePath)))).toString(); - } - public void setDisableSuperComboBoxes(boolean val){ superclassTemplate.getComboBox().setEnabled(val); } - public ActionLink getManageTemplatesLink() { + public JButton getManageTemplatesLink() { return manageTemplatesLink; }