/******************************************************************************* *Copyright (c) 2009 Eucalyptus Systems, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, only version 3 of the License. * * * This file 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 General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see <http://www.gnu.org/licenses/>. * * Please contact Eucalyptus Systems, Inc., 130 Castilian * Dr., Goleta, CA 93101 USA or visit <http://www.eucalyptus.com/licenses/> * if you need additional information or have any questions. * * This file may incorporate work covered under the following copyright and * permission notice: * * Software License Agreement (BSD License) * * Copyright (c) 2008, Regents of the University of California * All rights reserved. * * Redistribution and use of this software in source and binary forms, with * or without modification, are permitted provided that the following * conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. USERS OF * THIS SOFTWARE ACKNOWLEDGE THE POSSIBLE PRESENCE OF OTHER OPEN SOURCE * LICENSED MATERIAL, COPYRIGHTED MATERIAL OR PATENTED MATERIAL IN THIS * SOFTWARE, AND IF ANY SUCH MATERIAL IS DISCOVERED THE PARTY DISCOVERING * IT MAY INFORM DR. RICH WOLSKI AT THE UNIVERSITY OF CALIFORNIA, SANTA * BARBARA WHO WILL THEN ASCERTAIN THE MOST APPROPRIATE REMEDY, WHICH IN * THE REGENTS’ DISCRETION MAY INCLUDE, WITHOUT LIMITATION, REPLACEMENT * OF THE CODE SO IDENTIFIED, LICENSING OF THE CODE SO IDENTIFIED, OR * WITHDRAWAL OF THE CODE CAPABILITY TO THE EXTENT NEEDED TO COMPLY WITH * ANY SUCH LICENSES OR RIGHTS. *******************************************************************************/ package edu.ucsb.eucalyptus.admin.client; import com.google.gwt.user.client.ui.*; import java.util.List; import java.util.ArrayList; import com.google.gwt.user.client.rpc.AsyncCallback; // dmitrii TODO: remove commented out lines once the CSS-based design is confirmed public class DownloadsTable extends VerticalPanel { private String theUrl; private String theHumanUrl; private String theName; private int maxEntries; private Label DownloadsHeader = new Label(); private HTML statusLabel = new HTML(); private Grid grid = new Grid(); private List<DownloadsWeb> DownloadsList = new ArrayList<DownloadsWeb>(); private String sessionId; public DownloadsTable(String sessionId, String theUrl, String theHumanUrl, String theName, int maxEntries) { this.sessionId = sessionId; this.setStyleName("euca-config-component"); this.theUrl = theUrl; this.theHumanUrl = theHumanUrl; this.theName = theName; this.maxEntries = maxEntries; this.setSpacing(10); //this.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); //this.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); this.DownloadsHeader.setText(this.theName); this.DownloadsHeader.setStyleName("euca-section-header"); this.add(DownloadsHeader); this.add(this.grid); HorizontalPanel hpanel = new HorizontalPanel(); hpanel.setSpacing(5); hpanel.add(this.statusLabel); // this.statusLabel.setWidth("600"); this.statusLabel.setText("Contacting " + this.theName + " server"); this.statusLabel.setStyleName("euca-greeting-pending"); this.add(hpanel); EucalyptusWebBackend.App.getInstance().getDownloads(this.sessionId, this.theUrl, new GetCallback(this)); } private void rebuildTable() { int rows = this.DownloadsList.size(); if (rows == 0) { this.statusLabel.setHTML("Failed to load the list of images (<a href=\"" + this.theHumanUrl + "\">visit</a> the repository)"); this.statusLabel.setStyleName("euca-greeting-error"); this.statusLabel.setVisible(true); return; } // draw the table this.statusLabel.setVisible(false); if (rows>this.maxEntries) { rows = this.maxEntries; } this.grid.clear(); this.grid.resize(rows+1, 2); // +1 because of header this.grid.setVisible(true); this.grid.setStyleName("euca-table"); this.grid.setCellPadding(6); this.grid.setWidget(0, 0, new Label("Name")); this.grid.setWidget(0, 1, new Label("Description")); this.grid.getRowFormatter().setStyleName(0, "euca-table-heading-row"); for (int row = 0; row<rows; row++) { addDownloadsEntry(row+1, this.DownloadsList.get(row)); // +1 because of header } } private void addDownloadsEntry(int row, DownloadsWeb Downloads) { if ((row % 2) == 1) { this.grid.getRowFormatter().setStyleName(row, "euca-table-odd-row"); } else { this.grid.getRowFormatter().setStyleName(row, "euca-table-even-row"); } final HTML name_b = new HTML("<a href=\"" + Downloads.getUrl() + "\">" + Downloads.getName() + "</a>"); this.grid.setWidget(row, 0, name_b); final Label description_b = new Label(); description_b.setText(Downloads.getDescription()); this.grid.setWidget(row, 1, description_b); } public List<DownloadsWeb> getDownloadsList() { return DownloadsList; } class GetCallback implements AsyncCallback { private DownloadsTable parent; GetCallback(final DownloadsTable parent) { this.parent = parent; } public void onFailure(final Throwable throwable) { this.parent.statusLabel.setHTML("Failed to reach your server (<a href=\"" + this.parent.theHumanUrl + "\">visit</a> the repository)"); this.parent.statusLabel.setStyleName("euca-greeting-error"); this.parent.statusLabel.setVisible(true); } public void onSuccess(final Object o) { List<DownloadsWeb> newDownloadsList = (List<DownloadsWeb>) o; this.parent.DownloadsList = newDownloadsList; this.parent.rebuildTable(); } } }