// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.debug.ui.launcher;
import java.net.MalformedURLException;
import java.net.URL;
import org.chromium.debug.core.ChromiumDebugPlugin;
import org.chromium.debug.ui.PluginUtil;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWebBrowser;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
/**
* The "Deprecation" tab for the Chromium JavaScript launch tab group. It contains
* text explanation and a button that copies current configuration as WIP launch configuration.
*/
public class DevToolsProtocolDeprecationTab extends AbstractLaunchConfigurationTab {
private ILaunchConfiguration launchConfiguration = null;
private final ILaunchConfigurationType WIP_CONFIGURATION_TYPE =
DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType(WIP_TYPE_ID);
@Override
public String getName() {
return Messages.DevToolsProtocolDeprecationTab_TITLE;
}
@Override
public void createControl(Composite parent) {
Composite composite = ChromiumRemoteTab.createDefaultComposite(parent);
setControl(composite);
FontMetrics fontMetrics = PluginUtil.getFontMetrics(composite, null);
createVerticalSpan(composite, fontMetrics.getHeight());
Text text = new Text(composite, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY);
text.setText(NLS.bind(Messages.DevToolsProtocolDeprecationTab_MAIN_TEXT, WIP_CONFIGURATION_TYPE.getName()));
text.setBackground(parent.getBackground());
{
GridData gd = new GridData();
gd.horizontalAlignment = GridData.FILL;
gd.grabExcessHorizontalSpace = true;
gd.widthHint = fontMetrics.getAverageCharWidth() * 44;
text.setLayoutData(gd);
}
Button button = new Button(composite, SWT.PUSH);
button.setText(Messages.DevToolsProtocolDeprecationTab_COPY_LAUNCH_CONFIGURATION);
button.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent event) {
try {
performCopying(launchConfiguration);
} catch (CoreException e) {
ChromiumDebugPlugin.log(new Exception("Failed to copy launch configuration", e)); //$NON-NLS-1$
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
createVerticalSpan(composite, fontMetrics.getHeight());
Label seeAlso = new Label(composite, SWT.NONE);
seeAlso.setText(Messages.DevToolsProtocolDeprecationTab_SEE_ALSO);
createLink(composite, Messages.DevToolsProtocolDeprecationTab_OLD_PROTOCOL,
"http://code.google.com/p/chromedevtools/wiki/ChromeDevToolsProtocol"); //$NON-NLS-1$
createLink(composite, Messages.DevToolsProtocolDeprecationTab_NEW_PROTOCOL,
"http://code.google.com/p/chromedevtools/wiki/WIP"); //$NON-NLS-1$
createLink(composite, Messages.DevToolsProtocolDeprecationTab_PROJECT_SITE,
"http://code.google.com/p/chromedevtools/"); //$NON-NLS-1$
}
private Label createVerticalSpan(Composite parent, int height) {
Label spanLabel = new Label(parent, SWT.NONE);
GridData gd = new GridData();
gd.minimumHeight = height;
spanLabel.setLayoutData(gd);
return spanLabel;
}
private Link createLink(Composite parent, String text, String urlString) {
final URL url;
try {
url = new URL(urlString);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
Link link = new Link(parent, SWT.NONE);
link.setText(text);
link.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
try {
IWebBrowser browser = support.getExternalBrowser();
browser.openURL(url);
} catch (PartInitException e) {
ChromiumDebugPlugin.log(e);
}
}
});
return link;
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
}
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
launchConfiguration = configuration;
}
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
}
private ILaunchConfiguration performCopying(ILaunchConfiguration original) throws CoreException {
IContainer container;
IFile file = original.getFile();
if (file == null) {
container = null;
} else {
container = file.getParent();
}
ILaunchConfigurationWorkingCopy result =
WIP_CONFIGURATION_TYPE.newInstance(container, original.getName() + Messages.DevToolsProtocolDeprecationTab_CONFIGURATION_NAME_SUFFIX);
result.setAttributes(original.getAttributes());
return result.doSave();
}
private static final String WIP_TYPE_ID = "org.chromium.debug.ui.LaunchType$Wip"; //$NON-NLS-1$
}