package org.gwtbootstrap3.client.ui; /* * #%L * GwtBootstrap3 * %% * Copyright (C) 2013 GwtBootstrap3 * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import com.google.gwt.dom.client.AnchorElement; import com.google.gwt.dom.client.Document; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.DoubleClickEvent; import com.google.gwt.event.dom.client.DoubleClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.dom.client.HasDoubleClickHandlers; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.History; import com.google.gwt.user.client.ui.Focusable; import com.google.gwt.user.client.ui.HasEnabled; import com.google.gwt.user.client.ui.HasHTML; import com.google.gwt.user.client.ui.Widget; import org.gwtbootstrap3.client.ui.base.ComplexWidget; import org.gwtbootstrap3.client.ui.base.HasBadge; import org.gwtbootstrap3.client.ui.base.HasDataParent; import org.gwtbootstrap3.client.ui.base.HasDataTarget; import org.gwtbootstrap3.client.ui.base.HasDataToggle; import org.gwtbootstrap3.client.ui.base.HasHref; import org.gwtbootstrap3.client.ui.base.HasIcon; import org.gwtbootstrap3.client.ui.base.HasIconPosition; import org.gwtbootstrap3.client.ui.base.HasPull; import org.gwtbootstrap3.client.ui.base.HasTarget; import org.gwtbootstrap3.client.ui.base.HasTargetHistoryToken; import org.gwtbootstrap3.client.ui.base.mixin.AttributeMixin; import org.gwtbootstrap3.client.ui.base.mixin.DataParentMixin; import org.gwtbootstrap3.client.ui.base.mixin.DataTargetMixin; import org.gwtbootstrap3.client.ui.base.mixin.DataToggleMixin; import org.gwtbootstrap3.client.ui.base.mixin.EnabledMixin; import org.gwtbootstrap3.client.ui.base.mixin.FocusableMixin; import org.gwtbootstrap3.client.ui.base.mixin.IconTextMixin; import org.gwtbootstrap3.client.ui.base.mixin.PullMixin; import org.gwtbootstrap3.client.ui.constants.Attributes; import org.gwtbootstrap3.client.ui.constants.BadgePosition; import org.gwtbootstrap3.client.ui.constants.IconFlip; import org.gwtbootstrap3.client.ui.constants.IconPosition; import org.gwtbootstrap3.client.ui.constants.IconRotate; import org.gwtbootstrap3.client.ui.constants.IconSize; import org.gwtbootstrap3.client.ui.constants.IconType; import org.gwtbootstrap3.client.ui.constants.Pull; import org.gwtbootstrap3.client.ui.constants.Styles; import org.gwtbootstrap3.client.ui.constants.Toggle; import java.util.List; /** * Anchor {@code <a>} element with text and optional icon. * * @author Sven Jacobs * @author Joshua Godi * @author Grant Slender * @author Drew Spencer */ public class Anchor extends ComplexWidget implements HasEnabled, HasClickHandlers, HasDoubleClickHandlers, HasHref, HasDataToggle, HasDataParent, HasTargetHistoryToken, HasHTML, HasIcon, HasIconPosition, Focusable, HasDataTarget, HasTarget, HasPull, HasBadge { private final PullMixin<Anchor> pullMixin = new PullMixin<Anchor>(this); private final DataToggleMixin<Anchor> toggleMixin = new DataToggleMixin<Anchor>(this); private final DataParentMixin<Anchor> parentMixin = new DataParentMixin<Anchor>(this); private final IconTextMixin<Anchor> iconTextMixin = new IconTextMixin<Anchor>(this); private final DataTargetMixin<Anchor> targetMixin = new DataTargetMixin<Anchor>(this); private final AttributeMixin<Anchor> attributeMixin = new AttributeMixin<Anchor>(this); private final FocusableMixin<Anchor> focusableMixin = new FocusableMixin<Anchor>(this); private final EnabledMixin<Anchor> enabledMixin = new EnabledMixin<Anchor>(this); private String targetHistoryToken; /** * Creates an anchor widget with the desired HREF * * @param href href for the anchor */ public Anchor(final String href) { setElement(Document.get().createAnchorElement()); setHref(href); iconTextMixin.addTextWidgetToParent(); } /** * Creates an achor widget with the desired HREF and text * * @param text text for the anchor * @param href href for the anchor */ public Anchor(final String text, final String href) { this(href); setText(text); } /** * Creates a default anchor with a default href */ public Anchor() { this(EMPTY_HREF); } /** * {@inheritDoc} */ @Override public HandlerRegistration addClickHandler(final ClickHandler handler) { return addDomHandler(handler, ClickEvent.getType()); } /** * {@inheritDoc} */ @Override public HandlerRegistration addDoubleClickHandler(final DoubleClickHandler handler) { return addDomHandler(handler, DoubleClickEvent.getType()); } /** * {@inheritDoc} */ @Override public void setText(final String text) { iconTextMixin.setText(text); } /** * {@inheritDoc} */ @Override public String getText() { return iconTextMixin.getText(); } /** * {@inheritDoc} */ @Override public void setIcon(final IconType iconType) { iconTextMixin.setIcon(iconType); } /** * {@inheritDoc} */ @Override public IconType getIcon() { return iconTextMixin.getIcon(); } /** * {@inheritDoc} */ @Override public void setIconPosition(final IconPosition iconPosition) { iconTextMixin.setIconPosition(iconPosition); } /** * {@inheritDoc} */ @Override public IconPosition getIconPosition() { return iconTextMixin.getIconPosition(); } /** * {@inheritDoc} */ @Override public void setIconSize(final IconSize iconSize) { iconTextMixin.setIconSize(iconSize); } /** * {@inheritDoc} */ @Override public IconSize getIconSize() { return iconTextMixin.getIconSize(); } /** * {@inheritDoc} */ @Override public void setIconFlip(final IconFlip iconFlip) { iconTextMixin.setIconFlip(iconFlip); } /** * {@inheritDoc} */ @Override public IconFlip getIconFlip() { return iconTextMixin.getIconFlip(); } /** * {@inheritDoc} */ @Override public void setIconRotate(final IconRotate iconRotate) { iconTextMixin.setIconRotate(iconRotate); } /** * {@inheritDoc} */ @Override public IconRotate getIconRotate() { return iconTextMixin.getIconRotate(); } /** * {@inheritDoc} */ @Override public void setIconBordered(final boolean iconBordered) { iconTextMixin.setIconBordered(iconBordered); } /** * {@inheritDoc} */ @Override public boolean isIconBordered() { return iconTextMixin.isIconBordered(); } /** * {@inheritDoc} */ @Override public void setIconInverse(final boolean iconInverse) { iconTextMixin.setIconInverse(iconInverse); } /** * {@inheritDoc} */ @Override public boolean isIconInverse() { return iconTextMixin.isIconInverse(); } /** * {@inheritDoc} */ @Override public void setIconSpin(final boolean iconSpin) { iconTextMixin.setIconSpin(iconSpin); } /** * {@inheritDoc} */ @Override public boolean isIconSpin() { return iconTextMixin.isIconSpin(); } /** * {@inheritDoc} */ @Override public void setIconPulse(boolean iconPulse) { iconTextMixin.setIconPulse(iconPulse); } /** * {@inheritDoc} */ @Override public boolean isIconPulse() { return iconTextMixin.isIconPulse(); } /** * {@inheritDoc} */ @Override public void setIconFixedWidth(final boolean iconFixedWidth) { iconTextMixin.setIconFixedWidth(iconFixedWidth); } /** * {@inheritDoc} */ @Override public boolean isIconFixedWidth() { return iconTextMixin.isIconFixedWidth(); } /** * {@inheritDoc} */ @Override public void setHref(final String href) { AnchorElement.as(getElement()).setHref(href); } /** * {@inheritDoc} */ @Override public String getHref() { return AnchorElement.as(getElement()).getHref(); } /** * {@inheritDoc} */ @Override public void setTargetHistoryToken(final String targetHistoryToken) { this.targetHistoryToken = targetHistoryToken; final String hash = History.encodeHistoryToken(targetHistoryToken); setHref("#" + hash); } /** * {@inheritDoc} */ @Override public String getTargetHistoryToken() { return targetHistoryToken; } /** * {@inheritDoc} */ @Override public void setDataParent(final String dataParent) { parentMixin.setDataParent(dataParent); } /** * {@inheritDoc} */ @Override public String getDataParent() { return parentMixin.getDataParent(); } /** * {@inheritDoc} */ @Override public void setDataToggle(final Toggle toggle) { toggleMixin.setDataToggle(toggle); } /** * {@inheritDoc} */ @Override public Toggle getDataToggle() { return toggleMixin.getDataToggle(); } /** * {@inheritDoc} */ @Override public int getTabIndex() { return focusableMixin.getTabIndex(); } /** * {@inheritDoc} */ @Override public void setTabIndex(final int index) { focusableMixin.setTabIndex(index); } /** * {@inheritDoc} */ @Override public void setAccessKey(final char key) { focusableMixin.setAccessKey(key); } /** * {@inheritDoc} */ @Override public void setFocus(final boolean focused) { focusableMixin.setFocus(focused); } /** * {@inheritDoc} */ @Override public String getHTML() { return getElement().getInnerHTML(); } /** * {@inheritDoc} */ @Override public void setHTML(final String html) { getElement().setInnerHTML(html); } @Override public void setDataTargetWidgets(final List<Widget> widgets) { targetMixin.setDataTargetWidgets(widgets); } @Override public void setDataTargetWidget(final Widget widget) { targetMixin.setDataTargetWidget(widget); } /** * {@inheritDoc} */ @Override public void setDataTarget(final String dataTarget) { targetMixin.setDataTarget(dataTarget); } /** * {@inheritDoc} */ @Override public String getDataTarget() { return targetMixin.getDataTarget(); } /** * {@inheritDoc} */ @Override public void setTarget(final String target) { attributeMixin.setAttribute(Attributes.TARGET, target); } /** * {@inheritDoc} */ @Override public String getTarget() { return attributeMixin.getAttribute(Attributes.TARGET); } /** * {@inheritDoc} */ @Override public void setPull(final Pull pull) { pullMixin.setPull(pull); } /** * {@inheritDoc} */ @Override public Pull getPull() { return pullMixin.getPull(); } /** * {@inheritDoc} */ @Override public boolean isEnabled() { return enabledMixin.isEnabled(); } /** * {@inheritDoc} */ @Override public void setEnabled(final boolean enabled) { enabledMixin.setEnabled(enabled); } @Override public void setBadgeText(String badgeText) { iconTextMixin.setBadgeText(badgeText); } @Override public String getBadgeText() { return iconTextMixin.getBadgeText(); } @Override public void setBadgePosition(BadgePosition badgePosition) { iconTextMixin.setBadgePosition(badgePosition); } @Override public BadgePosition getBadgePosition() { return iconTextMixin.getBadgePosition(); } /** * {@inheritDoc} */ @Override protected void onAttach() { super.onAttach(); // Adding styles to the heading depending on the parent if (getParent() != null) { if (getParent() instanceof Alert) { addStyleName(Styles.ALERT_LINK); } } } /** * We override this because the <a></a> tag doesn't support the disabled property. So on clicks and focus, if disabled then ignore * * @param event dom event */ @Override public void onBrowserEvent(final Event event) { switch (DOM.eventGetType(event)) { case Event.ONDBLCLICK: case Event.ONFOCUS: case Event.ONCLICK: if (!isEnabled()) { return; } break; } super.onBrowserEvent(event); } @Override public void setIconColor(String iconColor) { iconTextMixin.setIconColor(iconColor); } }