org.jboss.tools.project.examples.wizard.NewProjectExamplesMainPage.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.project.examples.wizard.NewProjectExamplesMainPage.java

Source

/*************************************************************************************
 * Copyright (c) 2008-2011 Red Hat, Inc. and others.
 * All rights reserved. This program and the accompanying materials 
 * are 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
 * 
 * Contributors:
 *     JBoss by Red Hat - Initial implementation.
 ************************************************************************************/
package org.jboss.tools.project.examples.wizard;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.model.AdaptableList;
import org.eclipse.wst.server.core.IRuntimeType;
import org.jboss.tools.project.examples.Messages;
import org.jboss.tools.project.examples.ProjectExamplesActivator;
import org.jboss.tools.project.examples.fixes.WTPRuntimeFix;
import org.jboss.tools.project.examples.model.IImportProjectExample;
import org.jboss.tools.project.examples.model.IProjectExampleSite;
import org.jboss.tools.project.examples.model.ProjectExample;
import org.jboss.tools.project.examples.model.ProjectExampleCategory;
import org.jboss.tools.project.examples.model.ProjectExampleUtil;
import org.jboss.tools.project.examples.model.ProjectFix;
import org.jboss.tools.project.examples.runtimes.RuntimeUtils;

/**
 * @author snjeza
 * 
 */
public class NewProjectExamplesMainPage extends WizardPage {

    //private static final int DEFAULT_HEIGHT = 430;
    private static final int DEFAULT_WIDTH = 600;
    private IStructuredSelection selection;
    private Combo siteCombo;
    private List<ProjectExampleCategory> categories;
    private Text descriptionText;
    private ProjectExample selectedProject;
    private Combo targetRuntimeTypesCombo;

    public NewProjectExamplesMainPage() {
        super("org.jboss.tools.project.examples.main"); //$NON-NLS-1$
        setTitle(Messages.NewProjectExamplesWizardPage_Project_Example);
        setDescription(Messages.NewProjectExamplesWizardPage_Import_Project_Example);
    }

    public void createControl(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout(1, false));
        GridData gd = new GridData(SWT.FILL, SWT.FILL, false, false);
        composite.setLayoutData(gd);

        Composite siteComposite = new Composite(composite, SWT.NONE);
        GridLayout gridLayout = new GridLayout(2, false);
        gridLayout.marginHeight = 0;
        gridLayout.marginWidth = 0;
        siteComposite.setLayout(gridLayout);
        gd = new GridData(SWT.FILL, SWT.BEGINNING, false, false);
        siteComposite.setLayoutData(gd);

        final Button button = new Button(siteComposite, SWT.CHECK);
        gd = new GridData(SWT.FILL, SWT.BEGINNING, false, false);
        gd.horizontalSpan = 2;
        button.setLayoutData(gd);
        button.setText(Messages.ProjectExamplesPreferencePage_Show_experimental_sites);
        final IPreferenceStore store = ProjectExamplesActivator.getDefault().getPreferenceStore();
        button.setSelection(store.getBoolean(ProjectExamplesActivator.SHOW_EXPERIMENTAL_SITES));

        final Button serverButton = new Button(siteComposite, SWT.CHECK);
        gd = new GridData(SWT.FILL, SWT.BEGINNING, false, false);
        gd.horizontalSpan = 2;
        serverButton.setLayoutData(gd);
        serverButton.setText(Messages.ProjectExamplesPreferencePage_Show_runtime_sites);
        serverButton.setSelection(store.getBoolean(ProjectExamplesActivator.SHOW_RUNTIME_SITES));

        new Label(siteComposite, SWT.NONE).setText(Messages.NewProjectExamplesWizardPage_Site);
        siteCombo = new Combo(siteComposite, SWT.READ_ONLY);
        siteCombo.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));

        new Label(siteComposite, SWT.NONE).setText(Messages.NewProjectExamplesMainPage_TargetedRuntime);
        targetRuntimeTypesCombo = new Combo(siteComposite, SWT.READ_ONLY);
        targetRuntimeTypesCombo.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));

        new Label(composite, SWT.NONE).setText(Messages.NewProjectExamplesWizardPage_Projects);

        final ProjectExamplesPatternFilter filter = new ProjectExamplesPatternFilter();

        int styleBits = SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.WRAP;
        final FilteredTree filteredTree = new FilteredTree(composite, styleBits, filter, true);
        filteredTree.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
        final TreeViewer viewer = filteredTree.getViewer();
        Tree tree = viewer.getTree();
        gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        GC gc = new GC(parent);
        gd.heightHint = Dialog.convertHeightInCharsToPixels(gc.getFontMetrics(), 9);
        gc.dispose();
        tree.setLayoutData(gd);
        tree.setFont(parent.getFont());

        viewer.setLabelProvider(new ProjectLabelProvider());
        viewer.setContentProvider(new ProjectContentProvider());

        final SiteFilter siteFilter = new SiteFilter();
        final RuntimeTypeFilter serverFilter = new RuntimeTypeFilter();

        viewer.addFilter(siteFilter);
        viewer.addFilter(serverFilter);

        Label descriptionLabel = new Label(composite, SWT.NONE);
        descriptionLabel.setText(Messages.NewProjectExamplesWizardPage_Description);
        descriptionText = new Text(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.READ_ONLY | SWT.BORDER | SWT.WRAP);
        gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        gc = new GC(parent);
        gd.heightHint = Dialog.convertHeightInCharsToPixels(gc.getFontMetrics(), 6);
        gc.dispose();
        descriptionText.setLayoutData(gd);

        Composite internal = new Composite(composite, SWT.NULL);
        internal.setLayout(new GridLayout(2, false));
        gd = new GridData(GridData.FILL, GridData.FILL, true, false);
        gd.widthHint = DEFAULT_WIDTH;
        internal.setLayoutData(gd);

        Label projectNameLabel = new Label(internal, SWT.NULL);
        projectNameLabel.setText(Messages.NewProjectExamplesWizardPage_Project_name);
        final Text projectName = new Text(internal, SWT.BORDER | SWT.READ_ONLY);
        projectName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Label projectSizeLabel = new Label(internal, SWT.NULL);
        projectSizeLabel.setText(Messages.NewProjectExamplesWizardPage_Project_size);
        final Text projectSize = new Text(internal, SWT.BORDER | SWT.READ_ONLY);
        projectSize.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Label projectURLLabel = new Label(internal, SWT.NULL);
        projectURLLabel.setText(Messages.NewProjectExamplesWizardPage_URL);
        final Text projectURL = new Text(internal, SWT.BORDER | SWT.READ_ONLY);
        projectURL.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        viewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {
                selection = (IStructuredSelection) event.getSelection();
                Object selected = selection.getFirstElement();
                String projectType = null;
                if (selected instanceof ProjectExample && selection.size() == 1) {
                    selectedProject = (ProjectExample) selected;
                    descriptionText.setText(selectedProject.getDescription());
                    projectName.setText(selectedProject.getName());
                    projectURL.setText(selectedProject.getUrl());
                    projectSize.setText(selectedProject.getSizeAsText());
                    //readyPage.setProjectExample(selectedProject);
                    projectType = selectedProject.getImportType();
                } else {
                    selectedProject = null;
                    String description = ""; //$NON-NLS-1$
                    if (selected instanceof ProjectExampleCategory) {
                        ProjectExampleCategory category = (ProjectExampleCategory) selected;
                        if (category.getDescription() != null) {
                            description = category.getDescription();
                        }
                    }
                    descriptionText.setText(description);
                    projectName.setText(""); //$NON-NLS-1$
                    projectURL.setText(""); //$NON-NLS-1$
                    projectSize.setText(""); //$NON-NLS-1$
                }

                for (IWizardPage page : getWizard().getPages()) {
                    if (page instanceof IProjectExamplesWizardPage) {
                        IProjectExamplesWizardPage pewp = (IProjectExamplesWizardPage) page;
                        if (projectType != null && projectType.equals(pewp.getProjectExampleType())) {
                            pewp.setProjectExample(selectedProject);
                        } else {
                            pewp.setProjectExample(null);
                        }
                    }
                }

                boolean canFinish = refresh(false);
                setPageComplete(canFinish);
            }

        });

        siteCombo.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                siteFilter.setSite(siteCombo.getText());
                viewer.refresh();
            }

        });

        button.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                IPreferenceStore store = ProjectExamplesActivator.getDefault().getPreferenceStore();
                store.setValue(ProjectExamplesActivator.SHOW_EXPERIMENTAL_SITES, button.getSelection());

                //Store current combo selections
                String selectedRuntime = targetRuntimeTypesCombo.getText();
                String selectedSite = siteCombo.getText();

                //Rebuild the combo lists
                refresh(viewer, true);

                //Restore the combo selections with initial values if possible
                restoreCombo(targetRuntimeTypesCombo, selectedRuntime);
                restoreCombo(siteCombo, selectedSite);

                siteFilter.setSite(siteCombo.getText());
                viewer.refresh();
            }

        });

        serverButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                IPreferenceStore store = ProjectExamplesActivator.getDefault().getPreferenceStore();
                store.setValue(ProjectExamplesActivator.SHOW_RUNTIME_SITES, serverButton.getSelection());

                //Store current combo selections
                String selectedRuntime = targetRuntimeTypesCombo.getText();
                String selectedSite = siteCombo.getText();

                //Rebuild the combo lists
                refresh(viewer, true);

                //Restore the combo selections with initial values if possible
                restoreCombo(targetRuntimeTypesCombo, selectedRuntime);
                restoreCombo(siteCombo, selectedSite);

                siteFilter.setSite(siteCombo.getText());
                viewer.refresh();
            }

        });

        targetRuntimeTypesCombo.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                serverFilter.setRuntimeType(targetRuntimeTypesCombo.getText());
                viewer.refresh();
            }
        });

        setPageComplete(false);

        setControl(composite);

        refresh(viewer, true);
        siteCombo.setText(ProjectExamplesActivator.ALL_SITES);

        targetRuntimeTypesCombo.setText(ProjectExamplesActivator.ALL_RUNTIMES);

    }

    private void loadRuntimeTypes() {
        if (targetRuntimeTypesCombo == null) {
            return;
        }
        targetRuntimeTypesCombo.removeAll();
        targetRuntimeTypesCombo.add(ProjectExamplesActivator.ALL_RUNTIMES);

        Set<IRuntimeType> installedRuntimeTypes = RuntimeUtils.getInstalledRuntimeTypes();
        List<IRuntimeType> sortedTypes = new ArrayList<IRuntimeType>();

        for (ProjectExampleCategory category : categories) {
            for (ProjectExample project : category.getProjects()) {
                for (IRuntimeType type : WTPRuntimeFix.getTargetedServerRuntimes(project)) {
                    if (!sortedTypes.contains(type)) {
                        //If runtime types have a server instance, display them first
                        if (installedRuntimeTypes.contains(type)) {
                            sortedTypes.add(0, type);
                        } else {
                            sortedTypes.add(type);
                        }
                    }
                }
            }
        }

        for (IRuntimeType type : sortedTypes) {
            targetRuntimeTypesCombo.add(type.getName());
        }
    }

    private void refresh(final TreeViewer viewer, boolean show) {
        AdaptableList input = new AdaptableList(getCategories(show));
        viewer.setInput(input);
        viewer.refresh();
        String[] items = getItems();
        siteCombo.setItems(items);
        loadRuntimeTypes();
    }

    private List<ProjectExampleCategory> getCategories(boolean show) {
        IRunnableWithProgress op = new IRunnableWithProgress() {

            public void run(IProgressMonitor monitor) {
                categories = ProjectExampleUtil.getProjects(monitor);
            }
        };
        try {
            new ProgressMonitorDialog(getShell()).run(true, true, op);
        } catch (Exception e) {
            ProjectExamplesActivator.log(e);
        }
        HashSet<IProjectExampleSite> invalidSites = ProjectExampleUtil.getInvalidSites();
        boolean showInvalidSites = ProjectExamplesActivator.getDefault().getPreferenceStore()
                .getBoolean(ProjectExamplesActivator.SHOW_INVALID_SITES);
        if (invalidSites.size() > 0 && showInvalidSites && show) {
            String message = Messages.NewProjectExamplesWizardPage_Cannot_access_the_following_sites;
            for (IProjectExampleSite site : invalidSites) {
                message = message + site.getName() + "\n"; //$NON-NLS-1$
                ProjectExamplesActivator
                        .log(NLS.bind(Messages.InvalideSite, new Object[] { site.getName(), site.getUrl() }));
            }
            MessageDialogWithToggle dialog = MessageDialogWithToggle.openInformation(getShell(),
                    Messages.NewProjectExamplesWizardPage_Invalid_Sites, message,
                    Messages.NewProjectExamplesWizardPage_Show_this_dialog_next_time, true,
                    ProjectExamplesActivator.getDefault().getPreferenceStore(),
                    ProjectExamplesActivator.SHOW_INVALID_SITES);
            boolean toggleState = dialog.getToggleState();
            ProjectExamplesActivator.getDefault().getPreferenceStore()
                    .setValue(ProjectExamplesActivator.SHOW_INVALID_SITES, toggleState);
        }
        return categories;
    }

    private String[] getItems() {
        //List<Category> categories = getCategories(true);
        Set<String> sites = new TreeSet<String>();
        sites.add(ProjectExamplesActivator.ALL_SITES);
        for (ProjectExampleCategory category : categories) {
            List<ProjectExample> projects = category.getProjects();
            for (ProjectExample project : projects) {
                String name = project.getSite() == null ? ProjectExamplesActivator.ALL_SITES
                        : project.getSite().getName();
                sites.add(name);
            }
        }
        String[] items = sites.toArray(new String[0]);
        return items;
    }

    private class ProjectLabelProvider extends LabelProvider {

        @Override
        public Image getImage(Object element) {
            return super.getImage(element);
        }

        @Override
        public String getText(Object element) {
            if (element instanceof ProjectExampleCategory) {
                ProjectExampleCategory category = (ProjectExampleCategory) element;
                return category.getName();
            }
            if (element instanceof ProjectExample) {
                ProjectExample project = (ProjectExample) element;
                return project.getShortDescription();
            }
            return super.getText(element);
        }
    }

    private class ProjectContentProvider implements ITreeContentProvider {

        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof AdaptableList) {
                Object[] childCollections = ((AdaptableList) parentElement).getChildren();
                //List children = (List) parentElement;
                //return children.toArray();
                return childCollections;
            }
            if (parentElement instanceof ProjectExampleCategory) {
                ProjectExampleCategory category = (ProjectExampleCategory) parentElement;
                return category.getProjects().toArray();
            }
            return new Object[0];
        }

        public Object getParent(Object element) {
            if (element instanceof ProjectExample) {
                return ((ProjectExample) element).getCategory();
            }
            return null;
        }

        public boolean hasChildren(Object element) {
            return element instanceof ProjectExampleCategory;
        }

        public Object[] getElements(Object inputElement) {
            return getChildren(inputElement);
        }

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }

    }

    public IStructuredSelection getSelection() {
        return selection;
    }

    public boolean refresh(boolean force) {
        boolean canFinish = false;

        Iterator iterator = selection.iterator();
        while (iterator.hasNext()) {
            Object object = iterator.next();
            if (object instanceof ProjectExample) {
                // FIXME
                canFinish = true;
                ProjectExample project = (ProjectExample) object;
                String importType = project.getImportType();
                if (!ProjectExample.IMPORT_TYPE_ZIP.equals(importType) && importType != null
                        && importType.length() > 0) {
                    IImportProjectExample importProjectExample = ProjectExamplesActivator.getDefault()
                            .getImportProjectExample(importType);
                    if (importProjectExample == null) {
                        // FIXME
                        canFinish = false;
                        break;
                    } else {
                        //setDefaultNote();
                    }
                }
                if (force || project.getUnsatisfiedFixes() == null) {
                    List<ProjectFix> fixes = project.getFixes();
                    List<ProjectFix> unsatisfiedFixes = new ArrayList<ProjectFix>();
                    project.setUnsatisfiedFixes(unsatisfiedFixes);
                    for (ProjectFix fix : fixes) {
                        if (!ProjectExamplesActivator.canFix(project, fix)) {
                            unsatisfiedFixes.add(fix);
                        }
                    }
                }
                if (project.getUnsatisfiedFixes().size() > 0) {
                    // FIXME
                } else {

                }

            } else {
                canFinish = false;
                break;
            }
        }
        return canFinish;
    }

    public ProjectExample getSelectedProject() {
        return selectedProject;
    }

    private static void restoreCombo(Combo combo, String initialValue) {
        //Look position of initial value
        int selectedIdx = combo.indexOf(initialValue);
        if (selectedIdx < 0) {
            //If initial value not found, reset to first item
            selectedIdx = 0;
        }
        //Reset position of combo to the appropriate item index
        combo.select(selectedIdx);
    }

    @Override
    public IWizardPage getNextPage() {
        IWizard wizard = getWizard();
        if (wizard instanceof NewProjectExamplesWizard2) {
            ProjectExample projectExample = ((NewProjectExamplesWizard2) wizard).getSelectedProjectExample();
            if (projectExample != null && projectExample.getImportType() != null) {
                List<IProjectExamplesWizardPage> pages = ((NewProjectExamplesWizard2) wizard)
                        .getContributedPages("requirement");
                for (IProjectExamplesWizardPage page : pages) {
                    if (projectExample.getImportType().equals(page.getProjectExampleType())) {
                        return page;
                    }
                }
            }
            //return ((NewProjectExamplesWizard2)wizard).getReadyPage();
        }
        return super.getNextPage();
    }
}