ingo@780: package de.intevation.flys.client.client.ui; ingo@780: ingo@780: import java.util.ArrayList; ingo@780: import java.util.List; ingo@780: ingo@780: import com.google.gwt.core.client.GWT; ingo@780: import com.google.gwt.i18n.client.NumberFormat; ingo@780: ingo@783: import com.smartgwt.client.data.Record; ingo@783: import com.smartgwt.client.util.SC; ingo@780: import com.smartgwt.client.widgets.Canvas; ingo@780: import com.smartgwt.client.widgets.Label; ingo@780: import com.smartgwt.client.widgets.form.fields.events.BlurHandler; ingo@780: import com.smartgwt.client.widgets.form.fields.events.BlurEvent; ingo@783: import com.smartgwt.client.widgets.grid.events.RecordClickHandler; ingo@783: import com.smartgwt.client.widgets.grid.events.RecordClickEvent; ingo@780: import com.smartgwt.client.widgets.layout.HLayout; ingo@780: import com.smartgwt.client.widgets.layout.VLayout; ingo@781: import com.smartgwt.client.widgets.tab.TabSet; ingo@781: import com.smartgwt.client.widgets.tab.Tab; ingo@780: ingo@782: import de.intevation.flys.client.shared.model.ArtifactDescription; ingo@780: import de.intevation.flys.client.shared.model.Data; ingo@780: import de.intevation.flys.client.shared.model.DataItem; ingo@780: import de.intevation.flys.client.shared.model.DataList; ingo@780: import de.intevation.flys.client.shared.model.DefaultData; ingo@780: import de.intevation.flys.client.shared.model.DefaultDataItem; ingo@780: ingo@782: import de.intevation.flys.client.client.Config; ingo@780: import de.intevation.flys.client.client.FLYSConstants; ingo@782: import de.intevation.flys.client.client.ui.range.DistanceInfoDataSource; ingo@781: import de.intevation.flys.client.client.ui.range.RangeTable; ingo@781: import de.intevation.flys.client.client.ui.range.LocationsTable; ingo@780: ingo@780: ingo@780: public class DistancePanel extends AbstractUIProvider implements BlurHandler { ingo@780: ingo@780: public static final int DEFAULT_STEP_WIDTH = 100; ingo@780: ingo@787: public static final String FIELD_LOWER = "ld_from"; ingo@787: public static final String FIELD_UPPER = "ld_to"; ingo@787: public static final String FIELD_STEP = "ld_step"; ingo@787: ingo@780: ingo@780: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@780: ingo@781: protected RangeTable distancesTable; ingo@781: protected LocationsTable locationsTable; ingo@781: ingo@780: protected DoubleRangePanel distancePanel; ingo@780: ingo@781: protected TabSet tabs; ingo@781: ingo@780: protected double min; ingo@780: protected double max; ingo@780: ingo@780: ingo@780: public DistancePanel() { ingo@787: this("right"); ingo@787: } ingo@787: ingo@787: ingo@787: public DistancePanel(String labelOrientation) { ingo@781: distancePanel = new DoubleRangePanel( ingo@793: labelFrom(), labelTo(), labelStep(), ingo@787: 0d, 0d, 0d, 250, this, labelOrientation); ingo@780: } ingo@780: ingo@780: ingo@780: @Override ingo@780: public Canvas create(DataList data) { ingo@787: Data d = data.get(0); ingo@787: ingo@780: VLayout layout = new VLayout(); ingo@780: layout.setMembersMargin(10); ingo@780: ingo@787: Label label = new Label(d.getDescription()); ingo@780: ingo@780: Canvas submit = getNextButton(); ingo@780: ingo@780: label.setHeight(25); ingo@780: distancePanel.setHeight(50); ingo@780: ingo@780: layout.addMember(label); ingo@780: layout.addMember(distancePanel); ingo@780: layout.addMember(submit); ingo@780: ingo@780: initMinMaxValues(data); ingo@780: initDefaultValues(data); ingo@781: initHelperPanel(); ingo@780: ingo@780: return layout; ingo@780: } ingo@780: ingo@780: ingo@780: @Override ingo@780: public Canvas createOld(DataList dataList) { ingo@780: String s = getOldSelectionString(dataList); ingo@780: String l = dataList.getLabel(); ingo@780: ingo@780: Label label = new Label(l); ingo@780: Label selected = new Label(s); ingo@780: ingo@780: HLayout layout = new HLayout(); ingo@780: ingo@780: layout.setWidth(400); ingo@780: label.setWidth(200); ingo@780: selected.setWidth(130); ingo@780: ingo@780: layout.addMember(label); ingo@780: layout.addMember(selected); ingo@784: layout.addMember(getBackButton(dataList.getState())); ingo@780: ingo@780: return layout; ingo@780: } ingo@780: ingo@780: ingo@780: protected String getOldSelectionString(DataList dataList) { ingo@780: List items = dataList.getAll(); ingo@780: ingo@787: Data dFrom = getData(items, getLowerField()); ingo@787: Data dTo = getData(items, getUpperField()); ingo@787: Data dStep = getData(items, getStepField()); ingo@780: ingo@780: DataItem[] from = dFrom.getItems(); ingo@780: DataItem[] to = dTo.getItems(); ingo@780: DataItem[] step = dStep.getItems(); ingo@780: ingo@780: StringBuilder sb = new StringBuilder(); ingo@780: sb.append(from[0].getLabel()); ingo@793: sb.append(" " + getUnitFrom() + " - "); ingo@780: sb.append(to[0].getLabel()); ingo@793: sb.append(" " + getUnitTo() + " - "); ingo@780: sb.append(step[0].getLabel()); ingo@793: sb.append(" " + getUnitStep()); ingo@780: ingo@780: return sb.toString(); ingo@780: } ingo@780: ingo@780: ingo@793: protected String labelFrom() { ingo@793: return getLabelFrom() + " [" + getUnitFrom() + "]"; ingo@793: } ingo@793: ingo@793: ingo@787: protected String getLabelFrom() { ingo@793: return MSG.dpLabelFrom(); ingo@793: } ingo@793: ingo@793: ingo@793: protected String getUnitFrom() { ingo@793: return MSG.dpUnitFrom(); ingo@793: } ingo@793: ingo@793: ingo@793: protected String labelTo() { ingo@793: return getLabelTo() + " [" + getUnitTo() + "]"; ingo@787: } ingo@787: ingo@787: ingo@787: protected String getLabelTo() { ingo@793: return MSG.dpLabelTo(); ingo@793: } ingo@793: ingo@793: ingo@793: protected String getUnitTo() { ingo@793: return MSG.dpUnitTo(); ingo@793: } ingo@793: ingo@793: ingo@793: protected String labelStep() { ingo@793: return getLabelStep() + " [" + getUnitStep() + "]"; ingo@787: } ingo@787: ingo@787: ingo@787: protected String getLabelStep() { ingo@793: return MSG.dpLabelStep(); ingo@793: } ingo@793: ingo@793: ingo@793: protected String getUnitStep() { ingo@793: return MSG.dpUnitStep(); ingo@787: } ingo@787: ingo@787: ingo@787: protected String getLowerField() { ingo@787: return FIELD_LOWER; ingo@787: } ingo@787: ingo@787: ingo@787: protected String getUpperField() { ingo@787: return FIELD_UPPER; ingo@787: } ingo@787: ingo@787: ingo@787: protected String getStepField() { ingo@787: return FIELD_STEP; ingo@787: } ingo@787: ingo@787: ingo@780: @Override ingo@780: public List validate() { ingo@780: List errors = new ArrayList(); ingo@780: ingo@780: if (!distancePanel.validateForm()) { ingo@780: errors.add(MSG.wrongFormat()); ingo@780: ingo@780: return errors; ingo@780: } ingo@780: ingo@780: validateFrom(errors); ingo@780: validateTo(errors); ingo@780: ingo@780: return errors; ingo@780: } ingo@780: ingo@780: ingo@780: protected void validateFrom(List errors) { ingo@780: double from = distancePanel.getFrom(); ingo@780: ingo@780: if (from < min || from > max) { ingo@780: NumberFormat nf = NumberFormat.getDecimalFormat(); ingo@780: ingo@780: String tmp = MSG.error_validate_lower_range(); ingo@780: tmp = tmp.replace("$1", nf.format(from)); ingo@780: tmp = tmp.replace("$2", nf.format(min)); ingo@780: ingo@780: distancePanel.setFrom(min); ingo@780: errors.add(tmp); ingo@780: } ingo@780: } ingo@780: ingo@780: ingo@780: protected void validateTo(List errors) { ingo@780: double to = distancePanel.getTo(); ingo@780: ingo@780: if (to < min || to > max) { ingo@780: NumberFormat nf = NumberFormat.getDecimalFormat(); ingo@780: ingo@780: String tmp = MSG.error_validate_upper_range(); ingo@780: tmp = tmp.replace("$1", nf.format(to)); ingo@780: tmp = tmp.replace("$2", nf.format(max)); ingo@780: ingo@780: distancePanel.setTo(max); ingo@780: errors.add(tmp); ingo@780: } ingo@780: } ingo@780: ingo@780: ingo@780: @Override ingo@780: public Data[] getData() { ingo@780: Data[] data = new Data[3]; ingo@780: ingo@780: data[0] = getDataFrom(); ingo@780: data[1] = getDataTo(); ingo@780: data[2] = getDataStep(); ingo@780: ingo@780: return data; ingo@780: } ingo@780: ingo@780: ingo@780: protected Data getDataFrom() { ingo@787: String value = String.valueOf(distancePanel.getFrom()); ingo@787: String field = getLowerField(); ingo@787: ingo@787: DataItem item = new DefaultDataItem(field, field, value); ingo@780: return new DefaultData( ingo@787: field, null, null, new DataItem[] { item }); ingo@780: } ingo@780: ingo@780: ingo@780: protected Data getDataTo() { ingo@787: String value = String.valueOf(distancePanel.getTo()); ingo@787: String field = getUpperField(); ingo@787: ingo@787: DataItem item = new DefaultDataItem(field, field, value); ingo@780: return new DefaultData( ingo@787: field, null, null, new DataItem[] { item }); ingo@780: } ingo@780: ingo@780: ingo@780: protected Data getDataStep() { ingo@787: String value = String.valueOf(distancePanel.getStep()); ingo@787: String field = getStepField(); ingo@787: ingo@787: DataItem item = new DefaultDataItem(field, field, value); ingo@780: return new DefaultData( ingo@787: field, null, null, new DataItem[] { item }); ingo@780: } ingo@780: ingo@780: ingo@780: @Override ingo@780: public void onBlur(BlurEvent event) { ingo@780: distancePanel.validateForm(); ingo@780: } ingo@780: ingo@780: ingo@780: protected void initMinMaxValues(DataList data) { ingo@787: Data f = getData(data.getAll(), getLowerField()); ingo@787: Data t = getData(data.getAll(), getUpperField()); ingo@780: ingo@780: DataItem[] fItems = f.getItems(); ingo@780: DataItem[] tItems = t.getItems(); ingo@780: ingo@780: try { ingo@780: min = Double.valueOf(fItems[0].getStringValue()); ingo@780: max = Double.valueOf(tItems[0].getStringValue()); ingo@780: } ingo@780: catch (NumberFormatException nfe) { ingo@780: min = -Double.MAX_VALUE; ingo@780: max = Double.MAX_VALUE; ingo@780: } ingo@780: } ingo@780: ingo@780: ingo@780: protected void initDefaultValues(DataList data) { ingo@780: initDefaultFrom(data); ingo@780: initDefaultTo(data); ingo@780: initDefaultStep(data); ingo@780: } ingo@780: ingo@780: ingo@780: protected void initDefaultFrom(DataList data) { ingo@787: Data f = getData(data.getAll(), getLowerField()); ingo@780: ingo@787: double from = getDefaultFrom(); ingo@780: ingo@780: try { ingo@780: from = getDefaultValue(f); ingo@780: } ingo@780: catch (NumberFormatException nfe) { ingo@780: // do nothing ingo@780: } ingo@780: ingo@780: distancePanel.setFrom(from); ingo@780: } ingo@780: ingo@780: ingo@787: protected double getDefaultFrom() { ingo@787: return min; ingo@787: } ingo@787: ingo@787: ingo@780: protected void initDefaultTo(DataList data) { ingo@787: Data t = getData(data.getAll(), getUpperField()); ingo@780: ingo@787: double to = getDefaultTo(); ingo@780: ingo@780: try { ingo@780: to = getDefaultValue(t); ingo@780: } ingo@780: catch (NumberFormatException nfe) { ingo@780: // do nothing ingo@780: } ingo@780: ingo@780: distancePanel.setTo(to); ingo@780: } ingo@780: ingo@780: ingo@787: protected double getDefaultTo() { ingo@787: return max; ingo@787: } ingo@787: ingo@787: ingo@780: protected void initDefaultStep(DataList data) { ingo@787: Data s = getData(data.getAll(), getStepField()); ingo@780: ingo@787: double step = getDefaultStep(); ingo@780: ingo@780: try { ingo@780: step = getDefaultValue(s); ingo@780: } ingo@780: catch (NumberFormatException nfe) { ingo@780: // do nothing ingo@780: } ingo@780: ingo@780: distancePanel.setStep(step); ingo@780: } ingo@780: ingo@780: ingo@787: protected double getDefaultStep() { ingo@787: return (double) DEFAULT_STEP_WIDTH; ingo@787: } ingo@787: ingo@787: ingo@780: protected double getDefaultValue(Data data) ingo@780: throws NumberFormatException ingo@780: { ingo@780: DataItem def = data.getDefault(); ingo@780: String defValue = def != null ? def.getStringValue() : null; ingo@780: ingo@780: return Double.valueOf(defValue); ingo@780: } ingo@781: ingo@781: ingo@781: protected void initHelperPanel() { ingo@793: distancesTable = new RangeTable(); ingo@793: locationsTable = new LocationsTable(); ingo@793: ingo@782: Config config = Config.getInstance(); ingo@782: String url = config.getServerUrl(); ingo@782: String river = getRiverName(); ingo@782: ingo@782: distancesTable.setAutoFetchData(true); ingo@782: locationsTable.setAutoFetchData(true); ingo@782: distancesTable.setDataSource(new DistanceInfoDataSource( ingo@782: url, river, "distances")); ingo@782: locationsTable.setDataSource(new DistanceInfoDataSource( ingo@782: url, river, "locations")); ingo@782: ingo@783: distancesTable.addRecordClickHandler(new RecordClickHandler() { ingo@783: public void onRecordClick(RecordClickEvent e) { ingo@783: Record r = e.getRecord(); ingo@783: ingo@783: String from = r.getAttribute("from"); ingo@783: String to = r.getAttribute("to"); ingo@783: ingo@783: try { ingo@783: distancePanel.setFrom(Double.valueOf(from)); ingo@783: distancePanel.setTo(Double.valueOf(to)); ingo@783: } ingo@783: catch (NumberFormatException nfe) { ingo@783: SC.warn(MSG.wrongFormat()); ingo@783: } ingo@783: } ingo@783: }); ingo@783: ingo@783: locationsTable.addRecordClickHandler(new RecordClickHandler() { ingo@783: public void onRecordClick(RecordClickEvent e) { ingo@783: Record r = e.getRecord(); ingo@783: int field = e.getFieldNum(); ingo@783: ingo@783: try { ingo@783: String value = r.getAttribute("from"); ingo@783: ingo@783: switch (field) { ingo@783: case 0: ingo@783: distancePanel.setFrom(Double.valueOf(value)); ingo@783: break; ingo@783: case 1: ingo@783: distancePanel.setTo(Double.valueOf(value)); ingo@783: break; ingo@783: } ingo@783: } ingo@783: catch (NumberFormatException nfe) { ingo@783: SC.warn(MSG.wrongFormat()); ingo@783: } ingo@783: } ingo@783: }); ingo@783: ingo@781: tabs = new TabSet(); ingo@781: tabs.setWidth100(); ingo@781: tabs.setHeight100(); ingo@781: ingo@781: Tab locations = new Tab(MSG.locations()); ingo@781: Tab distances = new Tab(MSG.distance()); ingo@781: ingo@781: locations.setPane(locationsTable); ingo@781: distances.setPane(distancesTable); ingo@781: ingo@781: tabs.addTab(locations, 0); ingo@781: tabs.addTab(distances, 1); ingo@781: ingo@788: helperContainer.addMember(tabs); ingo@781: } ingo@782: ingo@782: ingo@782: protected String getRiverName() { ingo@782: ArtifactDescription adescr = artifact.getArtifactDescription(); ingo@782: DataList[] data = adescr.getOldData(); ingo@782: ingo@782: if (data != null && data.length > 0) { ingo@782: for (int i = 0; i < data.length; i++) { ingo@782: DataList dl = data[i]; ingo@782: ingo@782: if (dl.getState().equals("state.winfo.river")) { ingo@782: for (int j = 0; j < dl.size(); j++) { ingo@782: Data d = dl.get(j); ingo@782: DataItem[] di = d.getItems(); ingo@782: ingo@782: if (di != null && di.length == 1) { ingo@782: return d.getItems()[0].getStringValue(); ingo@782: } ingo@782: } ingo@782: } ingo@782: } ingo@782: } ingo@782: ingo@782: return null; ingo@782: } ingo@780: } ingo@780: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :