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.ui.base.ComplexWidget;
024    import org.gwtbootstrap3.client.ui.base.HasDataToggle;
025    import org.gwtbootstrap3.client.ui.base.HasHref;
026    import org.gwtbootstrap3.client.ui.base.HasTarget;
027    import org.gwtbootstrap3.client.ui.base.HasTargetHistoryToken;
028    import org.gwtbootstrap3.client.ui.base.mixin.AttributeMixin;
029    import org.gwtbootstrap3.client.ui.base.mixin.DataToggleMixin;
030    import org.gwtbootstrap3.client.ui.base.mixin.FocusableMixin;
031    import org.gwtbootstrap3.client.ui.constants.Attributes;
032    import org.gwtbootstrap3.client.ui.constants.Toggle;
033    
034    import com.google.gwt.dom.client.AnchorElement;
035    import com.google.gwt.dom.client.Document;
036    import com.google.gwt.event.dom.client.ClickEvent;
037    import com.google.gwt.event.dom.client.ClickHandler;
038    import com.google.gwt.event.dom.client.DoubleClickEvent;
039    import com.google.gwt.event.dom.client.DoubleClickHandler;
040    import com.google.gwt.event.dom.client.HasClickHandlers;
041    import com.google.gwt.event.dom.client.HasDoubleClickHandlers;
042    import com.google.gwt.event.shared.HandlerRegistration;
043    import com.google.gwt.user.client.History;
044    import com.google.gwt.user.client.ui.Focusable;
045    
046    /**
047     * Widget representing the Bootstrap Thumbnail as a clickable image
048     * <p/>
049     * <a href="http://getbootstrap.com/components/#thumbnails">Bootstrap Documentation</a>
050     * <p/>
051     * <h3>UiBinder example</h3>
052     * <p/>
053     * <pre>
054     * {@code
055     * <b:ThumbnailLink>
056     *    Image
057     * </b:ThumbnailLink>
058     * }
059     * </pre>
060     *
061     * @author Joshua Godi
062     */
063    public class ThumbnailLink extends ComplexWidget implements HasClickHandlers, HasDoubleClickHandlers, HasHref,
064            HasDataToggle, HasTargetHistoryToken, Focusable, HasTarget {
065    
066        private final DataToggleMixin<ThumbnailLink> toggleMixin = new DataToggleMixin<ThumbnailLink>(this);
067        private final AttributeMixin<ThumbnailLink> attributeMixin = new AttributeMixin<ThumbnailLink>(this);
068        private final FocusableMixin<ThumbnailLink> focusableMixin;
069        private String targetHistoryToken;
070    
071        /**
072         * Creates the default ThumbnailLink with the specified HREF
073         *
074         * @param href String href to use
075         */
076        public ThumbnailLink(final String href) {
077            setElement(Document.get().createAnchorElement());
078            setHref(href);
079            focusableMixin = new FocusableMixin<ThumbnailLink>(this);
080        }
081    
082        /**
083         * Creates the default ThumbnailLink with a default HREF
084         */
085        public ThumbnailLink() {
086            this(EMPTY_HREF);
087        }
088    
089        /**
090         * {@inheritDoc}
091         */
092        @Override
093        public HandlerRegistration addClickHandler(final ClickHandler handler) {
094            return addDomHandler(handler, ClickEvent.getType());
095        }
096    
097        /**
098         * {@inheritDoc}
099         */
100        @Override
101        public HandlerRegistration addDoubleClickHandler(final DoubleClickHandler handler) {
102            return addDomHandler(handler, DoubleClickEvent.getType());
103        }
104    
105        /**
106         * {@inheritDoc}
107         */
108        @Override
109        public void setHref(final String href) {
110            AnchorElement.as(getElement()).setHref(href);
111        }
112    
113        /**
114         * {@inheritDoc}
115         */
116        @Override
117        public String getHref() {
118            return AnchorElement.as(getElement()).getHref();
119        }
120    
121        /**
122         * {@inheritDoc}
123         */
124        @Override
125        public void setTargetHistoryToken(final String targetHistoryToken) {
126            this.targetHistoryToken = targetHistoryToken;
127            final String hash = History.encodeHistoryToken(targetHistoryToken);
128            setHref("#" + hash);
129        }
130    
131        /**
132         * {@inheritDoc}
133         */
134        @Override
135        public String getTargetHistoryToken() {
136            return targetHistoryToken;
137        }
138    
139        /**
140         * {@inheritDoc}
141         */
142        @Override
143        public void setDataToggle(final Toggle toggle) {
144            toggleMixin.setDataToggle(toggle);
145        }
146    
147        /**
148         * {@inheritDoc}
149         */
150        @Override
151        public Toggle getDataToggle() {
152            return toggleMixin.getDataToggle();
153        }
154    
155        /**
156         * {@inheritDoc}
157         */
158        @Override
159        public int getTabIndex() {
160            return focusableMixin.getTabIndex();
161        }
162    
163        /**
164         * {@inheritDoc}
165         */
166        @Override
167        public void setTabIndex(final int index) {
168            focusableMixin.setTabIndex(index);
169        }
170    
171        /**
172         * {@inheritDoc}
173         */
174        @Override
175        public void setAccessKey(final char key) {
176            focusableMixin.setAccessKey(key);
177        }
178    
179        /**
180         * {@inheritDoc}
181         */
182        @Override
183        public void setFocus(final boolean focused) {
184            focusableMixin.setFocus(focused);
185        }
186    
187        /**
188         * {@inheritDoc}
189         */
190        @Override
191        public void setTarget(final String target) {
192            attributeMixin.setAttribute(Attributes.TARGET, target);
193        }
194    
195        /**
196         * {@inheritDoc}
197         */
198        @Override
199        public String getTarget() {
200            return attributeMixin.getAttribute(Attributes.TARGET);
201        }
202    }