root / web_client / src / gr / grnet / pithos / web / client / SortableHeader.java @ ab1eb3f8
History | View | Annotate | Download (3.5 kB)
1 |
/*
|
---|---|
2 |
* Copyright 2010 Google Inc.
|
3 |
*
|
4 |
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
5 |
* use this file except in compliance with the License. You may obtain a copy of
|
6 |
* the License at
|
7 |
*
|
8 |
* http://www.apache.org/licenses/LICENSE-2.0
|
9 |
*
|
10 |
* Unless required by applicable law or agreed to in writing, software
|
11 |
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12 |
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13 |
* License for the specific language governing permissions and limitations under
|
14 |
* the License.
|
15 |
*/
|
16 |
package gr.grnet.pithos.web.client; |
17 |
|
18 |
import com.google.gwt.cell.client.Cell.Context; |
19 |
import com.google.gwt.cell.client.ClickableTextCell; |
20 |
import com.google.gwt.core.client.GWT; |
21 |
import com.google.gwt.resources.client.ClientBundle; |
22 |
import com.google.gwt.resources.client.ImageResource; |
23 |
import com.google.gwt.safehtml.client.SafeHtmlTemplates; |
24 |
import com.google.gwt.safehtml.shared.SafeHtml; |
25 |
import com.google.gwt.safehtml.shared.SafeHtmlBuilder; |
26 |
import com.google.gwt.safehtml.shared.SafeHtmlUtils; |
27 |
import com.google.gwt.user.cellview.client.Header; |
28 |
import com.google.gwt.user.client.ui.AbstractImagePrototype; |
29 |
|
30 |
/**
|
31 |
* A {@link Header} subclass that maintains sorting state and displays an icon
|
32 |
* to indicate the sort direction.
|
33 |
*/
|
34 |
public class SortableHeader extends Header<String> { |
35 |
|
36 |
interface Template extends SafeHtmlTemplates { |
37 |
@Template("<div style=\"position:relative;cursor:hand;cursor:pointer;" |
38 |
+ "padding-right:{0}px;\">{1}<div>{2}</div></div>")
|
39 |
SafeHtml sorted(int imageWidth, SafeHtml arrow, String text); |
40 |
|
41 |
@Template("<div style=\"position:relative;cursor:hand;cursor:pointer;" |
42 |
+ "padding-right:{0}px;\"><div style=\"position:absolute;display:none;"
|
43 |
+ "\"></div><div>{1}</div></div>")
|
44 |
SafeHtml unsorted(int imageWidth, String text); |
45 |
} |
46 |
|
47 |
private static Template template; |
48 |
|
49 |
/**
|
50 |
* Image resources.
|
51 |
*/
|
52 |
public static interface Resources extends ClientBundle { |
53 |
|
54 |
ImageResource downArrow(); |
55 |
|
56 |
ImageResource upArrow(); |
57 |
} |
58 |
|
59 |
private static final Resources RESOURCES = GWT.create(Resources.class); |
60 |
private static final int IMAGE_WIDTH = 16; |
61 |
private static final SafeHtml DOWN_ARROW = makeImage(RESOURCES.downArrow()); |
62 |
private static final SafeHtml UP_ARROW = makeImage(RESOURCES.upArrow()); |
63 |
|
64 |
private static SafeHtml makeImage(ImageResource resource) { |
65 |
AbstractImagePrototype proto = AbstractImagePrototype.create(resource); |
66 |
String html = proto.getHTML().replace("style='", |
67 |
"style='position:absolute;right:0px;top:0px;");
|
68 |
return SafeHtmlUtils.fromTrustedString(html);
|
69 |
} |
70 |
|
71 |
private boolean reverseSort = false; |
72 |
private boolean sorted = false; |
73 |
private String text; |
74 |
|
75 |
SortableHeader(String text) {
|
76 |
super(new ClickableTextCell()); |
77 |
if (template == null) { |
78 |
template = GWT.create(Template.class); |
79 |
} |
80 |
this.text = text;
|
81 |
} |
82 |
|
83 |
public boolean getReverseSort() { |
84 |
return reverseSort;
|
85 |
} |
86 |
|
87 |
@Override
|
88 |
public String getValue() { |
89 |
return text;
|
90 |
} |
91 |
|
92 |
@Override
|
93 |
public void render(Context context, SafeHtmlBuilder sb) { |
94 |
if (sorted) {
|
95 |
sb.append(template.sorted(IMAGE_WIDTH, reverseSort ? DOWN_ARROW : UP_ARROW, text)); |
96 |
} else {
|
97 |
sb.append(template.unsorted(IMAGE_WIDTH, text)); |
98 |
} |
99 |
} |
100 |
|
101 |
public void setReverseSort(boolean reverseSort) { |
102 |
this.reverseSort = reverseSort;
|
103 |
} |
104 |
|
105 |
public void setSorted(boolean sorted) { |
106 |
this.sorted = sorted;
|
107 |
} |
108 |
|
109 |
public void toggleReverseSort() { |
110 |
this.reverseSort = !this.reverseSort; |
111 |
} |
112 |
} |