blob: bb98ac4a92abf9742cbbf4a2cf0b7cc0a770e1ce [file] [log] [blame]
package org.eclipse.debug.ui;
/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp. All rights reserved.
This file is made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
**********************************************************************/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsMessages;
import org.eclipse.debug.internal.ui.launchConfigurations.LaunchGroupExtension;
import org.eclipse.debug.internal.ui.launchConfigurations.LaunchHistory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.Viewer;
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.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPerspectiveRegistry;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
import org.eclipse.ui.help.WorkbenchHelp;
/**
* Common launch configuration tab to specify the location a launch configuration
* is stored, whether it should appear in the favorites list, and perspective
* switching for an associated launch.
* <p>
* Clients may instantiate this class. This class is not intended to be subclassed.
* </p>
* @since 2.0
*/
public class CommonTab extends AbstractLaunchConfigurationTab {
// Local/shared UI widgets
private Label fLocalSharedLabel;
private Button fLocalRadioButton;
private Button fSharedRadioButton;
// Shared location UI widgets
private Label fSharedLocationLabel;
private Text fSharedLocationText;
private Button fSharedLocationButton;
/**
* The combo box specifying the run perspective
*/
private Combo fRunPerspectiveCombo;
/**
* Label for the run perspective combo box
*/
private Label fRunPerspectiveLabel;
/**
* The combo box specifying the debug perspective
*/
private Combo fDebugPerspectiveCombo;
/**
* Label for the debug perspective combo box
*/
private Label fDebugPerspectiveLabel;
/**
* The label that acts as header for the 'switch to perspective' widgets
*/
private Label fSwitchToLabel;
/**
* Check box list for specifying favorites
*/
private CheckboxTableViewer fFavoritesTable;
/**
* Constant for the name of the drop-down choice 'None' for perspectives.
*/
private static final String PERSPECTIVE_NONE_NAME = LaunchConfigurationsMessages.getString("CommonTab.None"); //$NON-NLS-1$
/**
* Constant for the name of the drop-down choice 'Default' for perspectives.
*/
private static final String PERSPECTIVE_DEFAULT_NAME = LaunchConfigurationsMessages.getString("CommonTab.Default"); //$NON-NLS-1$
/**
* Modify listener that simply updates the owning launch configuration dialog.
*/
private ModifyListener fBasicModifyListener = new ModifyListener() {
public void modifyText(ModifyEvent evt) {
updateLaunchConfigurationDialog();
}
};
/**
* @see ILaunchConfigurationTab#createControl(Composite)
*/
public void createControl(Composite parent) {
Font font = parent.getFont();
Composite comp = new Composite(parent, SWT.NONE);
setControl(comp);
WorkbenchHelp.setHelp(getControl(), IDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_COMMON_TAB);
GridLayout topLayout = new GridLayout();
comp.setLayout(topLayout);
createVerticalSpacer(comp, 1);
Composite radioComp = new Composite(comp, SWT.NONE);
GridLayout radioLayout = new GridLayout();
radioLayout.marginHeight = 0;
radioLayout.marginWidth = 0;
radioComp.setLayout(radioLayout);
setLocalSharedLabel(new Label(radioComp, SWT.NONE));
getLocalSharedLabel().setText(LaunchConfigurationsMessages.getString("CommonTab.Type_of_launch_configuration__2")); //$NON-NLS-1$
getLocalSharedLabel().setFont(font);
setLocalRadioButton(new Button(radioComp, SWT.RADIO));
getLocalRadioButton().setText(LaunchConfigurationsMessages.getString("CommonTab.L&ocal_3")); //$NON-NLS-1$
getLocalRadioButton().setFont(font);
setSharedRadioButton(new Button(radioComp, SWT.RADIO));
getSharedRadioButton().setText(LaunchConfigurationsMessages.getString("CommonTab.S&hared_4")); //$NON-NLS-1$
getSharedRadioButton().setFont(font);
getSharedRadioButton().addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent evt) {
handleSharedRadioButtonSelected();
}
});
Composite locationComp = new Composite(comp, SWT.NONE);
GridLayout locationLayout = new GridLayout();
locationLayout.numColumns = 2;
locationLayout.marginHeight = 0;
locationLayout.marginWidth = 0;
locationComp.setLayout(locationLayout);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
locationComp.setLayoutData(gd);
locationComp.setFont(font);
setSharedLocationLabel(new Label(locationComp, SWT.NONE));
getSharedLocationLabel().setText(LaunchConfigurationsMessages.getString("CommonTab.Location_of_shared_confi&guration__5")); //$NON-NLS-1$
gd = new GridData();
gd.horizontalSpan = 2;
getSharedLocationLabel().setLayoutData(gd);
getSharedLocationLabel().setFont(font);
setSharedLocationText(new Text(locationComp, SWT.SINGLE | SWT.BORDER));
gd = new GridData(GridData.FILL_HORIZONTAL);
getSharedLocationText().setLayoutData(gd);
getSharedLocationText().setFont(font);
getSharedLocationText().addModifyListener(fBasicModifyListener);
setSharedLocationButton(createPushButton(locationComp, LaunchConfigurationsMessages.getString("CommonTab.&Browse_6"), null)); //$NON-NLS-1$
getSharedLocationButton().addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent evt) {
handleSharedLocationButtonSelected();
}
});
getLocalRadioButton().setSelection(true);
setSharedEnabled(false);
createVerticalSpacer(comp, 1);
setSwitchToLabel(new Label(comp, SWT.HORIZONTAL | SWT.LEFT));
getSwitchToLabel().setText(LaunchConfigurationsMessages.getString("CommonTab.Switch_to/Open_perspective_when_launched_in__7")); //$NON-NLS-1$
getSwitchToLabel().setFont(font);
gd = new GridData();
gd.horizontalAlignment = GridData.BEGINNING;
gd.horizontalSpan = 3;
getSwitchToLabel().setLayoutData(gd);
Composite perspComp = new Composite(comp, SWT.NONE);
GridLayout perspLayout = new GridLayout();
perspLayout.marginHeight = 0;
perspLayout.marginWidth = 0;
perspLayout.numColumns = 2;
perspComp.setLayout(perspLayout);
setRunPerspectiveLabel(new Label(perspComp, SWT.NONE));
getRunPerspectiveLabel().setText(LaunchConfigurationsMessages.getString("CommonTab.Run_mode_8")); //$NON-NLS-1$
getRunPerspectiveLabel().setFont(font);
setRunPerspectiveCombo(new Combo(perspComp, SWT.DROP_DOWN | SWT.READ_ONLY));
gd = new GridData(GridData.GRAB_HORIZONTAL);
getRunPerspectiveCombo().setLayoutData(gd);
getRunPerspectiveCombo().setFont(font);
fillWithPerspectives(getRunPerspectiveCombo());
getRunPerspectiveCombo().addModifyListener(fBasicModifyListener);
setDebugPerspectiveLabel(new Label(perspComp, SWT.NONE));
getDebugPerspectiveLabel().setText(LaunchConfigurationsMessages.getString("CommonTab.Debug_mode_9")); //$NON-NLS-1$
getDebugPerspectiveLabel().setFont(font);
setDebugPerspectiveCombo(new Combo(perspComp, SWT.DROP_DOWN |SWT.READ_ONLY));
gd = new GridData(GridData.GRAB_HORIZONTAL);
getDebugPerspectiveCombo().setLayoutData(gd);
getDebugPerspectiveCombo().setFont(font);
fillWithPerspectives(getDebugPerspectiveCombo());
getDebugPerspectiveCombo().addModifyListener(fBasicModifyListener);
createVerticalSpacer(comp, 1);
Composite favComp = new Composite(comp, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
favComp.setLayoutData(gd);
GridLayout favLayout = new GridLayout();
favLayout.marginHeight = 0;
favLayout.marginWidth = 0;
favLayout.numColumns = 2;
favLayout.makeColumnsEqualWidth = true;
favComp.setLayout(favLayout);
favComp.setFont(font);
Label favLabel = new Label(favComp, SWT.HORIZONTAL | SWT.LEFT);
favLabel.setText(LaunchConfigurationsMessages.getString("CommonTab.Display_in_favorites_menu__10")); //$NON-NLS-1$
gd = new GridData(GridData.BEGINNING);
gd.horizontalSpan = 2;
favLabel.setLayoutData(gd);
favLabel.setFont(font);
fFavoritesTable = CheckboxTableViewer.newCheckList(favComp, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
Control table = fFavoritesTable.getControl();
gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalSpan = 1;
table.setLayoutData(gd);
table.setFont(font);
fFavoritesTable.setContentProvider(new FavoritesContentProvider());
fFavoritesTable.setLabelProvider(new FavoritesLabelProvider());
fFavoritesTable.addCheckStateListener(
new ICheckStateListener() {
/**
* @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
*/
public void checkStateChanged(CheckStateChangedEvent event) {
updateLaunchConfigurationDialog();
}
});
}
private void setSharedLocationButton(Button sharedLocationButton) {
this.fSharedLocationButton = sharedLocationButton;
}
private Button getSharedLocationButton() {
return fSharedLocationButton;
}
private void setSharedLocationText(Text sharedLocationText) {
this.fSharedLocationText = sharedLocationText;
}
private Text getSharedLocationText() {
return fSharedLocationText;
}
private void setSharedLocationLabel(Label sharedLocationLabel) {
this.fSharedLocationLabel = sharedLocationLabel;
}
private Label getSharedLocationLabel() {
return fSharedLocationLabel;
}
private void setLocalSharedLabel(Label localSharedLabel) {
fLocalSharedLabel = localSharedLabel;
}
private Label getLocalSharedLabel() {
return fLocalSharedLabel;
}
private void setLocalRadioButton(Button button) {
fLocalRadioButton = button;
}
private Button getLocalRadioButton() {
return fLocalRadioButton;
}
private void setSharedRadioButton(Button button) {
fSharedRadioButton = button;
}
private Button getSharedRadioButton() {
return fSharedRadioButton;
}
/**
* Returns the perspective combo assoicated with the
* debug perspective button.
*
* @return a combo box
*/
private Combo getDebugPerspectiveCombo() {
return fDebugPerspectiveCombo;
}
/**
* Sets the perspective combo assoicated with the
* debug perspective button.
*
* @param combo a combo box
*/
private void setDebugPerspectiveCombo(Combo combo) {
fDebugPerspectiveCombo = combo;
}
/**
* Returns the perspective combo assoicated with the
* run perspective button.
*
* @return a combo box
*/
private Combo getRunPerspectiveCombo() {
return fRunPerspectiveCombo;
}
/**
* Sets the perspective combo assoicated with the
* run perspective button.
*
* @param combo a combo box
*/
private void setRunPerspectiveCombo(Combo combo) {
fRunPerspectiveCombo = combo;
}
private void setRunPerspectiveLabel(Label fRunPerspectiveLabel) {
this.fRunPerspectiveLabel = fRunPerspectiveLabel;
}
private Label getRunPerspectiveLabel() {
return fRunPerspectiveLabel;
}
private void setDebugPerspectiveLabel(Label fDebugPerspectiveLabel) {
this.fDebugPerspectiveLabel = fDebugPerspectiveLabel;
}
private Label getDebugPerspectiveLabel() {
return fDebugPerspectiveLabel;
}
private void setSwitchToLabel(Label switchToLabel) {
fSwitchToLabel = switchToLabel;
}
private Label getSwitchToLabel() {
return fSwitchToLabel;
}
private void handleSharedRadioButtonSelected() {
setSharedEnabled(isShared());
updateLaunchConfigurationDialog();
}
private void setSharedEnabled(boolean enable) {
getSharedLocationLabel().setEnabled(enable);
getSharedLocationText().setEnabled(enable);
getSharedLocationButton().setEnabled(enable);
}
private boolean isShared() {
return getSharedRadioButton().getSelection();
}
private void handleSharedLocationButtonSelected() {
ContainerSelectionDialog dialog = new ContainerSelectionDialog(getShell(),
getWorkspaceRoot(),
false,
LaunchConfigurationsMessages.getString("CommonTab.Select_a_location_for_the_launch_configuration_13")); //$NON-NLS-1$
String currentContainerString = getSharedLocationText().getText();
IContainer currentContainer = getContainer(currentContainerString);
if (currentContainer != null) {
IPath path = currentContainer.getFullPath();
dialog.setInitialSelections(new Object[] {path});
}
dialog.showClosedProjects(false);
dialog.open();
Object[] results = dialog.getResult();
if ((results != null) && (results.length > 0) && (results[0] instanceof IPath)) {
IPath path = (IPath)results[0];
String containerName = path.toOSString();
getSharedLocationText().setText(containerName);
}
}
private IContainer getContainer(String path) {
Path containerPath = new Path(path);
return (IContainer) getWorkspaceRoot().findMember(containerPath);
}
/**
* Returns the perspective with the given label, or
* <code>null</code> if none is found.
*
* @param label perspective label
* @return perspective descriptor
*/
private IPerspectiveDescriptor getPerspectiveWithLabel(String label) {
return PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithLabel(label);
}
/**
* Returns the perspective with the given id, or
* <code>null</code> if none is found.
*
* @param id perspective identifier
* @return perspective descriptor
*/
private IPerspectiveDescriptor getPerspectiveWithId(String id) {
return PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(id);
}
/**
* Fills the given combo box with the labels of all existing
* perspectives and one to indicate 'none'.
*
* @param combo combo box
*/
private void fillWithPerspectives(Combo combo) {
combo.add(PERSPECTIVE_NONE_NAME);
combo.add(PERSPECTIVE_DEFAULT_NAME);
IPerspectiveRegistry reg = PlatformUI.getWorkbench().getPerspectiveRegistry();
IPerspectiveDescriptor[] persps = reg.getPerspectives();
for (int i = 0; i < persps.length; i++) {
combo.add(persps[i].getLabel());
}
}
/**
* @see ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration)
*/
public void initializeFrom(ILaunchConfiguration configuration) {
updateLocalSharedFromConfig(configuration);
updateSharedLocationFromConfig(configuration);
updateRunPerspectiveFromConfig(configuration);
updateDebugPerspectiveFromConfig(configuration);
updateFavoritesFromConfig(configuration);
}
private void updateLocalSharedFromConfig(ILaunchConfiguration config) {
boolean isShared = !config.isLocal();
getSharedRadioButton().setSelection(isShared);
getLocalRadioButton().setSelection(!isShared);
setSharedEnabled(isShared);
}
private void updateSharedLocationFromConfig(ILaunchConfiguration config) {
IFile file = config.getFile();
if (file != null) {
IContainer parent = file.getParent();
if (parent != null) {
String containerName = parent.getFullPath().toOSString();
getSharedLocationText().setText(containerName);
}
}
}
private void updateRunPerspectiveFromConfig(ILaunchConfiguration config) {
ILaunchConfigurationType type = null;
String runPerspID = null;
try {
runPerspID = config.getAttribute(IDebugUIConstants.ATTR_TARGET_RUN_PERSPECTIVE, (String)null);
type = config.getType();
} catch (CoreException ce) {
updatePerspectiveCombo(getRunPerspectiveCombo(), null);
getRunPerspectiveCombo().setEnabled(false);
getRunPerspectiveLabel().setEnabled(false);
return;
}
updatePerspectiveCombo(getRunPerspectiveCombo(), runPerspID);
boolean enable = type.supportsMode(ILaunchManager.RUN_MODE);
getRunPerspectiveCombo().setEnabled(enable);
getRunPerspectiveLabel().setEnabled(enable);
}
private void updateDebugPerspectiveFromConfig(ILaunchConfiguration config) {
ILaunchConfigurationType type = null;
String debugPerspID = null;
try {
debugPerspID = config.getAttribute(IDebugUIConstants.ATTR_TARGET_DEBUG_PERSPECTIVE, (String)null);
type = config.getType();
} catch (CoreException ce) {
updatePerspectiveCombo(getDebugPerspectiveCombo(), null);
getDebugPerspectiveCombo().setEnabled(false);
getDebugPerspectiveLabel().setEnabled(false);
return;
}
updatePerspectiveCombo(getDebugPerspectiveCombo(), debugPerspID);
boolean enable = type.supportsMode(ILaunchManager.DEBUG_MODE);
getDebugPerspectiveCombo().setEnabled(enable);
getDebugPerspectiveLabel().setEnabled(enable);
}
private void updateFavoritesFromConfig(ILaunchConfiguration config) {
fFavoritesTable.setInput(config);
fFavoritesTable.setCheckedElements(new Object[]{});
try {
List groups = config.getAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, new ArrayList());
if (groups.isEmpty()) {
// check old attributes for backwards compatible
if (config.getAttribute(IDebugUIConstants.ATTR_DEBUG_FAVORITE, false)) {
groups.add(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP);
}
if (config.getAttribute(IDebugUIConstants.ATTR_RUN_FAVORITE, false)) {
groups.add(IDebugUIConstants.ID_RUN_LAUNCH_GROUP);
}
}
if (!groups.isEmpty()) {
List list = new ArrayList();
Iterator iterator = groups.iterator();
while (iterator.hasNext()) {
String id = (String)iterator.next();
LaunchGroupExtension extension = getLaunchConfigurationManager().getLaunchGroup(id);
list.add(extension);
}
fFavoritesTable.setCheckedElements(list.toArray());
}
} catch (CoreException e) {
DebugUIPlugin.log(e);
}
}
/**
* Based on the given perspective identifier, update the settings
* of the button and associated combo box. The check box is selected
* when there is a valid perspective, and the combo box is set to
* display the label of the associated perspective. The check box is
* deselected, and the combo box is set to the default value (debug
* perspective) when the identfier is <code>null</code>.
*
* @param button check box button
* @param combo combo box with perspective labels
* @param id perspective identifier or <code>null</code>
*/
private void updatePerspectiveCombo(Combo combo, String id) {
if ((id == null) || (id.equals(IDebugUIConstants.PERSPECTIVE_NONE))) {
combo.setText(PERSPECTIVE_NONE_NAME);
} else if (id.equals(IDebugUIConstants.PERSPECTIVE_DEFAULT)) {
combo.setText(PERSPECTIVE_DEFAULT_NAME);
} else {
IPerspectiveDescriptor pd = getPerspectiveWithId(id);
if (pd == null) {
// perpective does not exist - reset
updatePerspectiveCombo(combo, null);
} else {
combo.setText(pd.getLabel());
}
}
}
private void updateConfigFromLocalShared(ILaunchConfigurationWorkingCopy config) {
if (isShared()) {
String containerPathString = getSharedLocationText().getText();
IContainer container = (IContainer) getContainer(containerPathString);
config.setContainer(container);
} else {
config.setContainer(null);
}
}
/**
* Update the run perspective attribute based on current
* UI settings.
*/
private void updateConfigFromRunPerspective(ILaunchConfigurationWorkingCopy config) {
String selectedText = getRunPerspectiveCombo().getText();
String perspID = null;
if (selectedText.equals(PERSPECTIVE_NONE_NAME)) {
perspID = IDebugUIConstants.PERSPECTIVE_NONE;
}
else if (selectedText.equals(PERSPECTIVE_DEFAULT_NAME)) {
perspID = IDebugUIConstants.PERSPECTIVE_DEFAULT;
} else {
IPerspectiveDescriptor descriptor = getPerspectiveWithLabel(selectedText);
if (descriptor != null) {
perspID = descriptor.getId();
}
}
config.setAttribute(IDebugUIConstants.ATTR_TARGET_RUN_PERSPECTIVE, perspID);
}
/**
* Update the debug perspective attribute based on current
* UI settings.
*/
private void updateConfigFromDebugPerspective(ILaunchConfigurationWorkingCopy config) {
String selectedText = getDebugPerspectiveCombo().getText();
String perspID = null;
if (selectedText.equals(PERSPECTIVE_NONE_NAME)) {
perspID = IDebugUIConstants.PERSPECTIVE_NONE;
}
else if (selectedText.equals(PERSPECTIVE_DEFAULT_NAME)) {
perspID = IDebugUIConstants.PERSPECTIVE_DEFAULT;
} else {
IPerspectiveDescriptor descriptor = getPerspectiveWithLabel(selectedText);
if (descriptor != null) {
perspID = descriptor.getId();
}
}
config.setAttribute(IDebugUIConstants.ATTR_TARGET_DEBUG_PERSPECTIVE, perspID);
}
/**
* Update the favorite settings.
*
* NOTE: set to NULL instead of false for backwards compatibility
* when comparing if content is equal, since 'false' is default
* and will be missing for older configs.
*/
private void updateConfigFromFavorites(ILaunchConfigurationWorkingCopy config) {
try {
Object[] checked = fFavoritesTable.getCheckedElements();
boolean debug = config.getAttribute(IDebugUIConstants.ATTR_DEBUG_FAVORITE, false);
boolean run = config.getAttribute(IDebugUIConstants.ATTR_RUN_FAVORITE, false);
if (debug || run) {
// old attributes
List groups = new ArrayList();
int num = 0;
if (debug) {
groups.add(getLaunchConfigurationManager().getLaunchGroup(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP));
num++;
}
if (run) {
num++;
groups.add(getLaunchConfigurationManager().getLaunchGroup(IDebugUIConstants.ID_DEBUG_LAUNCH_GROUP));
}
// see if there are any changes
if (num == checked.length) {
boolean different = false;
for (int i = 0; i < checked.length; i++) {
if (!groups.contains(checked[i])) {
different = true;
break;
}
}
if (!different) {
return;
}
}
}
// erase old attributes (if any)
config.setAttribute(IDebugUIConstants.ATTR_DEBUG_FAVORITE, (String)null);
config.setAttribute(IDebugUIConstants.ATTR_RUN_FAVORITE, (String)null);
// new attribute
List groups = null;
for (int i = 0; i < checked.length; i++) {
LaunchGroupExtension group = (LaunchGroupExtension)checked[i];
if (groups == null) {
groups = new ArrayList();
}
groups.add(group.getIdentifier());
}
config.setAttribute(IDebugUIConstants.ATTR_FAVORITE_GROUPS, groups);
} catch (CoreException e) {
DebugUIPlugin.log(e);
}
}
/**
* Convenience method for getting the workspace root.
*/
private IWorkspaceRoot getWorkspaceRoot() {
return ResourcesPlugin.getWorkspace().getRoot();
}
/**
* @see ILaunchConfigurationTab#isValid(ILaunchConfiguration)
*/
public boolean isValid(ILaunchConfiguration config) {
setMessage(null);
setErrorMessage(null);
return validateLocalShared();
}
private boolean validateLocalShared() {
if (isShared()) {
String path = fSharedLocationText.getText().trim();
IContainer container = getContainer(path);
if (container == null || container.equals(ResourcesPlugin.getWorkspace().getRoot())) {
setErrorMessage(LaunchConfigurationsMessages.getString("CommonTab.Invalid_shared_configuration_location_14")); //$NON-NLS-1$
return false;
} else if (!container.getProject().isOpen()) {
setErrorMessage(LaunchConfigurationsMessages.getString("CommonTab.Cannot_save_launch_configuration_in_a_closed_project._1")); //$NON-NLS-1$
return false;
}
}
return true;
}
/**
* @see ILaunchConfigurationTab#setDefaults(ILaunchConfigurationWorkingCopy)
*/
public void setDefaults(ILaunchConfigurationWorkingCopy config) {
config.setContainer(null);
config.setAttribute(IDebugUIConstants.ATTR_TARGET_DEBUG_PERSPECTIVE, IDebugUIConstants.PERSPECTIVE_DEFAULT);
config.setAttribute(IDebugUIConstants.ATTR_TARGET_RUN_PERSPECTIVE, IDebugUIConstants.PERSPECTIVE_DEFAULT);
}
/**
* @see ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy)
*/
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
updateConfigFromDebugPerspective(configuration);
updateConfigFromRunPerspective(configuration);
updateConfigFromLocalShared(configuration);
updateConfigFromFavorites(configuration);
}
/**
* @see ILaunchConfigurationTab#getName()
*/
public String getName() {
return LaunchConfigurationsMessages.getString("CommonTab.&Common_15"); //$NON-NLS-1$
}
/**
* @see ILaunchConfigurationTab#canSave()
*/
public boolean canSave() {
return validateLocalShared();
}
/**
* @see ILaunchConfigurationTab#getImage()
*/
public Image getImage() {
return DebugUITools.getImage(IDebugUIConstants.IMG_PERSPECTIVE_DEBUG);
}
class FavoritesContentProvider implements IStructuredContentProvider {
/**
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
LaunchGroupExtension[] groups = getLaunchConfigurationManager().getLaunchGroups();
List possibleGroups = new ArrayList();
ILaunchConfiguration configuration = (ILaunchConfiguration)inputElement;
for (int i = 0; i < groups.length; i++) {
LaunchGroupExtension extension = groups[i];
LaunchHistory history = getLaunchConfigurationManager().getLaunchHistory(extension.getIdentifier());
if (history != null && history.accepts(configuration)) {
possibleGroups.add(extension);
}
}
return possibleGroups.toArray();
}
/**
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
}
/**
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
public void inputChanged(
Viewer viewer,
Object oldInput,
Object newInput) {
}
}
class FavoritesLabelProvider implements ITableLabelProvider {
private Map fImages = new HashMap();
/**
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
*/
public Image getColumnImage(Object element, int columnIndex) {
Image image = (Image)fImages.get(element);
if (image == null) {
ImageDescriptor descriptor = ((LaunchGroupExtension)element).getImageDescriptor();
if (descriptor != null) {
image = descriptor.createImage();
fImages.put(element, image);
}
}
return image;
}
/**
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
*/
public String getColumnText(Object element, int columnIndex) {
String label = ((LaunchGroupExtension)element).getLabel();
// strip out any '&' (accelerators)
int index = label.indexOf('&');
if (index == 0) {
label = label.substring(1);
} else if (index > 0 && index < (label.length() - 1)){
String first = label.substring(0, index);
String last = label.substring(index + 1);
label = first + last;
}
return label;
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
public void addListener(ILabelProviderListener listener) {
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
*/
public void dispose() {
Iterator images = fImages.values().iterator();
while (images.hasNext()) {
Image image = (Image)images.next();
image.dispose();
}
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
*/
public boolean isLabelProperty(Object element, String property) {
return false;
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
public void removeListener(ILabelProviderListener listener) {
}
}
/**
* Convenience accessor
*/
protected LaunchConfigurationManager getLaunchConfigurationManager() {
return DebugUIPlugin.getDefault().getLaunchConfigurationManager();
}
}