/* * Copyright 2006 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.kepler.web.client; import org.kepler.web.client.DynaTableDataProvider.RowDataAcceptor; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.DockPanel; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.HasAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.TableListener; import com.google.gwt.user.client.ui.SourcesTableEvents; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.DialogBox; import com.google.gwt.user.client.ui.Frame; public class DynaTableWidget extends Composite implements TableListener{ private class NavBar extends Composite implements ClickListener { public NavBar() { initWidget(bar); bar.setStyleName("navbar"); status.setStyleName("status"); HorizontalPanel searchPanel = new HorizontalPanel(); searchField.setVisibleLength(12); searchButton.setStyleName("searchButton"); searchPanel.add(searchField); searchPanel.add(searchButton); HorizontalPanel buttons = new HorizontalPanel(); buttons.add(gotoFirst); buttons.add(gotoPrev); buttons.add(gotoNext); buttons.add(gotoLast); bar.add(buttons, DockPanel.EAST); bar.setCellHorizontalAlignment(buttons, DockPanel.ALIGN_RIGHT); HorizontalPanel statusPanel = new HorizontalPanel(); statusPanel.add(statusImage); statusPanel.add(new HTML(" ")); statusPanel.add(status); bar.add(statusPanel, DockPanel.CENTER); bar.setVerticalAlignment(DockPanel.ALIGN_MIDDLE); bar.setCellHorizontalAlignment(statusPanel, HasAlignment.ALIGN_RIGHT); bar.setCellVerticalAlignment(statusPanel, HasAlignment.ALIGN_MIDDLE); bar.setCellWidth(statusPanel, "100%"); bar.add(searchPanel, DockPanel.WEST); // Initialize prev & first button to disabled. // gotoPrev.setEnabled(false); gotoFirst.setEnabled(false); } public void onClick(Widget sender) { if (sender == gotoNext) { startRow += getDataRowCount(); selectRow(-1); refresh(); } else if (sender == gotoPrev) { startRow -= getDataRowCount(); if (startRow < 0) { startRow = 0; } selectRow(-1); refresh(); } else if (sender == gotoFirst) { startRow = 0; selectRow(-1); refresh(); } else if (sender == gotoLast) { startRow = getMaxRowCount() - (getMaxRowCount() % getRowInc()); selectRow(-1); refresh(); } else if(sender == searchButton) { searchString = searchField.getText(); startRow = 0; selectRow(-1); search(searchField.getText()); } } public final DockPanel bar = new DockPanel(); public final Button gotoFirst = new Button("<<", this); public final Button gotoNext = new Button(">", this); public final Button gotoPrev = new Button("<", this); public final Button gotoLast = new Button(">>", this); public final Button searchButton = new Button("Search", this); public final TextBox searchField = new TextBox(); public final HTML status = new HTML(); public final Image statusImage = new Image("spinner-anim.gif"); } private class RowDataAcceptorImpl implements RowDataAcceptor { public void accept(int startRow, String[][] data) { int destRowCount = getDataRowCount(); int destColCount = grid.getCellCount(0); assert (data.length <= destRowCount) : "Too many rows"; int srcRowIndex = 0; int srcRowCount = data.length; int destRowIndex = 1; // skip navbar row for (; srcRowIndex < srcRowCount; ++srcRowIndex, ++destRowIndex) { String[] srcRowData = data[srcRowIndex]; assert (srcRowData.length == destColCount) : " Column count mismatch"; for (int srcColIndex = 0; srcColIndex < destColCount; ++srcColIndex) { String cellHTML = srcRowData[srcColIndex]; grid.setText(destRowIndex, srcColIndex, cellHTML); grid.getCellFormatter().setStyleName(destRowIndex, 0, "infoIcon"); } } // Clear remaining table rows. // boolean isLastPage = false; for (; destRowIndex < destRowCount + 1; ++destRowIndex) { isLastPage = true; for (int destColIndex = 0; destColIndex < destColCount; ++destColIndex) { grid.clearCell(destRowIndex, destColIndex); } } // Synchronize the nav buttons. // navbar.gotoNext.setEnabled(!isLastPage); navbar.gotoFirst.setEnabled(startRow > 0); navbar.gotoPrev.setEnabled(startRow > 0); navbar.gotoLast.setEnabled(!isLastPage); // Update the status message. // setStatusText((startRow + 1) + " - " + (startRow + srcRowCount) + " of " + getMaxRowCount()); setStatusImage(false); currentEndRecordNum = startRow + srcRowCount; currentBeginRecordNum = startRow + 1; } public void failed(Throwable caught) { String msg = "Failed to access data"; if (caught != null) { msg += ": " + caught.getMessage(); } setStatusText(msg); } } private static class InfoDialog extends DialogBox implements ClickListener { public InfoDialog(String title, String docid) { setText(title); Frame iframe = new Frame("http://library.kepler-project.org/kepler/metacat?action=read&docid=" + docid + "&qformat=kepler"); Button closeButton = new Button("Close", this); /*HTML msg = new HTML( "