|  | <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> |