package com.tibco.as.spacebar.ui.wizards.space; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; 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.swt.SWT; 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.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import com.tibco.as.spacebar.ui.model.IElement; public abstract class ElementListEditor extends Composite { private TableViewer tableViewer; private Button addButton; private Button editButton; private Button removeButton; private IElement parentElement; public ElementListEditor(Composite parent, int style, IElement parentElement, ColumnConfig... configs) { super(parent, style); this.parentElement = parentElement; setLayout(new GridLayout(2, false)); Composite tableComposite = new Composite(this, SWT.NONE); tableComposite.setFont(getFont()); tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); TableColumnLayout columnLayout = new TableColumnLayout(); tableComposite.setLayout(columnLayout); GridData tableData = new GridData(GridData.FILL_BOTH); tableData.grabExcessHorizontalSpace = true; tableData.horizontalSpan = 1; tableComposite.setLayoutData(tableData); tableViewer = new TableViewer(tableComposite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); tableViewer.getTable().setHeaderVisible(true); tableViewer.getTable().setLinesVisible(true); tableViewer.getTable().setBackgroundMode(SWT.INHERIT_DEFAULT); tableViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent e) { edit(); } }); tableViewer .addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent e) { updateButtons(); } }); tableViewer.setContentProvider(new ListContentProvider()); for (ColumnConfig config : configs) { TableViewerColumn nameColumn = new TableViewerColumn(tableViewer, config.getStyle()); nameColumn.getColumn().setText(config.getName()); columnLayout .setColumnData( nameColumn.getColumn(), new ColumnWeightData( config.getWeight(), config.getMinimumWidth() == null ? ColumnWeightData.MINIMUM_WIDTH : config.getMinimumWidth(), config .isResizable())); nameColumn.setLabelProvider(config.getLabelProvider()); } Composite buttonsComposite = new Composite(this, SWT.NONE); buttonsComposite.setFont(getFont()); buttonsComposite.setLayout(new GridLayout()); GridData buttonsData = new GridData(GridData.FILL_BOTH); buttonsData.grabExcessHorizontalSpace = false; buttonsData.horizontalSpan = 1; buttonsComposite.setLayoutData(buttonsData); addButton = new Button(buttonsComposite, SWT.PUSH); addButton.setText("&New..."); GridDataFactory.defaultsFor(addButton).applyTo(addButton); addButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { add(); } }); editButton = new Button(buttonsComposite, SWT.PUSH); editButton.setText("&Edit..."); GridDataFactory.defaultsFor(editButton).grab(true, false) .applyTo(editButton); editButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { edit(); } }); removeButton = new Button(buttonsComposite, SWT.PUSH); removeButton.setText("&Remove"); GridDataFactory.defaultsFor(removeButton).grab(true, false) .applyTo(removeButton); removeButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { remove(); } }); createSeparator(buttonsComposite); createSeparator(buttonsComposite); tableViewer.setInput(parentElement.getChildren()); updateButtons(); } private void remove() { for (Object element : ((IStructuredSelection) tableViewer .getSelection()).toArray()) { parentElement.removeChild((IElement) element); } tableViewer.refresh(); } /** * Updates the buttons. */ protected void updateButtons() { IStructuredSelection selection = (IStructuredSelection) tableViewer .getSelection(); editButton.setEnabled(selection.size() == 1); removeButton.setEnabled(selection.size() > 0 && selection.size() <= tableViewer.getTable().getItemCount()); } /** * Creates a separator between buttons. * * @param parent * the parent composite * @return a separator */ private Label createSeparator(Composite parent) { Label separator = new Label(parent, SWT.NONE); separator.setVisible(false); GridData gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.verticalAlignment = GridData.BEGINNING; gd.heightHint = 4; separator.setLayoutData(gd); return separator; } private void add() { IElement element = newElement(parentElement); if (editElement(null, element)) { parentElement.addChild(element); tableViewer.refresh(); tableViewer.setSelection(new StructuredSelection(element)); } } protected abstract IElement newElement(IElement parentElement); protected abstract boolean editElement(IElement original, IElement edited); private void edit() { IStructuredSelection selection = (IStructuredSelection) tableViewer .getSelection(); Object[] objects = selection.toArray(); if ((objects == null) || (objects.length != 1)) { return; } IElement element = (IElement) selection.getFirstElement(); IElement edited = element.clone(); if (editElement(element, edited)) { edited.copyTo(element); tableViewer.refresh(element); updateButtons(); tableViewer.setSelection(new StructuredSelection(element)); } } }