teichmann@5835: package org.dive4elements.river.client.client.ui; ingo@20: ingo@20: import com.google.gwt.core.client.GWT; ingo@30: import com.smartgwt.client.types.VerticalAlignment; ingo@20: import com.smartgwt.client.widgets.Canvas; ingo@30: import com.smartgwt.client.widgets.Label; ingo@20: import com.smartgwt.client.widgets.form.DynamicForm; christian@4573: import com.smartgwt.client.widgets.form.fields.FormItem; christian@4573: import com.smartgwt.client.widgets.form.fields.LinkItem; ingo@592: import com.smartgwt.client.widgets.form.fields.SelectItem; christian@4573: import com.smartgwt.client.widgets.form.fields.SpacerItem; christian@4573: import com.smartgwt.client.widgets.form.fields.events.ClickEvent; christian@4573: import com.smartgwt.client.widgets.form.fields.events.ClickHandler; ingo@53: import com.smartgwt.client.widgets.layout.HLayout; ingo@20: import com.smartgwt.client.widgets.layout.VLayout; ingo@20: teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.event.StepForwardEvent; teichmann@5835: import org.dive4elements.river.client.shared.model.Data; teichmann@5835: import org.dive4elements.river.client.shared.model.DataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.DataList; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultData; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultDataItem; ingo@20: christian@4573: import java.util.ArrayList; christian@4184: import java.util.Iterator; christian@4184: import java.util.LinkedHashMap; christian@4184: import java.util.Map; ingo@20: ingo@20: ingo@20: /** ingo@20: * This UIProvider displays the DataItems of the Data object in a combo box. ingo@20: * ingo@20: * @author Ingo Weinzierl ingo@20: */ ingo@49: public class SelectProvider ingo@49: extends AbstractUIProvider ingo@20: { christian@4184: private static final long serialVersionUID = 4696637534424070726L; christian@4184: ingo@20: /** The message class that provides i18n strings.*/ ingo@211: protected FLYSConstants messages = GWT.create(FLYSConstants.class); ingo@20: ingo@20: /** The combobox.*/ christian@4573: protected DynamicForm form = new DynamicForm(); christian@4573: christian@4573: public static final int COMBOBOX_THRESHOLD = 20; ingo@38: ingo@20: ingo@20: /** ingo@20: * This method currently returns a ingo@20: * {@link com.smartgwt.client.widgets.form.DynamicForm} that contains all ingo@20: * data items in a combobox stored in data. ingo@20: * ingo@20: * @param data The {@link Data} object. ingo@20: * ingo@20: * @return a combobox. ingo@20: */ christian@4184: @Override ingo@51: public Canvas create(DataList data) { christian@4574: VLayout v = new VLayout(); christian@4574: v.setMembersMargin(10); christian@4574: v.addMember(createWidget(data)); christian@4574: if(data.size() > COMBOBOX_THRESHOLD) { christian@4574: v.addMember(getNextButton()); christian@4574: } christian@4574: return v; christian@4574: } christian@4574: christian@4574: christian@4574: protected Canvas createWidget(DataList data) { christian@4573: if (data.size() > COMBOBOX_THRESHOLD) { christian@4574: return createComboboxWidget(data); christian@4573: } christian@4573: else { christian@4573: return createListWidget(data); christian@4573: } christian@4573: } ingo@20: ingo@20: christian@4184: @Override ingo@53: public Canvas createOld(DataList dataList) { ingo@53: HLayout layout = new HLayout(); ingo@53: VLayout vLayout = new VLayout(); raimund@91: layout.setWidth("400px"); ingo@53: ingo@53: Label label = new Label(dataList.getLabel()); raimund@91: label.setWidth("200px"); ingo@53: ingo@53: int size = dataList.size(); ingo@53: for (int i = 0; i < size; i++) { ingo@53: Data data = dataList.get(i); ingo@53: DataItem[] items = data.getItems(); ingo@53: ingo@53: for (DataItem item: items) { ingo@53: HLayout hLayout = new HLayout(); ingo@53: ingo@53: hLayout.addMember(label); ingo@61: hLayout.addMember(new Label(item.getLabel())); ingo@53: ingo@53: vLayout.addMember(hLayout); raimund@91: vLayout.setWidth("130px"); ingo@53: } ingo@53: } ingo@53: ingo@58: Canvas back = getBackButton(dataList.getState()); ingo@58: ingo@53: layout.addMember(label); ingo@53: layout.addMember(vLayout); ingo@58: layout.addMember(back); ingo@53: ingo@53: return layout; ingo@53: } ingo@53: ingo@53: christian@4573: protected Canvas createListWidget(DataList data) { christian@4573: VLayout layout = new VLayout(); christian@4573: layout.setAlign(VerticalAlignment.TOP); christian@4573: layout.setHeight(25); christian@4573: layout.setWidth("100%"); christian@4573: christian@4573: VLayout formLayout = new VLayout(); christian@4573: formLayout.setLayoutTopMargin(20); christian@4573: formLayout.setLayoutLeftMargin(50); christian@4573: christian@4573: ClickHandler handler = new ClickHandler() { christian@4573: @Override christian@4573: public void onClick(ClickEvent event) { christian@4573: LinkItem li = (LinkItem)event.getItem(); christian@4573: String attr = li.getAttribute(li.getName()); christian@4573: GWT.log("li.getTarget: " + attr + " " + li.getName()); christian@4573: DataItem item = new DefaultDataItem( christian@4573: attr, christian@4573: null, christian@4573: attr); christian@4573: christian@4573: Data d = new DefaultData( christian@4573: li.getName(), christian@4573: null, christian@4573: null, christian@4573: new DataItem [] { item }); christian@4573: christian@4573: Data [] odata = getData(); christian@4573: Data [] ndata = new Data[odata.length+1]; christian@4573: System.arraycopy(odata, 0, ndata, 0, odata.length); christian@4573: ndata[odata.length] = d; christian@4573: christian@4573: fireStepForwardEvent(new StepForwardEvent(ndata)); christian@4573: } christian@4573: }; christian@4573: christian@4573: for (int i = 0, size = data.size(); i < size; i++) { christian@4573: Data d = data.get(i); christian@4573: christian@4573: Label label = new Label(d.getDescription()); christian@4573: label.setValign(VerticalAlignment.TOP); christian@4573: label.setHeight(20); christian@4573: label.setWidth(400); christian@4573: christian@4573: LinkedHashMap initial = new LinkedHashMap(); christian@4573: ArrayList formItems = new ArrayList(); christian@4573: christian@4573: for (DataItem item: d.getItems()) { christian@4573: initial.put(item.getLabel().replace(' ', '_'), item.getStringValue()); christian@4573: GWT.log("put: " + item.getLabel().replace(' ', '_') + "=" + item.getStringValue()); christian@4573: christian@4573: LinkItem link = new LinkItem(d.getLabel()); christian@4573: link.setLinkTitle(item.getLabel()); // i18n text of the link christian@4573: link.setAttribute(d.getLabel(), item.getStringValue()); // e.g. "calculation_mode":"foo" christian@4573: link.setShowTitle(false); christian@4573: link.setEndRow(true); christian@4573: link.setWidth("350px"); christian@4573: christian@4573: SpacerItem space = new SpacerItem(); christian@4573: space.setWidth(15); christian@4573: formItems.add(space); christian@4573: formItems.add(link); christian@4573: christian@4573: link.addClickHandler(handler); christian@4573: } christian@4573: christian@4573: form.setFields(formItems.toArray(new FormItem[0])); christian@4573: form.setValues(initial); christian@4573: christian@4573: layout.addMember(label); christian@4573: layout.addMember(form); christian@4573: } christian@4573: return layout; christian@4573: } christian@4573: christian@4573: protected Canvas createComboboxWidget(DataList data) { christian@4573: GWT.log("SelectProvider.createComboboxWidget()"); ingo@20: ingo@51: VLayout layout = new VLayout(); ingo@83: layout.setAlign(VerticalAlignment.TOP); ingo@83: layout.setHeight(25); ingo@20: christian@4184: LinkedHashMap initial = new LinkedHashMap(); ingo@266: ingo@51: int size = data.size(); ingo@51: ingo@51: for (int i = 0; i < size; i++) { ingo@51: Data d = data.get(i); ingo@51: ingo@51: Label label = new Label(d.getDescription()); ingo@51: label.setValign(VerticalAlignment.TOP); ingo@53: label.setHeight(20); ingo@785: label.setWidth(400); ingo@51: ingo@594: SelectItem combobox = new SelectItem(d.getLabel()); ingo@592: combobox.setWidth(250); ingo@51: ingo@51: LinkedHashMap it = new LinkedHashMap(); ingo@51: ingo@519: boolean defaultSet = false; ingo@519: boolean first = true; ingo@519: ingo@519: DataItem def = d.getDefault(); ingo@519: String defValue = def != null ? def.getStringValue() : null; ingo@519: ingo@519: if (defValue != null && defValue.length() > 0) { ingo@519: initial.put(d.getLabel(), def.getStringValue()); ingo@519: defaultSet = true; ingo@519: } ingo@266: ingo@51: for (DataItem item: d.getItems()) { ingo@519: if (!defaultSet && first) { ingo@266: initial.put(d.getLabel(), item.getStringValue()); ingo@519: first = false; ingo@266: } ingo@266: ingo@51: it.put(item.getStringValue(), item.getLabel()); ingo@51: } ingo@51: ingo@51: label.setWidth(50); ingo@51: combobox.setValueMap(it); ingo@51: combobox.setShowTitle(false); ingo@51: form.setItems(combobox); ingo@51: ingo@51: layout.addMember(label); ingo@51: layout.addMember(form); ingo@20: } ingo@20: ingo@266: form.setValues(initial); ingo@266: ingo@30: layout.setAlign(VerticalAlignment.TOP); ingo@30: ingo@30: return layout; ingo@20: } ingo@20: ingo@20: christian@4184: @Override ingo@20: protected Data[] getData() { christian@4184: Map values = form.getValues(); christian@4184: Iterator keys = values.keySet().iterator(); ingo@20: ingo@51: Data[] list = new Data[values.size()]; ingo@51: int i = 0; ingo@51: ingo@51: while (keys.hasNext()) { christian@4573: String fieldname = ((String) keys.next()).replace('_', ' '); ingo@51: String selection = (String) values.get(fieldname); ingo@51: ingo@51: DataItem item = new DefaultDataItem(fieldname, null, selection); ingo@51: ingo@51: list[i++] = new DefaultData( ingo@51: fieldname, null, null, new DataItem[] { item }); ingo@51: } ingo@51: ingo@51: return list; ingo@20: } ingo@20: } ingo@20: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :