/*******************************************************************************
* Copyright (c) 2009 Fraunhofer IWU and others.
* 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:
* Fraunhofer IWU - initial API and implementation
*******************************************************************************/
package net.enilink.komma.sparql.ui.views;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import net.enilink.commons.ui.editor.EditorWidgetFactory;
import net.enilink.komma.core.INamespace;
import net.enilink.komma.core.IReference;
import net.enilink.komma.core.URI;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ContentViewer;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
public class ResultTableViewer implements IResultViewer {
static class DataRow {
Object[] data;
int rowNr;
}
class TableLabelProvider extends CellLabelProvider implements
ITableLabelProvider {
Map<URI, String> prefixMap = new HashMap<>();
public TableLabelProvider(Set<INamespace> namespaces) {
for (INamespace ns : namespaces) {
prefixMap.put(ns.getURI(), ns.getPrefix());
}
}
public Color getBackground(Object element, int columnIndex) {
if (element instanceof DataRow) {
if (((DataRow) element).rowNr % 2 == 0) {
return tableViewer.getControl().getDisplay()
.getSystemColor(SWT.COLOR_GRAY);
}
}
return null;
}
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
if (element instanceof DataRow) {
Object value = ((DataRow) element).data[columnIndex];
if (value instanceof IReference) {
URI uri = ((IReference) value).getURI();
if (uri != null) {
String prefix = prefixMap.get(uri.namespace());
if (prefix != null) {
return prefix.isEmpty() ? uri.localPart() : prefix
+ ":" + uri.localPart();
}
}
}
return String.valueOf(value);
}
return null;
}
public Color getForeground(Object element, int columnIndex) {
return null;
}
public void update(ViewerCell cell) {
Object element = cell.getElement();
int columnIndex = cell.getColumnIndex();
cell.setText(getColumnText(element, columnIndex));
cell.setImage(getColumnImage(element, columnIndex));
cell.setForeground(getForeground(element, columnIndex));
cell.setBackground(getBackground(element, columnIndex));
}
}
private final class TableViewerComparator extends ViewerComparator {
int sortDirection;
int sortColumn;
private TableViewerComparator(Comparator<?> comparator,
int sortDirection, int sortColumn) {
super(comparator);
this.sortDirection = sortDirection;
this.sortColumn = sortColumn;
}
@SuppressWarnings("unchecked")
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
int cat1 = category(e1);
int cat2 = category(e2);
if (cat1 != cat2) {
return cat1 - cat2;
}
String name1;
String name2;
int direction = sortDirection == SWT.DOWN ? -1 : 1;
if (viewer == null || !(viewer instanceof ContentViewer)) {
name1 = e1.toString();
name2 = e2.toString();
} else {
IBaseLabelProvider prov = ((ContentViewer) viewer)
.getLabelProvider();
if (prov instanceof ITableLabelProvider) {
name1 = ((ITableLabelProvider) prov).getColumnText(e1,
sortColumn);
name2 = ((ITableLabelProvider) prov).getColumnText(e2,
sortColumn);
} else if (prov instanceof ILabelProvider) {
ILabelProvider lprov = (ILabelProvider) prov;
name1 = lprov.getText(e1);
name2 = lprov.getText(e2);
} else {
name1 = e1.toString();
name2 = e2.toString();
}
}
if (name1 == null) {
name1 = "";//$NON-NLS-1$
}
if (name2 == null) {
name2 = "";//$NON-NLS-1$
}
// use the comparator to compare the strings
return direction * getComparator().compare(name1, name2);
}
}
TableViewer tableViewer;
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
tableViewer.addSelectionChangedListener(listener);
}
@Override
public void createContents(EditorWidgetFactory widgetFactory,
Composite parent) {
parent.setLayout(new GridLayout(1, false));
Table table = widgetFactory.createTable(parent, SWT.V_SCROLL
| SWT.H_SCROLL);
table.setHeaderVisible(true);
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
tableViewer = new TableViewer(table);
tableViewer.setContentProvider(new IStructuredContentProvider() {
@Override
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
// TODO Auto-generated method stub
}
@Override
public void dispose() {
}
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof Object[]) {
return (Object[]) inputElement;
}
return new Object[0];
}
});
}
@Override
public String getName() {
return "List";
}
@Override
public ISelection getSelection() {
return tableViewer.getSelection();
}
@Override
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
tableViewer.removeSelectionChangedListener(listener);
}
@Override
public void setData(Set<INamespace> namespaces, String[] columnNames,
Collection<Object[]> data) {
Collection<DataRow> dataRows = new ArrayList<DataRow>(data.size());
int rowNr = 0;
for (Object[] result : data) {
DataRow row = new DataRow();
row.data = result;
row.rowNr = rowNr++;
dataRows.add(row);
}
tableViewer.setInput(null);
for (TableColumn column : tableViewer.getTable().getColumns()) {
column.dispose();
}
for (String columnName : columnNames) {
TableColumn column = new TableColumn(tableViewer.getTable(),
SWT.LEFT);
column.setText(columnName);
column.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableColumn oldColumn = tableViewer.getTable()
.getSortColumn();
if (e.widget instanceof TableColumn) {
TableColumn newColumn = (TableColumn) e.widget;
int sortDirection = oldColumn != newColumn ? SWT.UP
: (tableViewer.getTable().getSortDirection() == SWT.UP ? SWT.DOWN
: SWT.UP);
tableViewer.getTable().setSortDirection(sortDirection);
tableViewer.getTable().setSortColumn(newColumn);
int index = 0;
for (TableColumn column : tableViewer.getTable()
.getColumns()) {
if (column == newColumn)
break;
index++;
}
tableViewer.setComparator(new TableViewerComparator(
Collator.getInstance(), sortDirection, index));
} else {
return;
}
}
});
}
tableViewer.setLabelProvider(new TableLabelProvider(namespaces));
tableViewer.setInput(dataRows.toArray(new Object[dataRows.size()]));
for (TableColumn column : tableViewer.getTable().getColumns()) {
column.pack();
}
}
@Override
public void setSelection(ISelection selection) {
tableViewer.setSelection(selection);
}
}