/*
@VaadinAddonLicenseForJavaFiles@
*/
package com.spaceapplications.vaadin.addon.eventtimeline.gwt.client;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.Widget;
/**
* VEventChartBrowserScroller is the scroller widget in timeline browser.
*
* @author Peter Lehto / IT Mill Oy Ltd
* @author John Ahlroos / IT Mill Oy Ltd
*/
public class VEventTimelineBrowserScroller extends Widget {
private static final String CLASSNAME_SCROLLAREA_CONTAINER = VEventTimelineWidget.BROWSER_CLASSNAME + "-scrollarea";
private static final String CLASSNAME_SCROLLAREA_CONTENT = VEventTimelineWidget.BROWSER_CLASSNAME + "-scrollarea-content";
private static final String CLASSNAME_SCROLLAREA_BAR = CLASSNAME_SCROLLAREA_CONTAINER + "-bar";
private static final String CLASSNAME_SCROLLAREA_BAR_GRIP = CLASSNAME_SCROLLAREA_BAR + "-grip";
private static final String CLASSNAME_SCROLLAREA_BAR_LEFT = CLASSNAME_SCROLLAREA_BAR + "-left";
private static final String CLASSNAME_SCROLLAREA_BAR_RIGHT = CLASSNAME_SCROLLAREA_BAR + "-right";
private static final String CLASSNAME_SIZE_ADJUSTER = "v-size-adjuster";
private static final String CLASSNAME_SIZE_ADJUSTER_LEFT = CLASSNAME_SIZE_ADJUSTER + "-left";
private static final String CLASSNAME_SIZE_ADJUSTER_RIGHT = CLASSNAME_SIZE_ADJUSTER + "-right";
private final Element scrollAreaContainer;
private final Element scrollAreaContent;
private final Element scrollAreaBar;
private final Element scrollAreaBarGrip;
private final Element scrollAreaBarLeft;
private final Element scrollAreaBarRight;
private final Element scrollAreaLeftAdjuster;
private final Element scrollAreaRightAdjuster;
public VEventTimelineBrowserScroller() {
scrollAreaContainer = DOM.createDiv();
scrollAreaContainer.setClassName(CLASSNAME_SCROLLAREA_CONTAINER);
scrollAreaContent = DOM.createDiv();
scrollAreaContent.setClassName(CLASSNAME_SCROLLAREA_CONTENT);
scrollAreaBar = DOM.createDiv();
scrollAreaBar.setClassName(CLASSNAME_SCROLLAREA_BAR);
scrollAreaBarLeft = DOM.createDiv();
scrollAreaBarLeft.setClassName(CLASSNAME_SCROLLAREA_BAR_LEFT);
scrollAreaBar.appendChild(scrollAreaBarLeft);
scrollAreaBarRight = DOM.createDiv();
scrollAreaBarRight.setClassName(CLASSNAME_SCROLLAREA_BAR_RIGHT);
scrollAreaBar.appendChild(scrollAreaBarRight);
scrollAreaBarGrip = DOM.createDiv();
scrollAreaBarGrip.setClassName(CLASSNAME_SCROLLAREA_BAR_GRIP);
scrollAreaBar.appendChild(scrollAreaBarGrip);
scrollAreaContainer.appendChild(scrollAreaContent);
scrollAreaContainer.appendChild(scrollAreaBar);
scrollAreaLeftAdjuster = DOM.createDiv();
scrollAreaLeftAdjuster.setClassName(CLASSNAME_SIZE_ADJUSTER + " " + CLASSNAME_SIZE_ADJUSTER_LEFT);
scrollAreaRightAdjuster = DOM.createDiv();
scrollAreaRightAdjuster.setClassName(CLASSNAME_SIZE_ADJUSTER + " " + CLASSNAME_SIZE_ADJUSTER_RIGHT);
scrollAreaContent.appendChild(scrollAreaLeftAdjuster);
scrollAreaContent.appendChild(scrollAreaRightAdjuster);
setElement(scrollAreaContainer);
}
public int getLeftPosition() {
return getElement().getOffsetLeft() - 15;
}
public int getRightPosition() {
return getLeftPosition() + getWidth() - 1;
}
public void setLeftPosition(float pos) {
if (pos < 15) {
pos = 15;
}
DOM.setStyleAttribute(scrollAreaContainer, "left", pos + "px");
}
public void setRightPosition(float pos) {
float leftPos = getLeftPosition();
if (pos <= leftPos) {
float tmp = leftPos;
leftPos = pos;
pos = tmp;
}
int xDiff = Math.round(pos - leftPos);
setWidth(xDiff);
}
public void center(float pos) {
int width = getAreaWidth();
setLeftPosition(pos - (int) Math.floor(width / 2.0));
setWidth(width);
}
public int getWidth() {
return getOffsetWidth();
}
public int getAreaWidth() {
return Integer.parseInt(DOM.getStyleAttribute(scrollAreaContainer, "width").replace("px", ""));
}
/**
* Moves scroller given amount of pixels. If amount is positive, scroller is
* moved to right, if negative scroller is moved to left.
*
* @param amount
*/
public void move(int amount) {
int scrollerPos = scrollAreaContainer.getOffsetLeft();
scrollerPos += amount;
setLeftPosition(scrollerPos);
}
public void adjustLeftSideSize(int amount) {
if (amount < 0) {
DOM.setStyleAttribute(scrollAreaContent, "width",
(getWidth() + Math.abs(amount)) + "px");
} else {
DOM.setStyleAttribute(scrollAreaContent, "width",
(getWidth() - amount) + "px");
}
// Move scroll area content div to left to compensate the change in size
// to right. (add two additional pixels for borders).
DOM.setStyleAttribute(scrollAreaContent, "left", (amount - 1) + "px");
}
public void adjustRightSideSize(int amount) {
if (amount != 0) {
DOM.setStyleAttribute(scrollAreaContent, "width",
(getWidth() + amount) + "px");
}
}
public int getMouseOffset(Event event) {
return event.getClientX() - getElement().getOffsetLeft();
}
public boolean isMouseOverScrollElement(Event mouseEvent) {
Element mouseOver = (Element) Element.as(mouseEvent.getEventTarget());
return mouseOver == scrollAreaBar || mouseOver == scrollAreaBarGrip
|| mouseOver == scrollAreaBarLeft
|| mouseOver == scrollAreaBarRight;
}
public boolean isMouseOverScrollArea(Event mouseEvent) {
Element mouseOver = (Element) Element.as(mouseEvent.getEventTarget());
return mouseOver == scrollAreaContainer
|| mouseOver == scrollAreaContent;
}
public boolean isMouseOverLeftSideSizeAdjuster(Event mouseEvent) {
Element mouseOver = (Element) Element.as(mouseEvent.getEventTarget());
return mouseOver == scrollAreaLeftAdjuster;
}
public boolean isMouseOverRightSideSizeAdjuster(Event mouseEvent) {
Element mouseOver = (Element) Element.as(mouseEvent.getEventTarget());
return mouseOver == scrollAreaRightAdjuster;
}
public void setWidth(int width) {
DOM.setStyleAttribute(scrollAreaContainer, "width", (width) + "px");
DOM.setStyleAttribute(scrollAreaContent, "width", (width - 1) + "px");
}
public void lockSize() {
setWidth(scrollAreaContent.getOffsetWidth() - 1);
setLeftPosition(scrollAreaContainer.getOffsetLeft()
+ scrollAreaContent.getOffsetLeft());
DOM.setStyleAttribute(scrollAreaContent, "left", "0px");
}
public boolean hasElement(com.google.gwt.dom.client.Element elem) {
if (elem == getElement() || elem == scrollAreaBar
|| elem == scrollAreaBarGrip || elem == scrollAreaContainer
|| elem == scrollAreaContent || elem == scrollAreaLeftAdjuster
|| elem == scrollAreaRightAdjuster || elem == scrollAreaBarLeft
|| elem == scrollAreaBarRight) {
return true;
} else {
return false;
}
}
}