/*
* RHQ Management Platform
* Copyright (C) 2005-2008 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.enterprise.gui.common.sorting;
import java.io.IOException;
import java.util.List;
import javax.faces.component.UIComponent;
import javax.faces.component.UIData;
import javax.faces.component.UIGraphic;
import javax.faces.component.UIOutput;
import javax.faces.component.html.HtmlOutputLabel;
import javax.faces.context.ResponseWriter;
import com.sun.faces.renderkit.html_basic.CommandLinkRenderer;
import org.rhq.core.domain.util.OrderingField;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageOrdering;
import org.rhq.enterprise.gui.common.paging.PageControlView;
import org.rhq.enterprise.gui.legacy.WebUser;
import org.rhq.enterprise.gui.legacy.WebUserPreferences;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
public class SortableColumnHeaderRenderer extends CommandLinkRenderer {
// default impl should work just fine
public SortableColumnHeaderRenderer() {
super();
}
/* easy trick to override and put addition attributes in the writer */
@Override
protected void writeValue(UIComponent component, ResponseWriter writer) throws IOException {
String sort = ((SortableColumnHeader) component).getSort();
if (sort == null) {
sort = "FORGOT_TO_ADD_SORT_ATTRIBUTE";
}
writer.writeAttribute("sort", sort, "sort");
// remove previous sort images
List<UIComponent> children = component.getChildren();
for (int i = children.size() - 1; i >= 0; i--) {
// should only be one, but let's loop-remove just in case
if (children.get(i) instanceof UIGraphic) {
UIGraphic outputGraphic = (UIGraphic) children.get(i);
if (!outputGraphic.getUrl().startsWith("/images/tb_sort")) {
continue; // only remove sort images, to allow images to exist in the sortable column
}
children.remove(i);
}
if (children.get(i) instanceof UIOutput) {
UIOutput output = (UIOutput) children.get(i);
String value = output.getValue().toString();
if (isNumber(value)) {
// also remove sort index labels ('1', '2', '3') since they will be reconstructed below
children.remove(i);
}
}
}
PageControl pc = getPageControl(component);
// changing the sort on the column
int i = 0;
for (OrderingField field : pc.getOrderingFields()) {
i++;
if (field.getField().equals(sort)) {
UIGraphic image = new UIGraphic();
if (field.getOrdering().equals(PageOrdering.ASC)) {
if (i == 1) {
image.setUrl("/images/tb_sortup.gif");
} else {
image.setUrl("/images/tb_sortup_inactive.gif");
}
} else {
if (i == 1) {
image.setUrl("/images/tb_sortdown.gif");
} else {
image.setUrl("/images/tb_sortdown_inactive.gif");
}
}
/*
* add the image at the end of all components, which will make it into part of the hyperlink
*/
children.add(image);
/*
* also, add a tiny number to indicate what order the columns are sorted in
*/
UIOutput label = new HtmlOutputLabel();
label.setValue(String.valueOf(i));
children.add(label);
break;
}
}
super.writeValue(component, writer);
}
private boolean isNumber(String value) {
if (value == null) {
return false;
}
value = value.trim();
if (value.equals("")) {
return false;
}
for (char c : value.toCharArray()) {
if (Character.isDigit(c) == false) {
return false;
}
}
return true;
}
private PageControl getPageControl(UIComponent component) {
try {
UIData enclosingTable = getEnclosingUIData(component);
UIComponent facet = enclosingTable.getFacet("PageControlView");
String viewName = facet.getId();
PageControlView currentView = PageControlView.valueOf(viewName);
WebUser user = EnterpriseFacesContextUtility.getWebUser();
WebUserPreferences preferences = user.getWebPreferences();
return preferences.getPageControl(currentView);
} catch (Throwable t) {
// be tolerant of JSF
return new PageControl(0, 15); // return something reasonable
}
}
private UIData getEnclosingUIData(UIComponent component) {
UIComponent next = component;
while (next.getParent() != null) {
next = next.getParent();
if (next instanceof UIData) {
return (UIData) next;
}
}
return null;
}
}