blob: d852b6979fea102a7543d97ae4914e99e550976c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Obeo.
* 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:
* Obeo - initial API and implementation
* IBM Corporation - Bug fixes
*******************************************************************************/
package org.eclipse.debug.ui;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Collectors;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.internal.core.LaunchConfiguration;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsMessages;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewerColumn;
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.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.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
/**
* Launch configuration tab used to specify the prototype associated with a
* launch configuration, and also listed attributes from prototype shared with
* the launch configuration.
* <p>
* Clients may call {@link #setHelpContextId(String)} on this tab prior to
* control creation to alter the default context help associated with this tab.
* </p>
* <p>
* Clients may instantiate this class only if the associated launch
* configuration type allows prototypes.
*
* @see ILaunchConfigurationType#supportsPrototypes()
* </p>
*
* @since 3.13
* @noextend This class is not intended to be subclassed by clients.
*/
public class ProtoypeTab extends AbstractLaunchConfigurationTab {
private static final String PROTOTYPE_TAB_ID = "org.eclipse.debug.ui.prototypeTab"; //$NON-NLS-1$
private static final String ATTRIBUTE = "Attribute"; //$NON-NLS-1$
private static final String MODIFIED = "Modified"; //$NON-NLS-1$
private static final String PROTOTYPE_VALUE = "Prototype Value"; //$NON-NLS-1$
private ILaunchConfiguration fSelectedLaunchConfiguration;
private ILaunchConfiguration fAppliedPrototype;
private Composite fPrototypeComposite;
private Text fPrototypeText;
private ControlDecoration fPrototypeTextDecoration;
private Button fLinkPrototypeButton;
private Button fUnlinkPrototypeButton;
private Button fResetPrototypeButton;
private CheckboxTreeViewer fAttributesTreeViewer;
/**
* Constructs a new tab with default context help.
*/
public ProtoypeTab() {
setHelpContextId(IDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_PROTOTYPE_TAB);
}
/*
* (non-Javadoc)
* @see
* org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.
* swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
Composite comp = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_BOTH);
setControl(comp);
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), getHelpContextId());
createConfigPrototypeComponent(comp);
createPrototypeExplanationsComponent(comp);
createPrototypeAttributesTreeComponent(comp);
}
/**
* Creates the config prototype location component
*
* @param parent the parent composite to add this component to
*/
private void createConfigPrototypeComponent(Composite parent) {
fPrototypeComposite = new Composite(parent, SWT.NONE);
fPrototypeComposite.setLayout(new GridLayout(5, false));
fPrototypeComposite.setFont(parent.getFont());
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false);
fPrototypeComposite.setLayoutData(gd);
SWTFactory.createLabel(fPrototypeComposite, LaunchConfigurationsMessages.PrototypeTab_Label_2, 1);
fPrototypeText = SWTFactory.createSingleText(fPrototypeComposite, 1);
fPrototypeText.setEditable(false);
fPrototypeTextDecoration = new ControlDecoration(fPrototypeText, SWT.TOP | SWT.LEFT);
FieldDecoration errorDecoration = FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_ERROR);
fPrototypeTextDecoration.setDescriptionText(LaunchConfigurationsMessages.PrototypeTab_Select_Prototype_Error_7);
fPrototypeTextDecoration.setImage(errorDecoration.getImage());
fLinkPrototypeButton = SWTFactory.createPushButton(fPrototypeComposite, LaunchConfigurationsMessages.PrototypeTab_Link_Button_Label_3, null);
fLinkPrototypeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
handleLinkPrototypeButtonSelected();
}
});
fUnlinkPrototypeButton = SWTFactory.createPushButton(fPrototypeComposite, LaunchConfigurationsMessages.PrototypeTab_Unlink_Button_Label_4, null);
fUnlinkPrototypeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
handleUnlinkPrototypeButtonSelected();
}
});
fResetPrototypeButton = SWTFactory.createPushButton(fPrototypeComposite, LaunchConfigurationsMessages.PrototypeTab_Reset_Button_Label_8, null);
fResetPrototypeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
handleResetPrototypeButtonSelected();
}
});
}
/**
* Creates the prototype explanations component
*
* @param parent the parent composite to add this component to
*/
private void createPrototypeExplanationsComponent(Composite parent) {
SWTFactory.createLabel(parent, LaunchConfigurationsMessages.PrototypeTab_Explanation_Label_10, 1);
SWTFactory.createLabel(parent, LaunchConfigurationsMessages.PrototypeTab_Explanation_Label_11, 1);
}
/**
* Creates the prototype attributes tree component
*
* @param parent the parent composite to add this one to
*/
private void createPrototypeAttributesTreeComponent(Composite parent) {
Composite attributesPrototypeTableComposite = new Composite(parent, SWT.NONE);
attributesPrototypeTableComposite.setLayout(new GridLayout(1, false));
attributesPrototypeTableComposite.setFont(parent.getFont());
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
attributesPrototypeTableComposite.setLayoutData(gd);
fAttributesTreeViewer = createCheckboxTreeViewer(attributesPrototypeTableComposite);
}
/**
* Update prototype text widget decorator.
*/
private void updateProductDecorator() {
if (fAppliedPrototype != null && !fAppliedPrototype.exists()) {
fPrototypeTextDecoration.show();
} else {
fPrototypeTextDecoration.hide();
}
}
/**
* Handles the config prototype apply button being selected
*/
private void handleLinkPrototypeButtonSelected() {
String currentSelectedPrototypeString = fPrototypeText.getText();
DecoratingLabelProvider labelProvider = new DecoratingLabelProvider(DebugUITools.newDebugModelPresentation(), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator());
ElementListSelectionDialog selectPrototypeDialog = new ElementListSelectionDialog(getShell(), labelProvider);
try {
ILaunchConfigurationType type = fSelectedLaunchConfiguration.getType();
ILaunchConfiguration[] prototypes = type.getPrototypes();
selectPrototypeDialog.setElements(prototypes);
selectPrototypeDialog.setMultipleSelection(false);
selectPrototypeDialog.setTitle(LaunchConfigurationsMessages.PrototypeTab_Select_Message_5);
selectPrototypeDialog.setEmptySelectionMessage(LaunchConfigurationsMessages.PrototypeTab_Select_Empty_Message_6);
selectPrototypeDialog.setInitialSelections(getPrototype(prototypes, currentSelectedPrototypeString));
int open = selectPrototypeDialog.open();
if (open == Window.OK) {
Object selectedPrototype = selectPrototypeDialog.getFirstResult();
if (selectedPrototype instanceof ILaunchConfiguration) {
fAppliedPrototype = (ILaunchConfiguration) selectedPrototype;
ILaunchConfigurationWorkingCopy workingCopy = getWorkingCopy();
workingCopy.setPrototype(fAppliedPrototype, true);
fPrototypeText.setText(((ILaunchConfiguration) selectedPrototype).getName());
fAttributesTreeViewer.setInput(fAppliedPrototype);
fUnlinkPrototypeButton.setEnabled(true);
fResetPrototypeButton.setEnabled(true);
updateColumnsWidth();
updateProductDecorator();
setDirty(true);
updateLaunchConfigurationDialog();
reinitTabs(workingCopy);
}
}
} catch (CoreException e) {
DebugUIPlugin.log(e.getStatus());
}
}
/**
* Handles the config prototype unapply button being selected
*/
private void handleUnlinkPrototypeButtonSelected() {
try {
fAppliedPrototype = null;
ILaunchConfigurationWorkingCopy workingCopy = getWorkingCopy();
workingCopy.setPrototype(null, false);
fPrototypeText.setText(""); //$NON-NLS-1$
fAttributesTreeViewer.setInput(null);
fUnlinkPrototypeButton.setEnabled(false);
fResetPrototypeButton.setEnabled(false);
updateProductDecorator();
setDirty(true);
updateLaunchConfigurationDialog();
reinitTabs(workingCopy);
} catch (CoreException e) {
DebugUIPlugin.log(e.getStatus());
}
}
/**
* Handles the config prototype reset button being selected
*/
private void handleResetPrototypeButtonSelected() {
try {
ILaunchConfigurationWorkingCopy workingCopy = getWorkingCopy();
workingCopy.setPrototype(fAppliedPrototype, true);
fAttributesTreeViewer.refresh();
setDirty(true);
updateLaunchConfigurationDialog();
reinitTabs(workingCopy);
} catch (CoreException e) {
DebugUIPlugin.log(e.getStatus());
}
}
/**
* Get the working copy of the launch configuration associated with this
* tab.
*
* @return an {@link ILaunchConfigurationWorkingCopy}.
* @throws CoreException
*/
private ILaunchConfigurationWorkingCopy getWorkingCopy() throws CoreException {
ILaunchConfigurationWorkingCopy workingCopy;
if (fSelectedLaunchConfiguration instanceof ILaunchConfigurationWorkingCopy) {
workingCopy = (ILaunchConfigurationWorkingCopy) fSelectedLaunchConfiguration;
} else {
workingCopy = fSelectedLaunchConfiguration.getWorkingCopy();
}
return workingCopy;
}
/**
* Reinit the tabs of the launch configuration dialog.
*
* @param launchConfiguration the {@link LaunchConfiguration}.
*/
private void reinitTabs(ILaunchConfiguration launchConfiguration) {
ILaunchConfigurationTab[] tabs = getLaunchConfigurationDialog().getTabs();
for (ILaunchConfigurationTab configTab : tabs) {
configTab.initializeFrom(launchConfiguration);
}
}
/**
* Get the prototype with the given name in the given prototypes list.
*
* @param prototypes the prototypes list
* @param name the prototype to get
* @return the prototype with the given name in the given prototypes list.
*/
private Object[] getPrototype(ILaunchConfiguration[] prototypes, String name) {
for (ILaunchConfiguration prototype : prototypes) {
if (name.equals(prototype.getName())) {
return new Object[] { prototype };
}
}
return new Object[0];
}
/**
* Creates the checkbox tree viewer that contains attributes.
*
* @param parent the parent composite to add this one to
* @return a {@link CheckboxTreeViewer}
*/
private CheckboxTreeViewer createCheckboxTreeViewer(Composite parent) {
Tree tree = new Tree(parent, SWT.MULTI | SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
tree.setLayoutData(gd);
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
CheckboxTreeViewer treeViewer = new CheckboxTreeViewer(tree);
treeViewer.setContentProvider(new PrototypeAttributesContentProvider());
treeViewer.setCheckStateProvider(new AttributesTreeCheckStateProvider());
treeViewer.addCheckStateListener(new AttributesTreeCheckStateListener());
MenuManager menuMgr = new MenuManager();
Menu contextMenu = menuMgr.createContextMenu(tree);
menuMgr.addMenuListener(new ResetMenuListener());
menuMgr.setRemoveAllWhenShown(true);
tree.setMenu(contextMenu);
return treeViewer;
}
/**
* Add columns to the given {@link CheckboxTreeViewer}.
*
* @param treeViewer the given {@link CheckboxTreeViewer}.
*/
private void addColumnsToTreeViewer(CheckboxTreeViewer treeViewer) {
for (TreeColumn treeColumn : treeViewer.getTree().getColumns()) {
treeColumn.dispose();
}
TreeViewerColumn columnLabel = new TreeViewerColumn(treeViewer, SWT.LEFT, 0);
columnLabel.setLabelProvider(new ColumnAttributeLabelProvider());
columnLabel.getColumn().setText(ATTRIBUTE);
if (fSelectedLaunchConfiguration != null && !fSelectedLaunchConfiguration.isPrototype()) {
TreeViewerColumn columnModified = new TreeViewerColumn(treeViewer, SWT.CENTER, 1);
columnModified.setLabelProvider(new ColumnModifiedLabelProvider());
columnModified.getColumn().setText(MODIFIED);
}
TreeViewerColumn columnValue = new TreeViewerColumn(treeViewer, SWT.LEFT, fSelectedLaunchConfiguration != null && !fSelectedLaunchConfiguration.isPrototype() ? 2 : 1);
columnValue.setLabelProvider(new ColumnValueLabelProvider());
columnValue.getColumn().setText(PROTOTYPE_VALUE);
}
/*
* (non-Javadoc)
* @see
* org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.
* debug.core.ILaunchConfiguration)
*/
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
initialize(configuration);
}
/*
* (non-Javadoc)
* @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#dispose()
*/
@Override
public void dispose() {
super.dispose();
}
/*
* (non-Javadoc)
* @see
* org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.
* core.ILaunchConfigurationWorkingCopy)
*/
@Override
public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
initialize(workingCopy);
}
/*
* (non-Javadoc)
* @see
* org.eclipse.debug.ui.ILaunchConfigurationTab#deactivated(org.eclipse.
* debug.core.ILaunchConfigurationWorkingCopy)
*/
@Override
public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
}
/**
* Initialize this tab with the given configuration.
*
* @param configuration the given configuration
* @see ProtoypeTab#activated(ILaunchConfigurationWorkingCopy)
* @see ProtoypeTab#initializeFrom(ILaunchConfiguration)
*/
private void initialize(ILaunchConfiguration configuration) {
try {
if (configuration.isPrototype()) {
fPrototypeComposite.setVisible(false);
GridData gridData = (GridData) fPrototypeComposite.getLayoutData();
gridData.exclude = true;
fAppliedPrototype = configuration;
fSelectedLaunchConfiguration = configuration;
addColumnsToTreeViewer(fAttributesTreeViewer);
fAttributesTreeViewer.setInput(fAppliedPrototype);
fAttributesTreeViewer.getTree().setEnabled(true);
} else {
fPrototypeComposite.setVisible(true);
GridData gridData = (GridData) fPrototypeComposite.getLayoutData();
gridData.exclude = false;
fSelectedLaunchConfiguration = configuration;
fAppliedPrototype = configuration.getPrototype();
addColumnsToTreeViewer(fAttributesTreeViewer);
fAttributesTreeViewer.getTree().setEnabled(false);
if (fAppliedPrototype == null) {
fPrototypeText.setText(""); //$NON-NLS-1$
fUnlinkPrototypeButton.setEnabled(false);
fResetPrototypeButton.setEnabled(false);
fAttributesTreeViewer.setInput(null);
} else if (!fAppliedPrototype.exists()) {
fPrototypeText.setText(fAppliedPrototype.getName());
fUnlinkPrototypeButton.setEnabled(true);
fResetPrototypeButton.setEnabled(true);
fAttributesTreeViewer.setInput(null);
} else {
fPrototypeText.setText(fAppliedPrototype.getName());
fUnlinkPrototypeButton.setEnabled(true);
fResetPrototypeButton.setEnabled(true);
fAttributesTreeViewer.setInput(fAppliedPrototype);
}
}
updateProductDecorator();
updateColumnsWidth();
} catch (CoreException e) {
DebugUIPlugin.log(e.getStatus());
}
}
/**
* Set columns tree widths dynamically
*/
private void updateColumnsWidth() {
getShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
Tree tree = fAttributesTreeViewer.getTree();
if (tree != null && !tree.isDisposed()) {
TreeColumn[] columns = tree.getColumns();
for (TreeColumn treeColumn : columns) {
treeColumn.pack();
}
}
}
});
}
/*
* (non-Javadoc)
* @see
* org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug.
* core.ILaunchConfiguration)
*/
@Override
public boolean isValid(ILaunchConfiguration config) {
setMessage(null);
setErrorMessage(null);
if (fAppliedPrototype != null && !fAppliedPrototype.exists()) {
setErrorMessage(LaunchConfigurationsMessages.PrototypeTab_Select_Prototype_Error_7);
return false;
}
return !config.isPrototype();
}
/*
* (non-Javadoc)
* @see
* org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.
* debug.core.ILaunchConfigurationWorkingCopy)
*/
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy config) {
}
/*
* (non-Javadoc)
* @see
* org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.
* debug.core.ILaunchConfigurationWorkingCopy)
*/
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
}
/*
* (non-Javadoc)
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
*/
@Override
public String getName() {
return LaunchConfigurationsMessages.PrototypeTab_Prototype_1;
}
/*
* (non-Javadoc)
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
*/
@Override
public Image getImage() {
return DebugUITools.getImage(IInternalDebugUIConstants.IMG_OBJS_PROTO_TAB);
}
/**
* @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
*
*/
@Override
public String getId() {
return PROTOTYPE_TAB_ID;
}
/*
* (non-Javadoc)
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#canSave()
*/
@Override
public boolean canSave() {
return true;
}
/**
* Check if an attribute from the selected launch configuration is different
* from its prototype.
*
* @param element the given attribute.
*/
private boolean isAttributeModified(Entry<String, Object> element) {
try {
if (fSelectedLaunchConfiguration != null && !fSelectedLaunchConfiguration.isPrototype()) {
return fSelectedLaunchConfiguration.isAttributeModified(element.getKey());
}
} catch (CoreException e) {
DebugUIPlugin.log(e.getStatus());
}
return false;
}
/**
* Content provider for the prototype attributes table
*/
private class PrototypeAttributesContentProvider implements ITreeContentProvider {
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof ILaunchConfiguration) {
try {
Map<String, Object> attributes = ((ILaunchConfiguration) inputElement).getAttributes();
return attributes.entrySet().toArray();
} catch (CoreException e) {
DebugUIPlugin.log(e.getStatus());
}
}
return new Object[0];
}
@Override
public Object[] getChildren(Object parentElement) {
return null;
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
return false;
}
}
/**
* Label provider for the prototype attributes tree column "Edited"
*/
private class ColumnModifiedLabelProvider extends ColumnLabelProvider {
@SuppressWarnings("unchecked")
@Override
public String getText(Object element) {
if (fSelectedLaunchConfiguration != null && !fSelectedLaunchConfiguration.isPrototype()) {
if (element instanceof Entry && isAttributeModified((Entry<String, Object>) element)) {
return "true"; //$NON-NLS-1$
}
}
return "false"; //$NON-NLS-1$
}
}
/**
* Label provider for the prototype attributes tree column "Attribute"
*/
@SuppressWarnings({ "unchecked" })
private class ColumnAttributeLabelProvider extends ColumnLabelProvider {
@Override
public String getText(Object element) {
String key = ((Entry<String, Object>) element).getKey();
ILaunchConfigurationTab[] tabs = getLaunchConfigurationDialog().getTabs();
for (ILaunchConfigurationTab tab : tabs) {
if (tab instanceof AbstractLaunchConfigurationTab) {
String attributeLabel = ((AbstractLaunchConfigurationTab) tab).getAttributeLabel(key);
if (attributeLabel != null) {
return attributeLabel;
}
}
}
return key;
}
}
/**
* Label provider for the prototype attributes tree column "Value"
*/
@SuppressWarnings({ "unchecked" })
private class ColumnValueLabelProvider extends ColumnLabelProvider {
@Override
public String getText(Object element) {
Object value = ((Entry<String, Object>) element).getValue();
if (value instanceof Boolean) {
return ((Boolean) value).toString();
} else if (value instanceof String) {
return (String) value;
} else if (value instanceof Integer) {
return value.toString();
} else if (value instanceof List) {
return "[" + ((List<String>) value).stream().collect(Collectors.joining(", ")) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} else if (value instanceof Set) {
return "[" + ((Set<String>) value).stream().collect(Collectors.joining(", ")) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} else if (value instanceof Map) {
return "[" + ((Map<String, String>) value).entrySet().stream().map(i -> "[" + i.getKey() + ", " + i.getValue() + "]").collect(Collectors.joining(", ")) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
}
return super.getText(element);
}
}
/**
* Check state provider for attributes tree.
*/
@SuppressWarnings("unchecked")
private class AttributesTreeCheckStateProvider implements ICheckStateProvider {
@Override
public boolean isGrayed(Object element) {
return false;
}
@Override
public boolean isChecked(Object element) {
try {
if (element instanceof Entry) {
return fAppliedPrototype.getPrototypeVisibleAttributes().contains(((Entry<String, Object>) element).getKey());
}
} catch (CoreException e) {
DebugUIPlugin.log(e.getStatus());
}
return false;
}
}
/**
* Check state listener for attributes tree.
*/
@SuppressWarnings("unchecked")
private class AttributesTreeCheckStateListener implements ICheckStateListener {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
try {
Object data = event.getElement();
if (data instanceof Entry) {
fAppliedPrototype.setPrototypeAttributeVisibility(((Entry<String, Object>) data).getKey(), event.getChecked());
setDirty(true);
updateLaunchConfigurationDialog();
}
} catch (CoreException e) {
DebugUIPlugin.log(e.getStatus());
}
}
}
/**
* Menu Listener for attributes table.
*/
private class ResetMenuListener implements IMenuListener {
@Override
public void menuAboutToShow(IMenuManager manager) {
if (fSelectedLaunchConfiguration != null && !fSelectedLaunchConfiguration.isPrototype()) {
manager.add(new ResetAction());
}
}
}
/**
* Reset attribute menu action.
*/
@SuppressWarnings("unchecked")
private class ResetAction extends Action {
@Override
public String getText() {
return LaunchConfigurationsMessages.PrototypeTab_Reset_Menu_Action_9;
}
@Override
public void run() {
IStructuredSelection selection = (IStructuredSelection) fAttributesTreeViewer.getSelection();
try {
ILaunchConfigurationWorkingCopy workingCopy = getWorkingCopy();
for (Object element : selection.toList()) {
if (element instanceof Entry) {
String key = ((Entry<String, Object>) element).getKey();
if (fAppliedPrototype.getPrototypeVisibleAttributes().contains(key)) {
Object prototypeValue = fAppliedPrototype.getAttributes().get(key);
workingCopy.setAttribute(key, prototypeValue);
}
}
}
setDirty(true);
updateLaunchConfigurationDialog();
reinitTabs(workingCopy);
} catch (CoreException e) {
DebugUIPlugin.log(e.getStatus());
}
}
}
}