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
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

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.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;

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

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.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"
* <a href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
*
* @author "Giancarlo Panichi" <a
* href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
*
*/
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 = "<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) {
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<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);
RowNumberer<Occurences> number = new RowNumberer<Occurences>(identity);
OccurencesProperties props = GWT.create(OccurencesProperties.class);
RowNumberer<ReplaceEntry> number = new RowNumberer<ReplaceEntry>(identity);
ColumnConfig<Occurences, String> valueCol = new ColumnConfig<Occurences, String>(
ReplaceEntryProperties props = GWT.create(ReplaceEntryProperties.class);
ColumnConfig<ReplaceEntry, String> valueCol = new ColumnConfig<ReplaceEntry, String>(
props.value());
ColumnConfig<Occurences, Integer> numberCol = new ColumnConfig<Occurences, Integer>(
ColumnConfig<ReplaceEntry, Integer> numberCol = new ColumnConfig<ReplaceEntry, Integer>(
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());
List<ColumnConfig<Occurences, ?>> l = new ArrayList<ColumnConfig<Occurences, ?>>();
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<ColumnConfig<ReplaceEntry, ?>> l = new ArrayList<ColumnConfig<ReplaceEntry, ?>>();
l.add(number);
l.add(valueCol);
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,
final AsyncCallback<ListLoadResult<Occurences>> callback) {
final AsyncCallback<ListLoadResult<ReplaceEntry>> callback) {
loadData(loadConfig, callback);
}
};
loader = new ListLoader<ListLoadConfig, ListLoadResult<Occurences>>(
loader = new ListLoader<ListLoadConfig, ListLoadResult<ReplaceEntry>>(
proxy);
loader.setRemoteSort(false);
loader.addLoadHandler(new LoadResultListStoreBinding<ListLoadConfig, Occurences, ListLoadResult<Occurences>>(
loader.addLoadHandler(new LoadResultListStoreBinding<ListLoadConfig, ReplaceEntry, ListLoadResult<ReplaceEntry>>(
store) {
});
grid = new Grid<Occurences>(store, cm) {
grid = new Grid<ReplaceEntry>(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<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,
final AsyncCallback<ListLoadResult<Occurences>> callback) {
/*TDGWTServiceAsync.INSTANCE.getColumns(trId,
final AsyncCallback<ListLoadResult<ReplaceEntry>> callback) {
TDGWTServiceAsync.INSTANCE.getOccurencesForBatchReplace(column,
new AsyncCallback<ArrayList<Occurences>>() {
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<ColumnData> result) {
Log.trace("loaded " + result.size() + " ColumnData");
callback.onSuccess(new ListLoadResultBean<ColumnData>(
result));
public void onSuccess(ArrayList<Occurences> result) {
Log.trace("loaded " + result.size() + " Occurences");
callback.onSuccess(new ListLoadResultBean<ReplaceEntry>(
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
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
}
}

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.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;

View File

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

View File

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