package com.vaadin.addon.timeline.gwt.client;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.addon.timeline.gwt.canvas.client.Canvas;
/**
* VTimelineBrowser
*
* @author Peter Lehto / IT Mill Oy Ltd
* @author John Ahlroos / IT Mill Oy Ltd
*/
public class VTimelineBrowser extends Widget implements VMouseMoveListener,
VMouseClickListener, VDataListener, VMouseScrollListener, VMouseOutListener {
private static final String CLASSNAME_CANVAS = VTimelineWidget.BROWSER_CLASSNAME
+ "-canvas";
private static final String CLASSNAME_SCROLLBAR = VTimelineWidget.BROWSER_CLASSNAME
+ "-scrollbar";
private static final String CLASSNAME_SCROLLBAR_LEFT = CLASSNAME_SCROLLBAR
+ "-left";
private static final String CLASSNAME_SCROLLBAR_RIGHT = CLASSNAME_SCROLLBAR
+ "-right";
private static final String CLASSNAME_FADE = CLASSNAME_SCROLLBAR + "-fade";
private static final String CLASSNAME_SCALE = VTimelineWidget.BROWSER_CLASSNAME
+ "-scale";
private static final String CLASSNAME_SCALELABEL = CLASSNAME_SCALE+"-label";
private static final String CLASSNAME_CURTAIN = VTimelineWidget.BROWSER_CLASSNAME+"-curtain";
private final Element browserRoot;
private final Canvas canvas;
private final Element scrollBar;
private final Element scrollLeft;
private final Element scrollRight;
private boolean mouseDown;
private final VTimelineWidget timelineWidget;
private boolean sizeAdjustLeft;
private boolean sizeAdjustRight;
private int dragStartX;
private final VTimelineBrowserScroller scroller = new VTimelineBrowserScroller();
private final VCanvasPlotter plotter;
private final Map<Integer, List<Float>> currentValues = new HashMap<Integer, List<Float>>();
private final Map<Integer, List<Float>> currentNormalizedValues = new HashMap<Integer, List<Float>>();
private final Map<Integer, List<Date>> currentDates = new HashMap<Integer, List<Date>>();
private final Map<Integer, Float> currentMax = new HashMap<Integer, Float>();
private final Map<Integer, Float> currentMin = new HashMap<Integer, Float>();
private final Map<Long, Integer> requestGraphMap = new HashMap<Long, Integer>();
private final Element leftFade;
private final Element rightFade;
private int graphDataRecievedCounter = 0;
private float currentTotalMin = 0f;
private float currentTotalMax = 0f;
private Date selectedStartDate = null;
private Date selectedEndDate = null;
private boolean enabled = true;
private final AbsolutePanel horizontalScalePanel;
private final HTML disabledCurtain;
public VTimelineBrowser(VTimelineWidget tw) {
timelineWidget = tw;
browserRoot = DOM.createDiv();
setElement(browserRoot);
setHeight("64px");
setStyleName("v-timeline-widget-browser");
canvas = new Canvas(300, 44);
canvas.setStyleName(CLASSNAME_CANVAS);
browserRoot.appendChild(canvas.getElement());
plotter = new VCanvasPlotter(canvas);
// Add the horizontal scale
horizontalScalePanel = new AbsolutePanel();
horizontalScalePanel.setStyleName(CLASSNAME_SCALE);
browserRoot.appendChild(horizontalScalePanel.getElement());
// Add fadouts
leftFade = DOM.createDiv();
leftFade.setClassName(CLASSNAME_FADE);
browserRoot.appendChild(leftFade);
rightFade = DOM.createDiv();
rightFade.setClassName(CLASSNAME_FADE);
browserRoot.appendChild(rightFade);
// Add the scrollbar
scrollBar = DOM.createDiv();
scrollBar.setClassName(CLASSNAME_SCROLLBAR);
scrollLeft = DOM.createDiv();
scrollLeft.setClassName(CLASSNAME_SCROLLBAR_LEFT);
scrollRight = DOM.createDiv();
scrollRight.setClassName(CLASSNAME_SCROLLBAR_RIGHT);
scrollBar.appendChild(scrollLeft);
scrollBar.appendChild(scrollRight);
browserRoot.appendChild(scrollBar);
browserRoot.appendChild(scroller.getElement());
// Create the disabled curtain
disabledCurtain = new HTML("");
disabledCurtain.setVisible(false);
disabledCurtain.setStyleName(CLASSNAME_CURTAIN);
disabledCurtain.setWidth("100%");
disabledCurtain.setHeight("100%");
horizontalScalePanel.add(disabledCurtain);
}
/**
* This should be called after the browser has been attached to the DOM
*/
@SuppressWarnings("deprecation")
public void init(){
int width = timelineWidget.getWidgetWidth();
if (width > 0) {
canvas.setWidth(width - 28 - 2);
DOM.setAttribute(browserRoot, "width", width + "px");
}
}
/**
* Initializes the canvas i.e. it will fetch the points for the whole
* timeline and render it to the canvas.
*/
public void redraw(){
if(timelineWidget.getStartDate() == null ||
timelineWidget.getEndDate() == null ){
return;
}
// The currently selected time
Long timeDiff = timelineWidget.getEndDate().getTime() - timelineWidget.getStartDate().getTime();
// Decrese the density if timespan is large
Long density = timeDiff / (120L*86400000L) +1L;
// Add requests for each graph
graphDataRecievedCounter = 0;
// Get the points
timelineWidget.getDateDataAll(this, timelineWidget.getStartDate(), timelineWidget.getEndDate(), density.intValue());
}
/*
* (non-Javadoc)
* @see com.vaadin.trends.ws.client.VMouseMoveListener#mouseMoved(com.google.gwt.user.client.Event)
*/
@Override
public void mouseMoved(Event mouseEvent) {
if (mouseDown) {
DOM.eventPreventDefault(mouseEvent);
int adjustment = mouseEvent.getClientX() - dragStartX;
// The area size is being adjusted
if (sizeAdjustLeft && scroller.getLeftPosition() + adjustment > 0) {
scroller.adjustLeftSideSize(adjustment);
} else if (sizeAdjustLeft) {
scroller.adjustLeftSideSize(-scroller.getLeftPosition());
} else if (sizeAdjustRight
&& scroller.getRightPosition() + adjustment < scrollBar
.getOffsetWidth() - 2 * 15) {
scroller.adjustRightSideSize(adjustment);
} else if (sizeAdjustRight) {
int diff = (scrollBar.getOffsetWidth() - 2 * 15)
- scroller.getRightPosition();
scroller.adjustRightSideSize(diff - 1);
} else {
int scrollAreaX = mouseEvent.getClientX() - dragStartX;
/*
* Calculate the right edge. Remember to add the left and right
* spacing 2*14px and the borders 2*1px to the calculation.
*/
int scrollAreaRight = scrollAreaX + scroller.getAreaWidth()
+ 14 + 2;
if (scrollAreaRight <= scrollBar.getOffsetWidth()) {
int offset = scroller.getMouseOffset(mouseEvent);
int leftPosition = mouseEvent.getClientX() - dragStartX;
if (offset != dragStartX) {
scroller.setLeftPosition(leftPosition);
if (leftPosition > 14) {
dragStartX = scroller.getMouseOffset(mouseEvent);
}
selectedStartDate = calculateStartPoint();
selectedEndDate = calculateEndPoint();
DeferredCommand.addCommand(new Command() {
@Override
public void execute() {
timelineWidget.setDisplayRange(
selectedStartDate, selectedEndDate,
false, false);
}
});
}
/*
* Else if the cursor is over the right edge make sure the
* browser is in its rightmost position.
*/
} else {
int width = scroller.getAreaWidth();
int leftPosition = scrollBar.getOffsetWidth() - width - 14;
scroller.setLeftPosition(leftPosition);
selectedStartDate = calculateStartPoint();
selectedEndDate = calculateEndPoint();
DeferredCommand.addCommand(new Command() {
@Override
public void execute() {
timelineWidget.setDisplayRange(selectedStartDate,
selectedEndDate, false, false);
}
});
}
}
DOM.setStyleAttribute(leftFade, "width", (scroller.getLeftPosition()+14) + "px");
DOM.setStyleAttribute(rightFade, "left", (scroller.getRightPosition()+14+2) + "px");
DOM.setStyleAttribute(rightFade, "width", (getOffsetWidth()-scroller.getRightPosition()-28) + "px");
}
}
/*
* (non-Javadoc)
* @see com.vaadin.trends.ws.client.VMouseClickListener#mouseDown(com.google.gwt.user.client.Event)
*/
@Override
public void mouseDown(Event mouseEvent) {
Element mouseOver = (Element) Element.as(mouseEvent.getEventTarget());
DOM.eventPreventDefault(mouseEvent);
DOM.setCapture(horizontalScalePanel.getElement());
if(!enabled && hasElement(mouseOver)){
DOM.eventPreventDefault(mouseEvent);
} else if (mouseOver == scrollLeft) {
DOM.eventPreventDefault(mouseEvent);
mouseDown = true;
sizeAdjustLeft = false;
sizeAdjustRight = false;
if(scroller.getLeftPosition() > 0){
scroller.move(-1);
timelineWidget.fireDateRangeChangedEvent();
}
} else if (mouseOver == scrollRight ) {
DOM.eventPreventDefault(mouseEvent);
mouseDown = true;
sizeAdjustLeft = false;
sizeAdjustRight = false;
if (scroller.getRightPosition() + 5 < canvas.getWidth()) {
scroller.move(1);
timelineWidget.fireDateRangeChangedEvent();
}
} else if ( scroller.isMouseOverScrollElement(mouseEvent) ||
scroller.isMouseOverScrollArea(mouseEvent)) {
DOM.eventPreventDefault(mouseEvent);
mouseDown = true;
sizeAdjustLeft = false;
sizeAdjustRight = false;
dragStartX = scroller.getMouseOffset(mouseEvent);
} else if (scroller.isMouseOverLeftSideSizeAdjuster(mouseEvent)) {
DOM.eventPreventDefault(mouseEvent);
mouseDown = true;
sizeAdjustRight = false;
sizeAdjustLeft = true;
dragStartX = mouseEvent.getClientX();
} else if (scroller.isMouseOverRightSideSizeAdjuster(mouseEvent)) {
DOM.eventPreventDefault(mouseEvent);
mouseDown = true;
sizeAdjustLeft = false;
sizeAdjustRight = true;
dragStartX = mouseEvent.getClientX();
} else if(mouseOver == horizontalScalePanel.getElement() ||
mouseOver == leftFade ||
mouseOver == rightFade){
DOM.eventPreventDefault(mouseEvent);
mouseDown = true;
sizeAdjustLeft = false;
sizeAdjustRight = false;
// Calculate the centering point
int center = mouseEvent.getClientX()-getAbsoluteLeft();
int area = scroller.getAreaWidth();
if(center-area/2 < 14) {
center = area/2;
}
if(center+area/2 > getOffsetWidth()-28) {
center = getOffsetWidth()-28-area/2;
}
// Center scoller and set fades
scroller.center(center);
DOM.setStyleAttribute(leftFade, "width", (scroller.getLeftPosition()+14) + "px");
DOM.setStyleAttribute(rightFade, "left", (scroller.getRightPosition()+14+2) + "px");
DOM.setStyleAttribute(rightFade, "width", (getOffsetWidth()-scroller.getRightPosition()-28) + "px");
dragStartX = scroller.getMouseOffset(mouseEvent);
timelineWidget.setDisplayRange(calculateStartPoint(), calculateEndPoint(), true);
}
}
/*
* (non-Javadoc)
* @see com.vaadin.trends.ws.client.VMouseClickListener#mouseUp(com.google.gwt.user.client.Event)
*/
@Override
public void mouseUp(Event mouseEvent) {
mouseDown = false;
Element mouseOver = (Element) Element.as(mouseEvent.getEventTarget());
DOM.eventPreventDefault(mouseEvent);
DOM.releaseCapture(horizontalScalePanel.getElement());
if(!enabled && hasElement(mouseOver)){
DOM.eventPreventDefault(mouseEvent);
} else if (sizeAdjustLeft || sizeAdjustRight) {
DOM.eventPreventDefault(mouseEvent);
scroller.lockSize();
selectedStartDate = calculateStartPoint();
selectedEndDate = calculateEndPoint();
timelineWidget.setDisplayRange(selectedStartDate, selectedEndDate,
true, true);
DOM.setStyleAttribute(leftFade, "width", (scroller.getLeftPosition()+14) + "px");
DOM.setStyleAttribute(rightFade, "left", (scroller.getRightPosition()+14+2) + "px");
DOM.setStyleAttribute(rightFade, "width", (getOffsetWidth()-scroller.getRightPosition()-28) + "px");
timelineWidget.fireDateRangeChangedEvent();
} else if (hasElement(mouseOver)) {
DOM.eventPreventDefault(mouseEvent);
selectedStartDate = calculateStartPoint();
selectedEndDate = calculateEndPoint();
timelineWidget.setDisplayRange(selectedStartDate, selectedEndDate,
true, true);
DOM.setStyleAttribute(leftFade, "width", (scroller.getLeftPosition()+14) + "px");
DOM.setStyleAttribute(rightFade, "left", (scroller.getRightPosition()+14+2) + "px");
DOM.setStyleAttribute(rightFade, "width", (getOffsetWidth()-scroller.getRightPosition()-28) + "px");
timelineWidget.fireDateRangeChangedEvent();
}
sizeAdjustLeft = false;
sizeAdjustRight = false;
}
/*
* (non-Javadoc)
* @see com.vaadin.trends.ws.client.VDataListener#dataRecieved(java.lang.Long, java.util.List, java.util.List, java.util.Set)
*/
@Override
public void dataRecieved(Long requestID, List<Float> values, List<Date> dates, Set<String> markers, Set<String> events) {
int graph = requestGraphMap.get(requestID);
currentValues.put(graph, values);
currentDates.put(graph, dates);
currentMin.put(graph, VTimelineWidget.getMinValue(values));
currentMax.put(graph, VTimelineWidget.getMaxValue(values));
if(currentMin.get(graph) < currentTotalMin) {
currentTotalMin = currentMin.get(graph);
}
if(currentMax.get(graph) > currentTotalMax) {
currentTotalMax = currentMax.get(graph);
}
currentNormalizedValues.put(graph, VTimelineWidget.normalizeValues(values, currentTotalMin));
if (graphDataRecievedCounter == timelineWidget.getNumGraphs() - 1) {
// All graph data is recieved, we can PLOT!
graphDataRecievedCounter = 0;
plotData();
} else {
graphDataRecievedCounter++;
}
}
/**
* Plots the horizontal scale
*/
@SuppressWarnings("deprecation")
private void plotHorizontalScale(float xUnit, Long timeDiff){
horizontalScalePanel.clear();
// Time is more than a year
if(timeDiff > VTimelineDisplay.YEAR){
// Get the next year from the current date
int currentYear = timelineWidget.getStartDate().getYear();
Date year = new Date(currentYear+1, 0, 1);
Long timeFromStart = year.getTime()
- timelineWidget.getStartDate().getTime();
float x = timeFromStart*xUnit;
canvas.setStrokeStyle("rgb(200,200,200)");
canvas.beginPath();
while (year.getYear() <= timelineWidget.getEndDate().getYear()) {
// Draw the year line
canvas.moveTo(x, 0);
canvas.lineTo(x, canvas.getHeight());
// Add a label
DateTimeFormat formatter = DateTimeFormat.getFormat("yyyy");
Label lbl = new Label(formatter.format(year));
lbl.setStyleName(CLASSNAME_SCALELABEL);
horizontalScalePanel.add(lbl);
horizontalScalePanel.setWidgetPosition(lbl, (int)x+14+5, canvas.getHeight()-lbl.getOffsetHeight()+4);
year = new Date(year.getYear()+1, 0, 1);
timeFromStart = year.getTime()
- timelineWidget.getStartDate().getTime();
x = timeFromStart*xUnit;
}
canvas.closePath();
canvas.stroke();
}
// Time is 6 months to a year
else if(timeDiff > 6*VTimelineDisplay.MONTH){
// TODO
}
// Time is 1 months to 6 months
else if(timeDiff > VTimelineDisplay.MONTH){
// TODO
}
// Time is 1 week to a month
else if(timeDiff > VTimelineDisplay.WEEK){
// TODO
}
// Time is 1 day to a week
else if(timeDiff > VTimelineDisplay.DAY){
// TODO
}
// Time is 12 hours to a day
else if(timeDiff > 12*VTimelineDisplay.HOUR){
// TODO
}
// Time is 1 hour to 12 hours
else if(timeDiff > VTimelineDisplay.HOUR){
// TODO
}
// Time is under an hour
else {
// TODO
}
}
/**
* Plots the recieved data on to the canvas
*/
private void plotData() {
Float canvasWidth = new Float(canvas.getWidth());
Float canvasHeight = new Float(canvas.getHeight());
// Clear old drawings
canvas.clear();
//Set the zero level
float valueDiff = Math.abs(currentTotalMax - currentTotalMin);
Long timeDiff = timelineWidget.getEndDate().getTime()
- timelineWidget.getStartDate().getTime();
float xUnit = canvasWidth / timeDiff.floatValue();
float yUnit = canvasHeight / valueDiff;
// Calculate zero level and draw it on to the canvas
float zero = canvasHeight.floatValue();
if (currentTotalMin < 0) {
zero -= (valueDiff / 2.0f) * yUnit;
}
canvas.setStrokeStyle("rgb(220,220,220)");
canvas.setLineWidth(1);
canvas.beginPath();
canvas.moveTo(0, zero);
canvas.lineTo(canvas.getWidth(), zero);
canvas.closePath();
canvas.stroke();
plotter.setZeroLevel(zero);
for(int g=0; g<timelineWidget.getNumGraphs(); g++){
if(!timelineWidget.graphIsVisible(g)) {
continue;
}
// Normalize values
List<Float> normalizedValues = currentNormalizedValues.get(g);
if(normalizedValues.size() == 0) {
continue;
}
// Set Fill color
List<Integer> fillcolors = timelineWidget.getBrowserFillColorMap().get(g);
double fillalpha = fillcolors.get(3) / 255.0;
plotter.setFillColor("rgba("+fillcolors.get(0)+","+fillcolors.get(1)+","+fillcolors.get(2)+","+fillalpha+")");
// Set color
List<Integer> colors = timelineWidget.getBrowserColorMap().get(g);
plotter.setColor("rgb("+colors.get(0)+","+colors.get(1)+","+colors.get(2)+")");
//Correct for the x timeshift to the left
Long timeFromStart = currentDates.get(g).get(0).getTime()
- timelineWidget.getStartDate().getTime(); float x = timeFromStart*xUnit; //*(-1f);
float y = canvas.getHeight() - normalizedValues.get(0) * yUnit;
if(currentMin.get(g) < 0) {
y -= normalizedValues.get(g) * yUnit;
}
List<Float> xCoordinates = new ArrayList<Float>();
List<Float> yCoordinates = new ArrayList<Float>();
xCoordinates.add(x);
yCoordinates.add(y);
for (int i = 1; i < normalizedValues.size(); i++) {
Float value = normalizedValues.get(i);
Date date = currentDates.get(g).get(i);
timeFromStart = date.getTime()
- timelineWidget.getStartDate().getTime();
float lastY = y;
float newY = canvasHeight - value * yUnit;
y = lastY+(newY-lastY)/3f;
x = timeFromStart*xUnit;
xCoordinates.add(x);
yCoordinates.add(y);
}
plotter.plotLineGraph(xCoordinates, yCoordinates, false, 1.0);
}
//Plot the horizontal scale
plotHorizontalScale(xUnit, timeDiff);
}
/**
* Set the selected range
* @param startDate
* The start date of the range
* @param endDate
* The end date of the range
*/
public void setRange(Date startDate, Date endDate){
Date start = timelineWidget.getStartDate();
Date end = timelineWidget.getEndDate();
if(startDate.before(start)) {
startDate = start;
}
if(endDate.after(end)) {
endDate = end;
}
selectedStartDate = startDate;
selectedEndDate = endDate;
Long timeDiff = end.getTime() - start.getTime();
Float timeUnit = (float)canvas.getOffsetWidth() / (float)timeDiff;
Long startTime = startDate.getTime() - start.getTime();
int startPixel = (int)(startTime*timeUnit)+14;
Long endTime = endDate.getTime() - start.getTime();
int endPixel = (int) (endTime * timeUnit) - 3;
if(startPixel < 14) {
startPixel = 14;
}
if (endPixel > getOffsetWidth() - 16) {
endPixel = getOffsetWidth() - 16;
}
scroller.setLeftPosition(startPixel);
scroller.setRightPosition(endPixel);
DOM.setStyleAttribute(leftFade, "width", startPixel + "px");
DOM.setStyleAttribute(rightFade, "left", (endPixel+14+2) + "px");
DOM.setStyleAttribute(rightFade, "width", (getOffsetWidth()-endPixel-28) + "px");
}
/**
* Converts the selectors start pixel position to a date
* @return
* The calculated date
*/
private Date calculateStartPoint() {
Date start = timelineWidget.getStartDate();
Date end = timelineWidget.getEndDate();
Float canvasWidth = new Float(canvas.getWidth());
Long timeDiff = end.getTime() - start.getTime();
Float timeUnit = timeDiff.floatValue() / canvasWidth;
int selectorLeftPixel = scroller.getLeftPosition();
Float time = selectorLeftPixel*timeUnit;
Date endDate = new Date(start.getTime()+time.longValue());
if(endDate.after(timelineWidget.getEndDate())) {
endDate = timelineWidget.getEndDate();
}
return endDate;
}
/**
* Converts the selectors end pixel position to a date
* @return
* The calculated date
*/
private Date calculateEndPoint() {
Date start = timelineWidget.getStartDate();
Date end = timelineWidget.getEndDate();
Float canvasWidth = new Float(canvas.getWidth());
Long timeDiff = end.getTime() - start.getTime();
Float timeUnit = timeDiff.floatValue() / canvasWidth;
int selectorRightPixel = scroller.getRightPosition() + 4;
Float time = selectorRightPixel*timeUnit;
Date startDate = new Date(start.getTime()+time.longValue());
if(startDate.before(timelineWidget.getStartDate())) {
startDate = timelineWidget.getStartDate();
}
return startDate;
}
/**
* Alias for calculateStartPoint
* @return
* The calculated date
*/
public Date getSelectedStartDate(){
return selectedStartDate;
}
/**
* Alias for calculateEndPoint
* @return
* The calculated date
*/
public Date getSelectedEndDate(){
return selectedEndDate;
}
/**
* Set the width in pixels of the canvas
* @param width
* The width in pixels
*/
public void setCanvasWidth(int width){
canvas.setWidth(width-28);
redraw();
}
/**
* Get the canvas width
* @return
* The widht in pixels
*/
public int getCanvasWidth(){
return canvas.getWidth();
}
/*
* (non-Javadoc)
* @see com.vaadin.trends.ws.client.VMouseScrollListener#scroll(com.google.gwt.user.client.Event)
*/
@Override
public void scroll(Event mouseEvent) {
Element mouseOver = (Element) Element.as(mouseEvent.getEventTarget());
if (hasElement(mouseOver)) {
DOM.eventPreventDefault(mouseEvent);
boolean up = DOM.eventGetMouseWheelVelocityY(mouseEvent) > 0;
// Only apply event to scroller
if (!scroller.isMouseOverScrollArea(mouseEvent)) {
return;
}
sizeAdjustLeft = true;
sizeAdjustRight = true;
if (up) {
if (scroller.getLeftPosition() >= 5) {
scroller.adjustLeftSideSize(-5);
}
if (scroller.getRightPosition() <= canvas.getWidth() - 10) {
scroller.adjustRightSideSize(10);
}
} else {
scroller.adjustLeftSideSize(5);
scroller.adjustRightSideSize(-10);
}
scroller.lockSize();
selectedStartDate = calculateStartPoint();
selectedEndDate = calculateEndPoint();
timelineWidget.setDisplayRange(selectedStartDate, selectedEndDate,
false);
DOM.setStyleAttribute(leftFade, "width", (scroller
.getLeftPosition() + 14)
+ "px");
DOM.setStyleAttribute(rightFade, "left", (scroller
.getRightPosition() + 14 + 2)
+ "px");
DOM.setStyleAttribute(rightFade, "width", (getOffsetWidth()
- scroller.getRightPosition() - 28)
+ "px");
sizeAdjustLeft = false;
sizeAdjustRight = false;
timelineWidget.fireDateRangeChangedEvent();
}
}
/*
* (non-Javadoc)
*
* @see
* com.vaadin.trends.ws.client.VDataListener#setCurrentRequestId(java.lang
* .Long, int)
*/
@Override
public void setCurrentRequestId(Long requestID, Integer graphIndex) {
requestGraphMap.put(requestID, graphIndex);
}
/*
* (non-Javadoc)
*
* @see
* com.vaadin.trends.ws.client.VDataListener#dataRecievedAll(java.util.List,
* java.util.Map, java.util.Map, java.util.Set, java.util.Set,
* java.util.Map, java.util.Map)
*/
@Override
public void dataRecievedAll(List<Long> requestID,
Map<Integer, List<Float>> values, Map<Integer, List<Date>> dates,
Set<String> markers, Set<String> events, Map<Integer, Float> min,
Map<Integer, Float> max, Float currentTotalMinimum,
Float currentTotalMaximum) {
currentTotalMin = currentTotalMinimum;
currentTotalMax = currentTotalMaximum;
for (int g = 0; g < timelineWidget.getNumGraphs(); g++) {
if (!timelineWidget.graphIsVisible(g)) {
continue;
}
List<Float> fvalues = values.get(g);
List<Date> dvalues = dates.get(g);
Float minimum = min.get(g);
Float maximum = max.get(g);
if (fvalues != null && dvalues != null && minimum != null
&& maximum != null) {
currentValues.put(g, fvalues);
currentDates.put(g, dvalues);
currentMin.put(g, minimum);
currentMax.put(g, maximum);
currentNormalizedValues.put(g, VTimelineWidget
.normalizeValues(fvalues, currentTotalMin));
}
}
plotData();
}
/*
* (non-Javadoc)
*
* @see
* com.vaadin.trends.ws.client.VMouseOutListener#mouseOut(com.google.gwt
* .user.client.Event)
*/
@Override
public void mouseOut(Event mouseEvent) {
Element mouseTarget = (Element) Element.as(mouseEvent
.getRelatedEventTarget());
DOM.eventPreventDefault(mouseEvent);
// Mouse went over an edge
if (!hasElement(mouseTarget)) {
// Dragged over
if (mouseDown) {
DOM.releaseCapture(horizontalScalePanel.getElement());
mouseDown = false;
}
}
}
/**
* Checks if element exists in the browser
*
* @param elem
* The element
* @return True if the element exists, else false
*/
public boolean hasElement(com.google.gwt.dom.client.Element elem) {
if (elem == getElement() || elem == browserRoot || elem == leftFade
|| elem == rightFade || elem == scrollBar || elem == scrollLeft
|| elem == scrollRight || elem == canvas.getElement()
|| elem == horizontalScalePanel.getElement()
|| scroller.hasElement(elem)
|| elem == disabledCurtain.getElement()) {
return true;
} else {
return false;
}
}
/**
* Enables the browser
*
* @param enabled
* Is the browser usable by the user
*/
public void setEnabled(boolean enabled) {
this.enabled = enabled;
disabledCurtain.setVisible(!enabled);
}
}