blob: f97f11a831967611876055412f6c02a91ef021a9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
* 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:
* Doug Satchwell (Chase Technology Ltd) - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.xsl.jaxp.debug.ui.internal.tabs.processor;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.wst.xsl.internal.debug.ui.AbstractTableBlock;
import org.eclipse.wst.xsl.internal.debug.ui.XSLDebugUIPlugin;
import org.eclipse.wst.xsl.jaxp.debug.ui.internal.JAXPDebugUIPlugin;
import org.eclipse.wst.xsl.jaxp.launching.IAttribute;
import org.eclipse.wst.xsl.jaxp.launching.IProcessorType;
import org.eclipse.wst.xsl.jaxp.launching.JAXPLaunchConfigurationConstants;
import org.eclipse.wst.xsl.jaxp.launching.JAXPRuntime;
import org.eclipse.wst.xsl.jaxp.launching.LaunchAttributes;
import org.eclipse.wst.xsl.launching.config.LaunchAttribute;
public class AttributesBlock extends AbstractTableBlock
{
private Table table;
private TableViewer tViewer;
private LaunchAttributes attributes;
private Button removeButton;
private Map<String,IAttribute> attributeUris = new HashMap<String,IAttribute>();
public AttributesBlock()
{
for (IProcessorType type : JAXPRuntime.getProcessorTypes())
{
for (IAttribute attribute : type.getAttributes())
{
attributeUris.put(attribute.getURI(), attribute);
}
}
}
@Override
protected IDialogSettings getDialogSettings()
{
return XSLDebugUIPlugin.getDefault().getDialogSettings();
}
@Override
protected String getQualifier()
{
return JAXPDebugUIPlugin.PLUGIN_ID+"."+getClass().getCanonicalName();
}
@Override
protected Table getTable()
{
return table;
}
public void createControl(Composite parent)
{
TabItem item = new TabItem((TabFolder)parent,SWT.NONE);
item.setText("Attributes");
Composite composite = new Composite(parent,SWT.NONE);
GridLayout layout = new GridLayout(2,false);
layout.marginBottom = 0;
layout.marginWidth = 0;
composite.setLayout(layout);
item.setControl(composite);
table = new Table(composite,SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.MULTI);
table.setHeaderVisible(true);
table.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true));
table.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent event) {
if (event.character == SWT.DEL && event.stateMask == 0) {
performRemove();
}
}
});
TableColumn tc1 = new TableColumn(table,SWT.NONE);
tc1.setText("Name");
tc1.setWidth(350);
tc1.setResizable(true);
TableColumn tc2 = new TableColumn(table,SWT.NONE);
tc2.setText("Value");
tc2.setWidth(50);
tc2.setResizable(true);
Composite buttonComp = new Composite(composite,SWT.FILL);
buttonComp.setLayoutData(new GridData(SWT.FILL,SWT.TOP,false,false));
GridLayout gl = new GridLayout();
gl.marginWidth = 0;
buttonComp.setLayout(gl);
Button addButton = new Button(buttonComp,SWT.PUSH);
addButton.setText("Add");
addButton.setLayoutData(new GridData(SWT.FILL,SWT.TOP,false,false));
addButton.addSelectionListener(new SelectionListener(){
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
AttributeDialog dialog = new AttributeDialog(getShell(),attributes);
if (dialog.open() == AttributeDialog.OK)
{
List<IAttribute> newAttributes = dialog.getAttributes();
LaunchAttribute first = null;
for (IAttribute attribute : newAttributes)
{
LaunchAttribute att = new LaunchAttribute(attribute.getURI(),"string",null);
if (first == null)
first = att;
attributes.addAttribute(att);
}
if (newAttributes.size() > 0)
{
tViewer.refresh();
tViewer.setSelection(new StructuredSelection(first), true);
tViewer.editElement(first, 1);
updateLaunchConfigurationDialog();
}
}
}
});
removeButton = new Button(buttonComp,SWT.PUSH);
removeButton.setText("Remove");
removeButton.setLayoutData(new GridData(SWT.FILL,SWT.TOP,false,false));
removeButton.addSelectionListener(new SelectionListener(){
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
performRemove();
}
});
setControl(table);
tViewer = new TableViewer(table);
tViewer.setContentProvider(new IStructuredContentProvider()
{
public Object[] getElements(Object inputElement)
{
return attributes.getAttributes().toArray(new LaunchAttribute[0]);
}
public void dispose()
{
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
attributes = (LaunchAttributes) newInput;
}
});
tViewer.setSorter(new ViewerSorter()
{
@Override
public int compare(Viewer viewer, Object e1, Object e2)
{
LaunchAttribute a1 = (LaunchAttribute) e1;
LaunchAttribute a2 = (LaunchAttribute) e2;
return a1.uri.compareTo(a2.uri);
}
});
tViewer.addSelectionChangedListener(new ISelectionChangedListener(){
public void selectionChanged(SelectionChangedEvent event)
{
updateRemoveButton();
}
});
TableViewerColumn tvc1 = new TableViewerColumn(tViewer,tc1);
tvc1.setLabelProvider(new CellLabelProvider(){
@Override
public void update(ViewerCell cell)
{
LaunchAttribute tv = (LaunchAttribute) cell.getElement();
cell.setText(tv.uri);
}
@Override
public int getToolTipTimeDisplayed(Object object)
{
return 5000;
}
@Override
public String getToolTipText(Object element)
{
LaunchAttribute tv = (LaunchAttribute) element;
return attributeUris.get(tv.uri).getDescription();
}
});
// ColumnViewerToolTipSupport.enableFor(tViewer);
TableViewerColumn tvc2 = new TableViewerColumn(tViewer,tc2);
tvc2.setLabelProvider(new CellLabelProvider(){
@Override
public void update(ViewerCell cell)
{
LaunchAttribute tv = (LaunchAttribute) cell.getElement();
cell.setText(tv.value);
}
});
tvc2.setEditingSupport(new EditingSupport(tViewer){
@Override
protected boolean canEdit(Object element)
{
return true;
}
@Override
protected CellEditor getCellEditor(Object element)
{
return new TextCellEditor(table);
}
@Override
protected Object getValue(Object element)
{
LaunchAttribute tv = (LaunchAttribute)element;
return tv.value == null ? "" : tv.value;
}
@Override
protected void setValue(Object element, Object value)
{
LaunchAttribute tv = (LaunchAttribute)element;
tv.setValue((String)value);
updateLaunchConfigurationDialog();
tViewer.update(tv, null);
}
});
restoreColumnSettings();
}
protected void updateRemoveButton()
{
removeButton.setEnabled(!tViewer.getSelection().isEmpty());
}
public String getName()
{
return Messages.getString("AttributesBlock.16"); //$NON-NLS-1$
}
public void setDefaults(ILaunchConfigurationWorkingCopy configuration)
{
}
private void initializeAttributesFromStorage(ILaunchConfiguration configuration) throws CoreException
{
String s = configuration.getAttribute(JAXPLaunchConfigurationConstants.ATTR_ATTRIBUTES, (String) null);
if (s != null && s.length() > 0)
{
attributes = LaunchAttributes.fromXML(new ByteArrayInputStream(s.getBytes()));
}
else
{
attributes = new LaunchAttributes();
}
tViewer.setInput(attributes);
updateRemoveButton();
}
public void initializeFrom(ILaunchConfiguration configuration)
{
try
{
initializeAttributesFromStorage(configuration);
}
catch (CoreException e)
{
XSLDebugUIPlugin.log(e);
}
}
public void performApply(ILaunchConfigurationWorkingCopy configuration)
{
try
{
String xml = attributes.toXML();
configuration.setAttribute(JAXPLaunchConfigurationConstants.ATTR_ATTRIBUTES, xml);
}
catch (ParserConfigurationException e)
{
XSLDebugUIPlugin.log(e);
}
catch (IOException e)
{
XSLDebugUIPlugin.log(e);
}
catch (TransformerException e)
{
XSLDebugUIPlugin.log(e);
}
}
private void performRemove()
{
IStructuredSelection sel = (IStructuredSelection)tViewer.getSelection();
for (Iterator iterator = sel.iterator(); iterator.hasNext();)
{
LaunchAttribute att = (LaunchAttribute) iterator.next();
attributes.removeAtribute(att.uri);
}
tViewer.refresh();
updateLaunchConfigurationDialog();
}
}