Home » Eclipse Projects » NatTable » Multi Level Column Grouping
Multi Level Column Grouping [message #1175025] |
Thu, 07 November 2013 13:23 |
Rajesh Arumugam Messages: 24 Registered: October 2013 |
Junior Member |
|
|
Hi All,
I have created a nattable successfully with one level grouping..
As shown in the image, 1st level grouping is working fine.. Now i need to add second level Column grouping.. Here is the code..
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.sourceforge.nattable.data.IColumnPropertyAccessor;
import net.sourceforge.nattable.data.IDataProvider;
import net.sourceforge.nattable.data.ListDataProvider;
import net.sourceforge.nattable.data.ReflectiveColumnPropertyAccessor;
import net.sourceforge.nattable.grid.data.DefaultColumnHeaderDataProvider;
import net.sourceforge.nattable.grid.data.DefaultCornerDataProvider;
import net.sourceforge.nattable.grid.data.DefaultRowHeaderDataProvider;
import net.sourceforge.nattable.grid.layer.ColumnHeaderLayer;
import net.sourceforge.nattable.grid.layer.CornerLayer;
import net.sourceforge.nattable.grid.layer.DefaultColumnHeaderDataLayer;
import net.sourceforge.nattable.grid.layer.DefaultRowHeaderDataLayer;
import net.sourceforge.nattable.grid.layer.GridLayer;
import net.sourceforge.nattable.grid.layer.RowHeaderLayer;
import net.sourceforge.nattable.group.ColumnGroupHeaderLayer;
import net.sourceforge.nattable.group.ColumnGroupModel;
import net.sourceforge.nattable.layer.DataLayer;
import net.sourceforge.nattable.selection.SelectionLayer;
import net.sourceforge.nattable.util.IClientAreaProvider;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.GlazedLists;
public class FVNatTableBuilderGridLayer extends GridLayer
{
private final DataLayer bodyDataLayer;
private final DataLayer columnHeaderDataLayer;
private FVNatTableBuilderBodyLayerStack bodyLayer;
private ListDataProvider<SignalInfo> bodyDataProvider;
private final ColumnGroupModel sndColumnGroupModel = new ColumnGroupModel();
// private EventList valuesToShow = GlazedLists.eventList(new ArrayList());
EventList<SignalInfo> eventList = GlazedLists.eventList(new ArrayList());
private IColumnPropertyAccessor<SignalInfo> columnPropertyAccessor;
public FVNatTableBuilderGridLayer()
{
super(true);
eventList.addAll(getSignalInfoList());
String[] propertyNames = SignalInfoList.getPropertyNames();
Map<String, String> propertyToLabelMap = SignalInfoList.getPropertyToLabelMap();
columnPropertyAccessor = new ReflectiveColumnPropertyAccessor<SignalInfo>(propertyNames);
bodyDataProvider = new ListDataProvider<SignalInfo>(eventList, columnPropertyAccessor);
bodyDataLayer = new DataLayer(bodyDataProvider);
bodyLayer = new FVNatTableBuilderBodyLayerStack(bodyDataLayer);
// Column header
IDataProvider columnHeaderDataProvider = new DefaultColumnHeaderDataProvider(propertyNames,
propertyToLabelMap);
columnHeaderDataLayer = new DefaultColumnHeaderDataLayer(columnHeaderDataProvider);
ColumnHeaderLayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer,
bodyLayer, bodyLayer.getSelectionLayer());
ColumnGroupHeaderLayer columGrpHeaderLayer = new ColumnGroupHeaderLayer(columnHeaderLayer,
bodyLayer.getSelectionLayer(), new ColumnGroupModel());
columGrpHeaderLayer.addColumnsIndexesToGroup("Functional Class", 9);
columGrpHeaderLayer.addColumnsIndexesToGroup("Maximum In-Rush Current (A)", 10, 11);
columGrpHeaderLayer.addColumnsIndexesToGroup(" Maximum Stall Circuit Current (A)", 12, 13);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Nominal Steady State Operating Current (A) at Voltage (V)", 14, 15);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Minimum Steady State Operating Current (A) at Voltage (V)", 16, 17);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Maximum Steady State Operating Current (A) at Voltage (V)", 18, 19);
columGrpHeaderLayer.addColumnsIndexesToGroup("Output Type (Relay / FET/ BJT/ Other)", 20);
columGrpHeaderLayer.addColumnsIndexesToGroup("Overload Protection", 21);
columGrpHeaderLayer.addColumnsIndexesToGroup("Signal Type", 22);
// 2nd set of fields - Final Attributes.
columGrpHeaderLayer.addColumnsIndexesToGroup("Functional Voltage (V)", 23, 24);
columGrpHeaderLayer.addColumnsIndexesToGroup("Lifetime cycles", 25);
columGrpHeaderLayer.addColumnsIndexesToGroup("Performance Voltage (V)", 26, 27);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Maximum module output internal voltage drop @ 10.5 V", 28);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Maximum Steady State Operating Current at 10.5V", 29);
columGrpHeaderLayer.addColumnsIndexesToGroup("HSD SC Maximum Detection Current (A)", 30);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Minimum Operating Duration or Activation Time (msec)", 31);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Maximum Operating Duration or Activation Time (sec)", 32);
columGrpHeaderLayer.addColumnsIndexesToGroup("PWM Frequency (Hz) ", 33, 34);
columGrpHeaderLayer.addColumnsIndexesToGroup("PWM Minimum Rise Time Output ", 35);
columGrpHeaderLayer.addColumnsIndexesToGroup("PWM Minimum Fall Time Output", 36);
columGrpHeaderLayer.addColumnsIndexesToGroup("Twisting (T) / Shield (S) Requirement", 37);
columGrpHeaderLayer.addColumnsIndexesToGroup("Wake Up", 38);
columGrpHeaderLayer.addColumnsIndexesToGroup("Powertrain CDS Version", 39);
columGrpHeaderLayer.addColumnsIndexesToGroup("Comments"
+ "\n(List additional information such as:" + "\n SDS non-compliances,"
+ "\n how you terminate unused pins etc . . ."
+ "\n Highlight any SDS non-compliances in RED) ", 40);
columGrpHeaderLayer.setRowHeight(230);
/*ColumnGroupGroupHeaderLayer sndGroup = new ColumnGroupGroupHeaderLayer(columGrpHeaderLayer,
bodyLayer.getSelectionLayer(), sndColumnGroupModel);
sndGroup.addColumnsIndexesToGroup("Initial", 11, 12, 13, 14);*/
// Row header
DefaultRowHeaderDataProvider rowHeaderDataProvider = new DefaultRowHeaderDataProvider(
bodyDataProvider);
DefaultRowHeaderDataLayer rowHeaderDataLayer = new DefaultRowHeaderDataLayer(
rowHeaderDataProvider);
RowHeaderLayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer, bodyLayer, bodyLayer
.getSelectionLayer());
// Corner
DefaultCornerDataProvider cornerDataProvider = new DefaultCornerDataProvider(
columnHeaderDataProvider, rowHeaderDataProvider);
DataLayer cornerDataLayer = new DataLayer(cornerDataProvider);
CornerLayer cornerLayer = new CornerLayer(cornerDataLayer, rowHeaderLayer,
columGrpHeaderLayer);
// Grid
setBodyLayer(bodyLayer);
setColumnHeaderLayer(columGrpHeaderLayer);
setRowHeaderLayer(rowHeaderLayer);
setCornerLayer(cornerLayer);
}
}
But if i try to add 2nd level grouping with ColumnGroupGroupHeaderLayer, then the table is broken, its repeating column name 2 times.
the result becomes like this..
Initial
--------------------------
FunctionalVolt|Max Current
---------------------------
FunctionalVolt|Max Current
Where as i need result like,
Initial
------------------------------
FunctionalVolt|Max Current
------------------------------
A\B\C|Min | Max |
ie Min, Max belongs to Max Current Column Group
A\B\C belongs to FunctionalVolt Column Group
And Both Functional Class, Max Current belongs to Initial column group.
And here is the code for second level grouping..
public class FVNatTableBuilderGridLayer extends GridLayer
{
private final DataLayer bodyDataLayer;
private final DataLayer columnHeaderDataLayer;
private FVNatTableBuilderBodyLayerStack bodyLayer;
private ListDataProvider<SignalInfo> bodyDataProvider;
private final ColumnGroupModel sndColumnGroupModel = new ColumnGroupModel();
// private EventList valuesToShow = GlazedLists.eventList(new ArrayList());
EventList<SignalInfo> eventList = GlazedLists.eventList(new ArrayList());
private IColumnPropertyAccessor<SignalInfo> columnPropertyAccessor;
public FVNatTableBuilderGridLayer()
{
super(true);
eventList.addAll(getSignalInfoList());
String[] propertyNames = SignalInfoList.getPropertyNames();
Map<String, String> propertyToLabelMap = SignalInfoList.getPropertyToLabelMap();
columnPropertyAccessor = new ReflectiveColumnPropertyAccessor<SignalInfo>(propertyNames);
bodyDataProvider = new ListDataProvider<SignalInfo>(eventList, columnPropertyAccessor);
bodyDataLayer = new DataLayer(bodyDataProvider);
bodyLayer = new FVNatTableBuilderBodyLayerStack(bodyDataLayer);
// Column header
IDataProvider columnHeaderDataProvider = new DefaultColumnHeaderDataProvider(propertyNames,
propertyToLabelMap);
columnHeaderDataLayer = new DefaultColumnHeaderDataLayer(columnHeaderDataProvider);
ColumnHeaderLayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer,
bodyLayer, bodyLayer.getSelectionLayer());
ColumnGroupHeaderLayer columGrpHeaderLayer = new ColumnGroupHeaderLayer(columnHeaderLayer,
bodyLayer.getSelectionLayer(), new ColumnGroupModel());
columGrpHeaderLayer.addColumnsIndexesToGroup("Functional Class", 9);
columGrpHeaderLayer.addColumnsIndexesToGroup("Maximum In-Rush Current (A)", 10, 11);
columGrpHeaderLayer.addColumnsIndexesToGroup(" Maximum Stall Circuit Current (A)", 12, 13);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Nominal Steady State Operating Current (A) at Voltage (V)", 14, 15);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Minimum Steady State Operating Current (A) at Voltage (V)", 16, 17);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Maximum Steady State Operating Current (A) at Voltage (V)", 18, 19);
columGrpHeaderLayer.addColumnsIndexesToGroup("Output Type (Relay / FET/ BJT/ Other)", 20);
columGrpHeaderLayer.addColumnsIndexesToGroup("Overload Protection", 21);
columGrpHeaderLayer.addColumnsIndexesToGroup("Signal Type", 22);
// 2nd set of fields - Final Attributes.
columGrpHeaderLayer.addColumnsIndexesToGroup("Functional Voltage (V)", 23, 24);
columGrpHeaderLayer.addColumnsIndexesToGroup("Lifetime cycles", 25);
columGrpHeaderLayer.addColumnsIndexesToGroup("Performance Voltage (V)", 26, 27);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Maximum module output internal voltage drop @ 10.5 V", 28);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Maximum Steady State Operating Current at 10.5V", 29);
columGrpHeaderLayer.addColumnsIndexesToGroup("HSD SC Maximum Detection Current (A)", 30);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Minimum Operating Duration or Activation Time (msec)", 31);
columGrpHeaderLayer.addColumnsIndexesToGroup(
"Maximum Operating Duration or Activation Time (sec)", 32);
columGrpHeaderLayer.addColumnsIndexesToGroup("PWM Frequency (Hz) ", 33, 34);
columGrpHeaderLayer.addColumnsIndexesToGroup("PWM Minimum Rise Time Output ", 35);
columGrpHeaderLayer.addColumnsIndexesToGroup("PWM Minimum Fall Time Output", 36);
columGrpHeaderLayer.addColumnsIndexesToGroup("Twisting (T) / Shield (S) Requirement", 37);
columGrpHeaderLayer.addColumnsIndexesToGroup("Wake Up", 38);
columGrpHeaderLayer.addColumnsIndexesToGroup("Powertrain CDS Version", 39);
columGrpHeaderLayer.addColumnsIndexesToGroup("Comments"
+ "\n(List additional information such as:" + "\n SDS non-compliances,"
+ "\n how you terminate unused pins etc . . ."
+ "\n Highlight any SDS non-compliances in RED) ", 40);
columGrpHeaderLayer.setRowHeight(230);
ColumnGroupGroupHeaderLayer sndGroup = new ColumnGroupGroupHeaderLayer(columGrpHeaderLayer,
bodyLayer.getSelectionLayer(), sndColumnGroupModel);
sndGroup.addColumnsIndexesToGroup("Initial", 9, 10, 11);
// Row header
DefaultRowHeaderDataProvider rowHeaderDataProvider = new DefaultRowHeaderDataProvider(
bodyDataProvider);
DefaultRowHeaderDataLayer rowHeaderDataLayer = new DefaultRowHeaderDataLayer(
rowHeaderDataProvider);
RowHeaderLayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer, bodyLayer, bodyLayer
.getSelectionLayer());
// Corner
DefaultCornerDataProvider cornerDataProvider = new DefaultCornerDataProvider(
columnHeaderDataProvider, rowHeaderDataProvider);
DataLayer cornerDataLayer = new DataLayer(cornerDataProvider);
CornerLayer cornerLayer = new CornerLayer(cornerDataLayer, rowHeaderLayer, sndGroup);
// Grid
setBodyLayer(bodyLayer);
setColumnHeaderLayer(sndGroup);
setRowHeaderLayer(rowHeaderLayer);
setCornerLayer(cornerLayer);
}
}
can anyone let me what mistake i am doing and help me to fix this..
Also, I want to add different configuration for different layer. ie. Want to align column Grouping names,in vertical manner and their group columns in horizonal manner.. in the sense, Column Group 'Functional Class' should be in vertical order where as its group column 'A\B\C' should be in horizontal order. When i am trying to add Vertical painter to Column header layer, its aligning all columns in vertical manner, except Column grouping columns.
[Updated on: Thu, 07 November 2013 13:25] Report message to a moderator
|
|
| | | | | | |
Re: Multi Level Column Grouping [message #1186147 is a reply to message #1176825] |
Thu, 14 November 2013 14:10 |
Rajesh Arumugam Messages: 24 Registered: October 2013 |
Junior Member |
|
|
Hi Drik,
2nd level column grouping is working fine with latest jar. Now i am facing issue on vertical alignment for column header. As you suggested i am returning my own LabelStack to which i registered custom painter. But the code is not working.
@Override
public LabelStack getConfigLabelsByPosition(int columnPosition, int rowPosition)
{
int colIdx = getColumnIndexByPosition(columnPosition);
int rowIndex = getRowIndexByPosition(rowPosition);
if ((colIdx == 9 || colIdx == 11 || colIdx == 12 || colIdx == 13 || colIdx == 14 || colIdx == 15)
&& rowIndex == 0)
{
LabelStack labelStack = new LabelStack();
if (getConfigLabelAccumulator() != null)
{
getConfigLabelAccumulator().accumulateConfigLabels(labelStack, columnPosition,
rowPosition);
}
labelStack.addLabelOnTop(HEADER_LABEL1);
return labelStack;
}
// TODO Auto-generated method stub
return super.getConfigLabelsByPosition(columnPosition, rowPosition);
}
This is the style i am trying to apply to the specific cell.
protected void addHorizontalStyle(IConfigRegistry configRegistry, NatTable natTable)
{
Style cellStyle = new Style();
Color summaryRowFgColor = GUIHelper.COLOR_BLACK;
Color summaryRowBgColor = GUIHelper.COLOR_BLUE;
Font summaryRowFont = GUIHelper.getFont(new FontData("Verdana", 8, SWT.BOLD));
BorderStyle summaryRowBorderStyle = new BorderStyle(0, GUIHelper.COLOR_BLACK,
LineStyleEnum.DOTTED);
cellStyle.setAttributeValue(CellStyleAttributes.HORIZONTAL_ALIGNMENT,
HorizontalAlignmentEnum.CENTER);
cellStyle.setAttributeValue(CellStyleAttributes.FONT, summaryRowFont);
cellStyle.setAttributeValue(CellStyleAttributes.BACKGROUND_COLOR, summaryRowBgColor);
cellStyle.setAttributeValue(CellStyleAttributes.FOREGROUND_COLOR, summaryRowFgColor);
cellStyle.setAttributeValue(CellStyleAttributes.BORDER_STYLE, summaryRowBorderStyle);
configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_STYLE, cellStyle,
DisplayMode.NORMAL, FVNatTableColumnGrpHeaderLayer1.HEADER_LABEL1);
}
Its not working. Do i miss anything?
[Updated on: Thu, 14 November 2013 14:10] Report message to a moderator
|
|
| |
Re: Multi Level Column Grouping [message #1200754 is a reply to message #1186156] |
Thu, 21 November 2013 11:48 |
Rajesh Arumugam Messages: 24 Registered: October 2013 |
Junior Member |
|
|
Hi Drik,
I am still facing the same issue after overwriting custom label. Here is my table..
Initial
------|------|-----|-----|-----|
Col-1 | Col-2|Col-3|Grp-1|Grp-2|
------|------|-----|-----|-----|
AB|BC|DE|EF|
What i want to do is :
Arrange and paint 1st column header - Initial (horizontal alignment is working be default)
Arrange the center column header - Col1 --Grp-2 in vertical manner(Its working fine)
Arrange the last column header- AB|BC|DE.. in horizontal manner
Here is my approach :
1. Created a columnheader layer that contains columns - Col-1 Col-2 Col3 AB BC DE EF
2. Created a column group header layer to group AB,BC to Grp-1 and DE,EF to Grp-2
3. Created a column group group header layer to group Grp-1, Grp-2 to 'Initial'
And i applied VerticalTextPainter to column header layer.. This makes my center and last column header in vertical manner.. But i want only my center column header in vertical manner and last column header in horizontal manner.
I understood i need to override the label and register my own label.. but how can i override 2nd level column grouping cells.
I am trying to override column group group header layer label like this... but its not working..
IConfigLabelAccumulator cellLabelAccumulator = new IConfigLabelAccumulator() {
public void accumulateConfigLabels(LabelStack configLabels, int columnPosition,
int rowPosition)
{
int columnIndex = sndGroup.getColumnIndexByPosition(columnPosition);
int rowIndex = sndGroup.getRowIndexByPosition(rowPosition);
if ((columnIndex == 9 || columnIndex == 10 || columnIndex == 11
|| columnIndex == 12 || columnIndex == 13 || columnIndex == 14
|| columnIndex == 15 || columnIndex == 16 || columnIndex == 17
|| columnIndex == 18 || columnIndex == 19 || columnIndex == 20
|| columnIndex == 21 || columnIndex == 22)
&& rowIndex == 0)
{
configLabels.addLabel(FOO_LABEL);
}
}
};
sndGroup.setConfigLabelAccumulator(cellLabelAccumulator);
If i modify the same code, for bodyLayer(replaced all sndGroup with bodyLayer, then my custom painter is working fine for this custom label)
-regards,
Rajesh
|
|
| | | |
Goto Forum:
Current Time: Fri Apr 19 21:43:39 GMT 2024
Powered by FUDForum. Page generated in 0.03839 seconds
|