blob: e4743b1d97f4407dd3958ed6ab225cfecf1241bd [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 vertical scrollbar implemented using the browsers native scrollbar.
*/
public class NativeVerticalScrollbar extends AbstractNativeScrollbar implements VerticalScrollbar {
interface NativeVerticalScrollbarUiBinder extends UiBinder<Element, NativeVerticalScrollbar> {
}
/**
* A ClientBundle of resources used by this widget.
*/
public interface Resources extends ClientBundle {
/**
* The styles used in this widget.
*/
@Source(Style.DEFAULT_CSS)
Style nativeVerticalScrollbarStyle();
}
/**
* 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 nativeVerticalScrollbarStyle();
}
/**
* Styles used by this widget.
*/
@ImportedWithPrefix("gwt-NativeVerticalScrollbar")
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/NativeVerticalScrollbar.css";
/**
* Applied to the scrollbar.
*/
String nativeVerticalScrollbar();
}
/**
* 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/NativeVerticalScrollbarTransparent.css";
}
private static Resources DEFAULT_RESOURCES;
private static NativeVerticalScrollbarUiBinder uiBinder = GWT
.create(NativeVerticalScrollbarUiBinder.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 NativeVerticalScrollbar}.
*/
public NativeVerticalScrollbar() {
this(getDefaultResources());
}
/**
* Construct a new {@link NativeVerticalScrollbar}.
*
* @param resources the resources used by this widget
*/
public NativeVerticalScrollbar(Resources resources) {
setElement(uiBinder.createAndBindUi(this));
getElement().addClassName(CommonResources.getInlineBlockStyle());
setWidth(getNativeWidth() + "px");
// Apply the styles.
Style style = resources.nativeVerticalScrollbarStyle();
style.ensureInjected();
getScrollableElement().addClassName(style.nativeVerticalScrollbar());
// Initialize the implementation.
ScrollImpl.get().initialize(scrollable, contentDiv);
}
public int getMaximumVerticalScrollPosition() {
return getScrollableElement().getScrollHeight() - getElement().getClientHeight();
}
public int getMinimumVerticalScrollPosition() {
return 0;
}
/**
* Get the height in pixels of the scrollable content that the scrollbar
* controls.
*
* <p>
* This is not the same as the maximum scroll top position. The maximum scroll
* position equals the <code>scrollHeight- offsetHeight</code>;
*
* @return the scroll height
* @see #setScrollHeight(int)
*/
public int getScrollHeight() {
return contentDiv.getOffsetHeight();
}
public int getVerticalScrollPosition() {
return getScrollableElement().getScrollTop();
}
/**
* Set the height in pixels of the scrollable content that the scrollbar
* controls.
*
* <p>
* This is not the same as the maximum scroll top position. The maximum scroll
* position equals the <code>scrollHeight- offsetHeight</code>;
*
* @param height the size height pixels
*/
public void setScrollHeight(int height) {
contentDiv.getStyle().setHeight(height, Unit.PX);
}
public void setVerticalScrollPosition(int position) {
getScrollableElement().setScrollTop(position);
}
/**
* Get the width of the scrollbar.
*
* @return the width of the scrollbar in pixels
*/
protected int getNativeWidth() {
return getNativeScrollbarWidth();
}
@Override
protected Element getScrollableElement() {
return scrollable;
}
}