In most projects,the developers need a PageGridView to support data view.
In my opinion,i will describe the functions as the following:
 
Core Function:
  1. Pageing: The developers can define the navigation and other infomation,so the client can view data with paging and easy to naviagte between the pages. 
  2. Format:  The developers can define the data format,like 2005-09-09 or 09/09/05 and so on.
  3. Server Sort: If necessary,users can sort data.
  4. Flexible: It must be easy to extend.Developers can define grid cell output easily,for example,link of delete,edit and so on.
 
 
Extended Function:
  1. Client Sort: sometime the function is needed,thougth i thought it's useless,but somebody may need it. 
  2. StyleClass:  Generaly speaking,just like, the even row has a different color with the odd row.
  3. Mouse change color: For  emphasis,the row should can change color when the mouse is over the row.
  4. Mouse click color: For  emphasis,the row should can change color when the row is clicked .
 
I analysised another discussion about PageGridView,but i feel it too complicated.
So I want to design another PageGridView,in this process,i refer valuelist and displaytag.
 
The core desigh is simple,just tow classes(PageGridView and Column) and tow interfaces(IPageList and GridCellRender).
 
PageGridView acts as control mainly,it assigne the value from model(IPageList) to header render and cell renderer to output html.
 
I also finish some default implemention of IPageList and GridCellRender.And write a demo web application,and packaged it as a .war file.If somebody knows where i can upload it.I will upload it for demo and discussion.Because it's under test,so i don't want to upload it to sourceforge.
 
The following is source code of PageGridView :
 

package wicket.contrib.view;
 
import java.util.ArrayList;
import java.util.List;
 
import wicket.AttributeModifier;
import wicket.contrib.view.impl.LineColumn;
import wicket.markup.html.list.ListItem;
import wicket.markup.html.list.ListView;
import wicket.markup.html.list.PageableListView;
import wicket.markup.html.navigation.paging.IPageable;
import wicket.markup.html.navigation.paging.PagingNavigator;
import wicket.markup.html.panel.Panel;
import wicket.model.IModel;
import wicket.model.Model;
 
/**
 *
 * @author Lei.wang <BR>
 *         <B>FUNCTION:</B> <BR>
 *         This class is used for view.<BR>
 *         It add some function to PageableListView<BR>
 *         It support sorting,format <BR>
 *         Create-time:2005-9-25 <BR>
 *         <BR>
 *         Rule for variable: <BR>
 *         prefix of "t_" means the variable inside the body of a method <BR>
 *         prefix of "r_" means the parameter,i like to call it reference <BR>
 */
 
public class PageGridView extends Panel
{
 
 private PagingNavigator  headerNavigator;
 
 // The navigation for header
 
 private PagingNavigator  footerNavigator;
 
 // The navigation for footer
 
 private PageableListView pageableListView;
 
 // The current paging component
 
 /**
  *
  * @param r_ID
  * @param r_PageList
  */
 public PageGridView(String r_ID, IPageList r_PageList)
 {
  this(r_ID, new Model(r_PageList));
 }
 
 /**
  * The parameter "r_Model" must provide a IPageList as the method of "getObject" is called.<BR>
  *
  * @param r_ID
  * @param r_Model
  */
 public PageGridView(String r_ID, IModel r_Model)
 {
  super(r_ID, r_Model);
 }
 
 /**
  * This method is to control the grid header for output.
  *
  */
 private void onRenderHeader()
 {
  final IPageList t_PageList = (IPageList) this.getModelObject();
 
  ListView t_ListView = new ListView("header", getColumns())
  {
 
   protected void populateItem(ListItem r_ListItem)
   {
    Column t_Column = (Column) r_ListItem.getModelObject();
 
    r_ListItem.add(t_Column.getHeaderRender().getComponent("title", t_Column, r_ListItem, t_PageList));
 
   }
  };
 
  this.add(t_ListView);
 }
 
 /**
  * This method is to control the grid cell for output
  */
 private void onRenderRows()
 {
  final IPageList t_PageList = (IPageList) this.getModelObject();
 
  pageableListView = new PageableListView("rows", t_PageList, t_PageList.getRowsPerPage())
  {
 
   protected void populateItem(final ListItem r_ListItem)
   {
    ListView t_ChildListView = new ListView("columns", getColumns())
    {
 
     protected void populateItem(final ListItem r_ChildListItem)
     {
      Column t_Column = (Column) r_ChildListItem.getModelObject();
 
      r_ChildListItem.add(t_Column.getCellRender().getComponent("content", t_Column, r_ListItem, t_PageList));
     }
    };
 
    r_ListItem.add(t_ChildListView);
 
    String t_Style = (String) t_PageList.getConfiguration().getStyleClass(r_ListItem.getIndex());
    if (null != t_Style)
    {
     r_ListItem.add(new AttributeModifier("class", true, new Model(t_Style)));
    }
    // control the css style
 
    String t_MouseOut = (String) t_PageList.getConfiguration().getMouseOut(r_ListItem.getIndex());
    if (null != t_MouseOut)
    {
     r_ListItem.add(new AttributeModifier("onMouseOut", true, new Model(t_MouseOut)));
    }
    // control the onMouseOut script
 
    String t_MouseOver = (String) t_PageList.getConfiguration().getMouseOver(r_ListItem.getIndex());
    if (null != t_MouseOver)
    {
     r_ListItem.add(new AttributeModifier("onMouseOver", true, new Model(t_MouseOver)));
    }
    // control the onMouseOver script
 
    String t_MouseClick = (String) t_PageList.getConfiguration().getMouseClick(r_ListItem.getIndex());
    if (null != t_MouseClick)
    {
     r_ListItem.add(new AttributeModifier("onClick", true, new Model(t_MouseClick)));
    }
    // control the onClick script
 
   }
  };
 
  this.add(pageableListView);
 
  headerNavigator = new PagingNavigator("headerNavigator", this.getPageable());
  footerNavigator = new PagingNavigator("footerNavigator", this.getPageable());
 
  this.add(headerNavigator);
  this.add(footerNavigator);
 
  headerNavigator.setVisible(t_PageList.getConfiguration().isShowHeaderNavigation());
  footerNavigator.setVisible(t_PageList.getConfiguration().isShowFooterNavigation());
  // To control the header and footer navigation to be visiable or not.
 }
 
 /**
  * This method is used for providing the columns<BR>
  * If IPageList.getConfiguration().isShowLineNumber() return true,<BR>
  * This method will return a additional column to show line number.<BR>
  *
  * @return
  */
 private List getColumns()
 {
  List t_Columns = new ArrayList();
 
  final IPageList t_PageList = (IPageList) this.getModelObject();
 
  if (t_PageList.getConfiguration().isShowLineNumber())
  {
   t_Columns.add(new LineColumn());
  }
  t_Columns.addAll(t_PageList.getColumns());
 
  return t_Columns;
 }
 
 /**
  * This method is for external users to define navigation.<BR>
  *
  * @return
  */
 public IPageable getPageable()
 {
  return pageableListView;
 }
 
 /*
  * (non-Javadoc)
  *
  * @see wicket.Component#onBeginRequest()
  */
 protected void onBeginRequest()
 {
  if (this.get("rows") == null)
  {
   onRenderHeader();
   onRenderRows();
  }
 
  super.onBeginRequest();
 }
 
}
 
The following is source code of IPageList:
 
/**
 *
 */
 
package wicket.contrib.view;
 
import java.io.Serializable;
import java.util.List;
 
/**
 * @author Lei.wang <BR>
 *         <B>FUNCTION:</B> <BR>
 *         This class is used as a model to provide data for paging.<BR>
 *         It extneds java.util.List to be suitable for PageableListView.<BR>
 *         Create-time:2005-9-25 <BR>
 *         <BR>
 *         Rule for variable: <BR>
 *         prefix of "t_" means the variable inside the body of a method <BR>
 *         prefix of "r_" means the parameter,i like to call it reference <BR>
 */
public interface IPageList extends Lis t , Serializable
{
 
 /**
  * provide some infomation about the view.<BR>
  * I also feel a little confused about the design<BR>
  * Because i fell it should be splited into two parts.<BR>
  * One is used for view<BR>
  * The other is used for model<BR>
  * But i think it too complicated.<BR>
  * So i just use one Configuration to store the infomation.
  *
  * @return
  */
 public Configuration getConfiguration();
 
 /**
  * Gets the maximum number of rows on each page.
  *
  * @return Returns the rowsPerPage.
  */
 public int getRowsPerPage();
 
 /**
  * Sets the maximum number of rows on each page.
  *
  * @param r_RowsPerPage
  *            The rowsPerPage to set.
  */
 public void setRowsPerPage(int r_RowsPerPage);
 
 /**
  * If the server sort is actived,<BR>
  * when the client click the asc order link.<BR>
  * the method will be called to order data on the server side.<BR>
  *
  * @param r_Column
  */
 public void doAsc(Column r_Column);
 
 /**
  * If the server sort is actived,<BR>
  * when the client click the desc order link.<BR>
  * the method will be called to order data on the server side.<BR>
  *
  * @param r_Column
  */
 public void doDesc(Column r_Column);
 
 /**
  * Gets the column defination for grid view.<BR>
  *
  * @return
  */
 public List getColumns();
}
 
The following is source code of Column:
 

package wicket.contrib.view;
 
import wicket.contrib.view.impl.DefaultGridHeaderRender;
 
/**
 *
 * @author Lei.wang <BR>
 *         <B>FUNCTION:</B> <BR>
 *         It provide the necessary infomation of a column of table header. <BR>
 *         Create-time:2005-9-26 <BR>
 *         <BR>
 *         Rule for variable: <BR>
 *         prefix of "t_" means the variable inside the body of a method <BR>
 *         prefix of "r_" means the parameter,i like to call it reference <BR>
 */
public class Column
{
 
 public static final int ORDER_NONE  = 0;
 
 // It means this column is not ordered
 
 public static final int ORDER_ASC  = 4;
 
 // It menas this column is ordered asc
 
 public static final int ORDER_DESC  = 8;
 
 // It menas this column is ordered desc
 
 private String   title;
 
 // The title of this column
 
 private boolean   allowOrder  = true;
 
 // If this value is true,the grid view will show ▲ and ��,so the client can order data by the column
 
 private int    orderState;
 
 // It stores the state of a column,it can be ORDER_NONE,ORDER_ASC,ORDER_DESC
 
 private GridCellRender headerRender = new DefaultGridHeaderRender();
 
 private GridCellRender cellRender;
 
 /**
  * return allowOrder. <BR>
  * If the return value is true.<BR>
  * The column allows order.<BR>
  *
  * @return
  */
 public boolean isAllowOrder()
 {
  return allowOrder;
 }
 
 /**
  * set allowOrder to control a column for order.<BR>
  * If the parameter is true.<BR>
  * It will make the column orderable.<BR>
  *
  * @param r_AllowOrder
  */
 public void setAllowOrder(boolean r_AllowOrder)
 {
  allowOrder = r_AllowOrder;
 }
 
 /**
  * return title.<BR>
  * In default grid header render,it will be shown.
  *
  * @return
  */
 public String getTitle()
 {
  return title;
 }
 
 /**
  * set the title for show.
  *
  * @param r_Title
  */
 public void setTitle(String r_Title)
 {
  title = r_Title;
 }
 
 /**
  * return the state of the column's state<BR>
  * it can be ORDER_NONE,ORDER_ASC,ORDER_DESC<BR>
  *
  * @return
  */
 public int getOrderState()
 {
  return orderState;
 }
 
 /**
  * set the state of the column's state<BR>
  * it can be ORDER_NONE,ORDER_ASC,ORDER_DESC<BR>
  *
  * @param r_OrderState
  */
 public void setOrderState(int r_OrderState)
 {
  orderState = r_OrderState;
 }
 
 /**
  * return the cell render to output the grid cell <BR>
  * user can define it to extend grid view component.<BR>
  *
  * @return Returns the cellRender.
  */
 public GridCellRender getCellRender()
 {
  return cellRender;
 }
 
 /**
  * At first i just want to provide a getCellRender method for extension.<BR>
  * But for convience,i also provide the method.<BR>
  *
  * @param r_CellRender
  *            The cellRender to set.
  */
 public void setCellRender(GridCellRender r_CellRender)
 {
  cellRender = r_CellRender;
 }
 
 /**
  * return the cell render to output the grid cell <BR>
  * user can define it to extend grid view component.<BR>
  * such as order link,icon and so on<BR>
  *
  * @return Returns the headerRender.
  */
 public GridCellRender getHeaderRender()
 {
  return headerRender;
 }
 
 /**
  * At first i just want to provide a getHeaderRender method for extension.<BR>
  * But for convience,i also provide the method.<BR>
  * @param r_HeaderRender
  *            The headerRender to set.
  */
 public void setHeaderRender(GridCellRender r_HeaderRender)
 {
  headerRender = r_HeaderRender;
 }
 
}
 
The following is source code of GridCellRender:
 
/**
 *
 */
 
package wicket.contrib.view;
 
import wicket.Component;
import wicket.markup.html.list.ListItem;
 
/**
 * @author Lei.wang <BR>
 *         <B>FUNCTION:</B> <BR>
 *         This class is used to define the output info<BR>
 *         <BR>
 *         Create-time:2005-9-26 <BR>
 *         <BR>
 *         Rule for variable: <BR>
 *         prefix of "t_" means the variable inside the body of a method <BR>
 *         prefix of "r_" means the parameter,i like to call it reference <BR>
 */
public interface GridCellRender
{
 
 /**
  * return the defined component to provide output for a grid cell.
  *
  * @param r_ID
  * @param r_Column
  * @param r_ListItem
  * @param r_PageList
  * @return
  */
 public Component getComponent(String r_ID, Column r_Column, ListItem r_ListItem, IPageList r_PageList);
}
 
 


DO YOU YAHOO!?
雅虎邮箱超强增值服务-2G超大空间、pop3收信、无限量邮件提醒

Reply via email to