Application Designer's grid controls support automated sorting of items.
TEXTGRID(SSS): by default, you can sort the grid columns by clicking on
the corresponding columns header. When using CSVCOLUMN controls, you need to
explicitly tell which property is behind which column (property
proprefsprop
).
ROWTABLEAREA2: by using the GRIDCOLHEADER control, you have the same type of sorting as you have with TEXTGRIDs.
This document covers the following topics:
The default sorting is done in the following way:
Application Designer sorts the grid collection on the server side.
Application Designer accesses the grid item objects by reflection or by dynamic access. (See Binding between Page and Adapter for more information on dynamic access.)
Application Designer is taking the data type of the property into consideration when deciding whether to sort lexically or numerically.
You can override the default sorting inside a
TEXTGRIDCollection
or
GRIDCollection
. The following example shows how to do
so:
package com.softwareag.cis.demoapps; // This class is a generated one. import java.util.*; import com.softwareag.cis.server.*; import com.softwareag.cis.server.util.*; import com.softwareag.cis.util.*; public class GridSortAdapter extends Adapter { /** * Own textgrid collection that overrides the default sort behaviour. */ public class MyTGC extends TEXTGRIDCollection { /** * Own SortInfo-class. In the sort-method you can do "everything you like" * for sorting: you can e.g. manipulate the grid collection in any way. */ public class MySI extends SORTInfo { public void sort(String sortProperty, boolean ascending) { outputMessage(MT_SUCCESS,"Sorting: " + sortProperty + ", " + ascending); } } protected SORTInfo createGridSortInfo() { MySI result = new MySI(); return result; } } /** * "Normal" lines item object. */ public class LinesItem { // property >firstName< String m_firstName; public String getFirstName() { return m_firstName; } public void setFirstName(String value) { m_firstName = value; } // property >lastName< String m_lastName; public String getLastName() { return m_lastName; } public void setLastName(String value) { m_lastName = value; } } MyTGC m_lines = new MyTGC(); public MyTGC getLines() { return m_lines; } public void init() { for (int i=0; i<100; i++) { LinesItem li = new LinesItem(); li.setFirstName("FN " + i); li.setLastName("LN " + i); m_lines.add(li); } } }
Instead of working on the normal
TEXTGRIDCollection
, you work on a derived one (in the
example, this is MyTGC
). In the derived implementation,
you need to overwrite the method createGridSortInfo()
returning an object that extends SORTInfo
(in the
example, this is MySI
). Inside the
SORTInfo
object, you need to implement the
sort(..)
method as shown in the example.
In the example, all classes are defined as inner classes. Of course, the choice whether to use inner classes or normal classes is up to you.
The CSVCOLUMN is a dynamic arrangement of columns inside a text grid.
The adapter specifies the sequence, width and content of columns at runtime. In
order to let Application Designer know how to sort the corresponding items of the
TEXTGRIDCollection
, you need to tell via the CSVCOLUMN
property proprefsprop
which property is behind
which column.
When using the default sorting (i.e. no derived
TEXTGRIDCollection
as shown in the previous section),
then Application Designer will sort the grid collection by accessing the properties. This
means that you have to expose each column property accordingly.
Example:
The layout definition is:
<rowarea name="Own Sort on Server"> <itr takefullwidth="true"> <textgridsss2 griddataprop="lines" rowcount="10" width="100%"> <csvcolumn titlesprop="titles" valuesprop="values" widthsprop="widths" proprefsprop="proprefs"> </csvcolumn> </textgridsss2> </itr> </rowarea>
The adapter implementation looks like this:
package com.softwareag.cis.demoapps; // This class is a generated one. import java.util.*; import com.softwareag.cis.file.CSVManager; import com.softwareag.cis.server.*; import com.softwareag.cis.server.util.*; import com.softwareag.cis.util.*; public class GridSortAdapter extends Adapter { public class LinesItem { String m_firstName; public String getFirstName() { return m_firstName; } public void setFirstName(String value) { m_firstName = value; } String m_lastName; public String getLastName() { return m_lastName; } public void setLastName(String value) { m_lastName = value; } public String getValues() { return CSVManager.encodeString(new String[] {m_firstName,m_lastName}); } } String m_proprefs = "firstName;lastName"; public String getProprefs() { return m_proprefs; } String m_titles = "First Name;LastName"; public String getTitles() { return m_titles; } String m_widths = "50%;50%"; public String getWidths() { return m_widths; } TEXTGRIDCollection m_lines = new TEXTGRIDCollection(); public TEXTGRIDCollection getLines() { return m_lines; } public void init() { for (int i=0; i<100; i++) { LinesItem li = new LinesItem(); li.setFirstName("FN " + i); li.setLastName("LN " + i); m_lines.add(li); } } }
The LinesItem
class exposes three properties:
The values
property passes back the comma
separated string that contains the content of the columns.
The firstName
and
lastName
properties are exposed for Application Designer being
able to sort the grid collection by property access.
Since Application Designer communicates all simple datatype properties to the client
that are part of an accessed object in the scenario above, all three properties
are transferred to the UI client - though of course only the
values
property is actually required. The other
properties are used for sorting puposes only.
To avoid this, you may use a certain interface
IControlPropertyAccess
with which you can clearly tell
Application Designer that certain simple datatype properties - though provided in the
implementation - are not relevant to be transferred to the client:
/** * "Normal" lines item object. */ public class LinesItem implements IControlPropertyAccess { String m_firstName; public String getFirstName() { return m_firstName; } public void setFirstName(String value) { m_firstName = value; } String m_lastName; public String getLastName() { return m_lastName; } public void setLastName(String value) { m_lastName = value; } public String getValues() { return CSVManager.encodeString(new String[] {m_firstName,m_lastName}); } public String[] findPropertiesNotToBeCollected() { return CSVManager.decodeString(m_proprefs); } } String m_proprefs = "firstName;lastName"; public String getProprefs() { return m_proprefs; }
If you do not want to provide for the fine granular properties at all
(firstName
,
lastName
), then you still can use the possibility
of doing the sorting completely on your own as shown in the previous section.
In this case, the property references passed by PROPREFSPROP are just strings
thay are communicated to the sort(..)
method when the
user sorts a grid.