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.HiddenEvent;
024    import org.gwtbootstrap3.client.shared.event.HiddenHandler;
025    import org.gwtbootstrap3.client.shared.event.HideEvent;
026    import org.gwtbootstrap3.client.shared.event.HideHandler;
027    import org.gwtbootstrap3.client.shared.event.ShowEvent;
028    import org.gwtbootstrap3.client.shared.event.ShowHandler;
029    import org.gwtbootstrap3.client.shared.event.ShownEvent;
030    import org.gwtbootstrap3.client.shared.event.ShownHandler;
031    import org.gwtbootstrap3.client.ui.constants.Styles;
032    import org.gwtbootstrap3.client.ui.html.Div;
033    
034    import com.google.gwt.event.shared.HandlerRegistration;
035    import com.google.gwt.user.client.Event;
036    
037    /**
038     * @author Grant Slender
039     */
040    public class Collapse extends Div {
041        private static final String TOGGLE = "toggle";
042        private static final String SHOW = "show";
043        private static final String HIDE = "hide";
044    
045        private boolean toggle = true;
046    
047        public Collapse() {
048            // Set the default styles
049            setStyleName(Styles.COLLAPSE);
050        }
051    
052        @Override
053        protected void onLoad() {
054            super.onLoad();
055    
056            // Bind jquery events
057            bindJavaScriptEvents(getElement());
058    
059            // Configure the collapse
060            if(toggle) {
061                addStyleName(Styles.IN);
062            }
063        }
064    
065        @Override
066        protected void onUnload() {
067            super.onUnload();
068    
069            // Unbind the events
070            unbindJavaScriptEvents(getElement());
071        }
072    
073        /**
074         * Sets the default state to show or hide. Show is true.
075         *
076         * @param toggle toggle the collapse
077         */
078        public void setToggle(final boolean toggle) {
079            this.toggle = toggle;
080        }
081    
082        /**
083         * Causes the collapse to show or hide
084         */
085        public void toggle() {
086            fireMethod(getElement(), TOGGLE);
087        }
088    
089        /**
090         * Causes the collapse to show
091         */
092        public void show() {
093            fireMethod(getElement(), SHOW);
094        }
095    
096        /**
097         * Causes the collapse to hide
098         */
099        public void hide() {
100            fireMethod(getElement(), HIDE);
101        }
102    
103        public boolean isShown() {
104            return this.getElement().hasClassName(Styles.IN);
105        }
106        
107        public boolean isHidden() {
108          return !isShown();
109        }
110        
111        public boolean isCollapsing() {
112            return this.getElement().hasClassName(Styles.COLLAPSING);
113        }
114        
115        public HandlerRegistration addShowHandler(final ShowHandler showHandler) {
116            return addHandler(showHandler, ShowEvent.getType());
117        }
118    
119        public HandlerRegistration addShownHandler(final ShownHandler shownHandler) {
120            return addHandler(shownHandler, ShownEvent.getType());
121        }
122    
123        public HandlerRegistration addHideHandler(final HideHandler hideHandler) {
124            return addHandler(hideHandler, HideEvent.getType());
125        }
126    
127        public HandlerRegistration addHiddenHandler(final HiddenHandler hiddenHandler) {
128            return addHandler(hiddenHandler, HiddenEvent.getType());
129        }
130    
131        /**
132         * Fired when the collapse is starting to show
133         */
134        private void onShow(final Event evt) {
135            fireEvent(new ShowEvent(evt));
136        }
137    
138        /**
139         * Fired when the collapse has shown
140         */
141        private void onShown(final Event evt) {
142            fireEvent(new ShownEvent(evt));
143        }
144    
145        /**
146         * Fired when the collapse is starting to hide
147         */
148        private void onHide(final Event evt) {
149            fireEvent(new HideEvent(evt));
150        }
151    
152        /**
153         * Fired when the collapse has hidden
154         */
155        private void onHidden(final Event evt) {
156            fireEvent(new HiddenEvent(evt));
157        }
158    
159        private native void bindJavaScriptEvents(final com.google.gwt.dom.client.Element e) /*-{
160            var target = this;
161            var $collapse = $wnd.jQuery(e);
162    
163            $collapse.on('show.bs.collapse', function (evt) {
164                target.@org.gwtbootstrap3.client.ui.Collapse::onShow(Lcom/google/gwt/user/client/Event;)(evt);
165            });
166    
167            $collapse.on('shown.bs.collapse', function (evt) {
168                target.@org.gwtbootstrap3.client.ui.Collapse::onShown(Lcom/google/gwt/user/client/Event;)(evt);
169            });
170    
171            $collapse.on('hide.bs.collapse', function (evt) {
172                target.@org.gwtbootstrap3.client.ui.Collapse::onHide(Lcom/google/gwt/user/client/Event;)(evt);
173            });
174    
175            $collapse.on('hidden.bs.collapse', function (evt) {
176                target.@org.gwtbootstrap3.client.ui.Collapse::onHidden(Lcom/google/gwt/user/client/Event;)(evt);
177            });
178        }-*/;
179    
180        private native void unbindJavaScriptEvents(final com.google.gwt.dom.client.Element e) /*-{
181            $wnd.jQuery(e).off('show.bs.collapse');
182            $wnd.jQuery(e).off('shown.bs.collapse');
183            $wnd.jQuery(e).off('hide.bs.collapse');
184            $wnd.jQuery(e).off('hidden.bs.collapse');
185        }-*/;
186    
187        private native void collapse(final com.google.gwt.dom.client.Element e, final boolean toggle) /*-{
188            $wnd.jQuery(e).collapse({
189                toggle: toggle
190            });
191        }-*/;
192    
193        private native void fireMethod(final com.google.gwt.dom.client.Element e, String method) /*-{
194            $wnd.jQuery(e).collapse(method);
195        }-*/;
196    
197        private native void fireMethod(final com.google.gwt.dom.client.Element e, int slideNumber) /*-{
198            $wnd.jQuery(e).collapse(slideNumber);
199        }-*/;
200    }