org.eclipse.rcptt.internal.launching.ext.ui.AUTLocationBlock.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.rcptt.internal.launching.ext.ui.AUTLocationBlock.java

Source

/*******************************************************************************
 * Copyright (c) 2009, 2016 Xored Software Inc and others.
 * 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:
 *     Xored Software Inc - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.rcptt.internal.launching.ext.ui;

import static org.eclipse.rcptt.internal.launching.ext.Q7ExtLaunchingPlugin.PLUGIN_ID;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jdt.internal.debug.ui.actions.ControlAccessibleListener;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.pde.internal.ui.SWTFactory;
import org.eclipse.rcptt.internal.launching.ext.PDELocationUtils;
import org.eclipse.rcptt.internal.launching.ext.Q7TargetPlatformManager;
import org.eclipse.rcptt.launching.IQ7Launch;
import org.eclipse.rcptt.launching.target.ITargetPlatformHelper;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

@SuppressWarnings("restriction")
public class AUTLocationBlock {

    private ExternalAUTMainTab fTab;
    private Listener fListener = new Listener();
    private final WritableValue status = new WritableValue(Status.OK_STATUS, IStatus.class);

    private void setStatus(final IStatus newStatus) {
        status.getRealm().asyncExec(new Runnable() {
            @Override
            public void run() {
                status.setValue(newStatus);
            }
        });
    }

    private Text locationField;
    private Button fileLocationButton;
    // private TableViewer informationViewer;
    private ITargetPlatformHelper info;
    // private String errorInfo;
    private boolean needUpdate = true;

    private class Listener extends SelectionAdapter implements ModifyListener {

        public void modifyText(ModifyEvent e) {
            if (needUpdate) {
                updateInfo();
            }
        }

        @Override
        public void widgetSelected(SelectionEvent e) {
            Object source = e.getSource();
            if (source == fileLocationButton) {
                handleFileLocationButtonSelected();
            }
        }
    }

    public AUTLocationBlock(ExternalAUTMainTab tab) {
        fTab = tab;
    }

    public void updateInfo() {
        // errorInfo = null;
        final String location = getLocation();
        boolean valid = PDELocationUtils.validateProductLocation(location).isOK();
        if (!valid) {
            // errorInfo =
            // "AUT location should point to existing directory";
        }

        if (needUpdate && valid) {
            info = null;
            runInDialog(new IRunnableWithProgress() {
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    try {
                        info = Q7TargetPlatformManager.createTargetPlatform(location, monitor);
                        assert info.getStatus().isOK();
                    } catch (CoreException e) {
                        setStatus(e.getStatus());
                    }
                }
            });
        }
        if (info != null) {
            fTab.doUpdate(info);
        }
        fTab.setCurrentTargetPlatform(info);
        fTab.scheduleUpdateJob();
    }

    public void createControl(Composite parent) {
        Group group = new Group(parent, SWT.NONE);
        String locationLabel = "&Application Under Test (AUT)";
        group.setText(locationLabel);
        GridLayout layout = new GridLayout();
        layout.numColumns = 3;
        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
        group.setLayout(layout);
        group.setLayoutData(gridData);

        Label l = new Label(group, SWT.WRAP);
        l.setText("Location:");
        locationField = new Text(group, SWT.BORDER);
        gridData = new GridData(GridData.FILL_HORIZONTAL);
        gridData.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
        locationField.setLayoutData(gridData);
        locationField.addModifyListener(fListener);
        ControlAccessibleListener.addListener(locationField, group.getText());

        Composite buttonComposite = new Composite(group, SWT.NONE);
        layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.numColumns = 3;
        gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
        buttonComposite.setLayout(layout);
        buttonComposite.setLayoutData(gridData);
        buttonComposite.setFont(parent.getFont());
        fileLocationButton = SWTFactory.createPushButton(buttonComposite, "File Syste&m...", null);
        fileLocationButton.addSelectionListener(fListener);
        ControlAccessibleListener.addListener(fileLocationButton,
                group.getText() + " " + fileLocationButton.getText()); //$NON-NLS-1$

    }

    /**
     * Prompts the user to choose a location from the filesystem and sets the
     * location as the full path of the selected file.
     */
    private void handleFileLocationButtonSelected() {
        DirectoryDialog fileDialog = new DirectoryDialog(fTab.getControl().getShell(), SWT.NONE);
        fileDialog.setFilterPath(locationField.getText());
        String text = fileDialog.open();
        if (text != null) {
            locationField.setText(text);
        }
    }

    IStatus createError(String message) {
        return new Status(IStatus.ERROR, PLUGIN_ID, message);
    }

    public IStatus getStatus() {
        if (locationField.getText().trim().length() == 0) {
            return createError("Please specify Application installation directory...");
        }
        if (info == null) {
            return createError("Please specify correct Application installation directory...");
        } else {
            return info.getStatus();
        }
    }

    public void performApply(ILaunchConfigurationWorkingCopy config) throws CoreException {
        config.setAttribute(IQ7Launch.AUT_LOCATION, getLocation());
        if (info != null) {
            info.setTargetName(Q7TargetPlatformManager.getTargetPlatformName(config));
            info.save();
            config.setAttribute(IQ7Launch.TARGET_PLATFORM, info.getName());
            Q7TargetPlatformManager.setHelper(info.getName(), info);
        }
        config.setAttribute(IQ7Launch.UPDATE_TARGET_SUPPORTED, true);
    }

    private String getLocation() {
        return locationField.getText().trim();
    }

    public void initializeFrom(final ILaunchConfiguration config) {
        String location = null;
        try {
            location = config.getAttribute(IQ7Launch.AUT_LOCATION, "");
        } catch (CoreException e) {
            Activator.log(e);
        }
        needUpdate = false;
        runInDialog(new IRunnableWithProgress() {
            public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                try {
                    info = Q7TargetPlatformManager.findTarget(config, monitor);
                    if (info == null) {
                        info = Q7TargetPlatformManager.getTarget(config, monitor);
                    }
                } catch (CoreException e) {
                    Activator.log(e);
                }

            }
        });
        locationField.setText(location);
        updateInfo();
        needUpdate = true;
    }

    private void runInDialog(final IRunnableWithProgress run) {
        final TimeTriggeredProgressMonitorDialog dialog = new TimeTriggeredProgressMonitorDialog(
                fTab.getControl().getShell(), 500);
        try {
            dialog.run(true, false, new IRunnableWithProgress() {
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    run.run(new SyncProgressMonitor(monitor, dialog.getShell().getDisplay()));
                }
            });
        } catch (InvocationTargetException e) {
            Activator.log(e);
        } catch (InterruptedException e) {
            Activator.log(e);
        }
    }
}