teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5861: * Software engineering by Intevation GmbH teichmann@5861: * teichmann@5993: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5993: * documentation coming with Dive4Elements River for details. teichmann@5861: */ teichmann@5861: teichmann@5835: package org.dive4elements.river.client.client.ui; raimund@2898: raimund@2898: import com.google.gwt.core.client.GWT; raimund@2898: import com.google.gwt.i18n.client.DateTimeFormat; raimund@2898: rrenkert@7942: import com.smartgwt.client.data.DateRange; christian@4131: import com.smartgwt.client.types.ListGridFieldType; christian@4131: import com.smartgwt.client.widgets.Button; raimund@2898: import com.smartgwt.client.widgets.Canvas; raimund@2898: import com.smartgwt.client.widgets.Label; raimund@2898: import com.smartgwt.client.widgets.events.ClickEvent; raimund@2898: import com.smartgwt.client.widgets.events.ClickHandler; raimund@2898: import com.smartgwt.client.widgets.grid.ListGrid; raimund@2898: import com.smartgwt.client.widgets.grid.ListGridField; raimund@2898: import com.smartgwt.client.widgets.grid.ListGridRecord; christian@4131: import com.smartgwt.client.widgets.grid.events.RecordClickEvent; christian@4131: import com.smartgwt.client.widgets.grid.events.RecordClickHandler; raimund@2898: import com.smartgwt.client.widgets.layout.HLayout; raimund@2898: import com.smartgwt.client.widgets.layout.VLayout; raimund@2898: 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; raimund@2898: christian@4131: import java.util.ArrayList; christian@4131: import java.util.Date; christian@4131: import java.util.List; christian@4131: raimund@2898: /** felix@6579: * This UIProvider creates a panel for input of multiple time periods. raimund@2898: * raimund@2898: * @author Raimund Renkert raimund@2898: */ raimund@2898: public class MultiPeriodPanel raimund@2898: extends PeriodPanel raimund@2898: { raimund@2898: christian@4131: private static final long serialVersionUID = 1811025931934462457L; christian@4131: raimund@2898: protected ListGrid elements; raimund@2898: raimund@2898: protected String values; raimund@2898: raimund@2898: public MultiPeriodPanel() { raimund@2898: this("", ""); raimund@2898: } raimund@2898: raimund@2898: public MultiPeriodPanel(String startName, String endName) { raimund@2898: super(startName, endName); raimund@2898: } raimund@2898: christian@4131: @Override raimund@2898: public Canvas createWidget(DataList data) { raimund@2898: HLayout input = new HLayout(); raimund@2898: VLayout root = new VLayout(); raimund@2898: VLayout grid = new VLayout(); raimund@2898: VLayout layout = (VLayout) super.createWidget(data); raimund@2898: Button add = new Button(MSG.add_date()); raimund@2898: elements = new ListGrid(); raimund@2898: raimund@2898: add.addClickHandler(new ClickHandler() { christian@4131: @Override raimund@2898: public void onClick(ClickEvent ce) { rrenkert@7942: DateRange range = inputPanel.getValue(); rrenkert@7942: Date f = range.getStartDate(); rrenkert@7942: Date t = range.getEndDate(); raimund@2898: if (f == null || t == null) { raimund@2898: return; raimund@2898: } raimund@2898: DateRangeRecord drr = new DateRangeRecord(f, t); raimund@2898: elements.addData(drr); raimund@2898: } raimund@2898: }); raimund@2898: layout.addMember(add); raimund@2898: raimund@2898: Label sel = new Label(MSG.select()); raimund@2898: sel.setHeight(25); raimund@2898: elements.setWidth(185); raimund@2898: elements.setHeight(120); raimund@2898: elements.setShowHeaderContextMenu(false); raimund@2898: elements.setCanReorderFields(false); raimund@2898: elements.setCanSort(false); raimund@2898: elements.setCanEdit(false); raimund@2898: ListGridField from = new ListGridField("from", MSG.from()); raimund@2898: ListGridField to = new ListGridField("to", MSG.to()); raimund@2898: from.setWidth(70); raimund@2898: to.setWidth(70); raimund@2898: raimund@2898: final ListGridField removeField = raimund@2898: new ListGridField("_removeRecord", "Remove Record"){{ raimund@2898: setType(ListGridFieldType.ICON); raimund@2898: setIcon(GWT.getHostPageBaseURL() + MSG.removeFeature()); raimund@2898: setCanEdit(false); raimund@2898: setCanFilter(false); raimund@2898: setCanSort(false); raimund@2898: setCanGroupBy(false); raimund@2898: setCanFreeze(false); raimund@2898: setWidth(25); raimund@2898: }}; raimund@2898: raimund@2898: elements.addRecordClickHandler(new RecordClickHandler() { christian@4131: @Override raimund@2898: public void onRecordClick(final RecordClickEvent event) { raimund@2898: // Just handle remove-clicks tom@8856: if(!event.getField().getName() tom@8856: .equals(removeField.getName()) tom@8856: ) { raimund@2898: return; raimund@2898: } raimund@2898: event.getViewer().removeData(event.getRecord()); raimund@2898: } raimund@2898: }); raimund@2898: raimund@2898: elements.setFields(from, to, removeField); raimund@2898: raimund@2898: grid.addMember(sel); raimund@2898: grid.addMember(elements); raimund@2898: input.addMember(layout); raimund@2898: input.addMember(grid); raimund@2898: root.addMember(input); raimund@2898: andre@8627: /* Check for a default element */ andre@8627: Data periods = getData(data.getAll(), "periods"); andre@8627: DataItem[] items = periods.getItems(); andre@8627: if (items == null) { andre@8627: return root; andre@8627: } andre@8627: andre@8627: for (DataItem item: items) { andre@8627: if (!item.getLabel().equals("default")) { andre@8627: continue; andre@8627: } andre@8627: String[] vals = item.getStringValue().split(","); andre@8627: long f = Long.valueOf(vals[0]).longValue(); andre@8627: long t = Long.valueOf(vals[1]).longValue(); andre@8627: inputPanel.setFromDate(new Date(f)); andre@8627: inputPanel.setToDate(new Date(t)); andre@8627: } raimund@2898: return root; raimund@2898: } raimund@2898: christian@4131: @SuppressWarnings("deprecation") raimund@2898: @Override raimund@2898: public Canvas createOld(DataList dataList) { raimund@2898: GWT.log("old............................"); raimund@2898: HLayout layout = new HLayout(); raimund@2898: layout.setWidth("400px"); raimund@2898: VLayout vLayout = new VLayout(); raimund@2898: vLayout.setWidth(130); raimund@2898: Label label = new Label(dataList.getLabel()); raimund@2898: label.setWidth("200px"); raimund@2898: label.setHeight(25); raimund@2898: raimund@2898: List items = dataList.getAll(); raimund@2898: Data str = getData(items, "periods"); raimund@2898: DataItem[] strItems = str.getItems(); raimund@2898: raimund@2898: String[] pairs = strItems[0].getLabel().split(";"); raimund@2898: for (int i = 0; i < pairs.length; i++) { raimund@2898: String[] vals = pairs[i].split(","); raimund@2898: long f = Long.valueOf(vals[0]).longValue(); raimund@2898: long t = Long.valueOf(vals[1]).longValue(); raimund@2898: Date from = new Date(f); raimund@2898: Date to = new Date(t); raimund@2898: String fromString = raimund@2898: DateTimeFormat.getMediumDateFormat().format(from); raimund@2898: String toString = raimund@2898: DateTimeFormat.getMediumDateFormat().format(to); raimund@2898: raimund@2898: Label dateLabel = new Label(fromString + " - " + toString); raimund@2898: dateLabel.setHeight(20); raimund@2898: vLayout.addMember(dateLabel); raimund@2898: } raimund@2898: Canvas back = getBackButton(dataList.getState()); raimund@2898: layout.addMember(label); raimund@2898: layout.addMember(vLayout); raimund@2898: layout.addMember(back); raimund@2898: raimund@2898: return layout; raimund@2898: } raimund@2898: raimund@2898: raimund@2898: /** raimund@2898: * This method returns the selected data. raimund@2898: * raimund@2898: * @return the selected/inserted data. raimund@2898: */ christian@4131: @Override raimund@2898: public Data[] getData() { raimund@2898: List data = new ArrayList(); raimund@2898: raimund@2898: boolean valid = saveDateValues(); raimund@2898: if(valid) { raimund@2898: DataItem item = new DefaultDataItem("periods", null, this.values); raimund@2898: data.add(new DefaultData( raimund@2898: "periods", raimund@2898: null, raimund@2898: null, raimund@2898: new DataItem[] { item })); raimund@2898: } sascha@3379: return data.toArray(new Data[data.size()]); raimund@2898: } raimund@2898: raimund@2898: christian@4131: @Override raimund@2898: protected boolean saveDateValues() { raimund@2898: ListGridRecord[] lgr = elements.getRecords(); raimund@2898: if (lgr.length == 0) { raimund@2898: return false; raimund@2898: } raimund@2898: String data = ""; raimund@2898: for (int i = 0; i < lgr.length; i++) { raimund@2898: DateRangeRecord drr = (DateRangeRecord) lgr[i]; raimund@2898: data += drr.getFrom() + "," + drr.getTo(); raimund@2898: data += ";"; raimund@2898: } raimund@2898: values = data; raimund@2898: return true; raimund@2898: } raimund@2898: raimund@2898: raimund@2898: protected static class DateRangeRecord extends ListGridRecord { raimund@2898: protected Date from; raimund@2898: protected Date to; raimund@2898: raimund@2898: protected final static String FROM_FIELD = "from"; raimund@2898: protected final static String TO_FIELD = "to"; raimund@2898: raimund@2898: public DateRangeRecord (Date from, Date to) { raimund@2898: setFrom(from); raimund@2898: setTo(to); raimund@2898: } raimund@2898: christian@4131: @SuppressWarnings("deprecation") raimund@2898: public void setFrom(Date from) { raimund@2898: this.from = from; raimund@2898: setAttribute( raimund@2898: FROM_FIELD, raimund@2898: DateTimeFormat.getMediumDateFormat().format(from)); raimund@2898: } raimund@2898: raimund@2898: christian@4131: @SuppressWarnings("deprecation") raimund@2898: public void setTo(Date to) { raimund@2898: this.to = to; raimund@2898: setAttribute( raimund@2898: TO_FIELD, raimund@2898: DateTimeFormat.getMediumDateFormat().format(to)); raimund@2898: } raimund@2898: raimund@2898: raimund@2898: public long getFrom() { raimund@2898: return this.from.getTime(); raimund@2898: } raimund@2898: raimund@2898: raimund@2898: public long getTo() { raimund@2898: return this.to.getTime(); raimund@2898: } raimund@2898: } raimund@2898: }