/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.eclipse.jface.viewers;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import org.robotframework.red.viewers.Viewers;
import com.google.common.primitives.Ints;
public class RowExposingTreeViewer extends TreeViewer {
public RowExposingTreeViewer(final Composite parent, final int style) {
super(parent, style);
}
@Override
public ViewerRow getViewerRowFromItem(final Widget item) { // changing protected to public
return super.getViewerRowFromItem(item);
}
@SuppressWarnings("rawtypes")
@Override
public List getSelectionFromWidget() {
return super.getSelectionFromWidget();
}
public void removeColumnAtPosition(final int position) {
getTree().getColumn(Viewers.positionIndexToCreateOrderIndex(this, position)).dispose();
}
public void moveLastColumnTo(final int position) {
final List<Integer> order = new LinkedList<Integer>(Ints.asList(getTree().getColumnOrder()));
final Integer last = order.remove(order.size() - 1);
order.add(position, last);
final int[] newOrder = Ints.toArray(order);
getTree().setColumnOrder(newOrder);
}
public void reflowColumnsWidth() {
// when column is configured using ViewerColumnsFactory it may register
// resize listener which ensures that the column is always occupying all
// the space available
// here we are sending fake resize event which causes such columns to
// recalculate the space which should be occupied
getTree().notifyListeners(SWT.Resize, null);
}
public void setFocusCell(final int index) {
try {
// This ugly workaround is due to the lack of API for setting
// focused cell
// the code is taken from
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=198260
// and seem to be the only reasonable idea...
final TreeItem selectedItem = getTree().getSelection()[0];
final ViewerRow viewerRow = getViewerRowFromItem(selectedItem);
final ViewerCell cell = viewerRow.getCell(index);
final Method setFocusCell = TreeViewerFocusCellManager.class.getSuperclass().getDeclaredMethod(
"setFocusCell", ViewerCell.class);
setFocusCell.setAccessible(true);
final Field fcmField = TreeViewerEditor.class.getDeclaredField("focusCellManager");
fcmField.setAccessible(true);
final Object fcm = fcmField.get(getColumnViewerEditor());
setFocusCell.invoke(fcm, cell);
setSelection(new StructuredSelection(viewerRow.getItem().getData()));
} catch (final Exception e) {
// we were unable to
}
}
public void setTopItem(final Object topItem) {
final TreeItem topTreeItem = (TreeItem) findItem(topItem);
if (topTreeItem != null) {
getTree().setTopItem(topTreeItem);
}
}
}