/*******************************************************************************
* Copyright (c) 2007 Nokia 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:
* Nokia - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.ui.breakpointactions;
import java.util.ArrayList;
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.ILaunchManager;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
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.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IPluginContribution;
import org.eclipse.ui.activities.WorkbenchActivityHelper;
import org.eclipse.ui.dialogs.ListDialog;
public class ExternalToolActionComposite extends Composite {
/**
* A plug-in contribution (UI element) which contains a launch configuration
* type (Core element). Plug-in contributions are passed to the workbench
* activity support to filter elements from the UI.
*/
class LaunchConfigurationTypeContribution implements IPluginContribution {
protected ILaunchConfigurationType type;
/**
* Creates a new plug-in contribution for the given type
*
* @param type
* the launch configuration type
*/
public LaunchConfigurationTypeContribution(ILaunchConfigurationType type) {
this.type = type;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IPluginContribution#getLocalId()
*/
public String getLocalId() {
return type.getIdentifier();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IPluginContribution#getPluginId()
*/
public String getPluginId() {
return type.getPluginIdentifier();
}
}
public class LaunchConfigurationSelectionDialog extends ListDialog {
private ILaunchConfiguration[] launchConfigs;
public LaunchConfigurationSelectionDialog(ExternalToolActionComposite composite, ILaunchConfiguration[] lcs) {
super(composite.getShell());
launchConfigs = lcs;
this.setInput(composite);
this.setContentProvider(new IStructuredContentProvider() {
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object parent) {
return launchConfigs;
}
});
this.setLabelProvider(new LabelProvider() {
public String getText(Object element) {
return ((ILaunchConfiguration) element).getName();
}
});
}
}
private Text extToolName;
/**
* Create the composite
*
* @param parent
* @param style
* @param page
*/
public ExternalToolActionComposite(Composite parent, int style, ExternalToolActionPage page) {
super(parent, style);
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 3;
setLayout(gridLayout);
final Label executeFileLabel = new Label(this, SWT.LEFT);
executeFileLabel.setLayoutData(new GridData());
executeFileLabel.setText(Messages.getString("ExternalToolActionComposite.ToolLabel")); //$NON-NLS-1$
extToolName = new Text(this, SWT.READ_ONLY);
extToolName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
extToolName.setText(page.getExternalToolAction().getExternalToolName());
final ExternalToolActionComposite externalToolActionComposite = this;
final Button browseButton = new Button(this, SWT.NONE);
browseButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
ILaunchConfiguration[] lcs = getLaunchConfigurations();
LaunchConfigurationSelectionDialog dlg = new LaunchConfigurationSelectionDialog(externalToolActionComposite, lcs);
dlg.setTitle(Messages.getString("ExternalToolActionComposite.DialogTitle")); //$NON-NLS-1$
dlg.setMessage(Messages.getString("ExternalToolActionComposite.DialogMessage")); //$NON-NLS-1$
if (lcs.length > 0) {
ILaunchConfiguration[] initialSelection = new ILaunchConfiguration[1];
String existingName = extToolName.getText();
initialSelection[0] = lcs[0];
if (existingName.length() > 0) {
for (int i = 0; i < lcs.length; i++) {
if (lcs[i].getName().equals(existingName)) {
initialSelection[0] = lcs[i];
break;
}
}
}
dlg.setInitialSelections(initialSelection);
}
dlg.setAddCancelButton(false);
if (dlg.open() == Window.OK) {
Object[] selectedTool = dlg.getResult();
if (selectedTool.length > 0 && selectedTool[0] instanceof ILaunchConfiguration) {
externalToolActionComposite.setExternalToolName(((ILaunchConfiguration) selectedTool[0]).getName());
}
}
}
});
browseButton.setText(Messages.getString("ExternalToolActionComposite.ChooseButtonTitle")); //$NON-NLS-1$
browseButton.setEnabled(getLaunchConfigurations().length > 0);
final Button externalToolsButton = new Button(this, SWT.NONE);
externalToolsButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
DebugUITools.openLaunchConfigurationDialogOnGroup(externalToolActionComposite.getShell(), new StructuredSelection(), "org.eclipse.ui.externaltools.launchGroup"); //$NON-NLS-1$
browseButton.setEnabled(getLaunchConfigurations().length > 0);
}
});
externalToolsButton.setText(Messages.getString("ExternalToolActionComposite.ExternalToolsButtonTitle")); //$NON-NLS-1$
//
}
protected void setExternalToolName(String externalToolName) {
extToolName.setText(externalToolName);
}
private boolean equalCategories(String c1, String c2) {
if (c1 == null || c2 == null) {
return c1 == c2;
}
return c1.equals(c2);
}
public ILaunchConfiguration[] getLaunchConfigurations() {
ArrayList onlyExternalTools = new ArrayList();
ILaunchManager lcm = DebugPlugin.getDefault().getLaunchManager();
ILaunchConfiguration[] launchConfigurations;
try {
launchConfigurations = lcm.getLaunchConfigurations();
for (int i = 0; i < launchConfigurations.length; i++) {
ILaunchConfiguration config = launchConfigurations[i];
ILaunchConfigurationType type = config.getType();
boolean priv = false;
try {
priv = config.getAttribute(IDebugUIConstants.ATTR_PRIVATE, false);
} catch (CoreException e) {
}
if (type != null) {
if (!priv && type.supportsMode(ILaunchManager.RUN_MODE) && equalCategories(type.getCategory(), "org.eclipse.ui.externaltools") //$NON-NLS-1$
&& !WorkbenchActivityHelper.filterItem(new LaunchConfigurationTypeContribution(type)))
onlyExternalTools.add(launchConfigurations[i]);
}
}
} catch (CoreException e) {
}
return (ILaunchConfiguration[]) onlyExternalTools.toArray(new ILaunchConfiguration[onlyExternalTools.size()]);
}
public void dispose() {
super.dispose();
}
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
public String getLaunchConfigName() {
return extToolName.getText();
}
}