<?xml version='1.0' encoding='UTF-8'?>

<section>
  <sectioninfo>
    <keywordset>
      <keyword>scrollableDataTable</keyword>
    </keywordset>
  </sectioninfo>

  <table>
    <title>Component identification parameters </title>
    <tgroup cols="2">
      <thead>
        <row>
          <entry>Name</entry>
          <entry>Value</entry>
        </row>
      </thead>
      <tbody>
        <row>
          <entry>component-type</entry>
          <entry>org.richfaces.component.ScrollableDataTable</entry>
        </row>
        <row>
          <entry>component-class</entry>
          <entry>org.richfaces.component.html.HtmlScrollableDataTable</entry>
        </row>
        <row>
          <entry>component-family</entry>
          <entry>org.richfaces.component.ScrollableDataTable</entry>
        </row>
        <row>
          <entry>renderer-type</entry>
          <entry>org.richfaces.renderkit.html.ScrollableDataTableRenderer</entry>
        </row>
        <row>
          <entry>tag-class</entry>
          <entry>org.richfaces.taglib.ScrollableDataTableTag</entry>
        </row>
      </tbody>
    </tgroup>
  </table>

  <section>
    <title>Creating the Component with a Page Tag</title>
    <para>Here is a simple example as it could be used on a page:</para>

    <para>
      <emphasis role="bold">Example:</emphasis>
    </para>
    <programlisting role="XML"><![CDATA[...
    <rich:scrollableDataTable value="#{dataTableScrollerBean.allCars}" var="category">
        <!--...//Set of columns and header/footer facets-->
    </rich:scrollableDataTable>
...
]]></programlisting>
  </section>
  <section>
    <title>Creating the Component Dynamically Using Java</title>

    <para>
      <emphasis role="bold">Example:</emphasis>
    </para>
    <programlisting role="JAVA"><![CDATA[import org.richfaces.component.html.HtmlScrollableDataTable;
...
HtmlScrollableDataTable myScrollableDataTable = new HtmlScrollableDataTable();
...
]]></programlisting>
  </section>

  <section>
    <title>Details of Usage</title>
    <para> The component represents on a page as a scrollable table with some fixed (non-scrollable)
      rows ( with header and  footer) and  columns. Like other tables &lt;rich:scrollableDataTable&gt; also has optional footer and header that could be  implemented using the corresponding facets. Columns of the table are optionally resizable. Resizing is
      available using "drag and drop" of the column vertical borders. There is possibility to expand
      or collapse the columns through JS API on the client side. You can define the number of the
      fixed columns from the left side using attribute <emphasis>
        <property>&quot;frozenColCount&quot;</property>
      </emphasis> that will not be scrolled via horizontal scroll. </para>
    <para> There is possibility to increase component performance using attribute <emphasis>
        <property>&quot;hideWhenScrolling&quot;</property>
      </emphasis>. If attribute value is 'true' data will be hidden during scrolling. </para>

    <para> It's possible to select the whole row with onclick on the row or some set of rows.
      Selection is optional and availability of such feature is defined on the component. There are
      two ways to select a few rows: <itemizedlist>
        <listitem>Just clicking the columns one by one.</listitem>
        <listitem>Clicking some row with the SHIFT button hold. In this case all the rows starting
          from last selected up to clicked should be selected.</listitem>
      </itemizedlist>
    </para>

    <para> The columns provides the possibility of expanding/collapsing on the client side through
      the next JS API: <itemizedlist>
        <listitem>Collapse(columnId) - Performs the collapse action for the column with the
          corresponding id</listitem>
      </itemizedlist> It's possible to sort the table content after clicks on the header. The
      feature is optional. Every column should be pointed to the comparator method that will be used
      for sorting the table. In case the
      <property>&lt;rich:scrollableDataTable&gt;</property> is already sorted by some column
      and the header of this column has been clicked again - the sorting will be reversed. </para>

    <para>
      <emphasis role="bold">The typical variant of using:</emphasis>
    </para>
    <programlisting role="XML"><![CDATA[...
<rich:scrollableDataTable value="#{modelBuilder.model}" var="issues"
			frozenColCount="1"
			first="0"
			rows="40" 
			width="300px"
			height="396px">
	<rich:column width="100px">
		<f:facet name="header" >
			<h:outputText value="State"/>
		</f:facet>
		<h:outputText value="#{issues.cell1}"/>
		<f:facet name="footer">
			<h:outputText value="State"/>
		</f:facet>
	</rich:column>		
	<!--...//Set of columns and header/footer facets-->
</rich:scrollableDataTable>
...
]]></programlisting>

    <para>The <emphasis>
        <property>&quot;selection&quot;</property>
      </emphasis> attribute allows to get the row data when using <property>one and multi-selection
        rows mode</property>.</para>
    <para>This attribute is a reference to object to the instace of
        <property>org.richfaces.model.selection.Selection</property> interface, containing current
      collection of objects selected by you.</para>
    <para>In the following example when you submits the form current collection of objects selected
      by you is placed in the object's property. Then on complete action the <emphasis role="bold">
        <property>&lt;rich:modalPanel&gt;</property>
      </emphasis> with selected data will be shown.</para>
    <para>
      <emphasis role="bold">Example:</emphasis>
    </para>
    <programlisting role="XML"><![CDATA[...
		<h:form>
			<rich:spacer height="30" />
			<rich:scrollableDataTable rowKeyVar="rkv" frozenColCount="1" height="200px" 
				width="300px" id="carList" rows="40" columnClasses="col"
				value="#{dataTableScrollerBean.allCars}" var="category" sortMode="single"
				selection="#{dataTableScrollerBean.selection}">
				<rich:column id="make">
					<f:facet name="header"><h:outputText styleClass="headerText" value="Make" /></f:facet>
					<h:outputText value="#{category.make}" />
				</rich:column>
				<rich:column id="model">
					<f:facet name="header"><h:outputText styleClass="headerText" value="Model" /></f:facet>
					<h:outputText value="#{category.model}" />
				</rich:column>
				<rich:column id="price">
					<f:facet name="header"><h:outputText styleClass="headerText" value="Price" /></f:facet>
					<h:outputText value="#{category.price}" />
				</rich:column>
				</rich:scrollableDataTable>
			<rich:spacer height="20px"/>
			<a4j:commandButton value="Show Current Selection" reRender="table" 
				action="#{dataTableScrollerBean.takeSelection}" 
				oncomplete="javascript:Richfaces.showModalPanel('panel');"/>
		</h:form>
		<rich:modalPanel id="panel" autosized="true">
				<f:facet name="header">
					<h:outputText value="Selected Rows"/>
				</f:facet>
				<f:facet name="controls">
					<span style="cursor:pointer" onclick="javascript:Richfaces.hideModalPanel('panel')">X</span>
				</f:facet>
			<rich:dataTable value="#{dataTableScrollerBean.selectedCars}" var="sel" id="table">
				<rich:column>
					<f:facet name="header"><h:outputText value="Make" /></f:facet>
					<h:outputText value="#{sel.make}" />
				</rich:column>
				<rich:column id="model">
					<f:facet name="header"><h:outputText value="Model" /></f:facet>
					<h:outputText value="#{sel.model}" />
				</rich:column>
				<rich:column id="price">
					<f:facet name="header"><h:outputText value="Price" /></f:facet>
					<h:outputText value="#{sel.price}" />
				</rich:column>
				</rich:dataTable>
		</rich:modalPanel>
...]]></programlisting>
    <para>This is a result:</para>
    <figure>
      <title>The <emphasis>&quot;selection&quot;</emphasis> attribute usage</title>
      <mediaobject>
        <imageobject>
          <imagedata fileref="images/scrollableDataTable.png"/>
        </imageobject>
      </mediaobject>
    </figure>

    <para> The <emphasis role="bold">
        <property>&lt;rich:scrollableDataTable&gt;</property>
      </emphasis> component has the following extra attributes for event processing on the client: <itemizedlist>
        <listitem>onselectionchange</listitem>
        <listitem>oncomplete</listitem>
        <listitem>onRowClick</listitem>
        <listitem>onRowDblClick</listitem>
        <listitem>onRowMouseUp</listitem>
        <listitem>onRowMouseDown</listitem>
      </itemizedlist>
    </para>
  </section>
  
  
  <section>
    <title>JavaScript API</title>
    <table>
      <title>JavaScript API</title>
      
      <tgroup cols="2">
        <thead>
          <row>
            <entry>Function</entry>
            
            <entry>Description</entry>
          </row>
        </thead>
        
        <tbody>
          
          <row>
            <entry>Collapse(columnId)</entry>
            
            <entry>Performs a collapse action for column with corresponding Id</entry>
          </row>
          
        </tbody>
      </tgroup>
    </table>
    
  </section>
  

  <section>
    <title>Look-and-Feel Customization</title>

    <para>For skinnability implementation, the components use a <emphasis>
        <property>style class redefinition method.</property>
      </emphasis> Default style classes are mapped on <emphasis>
        <property>skin parameters.</property>
      </emphasis></para>

    <para>There are two ways to redefine the appearance of all <emphasis role="bold">
        <property>&lt;rich:scrollableDataTable&gt;</property>
      </emphasis> components at once:</para>

    <itemizedlist>
      <listitem>
        <para>Redefine the corresponding skin parameters</para>
      </listitem>

      <listitem>
        <para>Add to your style sheets <emphasis>
            <property>style classes</property>
          </emphasis> used by a <emphasis role="bold">
            <property>&lt;rich:scrollableDataTable&gt;</property>
          </emphasis> component</para>
      </listitem>
    </itemizedlist>
  </section>

  <section>
    <title>Skin Parameters Redefinition</title>
    <table>
      <title>Skin parameters for all table</title>
      <tgroup cols="2">
        <thead>
          <row>
            <entry>Skin parameters</entry>
            <entry>CSS properties</entry>
          </row>
        </thead>
        <tbody>
          <row>
            <entry>tableBackgroundColor</entry>
            <entry>background-color</entry>
          </row>
          <row>
            <entry>tableBorderColor</entry>
            <entry>border-color</entry>
          </row>
          <row>
            <entry>tableBorderWidth</entry>
            <entry>border-width</entry>
          </row>
        </tbody>
      </tgroup>
    </table>

    <table>
      <title>Skin parameters for header rows and cells</title>
      <tgroup cols="2">
        <thead>
          <row>
            <entry>Skin parameters</entry>
            <entry>CSS properties</entry>
          </row>
        </thead>
        <tbody>
          <row>
            <entry>headerBackgroundColor</entry>
            <entry>background-color</entry>
          </row>

          <row>
            <entry>headerTextColor</entry>
            <entry>color</entry>
          </row>
          <row>
            <entry>generalFamilyFont</entry>
            <entry>font-family</entry>
          </row>
          <row>
            <entry>generalSizeFont</entry>
            <entry>font-size</entry>
          </row>
          <row>
            <entry>tableBorderWidth</entry>
            <entry>border-bottom-width</entry>
          </row>
          <row>
            <entry>tableBorderColor</entry>
            <entry>border-bottom-color</entry>
          </row>
          <row>
            <entry>tableBorderWidth</entry>
            <entry>border-right-width</entry>
          </row>
          <row>
            <entry>tableBorderColor</entry>
            <entry>border-right-color</entry>
          </row>
        </tbody>
      </tgroup>
    </table>

    <table>
      <title>Skin parameters for footer rows and cells</title>
      <tgroup cols="2">
        <thead>
          <row>
            <entry>Skin parameters</entry>
            <entry>CSS properties</entry>
          </row>
        </thead>
        <tbody>
          <row>
            <entry>tableSubfooterBackgroundColor</entry>
            <entry>background-color</entry>
          </row>
          <row>
            <entry>generalFamilyFont</entry>
            <entry>font-family</entry>
          </row>
          <row>
            <entry>generalSizeFont</entry>
            <entry>font-size</entry>
          </row>

          <row>
            <entry>tableBorderColor</entry>
            <entry>border-right-color</entry>
          </row>
          <row>
            <entry>generalFamilyFont</entry>
            <entry>font-family</entry>
          </row>
          <row>
            <entry>generalSizeFont</entry>
            <entry>font-size</entry>
          </row>
        </tbody>
      </tgroup>
    </table>

    <table>
      <title>Skin parameters for column cells </title>
      <tgroup cols="2">
        <thead>
          <row>
            <entry>Skin parameters</entry>
            <entry>CSS properties</entry>
          </row>
        </thead>
        <tbody>
          <row>
            <entry>tableBorderColor</entry>
            <entry>border-right-color</entry>
          </row>
          <row>
            <entry>tableBorderColor</entry>
            <entry>border-bottom-color</entry>
          </row>
        </tbody>
      </tgroup>
    </table>

    <table>
      <title>Skin parameters for active rows</title>
      <tgroup cols="2">
        <thead>
          <row>
            <entry>Skin parameters</entry>
            <entry>CSS properties</entry>
          </row>
        </thead>
        <tbody>
          <row>
            <entry>tabDisabledTextColor</entry>
            <entry>color</entry>
          </row>
        </tbody>
      </tgroup>
    </table>

    <table>
      <title>Skin parameters for selected rows</title>
      <tgroup cols="2">
        <thead>
          <row>
            <entry>Skin parameters</entry>
            <entry>CSS properties</entry>
          </row>
        </thead>
        <tbody>
          <row>
            <entry>additionalBackgroundColor</entry>
            <entry>background-color</entry>
          </row>
        </tbody>
      </tgroup>
    </table>

  </section>

  <section>
    <title>Definition of Custom Style Classes</title>

    <para>On the screenshot there are classes names that define styles for component elements.</para>

    <figure>
      <title>Classes names</title>

      <mediaobject>
        <imageobject>
          <imagedata fileref="images/sdt.png" scale="90"/>
        </imageobject>
      </mediaobject>
    </figure>

    <table>
      <title>Classes names that define a component appearance</title>

      <tgroup cols="2">
        <thead>
          <row>
            <entry>Class name</entry>

            <entry>Description</entry>
          </row>
        </thead>

        <tbody>
          <row>
            <entry>rich-sdt</entry>

            <entry>Defines styles for a component appearance</entry>
          </row>

        </tbody>
      </tgroup>
    </table>

    <table>
      <title>Classes names that define footer and header elements</title>

      <tgroup cols="2">
        <thead>
          <row>
            <entry>Class name</entry>

            <entry>Description</entry>
          </row>
        </thead>

        <tbody>

          <row>
            <entry>rich-sdt-header-cell</entry>

            <entry>Defines styles for header cells</entry>
          </row>

          <row>
            <entry>rich-sdt-header-row</entry>

            <entry>Defines styles for a header raw</entry>
          </row>

          <row>
            <entry>rich-sdt-column-cell</entry>

            <entry>Defines styles for column cells</entry>
          </row>
          <row>
            <entry>rich-sdt-footer-cell</entry>

            <entry>Defines styles for footer cells</entry>
          </row>

          <row>
            <entry>rich-sdt-footer-row</entry>

            <entry>Defines styles for a footer raw</entry>
          </row>
          <row>
            <entry>rich-sdt-hsep</entry>

            <entry>Defines styles for header separators</entry>
          </row>

        </tbody>
      </tgroup>
    </table>

    <table>
      <title>Classes names that define different states</title>

      <tgroup cols="2">
        <thead>
          <row>
            <entry>Class name</entry>

            <entry>Description</entry>
          </row>
        </thead>

        <tbody>

          <row>
            <entry>rich-sdt-row-active</entry>

            <entry>Defines styles for an active row</entry>
          </row>

          <row>
            <entry>rich-sdt-row-selected</entry>

            <entry>Defines styles for a selected row</entry>
          </row>

          <row>
            <entry>rich-sdt-column-sort-up</entry>

            <entry>Defines styles for ascending sorted column</entry>
          </row>

          <row>
            <entry>rich-sdt-column-sort-down</entry>

            <entry>Defines styles for descending sorted column</entry>
          </row>
        </tbody>
      </tgroup>
    </table>

    <para>In order to redefine styles for all <emphasis role="bold">
        <property>&lt;rich:scrollableDataTable&gt;</property>
      </emphasis> components on a page using CSS, it&apos;s enough to create classes with the
      same names and define necessary properties in them.</para>

    <para>To change styles of particular <emphasis role="bold">
        <property>&lt;rich:scrollableDataTable&gt;</property>
      </emphasis> components, define your own style classes in the corresponding <emphasis
        role="bold">
        <property>&lt;rich:scrollableDataTable&gt;</property>
      </emphasis>attributes.</para>
  </section>

  <section>
    <title>Relevant Resources Links</title>
    <para>
      <ulink
        url="http://livedemo.exadel.com/richfaces-demo/richfaces/scrollableDataTable.jsf?c=scrollableDataTable"
        >Here</ulink> you can see the example of <emphasis role="bold">
        <property>&lt;rich:scrollableDataTable&gt;</property>
      </emphasis> usage. </para>
  </section>
</section>
