blob: b70371f37516e0b195b728e87b700bce3af543a9 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}
}