/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.ui.common.table; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; 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.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Control; import org.eclipse.swt.widgets.Group; import org.teiid.designer.ui.common.UiConstants; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.common.widget.ButtonProvider; /** * @param <T> * * @since 8.0 */ public final class TableAndButtonsGroup<T> { static final String ADD_BUTTON = UiConstants.Util.getString("addButton"); //$NON-NLS-1$ static final String EDIT_BUTTON = UiConstants.Util.getString("editButton"); //$NON-NLS-1$ static final String REMOVE_BUTTON = UiConstants.Util.getString("removeButton"); //$NON-NLS-1$ static final String NEW_BUTTON = UiConstants.Util.getString("newButton"); //$NON-NLS-1$ private final Group group; final Table<T> table; final Composite buttonBar; final Map<Button, ButtonProvider> buttonProvidersByButton = new ConcurrentHashMap<Button, ButtonProvider>(); /** * @param <V> * @param parent * @param title * @param tableProvider * @param columnProviders */ public <V> TableAndButtonsGroup( final Composite parent, final String title, final int span, final TableProvider<T> tableProvider, final ColumnProvider<T, V>... columnProviders ) { // Create group surrounding table and buttons group = new Group(parent, SWT.NONE); group.setText(title); group.setLayout(new GridLayout(2, false)); group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, span, 1)); // Create table table = new Table<T>(group, tableProvider, columnProviders); // Create button bar buttonBar = WidgetFactory.createPanel(group, SWT.NO_TRIM, GridData.VERTICAL_ALIGN_CENTER); if (tableProvider.isDoubleClickSupported()) table.getViewer().addDoubleClickListener(new IDoubleClickListener() { @SuppressWarnings( "unchecked" ) @Override public void doubleClick( final DoubleClickEvent event ) { tableProvider.doubleClicked((T)((IStructuredSelection)event.getSelection()).getFirstElement()); } }); } /** * @param buttonProvider */ public void add( final ButtonProvider buttonProvider ) { final Button button = WidgetFactory.createButton(buttonBar, buttonProvider.getText(), GridData.HORIZONTAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_CENTER); button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent event ) { buttonProvider.selected((IStructuredSelection)table.getViewer().getSelection()); table.getViewer().refresh(); } }); if (!buttonProvider.isEnabled((IStructuredSelection)table.getViewer().getSelection())) button.setEnabled(false); if (buttonProvidersByButton.isEmpty()) table.getViewer().addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged( final SelectionChangedEvent event ) { final IStructuredSelection selection = (IStructuredSelection)event.getSelection(); for (final Control control : buttonBar.getChildren()) { if (!(control instanceof Button)) continue; final ButtonProvider provider = buttonProvidersByButton.get(control); if (provider == null) continue; final boolean enabled = provider.isEnabled(selection); if (enabled != control.isEnabled()) control.setEnabled(enabled); } } }); buttonProvidersByButton.put(button, buttonProvider); } /** * @return group */ public Group getGroup() { return group; } /** * @return table */ public Table<T> getTable() { return table; } /** * @param input */ public void setInput( final Object input ) { table.setInput(input); } /** * */ public abstract class AddButtonProvider implements ButtonProvider { /** * */ protected abstract void add(); /** * {@inheritDoc} * * @return {@value TableAndButtonsGroup#ADD_BUTTON} * @see ButtonProvider#getText() */ @Override public final String getText() { return ADD_BUTTON; } /** * {@inheritDoc} * * @return <code>true</code> * @see ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) */ @Override public boolean isEnabled( final IStructuredSelection selection ) { return true; } /** * {@inheritDoc} * <p> * Calls {@link #add()}, then {@link Table#packColumns() packs} the table's columns if this is the first row added. * </p> * * @see ButtonProvider#selected(org.eclipse.jface.viewers.IStructuredSelection) */ @Override public final void selected( final IStructuredSelection selection ) { add(); if (table.getViewer().getTable().getItemCount() == 1) table.packColumns(); } } /** * */ public abstract class EditButtonProvider implements ButtonProvider { /** * {@inheritDoc} * * @return {@value TableAndButtonsGroup#EDIT_BUTTON} * @see ButtonProvider#getText() */ @Override public final String getText() { return EDIT_BUTTON; } /** * {@inheritDoc} * * @return <code>true</code> if the supplied selection contains exactly one element * @see ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) */ @Override public boolean isEnabled( final IStructuredSelection selection ) { return selection.size() == 1; } } /** * */ public abstract class RemoveButtonProvider implements ButtonProvider { /** * {@inheritDoc} * * @return {@value TableAndButtonsGroup#REMOVE_BUTTON} * @see ButtonProvider#getText() */ @Override public final String getText() { return REMOVE_BUTTON; } /** * {@inheritDoc} * * @return <code>true</code> if the supplied selection is not empty * @see ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) */ @Override public boolean isEnabled( final IStructuredSelection selection ) { return !selection.isEmpty(); } } /** * */ public abstract class NewButtonProvider implements ButtonProvider { /** * {@inheritDoc} * * @return {@value TableAndButtonsGroup#NEW_BUTTON} * @see ButtonProvider#getText() */ @Override public final String getText() { return NEW_BUTTON; } /** * {@inheritDoc} * * @return <code>true</code> if the supplied selection is not empty * @see ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) */ @Override public boolean isEnabled( final IStructuredSelection selection ) { return true; } } }