PagingPanel.java :  » Image » jchannel » org » jchannel » client » ui » Java Open Source

Java Open Source » Image » jchannel 
jchannel » org » jchannel » client » ui » PagingPanel.java
package org.jchannel.client.ui;

import com.google.gwt.core.client.GWT;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;

import org.jchannel.client.state.PageableState;
import org.jchannel.client.Token;

public final class PagingPanel extends Composite {

  public interface Images extends ClientBundle {

    @Source("first.png")
    ImageResource first();

    @Source("last.png")
    ImageResource last();

    @Source("previous.png")
    ImageResource previous();

    @Source("next.png")
    ImageResource next();

    @Source("firstDisabled.png")
    ImageResource firstDisabled();

    @Source("lastDisabled.png")
    ImageResource lastDisabled();

    @Source("previousDisabled.png")
    ImageResource previousDisabled();

    @Source("nextDisabled.png")
    ImageResource nextDisabled();
  }

  private static final int MAX_PAGING_LINKS = 10;
  private static final Images IMAGES = (Images) GWT.create(Images.class);

  private PageableState pageableState;
  private HorizontalPanel panel;

  public PagingPanel(final PageableState pageableState) {
    super();

    this.pageableState = pageableState;

    panel = new HorizontalPanel();
    panel.setStyleName("pagingPanel");
    panel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);

    this.initWidget(panel);

    pageableState.addPropertyChangeListener("pages", new PagesListener());

    History.addValueChangeHandler(new HistoryChangeHandler());
  }

  private void redraw(final Token token) {
    String view = token.getView();
    String key = token.getKey();
    int currentPage = token.getPage();
    int pages = pageableState.getPages();

    panel.clear();

    if (currentPage > 1) {
      ImageHyperlink first = new ImageHyperlink(new Image(IMAGES.first()), view + "/" + key + "/1");
      panel.add(first);

      ImageHyperlink previous = new ImageHyperlink(new Image(IMAGES.previous()),
        view + "/" + key + "/" + (currentPage - 1));
      panel.add(previous);
    } else {
      panel.add(new Image(IMAGES.firstDisabled()));
      panel.add(new Image(IMAGES.previousDisabled()));
    }

    int pageFrom = currentPage - ((MAX_PAGING_LINKS - 1) / 2);

    if (pageFrom < 1) {
      pageFrom = 1;
    } else if (pageFrom > (pages - (MAX_PAGING_LINKS - 1))) {
      pageFrom = (pages - (MAX_PAGING_LINKS - 1));
    }

    int pageTo = pageFrom + (MAX_PAGING_LINKS - 1);

    if (pageTo > pages) {
      pageTo = pages;
    }

    for (int page = pageFrom; page <= pageTo; page++) {
      String s = String.valueOf(page);

      if (page == currentPage) {
        panel.add(new Label(s));
      } else {
        Hyperlink hyperlink = new Hyperlink(s, view + "/" + key + "/" + s);
        hyperlink.setTitle("page " + s);
        panel.add(hyperlink);
      }
    }

    if (currentPage < pages) {
      ImageHyperlink next = new ImageHyperlink(new Image(IMAGES.next()),
        view + "/" + key + "/" + (currentPage + 1));
      panel.add(next);

      ImageHyperlink last = new ImageHyperlink(new Image(IMAGES.last()), view + "/" + key + "/" + pages);
      panel.add(last);
    } else {
      panel.add(new Image(IMAGES.nextDisabled()));
      panel.add(new Image(IMAGES.lastDisabled()));
    }
  }

  private final class HistoryChangeHandler implements ValueChangeHandler<String> {

    @Override
    public void onValueChange(final ValueChangeEvent<String> event) {
      Token token = new Token(event.getValue());
      pageableState.setPage(token.getPage());
      redraw(token);
    }
  }

  private final class PagesListener implements PropertyChangeListener {

    @Override
    public void propertyChange(final PropertyChangeEvent event) {
      Token token = new Token(History.getToken());
      pageableState.setPage(token.getPage());
      redraw(token);
    }
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.