package com.netifera.platform.ui.internal.spaces.visualizations;
import org.eclipse.jface.action.IContributionManager;
import org.eclipse.jface.dialogs.PopupDialog;
import org.eclipse.jface.viewers.ContentViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import com.netifera.platform.api.model.IEntity;
import com.netifera.platform.api.model.ISpace;
import com.netifera.platform.ui.spaces.actions.ActionHover;
import com.netifera.platform.ui.spaces.table.SpaceTableContentProvider;
import com.netifera.platform.ui.spaces.table.SpaceTableLabelProvider;
import com.netifera.platform.ui.spaces.visualizations.ISpaceVisualization;
import com.netifera.platform.ui.util.HookingViewerComparator;
import com.netifera.platform.ui.util.MouseTracker;
public class SpaceTableVisualization implements ISpaceVisualization {
final private ISpace space;
private TableViewer tableViewer;
public SpaceTableVisualization(ISpace space) {
this.space = space;
}
public void addContributions(IContributionManager contributions) {
// TODO Auto-generated method stub
}
public ContentViewer createViewer(Composite parent) {
tableViewer = new TableViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.VIRTUAL);
SpaceTableContentProvider contentProvider = new SpaceTableContentProvider();
tableViewer.setContentProvider(contentProvider);
SpaceTableLabelProvider labelProvider = new SpaceTableLabelProvider();
tableViewer.setLabelProvider(labelProvider);
String[] columnNames = new String[] { "Label", "Tags", "Type" };
int[] columnWidth = new int[] { 350, 100, 70 };
int[] columnAlign = new int[] { SWT.LEFT, SWT.LEFT, SWT.LEFT };
/** get the table widget from the viewer */
final Table table = tableViewer.getTable();
/** define the table columns */
for (int i = 0; i < columnWidth.length; i++) {
TableColumn column = new TableColumn(table, columnAlign[i]);
/* set index as column data */
column.setData(i);
column.setText(columnNames[i]);
column.setWidth(columnWidth[i]);
}
tableViewer.setComparator(new HookingViewerComparator(tableViewer){
@Override
public void setAscending(boolean ascending) {
// contentProvider.setAscending(ascending);
}
@Override
public void setSortBy(Object fieldId) {
//ignore field now to test concept
}});
/* set some table visual properties */
table.setHeaderVisible(true);
table.setLinesVisible(true);
tableViewer.setInput(space);
/* implement the mouse tracker the action hover handlers*/
final MouseTracker mouseTracker = new MouseTracker(tableViewer.getTable()) {
private PopupDialog informationControl;
@Override
protected Object getItemAt(Point point) {
TableItem tableItem = tableViewer.getTable().getItem(point);
if (tableItem != null) {
return tableItem.getData();
}
return null;
}
protected Rectangle getAreaOfItemAt(Point point) {
TableItem tableItem = tableViewer.getTable().getItem(point);
if (tableItem != null) {
Rectangle itemArea = tableItem.getBounds();
/*
* the TreeItem getBounds rectangle only includes the text. But
* getItem(point) returns the rectangle for any point in the
* tree row.
*/
return expandedItemArea(itemArea);
}
return super.getAreaOfItemAt(point);
}
private Rectangle expandedItemArea(Rectangle itemArea) {
return new Rectangle(Math.max(itemArea.x - 12, 2), Math.max(itemArea.y
- EPSILON * 2, 0), itemArea.width + 12 * 2, itemArea.height
+ EPSILON * 2 * 2);
}
@Override
protected void showInformationControl(Shell parent, Point location,
Object input, Object item) {
informationControl = new ActionHover(parent, location, space, item);
informationControl.open();
}
@Override
protected void hideInformationControl() {
if(informationControl != null) {
informationControl.close();
}
}
@Override
protected boolean focusInformationControl() {
Shell shell = informationControl.getShell();
if(shell != null) {
return shell.setFocus();
}
return false;
}
@Override
protected Rectangle getInformationControlArea() {
if(informationControl != null) {
Shell shell = informationControl.getShell();
if(shell != null) {
return shell.getBounds();
}
}
return null;
}
};
tableViewer.getControl().addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
mouseTracker.stop();
}
});
return tableViewer;
}
public void focusEntity(IEntity entity) {
// TODO Auto-generated method stub
}
}