Verbesserung
Top-Thema
Wichtig
Kleinigkeit
Wichtig
Verbesserung
Analog Excel soll es möglich sein, in Tabellen (inklusive Grids) eine Zeile anzeigen zu lassen, die pro Spalte einen berechneten Wert darstellt.
- Die Auswertungszeile ist optional.
- Die Auswertungszeile kann konfigurativ entweder direkt unter dem Header oder über dem Footer eingeblendet werden.
- Die Auswertungszeile verhält sich analog der Header- bzw. Footer-Zeile (d.h. sie scrollt nur horizontal mit den Spalten, nicht aber vertikal mit den Zeilen, sodass sie immer sichtbar ist).
- Je Spalte kann ein Algorithmus konfiguriert werden, der den Wert berechnet, welcher in der Auswertungszeile für diese Spalte anzuzeigen ist. Ist kein Algorithmus konfiguriert, so wird auch kein Wert in der Auswertungszeile dargestellt.
- Der Algorithmus für die Berechnung des Wertes für die Auswertungszeile erhält Zugriff auf das TableViewModel, um die Kalkulation machen zu können.
Umsetzung
Tabellen-Spalten haben die zusätzliche Property additionalHeaders bekommen. Das ist eine Liste von HTMLFragmentProvidern, die jeweils eine zusätzliche Header-Zeile schreiben. Beispiele findet man im Abschnitt [#Test|Test]. Dabei wurde zusätzlich folgendes gemacht:
- Als Verallgemeinerung von ControlProvider wurde HTMLFragmentProvider eingeführt.
- Als Adapter für "alte" APIs, die weiterhin ControlProvider deklarieren, gibt es den FragmentControlProvider. Dieser ist ein ControlProvider und hat eine Property für einen HTMLFragmentProvider.
- TL 6: Es wurden folgende TL-Script Funktionen implementiert:
- max, min, average, sum.
- Diese sind wie alle anderen TL-Script Funktionen im Ordner com.top_logic.model.search/webapp/doc dokumentiert. Diese Dokumentation wird im Demo zum Beispiel in der Modellbasierten Suche im zweiten Reiter angezeigt, wenn man "sum" eingibt und CTRL SPACE drückt.
- Als Basisklasse für neue zusätzliche Spalten wurden AdditionalHeaderControl und SimpleAdditionalHeaderControl eingeführt.
- Mittels der kurzschreibweise <min/> können folgende vordefinierte ControlProvider verwendet werden: min, max, average, median, sum, nullCount, nullPercentage.
- Es gibt keine zusätzlichen Zeilen im Footer. Das ist zu Aufwendig und wird nach aktueller Planung erst nach einem kompletten Neudesign der Frozen-Table-Technik umgesetzt. Ein solches ist derzeit aber noch nicht absehbar.
- Die Controls werden aufgerufen, sobald eine Zeile in der Tabelle hinzugefügt wird, geändert wird, entfernt wird und sobald die Tabelle neu geschrieben wird (genauer: TableModelEvent.INVALIDATE).
- Die Controls bekommen als Modell ein AdditionalHeaderControlModel. Darüber bekommen sie mittels getValues() die Liste der Spaltenwerte.
- Und zwar genau der angezeigten Zeilen:
- Weggefilterte Zeilen sind NICHT enthalten.
- In Bäumen sind Unterelemente von zugeklappten Knoten NICHT enthalten.
- Zeilen außerhalb des ViewPorts SIND enthalten.
- Zeilen auf anderen Seiten der Tabelle SIND enthalten.
- Die Zeilen sind so sortiert, wie sie gerade angezeigt werden.
- Zusätzlich haben die Control über oben genannte Klasse Zugriff auf:
- getColumnIndex
- getColumnName
- getDisplayedRows
- getTableViewModel
- getRenderState
Code Migration
Wenn ein TableRenderer die Methode writeColumnHeader überschreibt: Am Anfang der Methode muss zusätzlich geprüft werden, ob es sich um eine zusätzliche Header Spalte handelt. In diesem Fall muss super aufgerufen werden. Siehe zum Beispiel den DemoTableRenderer:
#!patch Index: branches/CWS/CWS_23681/com.top_logic.demo/src/com/top_logic/demo/table/DemoTableRenderer.java =================================================================== --- branches/CWS/CWS_23681/com.top_logic.demo/src/com/top_logic/demo/table/DemoTableRenderer.java (revision 281102) +++ branches/CWS/CWS_23681/com.top_logic.demo/src/com/top_logic/demo/table/DemoTableRenderer.java (revision 281391) @@ -19,19 +19,19 @@ */ public class DemoTableRenderer extends DefaultTableRenderer { public DemoTableRenderer(InstantiationContext context, Config config) throws ConfigurationException { super(context, config); } @Override public void writeColumnHeader(DisplayContext context, TagWriter out, RenderState state, int rowNumber, int column) throws IOException { - if (rowNumber == 0) { + if ((rowNumber == 0) || isAdditionalHeader(rowNumber)) { super.writeColumnHeader(context, out, state, rowNumber, column); } else { out.writeText("Header Row: " + rowNumber + " Col: " + column); } } }
Test
Es gibt in drei Sichten im Demo Beispiele für zusätzliche Header:
- "Tabellen > Frozen" enthält Beispiele für mehrere Header, die per ControlProvider definiert sind.
- In allen Spalten außer Name und der Selektionsspalte sollte es zwei zusätzliche Header geben.
- In "Float" wird der Maximal- und der Minimalwert angezeigt.
- In "Float (no special configuration)" wird der Durchschnitt und die Summe angezeigt.
- In allen anderen Spalten wird die Anzahl der null-Werte und der Prozentsatz an null-Werten angezeigt.
- TL 6: "Tabellen > Tree Grid" enthält Beispiele für Header die per TL-Script definiert sind:
- In allen Spalten außer Name und der Selektionsspalte sollte es zwei zusätzliche Header geben.
- In "Float" wird der Maximal- und der Minimalwert angezeigt.
- In "Float (no special configuration)" wird der Durchschnitt und die Summe angezeigt.
- In allen anderen Spalten wird die Anzahl der null-Werte und der Prozentsatz an null-Werten angezeigt.
- "Strukturen > Strukturen > Typendemo": Wenn ein "A" angezeigt wird, enthält die Tabelle "priorityTable" einen zusätzlichen Header. In allen Spalten außer Name und der Selektionsspalte, sollte die Anzahl der null-Werte angezeigt werden. Diese Tabelle dient als Beispiel dafür, dass zusätzliche Header auch im Formular korrekt angezeigt werden.