com.googlecode.goclipse.ui.launch.GoLaunchConfigurationTab.java Source code

Java tutorial

Introduction

Here is the source code for com.googlecode.goclipse.ui.launch.GoLaunchConfigurationTab.java

Source

/*******************************************************************************
 * Copyright (c) 2014, 2014 Bruno Medeiros and other Contributors.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *       steel - initial API and implementation
 *       Bruno Medeiros - rewrite using lang code
 *******************************************************************************/
package com.googlecode.goclipse.ui.launch;

import java.nio.file.Path;
import java.util.Collection;

import melnorme.lang.ide.launching.LaunchConstants;
import melnorme.lang.ide.ui.launch.LangArgumentsBlock2;
import melnorme.lang.ide.ui.launch.LangWorkingDirectoryBlock;
import melnorme.lang.ide.ui.launch.MainLaunchConfigurationTab;
import melnorme.lang.ide.ui.utils.UIOperationExceptionHandler;
import melnorme.utilbox.misc.ArrayUtil;
import melnorme.utilbox.misc.StringUtil;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.ILaunchConfigurationDialog;
import org.eclipse.debug.ui.WorkingDirectoryBlock;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;

import com.googlecode.goclipse.core.GoProjectEnvironment;
import com.googlecode.goclipse.tooling.GoPackageName;
import com.googlecode.goclipse.tooling.env.GoEnvironment;

public class GoLaunchConfigurationTab extends MainLaunchConfigurationTab {

    public GoLaunchConfigurationTab() {
    }

    @Override
    protected Launch_ProgramPathField createProgramPathField() {
        return new Launch_ProgramPathField() {
            @Override
            protected String getGroupLabel() {
                return "Go main package (path relative to project)";
            }
        };
    }

    protected final LangArgumentsBlock2 argumentsBlock = new LangArgumentsBlock2() {
        @Override
        protected void fieldValueChanged() {
            updateLaunchConfigurationDialog();
        };
    };
    protected final WorkingDirectoryBlock workingDirectoryBlock = new LangWorkingDirectoryBlock();

    @Override
    protected void createCustomControls(Composite parent) {
        super.createCustomControls(parent);

        argumentsBlock.createComponent(parent, new GridData(GridData.FILL_BOTH));
        workingDirectoryBlock.createControl(parent);
    }

    @Override
    public void setLaunchConfigurationDialog(ILaunchConfigurationDialog dialog) {
        super.setLaunchConfigurationDialog(dialog);
        workingDirectoryBlock.setLaunchConfigurationDialog(dialog);
    }

    @Override
    protected void setDefaults(IResource contextualResource, ILaunchConfigurationWorkingCopy config) {
        super.setDefaults(contextualResource, config);

        config.setAttribute(LaunchConstants.ATTR_PROGRAM_ARGUMENTS, "");
        workingDirectoryBlock.setDefaults(config);
    }

    @Override
    protected void programPathField_setDefaults(IResource contextualResource,
            ILaunchConfigurationWorkingCopy config) {
        // TODO: figure out defaults for this field
    }

    @Override
    public void initializeFrom(ILaunchConfiguration config) {
        super.initializeFrom(config);

        String programargs = getConfigAttribute(config, LaunchConstants.ATTR_PROGRAM_ARGUMENTS, "");

        argumentsBlock.setFieldValue(programargs);
        workingDirectoryBlock.initializeFrom(config);
    }

    @Override
    protected void doPerformApply(ILaunchConfigurationWorkingCopy config) {
        super.doPerformApply(config);

        config.setAttribute(LaunchConstants.ATTR_PROGRAM_ARGUMENTS, argumentsBlock.getFieldValue());
        workingDirectoryBlock.performApply(config);
    }

    @Override
    public boolean isValid(ILaunchConfiguration launchConfig) {
        return super.isValid(launchConfig) && workingDirectoryBlock.isValid(launchConfig);
    }

    @Override
    public String getErrorMessage() {
        if (super.getErrorMessage() != null) {
            return super.getErrorMessage();
        } else {
            return workingDirectoryBlock.getErrorMessage();
        }
    }

    @Override
    protected void doValidate() {
        super.doValidate();
    }

    @Override
    protected void validateProgramPath() {
        // Ignore validation
        //super.validateProgramPath();
    }

    @Override
    protected void openProgramPathDialog(IProject project) {
        // TODO: this should be refactored to show only main packages

        try {

            ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), new LabelProvider() {
                @Override
                public String getText(Object element) {
                    GoPackageName goPackageName = (GoPackageName) element;
                    return goPackageName.getFullNameAsString();
                }
            });
            dialog.setTitle("Select Go main package");
            dialog.setMessage("Select Go main package");

            GoEnvironment goEnv = GoProjectEnvironment.getGoEnvironment(project);
            Collection<GoPackageName> sourcePackages = GoProjectEnvironment.getSourcePackages(project, goEnv);

            dialog.setElements(ArrayUtil.createFrom(sourcePackages));

            if (dialog.open() == IDialogConstants.OK_ID) {
                GoPackageName goPackageName = (GoPackageName) dialog.getFirstResult();
                String packageResourcePath = goPackageName.getFullNameAsString();

                if (!GoProjectEnvironment.isProjectInsideGoPath(project, goEnv.getGoPath())) {
                    packageResourcePath = "src/" + packageResourcePath;
                } else {
                    Path projectLocation = project.getLocation().toFile().toPath();
                    GoPackageName projectGoPackage = goEnv.getGoPath()
                            .findGoPackageForSourceFile(projectLocation.resolve("dummy.go"));

                    // snip project base name.
                    packageResourcePath = StringUtil.segmentAfterMatch(packageResourcePath,
                            projectGoPackage.getFullNameAsString() + "/");

                }
                // check extension
                programPathField.setFieldValue(packageResourcePath);
            }

        } catch (CoreException ce) {
            UIOperationExceptionHandler.handleOperationStatus("Error selecting package from dialog: ", ce);
        }
    }

}