Showing posts with label nat table. Show all posts
Showing posts with label nat table. Show all posts

Tuesday, July 30, 2013

Tree expand/collapse issue in NatTable(0.9->1.0)

I was facing tree expand/collapse issue in NatTable after migrating from 0.9 to 1.0 version.  I could not even expand or collapse a tree after migration, it was disabled completely so we can’t even see the children of a tree.

This can be resolved by configuring CellPainterMouseEventMatcher with GridRegion.BODY  instead of  TreeLayer.TREE_COLUMN_CELL

If you are facing the same issue, this would be useful tip.




ToolTip information on NatTable cells


Default implementation is provided by ‘DefaultToolTip’ class from Jface, so we can override getText() method to provide tool tip information based on the specific criteria.

Example below:



import java.util.Properties;

import org.eclipse.jface.window.DefaultToolTip;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;


public class MyXToolTip extends DefaultToolTip {

private NatTable natTable;
private XSpanningDataProvider bodyDataProvider;


public MyXToolTip (NatTable natTable, XSpanningDataProvider bodyDataProvider) {
super(natTable, ToolTip.NO_RECREATE, false);
this.natTable = natTable;
this.bodyDataProvider = bodyDataProvider;
}


protected Object getToolTipArea(Event event) {
int col = natTable.getColumnPositionByX(event.x);
int row = natTable.getRowPositionByY(event.y);

//if any specific implementation here ex: You want to display tooltip information only on first column. if(col != 0) return;

return new Point(col, row);
}

protected String getText(Event event) {
int col = natTable.getColumnPositionByX(event.x);
int row = natTable.getRowPositionByY(event.y);

ILayerCell cell = natTable.getCellByPosition(col, row);
INode rowObject = bodyDataProvider.getRowObject(cell.getRowIndex()); //my INode Object which has specific cell information
String channelName = rowObject.getName();

//If any specific implementation here, ex: mixing column and row information
return channelName;
}

protected Composite createToolTipContentArea(Event event, Composite parent) {
// This is where you could get really creative with your tooltips...
return super.createToolTipContentArea(event, parent);
}
}


Thursday, July 18, 2013

Eclipse NatTable: How do you render Checkbox, Image and Text in a single cell

Say, below is your requirement. I am showing only part of the complete dialog below.


I am talking here about first column,rending check box and windows 8 image and followed by display text.

Do the following:
Use a TextPainter, decorate it (CellPainterDecorator) with an ImagePainter, use the resulting painter as base painter of another decorator and decorate it with a CheckboxPainter


//Text painter to diplay text
TextPainter textPainter = new TextPainter() {
//Any specific implementation
};


//My image painter
 class MyImagePainter extends ImagePainter {

private MyData data = null
public MyImagePainter(MyData data) {
this.data = data; //this would be useful, what image has to displayed on call.
}

@Override
protected Image getImage(ILayerCell cell, IConfigRegistry configRegistry) {
//return specific image on data object and it's properties.
return null;
}
 }

//Cell painter decorator for image and text
CellPainterDecorator cellPainterDecorator = new CellPainterDecorator(
textPainter, //text painter
CellEdgeEnum.LEFT, //Image should left side of Text
new MyImagePainter(bodyDataProvider)); //Image Painter
 
//Wrapper for cellPainterDecorator  and checkbox
configRegistry.registerConfigAttribute(
CellConfigAttributes.CELL_PAINTER,
new CellPainterWrapper(new BackgroundPainter(
new CellPainterDecorator(
cellPainterDecorator, //decorator to render image and text
CellEdgeEnum.LEFT, // check box has to be displayed left hand side of the cell.
myCheckBoxPainter)), // check box painter
10),
DisplayMode.NORMAL,
TreeLayer.TREE_COLUMN_CELL);

registerEditing(configRegistry, TreeLayer.TREE_COLUMN_CELL);