Omaha #5483 - Fix layout of hydro Toggle Time Series dialog.

Change-Id: I1e3af9de34dc85c3671935787f25d8a9d84ec2d3

Former-commit-id: 0c3c30902be5dd0c3da093b87de97b0539e806ad
This commit is contained in:
David Gillingham 2016-05-06 16:32:29 -05:00
parent 884edbe13f
commit b151a86896
2 changed files with 214 additions and 182 deletions

View file

@ -42,6 +42,7 @@ import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
@ -142,6 +143,7 @@ import com.raytheon.viz.hydrocommon.util.DbUtils;
* 05 Sep 2013 #2332 lvenable Fixed memory leaks.
* 24 Jan 2013 15959 lbousaidi Swap the corner points of the bounding box when zooming.
* 22 Oct 2015 13736 xwei Fixed missing data after zoom, edit, & reset problem
* 06 May 2016 5483 dgilling Change parameter type for handleSelection.
* @author lvenable
* @version 1.0
*
@ -536,9 +538,9 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
if (td.isForecast()) {
String traceKey = td.getLid() + td.getPe() + td.getTs()
+ td.getDur() + td.getExtremum();
if (uniqueList.contains(traceKey))
if (uniqueList.contains(traceKey)) {
continue;
else {
} else {
uniqueList.add(traceKey);
}
@ -976,7 +978,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
GRAPHBORDER - fontHeight);
}
} else {
if (td.isTraceOn())
if (td.isTraceOn()) {
gc.drawString(dataString + " min="
+ twoDecimalFormat.format(min) + " "
+ graphFormat.format(dateMin) + " max="
@ -986,6 +988,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
+ (dataString.length()
* fontAveWidth * j),
GRAPHBORDER - fontHeight);
}
}
} else {
if (td.isTraceOn()) {
@ -997,7 +1000,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
index += (dataString.length() + 2)
* fontAveWidth;
} else
} else {
gc.drawString(dataString + " min="
+ twoDecimalFormat.format(min) + " "
+ graphFormat.format(dateMin) + " max="
@ -1007,6 +1010,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
+ (dataString.length()
* fontAveWidth * j),
GRAPHBORDER - fontHeight);
}
}
}
@ -1136,42 +1140,45 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
td = gd.getTraceData(i);
if (td != null && td.isTraceOn()) {
TimeSeriesPoint[] points = null;
TimeSeriesPoint[] pointsZoomed = null;
TimeSeriesPoint[] pointsZoomed = null;
if (zoomed) {
points = td.getTsData();
pointsZoomed = td.getZoomedTsData();
pointsZoomed = td.getZoomedTsData();
} else {
points = td.getTsData();
}
if ( points != null) {
List<TimeSeriesPoint> pointListZoomed = new ArrayList<TimeSeriesPoint>();
List<TimeSeriesPoint> pointList = new ArrayList<TimeSeriesPoint>();
if (points != null) {
List<TimeSeriesPoint> pointListZoomed = new ArrayList<TimeSeriesPoint>();
List<TimeSeriesPoint> pointList = new ArrayList<TimeSeriesPoint>();
/* Delete the specified point */
if ((deleteList.size() > 0) && (i == selectedTraceId)) {
for (int j = 0; j < points.length; j++) {
for (int j = 0; j < points.length; j++) {
if (!deleteList.contains(j)) {
pointList.add(points[j]);
}
}
td.setTsData(pointList.toArray(new TimeSeriesPoint[pointList.size()]));
if ( zoomed && pointsZoomed != null ) {
for (int j = 0; j < pointsZoomed.length; j++) {
if (!deleteList.contains(j)) {
pointListZoomed.add(pointsZoomed[j]);
}
pointList.add(points[j]);
}
td.setZoomedTsData(pointListZoomed.toArray(new TimeSeriesPoint[pointListZoomed.size()]));
}
td.setTsData(pointList
.toArray(new TimeSeriesPoint[pointList.size()]));
if (zoomed && pointsZoomed != null) {
for (int j = 0; j < pointsZoomed.length; j++) {
if (!deleteList.contains(j)) {
pointListZoomed.add(pointsZoomed[j]);
}
}
td.setZoomedTsData(pointListZoomed
.toArray(new TimeSeriesPoint[pointListZoomed
.size()]));
}
deleteIndex = HydroConstants.MISSING_VALUE;
deleteList.clear();
deleteList.clear();
}
/* Set missing */
@ -1181,8 +1188,9 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
pointList.add(points[j]);
}
}
td.setTsData(pointList.toArray(new TimeSeriesPoint[pointList.size()]));
td.setTsData(pointList
.toArray(new TimeSeriesPoint[pointList.size()]));
setMissingIndex = HydroConstants.MISSING_VALUE;
setMissingList.clear();
}
@ -1219,40 +1227,39 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
.toArray(new TimeSeriesPoint[pointList.size()]));
insertedPoint = null;
}
TimeSeriesPoint[] pointArray = null;
if (zoomed) {
pointArray = td.getZoomedTsData();
}else{
pointArray = td.getTsData();
pointArray = td.getZoomedTsData();
} else {
pointArray = td.getTsData();
}
if (pointArray != null) {
for (int j = 0; j < pointArray.length; j++) {
if (pointArray[j] != null) {
if (pointArray[j].getY() < yLowest) {
yLowest = pointArray[j].getY();
minDate = pointArray[j].getX();
for (int j = 0; j < pointArray.length; j++) {
if (pointArray[j] != null) {
if (pointArray[j].getY() < yLowest) {
yLowest = pointArray[j].getY();
minDate = pointArray[j].getX();
// Set the lowest ymin of the graph
if (gd.getYmin() > yLowest) {
gd.setYmin(yLowest);
}
}
if (pointArray[j].getY() > yHighest) {
yHighest = pointArray[j].getY();
maxDate = pointArray[j].getX();
// Set the highest ymax of the graph
if (gd.getYmax() < yHighest) {
gd.setYmax(yHighest);
}
// Set the lowest ymin of the graph
if (gd.getYmin() > yLowest) {
gd.setYmin(yLowest);
}
}
} // end for
}
if (pointArray[j].getY() > yHighest) {
yHighest = pointArray[j].getY();
maxDate = pointArray[j].getX();
// Set the highest ymax of the graph
if (gd.getYmax() < yHighest) {
gd.setYmax(yHighest);
}
}
}
} // end for
}
}
}
} // end for
@ -1265,12 +1272,12 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
}
Date xMin = pixel2x(gd, rubberBandX1 - GRAPHBORDER_LEFT);
Date xMax = pixel2x(gd, rubberBandX2 - GRAPHBORDER_LEFT);
//Swap the corner points of the bounding box when zooming
// Swap the corner points of the bounding box when zooming
if (xMin.after(xMax)) {
Date xtmp;
xtmp= xMin;
xMin=xMax;
xMax=xtmp;
Date xtmp;
xtmp = xMin;
xMin = xMax;
xMax = xtmp;
}
gd.setXMin(xMin);
gd.setXMax(xMax);
@ -1286,12 +1293,12 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
if (ymin < gd.getYmin()) {
ymin = gd.getYmin();
}
//Swap the corner points of the bounding box when zooming
// Swap the corner points of the bounding box when zooming
if (ymin > ymax) {
double ytmp;
ytmp= ymin;
ymin=ymax;
ymax=ytmp;
double ytmp;
ytmp = ymin;
ymin = ymax;
ymax = ytmp;
}
gd.setYmin(ymin);
gd.setYmax(ymax);
@ -1489,7 +1496,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
statusHandler.handle(Priority.ERROR, "Error retrieving graph data",
e);
}
td.setTsData(points.toArray(new TimeSeriesPoint[points.size()]));
td.setPreviousTsData(pointsbak.toArray(new TimeSeriesPoint[pointsbak
@ -1540,8 +1547,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
ttsd.open();
}
protected void handleSelection(Event event) {
Button item = (Button) event.widget;
protected void handleSelection(SelectionEvent e) {
Button item = (Button) e.widget;
TraceData trace = (TraceData) item.getData();
trace.setTraceOn(!trace.isTraceOn());
if (trace.isTraceOn()) {
@ -1876,10 +1883,11 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
double u = ((x - x1) * p2X + (y - y1) * p2Y)
/ something;
if (u > 1)
if (u > 1) {
u = 1;
else if (u < 0)
} else if (u < 0) {
u = 0;
}
double xx = x1 + u * p2X;
double yy = y1 + u * p2Y;
@ -1898,8 +1906,9 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
}
}
if (distance < 20) // if less than 20 pixels away
if (distance < 20) {
return choosingTrace;
}
return -999;
}
@ -1955,12 +1964,13 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
}
}
} else if (traceSelected && dialog.isDelete()) {
if (precipPE) {
if (precipPE) {
List<Region> ppl = precipPointList.get(selectedTraceId);
for (int i = 0; i < ppl.size(); i++) {
if (ppl.get(i).contains(e.x, e.y)) {
deleteIndex = i;
deleteList.add( getZoomOffset(selectedTraceId) + deleteIndex );
deleteList.add(getZoomOffset(selectedTraceId)
+ deleteIndex);
}
}
} else {
@ -1968,20 +1978,21 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
for (int i = 0; i < prl.size(); i++) {
if (prl.get(i).contains(e.x, e.y)) {
deleteIndex = i;
deleteList.add( getZoomOffset(selectedTraceId) + deleteIndex );
deleteList.add(getZoomOffset(selectedTraceId)
+ deleteIndex);
break;
}
}
}
TraceData td = graphData.getTraceData(selectedTraceId);
TimeSeriesPoint[] points = null;
if (zoomed) {
points = td.getZoomedTsData();
} else {
points = td.getTsData();
}
TimeSeriesPoint[] points = null;
if (zoomed) {
points = td.getZoomedTsData();
} else {
points = td.getTsData();
}
for (int j = 0; j < points.length; j++) {
if (j == deleteIndex) {
@ -1998,7 +2009,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
for (int i = 0; i < ppl.size(); i++) {
if (ppl.get(i).contains(e.x, e.y)) {
setMissingIndex = i;
setMissingList.add(getZoomOffset(selectedTraceId) + setMissingIndex);
setMissingList.add(getZoomOffset(selectedTraceId)
+ setMissingIndex);
break;
}
}
@ -2007,7 +2019,8 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
for (int i = 0; i < prl.size(); i++) {
if (prl.get(i).contains(e.x, e.y)) {
setMissingIndex = i;
setMissingList.add(getZoomOffset(selectedTraceId) + setMissingIndex);
setMissingList.add(getZoomOffset(selectedTraceId)
+ setMissingIndex);
break;
}
}
@ -2059,7 +2072,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
* Mouse Event
*/
private void handleMouseUpEvent(MouseEvent e) {
mouseDown = false;
mouseDown = false;
/* Null the point string or the last location stays displayed */
pointString = null;
@ -2080,7 +2093,7 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
dataPts[selectionIndex * 2 + 1] = e.y;
graphData.getTraceData(selectedTraceId).setLineData(dataPts);
setEditData(e.y);
pointSelected = false;
getAgain = false;
@ -2123,38 +2136,39 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
}
dialog.addDeletePoint(data);
deleteList.add( getZoomOffset(selectedTraceId) + i );
deleteList.add(getZoomOffset(selectedTraceId) + i);
}
}
deleteRect = null;
} else if (traceSelected && dialog.isSetMissing() && (setMissingRect != null) ) {
} else if (traceSelected && dialog.isSetMissing()
&& (setMissingRect != null)) {
TraceData td = graphData.getTraces().get(selectedTraceId);
TimeSeriesPoint[] pointArray = null;
TimeSeriesPoint[] pointArray = null;
if (!zoomed) {
pointArray = td.getTsData();
} else {
pointArray = td.getZoomedTsData();
}
for (int i = 0; i < pointArray.length; i++) {
if (setMissingRect.contains(pointArray[i].getPixelX(),
pointArray[i].getPixelY())) {
ForecastData data = createPoint(td, pointArray[i]);
data.setValue(new Double(HydroConstants.MISSING_VALUE));
dialog.addEditPoint(data);
setMissingList.add( getZoomOffset(selectedTraceId) + i );
setMissingList.add(getZoomOffset(selectedTraceId) + i);
}
}
setMissingRect = null;
}
/* Get the data traces */
traceArray = graphData.getTraces();
// Set true so new regions will be created
createRegions = true;
@ -2170,13 +2184,13 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
setZoomed(false);
dialog.setZoomAction(false);
traceArray = graphData.getTraces();
// Set true so new regions will be created
createRegions = true;
setCursor(null);
redraw();
return;
}
@ -2202,18 +2216,18 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
graphData.getTraceData(selectedTraceId).setTsData(pa);
}
// set the value back into the list
pa[selectionIndex] = tsp;
ForecastData data = createPoint(td, tsp);
dialog.addEditPoint(data);
if (zoomed) {
graphData.getTraceData(selectedTraceId).setZoomedTsData(pa);
graphData.getTraceData(selectedTraceId).setZoomedTsData(pa);
} else {
graphData.getTraceData(selectedTraceId).setTsData(pa);
graphData.getTraceData(selectedTraceId).setTsData(pa);
}
}
}
/**
* Make the regions around the lines and points
@ -2267,8 +2281,9 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
ia[5] = y2 + (y2 - y1) / 5;
} else if (y2 < y1) {
ia[5] = y2 - (y1 - y2) / 5;
} else
} else {
ia[5] = y2 + 10;
}
ia[6] = x1;
ia[7] = y1 + dy;
@ -2853,14 +2868,14 @@ public class TimeSeriesDisplayCanvas extends TimeSeriesGraphCanvas implements
public void setZoomed(boolean zoomed) {
this.zoomed = zoomed;
}
private int getZoomOffset(int pSelectedTraceId) {
if (zoomed){
TraceData td = graphData.getTraceData(pSelectedTraceId);
if (zoomed) {
TraceData td = graphData.getTraceData(pSelectedTraceId);
return td.getZoomIndexOffset();
}
return 0;
}
}

View file

@ -19,99 +19,116 @@
**/
package com.raytheon.viz.hydro.timeseries;
import java.util.List;
import java.util.Collection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import com.raytheon.viz.hydro.CaveHydroSWTDialog;
import com.raytheon.viz.hydro.timeseries.util.TraceData;
import com.raytheon.viz.ui.dialogs.ICloseCallback;
/**
* This class is the popup menu when right/middle click on the Time Series Display.
* There should be only one toggle time series dialog at a time.
* This class is the popup menu when right/middle click on the Time Series
* Display. There should be only one toggle time series dialog at a time.
*
* <pre>
*
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ---------- ------- ----------- --------------------------
* 1/16/2013 15695 wkwock Initial
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 16, 2013 15695 wkwock Initial creation
* May 06, 2016 #5483 dgilling Code-cleanup.
*
* </pre>
*
* @author wkwock
* @version 1.0
*
*/
public class ToggleTimeSeriesDlg extends CaveHydroSWTDialog {
private static final String DLG_TITLE="Toggle Time Series";
private List<TraceData> traceList=null;
private TimeSeriesDisplayCanvas tsDisCanvas=null;
private static ToggleTimeSeriesDlg oneTTSD=null; //singleton
public static ToggleTimeSeriesDlg getInstance(Shell parentShell,List<TraceData> traceLst, TimeSeriesDisplayCanvas tsdc) {
if (oneTTSD!=null){
oneTTSD.close();
oneTTSD.disposed();
}
oneTTSD = new ToggleTimeSeriesDlg(parentShell, traceLst, tsdc) ;
return oneTTSD;
}
private ToggleTimeSeriesDlg(Shell parentShell,List<TraceData> traceLst, TimeSeriesDisplayCanvas tsdc) {
super(parentShell);
this.setText(DLG_TITLE);
this.traceList=traceLst;
this.tsDisCanvas=tsdc;
}
@Override
protected void initializeComponents(Shell shell) {
Composite beginningTimeComp = new Composite(shell, SWT.NONE);
RowLayout topLabelCompRl = new RowLayout();
beginningTimeComp.setLayout(topLabelCompRl);
private static final String DLG_TITLE = "Toggle Time Series";
Button[] checkBtns = new Button[traceList.size()];
for (int i = 0; i < traceList.size(); i++) {
TraceData td = traceList.get(i);
checkBtns[i] = new Button(shell, SWT.CHECK);
String s = null;
if (td.isForecast()) {
s = this.tsDisCanvas.getFcstPEDTSE(td);
} else {
s = this.tsDisCanvas.getPEDTSE(td);
}
if (td.getLineData()!=null && td.getLineData().length>0) {
if (td.isTraceOn())
checkBtns[i].setSelection(true);
else
checkBtns[i].setSelection(false);
} else {
checkBtns[i].setSelection(false);
s = s.concat("" + "NO DATA");
}
private static ToggleTimeSeriesDlg dialogSingleton = null;
checkBtns[i].setText(s);
checkBtns[i].setLocation(50*i,250);
checkBtns[i].pack();
checkBtns[i].setData(td);
checkBtns[i].addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
handleSelection(event);
}
});
}
// We need to make the menu visible
beginningTimeComp.setVisible(true);
}
private final Collection<TraceData> traceList;
private void handleSelection(Event event) {
this.tsDisCanvas.handleSelection(event);
}
private final TimeSeriesDisplayCanvas tsDisCanvas;
public static ToggleTimeSeriesDlg getInstance(Shell parentShell,
Collection<TraceData> traceLst, TimeSeriesDisplayCanvas tsdc) {
if (dialogSingleton != null) {
dialogSingleton.close();
dialogSingleton.setCloseCallback(new ICloseCallback() {
@Override
public void dialogClosed(Object returnValue) {
dialogSingleton = null;
}
});
}
dialogSingleton = new ToggleTimeSeriesDlg(parentShell, traceLst, tsdc);
return dialogSingleton;
}
/**
* @param parentShell
* @param traceLst
* @param tsdc
*/
private ToggleTimeSeriesDlg(Shell parentShell,
Collection<TraceData> traceLst, TimeSeriesDisplayCanvas tsdc) {
super(parentShell, SWT.DIALOG_TRIM | SWT.RESIZE, CAVE.NONE);
setText(DLG_TITLE);
this.traceList = traceLst;
this.tsDisCanvas = tsdc;
}
@Override
protected void initializeComponents(Shell shell) {
Composite beginningTimeComp = new Composite(shell, SWT.NONE);
beginningTimeComp.setLayout(new GridLayout(1, false));
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.minimumWidth = getDisplay().getDPI().x * 3;
beginningTimeComp.setLayoutData(gd);
for (TraceData td : traceList) {
Button checkBox = new Button(beginningTimeComp, SWT.CHECK);
checkBox.setData(td);
StringBuilder sb = new StringBuilder();
if (td.isForecast()) {
sb.append(tsDisCanvas.getFcstPEDTSE(td));
} else {
sb.append(tsDisCanvas.getPEDTSE(td));
}
if ((td.getLineData() != null) && (td.getLineData().length > 0)) {
checkBox.setSelection(td.isTraceOn());
} else {
checkBox.setSelection(false);
sb.append("NO DATA");
}
checkBox.setText(sb.toString());
checkBox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleSelection(e);
}
});
}
}
private void handleSelection(SelectionEvent e) {
this.tsDisCanvas.handleSelection(e);
}
}