ingo@20: package de.intevation.flys.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:
christian@4184: import de.intevation.flys.client.client.FLYSConstants;
christian@4573: import de.intevation.flys.client.client.event.StepForwardEvent;
ingo@20: import de.intevation.flys.client.shared.model.Data;
ingo@20: import de.intevation.flys.client.shared.model.DataItem;
ingo@51: import de.intevation.flys.client.shared.model.DataList;
ingo@20: import de.intevation.flys.client.shared.model.DefaultData;
ingo@20: import de.intevation.flys.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 :