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: }