001: package org.araneaframework.example.main.release.features;
002:
003: import java.util.ArrayList;
004: import java.util.Iterator;
005: import java.util.List;
006: import java.util.Locale;
007: import org.araneaframework.Component;
008: import org.araneaframework.Environment;
009: import org.araneaframework.InputData;
010: import org.araneaframework.Scope;
011: import org.araneaframework.core.ApplicationComponent;
012: import org.araneaframework.core.EventListener;
013: import org.araneaframework.example.main.TemplateBaseWidget;
014: import org.araneaframework.example.main.release.features.ExampleData.Attendee;
015: import org.araneaframework.example.main.release.features.ExampleData.Room;
016: import org.araneaframework.framework.LocalizationContext.LocaleChangeListener;
017: import org.araneaframework.uilib.form.FormElement;
018: import org.araneaframework.uilib.form.FormWidget;
019: import org.araneaframework.uilib.form.constraint.BaseFieldConstraint;
020: import org.araneaframework.uilib.form.control.DateControl;
021: import org.araneaframework.uilib.form.control.MultiSelectControl;
022: import org.araneaframework.uilib.form.control.SelectControl;
023: import org.araneaframework.uilib.form.control.TimeControl;
024: import org.araneaframework.uilib.form.data.DateData;
025: import org.araneaframework.uilib.form.data.StringData;
026: import org.araneaframework.uilib.form.data.StringListData;
027: import org.araneaframework.uilib.support.DisplayItem;
028: import org.araneaframework.uilib.util.MessageUtil;
029:
030: /**
031: * @author Taimo Peelo (taimo@araneaframework.org)
032: */
033: public class SeamlessFormValidationDemoWidget extends
034: TemplateBaseWidget {
035: private SelectControl roomSelect;
036: private List roomList;
037:
038: private MultiSelectControl attendeeMultiSelect;
039: private List attendeeList;
040:
041: protected void init() throws Exception {
042: roomList = ExampleData.createRooms();
043: attendeeList = ExampleData.createAttendees();
044:
045: setViewSelector("release/features/seamlessFormValidation/demo");
046: addWidget("form1", buildFormWidget());
047: FormWidget f2 = buildFormWidget();
048:
049: // and here the crucial part for second form -- enabling background validation
050: f2.setBackgroundValidation(true);
051: addWidget("form2", f2);
052: }
053:
054: private FormWidget buildFormWidget() {
055: final FormWidget form = new FormWidget();
056: final FormElement appointmentDate = form.addElement(
057: "futureDate", "seamless.appointmentdate",
058: new DateControl(), new DateData(), true);
059: final FormElement appointmentTime = form.addElement("time",
060: "seamless.appointmenttime", new TimeControl(),
061: new DateData(), true);
062:
063: FormElement rooms = form.addElement("meetingroom",
064: "seamless.room", buildRoomSelect(), new StringData(),
065: true);
066: rooms.setConstraint(new BaseFieldConstraint() {
067: protected void validateConstraint() throws Exception {
068: if (!appointmentDate.isValid()
069: || !appointmentTime.isValid())
070: return;
071:
072: String value = (String) getValue();
073: Room appointmentRoom = (Room) roomList.get(Integer
074: .valueOf(value).intValue());
075: if (appointmentRoom.isOccupied()) {
076: addError(MessageUtil.localizeAndFormat(
077: "seamless.room.not.available", MessageUtil
078: .localize(
079: appointmentRoom.getName(),
080: getEnvironment()),
081: getEnvironment()));
082: }
083: }
084: });
085:
086: FormElement attendees = form.addElement("attendees",
087: "seamless.attendees", buildAttendeeMultiSelect(),
088: new StringListData(), true);
089: attendees.setConstraint(new BaseFieldConstraint() {
090: protected void validateConstraint() throws Exception {
091: if (!appointmentDate.isValid()
092: || !appointmentTime.isValid())
093: return;
094: List preoccupiedAttendees = new ArrayList();
095: List values = (List) getValue();
096: for (Iterator i = values.iterator(); i.hasNext();) {
097: Attendee attendee = (Attendee) attendeeList
098: .get(Integer.valueOf((String) i.next())
099: .intValue());
100: if (attendee.isPreoccupied()) {
101: preoccupiedAttendees.add(attendee);
102: }
103: }
104:
105: if (!preoccupiedAttendees.isEmpty()) {
106: StringBuffer names = new StringBuffer();
107: for (Iterator i = preoccupiedAttendees.iterator(); i
108: .hasNext();) {
109: Attendee attendee = (Attendee) i.next();
110: names.append(attendee.getName());
111: if (i.hasNext())
112: names.append(", ");
113: }
114:
115: addError(MessageUtil.localizeAndFormat(
116: "seamless.attendees.not.available", names
117: .toString(), getEnvironment()));
118: }
119: }
120: });
121:
122: form.addEventListener("submit", new EventListener() {
123: public void processEvent(Object eventId, InputData input)
124: throws Exception {
125: form.convertAndValidate();
126: }
127: });
128:
129: return form;
130: }
131:
132: private void handleEventReturn() {
133: getFlowCtx().cancel();
134: }
135:
136: private SelectControl buildRoomSelect() {
137: final SelectControl result = new SelectControl();
138:
139: addRooms(result);
140:
141: getL10nCtx().addLocaleChangeListener(
142: new LocaleChangeListenerAdapter(
143: SeamlessFormValidationDemoWidget.this ) {
144: public void onLocaleChange(Locale oldLocale,
145: Locale newLocale) {
146: result.clearItems();
147: addRooms(result);
148: }
149: });
150:
151: return result;
152: }
153:
154: private void addRooms(SelectControl result) {
155: for (int i = 0; i < roomList.size(); i++) {
156: Room room = (Room) roomList.get(i);
157: result.addItem(new DisplayItem(String.valueOf(i),
158: getL10nCtx().localize(room.getName()) + ", "
159: + room.getLocation()));
160: }
161: }
162:
163: private MultiSelectControl buildAttendeeMultiSelect() {
164: MultiSelectControl result = new MultiSelectControl();
165: for (int i = 0; i < attendeeList.size(); i++) {
166: result.addItem(new DisplayItem(String.valueOf(i),
167: ((Attendee) attendeeList.get(i)).getName()));
168: }
169:
170: return result;
171: }
172:
173: private abstract class LocaleChangeListenerAdapter implements
174: LocaleChangeListener {
175: private ApplicationComponent wrapped;
176:
177: public LocaleChangeListenerAdapter(ApplicationComponent wrapped) {
178: this .wrapped = wrapped;
179: }
180:
181: public Component.Interface _getComponent() {
182: return wrapped._getComponent();
183: }
184:
185: public org.araneaframework.Composite.Interface _getComposite() {
186: return wrapped._getComposite();
187: }
188:
189: public org.araneaframework.Viewable.Interface _getViewable() {
190: return wrapped._getViewable();
191: }
192:
193: public Environment getChildEnvironment() {
194: return wrapped.getChildEnvironment();
195: }
196:
197: public Environment getEnvironment() {
198: return wrapped.getEnvironment();
199: }
200:
201: public Scope getScope() {
202: return wrapped.getScope();
203: }
204:
205: public boolean isAlive() {
206: return wrapped.isAlive();
207: }
208: }
209: }
|