Package org.zkoss.zul

## Class SimpleGroupsModel<D,​H,​F,​E>

- java.lang.Object
- - org.zkoss.zul.AbstractGroupsModel<D,​java.lang.Object,​F,​E>
  - - org.zkoss.zul.SimpleGroupsModel<D,​H,​F,​E>

- All Implemented Interfaces:
    `java.io.Serializable`, `java.lang.Cloneable`, `ComponentCloneListener`, `GroupsSelectableModel<E>`, `GroupsSortableModel<D>`, `Selectable<E>`, `Sortable<D>`, `GroupsModel<D,​java.lang.Object,​F>`

      public class SimpleGroupsModel<D,​H,​F,​E>
      extends AbstractGroupsModel<D,​java.lang.Object,​F,​E>
      implements GroupsSortableModel<D>, ComponentCloneListener, java.lang.Cloneable

  A simple implementation of `GroupsModel`. This implementation assumes the data is grouped, and the grouping structure is immutable. If you allow the user to re-group the content, use `GroupsModelArray` instead.

  Generics:

  D
    The class of each data
  H
    The class of each group header
  F
    The class of each group footer
  E
    The class of each selection. It is the common base class of D, H, F. In other words, D, H and F must extend from E.

  For more information, please refer to ZK Developer's Reference: Groups Model

  By default, the model support cloneable when the component is cloned. (since 6.0.0)

  Since:
    3.5.0
  Author:
    Dennis.Chen
  See Also:
    `GroupsModel`, `GroupsModelArray`, `ComponentCloneListener`, Serialized Form

- - ### Nested Class Summary

    - ### Nested classes/interfaces inherited from class org.zkoss.zul.AbstractGroupsModel

      `AbstractGroupsModel.DefaultSelectionControl<E>`

  - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `protected java.util.List<java.util.List<D>>` | `_data` | member field to store group data
    `protected java.util.List<F>` | `_foots` | member field to store group foot data
    `protected java.util.List<H>` | `_heads` | member field to store group head data
    `protected boolean[]` | `_opens` | member field to store group close status
    `protected boolean` | `_sortDir` | is the sort ascending?
    `protected java.util.Comparator<D>` | `_sorting` | the sorting comparator

    - ### Fields inherited from class org.zkoss.zul.AbstractGroupsModel

      `_selection`

  - ### Constructor Summary

    Constructors
    Constructor | Description
    --- | ---
    `SimpleGroupsModel​(D[][] data)` | Constructs a groups data model with a two-dimensional array of data.
    `SimpleGroupsModel​(D[][] data, H[] heads)` | Constructor When using this constructor , `getGroup(int)` will return the corresponding Object depends on heads.
    `SimpleGroupsModel​(D[][] data, H[] heads, F[] foots)` | Constructor When using this constructor , `getGroup(int)` will return the corresponding Object depends on heads.
    `SimpleGroupsModel​(D[][] data, H[] heads, F[] foots, boolean[] closes)` | Constructor When using this constructor , `getGroup(int)` will return the corresponding Object depends on heads.
    `SimpleGroupsModel​(java.util.List<java.util.List<D>> data)` | Constructs a groups data model with a two-dimensional list of data.
    `SimpleGroupsModel​(java.util.List<java.util.List<D>> data, java.util.List<H> heads)` | Constructor When using this constructor , `getGroup(int)` will return the corresponding Object depends on heads.
    `SimpleGroupsModel​(java.util.List<java.util.List<D>> data, java.util.List<H> heads, java.util.List<F> foots)` | Constructor When using this constructor , `getGroup(int)` will return the corresponding Object depends on heads.
    `SimpleGroupsModel​(java.util.List<java.util.List<D>> data, java.util.List<H> heads, java.util.List<F> foots, boolean[] closes)` | Constructor When using this constructor , `getGroup(int)` will return the corresponding Object depends on heads.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods Deprecated Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `boolean` | `addOpenGroup​(int groupIndex)` | Opens the group at the specified index.
    `java.lang.Object` | `clone()` |
    `D` | `getChild​(int groupIndex, int index)` | Returns the child value of the specified group at the specified index.
    `int` | `getChildCount​(int groupIndex)` | Returns the number of children of the specified group.
    `java.lang.Object` | `getGroup​(int groupIndex)` | Returns the data representing the group.
    `int` | `getGroupCount()` | Returns the number of groups.
    `F` | `getGroupfoot​(int groupIndex)` | Returns the foot value of the specified group, or null if the specified group does not have any foot.
    `java.lang.String` | `getSortDirection​(java.util.Comparator<D> cmpr)` | Returns the sort direction of this model for the given comparator.
    `void` | `group​(java.util.Comparator<D> cmpr, boolean ascending, int colIndex)` | Do nothing in default implementation, however developer can override it to re-group by manipulating `_data`,`_heads`,`_foots`
    `boolean` | `hasGroupfoot​(int groupIndex)` | Returns if the specified group has a foot value.
    `boolean` | `isGroupOpened​(int groupIndex)` | Whether the group is open at the specified index.
    `boolean` | `removeOpenGroup​(int groupIndex)` | Closes the group at the specified index.
    `boolean` | `setOpenGroup0​(int groupIndex, boolean open)` |
    `void` | `sort​(java.util.Comparator<D> cmpr, boolean ascending, int colIndex)` | Sort each data in each group by Comparator, developer could override `sortGroupData(Object, List, Comparator, boolean, int)` (Since 6.0.1) to customize.
    `protected void` | `sortGroupData​(java.lang.Object group, D[] groupdata, java.util.Comparator<D> cmpr, boolean ascending, int colIndex)` | Deprecated. As of release 6.0.1, replaced with `sortGroupData(Object, List, Comparator, boolean, int)`.
    `protected void` | `sortGroupData​(java.lang.Object group, java.util.List<D> groupdata, java.util.Comparator<D> cmpr, boolean ascending, int colIndex)` | Sorts a group of data.
    `java.lang.Object` | `willClone​(Component comp)` | Allows the model to clone

    - ### Methods inherited from class org.zkoss.zul.AbstractGroupsModel

      `addGroupsDataListener, addToSelection, clearSelection, fireEvent, fireSelectionEvent, getSelection, getSelectionControl, isGroupSelectable, isMultiple, isSelected, isSelectionEmpty, newEmptySelection, readSelection, removeAllSelection, removeFromSelection, removeGroupsDataListener, retainAllSelection, setGroupSelectable, setMultiple, setSelection, setSelectionControl, writeSelection`

    - ### Methods inherited from class java.lang.Object

      `equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

    - ### Methods inherited from interface org.zkoss.zul.ext.GroupsSortableModel

      `sort`

    - ### Methods inherited from interface org.zkoss.zul.ext.Sortable

      `sort`

- - ### Field Detail

    - #### _data

          protected java.util.List<java.util.List<D>> _data

      member field to store group data

    - #### _heads

          protected java.util.List<H> _heads

      member field to store group head data

    - #### _foots

          protected java.util.List<F> _foots

      member field to store group foot data

    - #### _opens

          protected boolean[] _opens

      member field to store group close status

    - #### _sorting

          protected java.util.Comparator<D> _sorting

      the sorting comparator

    - #### _sortDir

          protected boolean _sortDir

      is the sort ascending?

  - ### Constructor Detail

    - #### SimpleGroupsModel

          public SimpleGroupsModel​(D[][] data)

      Constructs a groups data model with a two-dimensional array of data. For example, if you have three groups and each of them have 5 elements, then the data argument must be a 3 x 5 array. Furthermore, data[0] is the array of elements of the first group, data[1] is elements of the second group, and so on. Of course, each group might have different number of elements.

      This constructor assumes there is no group foot at all.

      Parameters:
        `data` - a two-dimensional array to represent groups data, where data[0] is the array of element of the first group, data[1] is of the second group and so on.

    - #### SimpleGroupsModel

          public SimpleGroupsModel​(D[][] data,
                                   H[] heads)

      Constructor When using this constructor , `getGroup(int)` will return the corresponding Object depends on heads. `hasGroupfoot(int)` will always return false
      Parameters:
        `data` - a 2 dimension array to represent groups data
        `heads` - an array to represent head data of group

    - #### SimpleGroupsModel

          public SimpleGroupsModel​(D[][] data,
                                   H[] heads,
                                   F[] foots)

      Constructor When using this constructor , `getGroup(int)` will return the corresponding Object depends on heads. The return value of `hasGroupfoot(int)` and `getGroupfoot(int)` are depends on foots.
      Parameters:
        `data` - a 2 dimension array to represent groups data
        `heads` - an array to represent head data of group
        `foots` - an array to represent foot data of group, if an element in this array is null, then `hasGroupfoot(int)` will return false in corresponding index.

    - #### SimpleGroupsModel

          public SimpleGroupsModel​(D[][] data,
                                   H[] heads,
                                   F[] foots,
                                   boolean[] closes)

      Constructor When using this constructor , `getGroup(int)` will return the corresponding Object depends on heads. The return value of `hasGroupfoot(int)` and `getGroupfoot(int)` are depends on foots.

      Notice that, for backward compatibility, the last argument is `closes`.

      Parameters:
        `data` - a 2 dimension array to represent groups data
        `heads` - an array to represent head data of group
        `foots` - an array to represent foot data of group, if an element in this array is null, then `hasGroupfoot(int)` will return false in corresponding index.
        `closes` - an array of boolean to represent close status of group. If not specified, then `isGroupOpened(int)` will return true in corresponding index(i.e. group is default to open)

    - #### SimpleGroupsModel

          public SimpleGroupsModel​(java.util.List<java.util.List<D>> data)

      Constructs a groups data model with a two-dimensional list of data. For example, if you have three groups and each of them have 5 elements, then the data argument must be a 3 x 5 list. Furthermore, `list.get(0)` is the elements of the first group, `list.get(1)` is the elements of the second group, and so on. Of course, each group might have different number of elements.

      This constructor assumes there is no group foot at all.

      Parameters:
        `data` - a two-dimensional list to represent groups data.
      Since:
        6.0.1

    - #### SimpleGroupsModel

          public SimpleGroupsModel​(java.util.List<java.util.List<D>> data,
                                   java.util.List<H> heads)

      Constructor When using this constructor , `getGroup(int)` will return the corresponding Object depends on heads. `hasGroupfoot(int)` will always return false
      Parameters:
        `data` - a two dimensional list to represent groups data
        `heads` - a list to represent head data of group
      Since:
        6.0.1

    - #### SimpleGroupsModel

          public SimpleGroupsModel​(java.util.List<java.util.List<D>> data,
                                   java.util.List<H> heads,
                                   java.util.List<F> foots)

      Constructor When using this constructor , `getGroup(int)` will return the corresponding Object depends on heads. The return value of `hasGroupfoot(int)` and `getGroupfoot(int)` are depends on foots.
      Parameters:
        `data` - a two dimensional list to represent groups data
        `heads` - a list to represent head data of group
        `foots` - a list to represent foot data of group, if an element in this list is null, then `hasGroupfoot(int)` will return false in corresponding index.
      Since:
        6.0.1

    - #### SimpleGroupsModel

          public SimpleGroupsModel​(java.util.List<java.util.List<D>> data,
                                   java.util.List<H> heads,
                                   java.util.List<F> foots,
                                   boolean[] closes)

      Constructor When using this constructor , `getGroup(int)` will return the corresponding Object depends on heads. The return value of `hasGroupfoot(int)` and `getGroupfoot(int)` are depends on foots.

      Notice that, for backward compatibility, the last argument is `closes`.

      Parameters:
        `data` - a two dimensional list to represent groups data
        `heads` - a list to represent head data of group
        `foots` - a list to represent foot data of group, if an element in this list is null, then `hasGroupfoot(int)` will return false in corresponding index.
        `closes` - an array of boolean to represent close status of group. If not specified, then `isGroupOpened(int)` will return true in corresponding index(i.e. group is default to open)
      Since:
        6.0.1

  - ### Method Detail

    - #### getChild

          public D getChild​(int groupIndex,
                            int index)

      Description copied from interface: `GroupsModel`
      Returns the child value of the specified group at the specified index.
      Specified by:
        `getChild` in interface `GroupsModel<D,​H,​F>`
      Parameters:
        `groupIndex` - the index of the group.
        `index` - the index of the element in the group.

    - #### getChildCount

          public int getChildCount​(int groupIndex)

      Description copied from interface: `GroupsModel`
      Returns the number of children of the specified group.

      Note: it does not include the group foot (`GroupsModel.getGroupfoot(int)`).

      Specified by:
        `getChildCount` in interface `GroupsModel<D,​H,​F>`
      Parameters:
        `groupIndex` - the index of the group.

    - #### getGroup

          public java.lang.Object getGroup​(int groupIndex)

      Returns the data representing the group. It is H, if heads is specified in the constructor, or D[] if not specified.
      Specified by:
        `getGroup` in interface `GroupsModel<D,​H,​F>`
      Parameters:
        `groupIndex` - the index of the group.

    - #### getGroupCount

          public int getGroupCount()

      Description copied from interface: `GroupsModel`
      Returns the number of groups.
      Specified by:
        `getGroupCount` in interface `GroupsModel<D,​H,​F>`

    - #### getGroupfoot

          public F getGroupfoot​(int groupIndex)

      Description copied from interface: `GroupsModel`
      Returns the foot value of the specified group, or null if the specified group does not have any foot. It is used to render `Groupfoot` and `Listgroupfoot`.

      Note: it is ignored if `GroupsModel.hasGroupfoot(int)` returns false.

      Specified by:
        `getGroupfoot` in interface `GroupsModel<D,​H,​F>`
      Parameters:
        `groupIndex` - the index of the group.

    - #### hasGroupfoot

          public boolean hasGroupfoot​(int groupIndex)

      Description copied from interface: `GroupsModel`
      Returns if the specified group has a foot value.
      Specified by:
        `hasGroupfoot` in interface `GroupsModel<D,​H,​F>`
      Parameters:
        `groupIndex` - the index of the group.

    - #### isGroupOpened

          public boolean isGroupOpened​(int groupIndex)

      Description copied from interface: `GroupsModel`
      Whether the group is open at the specified index. It is used to render `Group` and `Listgroup`.

      Default: true

      Specified by:
        `isGroupOpened` in interface `GroupsModel<D,​H,​F>`
      Parameters:
        `groupIndex` - the index of the group.

    - #### addOpenGroup

          public boolean addOpenGroup​(int groupIndex)

      Description copied from interface: `GroupsModel`
      Opens the group at the specified index.
      Specified by:
        `addOpenGroup` in interface `GroupsModel<D,​H,​F>`
      Parameters:
        `groupIndex` - the index of the group.
      Returns:
        if it has been added successfully; false if it was opened.

    - #### removeOpenGroup

          public boolean removeOpenGroup​(int groupIndex)

      Description copied from interface: `GroupsModel`
      Closes the group at the specified index.
      Specified by:
        `removeOpenGroup` in interface `GroupsModel<D,​H,​F>`
      Parameters:
        `groupIndex` - the index of the group.
      Returns:
        if it has been removed successfully; false if it was closed.

    - #### setOpenGroup0

          public boolean setOpenGroup0​(int groupIndex,
                                       boolean open)

    - #### group

          public void group​(java.util.Comparator<D> cmpr,
                            boolean ascending,
                            int colIndex)

      Do nothing in default implementation, however developer can override it to re-group by manipulating `_data`,`_heads`,`_foots`
      Specified by:
        `group` in interface `GroupsSortableModel<D>`
      Parameters:
        `cmpr` - the comparator assigned to `Column.setSortAscending(java.util.Comparator<?>)` and other relative methods. If developers didn't assign any one, the method is returned directly.
        `ascending` - whether to sort in the ascending order (or in the descending order)
        `colIndex` - the index of the column

    - #### sort

          public void sort​(java.util.Comparator<D> cmpr,
                           boolean ascending,
                           int colIndex)

      Sort each data in each group by Comparator, developer could override `sortGroupData(Object, List, Comparator, boolean, int)` (Since 6.0.1) to customize.
      Specified by:
        `sort` in interface `GroupsSortableModel<D>`
      Parameters:
        `cmpr` - the comparator assigned to `Listheader.setSortAscending(java.util.Comparator)` and other relative methods. If developers didn't assign any one, the default comparator is used. Notice that it is capable to sort the data in the correct order, you could ignore the ascending parameter.
        `ascending` - whether to sort in the ascending order (or in the descending order, if false). Notice that it is used only to provide additional information. To sort the data correctly, you could count on the cmpr parameter only.
        `colIndex` - the index of the column

    - #### sortGroupData

          protected void sortGroupData​(java.lang.Object group,
                                       D[] groupdata,
                                       java.util.Comparator<D> cmpr,
                                       boolean ascending,
                                       int colIndex)

      Deprecated.
      As of release 6.0.1, replaced with `sortGroupData(Object, List, Comparator, boolean, int)`.

    - #### sortGroupData

          protected void sortGroupData​(java.lang.Object group,
                                       java.util.List<D> groupdata,
                                       java.util.Comparator<D> cmpr,
                                       boolean ascending,
                                       int colIndex)

      Sorts a group of data.

      Default: `Collections.sort(groupdata, cmpr)`

      Parameters:
        `group` - the group (the same as `getGroup(int)`)
        `groupdata` - the group of data to sort
      Since:
        6.0.1

    - #### clone

          public java.lang.Object clone()

      Overrides:
        `clone` in class `AbstractGroupsModel<D,​java.lang.Object,​F,​E>`

    - #### willClone

          public java.lang.Object willClone​(Component comp)

      Allows the model to clone
      Specified by:
        `willClone` in interface `ComponentCloneListener`
      Parameters:
        `comp` - the cloned component (not the original one)
      Returns:
        the object to be used in the cloned component. If this object is returned, the same object is shared by the cloned and original components. If other object is returned, it is used by the cloned component. If null is returned, it is not used by the cloned component at all.
      Since:
        6.0.0

    - #### getSortDirection

          public java.lang.String getSortDirection​(java.util.Comparator<D> cmpr)

      Description copied from interface: `Sortable`
      Returns the sort direction of this model for the given comparator. It must be one of "ascending", "descending" and "natural".

      Default: "natural".

      Specified by:
        `getSortDirection` in interface `GroupsSortableModel<D>`
      Specified by:
        `getSortDirection` in interface `Sortable<D>`