/* * Copyright (c) 2010 Zhihua (Dennis) Jiang * * 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.gwtmobile.ui.client.widgets; import java.beans.Beans; import java.util.ArrayList; import java.util.Iterator; import com.google.gwt.event.logical.shared.HasValueChangeHandlers; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.Widget; import com.gwtmobile.ui.client.CSS.StyleNames.Primary; import com.gwtmobile.ui.client.event.DragController; import com.gwtmobile.ui.client.event.SwipeEvent; import com.gwtmobile.ui.client.event.SwipeEventsHandler; import com.gwtmobile.ui.client.page.Transition; public class SlidePanel extends PanelBase implements SwipeEventsHandler, HasValueChangeHandlers<Boolean> { protected int _count = 0; private int _currentSlideIndex = 0; protected SlideProvider _slideProvider = null; protected ArrayList<Widget> _slides = new ArrayList<Widget>(); protected boolean _rotate = false; private int _selectedSlideIndex = 0; //used for design time slide selection. HasWidgetsImpl _hasWidgetsImpl; public SlidePanel() { setStyleName(Primary.SlidePanel); _hasWidgetsImpl = new HasWidgetsImpl(); } // expose parent HasWidgets logic for transition private class HasWidgetsImpl implements HasWidgets { @Override public void add(Widget w) { SlidePanel.super.add(w); } @Override public void clear() { SlidePanel.super.clear(); } @Override public Iterator<Widget> iterator() { return SlidePanel.super.iterator(); } @Override public boolean remove(Widget w) { return SlidePanel.super.remove(w); } } @Override protected String getDesignTimeMessage() { return "Add Slide widgets to the panel. Use the 'selectedSlideIndex' property to switch slide at design time."; } public void setSlideCount(int count) { this._count = count; } public int getSlideCount() { return _count > 0 ? _count : _slides.size(); } public void setSlideProvider(SlideProvider provider) { _slideProvider = provider; } public SlideProvider getSlideProvider() { return _slideProvider; } @Override public void onInitialLoad() { super.onInitialLoad(); // Use currentSlide as design time slide selector. if (Beans.isDesignTime()) { _currentSlideIndex = _selectedSlideIndex; } Slide slide = getSlide(_currentSlideIndex); if (slide != null) { super.add(slide); } } public Slide getSlide(int index) { Slide slide = null; if (_slideProvider != null) { slide = _slideProvider.loadSlide(index); } if (slide == null && index < _slides.size() ) { slide = (Slide) _slides.get(index); } return slide; } @Override public void onLoad() { super.onLoad(); DragController.get().addSwipeEventsHandler(this); } @Override protected void onUnload() { DragController.get().removeSwipeEventHandler(this); super.onUnload(); } @Override public void onSwipeHorizontal(SwipeEvent e) { if (e.getSpeed() < 0) { //swipe to next next(); } else { //swipe to previous previous(); } } @Override public void onSwipeVertical(SwipeEvent e) { } public void next() { if (_currentSlideIndex >= getSlideCount() - 1) { if (!_rotate) { return; } else { _currentSlideIndex = -1; } } moveToSlide(_currentSlideIndex + 1); } public void previous() { if (_currentSlideIndex <= 0) { if (!_rotate) { return; } else { _currentSlideIndex = getSlideCount(); } } moveToSlide(_currentSlideIndex - 1); } protected void moveToSlide(int slide) { boolean reverse = _currentSlideIndex > slide; _currentSlideIndex = slide; Slide to = getSlide(slide); Slide from = (Slide) super.getWidget(0); Transition transition = Transition.SLIDE; ValueChangeEvent.fire(this, false); transition.start(from, to, _hasWidgetsImpl, reverse); } public void goTo(int to) { if (to > 0 && to < getSlideCount()) { moveToSlide(to); } } @Override public void add(Widget w) { if (w instanceof Slide) { _slides.add(w); } else if (isDesignTimeEmptyLabel(w)) { super.add(w); } else { assert (w instanceof Slide) : "Can only add Slide widgets to SlidePanel."; } } public void setRotate(boolean rotate) { this._rotate = rotate; } public boolean isRotate() { return _rotate; } public void setCurrentSlideIndex(int currentSlideIndex) { this._currentSlideIndex = currentSlideIndex; } public int getCurrentSlideIndex() { return _currentSlideIndex; } public void setSelectedSlideIndex(int selectedSlideIndex) { this._selectedSlideIndex = selectedSlideIndex; } public int getSelectedSlideIndex() { return _selectedSlideIndex; } /********************* interface SlideProvider *******************/ public interface SlideProvider { Slide loadSlide(int index); } @Override public HandlerRegistration addValueChangeHandler( ValueChangeHandler<Boolean> handler) { return this.addHandler(handler, ValueChangeEvent.getType()); } }