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@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@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@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@780: import de.intevation.flys.client.client.FLYSConstants; 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@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@781: distancesTable = new RangeTable(); ingo@781: locationsTable = new LocationsTable(); ingo@781: distancePanel = new DoubleRangePanel( ingo@780: MSG.unitFrom(), MSG.unitTo(), MSG.unitWidth(), ingo@780: 0d, 0d, 0d, 250, this); ingo@780: } ingo@780: ingo@780: ingo@780: @Override ingo@780: public Canvas create(DataList data) { ingo@780: VLayout layout = new VLayout(); ingo@780: layout.setMembersMargin(10); ingo@780: ingo@780: Label label = new Label(MSG.distance_state()); 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@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@780: Data dFrom = getData(items, "ld_from"); ingo@780: Data dTo = getData(items, "ld_to"); ingo@780: Data dStep = getData(items, "ld_step"); 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@780: sb.append(" " + MSG.unitFrom() + " "); ingo@780: sb.append(to[0].getLabel()); ingo@780: sb.append(" " + MSG.unitTo() + " "); ingo@780: sb.append(step[0].getLabel()); ingo@780: sb.append(" " + MSG.unitWidth()); ingo@780: ingo@780: return sb.toString(); ingo@780: } ingo@780: ingo@780: 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@780: String value = String.valueOf(distancePanel.getFrom()); ingo@780: DataItem item = new DefaultDataItem("ld_from", "ld_from", value); ingo@780: return new DefaultData( ingo@780: "ld_from", null, null, new DataItem[] { item }); ingo@780: } ingo@780: ingo@780: ingo@780: protected Data getDataTo() { ingo@780: String value = String.valueOf(distancePanel.getTo()); ingo@780: DataItem item = new DefaultDataItem("ld_to", "ld_to", value); ingo@780: return new DefaultData( ingo@780: "ld_to", null, null, new DataItem[] { item }); ingo@780: } ingo@780: ingo@780: ingo@780: protected Data getDataStep() { ingo@780: String value = String.valueOf(distancePanel.getStep()); ingo@780: DataItem item = new DefaultDataItem("ld_step","ld_step", value); ingo@780: return new DefaultData( ingo@780: "ld_step", 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@780: Data f = getData(data.getAll(), "ld_from"); ingo@780: Data t = getData(data.getAll(), "ld_to"); 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@780: Data f = getData(data.getAll(), "ld_from"); ingo@780: ingo@780: double from = min; 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@780: protected void initDefaultTo(DataList data) { ingo@780: Data t = getData(data.getAll(), "ld_to"); ingo@780: ingo@780: double to = max; 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@780: protected void initDefaultStep(DataList data) { ingo@780: Data s = getData(data.getAll(), "ld_step"); ingo@780: ingo@780: double step = (double) DEFAULT_STEP_WIDTH; 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@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@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@781: helperContainer.addChild(tabs); ingo@781: } ingo@780: } ingo@780: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :