| /******************************************************************************* |
| * Copyright (c) 2010 SAP AG. |
| * 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: |
| * Emil Simeonov - initial API and implementation. |
| * Dimitar Donchev - initial API and implementation. |
| * Dimitar Tenev - initial API and implementation. |
| * Nevena Manova - initial API and implementation. |
| * Georgi Konstantinov - initial API and implementation. |
| *******************************************************************************/ |
| package org.eclipse.wst.sse.sieditor.ui.v2.sections.tables; |
| |
| import java.util.Arrays; |
| |
| import org.eclipse.jface.layout.GridDataFactory; |
| import org.eclipse.jface.viewers.EditingSupport; |
| import org.eclipse.jface.viewers.IContentProvider; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| 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.swt.SWT; |
| import org.eclipse.swt.events.ControlAdapter; |
| import org.eclipse.swt.events.ControlEvent; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.graphics.Rectangle; |
| 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.Table; |
| import org.eclipse.ui.forms.widgets.FormToolkit; |
| |
| import org.eclipse.wst.sse.sieditor.ui.i18n.Messages; |
| |
| public class FacetTable { |
| |
| private final TableViewer tableViewer; |
| private final Button addButton; |
| private final Button removeButton; |
| private final TableViewerColumn column; |
| |
| private RemoveHandler removeHandler; |
| private AddHandler addHandler; |
| |
| private final SelectionListener addButtonListener = new SelectionListener() { |
| @Override |
| public void widgetDefaultSelected(SelectionEvent e) { |
| widgetSelected(e); |
| } |
| |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| |
| if (addHandler != null && addHandler.addElement()) { |
| Object input = tableViewer.getInput(); |
| IStructuredContentProvider contentProvider = (IStructuredContentProvider)tableViewer.getContentProvider(); |
| |
| Object[] elements = contentProvider.getElements(input); |
| if(elements != null && elements.length > 0) { |
| Object newlySelected = elements[elements.length-1]; |
| tableViewer.setSelection(new StructuredSelection(newlySelected), true); |
| } |
| } |
| } |
| }; |
| |
| private final SelectionListener removeButtonListener = new SelectionListener() { |
| @Override |
| public void widgetDefaultSelected(SelectionEvent e) { |
| widgetSelected(e); |
| } |
| |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| |
| if (removeHandler != null) { |
| |
| Object selectedForRemove = ((IStructuredSelection)tableViewer.getSelection()).getFirstElement(); |
| |
| Object input = tableViewer.getInput(); |
| IStructuredContentProvider contentProvider = (IStructuredContentProvider)tableViewer.getContentProvider(); |
| |
| Object[] elements = contentProvider.getElements(input); |
| int index = Arrays.asList(elements).indexOf(selectedForRemove); |
| |
| removeHandler.removeElement(selectedForRemove); |
| |
| int itemCount = tableViewer.getTable().getItemCount(); |
| if (itemCount > 0) { |
| index = Math.min(index, itemCount - 1); |
| |
| elements = contentProvider.getElements(input); |
| Object newlySelected = elements[index]; |
| tableViewer.setSelection(new StructuredSelection(newlySelected), true); |
| removeButton.forceFocus(); |
| } |
| } |
| |
| |
| } |
| }; |
| |
| private final ISelectionChangedListener tableViewerSelectionListener = new ISelectionChangedListener() { |
| public void selectionChanged(SelectionChangedEvent event) { |
| boolean isEmpty = event.getSelection().isEmpty(); |
| removeButton.setEnabled(!isEmpty); |
| } |
| }; |
| private boolean isEnabled = true; |
| |
| public FacetTable(final FormToolkit toolkit, final Composite composite, final IContentProvider contentProvider, |
| final ILabelProvider labelProvider) { |
| |
| final GridLayout layout = new GridLayout(); |
| layout.numColumns = 2; |
| layout.marginWidth = 1; |
| layout.marginHeight = 0; |
| layout.marginTop = 1; // added in order the top line of displayed |
| // tables to be visible. |
| composite.setLayout(layout); |
| |
| final Table table = toolkit.createTable(composite, SWT.V_SCROLL | SWT.H_SCROLL); |
| tableViewer = new TableViewer(table); |
| table.setLinesVisible(true); |
| //setUp the horizontalBat to be invisible |
| table.getHorizontalBar().setVisible(false); |
| |
| column = new TableViewerColumn(tableViewer, SWT.NONE); |
| tableViewer.setContentProvider(contentProvider); |
| tableViewer.setLabelProvider(labelProvider); |
| tableViewer.addSelectionChangedListener(tableViewerSelectionListener); |
| |
| addButton = toolkit.createButton(composite, Messages.SimpleTypeConstraintsSection_add, SWT.PUSH); |
| GridDataFactory.swtDefaults().align(SWT.FILL, SWT.END).applyTo(addButton); |
| addButton.addSelectionListener(addButtonListener); |
| |
| removeButton = toolkit.createButton(composite, Messages.SimpleTypeConstraintsSection_remove, SWT.PUSH); |
| GridDataFactory.swtDefaults().align(SWT.FILL, SWT.BEGINNING).applyTo(removeButton); |
| removeButton.addSelectionListener(removeButtonListener ); |
| |
| final int maxHeight = table.getItemHeight() * 2; |
| GridDataFactory.swtDefaults().grab(true, false).align(SWT.FILL, SWT.CENTER).span(1, 2).hint(SWT.DEFAULT, maxHeight) |
| .applyTo(table); |
| table.addControlListener(new ControlAdapter() { |
| @Override |
| public void controlResized(final ControlEvent e) { |
| final Rectangle area = table.getBounds(); |
| int width = area.width - 2 * table.getBorderWidth(); |
| if (table.getItems().length > 2) { |
| // Subtract the scrollbar width from the total column |
| // width |
| // if a vertical scrollbar will be required |
| final Point vBarSize = table.getVerticalBar().getSize(); |
| width -= vBarSize.x; |
| } |
| column.getColumn().setWidth(width); |
| } |
| }); |
| |
| toolkit.paintBordersFor(composite); |
| |
| } |
| |
| public TableViewer getTableViewer() { |
| return tableViewer; |
| } |
| |
| public void setAddHandler(final AddHandler handler) { |
| addHandler = handler; |
| } |
| |
| public void setRemoveHandler(final RemoveHandler handler) { |
| removeHandler = handler; |
| } |
| |
| public void setEditingSupport(final EditingSupport editingSupport) { |
| column.setEditingSupport(editingSupport); |
| } |
| |
| public Control getAddPatternButton() { |
| return addButton; |
| } |
| |
| public Control getRemovePatternButton() { |
| return removeButton; |
| } |
| |
| public void setEnabled(boolean isEnabled) { |
| this.isEnabled = isEnabled; |
| removeButton.setEnabled(isEnabled && !tableViewer.getSelection().isEmpty()); |
| addButton.setEnabled(isEnabled); |
| tableViewer.getTable().setEnabled(isEnabled); |
| } |
| |
| public boolean isEnabled() { |
| return isEnabled; |
| } |
| |
| public interface AddHandler { |
| boolean addElement(); |
| } |
| |
| public interface RemoveHandler { |
| void removeElement(Object toRemove); |
| } |
| |
| |
| } |