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