accounting-manager-theme/src/com/sencha/gxt/theme/neptune/client/sliced/button/SlicedButtonCellAppearance....

281 lines
8.7 KiB
Java

/**
* Sencha GXT 3.1.1 - Sencha for GWT
* Copyright(c) 2007-2014, Sencha, Inc.
* licensing@sencha.com
*
* http://www.sencha.com/products/gxt/license/
*/
package com.sencha.gxt.theme.neptune.client.sliced.button;
import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.resources.client.ImageResource.ImageOptions;
import com.google.gwt.resources.client.ImageResource.RepeatStyle;
import com.google.gwt.safecss.shared.SafeStylesBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.sencha.gxt.cell.core.client.ButtonCell;
import com.sencha.gxt.cell.core.client.ButtonCell.ButtonScale;
import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign;
import com.sencha.gxt.cell.core.client.SplitButtonCell;
import com.sencha.gxt.core.client.GXT;
import com.sencha.gxt.core.client.resources.CommonStyles;
import com.sencha.gxt.core.client.util.TextMetrics;
import com.sencha.gxt.theme.base.client.button.ButtonCellDefaultAppearance;
import com.sencha.gxt.theme.base.client.frame.Frame;
import com.sencha.gxt.theme.base.client.frame.TableFrame;
import com.sencha.gxt.theme.neptune.client.ThemeDetails;
public class SlicedButtonCellAppearance<C> extends ButtonCellDefaultAppearance<C> {
public interface SlicedButtonCellResources extends ButtonCellResources {
@Override
@Source({"com/sencha/gxt/theme/base/client/button/ButtonCell.css", "SlicedButtonCell.css", "SlicedToolBarButtonCell.css"})
SlicedButtonCellStyle style();
@ImageOptions(repeatStyle = RepeatStyle.None)
@Source("com/sencha/gxt/theme/neptune/client/base/button/arrow.png")
ImageResource arrow();
@ImageOptions(repeatStyle = RepeatStyle.None)
@Source("com/sencha/gxt/theme/neptune/client/base/button/arrowBottom.png")
ImageResource arrowBottom();
@ImageOptions(repeatStyle = RepeatStyle.None)
@Source("com/sencha/gxt/theme/neptune/client/base/button/split.png")
ImageResource split();
@ImageOptions(repeatStyle = RepeatStyle.None)
@Source("com/sencha/gxt/theme/neptune/client/base/button/splitBottom.png")
ImageResource splitBottom();
@ImageOptions(repeatStyle = RepeatStyle.None)
@Source("com/sencha/gxt/theme/neptune/client/base/button/toolBarArrow.png")
ImageResource toolBarArrow();
@ImageOptions(repeatStyle = RepeatStyle.None)
@Source("com/sencha/gxt/theme/neptune/client/base/button/toolBarArrowBottom.png")
ImageResource toolBarArrowBottom();
@ImageOptions(repeatStyle = RepeatStyle.None)
@Source("com/sencha/gxt/theme/neptune/client/base/button/toolBarButtonSplit.png")
ImageResource toolBarSplit();
@ImageOptions(repeatStyle = RepeatStyle.None)
@Source("com/sencha/gxt/theme/neptune/client/base/button/toolBarButtonSplitBottom.png")
ImageResource toolBarSplitBottom();
ThemeDetails theme();
}
public interface SlicedButtonCellStyle extends ButtonCellStyle {
}
public SlicedButtonCellAppearance() {
this(GWT.<SlicedButtonCellResources>create(SlicedButtonCellResources.class));
}
public SlicedButtonCellAppearance(SlicedButtonCellResources resources) {
super(resources, GWT.<ButtonCellTemplates>create(ButtonCellTemplates.class), new TableFrame(
GWT.<SlicedButtonCellTableFrameResources>create(SlicedButtonCellTableFrameResources.class)));
}
@Override
public void render(final ButtonCell<C> cell, Context context, C value, SafeHtmlBuilder sb) {
String constantHtml = cell.getHTML();
boolean hasConstantHtml = constantHtml != null && constantHtml.length() != 0;
boolean isBoolean = value != null && value instanceof Boolean;
// is a boolean always a toggle button?
String text = hasConstantHtml ? cell.getText() : (value != null && !isBoolean)
? SafeHtmlUtils.htmlEscape(value.toString()) : "";
ImageResource icon = cell.getIcon();
IconAlign iconAlign = cell.getIconAlign();
String cls = style.button();
String arrowCls = "";
if (cell.getMenu() != null) {
if (cell instanceof SplitButtonCell) {
switch (cell.getArrowAlign()) {
case RIGHT:
arrowCls = style.split();
break;
case BOTTOM:
arrowCls = style.splitBottom();
break;
default:
// empty
}
} else {
switch (cell.getArrowAlign()) {
case RIGHT:
arrowCls = style.arrow();
break;
case BOTTOM:
arrowCls = style.arrowBottom();
break;
}
}
}
ButtonScale scale = cell.getScale();
switch (scale) {
case SMALL:
cls += " " + style.small();
break;
case MEDIUM:
cls += " " + style.medium();
break;
case LARGE:
cls += " " + style.large();
break;
default:
// empty
}
SafeStylesBuilder stylesBuilder = new SafeStylesBuilder();
int width = -1;
if (cell.getWidth() != -1) {
int w = cell.getWidth();
if (w < cell.getMinWidth()) {
w = cell.getMinWidth();
}
stylesBuilder.appendTrustedString("width:" + w + "px;");
cls += " " + style.hasWidth() + " x-has-width";
width = w;
} else {
if (cell.getMinWidth() != -1) {
TextMetrics.get().bind(style.text());
@SuppressWarnings("unused")
int length = TextMetrics.get().getWidth(text);
length += 6; // frames
if (icon != null) {
switch (iconAlign) {
case LEFT:
case RIGHT:
length += icon.getWidth();
break;
default:
// empty
}
}
}
}
final int height = cell.getHeight();
if (height != -1) {
stylesBuilder.appendTrustedString("height:" + height + "px;");
}
if (icon != null) {
switch (iconAlign) {
case TOP:
arrowCls += " " + style.iconTop();
break;
case BOTTOM:
arrowCls += " " + style.iconBottom();
break;
case LEFT:
arrowCls += " " + style.iconLeft();
break;
case RIGHT:
arrowCls += " " + style.iconRight();
break;
}
} else {
arrowCls += " " + style.noIcon();
}
// toggle button
if (value == Boolean.TRUE) {
cls += " " + frame.pressedClass();
}
sb.append(templates.outer(cls, new SafeStylesBuilder().toSafeStyles()));
SafeHtmlBuilder inside = new SafeHtmlBuilder();
String innerWrap = arrowCls;
if (GXT.isIE6() || GXT.isIE7()) {
arrowCls += " " + CommonStyles.get().inlineBlock();
}
inside.appendHtmlConstant("<div class='" + innerWrap + "'>");
inside.appendHtmlConstant("<table cellpadding=0 cellspacing=0 class='" + style.mainTable() + "'>");
boolean hasText = text != null && !text.equals("");
if (icon != null) {
switch (iconAlign) {
case LEFT:
inside.appendHtmlConstant("<tr>");
writeIcon(inside, icon, height);
if (hasText) {
int w = width - (icon != null ? icon.getWidth() : 0) - 4;
writeText(inside, text, w, height);
}
inside.appendHtmlConstant("</tr>");
break;
case RIGHT:
inside.appendHtmlConstant("<tr>");
if (hasText) {
int w = width - (icon != null ? icon.getWidth() : 0) - 4;
writeText(inside, text, w, height);
}
writeIcon(inside, icon, height);
inside.appendHtmlConstant("</tr>");
break;
case TOP:
inside.appendHtmlConstant("<tr>");
writeIcon(inside, icon, height);
inside.appendHtmlConstant("</tr>");
if (hasText) {
inside.appendHtmlConstant("<tr>");
writeText(inside, text, width, height);
inside.appendHtmlConstant("</tr>");
}
break;
case BOTTOM:
if (hasText) {
inside.appendHtmlConstant("<tr>");
writeText(inside, text, width, height);
inside.appendHtmlConstant("</tr>");
}
inside.appendHtmlConstant("<tr>");
writeIcon(inside, icon, height);
inside.appendHtmlConstant("</tr>");
break;
}
} else {
inside.appendHtmlConstant("<tr>");
if (text != null) {
writeText(inside, text, width, height);
}
inside.appendHtmlConstant("</tr>");
}
inside.appendHtmlConstant("</table>");
inside.appendHtmlConstant("</div>");
frame.render(sb, new Frame.FrameOptions(0, CommonStyles.get().noFocusOutline(), stylesBuilder.toSafeStyles()),
inside.toSafeHtml());
sb.appendHtmlConstant("</div>");
}
}