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