view com.redhat.thermostat.tools.eclipse.plugin/src/com/redhat/thermostat/tools/eclipse/plugin/wizards/ExportPluginPage.java @ 143:5c3c720c875e

Move duplicate project code into shared class
author Omair Majid <omajid@redhat.com>
date Thu, 05 Jun 2014 17:50:39 -0400
parents 31d0ab4467ad
children
line wrap: on
line source

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

import java.io.File;
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.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.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.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

import com.redhat.thermostat.tools.eclipse.plugin.ProjectFinder;
import com.redhat.thermostat.tools.eclipse.plugin.ProjectFinder.Criteria;
import com.redhat.thermostat.tools.eclipse.plugin.ProjectPreferences;
import com.redhat.thermostat.tools.eclipse.plugin.ProjectUtils;
import com.redhat.thermostat.tools.eclipse.plugin.SelectionUtils;

public class ExportPluginPage extends WizardPage {

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

    private IProject project;

    private Text projectNameText;
    private Text installationLocationText;


    private ISelection selection;

    public ExportPluginPage(ISelection selection) {
        super(PAGE_NAME);
        setTitle("Export Plugin");
        setDescription("Export a plugin to a Thermostat installation");
        this.selection = selection;
    }

    public void createControl(Composite parent) {
        GridData gd;

        Composite container = new Composite(parent, SWT.NULL);
        GridLayout layout = new GridLayout(3, false);
        container.setLayout(layout);

        Label projectName = new Label(container, SWT.NONE);
        projectName.setText("Project Name");

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

        Label targetDirectory = new Label(container, SWT.NONE);
        targetDirectory.setText("Installation Location");

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

        Button browse = new Button(container, SWT.PUSH);
        browse.setText("Browse");
        browse.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                handleBrowse();
            }
        });

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

        initialize();
        dialogChanged();

        setControl(container);
    }

    private void initialize() {
        IProject project = SelectionUtils.getSelectedProject(selection);
        if (project != null) {
            ProjectPreferences prefs = new ProjectPreferences(project);
            if (Boolean.valueOf(prefs.get(ProjectPreferences.PLUGIN_PROJECT))) {
                this.project = project;
                projectNameText.setText(project.getName());
            }
        }
    }

    private void dialogChanged() {
        setErrorMessage(null);
        setPageComplete(isProjectValid() && isTargetLocationValid());
    }

    /** Side-effect: Update error status message */
    private boolean isProjectValid() {
        boolean result = ProjectUtils.isValid(getProjectName());

        if (!result) {
            setErrorMessage("Must select a valid project");
        }

        return result;
    }

    /** Side-effect: Update error status message */
    private boolean isTargetLocationValid() {
        File thermostatHome = new File(installationLocationText.getText());
        if (!thermostatHome.isDirectory()) {
            setErrorMessage("Not a valid thermostat directory");
            return false;
        }

        File pluginDir = new File(thermostatHome, "plugins");
        if (!pluginDir.isDirectory()) {
            setErrorMessage("Not a valid thermostat directory");
            return false;
        }

        String pluginName = projectNameText.getText().replace("-distribution", "");
        File pluginHome = new File(pluginDir, pluginName);
        if (pluginHome.isDirectory()) {
            setErrorMessage("Directory " + pluginHome + " already exists.");
            return false;
        }

        return true;
    }

    private void handleBrowse() {
        DirectoryDialog dialog = new DirectoryDialog(getShell());
        String selectedDir = dialog.open();
        if (selectedDir != null) {
            installationLocationText.setText(selectedDir);
        }
    }

    public IProject getProject() {
        return this.project;
    }

    public String getProjectName() {
        return this.project.getName();
    }

    public String getInstallationLocation() {
        return installationLocationText.getText();
    }

    private List<String> getProjectNamesForExporting() {
        ProjectFinder finder = new ProjectFinder();
        return finder.findProjectNames(new ValidPluginProjectMatcher());
    }

    private static class ValidPluginProjectMatcher implements Criteria {
        @Override
        public boolean matches(IProject project) {
            if (!project.isOpen()) {
                return false;
            }

            ProjectPreferences prefs = new ProjectPreferences(project);
            return Boolean.valueOf(prefs.get(ProjectPreferences.PLUGIN_PROJECT));
        }
    }


}