diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/custom/ActionButton.css b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/custom/ActionButton.css
new file mode 100644
index 0000000..8be4ac0
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/custom/ActionButton.css
@@ -0,0 +1,3 @@
+.image {
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/custom/ActionButton.html b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/custom/ActionButton.html
new file mode 100644
index 0000000..5cd8e63
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/custom/ActionButton.html
@@ -0,0 +1 @@
+
{img}
\ No newline at end of file
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/custom/ActionButtonCell.java b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/custom/ActionButtonCell.java
new file mode 100644
index 0000000..04392c8
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/custom/ActionButtonCell.java
@@ -0,0 +1,84 @@
+package org.gcube.portlets.user.td.tablewidget.client.custom;
+
+
+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.event.shared.HandlerRegistration;
+import com.google.gwt.resources.client.ImageResource;
+import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
+import com.sencha.gxt.cell.core.client.ResizeCell;
+import com.sencha.gxt.core.client.dom.XElement;
+import com.sencha.gxt.widget.core.client.event.BeforeSelectEvent;
+import com.sencha.gxt.widget.core.client.event.SelectEvent;
+import com.sencha.gxt.widget.core.client.event.SelectEvent.HasSelectHandlers;
+import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;
+
+/**
+ *
+ * @author "Giancarlo Panichi"
+ *
+ */
+public class ActionButtonCell extends ResizeCell implements HasSelectHandlers {
+
+ private final ActionButtonCellAppearance appearance;
+ private ImageResource icon;
+ private String title;
+
+ public ActionButtonCell() {
+ this(GWT. create(ActionButtonCellAppearance.class));
+ }
+
+ public ActionButtonCell(ActionButtonCellAppearance appearance) {
+ super("click");
+ this.appearance = appearance;
+ }
+
+ public void setIcon(ImageResource icon) {
+ this.icon = icon;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public HandlerRegistration addSelectHandler(SelectHandler handler) {
+ return addHandler(handler, SelectEvent.getType());
+ }
+
+ @Override
+ public void render(Context context,
+ String value, SafeHtmlBuilder sb) {
+ this.appearance.icon = icon;
+ this.appearance.title = title;
+ this.appearance.render(sb);
+ }
+
+ @Override
+ public void onBrowserEvent(Context context,
+ Element parent, String value, NativeEvent event,
+ ValueUpdater valueUpdater) {
+ Element target = event.getEventTarget().cast();
+ // ignore the parent element
+ if (isDisableEvents() || !parent.getFirstChildElement().isOrHasChild(target)) {
+ return;
+ }
+
+ XElement p = parent.cast();
+
+ String eventType = event.getType();
+ if ("click".equals(eventType)) {
+ onClick(context, p, value, event, valueUpdater);
+ }
+ }
+
+ private void onClick(Context context, XElement p, String value, NativeEvent event, ValueUpdater valueUpdater) {
+ if (!isDisableEvents() && fireCancellableEvent(context, new BeforeSelectEvent(context))) {
+ fireEvent(context, new SelectEvent(context));
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/custom/ActionButtonCellAppearance.java b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/custom/ActionButtonCellAppearance.java
new file mode 100644
index 0000000..00439f2
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/custom/ActionButtonCellAppearance.java
@@ -0,0 +1,65 @@
+package org.gcube.portlets.user.td.tablewidget.client.custom;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.resources.client.ClientBundle;
+import com.google.gwt.resources.client.CssResource;
+import com.google.gwt.resources.client.ImageResource;
+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.user.client.ui.AbstractImagePrototype;
+import com.sencha.gxt.core.client.XTemplates;
+
+/**
+ *
+ * @author "Giancarlo Panichi"
+ *
+ */
+public class ActionButtonCellAppearance {
+
+ public interface Style extends CssResource {
+ String image();
+ }
+
+ public interface Template extends XTemplates {
+ @XTemplate(source = "ActionButton.html")
+ SafeHtml template(Style style, SafeHtml img, String title);
+ }
+
+ public interface Resources extends ClientBundle {
+ @Source("ActionButton.css")
+ Style style();
+ }
+
+ private final Style style;
+ private final Template template;
+
+ public ImageResource icon;
+ public String title;
+
+ public ActionButtonCellAppearance(){
+ this((Resources) GWT.create(Resources.class));
+ }
+
+ public ActionButtonCellAppearance(Resources resources){
+ this.style = resources.style();
+ this.style.ensureInjected();
+ this.template = GWT.create(Template.class);
+ }
+
+ public void render(SafeHtmlBuilder sb) {
+ sb.append(template.template(style, makeImage(icon), title));
+ }
+
+ /**
+ * Make icons available as SafeHtml to be displayed inside the table
+ *
+ * @param resource
+ * @return
+ */
+ private static SafeHtml makeImage(ImageResource resource) {
+ AbstractImagePrototype proto = AbstractImagePrototype.create(resource);
+ String html = proto.getHTML();
+ return SafeHtmlUtils.fromTrustedString(html);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/history/HistoryPanel.java b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/history/HistoryPanel.java
index 41da32a..e64b95e 100644
--- a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/history/HistoryPanel.java
+++ b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/history/HistoryPanel.java
@@ -5,13 +5,18 @@ import java.util.List;
import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync;
import org.gcube.portlets.user.td.gwtservice.shared.history.OpHistory;
+import org.gcube.portlets.user.td.gwtservice.shared.history.RollBackSession;
import org.gcube.portlets.user.td.gwtservice.shared.tr.TableData;
+import org.gcube.portlets.user.td.tablewidget.client.custom.ActionButtonCell;
+import org.gcube.portlets.user.td.tablewidget.client.progress.RollBackProgressDialog;
import org.gcube.portlets.user.td.tablewidget.client.properties.OpHistoryProperties;
+import org.gcube.portlets.user.td.tablewidget.client.resources.ResourceBundle;
import org.gcube.portlets.user.td.tablewidget.client.util.UtilsGXT3;
import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.cell.client.AbstractCell;
+import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
@@ -31,6 +36,8 @@ import com.sencha.gxt.data.shared.loader.LoadResultListStoreBinding;
import com.sencha.gxt.widget.core.client.FramedPanel;
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer;
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData;
+import com.sencha.gxt.widget.core.client.event.SelectEvent;
+import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;
import com.sencha.gxt.widget.core.client.grid.ColumnConfig;
import com.sencha.gxt.widget.core.client.grid.ColumnModel;
import com.sencha.gxt.widget.core.client.grid.Grid;
@@ -56,6 +63,9 @@ public class HistoryPanel extends FramedPanel {
protected ListStore store;
protected ListLoader> loader;
protected Grid grid;
+ private OpHistory currentOpHistory;
+ private int currentRowIndex;
+ private RollBackSession rollBackSession;
public HistoryPanel(EventBus eventBus) {
super();
@@ -103,8 +113,27 @@ public class HistoryPanel extends FramedPanel {
ColumnConfig nameCol = new ColumnConfig(
props.name(), 32, "Name");
ColumnConfig dateCol = new ColumnConfig(
- props.date(), 32, "Date");
+ props.date(), 26, "Date");
+
+ ColumnConfig rollBackColumn = new ColumnConfig(
+ props.name(), 24);
+ ActionButtonCell button = new ActionButtonCell();
+ button.setIcon(ResourceBundle.INSTANCE.undo());
+ button.setTitle("Rollback");
+ button.addSelectHandler(new SelectHandler() {
+
+ @Override
+ public void onSelect(SelectEvent event) {
+ Log.debug("Button RollBack Pressed");
+ Context c = event.getContext();
+ int rowIndex = c.getIndex();
+ startReplaceEntry(rowIndex);
+ }
+ });
+
+ rollBackColumn.setCell(button);
+
List> l = new ArrayList>();
l.add(expander);
l.add(nameCol);
@@ -162,7 +191,45 @@ public class HistoryPanel extends FramedPanel {
add(v);
}
+
+ protected void startReplaceEntry(int rowIndex) {
+ currentRowIndex = rowIndex;
+ currentOpHistory = store.get(rowIndex);
+ Log.debug(currentOpHistory.toString() + " was clicked.[rowIndex="
+ + currentRowIndex + " ]");
+ callRollBack();
+
+ }
+
+ protected void callRollBack(){
+ rollBackSession=new RollBackSession(trId, currentOpHistory.getHistoryId());
+ TDGWTServiceAsync.INSTANCE.rollBack(rollBackSession, new AsyncCallback() {
+ public void onFailure(Throwable caught) {
+ Log.error("Error in rollback: "
+ + caught.getLocalizedMessage());
+ UtilsGXT3.alert("Error in rollback",
+ "Error in rollback");
+
+ }
+
+ public void onSuccess(Void result) {
+ Log.debug("Rollback started");
+ callRollBackProgressDialog();
+ }
+
+ });
+ }
+
+
+ protected void callRollBackProgressDialog() {
+ RollBackProgressDialog dialog = new RollBackProgressDialog(
+ rollBackSession, eventBus);
+ dialog.show();
+
+ }
+
+
protected void loadData(ListLoadConfig loadConfig,
final AsyncCallback> callback) {
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/progress/RollBackProgressBarUpdater.java b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/progress/RollBackProgressBarUpdater.java
new file mode 100644
index 0000000..68d849d
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/progress/RollBackProgressBarUpdater.java
@@ -0,0 +1,75 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.tablewidget.client.progress;
+
+
+
+
+import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.sencha.gxt.widget.core.client.ProgressBar;
+
+/**
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public class RollBackProgressBarUpdater implements RollBackProgressListener {
+
+ protected ProgressBar progressBar;
+
+ /**
+ * Creates a new {@link ProgressBar} updater.
+ * @param progressBar the {@link ProgressBar} to update.
+ */
+ public RollBackProgressBarUpdater(ProgressBar progressBar) {
+ this.progressBar = progressBar;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void operationComplete(TRId trId) {
+ Log.info("Completed");
+ progressBar.updateProgress(1, "Completed");
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void operationFailed(Throwable caught, String reason, String failureDetails) {
+ Log.info("Failed");
+ progressBar.updateText("Failed");
+ }
+
+ public void operationInitializing() {
+ Log.info("Inizializing");
+ progressBar.updateProgress(0, "Initializing...");
+ }
+
+ public void operationUpdate(float elaborated) {
+ Log.info("Elaborated: "+elaborated);
+ if (elaborated == 0) progressBar.updateProgress(0, "Initializing...");
+ if (elaborated>0 && elaborated<1) {
+ Log.trace("progress "+elaborated);
+ int elab=new Float(elaborated*100).intValue();
+ progressBar.updateProgress(elaborated,elab+"% Progress...");
+ }
+ if (elaborated == 1) progressBar.updateProgress(1, "Completing...");
+
+ }
+
+
+ @Override
+ public void operationStopped(TRId trId,String reason, String details) {
+ Log.debug("Operation Stopped: ["+trId.toString()+", "+reason+", "+details+"]");
+ progressBar.updateText("Validations failed");
+
+ }
+
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/progress/RollBackProgressDialog.java b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/progress/RollBackProgressDialog.java
new file mode 100644
index 0000000..1c17623
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/progress/RollBackProgressDialog.java
@@ -0,0 +1,125 @@
+package org.gcube.portlets.user.td.tablewidget.client.progress;
+
+import org.gcube.portlets.user.td.gwtservice.shared.history.RollBackSession;
+import org.gcube.portlets.user.td.tablewidget.client.util.UtilsGXT3;
+import org.gcube.portlets.user.td.widgetcommonevent.client.event.ChangeTableRequestEvent;
+import org.gcube.portlets.user.td.widgetcommonevent.client.type.ChangeTableRequestType;
+import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.google.web.bindery.event.shared.EventBus;
+import com.sencha.gxt.core.client.util.Margins;
+import com.sencha.gxt.widget.core.client.FramedPanel;
+import com.sencha.gxt.widget.core.client.ProgressBar;
+import com.sencha.gxt.widget.core.client.Window;
+import com.sencha.gxt.widget.core.client.button.TextButton;
+import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer;
+import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData;
+import com.sencha.gxt.widget.core.client.event.SelectEvent;
+import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;
+
+/**
+ *
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public class RollBackProgressDialog extends Window implements RollBackProgressListener {
+ public static final int STATUS_POLLING_DELAY = 1000;
+ protected String WIDTH = "400px";
+ protected String HEIGHT = "120px";
+ protected RollBackSession rollBackSession;
+ protected EventBus eventBus;
+ protected RollBackProgressUpdater progressUpdater;
+ protected TextButton ok;
+ protected TRId trId;
+
+ public RollBackProgressDialog(RollBackSession rollBackSession, EventBus eventBus) {
+ this.rollBackSession=rollBackSession;
+ this.eventBus=eventBus;
+ setWidth(WIDTH);
+ setHeight(HEIGHT);
+ setBodyBorder(false);
+ setResizable(true);
+ setModal(true);
+ setHeadingText("Rollback Progress");
+
+ trId=null;
+
+ FramedPanel panel=new FramedPanel();
+ panel.setHeaderVisible(false);
+ panel.setBodyBorder(false);
+
+ VerticalLayoutContainer v = new VerticalLayoutContainer();
+
+
+ ProgressBar progressBar = new ProgressBar();
+
+ ok=new TextButton("OK");
+ ok.addSelectHandler(new SelectHandler() {
+
+ public void onSelect(SelectEvent event) {
+ updateInvocation();
+
+ }
+ });
+
+ v.add(progressBar, new VerticalLayoutData(1,
+ 1, new Margins(5, 5, 5, 5)));
+
+ panel.add(v);
+ panel.addButton(ok);
+ add(panel);
+
+
+ progressUpdater = new RollBackProgressUpdater();
+ progressUpdater.addListener(new RollBackProgressBarUpdater(progressBar));
+
+ progressUpdater.addListener(this);
+ progressUpdater.scheduleRepeating(STATUS_POLLING_DELAY);
+ show();
+ ok.setVisible(false);
+
+ }
+
+ public void operationInitializing() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void operationUpdate(float elaborated) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void operationComplete(TRId trId) {
+ Log.debug("Operation Complete return: "+trId.toString());
+ this.trId=trId;
+ updateInvocation();
+ }
+
+ public void operationFailed(Throwable caught, String reason,
+ String failureDetails) {
+ ok.setVisible(true);
+ this.trId=null;
+ UtilsGXT3.alert("Error in RollBack", reason);
+
+ }
+
+ public void updateInvocation(){
+ if(trId!=null){
+ ChangeTableRequestEvent changeTableRequestEvent=
+ new ChangeTableRequestEvent(ChangeTableRequestType.DELETEROWS, trId);
+ eventBus.fireEvent(changeTableRequestEvent);
+ }
+ hide();
+ }
+
+ @Override
+ public void operationStopped(TRId trId,String reason, String details) {
+ Log.debug("Operation Stopped: ["+trId.toString()+", "+reason+", "+details+"]");
+ ok.setVisible(true);
+ this.trId=trId;
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/progress/RollBackProgressListener.java b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/progress/RollBackProgressListener.java
new file mode 100644
index 0000000..c7f6c1b
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/progress/RollBackProgressListener.java
@@ -0,0 +1,52 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.tablewidget.client.progress;
+
+import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
+
+
+
+/**
+ * Defines a listener for operation progress.
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public interface RollBackProgressListener {
+
+ /**
+ * Called when the operation is starting.
+ */
+ public void operationInitializing();
+
+ /**
+ * Called when there is a progress for the operation.
+ * @param elaborated the elaborated part.
+ */
+ public void operationUpdate(float elaborated);
+
+
+ /**
+ * Called when the operation is complete.
+ */
+ public void operationComplete(TRId trId);
+
+ /**
+ * Called when the operation is failed.
+ * @param caught the failure exception.
+ * @param reason the failure reason.
+ */
+ public void operationFailed(Throwable caught, String reason, String failureDetails);
+
+ /**
+ * Called when the operation is stopped
+ *
+ * @param trId
+ * @param reason
+ * @param details
+ */
+ public void operationStopped(TRId trId, String reason, String details);
+
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/progress/RollBackProgressUpdater.java b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/progress/RollBackProgressUpdater.java
new file mode 100644
index 0000000..9a2e458
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/progress/RollBackProgressUpdater.java
@@ -0,0 +1,181 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.tablewidget.client.progress;
+
+import java.util.ArrayList;
+
+import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync;
+import org.gcube.portlets.user.td.gwtservice.shared.history.RollBackSessionMonitor;
+import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+
+/**
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public class RollBackProgressUpdater extends Timer {
+
+ protected ArrayList listeners = new ArrayList();
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void run() {
+ Log.debug("requesting operation progress");
+ TDGWTServiceAsync.INSTANCE
+ .getRollBackMonitor(new AsyncCallback() {
+
+
+ public void onFailure(Throwable caught) {
+ cancel();
+ Log.error("Error retrieving the operation state",
+ caught);
+ String message = getStack(caught);
+ fireOperationFailed(caught,
+ "Failed getting operation updates", message);
+ }
+
+ public void onSuccess(RollBackSessionMonitor result) {
+ Log.info("retrieved DeleteRowsMonitor: "
+ + result.getStatus());
+ switch (result.getStatus()) {
+ case INITIALIZING:
+ Log.info("Initializing...");
+ fireOperationInitializing();
+ break;
+ case ABORTED:
+ cancel();
+ Log.info("Delete Rows Operation Aborted");
+ break;
+ case IN_PROGRESS:
+ fireOperationUpdate(result.getProgress());
+ break;
+ case VALIDATING_RULES:
+ fireOperationUpdate(result.getProgress());
+ break;
+ case STOPPED:
+ cancel();
+ stopMessage(result);
+ break;
+ case FAILED:
+ cancel();
+ errorMessage(result);
+ break;
+ case SUCCEDED:
+ cancel();
+ Log.info("Fisnish TableId :"
+ + result.getTrId());
+ fireOperationComplete(result.getTrId());
+ break;
+ default:
+ Log.info("Unknow State");
+ break;
+ }
+
+ }
+
+
+
+ });
+
+ }
+
+ protected void errorMessage(RollBackSessionMonitor result) {
+ Log.info("RollBack Failed");
+ Throwable th = null;
+ String failure = null;
+ String details = null;
+ if (result.getError() != null) {
+ th = result.getError();
+ failure = "Failed Client Library rollback";
+ details = result.getError().getLocalizedMessage();
+ } else {
+ th = new Throwable("Failed");
+ failure = "Failed Client Library rollback";
+ details = "Rollback failed";
+ }
+
+ fireOperationFailed(th, failure, details);
+ }
+
+ protected void stopMessage(RollBackSessionMonitor result) {
+ Log.info("RollBack Stopped");
+ String failure = null;
+ String details = null;
+ if (result.getError() != null) {
+ failure = "Stopped rollback";
+ details = result.getError().getLocalizedMessage();
+ } else {
+ failure = "Stopped rollback";
+ details = "Rollback stopped";
+ }
+
+ fireOperationStopped(result.getTrId(),failure, details);
+ }
+
+
+ protected String getStack(Throwable e) {
+ String message = e.getLocalizedMessage() + " ->
";
+ Throwable c = e.getCause();
+ if (c != null)
+ message += getStack(c);
+ return message;
+ }
+
+ protected void fireOperationInitializing() {
+ for (RollBackProgressListener listener : listeners)
+ listener.operationInitializing();
+ }
+
+ protected void fireOperationUpdate(float elaborated) {
+ for (RollBackProgressListener listener : listeners)
+ listener.operationUpdate(elaborated);
+ }
+
+ protected void fireOperationComplete(TRId trId) {
+ for (RollBackProgressListener listener : listeners)
+ listener.operationComplete(trId);
+ }
+
+ protected void fireOperationFailed(Throwable caught, String failure,
+ String failureDetails) {
+ for (RollBackProgressListener listener : listeners)
+ listener.operationFailed(caught, failure, failureDetails);
+ }
+
+ protected void fireOperationStopped(TRId trId, String reason, String details) {
+ for (RollBackProgressListener listener : listeners)
+ listener.operationStopped(trId,reason, details);
+ }
+
+
+ /**
+ * Add a new {@link RollBackProgressListener} to this
+ * {@link RollBackProgressUpdater}.
+ *
+ * @param listener
+ * the listener to add.
+ */
+ public void addListener(RollBackProgressListener listener) {
+ listeners.add(listener);
+ }
+
+ /**
+ * Removes the specified {@link RollBackProgressListener} from this
+ * {@link RollBackProgressUpdater}.
+ *
+ * @param listener
+ * the listener to remove.
+ */
+ public void removeListener(RollBackProgressListener listener) {
+ listeners.remove(listener);
+ }
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/properties/OpHistoryProperties.java b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/properties/OpHistoryProperties.java
index 0b2b143..9ed3f8d 100644
--- a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/properties/OpHistoryProperties.java
+++ b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/properties/OpHistoryProperties.java
@@ -20,7 +20,7 @@ public interface OpHistoryProperties extends
ModelKeyProvider id();
ValueProvider name();
- ValueProvider decription();
+ ValueProvider description();
ValueProvider date();
}
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/ResourceBundle.java b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/ResourceBundle.java
index 3558ae4..469010a 100644
--- a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/ResourceBundle.java
+++ b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/ResourceBundle.java
@@ -52,4 +52,16 @@ public interface ResourceBundle extends ClientBundle {
@Source("ok_32.png")
ImageResource ok32();
+ @Source("arrow-undo.png")
+ ImageResource undo();
+
+ @Source("arrow-undo_32.png")
+ ImageResource undo32();
+
+ @Source("arrow-undo-all.png")
+ ImageResource undoAll();
+
+ @Source("arrow-undo-all_32.png")
+ ImageResource undoAll32();
+
}
\ No newline at end of file
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo-all.png b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo-all.png
new file mode 100644
index 0000000..54755c7
Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo-all.png differ
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo-all_32.png b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo-all_32.png
new file mode 100644
index 0000000..3232d49
Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo-all_32.png differ
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo.png b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo.png
new file mode 100644
index 0000000..5a6c52e
Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo.png differ
diff --git a/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo_32.png b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo_32.png
new file mode 100644
index 0000000..9295f42
Binary files /dev/null and b/src/main/java/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo_32.png differ
diff --git a/src/main/resources/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo-all.png b/src/main/resources/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo-all.png
new file mode 100644
index 0000000..54755c7
Binary files /dev/null and b/src/main/resources/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo-all.png differ
diff --git a/src/main/resources/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo-all_32.png b/src/main/resources/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo-all_32.png
new file mode 100644
index 0000000..3232d49
Binary files /dev/null and b/src/main/resources/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo-all_32.png differ
diff --git a/src/main/resources/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo.png b/src/main/resources/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo.png
new file mode 100644
index 0000000..5a6c52e
Binary files /dev/null and b/src/main/resources/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo.png differ
diff --git a/src/main/resources/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo_32.png b/src/main/resources/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo_32.png
new file mode 100644
index 0000000..9295f42
Binary files /dev/null and b/src/main/resources/org/gcube/portlets/user/td/tablewidget/client/resources/arrow-undo_32.png differ