view com.redhat.thermostat.tools.eclipse.plugin/src/com/redhat/thermostat/tools/eclipse/plugin/wizards/PluginXmlProjectSelectionPage.java @ 135:eef52fe80553

Make wizard page names describe functionality Make it easier to share wizard pages between wizards by making names reflect purpose rather than which wizard is using them.
author Omair Majid <omajid@redhat.com>
date Tue, 03 Jun 2014 17:32:08 -0400
parents 1c4f192bf2e2
children 31d0ab4467ad
line wrap: on
line source

package com.redhat.thermostat.tools.eclipse.plugin.wizards;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.fieldassist.ContentProposalAdapter;
import org.eclipse.jface.fieldassist.SimpleContentProposalProvider;
import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;

import com.redhat.thermostat.tools.eclipse.plugin.Messages;

public class PluginXmlProjectSelectionPage extends WizardPage {

    static final String PAGE_NAME = "selectProjectForPluginXml"; //$NON-NLS-1$

    private Text containerText;

    private ISelection selection;

    public PluginXmlProjectSelectionPage(ISelection selection) {
        super(PAGE_NAME);
        setTitle(Messages.PluginXmlProjectSelectionPage_title);
        setDescription(Messages.PluginXmlProjectSelectionPage_description);
        this.selection = selection;
    }

    public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);
        GridLayout layout = new GridLayout();
        container.setLayout(layout);
        layout.numColumns = 3;
        layout.verticalSpacing = 9;
        Label label = new Label(container, SWT.NULL);
        label.setText(Messages.PluginXmlProjectSelectionPage_projectNameLabel);

        containerText = new Text(container, SWT.BORDER | SWT.SINGLE);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        containerText.setLayoutData(gd);
        containerText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                dialogChanged();
            }
        });

        String[] proposals = getOpenProjectNames().toArray(new String[0]);
        SimpleContentProposalProvider projectProposalProvider = new SimpleContentProposalProvider(proposals);
        TextContentAdapter contentAdapter = new TextContentAdapter();
        ContentProposalAdapter proposalAdapter = new ContentProposalAdapter(containerText, contentAdapter, projectProposalProvider, null, null);
        proposalAdapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);

        Button button = new Button(container, SWT.PUSH);
        button.setText(Messages.PluginXmlProjectSelectionPage_browse);
        button.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                handleBrowse();
            }
        });
        initialize();
        dialogChanged();

        setControl(container);
    }

    private void initialize() {
        if (selection != null && selection.isEmpty() == false
                && selection instanceof IStructuredSelection) {
            IStructuredSelection ssel = (IStructuredSelection) selection;
            if (ssel.size() > 1)
                return;
            Object obj = ssel.getFirstElement();

            if (obj instanceof IAdaptable) {
                IProject container = (IProject)((IAdaptable)obj).getAdapter(IProject.class);

                containerText.setText(container.getName().toString());
            }
        }
    }

    private void handleBrowse() {
        ContainerSelectionDialog dialog = new ContainerSelectionDialog(
                getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
                Messages.PluginXmlProjectSelectionPage_selectFileContainer);
        if (dialog.open() == ContainerSelectionDialog.OK) {
            Object[] result = dialog.getResult();
            if (result.length == 1) {
                containerText.setText(((Path) result[0]).toString());
            }
        }
    }

    private void dialogChanged() {
        String containerName = getContainerName();

        if (containerName.length() == 0) {
            updateStatus(Messages.PluginXmlProjectSelectionPage_fileContainerMustBeSpecified);
            return;
        }

        IResource container = ResourcesPlugin.getWorkspace().getRoot()
                .findMember(new Path(containerName));

        if (container == null
                || (container.getType() & (IResource.PROJECT | IResource.FOLDER)) == 0) {
            updateStatus(Messages.PluginXmlProjectSelectionPage_fileContainerMustExist);
            return;
        }
        if (!container.isAccessible()) {
            updateStatus(Messages.PluginXmlProjectSelectionPage_projectMustBeWritable);
            return;
        }
        updateStatus(null);
    }

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

    public String getContainerName() {
        return containerText.getText();
    }

    private List<String> getOpenProjectNames() {
        List<String> result = new ArrayList<>();

        IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
        for (IProject project : projects) {
           if (project.isOpen()) {
               result.add(project.getName());
           }
        }

        return result;
    }
}