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.base.helper.StyleHelper;
032    import org.gwtbootstrap3.client.ui.constants.Styles;
033    import org.gwtbootstrap3.client.ui.html.Div;
034    
035    import com.google.gwt.event.shared.HandlerRegistration;
036    import com.google.gwt.user.client.Event;
037    
038    /**
039     * @author Grant Slender
040     * @author Joshua Godi
041     */
042    public class PanelCollapse extends Div {
043    
044        public PanelCollapse() {
045            setStyleName(Styles.PANEL_COLLAPSE);
046            addStyleName(Styles.COLLAPSE);
047        }
048    
049        public void setIn(final boolean in) {
050            if (in) {
051                addStyleName(Styles.IN);
052            } else {
053                removeStyleName(Styles.IN);
054            }
055        }
056    
057        public boolean isIn() {
058            return StyleHelper.containsStyle(getStyleName(), Styles.IN);
059        }
060    
061        @Override
062        protected void onLoad() {
063            super.onLoad();
064    
065            // Bind jquery events
066            bindJavaScriptEvents(getElement());
067        }
068    
069        @Override
070        protected void onUnload() {
071            super.onUnload();
072    
073            // Unbind the events
074            unbindJavaScriptEvents(getElement());
075        }
076    
077        public HandlerRegistration addShowHandler(final ShowHandler showHandler) {
078            return addHandler(showHandler, ShowEvent.getType());
079        }
080    
081        public HandlerRegistration addShownHandler(final ShownHandler shownHandler) {
082            return addHandler(shownHandler, ShownEvent.getType());
083        }
084    
085        public HandlerRegistration addHideHandler(final HideHandler hideHandler) {
086            return addHandler(hideHandler, HideEvent.getType());
087        }
088    
089        public HandlerRegistration addHiddenHandler(final HiddenHandler hiddenHandler) {
090            return addHandler(hiddenHandler, HiddenEvent.getType());
091        }
092    
093        /**
094         * Fired when the collapse is starting to show
095         */
096        private void onShow(final Event evt) {
097            fireEvent(new ShowEvent(evt));
098        }
099    
100        /**
101         * Fired when the collapse has shown
102         */
103        private void onShown(final Event evt) {
104            fireEvent(new ShownEvent(evt));
105        }
106    
107        /**
108         * Fired when the collapse is starting to hide
109         */
110        private void onHide(final Event evt) {
111            fireEvent(new HideEvent(evt));
112        }
113    
114        /**
115         * Fired when the collapse has hidden
116         */
117        private void onHidden(final Event evt) {
118            fireEvent(new HiddenEvent(evt));
119        }
120    
121        private native void bindJavaScriptEvents(final com.google.gwt.dom.client.Element e) /*-{
122            var target = this;
123            var $collapse = $wnd.jQuery(e);
124    
125            $collapse.on('show.bs.collapse', function (evt) {
126                target.@org.gwtbootstrap3.client.ui.PanelCollapse::onShow(Lcom/google/gwt/user/client/Event;)(evt);
127            });
128    
129            $collapse.on('shown.bs.collapse', function (evt) {
130                target.@org.gwtbootstrap3.client.ui.PanelCollapse::onShown(Lcom/google/gwt/user/client/Event;)(evt);
131            });
132    
133            $collapse.on('hide.bs.collapse', function (evt) {
134                target.@org.gwtbootstrap3.client.ui.PanelCollapse::onHide(Lcom/google/gwt/user/client/Event;)(evt);
135            });
136    
137            $collapse.on('hidden.bs.collapse', function (evt) {
138                target.@org.gwtbootstrap3.client.ui.PanelCollapse::onHidden(Lcom/google/gwt/user/client/Event;)(evt);
139            });
140        }-*/;
141    
142        private native void unbindJavaScriptEvents(final com.google.gwt.dom.client.Element e) /*-{
143            $wnd.jQuery(e).off('show.bs.collapse');
144            $wnd.jQuery(e).off('shown.bs.collapse');
145            $wnd.jQuery(e).off('hide.bs.collapse');
146            $wnd.jQuery(e).off('hidden.bs.collapse');
147        }-*/;
148    }