Added BatchReplaceDialog

git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/portlets/user/tabular-data-column-widget@93300 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Giancarlo Panichi 2014-03-18 17:22:39 +00:00
parent 18ae973fdc
commit e8a1b578af
13 changed files with 491 additions and 57 deletions

View File

@ -1734,3 +1734,35 @@ Compiling...
Compilation completed in 0.00 seconds Compilation completed in 0.00 seconds
Removing invalidated units Removing invalidated units
Finding entry point classes 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

View File

@ -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.ListLoader;
import com.sencha.gxt.data.shared.loader.LoadResultListStoreBinding; import com.sencha.gxt.data.shared.loader.LoadResultListStoreBinding;
import com.sencha.gxt.widget.core.client.FramedPanel; 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.button.TextButton;
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; 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.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;
import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;
import com.sencha.gxt.widget.core.client.event.TriggerClickEvent; import com.sencha.gxt.widget.core.client.event.TriggerClickEvent;

View File

@ -4,6 +4,8 @@ import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
import com.google.web.bindery.event.shared.EventBus; import com.google.web.bindery.event.shared.EventBus;
import com.sencha.gxt.widget.core.client.Window; 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) { 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()); //getHeader().setIcon(Resources.IMAGES.side_list());
this.trId=trId; this.trId=trId;
this.columnName=columnName; this.columnName=columnName;
initWindow();
BatchReplacePanel batchRepalcePanel= new BatchReplacePanel(trId,columnName,eventBus); BatchReplacePanel batchRepalcePanel= new BatchReplacePanel(trId,columnName,eventBus);
add(batchRepalcePanel); 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);
}
} }

View File

@ -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.ChangeColumnTypeDialog;
import org.gcube.portlets.user.td.columnwidget.client.dimension.CodelistSelectionListener; 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.TabResource;
import org.gcube.portlets.user.td.gwtservice.shared.tr.batch.Occurences; import org.gcube.portlets.user.td.gwtservice.shared.tr.batch.Occurences;
import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId; import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
import com.allen_sauer.gwt.log.client.Log; 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.GWT;
import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.web.bindery.event.shared.EventBus; 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.IdentityValueProvider;
import com.sencha.gxt.core.client.Style.SelectionMode; 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.client.loader.RpcProxy;
import com.sencha.gxt.data.shared.ListStore; import com.sencha.gxt.data.shared.ListStore;
import com.sencha.gxt.data.shared.loader.ListLoadConfig; import com.sencha.gxt.data.shared.loader.ListLoadConfig;
import com.sencha.gxt.data.shared.loader.ListLoadResult; 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.ListLoader;
import com.sencha.gxt.data.shared.loader.LoadResultListStoreBinding; import com.sencha.gxt.data.shared.loader.LoadResultListStoreBinding;
import com.sencha.gxt.widget.core.client.FramedPanel; 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.form.TextField;
import com.sencha.gxt.widget.core.client.grid.CheckBoxSelectionModel; import com.sencha.gxt.widget.core.client.grid.CheckBoxSelectionModel;
import com.sencha.gxt.widget.core.client.grid.ColumnConfig; 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" * @author "Giancarlo Panichi" <a
* <a href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a> * href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
* *
*/ */
public class BatchReplacePanel extends FramedPanel implements public class BatchReplacePanel extends FramedPanel implements
CodelistSelectionListener { CodelistSelectionListener {
@ -46,11 +58,17 @@ public class BatchReplacePanel extends FramedPanel implements
protected TextField label = null; protected TextField label = null;
protected TRId trId; protected TRId trId;
protected String columnName; protected String columnName;
protected ColumnData column;
protected static final String DON_T_REPLACE = "<b>Don't replace</b>";
protected ListLoader<ListLoadConfig, ListLoadResult<Occurences>> loader;
protected Grid<Occurences> grid;
protected ListLoader<ListLoadConfig, ListLoadResult<ReplaceEntry>> loader;
protected Grid<ReplaceEntry> grid;
protected ListStore<ReplaceEntry> store;
public BatchReplacePanel(TRId trId, String columnName, EventBus eventBus) { public BatchReplacePanel(TRId trId, String columnName, EventBus eventBus) {
Log.debug("BatchReplacePanel:["+trId+", columnName:"+columnName+"]");
setWidth(WIDTH); setWidth(WIDTH);
setHeight(HEIGHT); setHeight(HEIGHT);
setHeaderVisible(false); setHeaderVisible(false);
@ -58,52 +76,78 @@ public class BatchReplacePanel extends FramedPanel implements
this.trId = trId; this.trId = trId;
this.columnName = columnName; this.columnName = columnName;
this.eventBus = eventBus; this.eventBus = eventBus;
Log.debug("Create BatchReplacePanel(): [" + trId.toString()+" , columnName:"+columnName + "]"); Log.debug("Create BatchReplacePanel(): [" + trId.toString()
create(); + " , columnName:" + columnName + "]");
} UtilsGXT3.mask(this.getElement());
retrieveColumn();
protected void create(){
IdentityValueProvider<Occurences> identity=new IdentityValueProvider<Occurences>(); }
CheckBoxSelectionModel<Occurences> sm = new CheckBoxSelectionModel<Occurences>(
protected void create() {
IdentityValueProvider<ReplaceEntry> identity = new IdentityValueProvider<ReplaceEntry>();
CheckBoxSelectionModel<ReplaceEntry> sm = new CheckBoxSelectionModel<ReplaceEntry>(
identity); identity);
RowNumberer<Occurences> number = new RowNumberer<Occurences>(identity); RowNumberer<ReplaceEntry> number = new RowNumberer<ReplaceEntry>(identity);
OccurencesProperties props = GWT.create(OccurencesProperties.class);
ReplaceEntryProperties props = GWT.create(ReplaceEntryProperties.class);
ColumnConfig<Occurences, String> valueCol = new ColumnConfig<Occurences, String>(
ColumnConfig<ReplaceEntry, String> valueCol = new ColumnConfig<ReplaceEntry, String>(
props.value()); props.value());
ColumnConfig<Occurences, Integer> numberCol = new ColumnConfig<Occurences, Integer>( ColumnConfig<ReplaceEntry, Integer> numberCol = new ColumnConfig<ReplaceEntry, Integer>(
props.number()); props.number());
ColumnConfig<ReplaceEntry, String> replacementValueCol = new ColumnConfig<ReplaceEntry, String>(
props.replacementValue());
/*ColumnConfig<ReplaceEntry, String> replacementIdCol = new ColumnConfig<ReplaceEntry, String>(
props.replacementId());
*/
ColumnConfig<ReplaceEntry, String> changeColumn = new ColumnConfig<ReplaceEntry, String>(
props.value());
TextButtonCell button = new TextButtonCell();
List<ColumnConfig<Occurences, ?>> l = new ArrayList<ColumnConfig<Occurences, ?>>(); // 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<ColumnConfig<ReplaceEntry, ?>> l = new ArrayList<ColumnConfig<ReplaceEntry, ?>>();
l.add(number); l.add(number);
l.add(valueCol); l.add(valueCol);
l.add(numberCol); l.add(numberCol);
ColumnModel<Occurences> cm = new ColumnModel<Occurences>(l); l.add(replacementValueCol);
//l.add(replacementIdCol);
l.add(changeColumn);
ColumnModel<ReplaceEntry> cm = new ColumnModel<ReplaceEntry>(l);
ListStore<Occurences> store = new ListStore<Occurences>(props.id()); store = new ListStore<ReplaceEntry>(props.id());
RpcProxy<ListLoadConfig, ListLoadResult<Occurences>> proxy = new RpcProxy<ListLoadConfig, ListLoadResult<Occurences>>() { RpcProxy<ListLoadConfig, ListLoadResult<ReplaceEntry>> proxy = new RpcProxy<ListLoadConfig, ListLoadResult<ReplaceEntry>>() {
public void load(ListLoadConfig loadConfig, public void load(ListLoadConfig loadConfig,
final AsyncCallback<ListLoadResult<Occurences>> callback) { final AsyncCallback<ListLoadResult<ReplaceEntry>> callback) {
loadData(loadConfig, callback); loadData(loadConfig, callback);
} }
}; };
loader = new ListLoader<ListLoadConfig, ListLoadResult<Occurences>>( loader = new ListLoader<ListLoadConfig, ListLoadResult<ReplaceEntry>>(
proxy); proxy);
loader.setRemoteSort(false); loader.setRemoteSort(false);
loader.addLoadHandler(new LoadResultListStoreBinding<ListLoadConfig, Occurences, ListLoadResult<Occurences>>( loader.addLoadHandler(new LoadResultListStoreBinding<ListLoadConfig, ReplaceEntry, ListLoadResult<ReplaceEntry>>(
store) { store) {
}); });
grid = new Grid<Occurences>(store, cm) { grid = new Grid<ReplaceEntry>(store, cm) {
@Override @Override
protected void onAfterFirstAttach() { protected void onAfterFirstAttach() {
super.onAfterFirstAttach(); super.onAfterFirstAttach();
@ -119,62 +163,149 @@ public class BatchReplacePanel extends FramedPanel implements
sm.setSelectionMode(SelectionMode.MULTI); sm.setSelectionMode(SelectionMode.MULTI);
grid.setLoader(loader); grid.setLoader(loader);
grid.setSelectionModel(sm); grid.setSelectionModel(sm);
//grid.getView().setAutoExpandColumn(labelCol); number.initPlugin(grid);
//grid.setHeight(360); // grid.getView().setAutoExpandColumn(labelCol);
// grid.setHeight(360);
grid.getView().setStripeRows(true); grid.getView().setStripeRows(true);
grid.getView().setColumnLines(true); grid.getView().setColumnLines(true);
grid.getView().setAutoFill(true); grid.getView().setAutoFill(true);
grid.setBorders(false); grid.setBorders(false);
grid.setLoadMask(true); grid.setLoadMask(true);
grid.setColumnReordering(true); grid.setColumnReordering(true);
grid.setColumnResize(false); 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<ColumnData>() {
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, protected void loadData(ListLoadConfig loadConfig,
final AsyncCallback<ListLoadResult<Occurences>> callback) { final AsyncCallback<ListLoadResult<ReplaceEntry>> callback) {
/*TDGWTServiceAsync.INSTANCE.getColumns(trId,
TDGWTServiceAsync.INSTANCE.getOccurencesForBatchReplace(column,
new AsyncCallback<ArrayList<Occurences>>() { new AsyncCallback<ArrayList<Occurences>>() {
public void onFailure(Throwable caught) { public void onFailure(Throwable caught) {
Log.error("load columns failure:" Log.error("load columns failure:"
+ caught.getLocalizedMessage()); + caught.getLocalizedMessage());
alert("Error retrieving columns", UtilsGXT3.alert("Error retrieving columns",
"Error retrieving columns"); "Error retrieving columns");
callback.onFailure(caught); callback.onFailure(caught);
} }
public void onSuccess(ArrayList<ColumnData> result) { public void onSuccess(ArrayList<Occurences> result) {
Log.trace("loaded " + result.size() + " ColumnData"); Log.trace("loaded " + result.size() + " Occurences");
callback.onSuccess(new ListLoadResultBean<ColumnData>( callback.onSuccess(new ListLoadResultBean<ReplaceEntry>(
result)); 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<ReplaceEntry> getReplaceEntries() {
ArrayList<ReplaceEntry> entries = new ArrayList<ReplaceEntry>();
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<Occurences> entries) {
store.clear();
ArrayList<ReplaceEntry> records = getRecord(entries);
store.addAll(records);
store.commitChanges();
}*/
protected ArrayList<ReplaceEntry> getRecord(ArrayList<Occurences> entries) {
ArrayList<ReplaceEntry> records = new ArrayList<ReplaceEntry>();
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 @Override
public void selected(TabResource tabResource) { public void selected(TabResource tabResource) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
}
}
@Override @Override
public void aborted() { public void aborted() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
}
}
@Override @Override
public void failed(String reason, String detail) { public void failed(String reason, String detail) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
} }

View File

@ -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 + "]";
}
}

View File

@ -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"
* <a href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
*
*/
public interface ReplaceEntryProperties extends PropertyAccess<ReplaceEntry> {
@Path("value")
ModelKeyProvider<ReplaceEntry> id();
ValueProvider<ReplaceEntry, String> value();
ValueProvider<ReplaceEntry, Integer> number();
ValueProvider<ReplaceEntry, String> replacementValue();
ValueProvider<ReplaceEntry, String> replacementId();
}

View File

@ -0,0 +1,3 @@
.image {
cursor: pointer;
}

View File

@ -0,0 +1 @@
<div class="{style.image}" title="{title}">{img}</div>

View File

@ -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<String> implements HasSelectHandlers {
private final ActionButtonCellAppearance appearance;
private ImageResource icon;
private String title;
public ActionButtonCell() {
this(GWT.<ActionButtonCellAppearance> 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<String> 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<String> valueUpdater) {
if (!isDisableEvents() && fireCancellableEvent(context, new BeforeSelectEvent(context))) {
fireEvent(context, new SelectEvent(context));
}
}
}

View File

@ -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);
}
}

View File

@ -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.FramedPanel;
import com.sencha.gxt.widget.core.client.ProgressBar; import com.sencha.gxt.widget.core.client.ProgressBar;
import com.sencha.gxt.widget.core.client.Window; 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.button.TextButton;
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer; 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.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;
import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler; import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;

View File

@ -0,0 +1,3 @@
.image {
cursor: pointer;
}

View File

@ -0,0 +1 @@
<div class="{style.image}" title="{title}">{img}</div>