package com.eas.widgets.containers;
import com.eas.core.XElement;
import com.google.gwt.dom.client.Style;
import com.google.gwt.user.client.ui.IndexedPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
import com.eas.ui.HasScroll;
import com.eas.ui.HorizontalScrollFiller;
import com.eas.ui.Orientation;
import com.eas.ui.VerticalScrollFiller;
/**
*
* @author mg
*/
public class ScrollBoxPanel extends ScrollPanel implements HasScroll, HorizontalScrollFiller, VerticalScrollFiller, IndexedPanel {
public enum ScrollPolicy {
ALLWAYS,
NEVER,
AUTO;
}
protected ScrollPolicy horizontalScrollPolicy = ScrollPolicy.AUTO;
protected ScrollPolicy verticalScrollPolicy = ScrollPolicy.AUTO;
public ScrollBoxPanel() {
super();
getElement().<XElement>cast().addResizingTransitionEnd(this);
}
public ScrollBoxPanel(Widget child) {
super(child);
getElement().<XElement>cast().addResizingTransitionEnd(this);
}
public ScrollPolicy getHorizontalScrollPolicy() {
return horizontalScrollPolicy;
}
public void setHorizontalScrollPolicy(ScrollPolicy aValue) {
horizontalScrollPolicy = aValue;
if (isAttached()) {
applyHorizontalScrollPolicy();
}
}
public ScrollPolicy getVerticalScrollPolicy() {
return verticalScrollPolicy;
}
public void setVerticalScrollPolicy(ScrollPolicy aValue) {
verticalScrollPolicy = aValue;
if (isAttached()) {
applyVerticalScrollPolicy();
}
}
@Override
protected void onAttach() {
super.onAttach();
applyHorizontalScrollPolicy();
applyVerticalScrollPolicy();
}
private boolean isHorizontalScrollFiller(Widget aWidget){
return aWidget instanceof HorizontalScrollFiller ||
(aWidget instanceof BoxPanel && ((BoxPanel)aWidget).getOrientation() == Orientation.VERTICAL);
}
private boolean isVerticalScrollFiller(Widget aWidget){
return aWidget instanceof VerticalScrollFiller ||
(aWidget instanceof BoxPanel && ((BoxPanel)aWidget).getOrientation() == Orientation.HORIZONTAL);
}
public void ajustWidth(Widget aWidget, int aWidth) {
if(!isHorizontalScrollFiller(aWidget )){
aWidget.getElement().getStyle().setWidth(aWidth, Style.Unit.PX);
}
}
public void ajustHeight(Widget aWidget, int aHeight) {
if(!isVerticalScrollFiller(aWidget)){
aWidget.getElement().getStyle().setHeight(aHeight, Style.Unit.PX);
}
}
@Override
public void setWidget(Widget aWidget) {
if(isHorizontalScrollFiller(aWidget)){
aWidget.getElement().getStyle().setWidth(100, Style.Unit.PCT);
}
if(isVerticalScrollFiller(aWidget)){
aWidget.getElement().getStyle().setHeight(100, Style.Unit.PCT);
}
super.setWidget(aWidget);
}
private void applyVerticalScrollPolicy() {
Style.Overflow value = Style.Overflow.AUTO;
if (verticalScrollPolicy == ScrollPolicy.ALLWAYS) {
value = Style.Overflow.SCROLL;
} else if (verticalScrollPolicy == ScrollPolicy.NEVER) {
value = Style.Overflow.HIDDEN;
}
Widget scrolled = getWidget();
if(scrolled instanceof HasScroll){
value = Style.Overflow.HIDDEN;
}
getScrollableElement().getStyle().setOverflowY(value);
}
private void applyHorizontalScrollPolicy() {
Style.Overflow value = Style.Overflow.AUTO;
if (horizontalScrollPolicy == ScrollPolicy.ALLWAYS) {
value = Style.Overflow.SCROLL;
} else if (horizontalScrollPolicy == ScrollPolicy.NEVER) {
value = Style.Overflow.HIDDEN;
}
Widget scrolled = getWidget();
if(scrolled instanceof HasScroll){
value = Style.Overflow.HIDDEN;
}
getScrollableElement().getStyle().setOverflowX(value);
}
@Override
public Widget getWidget(int index) {
return index == 0 ? getWidget() : null;
}
@Override
public int getWidgetCount() {
return getWidget() == null ? 0 : 1;
}
@Override
public int getWidgetIndex(Widget child) {
return getWidget() == child ? 0 : -1;
}
@Override
public boolean remove(int index) {
boolean res = index == 0 && getWidget() != null ? true : false;
if(res){
setWidget(null);
}
return res;
}
}