view com.redhat.thermostat.tools.eclipse.plugin/src/com/redhat/thermostat/tools/eclipse/plugin/wizards/PluginXmlProjectSelectionPage.java @ 90:8f2dd0dbdb87

Externalize strings
author Omair Majid <omajid@redhat.com>
date Tue, 21 Jan 2014 19:51:04 -0500
parents b788a26c0d4d
children 1c4f192bf2e2
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.bindings.keys.KeyStroke;
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 {
    private Text containerText;

    private ISelection selection;

    public PluginXmlProjectSelectionPage(ISelection selection) {
        super("wizardPage"); //$NON-NLS-1$
        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;
    }
}