com.technophobia.substeps.junit.launcher.tab.component.ProjectComponent.java Source code

Java tutorial

Introduction

Here is the source code for com.technophobia.substeps.junit.launcher.tab.component.ProjectComponent.java

Source

/*******************************************************************************
 * Copyright Technophobia Ltd 2012
 * 
 * This file is part of the Substeps Eclipse Plugin.
 * 
 * The Substeps Eclipse Plugin is free software: you can redistribute it and/or modify
 * it under the terms of the Eclipse Public License v1.0.
 * 
 * The Substeps Eclipse Plugin is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Eclipse Public License for more details.
 * 
 * You should have received a copy of the Eclipse Public License
 * along with the Substeps Eclipse Plugin.  If not, see <http://www.eclipse.org/legal/epl-v10.html>.
 ******************************************************************************/
package com.technophobia.substeps.junit.launcher.tab.component;

import java.text.MessageFormat;
import java.util.Collection;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.window.Window;
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.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.ElementListSelectionDialog;

import com.technophobia.eclipse.transformer.Callback;
import com.technophobia.substeps.FeatureRunnerPlugin;
import com.technophobia.substeps.junit.launcher.model.SubstepsLaunchModel;
import com.technophobia.substeps.junit.ui.SubstepsFeatureMessages;
import com.technophobia.substeps.supplier.Supplier;

public class ProjectComponent extends AbstractTabComponent implements Supplier<IProject> {

    private Text projectText = null;

    public ProjectComponent(final Callback onChangeCallback) {
        super(onChangeCallback, null);
    }

    @Override
    public void initializeFrom(final SubstepsLaunchModel model) {
        projectText.setText(model.getProjectName());
    }

    @Override
    public void saveTo(final SubstepsLaunchModel model) {
        if (projectText != null) {
            model.setProjectName(projectText.getText().trim());
        }
    }

    @Override
    public void setDefaultOn(final SubstepsLaunchModel model, final IResource currentResource) {
        final IProject project = currentResource.getProject();
        model.setProjectName(project.getName());
    }

    @Override
    public void validate(final Collection<String> errorMessageList) {
        final String projectName = projectText.getText().trim();
        if (projectName.length() == 0) {
            errorMessageList.add(SubstepsFeatureMessages.SubstepsLaunchConfigurationTab_error_projectnotdefined);
        }

        final IStatus status = ResourcesPlugin.getWorkspace().validatePath(IPath.SEPARATOR + projectName,
                IResource.PROJECT);
        if (!status.isOK() || !Path.ROOT.isValidSegment(projectName)) {
            errorMessageList.add(MessageFormat.format(
                    SubstepsFeatureMessages.SubstepsLaunchConfigurationTab_error_invalidProjectName, projectName));
            return;
        }

        final IProject project = getWorkspaceRoot().getProject(projectName);
        if (!project.exists()) {
            errorMessageList.add(SubstepsFeatureMessages.SubstepsLaunchConfigurationTab_error_projectnotexists);
            return;
        }

        try {
            if (!project.hasNature(JavaCore.NATURE_ID)) {
                errorMessageList.add(SubstepsFeatureMessages.SubstepsLaunchConfigurationTab_error_notJavaProject);
                return;
            }
        } catch (final CoreException e) {
            FeatureRunnerPlugin.log(e);
        }
    }

    @Override
    public void create(final Composite comp) {
        final Label projectLabel = new Label(comp, SWT.NONE);
        projectLabel.setText(SubstepsFeatureMessages.SubstepsLaunchConfigurationTab_label_project_location);
        GridData gd = new GridData();
        gd.horizontalIndent = 25;
        gd.verticalIndent = 5;
        projectLabel.setLayoutData(gd);

        projectText = new Text(comp, SWT.SINGLE | SWT.BORDER);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.verticalIndent = 5;
        projectText.setLayoutData(gd);
        projectText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(final ModifyEvent evt) {
                onChange();
            }
        });

        final Button projectButton = new Button(comp, SWT.PUSH);
        projectButton.setText(SubstepsFeatureMessages.SubstepsLaunchConfigurationTab_browse_project_location);
        projectButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent evt) {
                final String projectName = handleProjectButtonSelected();
                if (projectName != null && !projectName.isEmpty()) {
                    projectText.setText(projectName);
                }
            }
        });
    }

    @Override
    protected boolean isValid() {
        return !projectText.getText().trim().isEmpty();
    }

    @Override
    public void enableControls() {
        projectText.setEnabled(true);
    }

    @Override
    public void disableControls() {
        projectText.setEnabled(false);
    }

    @Override
    public IProject get() {
        return ResourcesPlugin.getWorkspace().getRoot().getProject(projectText.getText().trim());
    }

    /*
     * Show a dialog that lets the user select a folder or substeps file.
     */
    private String handleProjectButtonSelected() {
        final IJavaProject project = chooseJavaProject();
        if (project == null) {
            return "";
        }

        return project.getElementName();
    }

    /*
     * Realize a Java Project selection dialog and return the first selected
     * project, or null if there was none.
     */
    private IJavaProject chooseJavaProject() {
        IJavaProject[] projects;
        try {
            projects = JavaCore.create(getWorkspaceRoot()).getJavaProjects();
        } catch (final JavaModelException e) {
            FeatureRunnerPlugin.log(e);
            projects = new IJavaProject[0];
        }

        final ILabelProvider labelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
        final ElementListSelectionDialog dialog = new ElementListSelectionDialog(projectText.getShell(),
                labelProvider);
        dialog.setTitle(SubstepsFeatureMessages.SubstepsLaunchConfigurationTab_projectdialog_title);
        dialog.setMessage(SubstepsFeatureMessages.SubstepsLaunchConfigurationTab_projectdialog_message);
        dialog.setElements(projects);

        final IJavaProject javaProject = getJavaProject();
        if (javaProject != null) {
            dialog.setInitialSelections(new Object[] { javaProject });
        }
        if (dialog.open() == Window.OK) {
            return (IJavaProject) dialog.getFirstResult();
        }
        return null;
    }

    /*
     * Return the IJavaProject corresponding to the project name in the project
     * name text field, or null if the text does not match a project name.
     */
    private IJavaProject getJavaProject() {
        final String projectName = projectText.getText().trim();
        if (projectName.length() < 1) {
            return null;
        }
        return getJavaModel().getJavaProject(projectName);
    }

    /*
     * Convenience method to get access to the java model.
     */
    private IJavaModel getJavaModel() {
        return JavaCore.create(getWorkspaceRoot());
    }
}