blob: 3ab78bf4efc40a83b456c47de3e141e6678340d8 [file] [log] [blame]
/*
* Copyright 2010 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 com.google.gwt.sample.expenses.client;
import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.cell.client.ClickableTextCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.cellview.client.Header;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
/**
* A {@link Header} subclass that maintains sorting state and displays an icon
* to indicate the sort direction.
*/
public class SortableHeader extends Header<String> {
interface Template extends SafeHtmlTemplates {
@Template("<div style=\"position:relative;cursor:hand;cursor:pointer;"
+ "padding-right:{0}px;\">{1}<div>{2}</div></div>")
SafeHtml sorted(int imageWidth, SafeHtml arrow, String text);
@Template("<div style=\"position:relative;cursor:hand;cursor:pointer;"
+ "padding-right:{0}px;\"><div style=\"position:absolute;display:none;"
+ "\"></div><div>{1}</div></div>")
SafeHtml unsorted(int imageWidth, String text);
}
private static Template template;
/**
* Image resources.
*/
public static interface Resources extends ClientBundle {
ImageResource downArrow();
ImageResource upArrow();
}
private static final Resources RESOURCES = GWT.create(Resources.class);
private static final int IMAGE_WIDTH = 16;
private static final SafeHtml DOWN_ARROW = makeImage(RESOURCES.downArrow());
private static final SafeHtml UP_ARROW = makeImage(RESOURCES.upArrow());
private static SafeHtml makeImage(ImageResource resource) {
AbstractImagePrototype proto = AbstractImagePrototype.create(resource);
String html = proto.getHTML().replace("style='",
"style='position:absolute;right:0px;top:0px;");
return SafeHtmlUtils.fromTrustedString(html);
}
private boolean reverseSort = false;
private boolean sorted = false;
private String text;
SortableHeader(String text) {
super(new ClickableTextCell());
if (template == null) {
template = GWT.create(Template.class);
}
this.text = text;
}
public boolean getReverseSort() {
return reverseSort;
}
@Override
public String getValue() {
return text;
}
@Override
public void render(Context context, SafeHtmlBuilder sb) {
if (sorted) {
sb.append(template.sorted(IMAGE_WIDTH, reverseSort ? DOWN_ARROW : UP_ARROW, text));
} else {
sb.append(template.unsorted(IMAGE_WIDTH, text));
}
}
public void setReverseSort(boolean reverseSort) {
this.reverseSort = reverseSort;
}
public void setSorted(boolean sorted) {
this.sorted = sorted;
}
public void toggleReverseSort() {
this.reverseSort = !this.reverseSort;
}
}