diff options
Diffstat (limited to 'plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/launch/TCFPathMapTab.java')
-rw-r--r-- | plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/launch/TCFPathMapTab.java | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/launch/TCFPathMapTab.java b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/launch/TCFPathMapTab.java new file mode 100644 index 000000000..f0e0b638c --- /dev/null +++ b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/launch/TCFPathMapTab.java @@ -0,0 +1,285 @@ +/******************************************************************************* + * Copyright (c) 2009, 2011 Wind River Systems, Inc. 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: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.tm.internal.tcf.debug.ui.launch; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; +import org.eclipse.jface.viewers.CellEditor; +import org.eclipse.jface.viewers.ICellModifier; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TextCellEditor; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +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.Composite; +import org.eclipse.swt.widgets.Item; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.tm.internal.tcf.debug.launch.TCFLaunchDelegate; +import org.eclipse.tm.internal.tcf.debug.launch.TCFLaunchDelegate.PathMapRule; +import org.eclipse.tm.internal.tcf.debug.ui.Activator; +import org.eclipse.tm.internal.tcf.debug.ui.ImageCache; +import org.eclipse.tm.tcf.services.IPathMap; + +// TODO: add source lookup container that represents ATTR_PATH_MAP +public class TCFPathMapTab extends AbstractLaunchConfigurationTab { + + private TableViewer viewer; + private Button button_remove; + private Button button_new; + + private static final String[] column_ids = { + IPathMap.PROP_SOURCE, + IPathMap.PROP_DESTINATION, + IPathMap.PROP_CONTEXT, + }; + + private static final int[] column_size = { + 300, + 300, + 50, + }; + + private static final String TAB_ID = "org.eclipse.tm.tcf.launch.pathMapTab"; + + private ArrayList<PathMapRule> map; + + private class FileMapContentProvider implements IStructuredContentProvider { + + public Object[] getElements(Object input) { + return map.toArray(new PathMapRule[map.size()]); + } + + public void inputChanged(Viewer viewer, Object old_input, Object new_input) { + } + + public void dispose() { + } + } + + private class FileMapLabelProvider extends LabelProvider implements ITableLabelProvider { + + public Image getColumnImage(Object element, int column) { + if (column == 0) return ImageCache.getImage(ImageCache.IMG_ATTRIBUTE); + return null; + } + + public String getColumnText(Object element, int column) { + PathMapRule e = (PathMapRule)element; + Object o = e.getProperties().get(column_ids[column]); + if (o == null) return ""; + return o.toString(); + } + } + + private class FileMapCellModifier implements ICellModifier { + + public boolean canModify(Object element, String property) { + return true; + } + + public Object getValue(Object element, String property) { + if (element instanceof Item) element = ((Item)element).getData(); + PathMapRule a = (PathMapRule)element; + Object o = a.getProperties().get(property); + if (o == null) return ""; + return o.toString(); + } + + public void modify(Object element, String property, Object value) { + if (element instanceof Item) element = ((Item)element).getData(); + PathMapRule a = (PathMapRule)element; + if ("".equals(value)) a.getProperties().remove(property); + else a.getProperties().put(property, value); + viewer.update(element, new String[] { property }); + updateLaunchConfigurationDialog(); + } + } + + private Exception init_error; + + public String getName() { + return "Path Map"; + } + + @Override + public Image getImage() { + return ImageCache.getImage(ImageCache.IMG_PATH); + } + + @Override + public String getId() { + return TAB_ID; + } + + public void createControl(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(1, false); + composite.setFont(parent.getFont()); + composite.setLayout(layout); + composite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true, 1, 1)); + createTable(composite); + setControl(composite); + } + + private void createTable(Composite parent) { + Font font = parent.getFont(); + Label map_label = new Label(parent, SWT.WRAP); + map_label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + map_label.setFont(font); + map_label.setText("File path &map rules:"); + + Composite composite = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(2, false); + composite.setFont(font); + composite.setLayout(layout); + composite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true, 1, 1)); + + viewer = new TableViewer(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION); + Table table = viewer.getTable(); + table.setLayoutData(new GridData(GridData.FILL_BOTH)); + table.setHeaderVisible(true); + table.setLinesVisible(true); + table.setFont(font); + viewer.setContentProvider(new FileMapContentProvider()); + viewer.setLabelProvider(new FileMapLabelProvider()); + viewer.setColumnProperties(column_ids); + + CellEditor[] editors = new CellEditor[column_ids.length]; + for (int i = 0; i < column_ids.length; i++) { + TableColumn c = new TableColumn(table, SWT.NONE, i); + c.setText(column_ids[i]); + c.setWidth(column_size[i]); + editors[i] = new TextCellEditor(table); + } + viewer.setCellEditors(editors); + viewer.setCellModifier(new FileMapCellModifier()); + createTableButtons(composite); + viewer.addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + updateLaunchConfigurationDialog(); + } + }); + } + + private void createTableButtons(Composite parent) { + Font font = parent.getFont(); + Composite composite = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + composite.setFont(font); + composite.setLayout(layout); + composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL)); + + button_new = new Button(composite, SWT.PUSH); + button_new.setText("&Add"); + button_new.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + button_new.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + PathMapRule a = new PathMapRule(new HashMap<String,Object>()); + a.getProperties().put(IPathMap.PROP_ID, "PR" + System.currentTimeMillis()); + map.add(a); + viewer.add(a); + viewer.setSelection(new StructuredSelection(a), true); + viewer.getTable().setFocus(); + updateLaunchConfigurationDialog(); + } + }); + + button_remove = new Button(composite, SWT.PUSH); + button_remove.setText("&Remove"); + button_remove.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + button_remove.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + for (Iterator<?> i = ((IStructuredSelection)viewer.getSelection()).iterator(); i.hasNext();) { + PathMapRule a = (PathMapRule)i.next(); + map.remove(a); + viewer.remove(a); + } + updateLaunchConfigurationDialog(); + } + }); + } + + List<IPathMap.PathMapRule> getPathMap() { + List<IPathMap.PathMapRule> l = new ArrayList<IPathMap.PathMapRule>(); + for (PathMapRule r : map) l.add(r); + return Collections.unmodifiableList(l); + } + + public void initializeFrom(ILaunchConfiguration config) { + setErrorMessage(null); + setMessage(null); + try { + String s = config.getAttribute(TCFLaunchDelegate.ATTR_PATH_MAP, ""); + map = TCFLaunchDelegate.parsePathMapAttribute(s); + viewer.setInput(config); + button_remove.setEnabled(!viewer.getSelection().isEmpty()); + } + catch (Exception e) { + init_error = e; + setErrorMessage("Cannot read launch configuration: " + e); + Activator.log(e); + } + } + + public void performApply(ILaunchConfigurationWorkingCopy config) { + StringBuffer bf = new StringBuffer(); + for (PathMapRule m : map) bf.append(m.toString()); + if (bf.length() == 0) config.removeAttribute(TCFLaunchDelegate.ATTR_PATH_MAP); + else config.setAttribute(TCFLaunchDelegate.ATTR_PATH_MAP, bf.toString()); + } + + public void setDefaults(ILaunchConfigurationWorkingCopy config) { + config.removeAttribute(TCFLaunchDelegate.ATTR_PATH_MAP); + } + + @Override + protected void updateLaunchConfigurationDialog() { + super.updateLaunchConfigurationDialog(); + button_remove.setEnabled(!viewer.getSelection().isEmpty()); + } + + @Override + public boolean isValid(ILaunchConfiguration config) { + setMessage(null); + + if (init_error != null) { + setErrorMessage("Cannot read launch configuration: " + init_error); + return false; + } + + setErrorMessage(null); + return true; + } +} |