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);
}
}
}
|