org.workcraft.gwt.slidingscale.client.SlidingScale.java Source code

Java tutorial

Introduction

Here is the source code for org.workcraft.gwt.slidingscale.client.SlidingScale.java

Source

/*
This file is part of Intake24.
    
 Crown copyright, 2012, 2013, 2014.
    
This software is licensed under the Open Government Licence 3.0:
    
http://www.nationalarchives.gov.uk/doc/open-government-licence/
*/

package org.workcraft.gwt.slidingscale.client;

import org.workcraft.gwt.shared.client.Function1;
import org.workcraft.gwt.slidingscale.shared.SlidingScaleDef;

import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Overflow;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.kiouri.sliderbar.client.event.BarValueChangedEvent;
import com.kiouri.sliderbar.client.event.BarValueChangedHandler;

public class SlidingScale extends Composite {
    public final SlidingScaleSlider sliderBar;
    public final Image image;
    public final FlowPanel overlayDiv;
    public final Label label;

    private final double limit;

    public double getValue() {
        return ((1000 - sliderBar.getValue()) / 1000.0) * limit;
    }

    public void setValue(double value) {
        if (value > limit)
            value = limit;
        if (value < 0.0)
            value = 0.0;

        double a;

        if (limit == 0.0)
            a = 0;
        else
            a = value / limit;

        int b = (int) (a * 1000.0);

        sliderBar.setValue(1000 - b);
    }

    public SlidingScale(final SlidingScaleDef definition, double limit, double initialLevel,
            final Function1<Double, String> labelfunc) {
        if (limit > 1.0)
            limit = 1.0;
        if (limit < 0.0)
            limit = 0.0;
        this.limit = limit;

        HorizontalPanel p = new HorizontalPanel();
        p.getElement().getStyle().setBackgroundColor("#eeeeee");

        FlowPanel imageDiv = new FlowPanel();
        Style s = imageDiv.getElement().getStyle();
        s.setPosition(Position.RELATIVE);

        overlayDiv = new FlowPanel();
        overlayDiv.getElement().setId("intake24-sliding-scale-overlay");

        final Style overlayStyle = overlayDiv.getElement().getStyle();

        overlayStyle.setPosition(Position.ABSOLUTE);
        overlayStyle.setOverflow(Overflow.HIDDEN);
        overlayStyle.setWidth(definition.imageWidth, Unit.PX);
        overlayStyle.setHeight(definition.imageHeight, Unit.PX);
        overlayStyle.setTop(0, Unit.PX);

        Image overlayImage = new Image(definition.overlayUrl);

        final Style overlayImageStyle = overlayImage.getElement().getStyle();
        overlayImageStyle.setPosition(Position.ABSOLUTE);

        label = new Label();
        label.addStyleName("intake24-as-served-image-label");

        overlayDiv.add(overlayImage);

        image = new Image(definition.baseImageUrl);
        image.getElement().setId("intake24-sliding-scale-image");
        imageDiv.add(image);
        imageDiv.add(overlayDiv);
        imageDiv.add(label);

        final int scaleHeight = (int) ((definition.fullLevel - definition.emptyLevel) * limit);
        final int limitOffset = (int) ((1.0 - limit) * (definition.fullLevel - definition.emptyLevel));
        sliderBar = new SlidingScaleSlider(scaleHeight + "px");
        sliderBar.getElement().setId("intake24-sliding-scale-slider");
        sliderBar.getElement().getStyle()
                .setMarginTop(definition.imageHeight - (definition.fullLevel - limitOffset), Unit.PX);
        sliderBar.addBarValueChangedHandler(new BarValueChangedHandler() {
            @Override
            public void onBarValueChanged(BarValueChangedEvent event) {
                double v = event.getValue() / 1000.0;
                long offset = Math.round(v * scaleHeight) + definition.imageHeight - definition.fullLevel
                        + limitOffset;
                overlayStyle.setTop(offset, Unit.PX);
                overlayStyle.setHeight(definition.imageHeight - offset, Unit.PX);
                overlayImageStyle.setTop(-offset, Unit.PX);
                label.setText(labelfunc.apply(getValue()));
            }
        });

        setValue(initialLevel);

        p.add(imageDiv);
        p.add(sliderBar);
        initWidget(p);

        /*      imageDiv = new FlowPanel();
            
              imageDiv.getElement().getStyle().setPosition(Position.RELATIVE);
              imageDiv.getElement().setTabIndex(1);
              imageDiv.getElement().setTitle("Guide image: bananas");
            
              final Image baseImage = new Image(definition.baseImageUrl);
              imageDiv.add(baseImage);
            
              mouseMoveHandler = new MouseMoveHandler() {
                 @Override
                 public void onMouseMove(MouseMoveEvent event) {
        int mouseX = event.getRelativeX(baseImage.getElement());
        int mouseY = event.getRelativeY(baseImage.getElement());
            
        int mouseOverArea = -1;
            
        for (int i = 0; i < definition.areas.length; i++) {
           if (definition.areas[i].shape.isInside(new Point(mouseX, mouseY))) {
              mouseOverArea = i;
              break;
           }
        }
            
        if (mouseOverArea != activeArea) {
           if (hasFocus && mouseOverArea == -1) {
              setActiveArea(lastActiveArea);
           } else
              setActiveArea(mouseOverArea);
        }
                 }
              };
                  
              clickHandler = new ClickHandler() {
                 @Override
                 public void onClick(ClickEvent event) {
        handler.handleResult(definition.areas[activeArea].id);
                 }
              };
            
              baseImage.addMouseMoveHandler(mouseMoveHandler);
            
              addDomHandler(new KeyDownHandler() {
                 @Override
                 public void onKeyDown(KeyDownEvent event) {
        // System.out.println (event.getCharCode());
            
        if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
           handler.handleResult(activeArea);
        }
            
        if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_LEFT) {
           prev();
           event.preventDefault();
        }
        if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_RIGHT) {
           next();
           event.preventDefault();
        }
        if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_UP) {
           next();
           event.preventDefault();
        }
        if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_DOWN) {
           prev();
           event.preventDefault();
        }
                 }
              }, KeyDownEvent.getType());
            
              addDomHandler(new FocusHandler() {
                 @Override
                 public void onFocus(FocusEvent event) {
        hasFocus = true;
        if (activeArea == -1)
           setActiveArea(0);
                 }
              }, FocusEvent.getType());
            
              addDomHandler(new BlurHandler() {
                 @Override
                 public void onBlur(BlurEvent event) {
        hasFocus = false;
        setActiveArea(-1);
                 }
              }, BlurEvent.getType());
            
              initWidget(imageDiv);
                  
              prefetchImages();*/
    }

}