org.hibernate.eclipse.console.wizards.ConsoleConfigurationWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.eclipse.console.wizards.ConsoleConfigurationWizardPage.java

Source

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.hibernate.eclipse.console.wizards;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.internal.core.LaunchConfiguration;
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jface.dialogs.IDialogPage;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPreferenceConstants;
import org.eclipse.ui.PlatformUI;
import org.hibernate.console.preferences.ConsoleConfigurationPreferences.ConfigurationMode;
import org.hibernate.eclipse.console.EclipseConsoleConfiguration;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
import org.hibernate.eclipse.console.HibernateConsolePlugin;
import org.hibernate.eclipse.console.actions.AddConfigurationAction;
import org.hibernate.eclipse.console.utils.LaunchHelper;
import org.hibernate.eclipse.launch.ConsoleConfigurationJavaClasspathTab;
import org.hibernate.eclipse.launch.ConsoleConfigurationMainTab;
import org.hibernate.eclipse.launch.ConsoleConfigurationTabGroup;
import org.hibernate.eclipse.launch.IConsoleConfigurationLaunchConstants;
import org.hibernate.util.xpl.StringHelper;

/**
 * This wizardpage wraps the LaunchConfiguration based tabs and thus mimicks the normal launch configuration ui.
 * Most logic should go to the launch config tabs, very little logic should need to be in this class (besides handling the tabs and name of the configuraiton).
 * 
 * @author max
 */
@SuppressWarnings("restriction")
public class ConsoleConfigurationWizardPage extends WizardPage implements ILaunchConfigurationDialog {

    /**
     * Name label widget
     */
    protected Label nameLabel;

    /**
     * Name text widget
     */
    protected Text nameWidget;

    /**
     * custom tab folder control
     */
    protected CTabFolder tabFolder;

    /**
     * Tab controls
     */
    protected ConsoleConfigurationTabGroup tabGroup;

    protected ILaunchConfigurationWorkingCopy currentLaunchConfig;

    protected int currentTabIndex;

    protected ISelection selection;

    private boolean initializingTabs;

    private boolean firstShow = true;

    /**
     * Constructor for SampleNewWizardPage.
     * 
     * @param pageName
     */
    public ConsoleConfigurationWizardPage(ISelection selection) {
        super(HibernateConsoleMessages.ConsoleConfigurationWizardPage_config_page);
        setTitle(HibernateConsoleMessages.ConsoleConfigurationWizardPage_create_hibernate_console_config);
        setDescription(HibernateConsoleMessages.ConsoleConfigurationWizardPage_this_wizard_allows);
        this.selection = selection;
    }

    /**
     * @see IDialogPage#createControl(Composite)
     */
    public void createControl(Composite parent) {
        final ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
        sc.setExpandHorizontal(true);
        sc.setExpandVertical(true);

        Composite container = new Composite(sc, SWT.NONE);

        GridLayout layout = new GridLayout(2, false);
        layout.verticalSpacing = 10;
        layout.horizontalSpacing = 5;
        container.setLayout(layout);
        GridData gd = new GridData(GridData.FILL_BOTH);
        container.setLayoutData(gd);

        nameLabel = new Label(container, SWT.HORIZONTAL | SWT.LEFT);
        nameLabel.setText(HibernateConsoleMessages.ConsoleConfigurationWizardPage_name);
        nameLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));

        nameWidget = new Text(container, SWT.SINGLE | SWT.BORDER);
        nameWidget.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        tabFolder = new CTabFolder(container, SWT.TOP | SWT.NO_REDRAW_RESIZE | SWT.NO_TRIM | SWT.FLAT);
        gd = new GridData(GridData.FILL_BOTH);
        gd.horizontalSpan = 2;
        ColorRegistry reg = JFaceResources.getColorRegistry();
        Color c1 = reg.get("org.eclipse.ui.workbench.ACTIVE_TAB_BG_START"), //$NON-NLS-1$
                c2 = reg.get("org.eclipse.ui.workbench.ACTIVE_TAB_BG_END"); //$NON-NLS-1$
        tabFolder.setSelectionBackground(new Color[] { c1, c2 }, new int[] { 100 }, true);
        tabFolder.setSelectionForeground(reg.get("org.eclipse.ui.workbench.ACTIVE_TAB_TEXT_COLOR")); //$NON-NLS-1$
        tabFolder.setSimple(PlatformUI.getPreferenceStore()
                .getBoolean(IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS));
        tabFolder.setLayoutData(gd);
        tabFolder.setBorderVisible(true);
        tabFolder.setFont(parent.getFont());

        sc.setContent(container);

        initTabs(tabFolder);

        try {
            performStart();
        } catch (CoreException ce) {
            HibernateConsolePlugin.getDefault().showError(getShell(),
                    HibernateConsoleMessages.AddConfigurationAction_problem_add_console_config, ce);
        }
        try {
            initialize(currentLaunchConfig, selection);
        } catch (CoreException ce) {
            HibernateConsolePlugin.getDefault().logErrorMessage(
                    HibernateConsoleMessages.ConsoleConfigurationWizardPage_problem_while_initializing_cc, ce);
        }
        performInit();

        ModifyListener modifyListener = new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                dialogChanged();
            }
        };
        nameWidget.addModifyListener(modifyListener);

        setActiveTab(0);
        sc.setMinSize(tabFolder.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        setControl(sc);
        dialogChanged();
        parent.layout(true, false);
    }

    protected void initTabs(CTabFolder folder) {

        tabGroup = new ConsoleConfigurationTabGroup();
        tabGroup.createTabs(this, null); // TODO: set the proper mode here
        ILaunchConfigurationTab[] tabs = tabGroup.getTabs();
        for (int i = 0; i < tabs.length; i++) {
            tabs[i].setLaunchConfigurationDialog(this);
        }
        for (int i = 0; i < tabs.length; i++) {
            CTabItem item = new CTabItem(folder, SWT.BORDER);
            item.setText(tabs[i].getName());
            item.setImage(tabs[i].getImage());
            tabs[i].createControl(item.getParent());
            Control control = tabs[i].getControl();
            if (control != null) {
                item.setControl(control);
            }
        }
    }

    public void performStart() throws CoreException {
        currentLaunchConfig = AddConfigurationAction.createTemporaryLaunchConfiguration().getWorkingCopy();
    }

    public void performCancel() throws CoreException {
        AddConfigurationAction.deleteTemporaryLaunchConfigurations();
    }

    public void performFinish() throws CoreException {
        currentLaunchConfig.rename(nameWidget.getText().trim());
        currentLaunchConfig.doSave();
        AddConfigurationAction.makeTemporaryLaunchConfigurationsPermanent();
    }

    public void performInit() {
        initializingTabs = true;
        nameWidget.setText(currentLaunchConfig.getName());
        tabGroup.initializeFrom(currentLaunchConfig);
        initializingTabs = false;
    }

    /**
     * Ensures that both text fields are set.
     */
    protected void dialogChanged() {
        if (initializingTabs) {
            return;
        }
        String messageWarning = null;
        String messageError = null;
        if (tabGroup == null || currentLaunchConfig == null) {
            setMessage(messageWarning);
            updateStatus(messageError);
            return;
        }
        String name = getConfigurationName();
        if (name != null) {
            name = name.trim();
        }
        messageError = LaunchHelper.verifyConfigurationName(name);
        if (messageError != null) {
            setMessage(messageWarning);
            updateStatus(messageError);
            return;
        }

        tabGroup.performApply(currentLaunchConfig);

        ILaunchConfigurationTab[] tabs = tabGroup.getTabs();
        for (int i = 0; i < tabs.length; i++) {
            if (tabs[i].isValid(currentLaunchConfig)) {
                if (messageWarning == null) {
                    messageWarning = tabs[i].getMessage();
                }
            } else {
                if (messageError == null) {
                    messageError = tabs[i].getErrorMessage();
                }
            }
        }
        setMessage(messageWarning);
        updateStatus(messageError);
    }

    /**
     * Notification that a tab has been selected
     * 
     * Disallow tab changing when the current tab is invalid. Update the config
     * from the tab being left, and refresh the tab being entered.
     */
    protected void handleTabSelected() {
        if (tabGroup == null)
            return;
        ILaunchConfigurationTab[] tabs = tabGroup.getTabs();
        if (currentTabIndex == tabFolder.getSelectionIndex() || tabs == null || tabs.length == 0
                || currentTabIndex > (tabs.length - 1)) {
            return;
        }
        if (currentTabIndex != -1) {
            ILaunchConfigurationTab tab = tabs[currentTabIndex];
            if (currentLaunchConfig != null) {
                tab.deactivated(currentLaunchConfig);
                getActiveTab().activated(currentLaunchConfig);
            }
        }
        currentTabIndex = tabFolder.getSelectionIndex();
    }

    public void setActiveTab(int index) {
        if (tabGroup == null)
            return;
        ILaunchConfigurationTab[] tabs = tabGroup.getTabs();
        if (tabs != null && index >= 0 && index < tabs.length) {
            tabFolder.setSelection(index);
            handleTabSelected();
            dialogChanged();
        }
    }

    /**
     * Returns the currently active <code>ILaunchConfigurationTab</code> being
     * displayed, or <code>null</code> if there is none.
     * 
     * @return currently active <code>ILaunchConfigurationTab</code>, or
     *         <code>null</code>.
     */
    public ILaunchConfigurationTab getActiveTab() {
        if (tabGroup == null)
            return null;
        ILaunchConfigurationTab[] tabs = tabGroup.getTabs();
        if (tabFolder != null && tabs != null) {
            int pageIndex = tabFolder.getSelectionIndex();
            if (pageIndex >= 0) {
                return tabs[pageIndex];
            }
        }
        return null;
    }

    private String getConfigurationName() {
        return nameWidget.getText();
    }

    private void updateStatus(String message) {
        setErrorMessage(message);
        setPageComplete(message == null);
    }

    public String generateName(String name) {
        // empty ILaunchConfigurationDialog method stub
        return null;
    }

    public String getMode() {
        // empty ILaunchConfigurationDialog method stub
        return null;
    }

    public ILaunchConfigurationTab[] getTabs() {
        if (tabGroup == null) {
            return null;
        } else {
            return tabGroup.getTabs();
        }
    }

    public void setActiveTab(ILaunchConfigurationTab tab) {
        // empty ILaunchConfigurationDialog method stub
    }

    public void setName(String name) {
        nameWidget.setText(name);
    }

    public void updateButtons() {
        // empty ILaunchConfigurationDialog method stub
    }

    public void updateMessage() {
        dialogChanged();
    }

    public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable)
            throws InvocationTargetException, InterruptedException {
        // empty ILaunchConfigurationDialog method stub
    }

    static protected String nonEmptyTrimOrNull(Text t) {
        return nonEmptyTrimOrNull(t.getText());
    }

    static String nonEmptyTrimOrNull(String str) {
        if (StringHelper.isEmpty(str)) {
            return null;
        } else {
            return str.trim();
        }
    }

    /////
    // auxiliary functions to setup config parameters
    // BEGIN
    static protected void setPathAttribute(ILaunchConfigurationWorkingCopy currentLaunchConfig, String attr,
            IPath path) {
        if (path != null) {
            currentLaunchConfig.setAttribute(attr, nonEmptyTrimOrNull(path.toOSString()));
        } else {
            currentLaunchConfig.setAttribute(attr, (String) null);
        }
    }

    static protected void setProjAttribute(ILaunchConfigurationWorkingCopy currentLaunchConfig, String attr,
            IJavaProject proj) {
        if (proj != null) {
            currentLaunchConfig.setAttribute(attr, nonEmptyTrimOrNull(proj.getElementName()));
            currentLaunchConfig.setAttribute(LaunchConfiguration.ATTR_MAPPED_RESOURCE_PATHS, Collections
                    .singletonList(new Path(nonEmptyTrimOrNull(proj.getElementName())).makeAbsolute().toString()));
            currentLaunchConfig.setAttribute(LaunchConfiguration.ATTR_MAPPED_RESOURCE_TYPES,
                    Collections.singletonList(Integer.toString(IResource.PROJECT)));
        } else {
            currentLaunchConfig.setAttribute(attr, (String) null);
            currentLaunchConfig.removeAttribute(LaunchConfiguration.ATTR_MAPPED_RESOURCE_PATHS);
            currentLaunchConfig.removeAttribute(LaunchConfiguration.ATTR_MAPPED_RESOURCE_TYPES);
        }
    }

    static protected void setStrAttribute(ILaunchConfigurationWorkingCopy currentLaunchConfig, String attr,
            String str) {
        if (str != null) {
            currentLaunchConfig.setAttribute(attr, nonEmptyTrimOrNull(str));
        } else {
            currentLaunchConfig.setAttribute(attr, (String) null);
        }
    }
    // END
    /////

    /**
     * Init launch config parameters from proper selection
     * 
     * @param currentSelection
     */
    static public void initialize(ILaunchConfigurationWorkingCopy launchConfig, ISelection currentSelection)
            throws CoreException {
        BestGuessConsoleConfigurationVisitor v = new BestGuessConsoleConfigurationVisitor();
        // use selection to build configuration from it...
        if (currentSelection != null && currentSelection.isEmpty() == false
                && currentSelection instanceof IStructuredSelection) {
            IStructuredSelection ssel = (IStructuredSelection) currentSelection;
            if (ssel.size() > 1) {
                return;
            }
            Object obj = ssel.getFirstElement();

            IContainer container = null;
            if (obj instanceof IJavaElement) {
                v.setJavaProject(((IJavaElement) obj).getJavaProject());
                if (v.getJavaProject() != null) {
                    container = v.getJavaProject().getProject();
                }
            }
            if (obj instanceof IResource) {
                IResource res = (IResource) obj;
                if (obj instanceof IContainer) {
                    container = (IContainer) res;
                } else {
                    container = res.getParent();
                }
                if (res.getProject() != null) {
                    IJavaProject project = JavaCore.create(res.getProject());
                    if (project.exists()) {
                        v.setJavaProject(project);
                    }
                }
            }
            if (container != null && v.getJavaProject() == null) {
                IProject project = container.getProject();
                v.setJavaProject(JavaCore.create(project));
            }
            if (container != null) {
                container.accept(v, IResource.NONE);
                if (v.getJavaProject() == null) {
                    IProject project = container.getProject();
                    v.setJavaProject(JavaCore.create(project));
                }
                setProjAttribute(launchConfig, IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
                        v.getJavaProject());

                if (v.getJavaProject() != null) {
                    ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager();
                    String uniqName = lm.generateLaunchConfigurationName(v.getJavaProject().getElementName());
                    launchConfig.rename(uniqName);
                }
                setPathAttribute(launchConfig, IConsoleConfigurationLaunchConstants.PROPERTY_FILE,
                        v.getPropertyFile());
                setPathAttribute(launchConfig, IConsoleConfigurationLaunchConstants.CFG_XML_FILE,
                        v.getConfigFile());
                if (v.getPersistencexml() != null) {
                    setStrAttribute(launchConfig, IConsoleConfigurationLaunchConstants.CONFIGURATION_FACTORY,
                            ConfigurationMode.JPA.toString());
                } else {
                    setStrAttribute(launchConfig, IConsoleConfigurationLaunchConstants.CONFIGURATION_FACTORY,
                            ConfigurationMode.CORE.toString());
                }
                if (!v.getMappings().isEmpty() && v.getConfigFile() == null && v.getPersistencexml() == null) {
                    IPath[] mappings = v.getMappings().toArray(new IPath[] {});
                    List<String> l = new ArrayList<String>();
                    for (int i = 0; i < mappings.length; i++) {
                        IPath path = mappings[i];
                        l.add(path.toPortableString());
                    }

                    launchConfig.setAttribute(IConsoleConfigurationLaunchConstants.FILE_MAPPINGS, l);
                } else {
                    launchConfig.setAttribute(IConsoleConfigurationLaunchConstants.FILE_MAPPINGS,
                            (List<String>) null);
                }
                if (!v.getClasspath().isEmpty()) {
                    launchConfig.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, false);
                    IPath[] custClasspath = v.getClasspath().toArray(new IPath[] {});
                    List<String> mementos = new ArrayList<String>(custClasspath.length);
                    for (int i = 0; i < custClasspath.length; i++) {
                        mementos.add(custClasspath[i].toOSString());
                    }
                    launchConfig.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH, mementos);
                } else {
                    launchConfig.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, true);
                    launchConfig.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH,
                            (List<String>) null);
                }
            } else if (obj instanceof EclipseConsoleConfiguration) {
                throw new IllegalStateException("This should never happen!"); //$NON-NLS-1$
            }
        }
    }

    /**
     * Init path to cfg.xml for ConsoleConfigurationMainTab,
     * init all tabs parameters
     * 
     * @param configFullPath full path to cfg.xml file
     */
    public void setConfigurationFilePath(IPath configFullPath) {
        boolean flagFileWillBeCreated = false;
        try {
            IPath path = configFullPath;
            IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
            if (resource == null) {
                flagFileWillBeCreated = true;
            }
            while (resource == null && path != null) {
                path = path.removeLastSegments(1);
                resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
            }
            initialize(currentLaunchConfig, new StructuredSelection(resource));
        } catch (CoreException e) {
            HibernateConsolePlugin.getDefault().logErrorMessage(
                    HibernateConsoleMessages.ConsoleConfigurationWizardPage_problem_while_initializing_cc, e);
        }
        if (flagFileWillBeCreated) {
            setPathAttribute(currentLaunchConfig, IConsoleConfigurationLaunchConstants.CFG_XML_FILE,
                    configFullPath);
            setStrAttribute(currentLaunchConfig, IConsoleConfigurationLaunchConstants.CONFIGURATION_FACTORY,
                    ConfigurationMode.CORE.toString());
            ConsoleConfigurationMainTab ccmt = null;
            ConsoleConfigurationJavaClasspathTab classpathTab = null;
            ILaunchConfigurationTab[] tabs = tabGroup.getTabs();
            for (int i = 0; i < tabs.length; i++) {
                if (tabs[i] instanceof ConsoleConfigurationMainTab) {
                    ccmt = (ConsoleConfigurationMainTab) tabs[i];
                }
                if (tabs[i] instanceof ConsoleConfigurationJavaClasspathTab) {
                    classpathTab = (ConsoleConfigurationJavaClasspathTab) tabs[i];
                }
            }
            if (ccmt != null) {
                ccmt.markConfigurationFileWillBeCreated();
            }
            if (classpathTab != null) {
                classpathTab.markConfigurationFileWillBeCreated();
            }
        }
        performInit();
        dialogChanged();
    }

    @Override
    public void setPreviousPage(IWizardPage page) {
        if (page != null) {
            if (firstShow && page instanceof NewConfigurationWizardPage) {
                NewConfigurationWizardPage newCfgFile = (NewConfigurationWizardPage) page;
                String cpName = newCfgFile.getConnectionProfileName();
                if (cpName != null) {
                    for (ILaunchConfigurationTab tab : tabGroup.getTabs()) {
                        if (tab instanceof ConsoleConfigurationMainTab) {
                            ConsoleConfigurationMainTab main = (ConsoleConfigurationMainTab) tab;
                            main.selectConnectionProfile(cpName);
                        }
                    }
                }
            }
            firstShow = false;
        }
        super.setPreviousPage(page);
    }

}