| /* |
| * 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; |
| } |
| } |