# HG changeset patch # User Felix Wolfsteller # Date 1366364847 -7200 # Node ID cdc47534a9709cd53929a86dc3852af4018e5a9a # Parent c0d0b9fd1aa8222f3b2d54f911f18d31d3f64156 issue1133: Improved multi-gauge W/Q input. diff -r c0d0b9fd1aa8 -r cdc47534a970 flys-client/src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java --- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java Fri Apr 19 09:22:44 2013 +0200 +++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/WQAdaptedInputPanel.java Fri Apr 19 11:47:27 2013 +0200 @@ -98,20 +98,23 @@ /** List of doubleArrayPanels shown. */ protected ArrayList doubleArrayPanels; - /** Stores the min/max values for each q range.*/ + /** [startkm,endkm] per gauge in selected range. */ + protected double[][] gaugeRanges; + + /** Stores the min/max values for each q range (gauge). */ protected Map qranges; - /** Stores the min/max values for each w range. */ + /** Stores the min/max values for each w range (gauge). */ protected Map wranges; /** The RadioGroupItem that determines the w/q input mode. */ protected DynamicForm modes; - /** Table holding Q and D values. */ - protected QDTable qdTable; + /** List of wTables in inputhelper section. */ + protected List wTables; - /** Table holding W values. */ - protected WTable wTable; + /** List of QDTables in inputhelper section. */ + protected List qdTables; /** Tabs in inputhelper area. */ protected TabSet tabs; @@ -125,14 +128,14 @@ doubleArrayPanels = new ArrayList(); qranges = new HashMap(); wranges = new HashMap(); - qdTable = new QDTable(); - wTable = new WTable(); - initTableListeners(); + wTables = new ArrayList(); + qdTables = new ArrayList(); } @Override public Canvas create(DataList data) { + readGaugeRanges(data); initHelperPanel(); Canvas submit = getNextButton(); @@ -149,6 +152,10 @@ layout.addMember(widget); layout.addMember(submit); + fetchWQData(); + + initTableListeners(); + return layout; } @@ -160,19 +167,30 @@ tabs.setWidth100(); tabs.setHeight100(); - Tab wTab = new Tab(MESSAGE.wq_table_w()); - Tab qTab = new Tab(MESSAGE.wq_table_q()); + // For each gauge, add two tabs with helper tables. - qdTable.showSelect(); - wTab.setPane(wTable); - qTab.setPane(qdTable); + for (int i = 0; i< gaugeRanges.length; i++) { + // Later the tabs title will get adjusted to include gauges name. + // TODO the tabs title becomes rather long through that (i18n). + Tab wTab = new Tab(MESSAGE.wq_table_w()); + Tab qTab = new Tab(MESSAGE.wq_table_q()); - tabs.addTab(wTab, 0); - tabs.addTab(qTab, 1); + QDTable qdTable = new QDTable(); + WTable wTable = new WTable(); + + wTables.add(wTable); + qdTables.add(qdTable); + + qdTable.showSelect(); + //wTable.showSelect(); + wTab.setPane(wTable); + qTab.setPane(qdTable); + + tabs.addTab(wTab, i*2+0); + tabs.addTab(qTab, i*2+1); + } helperContainer.addMember(tabs); - - fetchWQData(); } @@ -181,32 +199,44 @@ */ // TODO dupe from WQInputPanel protected void initTableListeners() { - CellClickHandler handler = new CellClickHandler() { - @Override - public void onCellClick(CellClickEvent e) { - if (isWMode() || qdTable.isLocked()) { - return; - } - - int idx = e.getColNum(); - Record r = e.getRecord(); - double val = r.getAttributeAsDouble("value"); + int i = 0; + for (QDTable qdTable: qdTables) { + // Register listener such that values are filled in on click. + final QDTable table = qdTable; + final int fi = i; + CellClickHandler handler = new CellClickHandler() { + @Override + public void onCellClick(CellClickEvent e) { + if (isWMode() || table.isLocked()) { + return; + } - if (itemWithFocus != null) { - itemWithFocus.setValues(new double[]{val}); - // TODO 1133, show different data for each doublearraypanel - int i = doubleArrayPanels.indexOf(itemWithFocus); - if (i == doubleArrayPanels.size()-1) { - doubleArrayPanels.get(0).focusInItem(1); + int idx = e.getColNum(); + Record r = e.getRecord(); + double val = r.getAttributeAsDouble("value"); + + doubleArrayPanels.get(fi).setValues(new double[]{val}); + // Focus next. + if (fi != doubleArrayPanels.size()-1) { + doubleArrayPanels.get(fi+1).focusInItem(1); } - else { - doubleArrayPanels.get(i+1).focusInItem(1); - } + + /*if (itemWithFocus != null) { + itemWithFocus.setValues(new double[]{val}); + int i = doubleArrayPanels.indexOf(itemWithFocus); + if (i == doubleArrayPanels.size()-1) { + doubleArrayPanels.get(0).focusInItem(1); + } + else { + doubleArrayPanels.get(i+1).focusInItem(1); + } + }*/ } - } - }; + }; - qdTable.addCellClickHandler(handler); + qdTable.addCellClickHandler(handler); + i++; + } } @@ -294,6 +324,7 @@ } + /** Create non-input helper part of the UI. */ protected Canvas createWidget(DataList dataList) { VLayout layout = new VLayout(); @@ -468,15 +499,40 @@ } } + /** Populate Gauge Ranges array. */ + private void readGaugeRanges(DataList dataList) { + DataItem[] items = getWQItems(dataList); + gaugeRanges = new double[items.length][2]; + + int i = 0; + + for (DataItem item: items) { + String[] startEndKm = item.getLabel().split(";"); + + gaugeRanges[i][0] = Double.parseDouble(startEndKm[0]); + gaugeRanges[i][1] = Double.parseDouble(startEndKm[1]); + i++; + } + } + protected Canvas createList(DataList dataList) { VLayout layout = new VLayout(); DataItem[] items = getWQItems(dataList); + int i = 0; + for (DataItem item: items) { - String title = item.getLabel(); + String title = item.getLabel(); // of form: 70.5;112.0 String label = item.getStringValue(); + + // Rename W and Q tab to include gauges name. + tabs.getTab(i*2).setTitle(tabs.getTab(i*2).getTitle() + + " (" + label + ")"); + tabs.getTab(i*2+1).setTitle(tabs.getTab(i*2+1).getTitle() + + " (" + label + ")"); + DoubleArrayPanel dap = new DoubleArrayPanel( label, null, this, this, TitleOrientation.LEFT); @@ -493,6 +549,7 @@ } layout.addMember(dap); + i++; } layout.setHeight(items.length * ROW_HEIGHT); @@ -650,10 +707,14 @@ } - /** Store the currently focussed DoubleArrayPanel. */ + /** Store the currently focussed DoubleArrayPanel and focus helper tab. */ @Override public void onFocus(FocusEvent event) { itemWithFocus = (DoubleArrayPanel) event.getForm(); + // Switch to respective tab. + // TODO which makes a focus loss + int inputIndex = doubleArrayPanels.indexOf(itemWithFocus); + tabs.selectTab(inputIndex*2 + (isWMode() ? 0 : 1)); } @@ -664,7 +725,7 @@ } - /** Get the WQD data from servide and stuck them up that tables. */ + /** Get the WQD data from service and stuck them up that tables. */ protected void fetchWQData() { Config config = Config.getInstance(); String locale = config.getLocale (); @@ -675,39 +736,49 @@ double[] mm = getMinMaxKM(data); String river = getRiverName(data); - wqInfoService.getWQInfo(locale, river, mm[0], mm[0], - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - GWT.log("Could not recieve wq informations."); - SC.warn(caught.getMessage()); - } + int i = 0; - @Override - public void onSuccess(WQInfoObject[] wqi) { - int num = wqi != null ? wqi.length :0; - GWT.log("Recieved " + num + " wq informations."); - - if (num == 0) { - return; + // Get Data for respective gauge. + for (double[] range : gaugeRanges){ + // Gauge ranges overlap, move start and end a bit closer to each other. + final double rDiff = (range[1] - range[0]) / 10d; + final int fi = i; + wqInfoService.getWQInfo(locale, river, range[0]+rDiff, range[1]-rDiff, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not recieve wq informations."); + SC.warn(caught.getMessage()); } - addWQInfo(wqi); + @Override + public void onSuccess(WQInfoObject[] wqi) { + int num = wqi != null ? wqi.length :0; + GWT.log("Received " + num + " wq informations (" + fi + "."); + + if (num == 0) { + return; + } + + addWQInfo(wqi, fi); + } } - } - ); + ); + i++; + } } - protected void addWQInfo (WQInfoObject[] wqi) { + /** Add Info to helper table for gauge at index gaugeIdx. */ + protected void addWQInfo (WQInfoObject[] wqi, int gaugeIdx) { for(WQInfoObject wi: wqi) { WQInfoRecord rec = new WQInfoRecord(wi); if (wi.getType().equals("W")) { - wTable.addData(rec); + wTables.get(gaugeIdx).addData(rec); } else { - qdTable.addData(rec); + qdTables.get(gaugeIdx).addData(rec); } } }