raimund@2505: package de.intevation.flys.client.client.ui.fixation; raimund@2505: raimund@2505: import java.util.HashMap; raimund@2884: import java.util.Date; raimund@2884: raimund@2884: import java.io.Serializable; raimund@2517: raimund@2505: import com.google.gwt.core.client.GWT; raimund@2505: import com.google.gwt.user.client.rpc.AsyncCallback; raimund@2505: raimund@2884: import com.google.gwt.json.client.JSONObject; raimund@2884: import com.google.gwt.json.client.JSONNumber; raimund@2884: import com.google.gwt.json.client.JSONString; raimund@2884: import com.google.gwt.i18n.client.DateTimeFormat; raimund@2884: 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@2884: import de.intevation.flys.client.shared.model.FixAnalysisArtifact; 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 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: 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@2505: createCallback(); sascha@2914: raimund@2505: String callBack = "fixationCallback(this.checked, this.name)"; raimund@2884: FixAnalysisArtifact art = (FixAnalysisArtifact) this.artifact; raimund@2884: raimund@2505: overviewService.generateOverview( raimund@2505: locale, raimund@2505: artifact.getUuid(), raimund@2884: art.getFilter().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@2884: FixAnalysisArtifact art = (FixAnalysisArtifact)artifact; raimund@2884: art.getFilter().setRiver(info.getRiver()); raimund@2884: art.getFilter().setCurrentKm(1d); raimund@2884: art.getFilter().setFromKm(info.getFrom()); raimund@2884: art.getFilter().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@2884: FixAnalysisArtifact art = (FixAnalysisArtifact) artifact; raimund@2884: currentkm.setValue(art.getFilter().getCurrentKm()); raimund@2517: } raimund@2517: }); raimund@2517: raimund@2517: upper.addClickHandler(new ClickHandler() { raimund@2517: public void onClick(ClickEvent ce) { raimund@2517: updateChartTabUp(); raimund@2884: FixAnalysisArtifact art = (FixAnalysisArtifact) artifact; raimund@2884: currentkm.setValue(art.getFilter().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@2884: FixAnalysisArtifact art = (FixAnalysisArtifact) this.artifact; raimund@2884: if (km < 0) { raimund@2884: km = 0; raimund@2884: } raimund@2884: art.getFilter().setCurrentKm(km); raimund@2884: if (chartContainer.hasMember(chartImg)) { raimund@2884: chartContainer.removeMember(chartImg); raimund@2884: } raimund@2901: raimund@2901: int hWidth = helperContainer.getWidth() - 12; raimund@2901: int hHeight = helperContainer.getHeight() - 62; raimund@2901: raimund@2901: if ((int)(hHeight *4/3) < hWidth) { raimund@2901: hWidth = (int)hHeight * 4/3; raimund@2901: } raimund@2901: else { raimund@2901: hHeight = (int)hWidth *3/4; raimund@2901: } raimund@2901: raimund@2517: String imgUrl = GWT.getModuleBaseURL(); raimund@2517: imgUrl += "fixings-km-chart"; raimund@2517: imgUrl += "?locale=" + locale; raimund@2901: imgUrl += "&filter=" + art.getFilter().getChartFilter(hWidth, hHeight); raimund@2517: raimund@2901: chartImg = new Img(imgUrl, hWidth, hHeight); raimund@2517: chartContainer.addMember(chartImg); raimund@2517: raimund@2517: } raimund@2517: raimund@2517: raimund@2517: protected void updateChartTabLow() { raimund@2884: FixAnalysisArtifact art = (FixAnalysisArtifact) this.artifact; raimund@2884: raimund@2884: double curr = art.getFilter().getCurrentKm(); raimund@2884: if (curr > art.getFilter().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@2884: FixAnalysisArtifact art = (FixAnalysisArtifact) this.artifact; raimund@2884: raimund@2884: double curr = art.getFilter().getCurrentKm(); raimund@2884: if (curr < art.getFilter().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@2884: FixAnalysisArtifact art = (FixAnalysisArtifact) this.artifact; raimund@2884: raimund@2884: updateChartTab(art.getFilter().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@2537: public abstract void success(); raimund@2517: raimund@2884: public static class FixFilter implements Serializable{ 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: if (river != null && river.length() > 0) { raimund@2884: JSONObject jfix = new JSONObject(); raimund@2884: JSONObject jfilter = new JSONObject(); raimund@2884: JSONObject jrName = new JSONObject(); raimund@2884: JSONString jrValue = new JSONString(river); raimund@2884: jrName.put("name", jrValue); raimund@2884: jfilter.put("river", jrName); raimund@2884: jfix.put("fixings", createFilter(jfilter)); raimund@2884: return jfix.toString(); raimund@2517: } raimund@2884: return ""; raimund@2517: } raimund@2517: raimund@2517: public String getChartFilter(int width, int height) { raimund@2517: if (river != null && river.length() > 0 && raimund@2517: currentKm >= fromKm && currentKm <= toKm) raimund@2517: { raimund@2884: JSONObject jfix = new JSONObject(); raimund@2884: JSONObject jfilter = new JSONObject(); raimund@2884: JSONObject jrName = new JSONObject(); raimund@2884: JSONString jrValue = new JSONString(river); raimund@2884: JSONObject jkm = new JSONObject(); raimund@2884: JSONNumber jkmValue = new JSONNumber(currentKm); raimund@2884: JSONObject jextent = new JSONObject(); raimund@2884: JSONNumber jwidth = new JSONNumber(width); raimund@2884: JSONNumber jheight = new JSONNumber(height); raimund@2884: raimund@2884: jkm.put("value", jkmValue); raimund@2884: jrName.put("name", jrValue); raimund@2884: jfilter.put("river", jrName); raimund@2884: jfilter.put("km", jkm); raimund@2884: jextent.put("width", jwidth); raimund@2884: jextent.put("height", jheight); raimund@2884: jfilter.put("extent", jextent); raimund@2884: jfix.put("fixings", createFilter(jfilter)); raimund@2884: return jfix.toString(); raimund@2517: } raimund@2884: return ""; raimund@2517: } raimund@2517: raimund@2884: protected JSONObject createFilter(JSONObject root) { raimund@2884: if (this.fromKm >= 0 && this.toKm >= 0 && this.fromKm <=this.toKm) { raimund@2884: JSONObject range = new JSONObject(); raimund@2884: JSONObject fromtokm = new JSONObject(); raimund@2884: JSONNumber f = new JSONNumber(this.fromKm); raimund@2884: JSONNumber t = new JSONNumber(this.toKm); raimund@2884: fromtokm.put("from", f); raimund@2884: fromtokm.put("to", t); raimund@2884: root.put("range", fromtokm); raimund@2884: } raimund@2884: JSONObject and = new JSONObject(); raimund@2884: if (this.hasDate) { raimund@2884: JSONObject daterange = new JSONObject(); raimund@2884: Date df = new Date(this.fromDate); raimund@2884: Date dt = new Date(this.toDate); raimund@2884: DateTimeFormat dtf = DateTimeFormat.getFormat("dd.MM.yyyy"); raimund@2884: JSONString f = new JSONString(dtf.format(df)); raimund@2884: JSONString t = new JSONString(dtf.format(dt)); raimund@2884: daterange.put("from", f); raimund@2884: daterange.put("to", t); raimund@2884: and.put("date-range", daterange); raimund@2884: } raimund@2884: if (this.fromClass >= 0 && raimund@2884: this.toClass >= 0 && raimund@2884: this.fromClass <= this.toClass) { raimund@2884: JSONObject classrange = new JSONObject(); raimund@2884: JSONNumber f = new JSONNumber(this.fromClass); raimund@2884: JSONNumber t = new JSONNumber(this.toClass); raimund@2884: classrange.put("from", f); raimund@2884: classrange.put("to", t); raimund@2884: and.put("sector-range", classrange); raimund@2884: } raimund@2884: if (this.events.length > 0) { sascha@2917: StringBuilder cids = new StringBuilder(); sascha@2917: sascha@2917: for (int i = 0; i < events.length; i++) { sascha@2917: if (i > 0) cids.append(' '); sascha@2917: cids.append(events[i]); raimund@2884: } sascha@2917: JSONObject columns = new JSONObject(); sascha@2917: columns.put("cids", new JSONString(cids.toString())); sascha@2917: and.put("columns", columns); raimund@2884: } raimund@2884: if (and.size() > 0) { raimund@2884: JSONObject filter = new JSONObject(); raimund@2884: filter.put("and", and); raimund@2884: root.put("filter", filter); raimund@2884: } raimund@2884: return root; raimund@2517: } raimund@2517: } raimund@2505: }