com.iw.plugins.spindle.ui.wizards.project.BaseTemplateSelectionPage.java Source code

Java tutorial

Introduction

Here is the source code for com.iw.plugins.spindle.ui.wizards.project.BaseTemplateSelectionPage.java

Source

/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (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.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is Spindle, an Eclipse Plugin for Tapestry.
 *
 * The Initial Developer of the Original Code is
 * Geoffrey Longman.
 * Portions created by the Initial Developer are Copyright (C) 2004
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 * 
 *  glongman@gmail.com
 *
 * ***** END LICENSE BLOCK ***** */
package com.iw.plugins.spindle.ui.wizards.project;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.templates.Template;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
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.eclipse.swt.widgets.Label;

import com.iw.plugins.spindle.PreferenceConstants;
import com.iw.plugins.spindle.UIPlugin;
import com.iw.plugins.spindle.core.ProjectPreferenceStore;
import com.iw.plugins.spindle.core.util.SpindleMultiStatus;
import com.iw.plugins.spindle.core.util.SpindleStatus;
import com.iw.plugins.spindle.editors.assist.usertemplates.XMLFileContextType;
import com.iw.plugins.spindle.ui.preferences.WizardTemplatesPreferencePage;
import com.iw.plugins.spindle.ui.util.UIUtils;
import com.iw.plugins.spindle.ui.widgets.PreferenceTemplateSelector;
import com.iw.plugins.spindle.ui.wizards.TapestryWizardPage;
import com.iw.plugins.spindle.ui.wizards.factories.IFactoryTemplateSource;
import com.iw.plugins.spindle.ui.wizards.factories.PageFactory;
import com.iw.plugins.spindle.ui.wizards.factories.TapestryTemplateFactory;
import com.iw.plugins.spindle.ui.wizards.factories.TemplateFactory;

/**
 * TemplateSelectionPage - users can pick and chose what code templates are used
 * by the wizard.
 * 
 * @author glongman@gmail.com
 *  
 */
public class BaseTemplateSelectionPage extends TapestryWizardPage implements IFactoryTemplateSource {

    class Listener implements ISelectionChangedListener, IPropertyChangeListener {

        boolean run = true;

        public void start() {
            run = true;
        }

        public void stop() {
            run = false;
        }

        public void selectionChanged(SelectionChangedEvent event) {
            if (run)
                validate();
        }

        public void propertyChange(PropertyChangeEvent event) {
            if (run)
                if ((UIPlugin.PLUGIN_ID + ".customtemplates").equals(event.getProperty()))
                    validate();
        }
    }

    private Button fUseWorkspaceDefaultTemplates;
    private PreferenceTemplateSelector fLibraryTemplateSelector;
    private PreferenceTemplateSelector fComponentTemplateSelector;
    private PreferenceTemplateSelector fPageTemplateSelector;
    private PreferenceTemplateSelector fTapestryTemplateSelector;

    private ProjectPreferenceStore fProjectPreferences;

    private Group fProjectTemplateGroup;
    private Listener fListener;

    String PAGE_NAME;

    public BaseTemplateSelectionPage(String name) {
        super(name);

        PAGE_NAME = name;
        //    this.setImageDescriptor(ImageDescriptor.createFromURL(Images.getImageURL(UIPlugin
        //        .getString(PAGE_NAME + ".image"))));
        //    this.setDescription(UIPlugin.getString(PAGE_NAME + ".description"));
        this.setDescription("Project file generation templates");

        fProjectPreferences = ProjectPreferenceStore.createEmptyStore(UIPlugin.getDefault().getPreferenceStore());

        fLibraryTemplateSelector = new PreferenceTemplateSelector(XMLFileContextType.LIBRARY_FILE_CONTEXT_TYPE,
                PreferenceConstants.LIB_TEMPLATE, fProjectPreferences);

        fComponentTemplateSelector = new PreferenceTemplateSelector(XMLFileContextType.COMPONENT_FILE_CONTEXT_TYPE,
                PreferenceConstants.COMPONENT_TEMPLATE, fProjectPreferences);

        fPageTemplateSelector = new PreferenceTemplateSelector(XMLFileContextType.PAGE_FILE_CONTEXT_TYPE,
                PreferenceConstants.PAGE_TEMPLATE, fProjectPreferences);

        fTapestryTemplateSelector = new PreferenceTemplateSelector(XMLFileContextType.TEMPLATE_FILE_CONTEXT_TYPE,
                PreferenceConstants.TAP_TEMPLATE_TEMPLATE, fProjectPreferences);

        fListener = new Listener();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
     */
    public void createControl(Composite parent) {
        setPageComplete(true);

        Font font = parent.getFont();
        Composite composite = new Composite(parent, SWT.NULL);
        composite.setFont(font);
        composite.setLayout(new GridLayout());
        composite.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_BEGINNING));

        fUseWorkspaceDefaultTemplates = new Button(composite, SWT.CHECK);
        fUseWorkspaceDefaultTemplates.setFont(font);
        fUseWorkspaceDefaultTemplates.setText("U&se workspace default templates.");
        fUseWorkspaceDefaultTemplates.addSelectionListener(new SelectionListener() {

            public void widgetSelected(SelectionEvent e) {
                updateEnabled(!((Button) e.widget).getSelection());
                validate();
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                // do nothing
            }
        });

        fUseWorkspaceDefaultTemplates.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));

        Label spacer = new Label(parent, SWT.NULL);
        spacer.setText(" ");
        spacer.setFont(font);
        spacer.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));

        Button button = new Button(composite, SWT.NULL);
        button.setText("Configure workspace defaults");
        button.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
        button.addSelectionListener(new SelectionListener() {
            public void widgetSelected(SelectionEvent e) {
                showWorkspaceDefaultPreferencePage();
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                //ignore
            }
        });

        spacer = new Label(parent, SWT.NULL);
        spacer.setText(" ");
        spacer.setFont(font);
        spacer.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));

        createComboGroup(composite);
        setErrorMessage(null);
        setMessage(null);
        setControl(composite);

        fUseWorkspaceDefaultTemplates.setSelection(true);
        updateEnabled(false);

        fLibraryTemplateSelector.load();
        fComponentTemplateSelector.load();
        fPageTemplateSelector.load();
        fTapestryTemplateSelector.load();

        UIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(fListener);

        validate();
    }

    /**
     *  
     */
    protected void showWorkspaceDefaultPreferencePage() {
        UIUtils.showPreferencePage(getShell(), "SpindleWizardTemplatePreferences",
                new WizardTemplatesPreferencePage());
    }

    private void createComboGroup(Composite parent) {
        Font font = parent.getFont();
        fProjectTemplateGroup = new Group(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        int columnCount = 3;
        layout.numColumns = columnCount;
        fProjectTemplateGroup.setLayout(layout);
        fProjectTemplateGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fProjectTemplateGroup.setFont(font);
        fProjectTemplateGroup.setText("Setup project default templates:");

        fLibraryTemplateSelector.createControl(fProjectTemplateGroup, columnCount);
        fLibraryTemplateSelector.addSelectionChangedListener(fListener);

        fComponentTemplateSelector.createControl(fProjectTemplateGroup, columnCount);
        fComponentTemplateSelector.addSelectionChangedListener(fListener);

        fPageTemplateSelector.createControl(fProjectTemplateGroup, columnCount);
        fPageTemplateSelector.addSelectionChangedListener(fListener);

        fTapestryTemplateSelector.createControl(fProjectTemplateGroup, columnCount);
        fTapestryTemplateSelector.addSelectionChangedListener(fListener);

    }

    private void updateEnabled(boolean flag) {

        fProjectTemplateGroup.setEnabled(flag);
        Control[] children = fProjectTemplateGroup.getChildren();
        for (int i = 0; i < children.length; i++) {
            children[i].setEnabled(flag);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.IDialogPage#dispose()
     */
    public void dispose() {
        super.dispose();
        fLibraryTemplateSelector.dispose();
        fComponentTemplateSelector.dispose();
        fPageTemplateSelector.dispose();
        fTapestryTemplateSelector.dispose();
        UIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(fListener);
    }

    public IResource getResource() {
        return null;
    }

    public IRunnableWithProgress getRunnable(Object object) {

        if (fUseWorkspaceDefaultTemplates.getSelection()) {
            fListener.stop();
            fLibraryTemplateSelector.loadDefault();
            fComponentTemplateSelector.loadDefault();
            fPageTemplateSelector.loadDefault();
            fTapestryTemplateSelector.loadDefault();
        }

        IProject project = null;
        if (object instanceof IProject) {
            project = (IProject) object;
        } else if (object instanceof IJavaProject) {
            project = ((IJavaProject) object).getProject();
        }

        if (project != null) {
            final IProject useProject = project;
            final ProjectPreferenceStore dirtyStore = fProjectPreferences;
            return new IRunnableWithProgress() {
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    try {
                        IFile dataFile = useProject.getFile(UIPlugin.SPINDLEUI_PREFS_FILE);

                        String fullname;
                        if (dataFile.exists()) {
                            fullname = dataFile.getLocation().toOSString();
                        } else {
                            fullname = useProject.getLocation().toOSString() + File.separator
                                    + UIPlugin.SPINDLEUI_PREFS_FILE;
                        }

                        dirtyStore.setFilename(fullname);
                        dirtyStore.save();

                    } catch (Exception e) {
                        UIPlugin.log(e);
                        throw new InvocationTargetException(e);
                    }
                }
            };
        }
        return null;
    }

    public Template getTemplate(String templateContextId) {
        if (fUseWorkspaceDefaultTemplates.getSelection()) {
            String name = UIPlugin.getDefault().getPreferenceStore().getString(templateContextId);
            List templates = TemplateFactory.getAllTemplates(templateContextId);
            for (Iterator iter = templates.iterator(); iter.hasNext();) {
                Template element = (Template) iter.next();
                if (element.getName().equals(name))
                    return element;
            }
            return null;

        } else {
            if (PageFactory.CONTEXT_TYPE.equals(templateContextId))
                return fPageTemplateSelector.getSelectedTemplate();

            if (TapestryTemplateFactory.CONTEXT_TYPE.equals(templateContextId))
                return fTapestryTemplateSelector.getSelectedTemplate();

            return null;
        }
    }

    public Template getTemplate(TemplateFactory factory) {
        return getTemplate(factory.getTemplateContextId());
    }

    private void validate() {

        IStatus resultStatus;

        if (fUseWorkspaceDefaultTemplates.getSelection()) {
            resultStatus = validateWorkspaceSettings();
        } else {
            SpindleMultiStatus status = new SpindleMultiStatus();
            status.addStatus(fComponentTemplateSelector.validate());
            status.addStatus(fPageTemplateSelector.validate());
            status.addStatus(fTapestryTemplateSelector.validate());

            resultStatus = status.getMostSevere(status.getChildren());
        }
        if (resultStatus.getSeverity() != IStatus.OK) {
            if (fUseWorkspaceDefaultTemplates.getSelection()) {
                SpindleStatus newResult = new SpindleStatus();
                newResult.setError(
                        "There are problems with the workspace defaults. Go fix them or choose project defaults instead.");
                resultStatus = newResult;
            }
            updateStatus(resultStatus);
        }
    }

    protected void updateStatus(IStatus status) {
        fCurrStatus = status;

        setPageComplete(fCurrStatus != null && !fCurrStatus.matches(IStatus.ERROR));
        if (fPageVisible) {
            applyToStatusLine(this, fCurrStatus);
        }
    }

    /**
     * check that the workspace setting are valid.
     */
    private IStatus validateWorkspaceSettings() {
        IPreferenceStore store = UIPlugin.getDefault().getPreferenceStore();
        SpindleMultiStatus status = new SpindleMultiStatus();

        status.addStatus(
                XMLFileContextType.validateTemplateName(store, XMLFileContextType.APPLICATION_FILE_CONTEXT_TYPE,
                        store.getString(PreferenceConstants.APP_TEMPLATE)));

        status.addStatus(XMLFileContextType.validateTemplateName(store,
                XMLFileContextType.LIBRARY_FILE_CONTEXT_TYPE, store.getString(PreferenceConstants.LIB_TEMPLATE)));

        status.addStatus(
                XMLFileContextType.validateTemplateName(store, XMLFileContextType.COMPONENT_FILE_CONTEXT_TYPE,
                        store.getString(PreferenceConstants.COMPONENT_TEMPLATE)));

        status.addStatus(XMLFileContextType.validateTemplateName(store, XMLFileContextType.PAGE_FILE_CONTEXT_TYPE,
                store.getString(PreferenceConstants.PAGE_TEMPLATE)));

        status.addStatus(
                XMLFileContextType.validateTemplateName(store, XMLFileContextType.TEMPLATE_FILE_CONTEXT_TYPE,
                        store.getString(PreferenceConstants.TAP_TEMPLATE_TEMPLATE)));

        return status.getMostSevere(status.getChildren());

    }

}