/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE file at the root of the source
* tree and available online at
*
* https://github.com/keeps/roda
*/
package org.roda.wui.client.common.actions;
import java.util.Arrays;
import org.roda.core.data.v2.index.IsIndexed;
import org.roda.core.data.v2.index.select.SelectedItems;
import org.roda.core.data.v2.index.select.SelectedItemsList;
import org.roda.wui.client.common.utils.AsyncCallbackUtils;
import org.roda.wui.client.common.utils.StringUtils;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
public abstract class AbstractActionable<T extends IsIndexed> implements Actionable<T> {
protected static AsyncCallback<ActionImpact> createDefaultAsyncCallback() {
return new AsyncCallback<ActionImpact>() {
@Override
public void onFailure(Throwable caught) {
AsyncCallbackUtils.defaultFailureTreatment(caught);
}
@Override
public void onSuccess(ActionImpact impact) {
// do nothing
}
};
}
protected SelectedItemsList<T> objectToSelectedItems(T object) {
return new SelectedItemsList<>(Arrays.asList(object.getUUID()), object.getClass().getName());
}
@Override
public void act(Actionable.Action<T> action, T object) {
act(action, object, createDefaultAsyncCallback());
}
@Override
public boolean canAct(Actionable.Action<T> action, T object) {
return canAct(action, objectToSelectedItems(object));
}
public boolean canAct(T object, @SuppressWarnings("unchecked") Actionable.Action<T>... actions) {
boolean canAct = false;
for (Action<T> action : actions) {
if (canAct(action, object)) {
canAct = true;
break;
}
}
return canAct;
}
public boolean canAct(SelectedItems<T> objects, @SuppressWarnings("unchecked") Actionable.Action<T>... actions) {
boolean canAct = false;
for (Action<T> action : actions) {
if (canAct(action, objects)) {
canAct = true;
break;
}
}
return canAct;
}
@Override
public void act(Actionable.Action<T> action, T object, AsyncCallback<ActionImpact> callback) {
act(action, objectToSelectedItems(object), callback);
}
@Override
public void act(Actionable.Action<T> action, SelectedItems<T> objects) {
act(action, objects, createDefaultAsyncCallback());
}
public FlowPanel createLayout() {
FlowPanel layout = new FlowPanel();
layout.addStyleName("actions-layout");
return layout;
}
@SafeVarargs
public final void addTitle(FlowPanel layout, String text, T object, Actionable.Action<T>... actions) {
addTitle(layout, text, object, null, actions);
}
@SafeVarargs
public final void addTitle(FlowPanel layout, String text, T object, String extraCssClass,
Actionable.Action<T>... actions) {
if (canAct(object, actions)) {
Label title = new Label(text);
title.addStyleName("h4");
if (StringUtils.isNotBlank(extraCssClass)) {
title.addStyleName(extraCssClass);
}
layout.add(title);
}
}
@SafeVarargs
public final void addTitle(FlowPanel layout, String text, SelectedItems<T> objects, Actionable.Action<T>... actions) {
addTitle(layout, text, objects, null, actions);
}
@SafeVarargs
public final void addTitle(FlowPanel layout, String text, SelectedItems<T> objects, String extraCssClass,
Actionable.Action<T>... actions) {
if (canAct(objects, actions)) {
Label title = new Label(text);
title.addStyleName("h4");
if (StringUtils.isNotBlank(extraCssClass)) {
title.addStyleName(extraCssClass);
}
layout.add(title);
}
}
public void addButton(FlowPanel layout, final String text, final Actionable.Action<T> action, final T object,
final ActionImpact impact, final AsyncCallback<ActionImpact> callback, final String... extraCssClasses) {
if (canAct(action, object)) {
// Construct
Button button = new Button(text);
button.setTitle(text);
// CSS
button.setStyleName("actions-layout-button");
button.addStyleName("btn");
button.addStyleName("btn-block");
if (ActionImpact.DESTROYED.equals(impact)) {
button.addStyleName("btn-danger");
} else if (ActionImpact.UPDATED.equals(impact)) {
button.addStyleName("btn-primary");
} else {
button.addStyleName("btn-default");
}
button.addStyleDependentName(impact.name().toLowerCase());
for (String extraCssClass : extraCssClasses) {
button.addStyleName(extraCssClass);
}
// Action
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
act(action, object, callback);
}
});
layout.add(button);
}
}
public void addButton(FlowPanel layout, final String text, final Actionable.Action<T> action,
final SelectedItems<T> objects, final ActionImpact impact, final AsyncCallback<ActionImpact> callback,
final String... extraCssClasses) {
if (canAct(action, objects)) {
// Construct
Button button = new Button(text);
button.setTitle(text);
// CSS
button.setStyleName("actions-layout-button");
button.addStyleName("btn");
button.addStyleName("btn-block");
button.addStyleName(ActionImpact.DESTROYED.equals(impact) ? "btn-danger" : "btn-default");
button.addStyleDependentName(impact.name().toLowerCase());
for (String extraCssClass : extraCssClasses) {
button.addStyleName(extraCssClass);
}
// Action
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
act(action, objects, callback);
}
});
layout.add(button);
}
}
@Override
public Widget createActionsLayout(T object, AsyncCallback<ActionImpact> callback) {
return createActionsLayout(objectToSelectedItems(object), callback);
}
public Widget createActionsLayout(T object) {
return createActionsLayout(object, createDefaultAsyncCallback());
}
}