diff --git a/.gwt/.gwt-log b/.gwt/.gwt-log
index d029c07..ba05a90 100644
--- a/.gwt/.gwt-log
+++ b/.gwt/.gwt-log
@@ -1734,3 +1734,35 @@ Compiling...
Compilation completed in 0.00 seconds
Removing invalidated units
Finding entry point classes
+Public resources found in...
+Translatable source found in...
+Found 0 cached/archived units. Used 0 / 2719 units from cache.
+Compiling...
+ 30% complete (ETR: 10 seconds)
+ 30% complete (ETR: 10 seconds)
+ 30% complete (ETR: 10 seconds)
+ 30% complete (ETR: 10 seconds)
+ 40% complete (ETR: 8 seconds)
+ 50% complete (ETR: 6 seconds)
+ 60% complete (ETR: 4 seconds)
+ 70% complete (ETR: 3 seconds)
+ 80% complete (ETR: 2 seconds)
+ 90% complete (ETR: 1 seconds)
+ 100% complete (ETR: 0 seconds)
+ Compilation completed in 18.13 seconds
+Removing invalidated units
+Finding entry point classes
+Public resources found in...
+Translatable source found in...
+Found 2719 cached/archived units. Used 2719 / 2719 units from cache.
+Compiling...
+ Compilation completed in 0.00 seconds
+Removing invalidated units
+Finding entry point classes
+Public resources found in...
+Translatable source found in...
+Found 2719 cached/archived units. Used 2719 / 2719 units from cache.
+Compiling...
+ Compilation completed in 0.00 seconds
+Removing invalidated units
+Finding entry point classes
diff --git a/src/main/java/org/gcube/portlets/user/td/columnwidget/client/ChangeColumnTypePanel.java b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/ChangeColumnTypePanel.java
index 8a67d15..f55ebe1 100644
--- a/src/main/java/org/gcube/portlets/user/td/columnwidget/client/ChangeColumnTypePanel.java
+++ b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/ChangeColumnTypePanel.java
@@ -46,12 +46,9 @@ import com.sencha.gxt.data.shared.loader.ListLoadResultBean;
import com.sencha.gxt.data.shared.loader.ListLoader;
import com.sencha.gxt.data.shared.loader.LoadResultListStoreBinding;
import com.sencha.gxt.widget.core.client.FramedPanel;
-import com.sencha.gxt.widget.core.client.box.AlertMessageBox;
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.HideEvent;
-import com.sencha.gxt.widget.core.client.event.HideEvent.HideHandler;
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.event.TriggerClickEvent;
diff --git a/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/BatchReplaceDialog.java b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/BatchReplaceDialog.java
index 76ee390..25e1dd3 100644
--- a/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/BatchReplaceDialog.java
+++ b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/BatchReplaceDialog.java
@@ -4,6 +4,8 @@ import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
import com.google.web.bindery.event.shared.EventBus;
import com.sencha.gxt.widget.core.client.Window;
+import com.sencha.gxt.widget.core.client.event.SelectEvent;
+import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;
/**
@@ -20,16 +22,51 @@ public class BatchReplaceDialog extends Window {
public BatchReplaceDialog(TRId trId, String columnName, EventBus eventBus) {
- setWidth(WIDTH);
- setHeight(HEIGHT);
- setBodyBorder(false);
- setResizable(false);
- setHeadingText("Change Column Type");
//getHeader().setIcon(Resources.IMAGES.side_list());
this.trId=trId;
this.columnName=columnName;
+ initWindow();
BatchReplacePanel batchRepalcePanel= new BatchReplacePanel(trId,columnName,eventBus);
add(batchRepalcePanel);
}
+
+ protected void initWindow() {
+ setWidth(WIDTH);
+ setHeight(HEIGHT);
+ setBodyBorder(false);
+ setResizable(false);
+ setHeadingText("Replace Value");
+ setClosable(true);
+ setModal(true);
+ forceLayoutOnResize = true;
+ //getHeader().setIcon(ColumnResources.INSTANCE.rule());
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void initTools() {
+ super.initTools();
+
+ closeBtn.addSelectHandler(new SelectHandler() {
+
+
+ public void onSelect(SelectEvent event) {
+ close();
+ }
+ });
+
+ }
+
+ protected void close (){
+ /*ExpressionEvent expressionEvent = new ExpressionEvent(
+ ExpressionType.EXPRESSIONNULL);
+ //Log.debug(expressionEvent.toString());*/
+ hide();
+ //eventBus.fireEvent(expressionEvent);
+ }
+
}
diff --git a/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/BatchReplacePanel.java b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/BatchReplacePanel.java
index 35f24d4..3db1b63 100644
--- a/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/BatchReplacePanel.java
+++ b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/BatchReplacePanel.java
@@ -5,25 +5,37 @@ import java.util.List;
import org.gcube.portlets.user.td.columnwidget.client.ChangeColumnTypeDialog;
import org.gcube.portlets.user.td.columnwidget.client.dimension.CodelistSelectionListener;
+import org.gcube.portlets.user.td.columnwidget.client.utils.UtilsGXT3;
+import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync;
+import org.gcube.portlets.user.td.gwtservice.shared.tr.ColumnData;
import org.gcube.portlets.user.td.gwtservice.shared.tr.TabResource;
import org.gcube.portlets.user.td.gwtservice.shared.tr.batch.Occurences;
import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
import com.allen_sauer.gwt.log.client.Log;
+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;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.web.bindery.event.shared.EventBus;
+import com.sencha.gxt.cell.core.client.TextButtonCell;
import com.sencha.gxt.core.client.IdentityValueProvider;
import com.sencha.gxt.core.client.Style.SelectionMode;
+import com.sencha.gxt.core.client.util.Format;
+import com.sencha.gxt.core.client.util.Margins;
import com.sencha.gxt.data.client.loader.RpcProxy;
import com.sencha.gxt.data.shared.ListStore;
import com.sencha.gxt.data.shared.loader.ListLoadConfig;
import com.sencha.gxt.data.shared.loader.ListLoadResult;
+import com.sencha.gxt.data.shared.loader.ListLoadResultBean;
import com.sencha.gxt.data.shared.loader.ListLoader;
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.form.TextField;
import com.sencha.gxt.widget.core.client.grid.CheckBoxSelectionModel;
import com.sencha.gxt.widget.core.client.grid.ColumnConfig;
@@ -33,9 +45,9 @@ import com.sencha.gxt.widget.core.client.grid.RowNumberer;
/**
*
- * @author "Giancarlo Panichi"
- * g.panichi@isti.cnr.it
- *
+ * @author "Giancarlo Panichi" g.panichi@isti.cnr.it
+ *
*/
public class BatchReplacePanel extends FramedPanel implements
CodelistSelectionListener {
@@ -46,11 +58,17 @@ public class BatchReplacePanel extends FramedPanel implements
protected TextField label = null;
protected TRId trId;
protected String columnName;
+ protected ColumnData column;
+
+ protected static final String DON_T_REPLACE = "Don't replace";
- protected ListLoader> loader;
- protected Grid grid;
+ protected ListLoader> loader;
+ protected Grid grid;
+ protected ListStore store;
+
public BatchReplacePanel(TRId trId, String columnName, EventBus eventBus) {
+ Log.debug("BatchReplacePanel:["+trId+", columnName:"+columnName+"]");
setWidth(WIDTH);
setHeight(HEIGHT);
setHeaderVisible(false);
@@ -58,52 +76,78 @@ public class BatchReplacePanel extends FramedPanel implements
this.trId = trId;
this.columnName = columnName;
this.eventBus = eventBus;
- Log.debug("Create BatchReplacePanel(): [" + trId.toString()+" , columnName:"+columnName + "]");
- create();
- }
-
-
- protected void create(){
+ Log.debug("Create BatchReplacePanel(): [" + trId.toString()
+ + " , columnName:" + columnName + "]");
+ UtilsGXT3.mask(this.getElement());
+ retrieveColumn();
- IdentityValueProvider identity=new IdentityValueProvider();
- CheckBoxSelectionModel sm = new CheckBoxSelectionModel(
+ }
+
+ protected void create() {
+
+ IdentityValueProvider identity = new IdentityValueProvider();
+ CheckBoxSelectionModel sm = new CheckBoxSelectionModel(
identity);
- RowNumberer number = new RowNumberer(identity);
-
- OccurencesProperties props = GWT.create(OccurencesProperties.class);
+ RowNumberer number = new RowNumberer(identity);
-
- ColumnConfig valueCol = new ColumnConfig(
+ ReplaceEntryProperties props = GWT.create(ReplaceEntryProperties.class);
+
+ ColumnConfig valueCol = new ColumnConfig(
props.value());
- ColumnConfig numberCol = new ColumnConfig(
+ ColumnConfig numberCol = new ColumnConfig(
props.number());
+ ColumnConfig replacementValueCol = new ColumnConfig(
+ props.replacementValue());
+ /*ColumnConfig replacementIdCol = new ColumnConfig(
+ props.replacementId());
+ */
+ ColumnConfig changeColumn = new ColumnConfig(
+ props.value());
-
- List> l = new ArrayList>();
+ TextButtonCell button = new TextButtonCell();
+ // button.setIcon(resources.image());
+ // button.setTitle("Change Value");
+ button.addSelectHandler(new SelectHandler() {
+
+ @Override
+ public void onSelect(SelectEvent event) {
+ Context c = event.getContext();
+ int row = c.getIndex();
+ ReplaceEntry re = store.get(row);
+ Log.debug("ReplaceEntry " + re.toString() + " was clicked.");
+ }
+ });
+
+ changeColumn.setCell(button);
+
+ List> l = new ArrayList>();
l.add(number);
l.add(valueCol);
l.add(numberCol);
- ColumnModel cm = new ColumnModel(l);
+ l.add(replacementValueCol);
+ //l.add(replacementIdCol);
+ l.add(changeColumn);
+ ColumnModel cm = new ColumnModel(l);
- ListStore store = new ListStore(props.id());
+ store = new ListStore(props.id());
- RpcProxy> proxy = new RpcProxy>() {
+ RpcProxy> proxy = new RpcProxy>() {
public void load(ListLoadConfig loadConfig,
- final AsyncCallback> callback) {
+ final AsyncCallback> callback) {
loadData(loadConfig, callback);
}
};
- loader = new ListLoader>(
+ loader = new ListLoader>(
proxy);
loader.setRemoteSort(false);
- loader.addLoadHandler(new LoadResultListStoreBinding>(
+ loader.addLoadHandler(new LoadResultListStoreBinding>(
store) {
});
- grid = new Grid(store, cm) {
+ grid = new Grid(store, cm) {
@Override
protected void onAfterFirstAttach() {
super.onAfterFirstAttach();
@@ -119,62 +163,149 @@ public class BatchReplacePanel extends FramedPanel implements
sm.setSelectionMode(SelectionMode.MULTI);
grid.setLoader(loader);
grid.setSelectionModel(sm);
- //grid.getView().setAutoExpandColumn(labelCol);
- //grid.setHeight(360);
+ number.initPlugin(grid);
+ // grid.getView().setAutoExpandColumn(labelCol);
+ // grid.setHeight(360);
grid.getView().setStripeRows(true);
grid.getView().setColumnLines(true);
- grid.getView().setAutoFill(true);
+ grid.getView().setAutoFill(true);
grid.setBorders(false);
grid.setLoadMask(true);
grid.setColumnReordering(true);
grid.setColumnResize(false);
+ VerticalLayoutContainer v = new VerticalLayoutContainer();
+ v.add(grid, new VerticalLayoutData(-1, -1, new Margins(0)));
+ UtilsGXT3.umask(this.getElement());
+ add(v);
+
+
+ }
+
+
+ protected void retrieveColumn(){
+ TDGWTServiceAsync.INSTANCE.getColumn(trId, columnName,
+ new AsyncCallback() {
+
+ public void onFailure(Throwable caught) {
+ Log.error("load column failure:"
+ + caught.getLocalizedMessage());
+ UtilsGXT3.alert("Error retrieving column",
+ "Error retrieving column");
+
+ }
+
+ public void onSuccess(ColumnData result) {
+ Log.debug("Column: "+result);
+ column=result;
+ create();
+ }
+
+ });
}
-
protected void loadData(ListLoadConfig loadConfig,
- final AsyncCallback> callback) {
- /*TDGWTServiceAsync.INSTANCE.getColumns(trId,
+ final AsyncCallback> callback) {
+
+ TDGWTServiceAsync.INSTANCE.getOccurencesForBatchReplace(column,
new AsyncCallback>() {
public void onFailure(Throwable caught) {
Log.error("load columns failure:"
+ caught.getLocalizedMessage());
- alert("Error retrieving columns",
+ UtilsGXT3.alert("Error retrieving columns",
"Error retrieving columns");
callback.onFailure(caught);
}
- public void onSuccess(ArrayList result) {
- Log.trace("loaded " + result.size() + " ColumnData");
- callback.onSuccess(new ListLoadResultBean(
- result));
+ public void onSuccess(ArrayList result) {
+ Log.trace("loaded " + result.size() + " Occurences");
+ callback.onSuccess(new ListLoadResultBean(
+ getRecord(result)));
}
});
- */
+
+ }
+
+ protected void updateInfo() {
+ Log.trace("updating the info bar");
+ int total = store.size();
+ int totalErrors = 0;
+ int assignedErrors = 0;
+ int assigned = 0;
+ for (ReplaceEntry record : store.getAll()) {
+ int errors = record.getNumber();
+ totalErrors += errors;
+ if (record.getReplacementValue() != null) {
+ assigned++;
+ assignedErrors += errors;
+ }
+ }
+
+ String text = Format
+ .substitute("Assigned {0} ({1} error occurence) of {2} ({3} error occurence)",
+ String.valueOf(assigned),
+ String.valueOf(assignedErrors), String.valueOf(total),
+ String.valueOf(totalErrors));
+ //infoText.setText(text);
+ Log.debug(text);
+ }
+
+ /*public ArrayList getReplaceEntries() {
+ ArrayList entries = new ArrayList();
+ for (ReplaceEntry record : store.getAll() {
+ if (record.getAsString(REPLACE_ID_FIELD) != null) {
+ ReplaceEntry entry = new ReplaceEntry(
+ record.getAsString(ERROR_VALUE_FIELD),
+ record.getAsString(REPLACE_VALUE_FIELD),
+ record.getAsString(REPLACE_ID_FIELD));
+ entries.add(entry);
+ }
+ }
+ return entries;
+ }
+
+ protected void updateEntries(ArrayList entries) {
+ store.clear();
+ ArrayList records = getRecord(entries);
+ store.addAll(records);
+ store.commitChanges();
+ }*/
+
+ protected ArrayList getRecord(ArrayList entries) {
+ ArrayList records = new ArrayList();
+ for (Occurences entry : entries)
+ records.add(getRecord(entry));
+ return records;
+ }
+
+ protected ReplaceEntry getRecord(Occurences entry) {
+ ReplaceEntry data = new ReplaceEntry(entry.getValue(), entry.getNumber(),
+ DON_T_REPLACE, null);
+ return data;
}
-
@Override
public void selected(TabResource tabResource) {
// TODO Auto-generated method stub
-
- }
+ }
@Override
public void aborted() {
// TODO Auto-generated method stub
-
- }
+ }
@Override
public void failed(String reason, String detail) {
// TODO Auto-generated method stub
-
+
}
+
+
+
}
diff --git a/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/ReplaceEntry.java b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/ReplaceEntry.java
new file mode 100644
index 0000000..1afc902
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/ReplaceEntry.java
@@ -0,0 +1,66 @@
+package org.gcube.portlets.user.td.columnwidget.client.batch;
+
+
+class ReplaceEntry {
+
+ protected String value;
+ protected Integer number;
+ protected String replacementValue;
+ protected String replacementId;
+
+ /**
+ * @param errorValue
+ * @param replacementValue
+ * @param replacementId
+ */
+ public ReplaceEntry(String value, Integer number, String replacementValue, String replacementId) {
+ this.value = value;
+ this.number = number;
+ this.replacementValue = replacementValue;
+ this.replacementId = replacementId;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public Integer getNumber() {
+ return number;
+ }
+
+ public void setNumber(Integer number) {
+ this.number = number;
+ }
+
+ public String getReplacementValue() {
+ return replacementValue;
+ }
+
+ public void setReplacementValue(String replacementValue) {
+ this.replacementValue = replacementValue;
+ }
+
+ public String getReplacementId() {
+ return replacementId;
+ }
+
+ public void setReplacementId(String replacementId) {
+ this.replacementId = replacementId;
+ }
+
+ @Override
+ public String toString() {
+ return "ReplaceEntry [value=" + value + ", number=" + number
+ + ", replacementValue=" + replacementValue + ", replacementId="
+ + replacementId + "]";
+ }
+
+
+
+
+}
+
diff --git a/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/ReplaceEntryProperties.java b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/ReplaceEntryProperties.java
new file mode 100644
index 0000000..8083e4b
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/batch/ReplaceEntryProperties.java
@@ -0,0 +1,27 @@
+/**
+ *
+ */
+package org.gcube.portlets.user.td.columnwidget.client.batch;
+
+import com.google.gwt.editor.client.Editor.Path;
+import com.sencha.gxt.core.client.ValueProvider;
+import com.sencha.gxt.data.shared.ModelKeyProvider;
+import com.sencha.gxt.data.shared.PropertyAccess;
+
+/**
+ *
+ * @author "Giancarlo Panichi"
+ * g.panichi@isti.cnr.it
+ *
+ */
+public interface ReplaceEntryProperties extends PropertyAccess {
+
+ @Path("value")
+ ModelKeyProvider id();
+
+ ValueProvider value();
+ ValueProvider number();
+ ValueProvider replacementValue();
+ ValueProvider replacementId();
+
+}
diff --git a/src/main/java/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButton.css b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButton.css
new file mode 100644
index 0000000..8be4ac0
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/columnwidget/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/columnwidget/client/custom/ActionButton.html b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButton.html
new file mode 100644
index 0000000..5cd8e63
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/columnwidget/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/columnwidget/client/custom/ActionButtonCell.java b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButtonCell.java
new file mode 100644
index 0000000..9d55302
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButtonCell.java
@@ -0,0 +1,79 @@
+package org.gcube.portlets.user.td.columnwidget.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;
+
+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/columnwidget/client/custom/ActionButtonCellAppearance.java b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButtonCellAppearance.java
new file mode 100644
index 0000000..c997d1b
--- /dev/null
+++ b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButtonCellAppearance.java
@@ -0,0 +1,60 @@
+package org.gcube.portlets.user.td.columnwidget.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;
+
+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/columnwidget/client/progress/LabelColumnProgressDialog.java b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/progress/LabelColumnProgressDialog.java
index 3f61b53..81e679d 100644
--- a/src/main/java/org/gcube/portlets/user/td/columnwidget/client/progress/LabelColumnProgressDialog.java
+++ b/src/main/java/org/gcube/portlets/user/td/columnwidget/client/progress/LabelColumnProgressDialog.java
@@ -12,12 +12,9 @@ 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.box.AlertMessageBox;
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.HideEvent;
-import com.sencha.gxt.widget.core.client.event.HideEvent.HideHandler;
import com.sencha.gxt.widget.core.client.event.SelectEvent;
import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;
diff --git a/src/main/resources/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButton.css b/src/main/resources/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButton.css
new file mode 100644
index 0000000..8be4ac0
--- /dev/null
+++ b/src/main/resources/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButton.css
@@ -0,0 +1,3 @@
+.image {
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/src/main/resources/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButton.html b/src/main/resources/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButton.html
new file mode 100644
index 0000000..5cd8e63
--- /dev/null
+++ b/src/main/resources/org/gcube/portlets/user/td/columnwidget/client/custom/ActionButton.html
@@ -0,0 +1 @@
+{img}
\ No newline at end of file