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@2901:
raimund@2901: int hWidth = helperContainer.getWidth() - 12;
raimund@2901: int hHeight = helperContainer.getHeight() - 62;
raimund@2901:
sascha@2922: if ((int)(hHeight *4f/3) < hWidth) {
sascha@2922: hWidth = (int)(hHeight * 4f/3);
raimund@2901: }
raimund@2901: else {
sascha@2922: hHeight = (int)(hWidth *3f/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:
sascha@2922: if (chartContainer.hasMember(chartImg)) {
sascha@2922: chartImg.setWidth(hWidth);
sascha@2922: chartImg.setHeight(hHeight);
sascha@2922: chartImg.setSrc(imgUrl);
sascha@2922: }
sascha@2922: else {
sascha@2922: chartImg = new Img(imgUrl, hWidth, hHeight);
sascha@2922: chartContainer.addMember(chartImg);
sascha@2922: }
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: }