/******************************************************************************* * Copyright (c) 2008-2009 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributor: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.hibernate.jpt.ui.wizard; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.core.runtime.IPath; import org.eclipse.datatools.connectivity.IConnectionProfile; import org.eclipse.datatools.connectivity.ProfileManager; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.PackageFragmentRoot; import org.eclipse.jdt.internal.ui.wizards.dialogfields.ComboDialogField; import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField; import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener; import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter; import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.jpt.jpa.core.JpaProject; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.hibernate.console.ConnectionProfileUtil; import org.hibernate.console.ConsoleConfiguration; import org.hibernate.console.KnownConfigurations; import org.hibernate.console.preferences.ConsoleConfigurationPreferences; import org.hibernate.console.preferences.ConsoleConfigurationPreferences.ConfigurationMode; import org.hibernate.eclipse.console.EclipseConsoleConfigurationPreferences; import org.hibernate.eclipse.console.HibernateConsoleMessages; import org.hibernate.eclipse.console.utils.DialogSelectionHelper; import org.hibernate.eclipse.console.utils.DriverClassHelpers; import org.hibernate.eclipse.console.utils.LaunchHelper; import org.hibernate.eclipse.launch.PathHelper; import org.hibernate.util.xpl.StringHelper; import org.jboss.tools.hibernate.jpt.core.internal.HibernateJpaProject; import org.jboss.tools.hibernate.jpt.ui.HibernateJptUIPlugin; import org.jboss.tools.hibernate.runtime.spi.ServiceLookup; /** * @author Dmitry Geraskov * */ public abstract class GenerateInitWizardPage extends WizardPage { private static final String AUTODETECT = Messages.GenerateInitWizardPage_autodetect; private DriverClassHelpers helper = new DriverClassHelpers(); private StringButtonDialogField outputdir; private ComboDialogField hibernateVersion; private ComboDialogField connectionProfileName; private StringButtonDialogField schemaName; private ComboDialogField consoleConfigurationName; private ComboDialogField dialectName; private Button useConsoleConfiguration; private Group dbGroup; private HibernateJpaProject jpaProject; protected int numColumns = 3; protected IDialogFieldListener fieldlistener = new IDialogFieldListener() { public void dialogFieldChanged(DialogField field) { dialogChanged(); } }; public GenerateInitWizardPage(HibernateJpaProject jpaProject){ super("", Messages.GenerateInitWizardPage_title, null); //$NON-NLS-1$ this.jpaProject = jpaProject; } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); container.setLayout(layout); layout.numColumns = numColumns; layout.verticalSpacing = 10; outputdir = new StringButtonDialogField(new IStringButtonAdapter() { public void changeControlPressed(DialogField field) { IPath[] paths = DialogSelectionHelper.chooseFolderEntries(getShell(), PathHelper.pathOrNull(outputdir.getText()), HibernateConsoleMessages.CodeGenerationSettingsTab_select_output_dir, HibernateConsoleMessages.CodeGenerationSettingsTab_choose_dir_for_generated_files, false); if(paths!=null && paths.length==1) { outputdir.setText( ( (paths[0]).toOSString() ) ); } } }); outputdir.setText(getDefaultOutput()); outputdir.setDialogFieldListener(fieldlistener); outputdir.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_output_dir); outputdir.setButtonLabel(HibernateConsoleMessages.CodeGenerationSettingsTab_browse); Control[] controls = outputdir.doFillIntoGrid(container, numColumns); // Hack to tell the text field to stretch! ( (GridData)controls[1].getLayoutData() ).grabExcessHorizontalSpace = true; setPageComplete(!StringHelper.isEmpty(getOutputDir())); createChildControls(container); useConsoleConfiguration = new Button(container, SWT.CHECK); useConsoleConfiguration.setText(Messages.GenerateInitWizardPage_use_console_configuration); useConsoleConfiguration.setSelection(true); useConsoleConfiguration.addSelectionListener(new SelectionListener(){ public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } public void widgetSelected(SelectionEvent e) { consoleConfigurationName.setEnabled(useConsoleConfiguration.getSelection()); hibernateVersion.setEnabled(!useConsoleConfiguration.getSelection()); connectionProfileName.setEnabled(!useConsoleConfiguration.getSelection()); schemaName.setEnabled(!useConsoleConfiguration.getSelection()); dialectName.setEnabled(!useConsoleConfiguration.getSelection()); dialogChanged(); }}); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = numColumns; useConsoleConfiguration.setLayoutData(gd); consoleConfigurationName = new ComboDialogField(SWT.READ_ONLY); consoleConfigurationName.setLabelText(HibernateConsoleMessages.CodeGenerationSettingsTab_console_configuration); ConsoleConfiguration[] cfg = LaunchHelper.findFilteredSortedConsoleConfigs(); String[] names = new String[cfg.length]; for (int i = 0; i < cfg.length; i++) { ConsoleConfiguration configuration = cfg[i]; names[i] = configuration.getName(); } consoleConfigurationName.setItems(names); consoleConfigurationName.setText(jpaProject.getDefaultConsoleConfigurationName()); consoleConfigurationName.setDialogFieldListener(fieldlistener); consoleConfigurationName.doFillIntoGrid(container, numColumns); hibernateVersion = new ComboDialogField(SWT.READ_ONLY); hibernateVersion.setLabelText(HibernateConsoleMessages.ConsoleConfigurationMainTab_0); hibernateVersion.setItems(ServiceLookup.getVersions()); hibernateVersion.selectItem(0); hibernateVersion.setDialogFieldListener(fieldlistener); hibernateVersion.doFillIntoGrid(container, numColumns); hibernateVersion.setEnabled(false); createDBGroup(container, numColumns); setControl(container); if (StringHelper.isEmpty(consoleConfigurationName.getText())) { setPageComplete(false); } } /** * @param parent */ protected abstract void createChildControls(Composite parent); /** * @param container * @param colCount */ private void createDBGroup(Composite container, int numColumns) { dbGroup = new Group(container, SWT.FILL); dbGroup.setLayout(new FillLayout()); GridLayout layout = new GridLayout(); dbGroup.setLayout(layout); layout.numColumns = numColumns; layout.verticalSpacing = 10; GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = numColumns; dbGroup.setLayoutData(gd); dbGroup.setText(Messages.GenerateInitWizardPage_databaseSettings); //****************************connection profile***************** connectionProfileName = new ComboDialogField(SWT.READ_ONLY); connectionProfileName.setLabelText(Messages.GenerateInitWizardPage_databaseSettings_connection); connectionProfileName.setItems(dtpConnectionProfileNames()); String connectionName = getProjectConnectionProfileName(); if (!isEmpty(connectionName)) { connectionProfileName.selectItem(connectionName); } connectionProfileName.doFillIntoGrid(dbGroup, numColumns); connectionProfileName.setDialogFieldListener(fieldlistener); connectionProfileName.setEnabled(!useConsoleConfiguration.getSelection()); //****************************dialect***************** dialectName = new ComboDialogField(SWT.NONE); dialectName.setLabelText(HibernateConsoleMessages.NewConfigurationWizardPage_database_dialect); dialectName.setItems(getDialectNames()); dialectName.selectItem(0); dialectName.doFillIntoGrid(dbGroup, numColumns); dialectName.setEnabled(false); dialectName.setDialogFieldListener(fieldlistener); //****************************schema***************** schemaName = new StringButtonDialogField(new IStringButtonAdapter(){ public void changeControlPressed(DialogField field) { // TODO Auto-generated method stub }}); schemaName.setLabelText(Messages.GenerateInitWizardPage_databaseShema); schemaName.setButtonLabel(Messages.GenerateInitWizardPage_refresh); Control[] controls = schemaName.doFillIntoGrid(dbGroup, numColumns); // Hack to tell the text field to stretch! ( (GridData)controls[1].getLayoutData() ).grabExcessHorizontalSpace = true; schemaName.setEnabled(!useConsoleConfiguration.getSelection()); } protected boolean isUseConsoleConfiguration(){ return useConsoleConfiguration.getSelection(); } protected String getHibernateVersion(){ return hibernateVersion.getText(); } protected void dialogChanged() { String msg = PathHelper.checkDirectory(getOutputDir(), HibernateConsoleMessages.CodeGenerationSettingsTab_output_directory, false); if (msg!=null) { setErrorMessage( msg ); setPageComplete( false ); return; } if (useConsoleConfiguration.getSelection() && (StringHelper.isEmpty(getConfigurationName()))){ setPageComplete(false); setErrorMessage(Messages.GenerateInitWizardPage_err_msg_select_console_configuration); return; } if (!useConsoleConfiguration.getSelection() && (StringHelper.isEmpty(getConnectionProfileName()))){ setPageComplete(false); setErrorMessage(Messages.GenerateInitWizardPage_err_msg_select_connection_profile); return; } setPageComplete(true); } public String getOutputDir(){ return outputdir.getText(); } private String[] dtpConnectionProfileNames() { List<String> list = new ArrayList<String>(); IConnectionProfile[] cps = ProfileManager.getInstance().getProfiles(); for (int i = 0; i < cps.length; i++) { list.add(cps[i].getName()); } Collections.sort(list); return list.toArray(new String[list.size()]); } private String getProjectConnectionProfileName() { return jpaProject.getDataSource().getConnectionProfileName(); } public String getConfigurationName() { if (useConsoleConfiguration.getSelection()) return consoleConfigurationName.getText(); return createConsoleConfiguration(); } public String getConnectionProfileName() { return connectionProfileName.getText(); } private String createConsoleConfiguration(){ ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager(); String dialect = determineDialect(); String ccName = launchManager.generateLaunchConfigurationName(HibernateConsoleMessages.AddConfigurationAction_hibernate); ConsoleConfigurationPreferences prefs = new EclipseConsoleConfigurationPreferences(ccName, ConfigurationMode.JPA, getHibernateVersion(), jpaProject.getName(), true, null, null, null, new IPath[0], new IPath[0], null, null, getConnectionProfileName(), dialect); ConsoleConfiguration cc = new ConsoleConfiguration(prefs); KnownConfigurations.getInstance().addConfiguration(cc, false); return ccName; } public boolean isTemporaryConfiguration(){ return !useConsoleConfiguration.getSelection(); } public JpaProject getJpaProject(){ return jpaProject; } public void setWarningMessage(String warning){ setMessage(warning, WARNING); } protected String getDefaultOutput(){ try{ if (getJpaProject() == null) return ""; //$NON-NLS-1$ if (getJpaProject().getJavaProject() == null) return ""; //$NON-NLS-1$ if (!getJpaProject().getJavaProject().exists()) return ""; //$NON-NLS-1$ IPackageFragmentRoot[] roots = getJpaProject().getJavaProject().getPackageFragmentRoots(); for (int i = 0; i < roots.length; i++) { IPackageFragmentRoot root = roots[i]; if (root.getClass() == PackageFragmentRoot.class) { if (root.exists()) return root.getResource().getFullPath().toOSString(); } } return getJpaProject().getJavaProject().getResource().getFullPath().toOSString(); } catch(JavaModelException e){ HibernateJptUIPlugin.logException(e); return ""; //$NON-NLS-1$ } } private String[] getDialectNames(){ String[] dialectNames1 = helper.getDialectNames(); String[] dialectNames2 = new String[dialectNames1.length + 1]; dialectNames2[0] = AUTODETECT; System.arraycopy(dialectNames1, 0, dialectNames2, 1, dialectNames1.length); return dialectNames2; } private String determineDialect() { if (!AUTODETECT.equals(dialectName.getText())){ return helper.getDialectClass(dialectName.getText()); } if (!useConsoleConfiguration.getSelection()){ String driver = ConnectionProfileUtil.getDriverClass(getConnectionProfileName()); return helper.getDialect(driver); } return null; } private boolean isEmpty(String str) { return (str == null || str.trim().length() == 0); } }