com.technophobia.substeps.junit.launcher.tab.SubstepsArgumentTab.java Source code

Java tutorial

Introduction

Here is the source code for com.technophobia.substeps.junit.launcher.tab.SubstepsArgumentTab.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;

import java.util.ArrayList;
import java.util.Collection;

import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

import com.technophobia.eclipse.transformer.Callback;
import com.technophobia.substeps.FeatureEditorPlugin;
import com.technophobia.substeps.junit.launcher.ProjectManagerSuppliedSubstepsLocationFinder;
import com.technophobia.substeps.junit.launcher.model.LaunchModelFactory;
import com.technophobia.substeps.junit.launcher.model.SubstepsLaunchModel;
import com.technophobia.substeps.junit.launcher.model.SubstepsLaunchModelFactory;
import com.technophobia.substeps.junit.launcher.tab.component.FeatureFileComponent;
import com.technophobia.substeps.junit.launcher.tab.component.ProjectComponent;
import com.technophobia.substeps.junit.launcher.tab.component.SubstepsFileComponent;
import com.technophobia.substeps.junit.ui.SubstepsFeatureMessages;
import com.technophobia.substeps.predicate.IsFeatureFolderPredicate;
import com.technophobia.substeps.supplier.Predicate;

public class SubstepsArgumentTab extends AbstractLaunchConfigurationTab {

    private final TabComponent projectComponent;
    private final TabComponent featureFileComponent;
    private final TabComponent substepsComponent;

    private final LaunchModelFactory launchModelFactory;

    public SubstepsArgumentTab() {
        this.launchModelFactory = new SubstepsLaunchModelFactory(
                new ProjectManagerSuppliedSubstepsLocationFinder());

        final Callback onChangeCallback = onChange();
        final ProjectComponent pc = new ProjectComponent(onChangeCallback);
        final Predicate<IFolder> isFeatureFolderPredicate = new IsFeatureFolderPredicate(
                FeatureEditorPlugin.instance().projectManager());

        this.projectComponent = pc;
        this.featureFileComponent = new FeatureFileComponent(onChangeCallback, pc, isFeatureFolderPredicate);
        this.substepsComponent = new SubstepsFileComponent(onChangeCallback, pc);

        projectComponent.addDependentTabComponent(featureFileComponent);
        projectComponent.addDependentTabComponent(substepsComponent);
    }

    @Override
    public void createControl(final Composite parent) {
        final Composite comp = new Composite(parent, SWT.NONE);
        setControl(comp);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), getHelpContextId());
        final GridLayout layout = new GridLayout();
        layout.numColumns = 3;
        comp.setLayout(layout);
        comp.setFont(parent.getFont());

        projectComponent.create(comp);
        featureFileComponent.create(comp);
        substepsComponent.create(comp);
    }

    @Override
    public void initializeFrom(final ILaunchConfiguration config) {
        final SubstepsLaunchModel model = (SubstepsLaunchModel) launchModelFactory.createFrom(config);
        projectComponent.initializeFrom(model);
        featureFileComponent.initializeFrom(model);
        substepsComponent.initializeFrom(model);

        validatePage();
    }

    @Override
    public String getName() {
        return SubstepsFeatureMessages.SubstepsLaunchConfigurationTab_tab_label;
    }

    @Override
    public void performApply(final ILaunchConfigurationWorkingCopy config) {
        final SubstepsLaunchModel launchModel = new SubstepsLaunchModel();
        projectComponent.saveTo(launchModel);
        featureFileComponent.saveTo(launchModel);
        substepsComponent.saveTo(launchModel);

        launchModel.saveTo(config);
    }

    @Override
    public void setDefaults(final ILaunchConfigurationWorkingCopy configuration) {
        final IResource currentResource = getContext();

        final SubstepsLaunchModel launchModel = new SubstepsLaunchModel();

        if (currentResource != null) {
            configuration.rename(currentResource.getName());
            projectComponent.setDefaultOn(launchModel, currentResource);
            featureFileComponent.setDefaultOn(launchModel, currentResource);
            substepsComponent.setDefaultOn(launchModel, currentResource);
        }
        launchModel.saveTo(configuration);
    }

    private Callback onChange() {
        return new Callback() {

            @Override
            public void callback() {
                final boolean result = validatePage();
                if (result) {
                    updateLaunchConfigurationDialog();
                }
            }
        };
    }

    private boolean validatePage() {

        setErrorMessage(null);
        setMessage(null);

        final Collection<String> errorMessages = new ArrayList<String>();
        projectComponent.validate(errorMessages);
        if (errorMessages.isEmpty()) {
            featureFileComponent.validate(errorMessages);
            substepsComponent.validate(errorMessages);
        }

        if (!errorMessages.isEmpty()) {
            setErrorMessage(errorMessages.iterator().next());
            return false;
        }
        return true;
    }

    /*
     * Returns the current resource element context from which to initialize
     * default settings, or <code>null</code> if none.
     * 
     * @return resource context.
     */
    private IResource getContext() {
        final IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
        if (activeWorkbenchWindow == null) {
            return null;
        }
        final IWorkbenchPage page = activeWorkbenchWindow.getActivePage();
        if (page != null) {
            final ISelection selection = page.getSelection();
            if (selection instanceof IStructuredSelection) {
                final IStructuredSelection ss = (IStructuredSelection) selection;
                if (!ss.isEmpty()) {
                    final Object obj = ss.getFirstElement();

                    if (obj instanceof IResource) {
                        return (IResource) obj;
                    }
                }
            }
            final IEditorPart part = page.getActiveEditor();
            if (part != null) {
                final IEditorInput input = part.getEditorInput();
                return (IResource) input.getAdapter(IResource.class);
            }
        }
        return null;
    }

}