package com.netifera.platform.ui.tasks.output;
import java.util.Iterator;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ColumnLayoutData;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import com.netifera.platform.api.tasks.ITaskRecord;
import com.netifera.platform.ui.tasks.actions.TaskCancelAction;
import com.netifera.platform.ui.updater.ScrollLockAction;
import com.netifera.platform.ui.updater.TableUpdater;
import com.netifera.platform.ui.util.HookingViewerComparator;
import com.netifera.platform.ui.util.ViewerRefreshAction;
public class TaskOutputTableViewer extends Viewer implements ISelectionListener {
protected final TableViewer tableViewer;
protected final Composite control;
protected final TableUpdater updater;
private TaskOutputContentProvider contentProvider;
private TaskOutputFilter viewerFilter;
private TaskOutputTableLabelProvider labelProvider;
private IViewPart view;
private TaskCancelAction taskCancelAction;
public TaskOutputTableViewer(final Composite parent, int style, boolean header, IViewPart view) {
this(parent,style,header);
setViewSite(view);
}
public TaskOutputTableViewer(final Composite parent, int style, boolean header) {
control = new Composite(parent,style);
tableViewer = createTableViewer(control);
updater = TableUpdater.get(tableViewer);
addContextMenu(tableViewer);
tableViewer.getTable().setHeaderVisible(header);
tableViewer.getControl().addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
parent.setFocus();
}
public void focusLost(FocusEvent e) {
}
});
}
/**
* Allows to set the ViewPart instance where the viewer is contained,
* allowing the viewer to set properties of the site based on the content
* being shown by the viewer.
*
* @param view
* the ViewPart where this viewer is contained
*/
public void setViewSite(IViewPart view) {
this.view = view;
}
private TableViewer createTableViewer(Composite parent) {
parent.setLayout(new FillLayout());
final TableViewer tableViewer = new TableViewer(control, SWT.V_SCROLL | SWT.H_SCROLL | SWT.VIRTUAL);
contentProvider = new TaskOutputContentProvider();
tableViewer.setContentProvider(contentProvider);
labelProvider = new TaskOutputTableLabelProvider();
tableViewer.setLabelProvider(labelProvider);
viewerFilter = new TaskOutputFilter();
tableViewer.addFilter(viewerFilter);
final Table table = tableViewer.getTable();
final TableColumnLayout columnLayout = new TableColumnLayout();
control.setLayout(columnLayout);
createTableColumns(table, columnLayout);
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);
return tableViewer;
}
private void createTableColumns(Table table, TableColumnLayout layout) {
final String[] columnNames = new String[] { "Time", "Message" };
final int[] columnAlign = new int[] { SWT.LEFT, SWT.LEFT };
final ColumnLayoutData[] columnLayouts = new ColumnLayoutData[] {
new ColumnPixelData(70, true, false),
new ColumnWeightData(100, 300, true)
};
for(int i = 0; i < columnNames.length; i++) {
TableColumn column = new TableColumn(table, columnAlign[i]);
column.setText(columnNames[i]);
column.setData(i);
layout.setColumnData(column, columnLayouts[i]);
}
}
private MenuManager addContextMenu(Viewer viewer) {
/*create popup menu manager */
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(false);
/* create element filtering configuration menu */
MenuManager filterMgr = new MenuManager("Show","filter");
filterMgr.setRemoveAllWhenShown(true);
filterMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager m) {
viewerFilter.fillFilterMenu(m);
}
});
viewerFilter.fillFilterMenu(filterMgr);
menuMgr.add(new ViewerRefreshAction(tableViewer));
menuMgr.add(filterMgr);
menuMgr.add(new ScrollLockAction(updater));
menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
/* add menu as viewer's context menu */
Control viewerControl = viewer.getControl();
Menu menu = menuMgr.createContextMenu(viewerControl);
viewerControl.setMenu(menu);
//How to register without site involved?
//getSite().registerContextMenu(menuMgr, viewer);
return menuMgr;
}
@SuppressWarnings("unchecked")
private void setSelectedTask(ISelection selection) {
if (!(selection instanceof IStructuredSelection)) {
return;
}
ITaskRecord taskRecord = null;
IStructuredSelection sel = (IStructuredSelection) selection;
Iterator<Object> iter = sel.iterator();
if (iter != null && iter.hasNext()) {
Object selected = iter.next();
if (selected instanceof ITaskRecord) {
taskRecord = (ITaskRecord) selected;
}
}
/* if the table is inside a view update the view's toolbar */
if(view != null) {
if(taskCancelAction != null) {
view.getViewSite().getActionBars().getToolBarManager().remove(taskCancelAction.getId());
}
if(taskRecord != null) {
taskCancelAction = new TaskCancelAction(taskRecord);
view.getViewSite().getActionBars().getToolBarManager().add(taskCancelAction);
view.getViewSite().getActionBars().getToolBarManager().update(false);
}
}
setInput(taskRecord);
}
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
setSelectedTask(selection);
}
@Override
public Control getControl() {
return control;
}
@Override
public void setInput(Object input) {
if(input == null || !input.equals(tableViewer.getInput())) {
updater.setInput(input);
}
}
@Override
public Object getInput() {
return tableViewer.getInput();
}
@Override
public ISelection getSelection() {
return tableViewer.getSelection();
}
@Override
public void refresh() {
updater.refresh();
}
@Override
public void setSelection(ISelection selection, boolean reveal) {
tableViewer.setSelection(selection,reveal);
}
}