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.form.formsection.widget;
35
36 import info.magnolia.ui.vaadin.gwt.client.form.tab.widget.FormTabWidget;
37 import info.magnolia.ui.vaadin.gwt.client.form.widget.FormFieldWrapper;
38 import info.magnolia.ui.vaadin.gwt.client.jquerywrapper.AnimationSettings;
39 import info.magnolia.ui.vaadin.gwt.client.jquerywrapper.JQueryCallback;
40 import info.magnolia.ui.vaadin.gwt.client.jquerywrapper.JQueryWrapper;
41
42 import java.util.ArrayList;
43 import java.util.LinkedHashMap;
44 import java.util.List;
45 import java.util.Map;
46
47 import com.google.gwt.user.client.DOM;
48 import com.google.gwt.user.client.Element;
49 import com.google.gwt.user.client.Timer;
50 import com.google.gwt.user.client.ui.FlowPanel;
51 import com.google.gwt.user.client.ui.Widget;
52
53
54
55
56 public class FormSectionWidget extends FlowPanel {
57
58 private final Map<Widget, FormFieldWrapper> sections = new LinkedHashMap<Widget, FormFieldWrapper>();
59
60 private final Element fieldSet = DOM.createElement("fieldset");
61
62 private final Element legend = DOM.createElement("legend");
63
64 private final Element horizontalRule = DOM.createElement("hr");
65
66 public FormSectionWidget() {
67 super();
68 getElement().appendChild(fieldSet);
69 fieldSet.appendChild(legend);
70 fieldSet.appendChild(horizontalRule);
71 }
72
73 @Override
74 public void add(Widget child) {
75 throw new UnsupportedOperationException();
76 }
77
78 @Override
79 public boolean remove(Widget w) {
80 FormFieldWrapper fieldSection = (w instanceof FormFieldWrapper) ? (FormFieldWrapper) w : sections.get(w);
81 if (w != null) {
82 sections.remove(w);
83 super.remove(fieldSection);
84 }
85 return false;
86 }
87
88 @Override
89 public void insert(Widget w, int beforeIndex) {
90 if (sections.containsKey(w)) {
91 return;
92 }
93 FormFieldWrapper fieldSection;
94 if (!(w instanceof FormFieldWrapper)) {
95 fieldSection = new FormFieldWrapper();
96 sections.put(w, fieldSection);
97 fieldSection.setField(w);
98 } else {
99 fieldSection = (FormFieldWrapper) w;
100 }
101
102
103
104 beforeIndex = adjustIndex(fieldSection, beforeIndex);
105 fieldSection.removeFromParent();
106 getChildren().insert(fieldSection, beforeIndex);
107 DOM.insertChild(fieldSet, fieldSection.getElement(), beforeIndex + 1);
108 adopt(fieldSection);
109 }
110
111 @Override
112 public FormTabWidget getParent() {
113 final Widget parent = super.getParent();
114 if (parent == null || !(parent instanceof FormTabWidget)) {
115 return null;
116 }
117 return (FormTabWidget) super.getParent();
118 }
119
120 public void setDescriptionVisible(boolean isAccessible) {
121 if (!hasDialogDescriptionHeader()) {
122 boolean hasDisplayedFormFieldHelpSection = false;
123 for (final FormFieldWrapper fs : sections.values()) {
124 if (fs.isDisplayingHelpSection()) {
125 fs.setHelpEnabled(false);
126 hasDisplayedFormFieldHelpSection = true;
127 }
128 }
129 if (hasDisplayedFormFieldHelpSection) {
130 return;
131 } else if (!isAccessible) {
132 isAccessible = true;
133 }
134 }
135 for (final FormFieldWrapper fs : sections.values()) {
136 fs.setHelpEnabled(isAccessible);
137 }
138 }
139
140 private boolean hasDialogDescriptionHeader() {
141 Element element = this.getElement();
142 while (element != null) {
143 if ("dialogDescriptionHeader".equals(element.getAttribute("role"))) {
144 return true;
145 }
146 element = (Element) element.getParentElement();
147 }
148 return false;
149 }
150
151 public List<FormFieldWrapper> getFields() {
152 return new ArrayList<FormFieldWrapper>(sections.values());
153 }
154
155 public void setFieldCaption(Widget widget, String caption) {
156 final FormFieldWrapper wrapper = sections.get(widget);
157 if (wrapper != null) {
158 wrapper.setCaption(caption);
159 }
160 }
161
162 public void setFieldDescription(Widget w, String description) {
163 FormFieldWrapper fieldSection = sections.get(w);
164 fieldSection.setHelpDescription(description);
165 }
166
167 public void setCaption(String caption) {
168 legend.setInnerText(caption);
169 }
170
171 public void clearError(Widget widget) {
172 sections.get(widget).clearError();
173 }
174
175 public void setFieldError(Widget widget, String errorMsg) {
176 sections.get(widget).showError(errorMsg);
177 }
178
179 public void focus(Widget widget) {
180 scrollTo(sections.get(widget));
181 }
182
183 private void scrollTo(final FormFieldWrapper field) {
184 final int top = JQueryWrapper.select(field).position().top();
185 JQueryWrapper.select((Element) getElement().getParentElement().cast())
186 .animate(300, new AnimationSettings() {
187 {
188 setProperty("scrollTop", top - 30);
189 addCallback(new JQueryCallback() {
190 @Override
191 public void execute(JQueryWrapper query) {
192 new Timer() {
193 @Override
194 public void run() {
195 field.focusField();
196 }
197 }.schedule(300);
198 }
199 });
200 }
201 });
202 }
203 }