blob: 47a0e64755ec3d152cdf3a06aa67f06132e215d1 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}