Mercurial > dive4elements > river
view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/sinfo/CollisionLoadEpochPanel.java @ 9076:22d8928895a1
dynamic input table epochSelect
author | gernotbelger |
---|---|
date | Tue, 22 May 2018 11:58:30 +0200 |
parents | 766890addcb2 |
children | fc02833dbcc1 |
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde * Software engineering by Intevation GmbH * * This file is Free Software under the GNU AGPL (>=v3) * and comes with ABSOLUTELY NO WARRANTY! Check out the * documentation coming with Dive4Elements River for details. */ package org.dive4elements.river.client.client.ui.sinfo; import java.util.ArrayList; import java.util.List; import org.dive4elements.river.client.client.FLYSConstants; import org.dive4elements.river.client.client.services.SedimentLoadInfoService; import org.dive4elements.river.client.client.services.SedimentLoadInfoServiceAsync; import org.dive4elements.river.client.client.ui.AbstractUIProvider; import org.dive4elements.river.client.client.ui.FromToTableHelperPanel; import org.dive4elements.river.client.client.ui.FromToTableHelperPanel.IColumnClickHandler; import org.dive4elements.river.client.shared.model.Data; import org.dive4elements.river.client.shared.model.DataItem; import org.dive4elements.river.client.shared.model.DataList; import org.dive4elements.river.client.shared.model.DefaultData; import org.dive4elements.river.client.shared.model.DefaultDataItem; import com.google.gwt.core.client.GWT; import com.smartgwt.client.data.Record; import com.smartgwt.client.types.ListGridFieldType; import com.smartgwt.client.widgets.Button; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.TextItem; import com.smartgwt.client.widgets.form.validator.IsIntegerValidator; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.grid.ListGridRecord; import com.smartgwt.client.widgets.grid.events.RecordClickEvent; import com.smartgwt.client.widgets.grid.events.RecordClickHandler; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.client.widgets.layout.VLayout; // FIXME: copy of SedLoadEpochPanel public class CollisionLoadEpochPanel extends AbstractUIProvider { protected SedimentLoadInfoServiceAsync sedLoadInfoService = GWT.create(SedimentLoadInfoService.class); protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); protected ListGrid elements; private TextItem start; private TextItem end; protected List<String> validYears = new ArrayList<String>(); public Canvas createWidget(final DataList data) { final HLayout input = new HLayout(); final VLayout root = new VLayout(); final VLayout grid = new VLayout(); final VLayout intFields = new VLayout(); final Button add = new Button(this.MSG.add_date()); this.elements = new ListGrid(); final Label title = new Label(data.get(0).getDescription()); title.setHeight("25px"); final DynamicForm form = new DynamicForm(); form.setNumCols(4); this.start = new TextItem(this.MSG.from()); this.start.setWidth(60); this.start.setValidators(new IsIntegerValidator()); this.end = new TextItem(this.MSG.to()); this.end.setWidth(60); this.end.setValidators(new IsIntegerValidator()); form.setFields(this.start, this.end); add.addClickHandler(new ClickHandler() { @Override public void onClick(final ClickEvent ce) { final String v1 = CollisionLoadEpochPanel.this.start.getValueAsString(); final String v2 = CollisionLoadEpochPanel.this.end.getValueAsString(); if (v1 == null || v2 == null) { return; } if (!isValidEpoch(v1, v2)) { return; } final ListGridRecord r = new ListGridRecord(); r.setAttribute("from", v1); r.setAttribute("to", v2); CollisionLoadEpochPanel.this.elements.addData(r); } }); final Label sel = new Label(this.MSG.select()); sel.setHeight(25); this.elements.setWidth(185); this.elements.setHeight(120); this.elements.setShowHeaderContextMenu(false); this.elements.setCanReorderFields(false); this.elements.setCanSort(false); this.elements.setCanEdit(false); final ListGridField from = new ListGridField("from", this.MSG.from()); final ListGridField to = new ListGridField("to", this.MSG.to()); from.setWidth(70); to.setWidth(70); final ListGridField removeField = new ListGridField("_removeRecord", "Remove Record") { { setType(ListGridFieldType.ICON); setIcon(GWT.getHostPageBaseURL() + CollisionLoadEpochPanel.this.MSG.removeFeature()); setCanEdit(false); setCanFilter(false); setCanSort(false); setCanGroupBy(false); setCanFreeze(false); setWidth(25); } }; this.elements.addRecordClickHandler(new RecordClickHandler() { @Override public void onRecordClick(final RecordClickEvent event) { // Just handle remove-clicks if (!event.getField().getName().equals(removeField.getName())) { return; } event.getViewer().removeData(event.getRecord()); } }); this.elements.setFields(from, to, removeField); intFields.addMember(form); intFields.addMember(add); grid.addMember(sel); grid.addMember(this.elements); input.addMember(intFields); input.addMember(grid); root.addMember(title); root.addMember(input); return root; } @Override public Canvas createOld(final DataList dataList) { final HLayout layout = new HLayout(); layout.setWidth("400px"); final VLayout vLayout = new VLayout(); vLayout.setWidth(130); final Label label = new Label(dataList.getLabel()); label.setWidth("200px"); label.setHeight(25); final List<Data> items = dataList.getAll(); final Data str = getData(items, "epochs"); final DataItem[] strItems = str.getItems(); final String[] pairs = strItems[0].getLabel().split(";"); for (final String pair : pairs) { final String[] vals = pair.split(","); final Label dateLabel = new Label(vals[0] + " - " + vals[1]); dateLabel.setHeight(20); vLayout.addMember(dateLabel); } final Canvas back = getBackButton(dataList.getState()); layout.addMember(label); layout.addMember(vLayout); layout.addMember(back); return layout; } @Override public Canvas create(final DataList data) { final VLayout layout = new VLayout(); final Canvas submit = getNextButton(); final Canvas widget = createWidget(data); layout.addMember(widget); layout.addMember(submit); final IColumnClickHandler fromHandler = createHandler(this.start); final IColumnClickHandler toHandler = createHandler(this.end); final FromToTableHelperPanel helper = new FromToTableHelperPanel(data, "epochs", this.MSG, fromHandler, toHandler); this.validYears = helper.getKeycolEntries(); final Canvas table = helper.getTable(); this.helperContainer.addMember(table); return layout; } private IColumnClickHandler createHandler(final TextItem field) { final IColumnClickHandler handler = new IColumnClickHandler() { @Override public void columnClicked(final String value) { field.setValue(value); } }; return handler; } @Override protected Data[] getData() { final List<Data> data = new ArrayList<Data>(); final ListGridRecord[] lgr = this.elements.getRecords(); if (lgr.length == 0) { return new Data[0]; } String d = ""; for (final ListGridRecord element : lgr) { final Record r = element; d += r.getAttribute("from") + "," + r.getAttribute("to"); d += ";"; } final DataItem item = new DefaultDataItem("epochs", null, d); data.add(new DefaultData("epochs", null, null, new DataItem[] { item })); return data.toArray(new Data[data.size()]); } /* * Validate the epoch input. We do this here and not in an overridden * validate method as we want to validate before an epoch is added * to the list of epochs. */ protected boolean isValidEpoch(final String y1, final String y2) { // First check that both are integer int iY1; int iY2; final List<String> errors = new ArrayList<String>(); try { iY1 = Integer.parseInt(y1); } catch (final NumberFormatException e) { errors.add(this.MESSAGES.wrongFormat() + ": " + y1); } try { iY2 = Integer.parseInt(y2); } catch (final NumberFormatException e) { errors.add(this.MESSAGES.wrongFormat() + ": " + y2); } if (!errors.isEmpty()) { showErrors(errors); return false; } boolean startIsGood = false; boolean endIsGood = false; for (final String validYear : this.validYears) { if (startIsGood || y1.equals(validYear)) { startIsGood = true; } if (endIsGood || y2.equals(validYear)) { endIsGood = true; } if (startIsGood && endIsGood) { break; } /* * alternative check if data lies in between * int aYear = Integer.parseInt(validYear); * if (aYear >= iY1 && aYear <= iY2) { * isGood = true; * break; * } */ } if (!startIsGood) { String tmp = this.MESSAGES.no_data_for_year(); tmp = tmp.replace("$1", y1); errors.add(tmp); } if (!endIsGood) { String tmp = this.MESSAGES.no_data_for_year(); tmp = tmp.replace("$1", y2); errors.add(tmp); } if (!errors.isEmpty()) { showErrors(errors); return false; } return true; } }