| /* |
| * 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; |
| } |
| } |