blob: ca8ed98ebff9f757747abdc80f1758d1dc867ed0 [file] [log] [blame]
<div id="midcolumn">
<h3>Summary row</h3>
<div id="doccontent">
<div class="chapter">
<div class="content">
<p>
You can add a summary row to your NatTable easily by adding and configuring the
<span class="code">SummaryRowLayer</span>.
</p>
<p style="text-align: center;">
<img align="middle" src="images/summary_row.png" border="0" alt="Summary Row Example"/>
</p>
<p>
The <span class="code">Creating_a_summary_row</span> and <span class="code">CalculatingGridExample</span>
examples are the best places to look at.
</p>
</div>
</div>
<div class="chapter">
<h5>Adding the SummaryRowLayer to the body layer stack</h5>
<div class="content">
<p>
To add a summary row to your NatTable, you have to add the <span class="code">SummaryRowLayer</span>
to your body layer stack. As it should deal directly to the data shown in the NatTable, it should
be added to the body layer close to the <span class="code">DataLayer</span>. As with all layers this
can easily be done with the following code snippet:
</p>
<div class="codeBlock">IConfigRegistry configRegistry = new ConfigRegistry();
IUniqueIndexLayer dataLayer = new DataLayer(myDataProvider);
// Plug in the SummaryRowLayer
IUniqueIndexLayer summaryRowLayer =
new SummaryRowLayer(dataLayer, configRegistry, false);
ViewportLayer viewportLayer = new ViewportLayer(summaryRowLayer);</div>
<p class="subline">Snippet from Creating_a_summary_row example</p>
<p>
Note that the <span class="code">SummaryRowLayer</span> needs the <span class="code">ConfigRegistry</span>
to access the summary row specific configurations.
</p>
</div>
</div>
<div class="chapter">
<h5>Configuring the summary data</h5>
<div class="content">
<p>
The next step on adding a summary row to a NatTable is to configure the content that should
be showed within the summary row. This is done by <span class="code">ISummaryProvider</span>
that need to be configured via <span class="code">ConfigRegistry</span>.
</p>
<p>
NatTable comes with three default <span class="code">ISummaryProvider</span>
<ul>
<li>ISummaryProvider.DEFAULT<br>
always returns the String ...</li>
<li>ISummaryProvider.NONE<br>
always returns null which skips calls to the <span class="code">ISummaryProvider</span> and
is a performance tweak</li>
<li>SummationSummaryProvider<br>
needs the body data provider so it can iterate over all values for the column it is
configured to and summarize all the number values to a resulting float value</li>
</ul>
Creating your own <span class="code">ISummaryProvider</span> is quite easy. The following
snippet shows how to implement one to calculate the average value instead of the sum.
<div class="codeBlock">class AverageSummaryProvider implements ISummaryProvider {
public Object summarize(int columnIndex) {
int total = 0;
int rowCount = myDataProvider.getRowCount();
for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) {
Object dataValue =
myDataProvider.getDataValue(columnIndex, rowIndex);
total = total + Integer.parseInt(dataValue.toString());
}
return "Average: " + total / rowCount;
}
}</div>
<p class="subline">Snippet from Creating_a_summary_row example</p>
<p>
To be able to configure the <span class="code">SummaryRowLayer</span> in detail, it introduces
two new labels for which the specific configurations can be added:
<ul>
<li>SummaryRowLayer#DEFAULT_SUMMARY_ROW_CONFIG_LABEL to all cells in the row</li>
<li>SummaryRowLayer#DEFAULT_SUMMARY_COLUMN_CONFIG_LABEL_PREFIX + column index per column</li>
</ul>
</p>
<p>
There is a <span class="code">DefaultSummaryRowConfiguration</span>
to configure the style and the summary formulas of the summary row. You can extend that or
create your own configuration. In this configuration you should add your <span class="code">ISummaryProvider</span>
as you like the <span class="code">SummaryRowLayer</span> to be configured.
<div class="codeBlock">// Default summary provider
configRegistry.registerConfigAttribute(
SummaryRowConfigAttributes.SUMMARY_PROVIDER,
new SummationSummaryProvider(myDataProvider),
DisplayMode.NORMAL,
SummaryRowLayer.DEFAULT_SUMMARY_ROW_CONFIG_LABEL);
// Average summary provider for column index 2
configRegistry.registerConfigAttribute(
SummaryRowConfigAttributes.SUMMARY_PROVIDER,
new AverageSummaryProvider(),
DisplayMode.NORMAL,
SummaryRowLayer.DEFAULT_SUMMARY_COLUMN_CONFIG_LABEL_PREFIX + 2);</div>
<p class="subline">Snippet from MySummaryRowConfig of the Creating_a_summary_row example</p>
</p>
</div>
</div>
<div class="chapter">
<h5>Summary row label in the row header</h5>
<div class="content">
<p>
To reflect the summary row within the row header of a grid, you should consider using
the <span class="code">DefaultSummaryRowHeaderDataProvider</span> to create the
<span class="code">DataLayer</span> of your <span class="code">DefaultSummaryRowHeaderDataProvider</span>
or something custom that looks like it. Using this the row header will show incrementing line numbers
for all data rows and by default the word <i>Summary</i> for the summary row. The
<span class="code">DefaultSummaryRowHeaderDataProvider</span> also has a constructor that
accepts a parameter that allows you to specify your own row header label for the summary row.
<div class="codeBlock">IDataProvider rowHeaderDataProvider = new DefaultSummaryRowHeaderDataProvider(
bodyLayer.getDataLayer().getDataProvider(),
"\u2211");
ILayer rowHeaderLayer = new RowHeaderLayer(
new DefaultRowHeaderDataLayer(rowHeaderDataProvider),
bodyLayer,
selectionLayer);</div>
<p class="subline">Snippet from CalculatingGridLayer of the CalculatingGridExample</p>
</p>
</div>
</div>
</div>
</div>