001    package org.gwtbootstrap3.client.ui;
002    
003    /*
004     * #%L
005     * GwtBootstrap3
006     * %%
007     * Copyright (C) 2013 - 2014 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.ui.base.HasFormValue;
024    import org.gwtbootstrap3.client.ui.base.HasId;
025    import org.gwtbootstrap3.client.ui.base.HasPull;
026    import org.gwtbootstrap3.client.ui.base.HasResponsiveness;
027    import org.gwtbootstrap3.client.ui.base.helper.StyleHelper;
028    import org.gwtbootstrap3.client.ui.base.mixin.EnabledMixin;
029    import org.gwtbootstrap3.client.ui.base.mixin.IdMixin;
030    import org.gwtbootstrap3.client.ui.base.mixin.PullMixin;
031    import org.gwtbootstrap3.client.ui.constants.DeviceSize;
032    import org.gwtbootstrap3.client.ui.constants.Pull;
033    import org.gwtbootstrap3.client.ui.gwt.Widget;
034    import org.gwtbootstrap3.client.ui.impl.SimpleRadioButtonImpl;
035    
036    import com.google.gwt.core.client.GWT;
037    import com.google.gwt.dom.client.Document;
038    import com.google.gwt.dom.client.Element;
039    import com.google.gwt.dom.client.InputElement;
040    import com.google.gwt.event.dom.client.ChangeEvent;
041    import com.google.gwt.event.dom.client.ChangeHandler;
042    import com.google.gwt.event.dom.client.HasChangeHandlers;
043    import com.google.gwt.event.shared.HandlerRegistration;
044    import com.google.gwt.uibinder.client.UiConstructor;
045    import com.google.gwt.user.client.ui.RootPanel;
046    
047    /**
048     * A simple radio button widget, with no label.
049     */
050    public class SimpleRadioButton extends com.google.gwt.user.client.ui.SimpleRadioButton implements HasResponsiveness,
051            HasId, HasPull, HasFormValue, HasChangeHandlers {
052    
053        private static final SimpleRadioButtonImpl impl = GWT.create(SimpleRadioButtonImpl.class);
054    
055        /**
056         * Creates a SimpleRadioButton widget that wraps an existing <input
057         * type='radio'> element.
058         * 
059         * This element must already be attached to the document. If the element is
060         * removed from the document, you must call
061         * {@link RootPanel#detachNow(Widget)}.
062         * 
063         * @param element
064         *            the element to be wrapped
065         */
066        public static SimpleRadioButton wrap(Element element) {
067            // Assert that the element is attached.
068            assert Document.get().getBody().isOrHasChild(element);
069    
070            SimpleRadioButton radioButton = new SimpleRadioButton(InputElement.as(element));
071    
072            // Mark it attached and remember it for cleanup.
073            radioButton.onAttach();
074            RootPanel.detachOnWindowClose(radioButton);
075    
076            return radioButton;
077        }
078    
079        private final IdMixin<SimpleRadioButton> idMixin = new IdMixin<SimpleRadioButton>(this);
080        private final PullMixin<SimpleRadioButton> pullMixin = new PullMixin<SimpleRadioButton>(this);
081        private final EnabledMixin<SimpleRadioButton> enabledMixin = new EnabledMixin<SimpleRadioButton>(this);
082    
083        /**
084         * Creates a new radio associated with a particular group name. All radio
085         * buttons associated with the same group name belong to a
086         * mutually-exclusive set.
087         * 
088         * Radio buttons are grouped by their name attribute, so changing their name
089         * using the setName() method will also change their associated group.
090         * 
091         * @param name
092         *            the group name with which to associate the radio button
093         */
094        @UiConstructor
095        public SimpleRadioButton(String name) {
096            this(Document.get().createRadioInputElement(name));
097        }
098    
099        /**
100         * This constructor may be used by subclasses to explicitly use an existing
101         * element. This element must be an &lt;input&gt; element whose type is
102         * 'radio'.
103         * 
104         * @param element
105         *            the element to be used
106         */
107        protected SimpleRadioButton(InputElement element) {
108            super(element);
109        }
110    
111        @Override
112        public HandlerRegistration addChangeHandler(ChangeHandler handler) {
113            return addDomHandler(handler, ChangeEvent.getType());
114        }
115    
116        @Override
117        public void setEnabled(boolean enabled) {
118            enabledMixin.setEnabled(enabled);
119        }
120    
121        @Override
122        public boolean isEnabled() {
123            return enabledMixin.isEnabled();
124        }
125    
126        /**
127         * {@inheritDoc}
128         */
129        @Override
130        public void setId(final String id) {
131            idMixin.setId(id);
132        }
133    
134        /**
135         * {@inheritDoc}
136         */
137        @Override
138        public String getId() {
139            return idMixin.getId();
140        }
141    
142        /**
143         * {@inheritDoc}
144         */
145        @Override
146        public void setVisibleOn(final DeviceSize deviceSize) {
147            StyleHelper.setVisibleOn(this, deviceSize);
148        }
149    
150        /**
151         * {@inheritDoc}
152         */
153        @Override
154        public void setHiddenOn(final DeviceSize deviceSize) {
155            StyleHelper.setHiddenOn(this, deviceSize);
156        }
157    
158        /**
159         * {@inheritDoc}
160         */
161        @Override
162        public void setPull(final Pull pull) {
163            pullMixin.setPull(pull);
164        }
165    
166        /**
167         * {@inheritDoc}
168         */
169        @Override
170        public Pull getPull() {
171            return pullMixin.getPull();
172        }
173    
174        @Override
175        protected void ensureDomEventHandlers() {
176            impl.ensureDomEventHandlers(this);
177        }
178    
179    }