1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.vaadin.gwt.client.grid;
35
36 import com.google.gwt.dom.client.Document;
37 import com.google.gwt.dom.client.Element;
38 import com.google.gwt.dom.client.ImageElement;
39 import com.google.gwt.dom.client.Style;
40 import com.google.gwt.dom.client.Style.Display;
41 import com.google.gwt.dom.client.Style.Unit;
42 import com.google.gwt.user.client.DOM;
43 import com.google.gwt.user.client.Event;
44 import com.vaadin.client.UIDL;
45 import com.vaadin.v7.client.ui.VTreeTablePatched;
46
47
48
49
50 public class VMagnoliaTreeTable extends VTreeTablePatched {
51
52 @Override
53 protected VScrollTableBody createScrollBody() {
54 scrollBody = new VMagnoliaTreeTableScrollBody();
55 return scrollBody;
56 }
57
58 @Override
59 protected String buildCaptionHtmlSnippet(UIDL uidl) {
60 return (uidl.getTag().equals("column")) ? super.buildCaptionHtmlSnippet(uidl) : uidl.getStringAttribute("caption");
61 }
62
63
64
65
66 public class VMagnoliaTreeTableScrollBody extends VTreeTableScrollBody {
67
68 protected VMagnoliaTreeTableScrollBody() {
69 super();
70 }
71
72 @Override
73 protected VScrollTableRow createRow(UIDL uidl, char[] aligns2) {
74 if (uidl.hasAttribute("gen_html")) {
75
76 return new VTreeTableGeneratedRow(uidl, aligns2);
77 }
78 return new VMagnoliaTreeTableRow(uidl, aligns2);
79 }
80
81
82
83
84 class VMagnoliaTreeTableRow extends VTreeTableRow {
85
86 public VMagnoliaTreeTableRow(UIDL uidl, char[] aligns2) {
87 super(uidl, aligns2);
88 }
89
90
91
92
93 @Override
94 protected boolean addTreeSpacer(UIDL rowUidl) {
95 if (cellShowsTreeHierarchy(getElement().getChildCount() - 1)) {
96 Element container = (Element) getElement().getLastChild().getChild(0);
97
98 if (rowUidl.hasAttribute("icon")) {
99
100 ImageElement icon = Document.get().createImageElement();
101 icon.setClassName("v-icon");
102 icon.setAlt("icon");
103 icon.setSrc(client.translateVaadinUri(rowUidl.getStringAttribute("icon")));
104 container.insertFirst(icon);
105 }
106
107 String classname = "v-treetable-treespacer-patched";
108 if (rowUidl.getBooleanAttribute("ca")) {
109 canHaveChildren = true;
110 open = rowUidl.getBooleanAttribute("open");
111 classname += open ? " v-treetable-node-open" : " v-treetable-node-closed";
112 classname += open ? " icon-arrow1_s" : " icon-arrow1_e";
113 }
114
115 treeSpacer = Document.get().createDivElement();
116 treeSpacer.getStyle().setDisplay(Display.INLINE_BLOCK);
117 treeSpacer.setClassName(classname);
118 container.insertAfter(treeSpacer, container.getFirstChild());
119 depth = rowUidl.hasAttribute("depth") ? rowUidl.getIntAttribute("depth") : 0;
120 setIndent();
121 isTreeCellAdded = true;
122 return true;
123 }
124 return false;
125 }
126
127 @Override
128 public void onBrowserEvent(Event event) {
129 if (event.getEventTarget().cast() == treeSpacer &&
130 treeSpacer.getClassName().contains("node")) {
131 if (event.getTypeInt() == Event.ONMOUSEDOWN || event.getTypeInt() == Event.ONTOUCHSTART) {
132 sendToggleCollapsedUpdate(getKey());
133 event.stopPropagation();
134 event.preventDefault();
135 }
136 return;
137 }
138 super.onBrowserEvent(event);
139 }
140
141 @Override
142 protected void setIndent() {
143 if (getIndentWidth() > 0) {
144 treeSpacer.getStyle().setWidth(getIndent(), Unit.PX);
145 }
146 }
147
148 @Override
149 protected void setCellWidth(int cellIx, int width) {
150 super.setCellWidth(cellIx, width);
151
152 if (cellIx == 0) {
153 Element cell = DOM.getChild(getElement(), cellIx);
154 Style wrapperStyle = cell.getFirstChildElement().getStyle();
155 wrapperStyle.setPropertyPx("width", width);
156 cell.getStyle().setPropertyPx("width", width);
157 }
158 }
159
160 @Override
161 protected boolean isRenderHtmlInCells() {
162 return true;
163 }
164 }
165 }
166 }