blob: deaadaa50919b0ab4b5afb29b4da65741de9448e [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.user.client.ui;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CommonResources;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.resources.client.CssResource.ImportedWithPrefix;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
/**
* A horizontal scrollbar implemented using the browsers native scrollbar.
*/
public class NativeHorizontalScrollbar extends AbstractNativeScrollbar implements
HorizontalScrollbar {
interface NativeHorizontalScrollbarUiBinder extends UiBinder<Element, NativeHorizontalScrollbar> {
}
/**
* A ClientBundle of resources used by this widget.
*/
public interface Resources extends ClientBundle {
/**
* The styles used in this widget.
*/
@Source(Style.DEFAULT_CSS)
Style nativeHorizontalScrollbarStyle();
}
/**
* A variation of {@link Resources} that renders the scrollbar
* semi-transparent until it is hovered.
*/
public interface ResourcesTransparant extends Resources {
/**
* The styles used in this widget.
*/
@Source(StyleTransparant.DEFAULT_CSS)
Style nativeHorizontalScrollbarStyle();
}
/**
* Styles used by this widget.
*/
@ImportedWithPrefix("gwt-NativeHorizontalScrollbar")
public interface Style extends CssResource {
/**
* The path to the default CSS styles used by this resource.
*/
String DEFAULT_CSS = "com/google/gwt/user/client/ui/NativeHorizontalScrollbar.css";
/**
* Applied to the scrollbar.
*/
String nativeHorizontalScrollbar();
}
/**
* A variation of {@link Style} that renders the scrollbar semi-transparent
* until it is hovered.
*/
public interface StyleTransparant extends Style {
/**
* The path to the default CSS styles used by this resource.
*/
String DEFAULT_CSS = "com/google/gwt/user/client/ui/NativeHorizontalScrollbarTransparent.css";
}
private static Resources DEFAULT_RESOURCES;
private static NativeHorizontalScrollbarUiBinder uiBinder = GWT
.create(NativeHorizontalScrollbarUiBinder.class);
/**
* Get the default resources for this widget.
*/
private static Resources getDefaultResources() {
if (DEFAULT_RESOURCES == null) {
DEFAULT_RESOURCES = GWT.create(Resources.class);
}
return DEFAULT_RESOURCES;
}
/**
* The div inside the scrollable div that forces scrollbars to appear.
*/
@UiField
Element contentDiv;
/**
* The scrollable div used to create a scrollbar.
*/
@UiField
Element scrollable;
/**
* Construct a new {@link NativeHorizontalScrollbar}.
*/
public NativeHorizontalScrollbar() {
this(getDefaultResources());
}
/**
* Construct a new {@link NativeHorizontalScrollbar}.
*
* @param resources the resources used by this widget
*/
public NativeHorizontalScrollbar(Resources resources) {
setElement(uiBinder.createAndBindUi(this));
getElement().addClassName(CommonResources.getInlineBlockStyle());
setHeight(getNativeHeight() + "px");
// Apply the styles.
Style style = resources.nativeHorizontalScrollbarStyle();
style.ensureInjected();
getScrollableElement().addClassName(style.nativeHorizontalScrollbar());
// Initialize the implementation.
ScrollImpl.get().initialize(scrollable, contentDiv);
}
public int getHorizontalScrollPosition() {
return getScrollableElement().getScrollLeft();
}
public int getMaximumHorizontalScrollPosition() {
return ScrollImpl.get().getMaximumHorizontalScrollPosition(getScrollableElement());
}
public int getMinimumHorizontalScrollPosition() {
return ScrollImpl.get().getMinimumHorizontalScrollPosition(getScrollableElement());
}
/**
* Get the width in pixels of the scrollable content that the scrollbar
* controls.
*
* <p>
* This is not the same as the maximum scroll left position. The maximum
* scroll position equals the <code>scrollWidth - offsetWidth</code>;
*
* @return the scroll width
* @see #setScrollWidth(int)
*/
public int getScrollWidth() {
return contentDiv.getOffsetWidth();
}
public void setHorizontalScrollPosition(int position) {
getScrollableElement().setScrollLeft(position);
}
/**
* Set the width in pixels of the scrollable content that the scrollbar
* controls.
*
* <p>
* This is not the same as the maximum scroll left position. The maximum
* scroll position equals the <code>scrollWidth - offsetWidth</code>;
*
* @param width the size width pixels
*/
public void setScrollWidth(int width) {
contentDiv.getStyle().setWidth(width, Unit.PX);
}
/**
* Get the height of the scrollbar.
*
* @return the height of the scrollbar in pixels
*/
protected int getNativeHeight() {
return getNativeScrollbarHeight();
}
@Override
protected Element getScrollableElement() {
return scrollable;
}
}