package org.terasology.rendering.gui.framework;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.terasology.rendering.gui.components.UIScrollBar;
import javax.vecmath.Vector2f;
public class UIScrollableDisplayContainer extends UIDisplayContainer {
/*
* ScrollBars
*/
protected UIScrollBar _scrollBarVertical = null;
protected UIScrollBar _scrollBarHorizontal = null;
private float _contentHeight = 1.0f;
private float _contentWidth = 1.0f;
private float _scrollShiftVertical = 0.0f;
private float _scrollShiftHorizontal = 0.0f;
private float _oldVertivalValue = 0.0f;
private float _oldHorizontalValue = 0.0f;
private Vector2f _containerPosVertical = null;
private Vector2f _containerPosHorizontal = null;
public UIScrollableDisplayContainer() {
super();
_scrollBarVertical = new UIScrollBar(getSize(), UIScrollBar.ScrollType.vertical);
_scrollBarHorizontal = new UIScrollBar(getSize(), UIScrollBar.ScrollType.horizontal);
_scrollBarVertical.setVisible(true);
_scrollBarHorizontal.setVisible(true);
_scrollBarVertical.setCroped(false);
_scrollBarHorizontal.setCroped(false);
addDisplayElement(_scrollBarVertical);
addDisplayElement(_scrollBarHorizontal);
_scrollBarVertical.addScrollListener(new IScrollListener() {
public void scrolled(UIDisplayElement element) {
float shift = (_scrollBarVertical.getValue() - _oldVertivalValue);
_scrollShiftVertical += shift;
for (UIDisplayElement displayElement : getDisplayElements()) {
if (!displayElement.isFixed()) {
displayElement.getPosition().y -= shift;
}
}
_oldVertivalValue = _scrollBarVertical.getValue();
}
});
_scrollBarHorizontal.addScrollListener(new IScrollListener() {
public void scrolled(UIDisplayElement element) {
float shift = (_scrollBarHorizontal.getValue() - _oldHorizontalValue);
_scrollShiftHorizontal += shift;
for (UIDisplayElement displayElement : getDisplayElements()) {
if (!displayElement.isFixed()) {
displayElement.getPosition().x -= shift;
}
}
_oldHorizontalValue = _scrollBarHorizontal.getValue();
}
});
}
public void setScrollBarsPosition(Vector2f position, Vector2f size) {
_containerPosVertical = new Vector2f(position.x + size.x - 15f, position.y);
_scrollBarVertical.setPosition(_containerPosVertical);
_scrollBarVertical.setMaxMin(0.0f, getSize().y - 15f);
_containerPosHorizontal = new Vector2f(position.x, position.y + size.y - 15f);
_scrollBarHorizontal.setPosition(_containerPosHorizontal);
_scrollBarHorizontal.setMaxMin(0.0f, getSize().x - 15f);
}
public void render() {
super.render();
}
public void update() {
Vector2f mousePos = new Vector2f(Mouse.getX(), Display.getHeight() - Mouse.getY());
if (intersects(mousePos)) {
_scrollBarVertical.setWheelled(true);
} else {
_scrollBarVertical.setWheelled(false);
}
boolean verticalScrollIsScrolled = _scrollBarVertical.isScrolled();
boolean horizontalScrollIsScrolled = _scrollBarHorizontal.isScrolled();
float checkConfusionVertical = 0.0f;
float checkConfusionHorizontal = 0.0f;
if (!verticalScrollIsScrolled) {
_contentHeight = 0.0f;
}
if (!horizontalScrollIsScrolled) {
_contentWidth = 0.0f;
}
for (UIDisplayElement displayElement : getDisplayElements()) {
if (!displayElement.isFixed()) {
if (!verticalScrollIsScrolled) {
if (_contentHeight <= (displayElement.getPosition().y + _scrollShiftVertical + displayElement.getSize().y)) {
_contentHeight = displayElement.getPosition().y + displayElement.getSize().y + _scrollShiftVertical;
}
if (!_scrollBarVertical.isVisible() && displayElement.getPosition().y < checkConfusionVertical) {
checkConfusionVertical = displayElement.getPosition().y;
}
}
if (!horizontalScrollIsScrolled) {
if (_contentWidth <= (displayElement.getPosition().x + _scrollShiftHorizontal + displayElement.getSize().x)) {
_contentWidth = displayElement.getPosition().x + displayElement.getSize().x + _scrollShiftHorizontal;
}
if (!_scrollBarHorizontal.isVisible() && displayElement.getPosition().x < checkConfusionHorizontal) {
checkConfusionHorizontal = displayElement.getPosition().x;
}
}
}
}
if (_contentHeight <= getSize().y && _scrollBarVertical.isVisible()) {
_scrollBarVertical.setVisible(false);
} else if (_contentHeight > getSize().y && !_scrollBarVertical.isVisible()) {
_scrollBarVertical.setPosition(_containerPosVertical);
_scrollBarVertical.setVisible(true);
}
if (_contentWidth <= getSize().x && _scrollBarHorizontal.isVisible()) {
_scrollBarHorizontal.setVisible(false);
} else if (_contentWidth > getSize().x && !_scrollBarHorizontal.isVisible()) {
_scrollBarHorizontal.setPosition(_containerPosHorizontal);
_scrollBarHorizontal.setVisible(true);
}
if (checkConfusionVertical < 0.0f) {
for (UIDisplayElement displayElement : getDisplayElements()) {
if (!displayElement.isFixed()) {
displayElement.getPosition().y += (-1) * checkConfusionVertical;
}
}
}
if (checkConfusionHorizontal < 0.0f) {
for (UIDisplayElement displayElement : getDisplayElements()) {
if (!displayElement.isFixed()) {
displayElement.getPosition().x += (-1) * checkConfusionHorizontal;
}
}
}
_scrollBarVertical.setStep(_contentHeight, getSize().y - 15f);
_scrollBarHorizontal.setStep(_contentWidth, getSize().x - 15f);
super.update();
}
}