public <P extends Component & IPageableItems> BSPaginationPanel(String id, P pageable) {
super(id);
this.pageable = pageable;
add(new OffsetLink("previous", getPageable(), -1));
add(new FirstLink("first", getPageable()));
add(new WebMarkupContainer("firstEllipse")
.add($b.visibleIf($m.get(() -> (getCurrentPage() - getMiddlePagesRadius()) > 1))));
add(new RefreshingView<Long>("pages") {
@Override
protected Iterator<IModel<Long>> getItemModels() {
return getMiddlePagesRange().stream().map($m::ofValue).map(m -> (IModel<Long>)m).iterator();
}
@Override
protected void populateItem(Item<Long> item) {
item
.add(newNumberedPageLink(item))
.add($b.classAppender("active", $m.get(() -> item.getModelObject() == getCurrentPage())));
}
});
add(new WebMarkupContainer("lastEllipse")
.add($b.visibleIf($m.get(() -> (getCurrentPage() + getMiddlePagesRadius()) < getLastPage() - 1))));
add(new LastLink("last", getPageable()));
add(new OffsetLink("next", getPageable(), +1));
}