dimanche 18 décembre 2011

Pagination en GWT

Les interfaces, c'est efficace..... Et ce qui est formidable avec GWT c'est que tout est interfacé. Vous voulez créer votre propre composant et le lier à un SimplePage, aucun problème, il "suffit" de lui faire implémenter HasData.

Vous trouverez ci-dessous un exemple (simple) pour un FlexTable. Il y a sans doute des choses à revoir, notamment le cas de chargement de données asynchrone, le premier appel de la fonction refresh (sur le onAttach? le onLoad?)

package org.gch.FlexTable;

import java.util.ArrayList;
import java.util.List;


import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.view.client.HasData;
import com.google.gwt.view.client.Range;
import com.google.gwt.view.client.RangeChangeEvent;
import com.google.gwt.view.client.RowCountChangeEvent;
import com.google.gwt.view.client.RangeChangeEvent.Handler;
import com.google.gwt.view.client.SelectionModel;

public class FlexTableHasRows extends FlexTable implements HasData {
 
 private Range range = new Range(0, 25);
 
 private Handler handler;
 
 private boolean isExact = true;
 
 private int count;

 private SelectionModel selectionModel;

 @Override
 public HandlerRegistration addRangeChangeHandler(Handler handler) {
  this.handler = handler;
  return addHandler(handler, RangeChangeEvent.getType());
 }

 @Override
 public HandlerRegistration addRowCountChangeHandler(com.google.gwt.view.client.RowCountChangeEvent.Handler handler) {
  return addHandler(handler, RowCountChangeEvent.getType());
 }
 

 @Override
 public Range getVisibleRange() {
  return range;
 }

 @Override
 public boolean isRowCountExact() {
  return isExact;
 }

 @Override
 public void setRowCount(int count) {
  this.count = this.getRowCount();
 }

 @Override
 public void setRowCount(int count, boolean isExact) {
  this.count = this.getRowCount();
  this.isExact = isExact;
  
 }

 @Override
 public void setVisibleRange(int start, int length) {
  range = new Range(start, length);
  RangeChangeEvent.fire(this, getVisibleRange());
  refresh();
 }

 @Override
 public void setVisibleRange(Range range) {
  this.range = range;
  RangeChangeEvent.fire(this, getVisibleRange());
  refresh();
  
 }


 @Override
 public HandlerRegistration addCellPreviewHandler(com.google.gwt.view.client.CellPreviewEvent.Handler handler) {
  System.out.println("addCellPreviewHandler");
  return null;
 }

 @Override
 public SelectionModel getSelectionModel() {
  return this.selectionModel;
 }

 @Override
 public Element getVisibleItem(int indexOnPage) {
  Element e = this.getRowFormatter().getElement(range.getStart() + indexOnPage);
  return e;
 }

 @Override
 public int getVisibleItemCount() {
  return range.getLength();
 }

 @Override
 public Iterable getVisibleItems() {
  List res = new ArrayList();
  int end = range.getStart() + range.getLength();
  
  if (end > this.getRowCount()) {
   end = this.getRowCount();
  }
  for (int i = range.getStart(); i < end; i++) {
   res.add(this.getRowFormatter().getElement(i));
  }
  return res;
 }

 @Override
 public void setRowData(int start, List values) {
  //todo parse element
  
 }

 @Override
 public void setSelectionModel(SelectionModel selectionModel) {
  this.selectionModel = selectionModel;
 }

 @Override
 public void setVisibleRangeAndClearData(Range range,
   boolean forceRangeChangeEvent) {
  System.out.println("setVisibleRangeAndClearData");
  
 }
 
 //TODO
 public void refresh() {
  for (int i = 0; i < this.getRowCount(); i++) {
   this.getRowFormatter().setVisible(i, false);
  }
  int end = range.getStart() + range.getLength();
  
  if (end > this.getRowCount()) {
   end = this.getRowCount();
  }
  for (int i = range.getStart(); i < end; i++) {
   this.getRowFormatter().setVisible(i, true);
  }
  
 }
 
}


Pour l'utilisation:

   VerticalPanel v = new VerticalPanel();
   SimlePager p = new SimplePager();
   FlexTableHasRows flex = new FlexTableHasRows();
   
   for (int i = 0; i < 50; i++) {
      flex.setText(i, 0, i + "");
      flex.setText(i, 1, "Text");
   }
   
   flex.refresh();

   p.setDisplay(flex);
   v.add(flex);
   v.add(p);

Aucun commentaire:

Enregistrer un commentaire