/* * RHQ Management Platform * Copyright (C) 2005-2009 Red Hat, Inc. * All rights reserved. * * 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 version 2 of the License. * * This program 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.coregui.client.components.table; import com.smartgwt.client.data.Criteria; import com.smartgwt.client.data.SortSpecifier; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.grid.ListGridRecord; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.util.RPCDataSource; /** * The TableSection abstract implementation that supports IDs as basic Strings. * * Use this if you have tabular data whose rows are not identified with Integers but * some other non-numeric string. * * If you have tabular data whose rows have integer IDs, use {@link TableSection}. * * @author John Mazzitelli */ @SuppressWarnings("unchecked") public abstract class StringIDTableSection<DS extends RPCDataSource> extends AbstractTableSection<DS, String> { public StringIDTableSection(String tableTitle, boolean autoFetchData) { super(tableTitle, autoFetchData); } public StringIDTableSection(String tableTitle, Criteria criteria, SortSpecifier[] sortSpecifiers, String[] excludedFieldNames, boolean autoFetchData) { super(tableTitle, criteria, sortSpecifiers, excludedFieldNames, autoFetchData); } public StringIDTableSection(String tableTitle, Criteria criteria, SortSpecifier[] sortSpecifiers, String[] excludedFieldNames) { super(tableTitle, criteria, sortSpecifiers, excludedFieldNames); } public StringIDTableSection(String tableTitle, Criteria criteria, SortSpecifier[] sortSpecifiers) { super(tableTitle, criteria, sortSpecifiers); } public StringIDTableSection(String tableTitle, Criteria criteria) { super(tableTitle, criteria); } public StringIDTableSection(String tableTitle, SortSpecifier[] sortSpecifiers, String[] excludedFieldNames) { super(tableTitle, sortSpecifiers, excludedFieldNames); } public StringIDTableSection(String tableTitle, SortSpecifier[] sortSpecifiers) { super(tableTitle, sortSpecifiers); } public StringIDTableSection(String tableTitle) { super(tableTitle); } @Override protected String getId(ListGridRecord record) { String id = null; if (record != null) { id = record.getAttribute("id"); } if (id == null || id.length() == 0) { String msg = MSG.view_tableSection_error_noId(this.getClass().toString()); CoreGUI.getErrorHandler().handleError(msg); throw new IllegalStateException(msg); } return id; } @Override public void showDetails(String id) { if (id != null && id.length() > 0) { CoreGUI.goToView(getBasePath() + "/" + convertIDToCurrentViewPath(id)); } else { String msg = MSG.view_tableSection_error_badId(this.getClass().toString(), (id == null) ? "null" : id.toString()); CoreGUI.getErrorHandler().handleError(msg); throw new IllegalArgumentException(msg); } } @Override public abstract Canvas getDetailsView(String id); // the main CoreGUI class will assume anything with a digit as the first character in a path segment in the URL is an ID. public static final String ID_PREFIX = "0id_"; // the prefix to be placed in front of the string IDs in URLs @Override protected String convertCurrentViewPathToID(String path) { if (!path.startsWith(ID_PREFIX)) { return path; // prefixed has already been stripped } return path.substring(ID_PREFIX.length()); // skip the initial "0id_" - see convertIDToCurrentViewPath for what this is all about } @Override protected String convertIDToCurrentViewPath(String id) { // Because we aren't assured the given ID will be a digit, let's prepend the digit here and make it // look like an ID to CoreGUI. We will strip this off when we convert this back to an ID - see convertCurrentViewPathToID if (id.startsWith(ID_PREFIX)) { return id; // it is already prefixed } return ID_PREFIX + id; } }