| /* |
| * Copyright 2010 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.sample.expenses.client; |
| |
| import com.google.gwt.dom.client.Style.Unit; |
| import com.google.gwt.layout.client.Layout; |
| import com.google.gwt.layout.client.Layout.Layer; |
| import com.google.gwt.user.client.ui.HasOneWidget; |
| import com.google.gwt.user.client.ui.HasWidgets; |
| import com.google.gwt.user.client.ui.IsWidget; |
| import com.google.gwt.user.client.ui.LayoutPanel; |
| import com.google.gwt.user.client.ui.ResizeComposite; |
| import com.google.gwt.user.client.ui.Widget; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| /** |
| * Shows one panel at a time, sliding them left or right based on the order they |
| * were added. A full fledged version might implement |
| * {@link com.google.gwt.user.client.ui.InsertPanel.ForIsWidget}. |
| * <p> |
| * Note that we implement HasWidgets so that SlidingPanel will work nicely in |
| * ui.xml files. |
| */ |
| public class SlidingPanel extends ResizeComposite implements HasWidgets, |
| HasOneWidget { |
| |
| private final List<Widget> widgets = new ArrayList<Widget>(); |
| private final LayoutPanel layoutPanel = new LayoutPanel(); |
| private int currentIndex = -1; |
| |
| public SlidingPanel() { |
| initWidget(layoutPanel); |
| } |
| |
| public void add(IsWidget w) { |
| add(asWidgetOrNull(w.asWidget())); |
| } |
| |
| public void add(Widget w) { |
| widgets.remove(w); |
| widgets.add(w); |
| |
| // Display the first widget added by default |
| if (currentIndex < 0) { |
| layoutPanel.add(w); |
| currentIndex = 0; |
| } |
| } |
| |
| public void clear() { |
| setWidget(null); |
| widgets.clear(); |
| } |
| |
| @Override |
| public Widget getWidget() { |
| return widgets.get(currentIndex); |
| } |
| |
| public Iterator<Widget> iterator() { |
| return Collections.unmodifiableList(widgets).iterator(); |
| } |
| |
| public boolean remove(Widget w) { |
| return widgets.remove(w); |
| } |
| |
| public void setWidget(IsWidget w) { |
| setWidget(asWidgetOrNull(w)); |
| } |
| |
| /** |
| * Set the widget to show, adding it to the end of our sliding set if we |
| * haven't seen it before. Nulls are ignored. |
| */ |
| @SuppressWarnings("deprecation") |
| // Conflict btw deprecated Composite#setWidget and HasOneWidget#setWidget |
| @Override |
| public void setWidget(Widget widget) { |
| if (widget == null) { |
| return; |
| } |
| |
| int newIndex = widgets.indexOf(widget); |
| |
| if (newIndex < 0) { |
| newIndex = widgets.size(); |
| add(widget); |
| } |
| |
| show(newIndex); |
| } |
| |
| private void show(int newIndex) { |
| if (newIndex == currentIndex) { |
| return; |
| } |
| |
| boolean fromLeft = newIndex < currentIndex; |
| currentIndex = newIndex; |
| |
| Widget widget = widgets.get(newIndex); |
| final Widget current = layoutPanel.getWidget(0); |
| |
| // Initialize the layout. |
| layoutPanel.add(widget); |
| layoutPanel.setWidgetLeftWidth(current, 0, Unit.PCT, 100, Unit.PCT); |
| if (fromLeft) { |
| layoutPanel.setWidgetLeftWidth(widget, -100, Unit.PCT, 100, Unit.PCT); |
| } else { |
| layoutPanel.setWidgetLeftWidth(widget, 100, Unit.PCT, 100, Unit.PCT); |
| } |
| layoutPanel.forceLayout(); |
| |
| // Slide into view. |
| if (fromLeft) { |
| layoutPanel.setWidgetLeftWidth(current, 100, Unit.PCT, 100, Unit.PCT); |
| } else { |
| layoutPanel.setWidgetLeftWidth(current, -100, Unit.PCT, 100, Unit.PCT); |
| } |
| layoutPanel.setWidgetLeftWidth(widget, 0, Unit.PCT, 100, Unit.PCT); |
| layoutPanel.animate(500, new Layout.AnimationCallback() { |
| public void onAnimationComplete() { |
| // Remove the old widget when the animation completes. |
| layoutPanel.remove(current); |
| } |
| |
| public void onLayout(Layer layer, double progress) { |
| } |
| }); |
| } |
| } |