Package com.vaadin.addon.timeline.gwt.client

Source Code of com.vaadin.addon.timeline.gwt.client.VTimelineBrowser

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);
    }
}
TOP

Related Classes of com.vaadin.addon.timeline.gwt.client.VTimelineBrowser

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.