/*
* OneCMDB, an open source configuration management project.
* Copyright 2007, Lokomo Systems AB, and individual contributors
* as indicated by the @authors tag. See the copyright.txt in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.onecmdb.ui.gwt.toolkit.client.view.table;
import org.onecmdb.ui.gwt.toolkit.client.control.listener.LoadListener;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.KeyboardListener;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
public class CITablePageControlPanel extends Composite implements LoadListener {
private Label firstItemNumber = new Label("0");
private Label lastItemNumber = new Label("0");
private Label currentRows = new Label("Loading..");
TextBox search = new TextBox();
private CITablePanel table;
private Image nextImage;
private Image prevImage;
private Image reload;
public CITablePageControlPanel(final CITablePanel table) {
this.table = table;
table.addLoadListener(this);
HorizontalPanel root = new HorizontalPanel();
root.setStyleName("onecmdb-table-page-search-panel");
root.setWidth("100%");
HorizontalPanel actions = new HorizontalPanel();
root.add(actions);
root.setCellHorizontalAlignment(actions, HorizontalPanel.ALIGN_LEFT);
HorizontalPanel paging = new HorizontalPanel();
root.add(paging);
root.setCellHorizontalAlignment(paging, HorizontalPanel.ALIGN_RIGHT);
reload = new Image("images/reload.gif");
reload.addClickListener(getSearchClickListener());
// Enable 'return key' to start search.
search.addKeyboardListener(new KeyboardListener() {
public void onKeyDown(Widget sender, char keyCode, int modifiers) {
}
public void onKeyPress(Widget sender, char keyCode, int modifiers) {
if (keyCode == KeyboardListener.KEY_ENTER) {
getSearchClickListener().onClick(sender);
}
}
public void onKeyUp(Widget sender, char keyCode, int modifiers) {
}
});
prevImage = new Image("images/prev.gif");
nextImage = new Image("images/next.gif");
nextImage.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
setNextPage();
table.reload();
}
});
prevImage.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
setPrevPage();
table.reload();
}
});
paging.add(prevImage);
paging.add(firstItemNumber);
paging.add(new Label("-"));
paging.add(lastItemNumber);
paging.add(new Label("("));
paging.add(currentRows);
paging.add(new Label(")"));
paging.add(nextImage);
actions.add(new Label("Search"));
actions.add(search);
actions.add(reload);
/*
actions.add(new Label("PageSize"));
TextBox pageSize = new TextBox();
pageSize.setVisibleLength(2);
actions.add(pageSize);
*/
table.addLoadListener(this);
initWidget(root);
}
private ClickListener getSearchClickListener() {
return(new ClickListener() {
public void onClick(Widget sender) {
table.getTableControl().setSearchText(search.getText());
table.getTableControl().setFirstItem(new Integer(0));
table.reload();
}
});
}
public void update() {
table.getTableControl().getRowCount(new AsyncCallback() {
public void onFailure(Throwable caught) {
}
public void onSuccess(Object result) {
if (result instanceof Integer) {
int totalItems = ((Integer)result).intValue();
int firstItem = getInt(table.getTableControl().getFirstItem());
int pageSize = getInt(table.getTableControl().getMaxResult());
int lastItem = pageSize + firstItem;
if (lastItem >= totalItems) {
lastItem = totalItems;
enableNext(false);
} else {
enableNext(true);
}
if (firstItem <= 0) {
enablePrev(false);
} else {
enablePrev(true);
}
// Set the labels.
currentRows.setText(result.toString());
firstItemNumber.setText("" + ((totalItems > 0) ? (firstItem+1) : 0));
lastItemNumber.setText("" + lastItem);
}
}
});
}
private void enableNext(boolean value) {
nextImage.setVisible(value);
}
private void enablePrev(boolean value) {
prevImage.setVisible(value);
}
public void setNextPage() {
int first = getInt(table.getTableControl().getFirstItem());
int next = first + getInt(table.getTableControl().getMaxResult());
table.getTableControl().setFirstItem(new Integer(next));
}
public void setPrevPage() {
int first = getInt(table.getTableControl().getFirstItem());
int max = getInt(table.getTableControl().getMaxResult());
int prev = first - max;
if (prev < 0) {
prev = 0;
}
table.getTableControl().setFirstItem(new Integer(prev));
}
private int getInt(Integer integer) {
if (integer == null) {
return(0);
}
return (integer.intValue());
}
public void onLoadComplete(Object sender) {
reload.setUrl("images/reload.gif");
reload.setTitle("Reload");
}
public void onLoadFailure(Object sender, Throwable caught) {
reload.setUrl("images/reload_error.gif");
reload.setTitle(caught.toString());
}
public void onLoadStart(Object sender) {
reload.setUrl("images/indicator.gif");
reload.setTitle("Loading....");
update();
}
}