001    package org.gwtbootstrap3.client.ui;
002    
003    /*
004     * #%L
005     * GwtBootstrap3
006     * %%
007     * Copyright (C) 2013 GwtBootstrap3
008     * %%
009     * Licensed under the Apache License, Version 2.0 (the "License");
010     * you may not use this file except in compliance with the License.
011     * You may obtain a copy of the License at
012     * 
013     *      http://www.apache.org/licenses/LICENSE-2.0
014     * 
015     * Unless required by applicable law or agreed to in writing, software
016     * distributed under the License is distributed on an "AS IS" BASIS,
017     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018     * See the License for the specific language governing permissions and
019     * limitations under the License.
020     * #L%
021     */
022    
023    import org.gwtbootstrap3.client.shared.event.CarouselSlidEvent;
024    import org.gwtbootstrap3.client.shared.event.CarouselSlidHandler;
025    import org.gwtbootstrap3.client.shared.event.CarouselSlideEvent;
026    import org.gwtbootstrap3.client.shared.event.CarouselSlideHandler;
027    import org.gwtbootstrap3.client.ui.constants.Attributes;
028    import org.gwtbootstrap3.client.ui.constants.Styles;
029    import org.gwtbootstrap3.client.ui.html.Div;
030    
031    import com.google.gwt.event.shared.HandlerRegistration;
032    import com.google.gwt.user.client.Event;
033    
034    /**
035     * @author Joshua Godi
036     */
037    public class Carousel extends Div {
038        public static final String HOVER = "hover";
039        public static final String CAROUSEL = "carousel";
040        public static final String CYCLE = "cycle";
041        public static final String PAUSE = "pause";
042        public static final String PREV = "prev";
043        public static final String NEXT = "next";
044    
045        // Bootstrap default values: http://getbootstrap.com/javascript/#carousel
046        private int interval = 5000;
047        private String pause = HOVER;
048        private boolean wrap = true;
049    
050        public Carousel() {
051            // Set the default styles
052            setStyleName(Styles.CAROUSEL);
053            addStyleName(Styles.SLIDE);
054    
055            // Set the default attribute
056            getElement().setAttribute(Attributes.DATA_RIDE, CAROUSEL);
057        }
058    
059        @Override
060        protected void onLoad() {
061            super.onLoad();
062    
063            // Bind jquery events
064            bindJavaScriptEvents(getElement());
065    
066            // Configure the carousel
067            carousel(getElement(), interval, pause, wrap);
068        }
069    
070        @Override
071        protected void onUnload() {
072            super.onUnload();
073    
074            // Unbind events
075            unbindJavaScriptEvents(getElement());
076        }
077    
078        public void setInterval(final int interval) {
079            this.interval = interval;
080        }
081    
082        public void setPause(final String pause) {
083            this.pause = pause;
084        }
085    
086        public void setWrap(final boolean wrap) {
087            this.wrap = wrap;
088        }
089    
090        /**
091         * Causes the carousel to cycle
092         */
093        public void cycleCarousel() {
094            fireMethod(getElement(), CYCLE);
095        }
096    
097        /**
098         * Causes the carousel to pause movement
099         */
100        public void pauseCarousel() {
101            fireMethod(getElement(), PAUSE);
102        }
103    
104        /**
105         * Causes the carousel to jump to that slide
106         */
107        public void jumpToSlide(final int slideNumber) {
108            fireMethod(getElement(), slideNumber);
109        }
110    
111        /**
112         * Causes the carousel to go back
113         */
114        public void goToPrev() {
115            fireMethod(getElement(), PREV);
116        }
117    
118        /**
119         * Causes the carousel to go to the next slide
120         */
121        public void goToNext() {
122            fireMethod(getElement(), NEXT);
123        }
124    
125        public HandlerRegistration addSlideHandler(final CarouselSlideHandler carouselSlideHandler) {
126            return addHandler(carouselSlideHandler, CarouselSlideEvent.getType());
127        }
128    
129        public HandlerRegistration addSlidHandler(final CarouselSlidHandler slidHandler) {
130            return addHandler(slidHandler, CarouselSlidEvent.getType());
131        }
132    
133        /**
134         * Fired when the carousel is starting to change slides
135         *
136         * @param evt event
137         */
138        private void onSlide(final Event evt) {
139            fireEvent(new CarouselSlideEvent(this, evt));
140        }
141    
142        /**
143         * Fired when the carousel is finished changing slides
144         *
145         * @param evt event
146         */
147        private void onSlid(final Event evt) {
148            fireEvent(new CarouselSlidEvent(this, evt));
149        }
150    
151        private native void bindJavaScriptEvents(final com.google.gwt.dom.client.Element e) /*-{
152            var target = this;
153            var $carousel = $wnd.jQuery(e);
154    
155            $carousel.on('slide.bs.carousel', function (evt) {
156                target.@org.gwtbootstrap3.client.ui.Carousel::onSlide(Lcom/google/gwt/user/client/Event;)(evt);
157            });
158    
159            $carousel.on('slid.bs.carousel', function (evt) {
160                target.@org.gwtbootstrap3.client.ui.Carousel::onSlid(Lcom/google/gwt/user/client/Event;)(evt);
161            });
162        }-*/;
163    
164        private native void unbindJavaScriptEvents(final com.google.gwt.dom.client.Element e) /*-{
165            $wnd.jQuery(e).off('slide.bs.carousel');
166            $wnd.jQuery(e).off('slid.bs.carousel');
167        }-*/;
168    
169        private native void carousel(final com.google.gwt.dom.client.Element e, final int interval, final String pause,
170                                     final boolean wrap) /*-{
171            $wnd.jQuery(e).carousel({
172                interval: interval,
173                pause: pause,
174                wrap: wrap
175            });
176        }-*/;
177    
178        private native void fireMethod(final com.google.gwt.dom.client.Element e, String method) /*-{
179            $wnd.jQuery(e).carousel(method);
180        }-*/;
181    
182        private native void fireMethod(final com.google.gwt.dom.client.Element e, int slideNumber) /*-{
183            $wnd.jQuery(e).carousel(slideNumber);
184        }-*/;
185    }