package org.gwtbootstrap3.client.ui.base.button;
/*
* #%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 org.gwtbootstrap3.client.ui.Icon;
import org.gwtbootstrap3.client.ui.base.ComplexWidget;
import org.gwtbootstrap3.client.ui.base.HasIcon;
import org.gwtbootstrap3.client.ui.base.HasIconPosition;
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.html.Text;
import cc.kune.common.shared.res.KuneIcon;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Widget;
/**
* Custom mixin for Widgets that have text and some optional icons.
*
* @author Sven Jacobs
* @author Vicente J. Ruiz Jurado (adaptation for kune)
*/
public class CustomIconTextMixin<T extends ComplexWidget & HasText & HasIcon & HasIconPosition>
implements HasText, HasIcon, HasIconPosition {
private static final String DEF = "16px";
private Icon icon;
private boolean iconBordered = false;
private IconFlip iconFlip = IconFlip.NONE;
private Image iconImage;
private Widget iconLabel;
private boolean iconLight = false;
private boolean iconMuted = false;
private IconPosition iconPosition = IconPosition.LEFT;
private Image iconRightImage;
private IconRotate iconRotate = IconRotate.NONE;
private IconSize iconSize = IconSize.NONE;
private boolean iconSpin = false;
private IconType iconType;
private ScheduledCommand renderCommand;
private boolean renderScheduled;
private final Text separator = new Text(" ");
private final Text separator2 = new Text(" ");
private HTMLPanel shortcut;
private final Text text = new Text();
private final T widget;
public CustomIconTextMixin(final T widget) {
this.widget = widget;
}
private Widget createCleanIcon() {
final Image icon = new Image();
icon.setUrl(GWT.getModuleBaseURL() + "clear.cache.gif");
return icon;
}
@Override
public IconType getIcon() {
return icon == null ? null : icon.getType();
}
@Override
public IconFlip getIconFlip() {
return iconFlip;
}
@Override
public IconPosition getIconPosition() {
return iconPosition;
}
@Override
public IconRotate getIconRotate() {
return iconRotate;
}
@Override
public IconSize getIconSize() {
return iconSize;
}
@Override
public String getText() {
return text.getText();
}
@Override
public boolean isIconBordered() {
return iconBordered;
}
@Override
public boolean isIconLight() {
return iconLight;
}
@Override
public boolean isIconMuted() {
return iconMuted;
}
@Override
public boolean isIconSpin() {
return iconSpin;
}
private void render() {
// We defer to make sure the elements are available to manipulate their
// positions
if (renderCommand == null) {
renderCommand = new Scheduler.ScheduledCommand() {
private int addOtherIcons(final boolean hasIconImage, final boolean hasIconRightImage,
final boolean hasIconLabel, int position) {
if (hasIconImage) {
widget.insert(iconImage, position++);
}
if (hasIconRightImage) {
widget.insert(iconRightImage, position++);
}
if (hasIconLabel) {
widget.insert(iconLabel, position++);
}
return position;
}
private int addOtherSeparator(final boolean hasIconType, final boolean hasIconImage,
final boolean hasIconRightImage, final boolean hasIconLabel, final int position) {
if (!hasIconType && (hasIconImage || hasIconRightImage || hasIconLabel)) {
widget.insert(separator2, position);
}
return position;
}
@Override
public void execute() {
if (text.isAttached()) {
text.removeFromParent();
}
if (separator.isAttached()) {
separator.removeFromParent();
}
if (separator2.isAttached()) {
separator2.removeFromParent();
}
if (icon != null) {
icon.removeFromParent();
}
if (shortcut != null) {
shortcut.removeFromParent();
}
final boolean hasIconType = iconType != null;
final boolean hasIconImage = iconImage != null;
final boolean hasIconRightImage = iconRightImage != null;
final boolean hasIconLabel = iconLabel != null;
final boolean hasShortcut = shortcut != null;
if (hasIconImage) {
iconImage.removeFromParent();
}
if (hasIconRightImage) {
iconRightImage.removeFromParent();
}
if (hasIconLabel) {
iconLabel.removeFromParent();
}
icon = new Icon();
icon.setType(iconType);
icon.setSize(iconSize);
icon.setFlip(iconFlip);
icon.setRotate(iconRotate);
icon.setMuted(iconMuted);
icon.setSpin(iconSpin);
icon.setBorder(iconBordered);
icon.setLight(iconLight);
// Since we are dealing with Icon/Text, we can insert them at the
// right
// position.
// Helps on widgets like ButtonDropDown, where it has a caret added
int position = 0;
if (iconPosition == IconPosition.LEFT) {
if (hasIconType) {
widget.insert(icon, position++);
widget.insert(separator, position);
}
position = addOtherIcons(hasIconImage, hasIconRightImage, hasIconLabel, position);
position = addOtherSeparator(hasIconType, hasIconImage, hasIconRightImage, hasIconLabel,
position);
}
if (text.getText() != null && text.getText().length() > 0
&& !"undefined".equals(text.getText())) {
widget.insert(text, position++);
}
if (hasShortcut) {
widget.insert(shortcut, position++);
}
if (iconPosition == IconPosition.RIGHT) {
if (hasIconType) {
widget.insert(separator, position++);
widget.insert(icon, position++);
}
position = addOtherSeparator(hasIconType, hasIconImage, hasIconRightImage, hasIconLabel,
position);
position = addOtherIcons(hasIconImage, hasIconRightImage, hasIconLabel, position);
}
renderScheduled = false;
}
};
}
if (!renderScheduled) {
// We prevent to render several times the same widget
Scheduler.get().scheduleFinally(renderCommand);
renderScheduled = true;
}
}
@Override
public void setIcon(final IconType iconType) {
this.iconType = iconType;
render();
}
public void setIcon(final KuneIcon icon) {
if (iconLabel == null) {
iconLabel = new CustomIcon(icon.getCharacter().toString());
}
iconLabel.setStyleName("k-iconfontlabel");
render();
}
public void setIconBackColor(final String backgroundColor) {
if (iconLabel == null) {
iconLabel = createCleanIcon();
}
iconLabel.getElement().getStyle().setBackgroundColor(backgroundColor);
render();
}
@Override
public void setIconBordered(final boolean iconBordered) {
this.iconBordered = iconBordered;
render();
}
@Override
public void setIconFlip(final IconFlip iconFlip) {
this.iconFlip = iconFlip;
render();
}
@Override
public void setIconLight(final boolean iconLight) {
this.iconLight = iconLight;
render();
}
@Override
public void setIconMuted(final boolean iconMuted) {
this.iconMuted = iconMuted;
render();
}
@Override
public void setIconPosition(final IconPosition iconPosition) {
this.iconPosition = iconPosition;
render();
}
public void setIconResource(final ImageResource icon) {
if (iconImage == null) {
iconImage = new Image();
}
iconImage.setResource(icon);
iconImage.setSize(DEF, DEF);
render();
}
public void setIconRightResource(final ImageResource icon) {
if (iconRightImage == null) {
iconRightImage = new Image();
}
iconRightImage.setResource(icon);
iconRightImage.setSize(DEF, DEF);
render();
}
@Override
public void setIconRotate(final IconRotate iconRotate) {
this.iconRotate = iconRotate;
render();
}
@Override
public void setIconSize(final IconSize iconSize) {
this.iconSize = iconSize;
render();
}
@Override
public void setIconSpin(final boolean iconSpin) {
this.iconSpin = iconSpin;
}
public void setIconStyle(final String style) {
if (iconLabel == null) {
iconLabel = createCleanIcon();
}
iconLabel.addStyleName(style);
render();
}
public void setIconUrl(final String url) {
if (iconImage == null) {
iconImage = new Image();
}
iconImage.setUrl(url);
iconImage.setSize(DEF, DEF);
render();
}
public void setShortcut(final String shortcutHtml) {
shortcut = new HTMLPanel("span", shortcutHtml);
}
@Override
public void setText(final String text) {
this.text.setText(text);
render();
}
}