raimund@2505: package de.intevation.flys.client.client.ui.fixation; raimund@2505: raimund@2505: import java.util.HashMap; raimund@2517: import java.util.Date; raimund@2517: import java.lang.Math; raimund@2517: raimund@2517: import java.lang.NumberFormatException; raimund@2505: raimund@2505: import com.google.gwt.core.client.GWT; raimund@2505: import com.google.gwt.user.client.rpc.AsyncCallback; raimund@2505: raimund@2505: import com.smartgwt.client.util.SC; raimund@2505: raimund@2505: import com.smartgwt.client.widgets.Canvas; raimund@2517: import com.smartgwt.client.widgets.Button; raimund@2505: import com.smartgwt.client.widgets.form.DynamicForm; raimund@2505: import com.smartgwt.client.widgets.HTMLPane; raimund@2505: import com.smartgwt.client.widgets.layout.VLayout; raimund@2517: import com.smartgwt.client.widgets.layout.HLayout; raimund@2517: import com.smartgwt.client.widgets.form.fields.TextItem; raimund@2517: import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; raimund@2517: import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; raimund@2517: import com.smartgwt.client.widgets.events.ClickHandler; raimund@2517: import com.smartgwt.client.widgets.events.ClickEvent; raimund@2517: import com.smartgwt.client.widgets.events.ResizedHandler; raimund@2517: import com.smartgwt.client.widgets.events.ResizedEvent; raimund@2517: import com.smartgwt.client.widgets.form.validator.IsFloatValidator; raimund@2517: import com.smartgwt.client.types.Alignment; raimund@2517: raimund@2517: import com.smartgwt.client.widgets.tab.Tab; raimund@2517: import com.smartgwt.client.widgets.tab.TabSet; raimund@2517: import com.smartgwt.client.widgets.Img; raimund@2505: raimund@2505: import de.intevation.flys.client.client.FLYSConstants; raimund@2505: import de.intevation.flys.client.client.ui.AbstractUIProvider; raimund@2505: raimund@2505: import de.intevation.flys.client.client.Config; raimund@2505: raimund@2505: import de.intevation.flys.client.shared.model.Data; raimund@2505: import de.intevation.flys.client.shared.model.DataList; raimund@2505: import de.intevation.flys.client.shared.model.FixingsOverviewInfo; raimund@2505: raimund@2505: import de.intevation.flys.client.client.services.FixingsOverviewService; raimund@2505: import de.intevation.flys.client.client.services.FixingsOverviewServiceAsync; raimund@2505: raimund@2505: raimund@2505: /** raimund@2505: * This UIProvider creates helper panel for fixation analysis without input raimund@2505: * elements. raimund@2505: * raimund@2505: * @author Raimund Renkert raimund@2505: */ raimund@2505: public abstract class FixationPanel raimund@2517: extends AbstractUIProvider raimund@2517: implements ResizedHandler raimund@2505: { raimund@2505: protected static HashMap instances = new HashMap(); raimund@2505: raimund@2505: /** The message class that provides i18n strings. */ raimund@2505: protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); raimund@2505: raimund@2505: protected FixingsOverviewServiceAsync overviewService = raimund@2505: GWT.create(FixingsOverviewService.class); raimund@2505: raimund@2505: protected String htmlOverview; raimund@2505: protected FixingsOverviewInfo fixInfo; raimund@2517: protected FixFilter fixFilter; raimund@2517: protected TabSet tabs; raimund@2517: protected Tab events; raimund@2517: protected Tab chart; raimund@2517: protected VLayout chartContainer; raimund@2517: protected Img chartImg; raimund@2505: raimund@2505: public FixationPanel() { raimund@2517: fixFilter = new FixFilter(); raimund@2517: chartImg = new Img(); raimund@2505: htmlOverview = ""; raimund@2505: } raimund@2505: raimund@2505: protected String getArtifactUuid() { raimund@2505: return this.artifact.getUuid(); raimund@2505: } raimund@2505: raimund@2505: protected void init() { raimund@2505: raimund@2505: } raimund@2505: raimund@2505: public Data[] getData() { raimund@2505: return null; raimund@2505: } raimund@2505: raimund@2505: public Canvas create(DataList list) { raimund@2505: VLayout layout = new VLayout(); raimund@2505: raimund@2505: Canvas helper = createHelper(); raimund@2505: this.helperContainer.addMember(helper); raimund@2505: raimund@2505: Canvas submit = getNextButton(); raimund@2505: Canvas widget = createWidget(list); raimund@2505: raimund@2505: layout.addMember(widget); raimund@2505: layout.addMember(submit); raimund@2505: return layout; raimund@2505: } raimund@2505: raimund@2505: public Canvas createOld(DataList list) { raimund@2505: return new DynamicForm(); raimund@2505: } raimund@2505: raimund@2505: protected Canvas createHelper() { raimund@2505: Config config = Config.getInstance(); raimund@2505: String locale = config.getLocale (); raimund@2505: raimund@2517: tabs = new TabSet(); raimund@2517: events = new Tab(MESSAGES.events()); raimund@2517: chart = new Tab(MESSAGES.kmchart()); raimund@2517: raimund@2517: chartContainer = new VLayout(); raimund@2517: Canvas scroll = createChartHelper(); raimund@2517: raimund@2517: VLayout layout = new VLayout(); raimund@2517: layout.addResizedHandler(this); raimund@2517: layout.addMember(chartContainer); raimund@2517: layout.addMember(scroll); raimund@2517: layout.setAlign(Alignment.CENTER); raimund@2517: chart.setPane(layout); raimund@2517: raimund@2517: final HTMLPane eventPane = new HTMLPane(); raimund@2505: raimund@2505: String river = artifact.getArtifactDescription().getRiver(); raimund@2526: fixFilter.setRiver(river); raimund@2505: createCallback(); raimund@2505: /* raimund@2505: Filter example. raimund@2505: {"fixings": { "river": { "name": "Elbe"}, "range": {"from": 1, "to": 200}, "filter": {"and": { "column": {"cid": 1}, "column": {"cid": 2} } }} raimund@2505: */ raimund@2505: String callBack = "fixationCallback(this.checked, this.name)"; raimund@2505: raimund@2505: overviewService.generateOverview( raimund@2505: locale, raimund@2505: artifact.getUuid(), raimund@2526: fixFilter.getOverviewFilter(), raimund@2505: renderCheckboxes(), raimund@2505: callBack, raimund@2505: new AsyncCallback() { raimund@2505: public void onFailure(Throwable caught) { raimund@2505: GWT.log("Could not receive overview."); raimund@2505: SC.warn(caught.getMessage()); raimund@2505: } raimund@2505: public void onSuccess(FixingsOverviewInfo info) { raimund@2505: GWT.log("Successfully loaded overview."); raimund@2505: fixInfo = info; raimund@2505: htmlOverview = info.getHTML(); raimund@2517: fixFilter.setRiver(info.getRiver()); raimund@2517: fixFilter.setCurrentKm(1d); raimund@2517: fixFilter.setFromKm(info.getFrom()); raimund@2517: fixFilter.setToKm(info.getTo()); raimund@2517: eventPane.setContents(htmlOverview); raimund@2517: updateChartTab(fixInfo.getFrom()); raimund@2517: events.setPane(eventPane); raimund@2537: success(); raimund@2505: } raimund@2505: }); raimund@2505: raimund@2517: tabs.addTab(events); raimund@2517: tabs.addTab(chart); raimund@2505: raimund@2517: return tabs; raimund@2505: } raimund@2505: raimund@2517: raimund@2517: protected Canvas createChartHelper() { raimund@2517: raimund@2517: raimund@2517: DynamicForm form = new DynamicForm(); raimund@2517: Button lower = new Button("<<"); raimund@2517: lower.setWidth(30); raimund@2517: Button upper = new Button(">>"); raimund@2517: upper.setWidth(30); raimund@2517: final TextItem currentkm = new TextItem(); raimund@2517: currentkm.setWidth(60); raimund@2517: currentkm.setShowTitle(false); raimund@2517: currentkm.setValidators(new IsFloatValidator()); raimund@2517: raimund@2517: form.setFields(currentkm); raimund@2517: form.setWidth(60); raimund@2517: lower.addClickHandler(new ClickHandler() { raimund@2517: public void onClick(ClickEvent ce) { raimund@2517: updateChartTabLow(); raimund@2517: currentkm.setValue(fixFilter.getCurrentKm()); raimund@2517: } raimund@2517: }); raimund@2517: raimund@2517: upper.addClickHandler(new ClickHandler() { raimund@2517: public void onClick(ClickEvent ce) { raimund@2517: updateChartTabUp(); raimund@2517: currentkm.setValue(fixFilter.getCurrentKm()); raimund@2517: } raimund@2517: }); raimund@2517: raimund@2517: currentkm.addChangedHandler(new ChangedHandler() { raimund@2517: public void onChanged(ChangedEvent ce) { raimund@2517: //TODO: get current value. raimund@2517: if(ce.getForm().validate() && ce.getItem().getValue() != null) { raimund@2517: try { raimund@2517: String s = ce.getItem().getValue().toString(); raimund@2517: Double d = new Double(s); raimund@2517: updateChartTab(d.doubleValue()); raimund@2517: } raimund@2517: catch(NumberFormatException nfe) { raimund@2517: // Do nothing. raimund@2517: } raimund@2517: } raimund@2517: } raimund@2517: }); raimund@2517: raimund@2517: HLayout layout = new HLayout(); raimund@2517: layout.setAlign(Alignment.CENTER); raimund@2517: raimund@2517: layout.addMember(lower); raimund@2517: layout.addMember(form); raimund@2517: layout.addMember(upper); raimund@2517: return layout; raimund@2517: } raimund@2517: raimund@2517: protected void updateChartTab(double km) { raimund@2517: Config config = Config.getInstance(); raimund@2517: String locale = config.getLocale (); raimund@2517: raimund@2517: fixFilter.setCurrentKm(km); raimund@2517: chartContainer.removeMember(chartImg); raimund@2517: String imgUrl = GWT.getModuleBaseURL(); raimund@2517: imgUrl += "fixings-km-chart"; raimund@2517: imgUrl += "?locale=" + locale; raimund@2517: imgUrl += "&filter=" + fixFilter.getChartFilter(helperContainer.getWidth() - 12, (int)(helperContainer.getWidth()*3/4) - 12); raimund@2517: raimund@2517: chartImg = new Img(imgUrl, helperContainer.getWidth() - 12, (int)(helperContainer.getWidth()*3/4) - 12); raimund@2517: chartContainer.addMember(chartImg); raimund@2517: raimund@2517: } raimund@2517: raimund@2517: raimund@2517: protected void updateChartTabLow() { raimund@2517: double curr = fixFilter.getCurrentKm(); raimund@2517: if (curr > fixFilter.getFromKm()) { raimund@2517: double newVal = (curr - 0.1) * 10; raimund@2517: long round = Math.round(newVal); raimund@2517: updateChartTab(((double)round) / 10); raimund@2517: } raimund@2517: return; raimund@2517: } raimund@2517: raimund@2517: raimund@2517: protected void updateChartTabUp() { raimund@2517: double curr = fixFilter.getCurrentKm(); raimund@2517: if (curr < fixFilter.getToKm()) { raimund@2517: double newVal = (curr + 0.1) * 10; raimund@2517: long round = Math.round(newVal); raimund@2517: updateChartTab(((double)round) / 10); raimund@2517: } raimund@2517: return; raimund@2517: } raimund@2517: raimund@2517: raimund@2517: public void onResized(ResizedEvent re) { raimund@2517: updateChartTab(fixFilter.getCurrentKm()); raimund@2517: } raimund@2517: raimund@2517: raimund@2505: private native void createCallback() /*-{ raimund@2505: $wnd.fixationCallback = @de.intevation.flys.client.client.ui.fixation.FixationPanel::helperCallback(ZLjava/lang/String;); raimund@2505: }-*/; raimund@2505: raimund@2505: private static void helperCallback(boolean checked, String name) { raimund@2505: String[] parts = name.split(":"); raimund@2505: String uuid = parts[0]; raimund@2505: String cid = parts[1]; raimund@2505: FixationPanel p = FixationPanel.getInstance(uuid); raimund@2505: if (p != null) { raimund@2505: p.setValues(cid, checked); raimund@2505: } raimund@2505: } raimund@2505: raimund@2505: private static FixationPanel getInstance(String uuid) { raimund@2505: for (int i = 0; i < instances.size(); i++) { raimund@2505: if (instances.get(uuid) != null) { raimund@2505: return instances.get(uuid); raimund@2505: } raimund@2505: } raimund@2505: return null; raimund@2505: } raimund@2505: raimund@2505: public abstract Canvas createWidget(DataList data); raimund@2505: public abstract void setValues(String cid, boolean checked); raimund@2505: public abstract boolean renderCheckboxes(); raimund@2517: public abstract FixFilter getFilter(); raimund@2517: public abstract void setFilter(FixFilter filter); raimund@2537: public abstract void success(); raimund@2517: raimund@2517: public static class FixFilter { raimund@2517: protected String river; raimund@2517: protected double fromKm; raimund@2517: protected double toKm; raimund@2517: protected double currentKm; raimund@2517: protected int fromClass; raimund@2517: protected int toClass; raimund@2526: protected long fromDate; raimund@2526: protected long toDate; raimund@2526: protected boolean hasDate; raimund@2517: protected int[] events; raimund@2517: raimund@2526: public FixFilter() { raimund@2526: this.river = ""; raimund@2526: this.fromKm = -1d; raimund@2526: this.toKm = -1; raimund@2526: this.currentKm = -1; raimund@2526: this.fromClass = -1; raimund@2526: this.toClass = -1; raimund@2526: this.fromDate = -1; raimund@2526: this.toDate = -1; raimund@2526: this.hasDate = false; raimund@2526: this.events = new int[0]; raimund@2526: } raimund@2517: raimund@2517: public void setRiver(String river) { raimund@2517: this.river = river; raimund@2517: } raimund@2517: raimund@2517: public void setFromKm(double from) { raimund@2517: this.fromKm = from; raimund@2517: } raimund@2517: raimund@2517: public void setToKm(double to) { raimund@2517: this.toKm = to; raimund@2517: } raimund@2517: raimund@2517: public void setCurrentKm(double km) { raimund@2517: this.currentKm = km; raimund@2517: } raimund@2517: raimund@2517: public void setFromClass(int from) { raimund@2517: this.fromClass = from; raimund@2517: } raimund@2517: raimund@2517: public void setToClass(int to) { raimund@2517: this.toClass = to; raimund@2517: } raimund@2517: raimund@2526: public void setFromDate(long from) { raimund@2526: this.hasDate = true; raimund@2517: this.fromDate = from; raimund@2517: } raimund@2517: raimund@2526: public void setToDate(long to) { raimund@2526: this.hasDate = true; raimund@2517: this.toDate = to; raimund@2517: } raimund@2517: raimund@2517: public void setEvents(int[] ev) { raimund@2517: this.events = ev; raimund@2517: } raimund@2517: raimund@2517: public String getRiver() { raimund@2517: return this.river; raimund@2517: } raimund@2517: raimund@2517: public double getFromKm() { raimund@2517: return this.fromKm; raimund@2517: } raimund@2517: raimund@2517: public double getToKm() { raimund@2517: return this.toKm; raimund@2517: } raimund@2517: raimund@2517: public double getCurrentKm() { raimund@2517: return this.currentKm; raimund@2517: } raimund@2517: raimund@2517: public int getFromClass() { raimund@2517: return this.fromClass; raimund@2517: } raimund@2517: raimund@2517: public int getToClass() { raimund@2517: return this.toClass; raimund@2517: } raimund@2517: raimund@2526: public long getFromDate() { raimund@2517: return this.fromDate; raimund@2517: } raimund@2517: raimund@2526: public long getToDate() { raimund@2517: return this.toDate; raimund@2517: } raimund@2517: raimund@2517: public int[] getEvents() { raimund@2517: return this.events; raimund@2517: } raimund@2517: raimund@2517: public String getOverviewFilter() { raimund@2517: String filter = ""; raimund@2517: if (river != null && river.length() > 0) { raimund@2517: filter = "{\"fixings\": {\"river\": {\"name\": \"" + river + "\"}}"; raimund@2517: filter += createFilter(); raimund@2517: filter += "}"; raimund@2517: } raimund@2517: return filter; raimund@2517: } raimund@2517: raimund@2517: public String getChartFilter(int width, int height) { raimund@2517: String filter = ""; raimund@2517: if (river != null && river.length() > 0 && raimund@2517: currentKm >= fromKm && currentKm <= toKm) raimund@2517: { raimund@2517: filter = "{\"fixings\": "+ raimund@2517: "{\"river\": {\"name\": \"" + river + "\"}," + raimund@2517: "\"km\": {\"value\": \"" + currentKm + "\"}," + raimund@2517: "\"extent\": {\"width\": \"" + width + "\", \"height\": \"" + height + "\"}}"; raimund@2517: filter += createFilter(); raimund@2517: filter += "}"; raimund@2517: } raimund@2517: return filter; raimund@2517: } raimund@2517: raimund@2517: protected String createFilter() { raimund@2517: //TODO create filter... raimund@2517: return ""; raimund@2517: } raimund@2517: } raimund@2505: }