IDEMPIERE-4581 Model generator should isn't dialog it should be window (#463)

* IDEMPIERE-4581 Model generator should isn't dialog it should be window

use shutdown asyn to shutdown framework when close Model generator window

one unhappy thing remain:
when use -console then framework is shutdown but jdk still hang because "pipe-gosh --login --noshutdown" still live (for https://bugs.eclipse.org/bugs/show_bug.cgi?id=362412)
work-around: use -console 1234
by that way we can't access osgi command from console but can use "telnet localhost 1234" to use osgi command

* IDEMPIERE-4581 Model generator should isn't dialog it should be window

Fix problem about program not closing
Improve layout

Co-authored-by: hieplq <hieplq@hasuvimex.vn>
This commit is contained in:
Carlos Ruiz 2020-12-13 00:57:33 +01:00 committed by GitHub
parent 5da1785572
commit fd947f4fef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 60 additions and 42 deletions

View File

@ -21,30 +21,20 @@
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/> <listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
</listAttribute> </listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/> <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/> <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/> <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="--add-modules java.se --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-exports java.desktop/sun.awt=ALL-UNNAMED --add-exports java.sql.rowset/com.sun.rowset=ALL-UNNAMED --add-exports java.naming/com.sun.jndi.ldap=ALL-UNNAMED"/> <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="--add-modules java.se --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-exports java.desktop/sun.awt=ALL-UNNAMED --add-exports java.sql.rowset/com.sun.rowset=ALL-UNNAMED --add-exports java.naming/com.sun.jndi.ldap=ALL-UNNAMED -Dosgi.noShutdown=true"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}"/> <stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}"/>
<stringAttribute key="pde.version" value="3.3"/> <stringAttribute key="pde.version" value="3.3"/>
<stringAttribute key="product" value="org.adempiere.server.server_product"/> <stringAttribute key="product" value="org.adempiere.server.server_product"/>
<stringAttribute key="productFile" value="/org.adempiere.server-feature/server.product"/> <stringAttribute key="productFile" value="/org.adempiere.server-feature/server.product"/>
<setAttribute key="selected_target_bundles"> <setAttribute key="selected_target_bundles">
<setEntry value="bcprov@default:default"/> <setEntry value="bcprov@default:default"/>
<setEntry value="com.diffplug.osgi.extension.sun.misc@default:false"/>
<setEntry value="com.google.zxing.core@default:default"/> <setEntry value="com.google.zxing.core@default:default"/>
<setEntry value="com.itextpdf@default:default"/> <setEntry value="com.itextpdf@default:default"/>
<setEntry value="com.jaspersoft.studio.bundles.barbecue@default:default"/> <setEntry value="com.jaspersoft.studio.bundles.barbecue@default:default"/>
<setEntry value="com.sun.activation.jakarta.activation@default:default"/> <setEntry value="com.sun.activation.jakarta.activation@default:default"/>
<setEntry value="com.sun.mail.imap@default:default"/>
<setEntry value="com.sun.mail.jakarta.mail@default:default"/> <setEntry value="com.sun.mail.jakarta.mail@default:default"/>
<setEntry value="com.sun.mail.smtp@default:default"/>
<setEntry value="groovy-console@default:false"/>
<setEntry value="groovy-datetime@default:false"/>
<setEntry value="groovy-json@default:false"/>
<setEntry value="groovy-jsr223@default:false"/>
<setEntry value="groovy-nio@default:false"/>
<setEntry value="groovy-sql@default:false"/>
<setEntry value="groovy-xml@default:false"/>
<setEntry value="groovy@default:default"/> <setEntry value="groovy@default:default"/>
<setEntry value="jakarta.xml.bind-api@default:default"/> <setEntry value="jakarta.xml.bind-api@default:default"/>
<setEntry value="javax.jms@default:default"/> <setEntry value="javax.jms@default:default"/>
@ -52,7 +42,6 @@
<setEntry value="org.apache.activemq.activemq-core@default:default"/> <setEntry value="org.apache.activemq.activemq-core@default:default"/>
<setEntry value="org.apache.activemq.kahadb@default:default"/> <setEntry value="org.apache.activemq.kahadb@default:default"/>
<setEntry value="org.apache.ant@default:default"/> <setEntry value="org.apache.ant@default:default"/>
<setEntry value="org.apache.commons.codec@default:default"/>
<setEntry value="org.apache.commons.collections@default:default"/> <setEntry value="org.apache.commons.collections@default:default"/>
<setEntry value="org.apache.commons.commons-collections4@default:default"/> <setEntry value="org.apache.commons.commons-collections4@default:default"/>
<setEntry value="org.apache.commons.compress@default:default"/> <setEntry value="org.apache.commons.compress@default:default"/>
@ -66,10 +55,6 @@
<setEntry value="org.apache.poi.poi-ooxml@default:default"/> <setEntry value="org.apache.poi.poi-ooxml@default:default"/>
<setEntry value="org.apache.poi.poi@default:default"/> <setEntry value="org.apache.poi.poi@default:default"/>
<setEntry value="org.apache.servicemix.bundles.cglib.source"/> <setEntry value="org.apache.servicemix.bundles.cglib.source"/>
<setEntry value="org.apache.servicemix.bundles.cglib@default:default"/>
<setEntry value="org.apache.servicemix.bundles.xerces@default:default"/>
<setEntry value="org.apache.xml.resolver@default:default"/>
<setEntry value="org.apache.xml.serializer@default:default"/>
<setEntry value="org.apache.xmlbeans@default:default"/> <setEntry value="org.apache.xmlbeans@default:default"/>
<setEntry value="org.cryptacular@default:default"/> <setEntry value="org.cryptacular@default:default"/>
<setEntry value="org.eclipse.ant.core@default:default"/> <setEntry value="org.eclipse.ant.core@default:default"/>
@ -93,18 +78,11 @@
<setEntry value="org.krysalis.barcode4j@default:default"/> <setEntry value="org.krysalis.barcode4j@default:default"/>
<setEntry value="org.passay@default:default"/> <setEntry value="org.passay@default:default"/>
<setEntry value="slf4j.api@default:default"/> <setEntry value="slf4j.api@default:default"/>
<setEntry value="slf4j.jcl@default:default"/> <setEntry value="slf4j.jcl@default:false"/>
</setAttribute> </setAttribute>
<setAttribute key="selected_workspace_bundles"> <setAttribute key="selected_workspace_bundles">
<setEntry value="org.adempiere.base.callout@default:default"/>
<setEntry value="org.adempiere.base.process@default:default"/>
<setEntry value="org.adempiere.base@default:default"/> <setEntry value="org.adempiere.base@default:default"/>
<setEntry value="org.adempiere.install@default:default"/> <setEntry value="org.adempiere.install@default:default"/>
<setEntry value="org.adempiere.payment.processor@default:default"/>
<setEntry value="org.adempiere.pipo.handlers@default:default"/>
<setEntry value="org.adempiere.pipo@default:true"/>
<setEntry value="org.adempiere.plugin.utils@default:default"/>
<setEntry value="org.adempiere.replication@default:default"/>
<setEntry value="org.apache.ecs@default:default"/> <setEntry value="org.apache.ecs@default:default"/>
<setEntry value="org.compiere.db.oracle.provider@default:default"/> <setEntry value="org.compiere.db.oracle.provider@default:default"/>
<setEntry value="org.compiere.db.postgresql.provider@default:default"/> <setEntry value="org.compiere.db.postgresql.provider@default:default"/>

View File

@ -13,14 +13,20 @@
*****************************************************************************/ *****************************************************************************/
package org.adempiere.base; package org.adempiere.base;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Map; import java.util.Map;
import javax.swing.JFrame;
import org.adempiere.util.ModelClassGenerator; import org.adempiere.util.ModelClassGenerator;
import org.adempiere.util.ModelGeneratorDialog; import org.adempiere.util.ModelGeneratorDialog;
import org.adempiere.util.ModelInterfaceGenerator; import org.adempiere.util.ModelInterfaceGenerator;
import org.compiere.Adempiere; import org.compiere.Adempiere;
import org.eclipse.equinox.app.IApplication; import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext; import org.eclipse.equinox.app.IApplicationContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.FrameworkUtil;
/** /**
* @author hengsin * @author hengsin
@ -52,12 +58,30 @@ public class ModelGeneratorApplication implements IApplication {
System.out.println("usage: ModelGenerator folder packageName tableEntityType tableName columnEntityType"); System.out.println("usage: ModelGenerator folder packageName tableEntityType tableName columnEntityType");
} else { } else {
ModelGeneratorDialog dialog = new ModelGeneratorDialog(); ModelGeneratorDialog dialog = new ModelGeneratorDialog();
dialog.setModal(true); dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
context.setResult(IApplication.EXIT_OK, ModelGeneratorApplication.this);
try {
// async stop https://www.eclipse.org/forums/index.php?t=msg&th=31999&goto=103832&#msg_103832
// can cast getBundle(0) to org.osgi.framework.launch.Framework in case want more
FrameworkUtil.getBundle(ModelGeneratorApplication.class).getBundleContext().getBundle(0).stop();
} catch (BundleException be) {
System.exit(0);
}
}
});
//dialog.setModal(true);
dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
dialog.pack(); dialog.pack();
dialog.setLocationRelativeTo(null); dialog.setLocationRelativeTo(null);
dialog.setVisible(true); dialog.setVisible(true);
} }
return IApplication.EXIT_OK;
// async stop on close window
return IApplicationContext.EXIT_ASYNC_RESULT;
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@ -15,6 +15,8 @@ package org.adempiere.util;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout; import java.awt.GridLayout;
import java.awt.Insets; import java.awt.Insets;
import java.awt.Panel; import java.awt.Panel;
@ -24,8 +26,8 @@ import java.io.File;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JCheckBox; import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser; import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JTextField; import javax.swing.JTextField;
@ -37,7 +39,7 @@ import org.compiere.Adempiere;
* @author hengsin * @author hengsin
* *
*/ */
public class ModelGeneratorDialog extends JDialog implements ActionListener { public class ModelGeneratorDialog extends JFrame implements ActionListener {
/** /**
* default generated serial version Id * default generated serial version Id
@ -63,7 +65,7 @@ public class ModelGeneratorDialog extends JDialog implements ActionListener {
this.getContentPane().add(confirmPanel, BorderLayout.SOUTH); this.getContentPane().add(confirmPanel, BorderLayout.SOUTH);
Panel mainPanel = new Panel(); Panel mainPanel = new Panel();
this.getContentPane().add(mainPanel, BorderLayout.CENTER); this.getContentPane().add(mainPanel, BorderLayout.CENTER);
mainPanel.setLayout(new GridLayout(6, 2)); mainPanel.setLayout(new GridBagLayout());
Panel filePanel = new Panel(); Panel filePanel = new Panel();
filePanel.setLayout(new BorderLayout()); filePanel.setLayout(new BorderLayout());
@ -73,30 +75,30 @@ public class ModelGeneratorDialog extends JDialog implements ActionListener {
bFolder = new JButton("..."); bFolder = new JButton("...");
bFolder.setMargin(new Insets(0, 0, 0, 0)); bFolder.setMargin(new Insets(0, 0, 0, 0));
filePanel.add(bFolder, BorderLayout.EAST); filePanel.add(bFolder, BorderLayout.EAST);
mainPanel.add(new JLabel("Source Folder")); mainPanel.add(new JLabel("Source Folder"), makeGbc(0, 0));
mainPanel.add(filePanel); mainPanel.add(filePanel, makeGbc(1, 0));
bFolder.addActionListener(this); bFolder.addActionListener(this);
mainPanel.add(new JLabel("Package Name")); mainPanel.add(new JLabel("Package Name"), makeGbc(0, 1));
fPackageName = new JTextField("org.compiere.model"); fPackageName = new JTextField("org.compiere.model");
mainPanel.add(fPackageName); mainPanel.add(fPackageName, makeGbc(1, 1));
mainPanel.add(new JLabel("Table Name")); mainPanel.add(new JLabel("Table Name"), makeGbc(0, 2));
fTableName = new JTextField("AD_ReplaceThis%"); fTableName = new JTextField("AD_ReplaceThis%");
mainPanel.add(fTableName); mainPanel.add(fTableName, makeGbc(1, 2));
mainPanel.add(new JLabel("Table Entity Type")); mainPanel.add(new JLabel("Table Entity Type"), makeGbc(0, 3));
fEntityType = new JTextField("D"); fEntityType = new JTextField("D");
mainPanel.add(fEntityType); mainPanel.add(fEntityType, makeGbc(1, 3));
mainPanel.add(new JLabel("Column Entity Type")); mainPanel.add(new JLabel("Column Entity Type"), makeGbc(0, 4));
fColumnEntityType = new JTextField(""); fColumnEntityType = new JTextField("");
mainPanel.add(fColumnEntityType); mainPanel.add(fColumnEntityType, makeGbc(1, 4));
Panel chkPanel = new Panel(); Panel chkPanel = new Panel();
chkPanel.setLayout(new GridLayout(1, 2)); chkPanel.setLayout(new GridLayout(1, 2));
mainPanel.add(new JLabel("")); mainPanel.add(new JLabel(""), makeGbc(0, 5));
mainPanel.add(chkPanel); mainPanel.add(chkPanel, makeGbc(1, 5));
fGenerateInterface = new JCheckBox("Generate Interface"); fGenerateInterface = new JCheckBox("Generate Interface");
fGenerateInterface.setSelected(true); fGenerateInterface.setSelected(true);
chkPanel.add(fGenerateInterface); chkPanel.add(fGenerateInterface);
@ -112,6 +114,20 @@ public class ModelGeneratorDialog extends JDialog implements ActionListener {
bCancel.addActionListener(this); bCancel.addActionListener(this);
} }
private GridBagConstraints makeGbc(int x, int y) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.gridx = x;
gbc.gridy = y;
gbc.weightx = x;
gbc.weighty = 1.0;
gbc.insets = new Insets(2, 2, 2, 2);
gbc.anchor = (x == 0) ? GridBagConstraints.LINE_START : GridBagConstraints.LINE_END;
gbc.fill = GridBagConstraints.HORIZONTAL;
return gbc;
}
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
if (e.getSource() == bGenerate) { if (e.getSource() == bGenerate) {