blob: d6c81ebbe1bc08378bd73396d54cb50aee598d8e [file] [log] [blame]
package org.eclipse.dltk.debug.ui.preferences;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.environment.EnvironmentPathUtils;
import org.eclipse.dltk.core.environment.IEnvironment;
import org.eclipse.dltk.ui.environment.EnvironmentPathBlock;
import org.eclipse.dltk.ui.preferences.PreferenceKey;
import org.eclipse.dltk.ui.util.IStatusChangeListener;
import org.eclipse.dltk.ui.util.SWTFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWebBrowser;
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
/**
* Options block for external debugging engine that require the user to specify
* their location on disk.
*/
public abstract class ExternalDebuggingEngineOptionsBlock
extends DebuggingEngineConfigOptionsBlock {
EnvironmentPathBlock enginePaths;
public ExternalDebuggingEngineOptionsBlock(IStatusChangeListener context,
IProject project, PreferenceKey[] allKeys,
IWorkbenchPreferenceContainer container) {
super(context, project, allKeys, container);
}
/**
* Add a link to an external site where the debugging engine can be
* downloaded from
*
* @param parent
* parent composite
* @param text
* link text
* @param url
* link url
*/
protected void addDownloadLink(Composite parent, String text,
final String url) {
Link link = new Link(parent, SWT.NONE);
link.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
openExternalUrl(url);
}
});
link.setText(text);
}
/**
* Returns the debugging engine path preference key.
*/
protected abstract PreferenceKey getDebuggingEnginePathKey();
/**
* Creates the engine path block.
*
* <p>
* Sub-classes are free to override if they wish to make additional
* contributions to the parent composite to provide additional options for
* their specific engine.
* </p>
*
* @param parent
* parent composite
*/
@Override
protected void createEngineBlock(final Composite parent) {
final Group group = SWTFactory.createGroup(parent,
ScriptDebugPreferencesMessages.ExternalEngineGroup, 3, 1,
getExternalEngineBlockFillType());
enginePaths = new EnvironmentPathBlock();
enginePaths.createControl(group, getRelevantEnvironments());
enginePaths.setPaths(getEnvironmentPaths());
}
protected int getExternalEngineBlockFillType() {
return GridData.FILL_BOTH;
}
@Override
protected boolean processChanges(IWorkbenchPreferenceContainer container) {
setEnvironmentPaths(enginePaths.getPaths());
return super.processChanges(container);
}
/**
* @since 2.0
*/
protected Map<IEnvironment, String> getEnvironmentPaths() {
String pathKeyValue = getString(getDebuggingEnginePathKey());
return EnvironmentPathUtils.decodePaths(pathKeyValue);
}
private void setEnvironmentPaths(Map<IEnvironment, String> env2path) {
String pathKeyValue = EnvironmentPathUtils.encodePaths(env2path);
setString(getDebuggingEnginePathKey(), pathKeyValue);
}
protected void openExternalUrl(String url) {
try {
final IWebBrowser browser = PlatformUI.getWorkbench()
.getBrowserSupport().getExternalBrowser();
browser.openURL(new URL(url));
} catch (PartInitException e) {
if (DLTKCore.DEBUG) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
if (DLTKCore.DEBUG) {
e.printStackTrace();
}
}
}
}