/*
* Copyright 2014-2015 CyberVision, Inc.
*
* 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.
*/
package org.kaaproject.avro.ui.gwt.client.widget.grid.cell;
import static com.google.gwt.dom.client.BrowserEvents.CLICK;
import static com.google.gwt.dom.client.BrowserEvents.KEYDOWN;
import static com.google.gwt.dom.client.BrowserEvents.KEYUP;
import org.kaaproject.avro.ui.gwt.client.util.Utils;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safecss.shared.SafeStyles;
import com.google.gwt.safecss.shared.SafeStylesBuilder;
import com.google.gwt.safecss.shared.SafeStylesUtils;
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.safehtml.shared.SafeUri;
public class ActionButtonCell<T> extends AbstractCell<T> {
interface Template extends SafeHtmlTemplates {
@Template("<div class=\"gwt-Button {0}\" tabindex=\"-1\" role=\"button\" style=\"; vertical-align:middle;\">"+
"<span>{1} </span>"+
"<span style='{2}'></span>"+
"</div>")
SafeHtml actionButton(String cellButtonClass, String text, SafeStyles style);
@Template("<div class=\"gwt-Button {0} {1}\" tabindex=\"-1\" role=\"button\" style=\"; vertical-align:middle;\">"+
"<span>{2} </span>"+
"<span style='{3}'></span>"+
"</div>")
SafeHtml actionButtonSmall(String cellButtonClass, String smallCellButtonClass, String text, SafeStyles style);
}
private static SafeHtml empty = SafeHtmlUtils.fromSafeConstant(" ");
private static Template template;
private SafeHtml actionButtonHtml;
private ActionListener<T> listener;
private ActionValidator<T> validator;
public ActionButtonCell(ImageResource imageResource,
String text,
boolean small,
ActionListener<T> listener,
ActionValidator<T> validator) {
super(CLICK, KEYDOWN);
this.listener = listener;
this.validator = validator;
if (template == null) {
template = GWT.create(Template.class);
}
SafeUri uri = imageResource.getSafeUri();
int width = imageResource.getWidth();
int height = imageResource.getHeight();
int paddingLeft = width;
String background = "url(\"" + uri.asString() + "\") no-repeat scroll right center";
SafeStylesBuilder builder = new SafeStylesBuilder();
builder
.trustedNameAndValue("background", background)
.width(width, Unit.PX)
.height(height, Unit.PX)
.paddingLeft(paddingLeft, Unit.PX);
SafeStyles style = SafeStylesUtils.fromTrustedString(builder.toSafeStyles().asString());
if (small) {
this.actionButtonHtml = template.actionButtonSmall(Utils.avroUiStyle.cellButton(),
Utils.avroUiStyle.cellButtonSmall(), text, style);
} else {
this.actionButtonHtml = template.actionButton(Utils.avroUiStyle.cellButton(), text, style);
}
}
@Override
public void onBrowserEvent(Context context, Element parent, T value,
NativeEvent event, ValueUpdater<T> valueUpdater) {
int x = event.getClientX();
int y = event.getClientY();
Element child = parent.getFirstChildElement();
if (x >= child.getAbsoluteLeft() && x <= child.getAbsoluteRight() &&
y >= child.getAbsoluteTop() && y <= child.getAbsoluteBottom()) {
String type = event.getType();
int keyCode = event.getKeyCode();
boolean enterPressed = KEYUP.equals(type)
&& keyCode == KeyCodes.KEY_ENTER;
if ((CLICK.equals(type) || enterPressed) && validator.canPerformAction(value)) {
setValue(context, parent, value);
itemClicked(value);
}
}
}
private void itemClicked(T value) {
if (listener != null) {
listener.onItemAction(value);
}
}
@Override
public void render(com.google.gwt.cell.client.Cell.Context context,
T value, SafeHtmlBuilder sb) {
if (validator.canPerformAction(value)) {
sb.append(actionButtonHtml);
}
else {
sb.append(empty);
}
}
public static interface ActionListener<T> {
void onItemAction(T value);
}
public static interface ActionValidator<T> {
boolean canPerformAction(T value);
}
}