tabular-data-column-widget/src/main/java/org/gcube/portlets/user/td/columnwidget/client/mapping/ColumnMappingPanel.java

565 lines
18 KiB
Java

package org.gcube.portlets.user.td.columnwidget.client.mapping;
import java.util.ArrayList;
import org.gcube.portlets.user.td.columnwidget.client.custom.IconButton;
import org.gcube.portlets.user.td.columnwidget.client.dimension.DimensionRowSelectionDialog;
import org.gcube.portlets.user.td.columnwidget.client.dimension.DimensionRowSelectionListener;
import org.gcube.portlets.user.td.columnwidget.client.dimension.DimensionRowsProperties;
import org.gcube.portlets.user.td.columnwidget.client.resources.ResourceBundle;
import org.gcube.portlets.user.td.columnwidget.client.utils.UtilsGXT3;
import org.gcube.portlets.user.td.gwtservice.shared.tr.DimensionRow;
import org.gcube.portlets.user.td.gwtservice.shared.tr.TabResource;
import org.gcube.portlets.user.td.gwtservice.shared.tr.column.mapping.ColumnMappingData;
import org.gcube.portlets.user.td.gwtservice.shared.tr.column.mapping.ColumnMappingList;
import org.gcube.portlets.user.td.widgetcommonevent.shared.CellData;
import org.gcube.portlets.user.td.widgetcommonevent.shared.TRId;
import org.gcube.portlets.user.td.widgetcommonevent.shared.tr.column.ColumnData;
import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.web.bindery.event.shared.EventBus;
import com.sencha.gxt.cell.core.client.ButtonCell.IconAlign;
import com.sencha.gxt.cell.core.client.form.ComboBoxCell.TriggerAction;
import com.sencha.gxt.core.client.dom.ScrollSupport.ScrollMode;
import com.sencha.gxt.core.client.util.Margins;
import com.sencha.gxt.data.shared.ListStore;
import com.sencha.gxt.widget.core.client.FramedPanel;
import com.sencha.gxt.widget.core.client.button.TextButton;
import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutData;
import com.sencha.gxt.widget.core.client.container.BoxLayoutContainer.BoxLayoutPack;
import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer;
import com.sencha.gxt.widget.core.client.container.HBoxLayoutContainer.HBoxLayoutAlign;
import com.sencha.gxt.widget.core.client.container.SimpleContainer;
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.event.TriggerClickEvent;
import com.sencha.gxt.widget.core.client.event.TriggerClickEvent.TriggerClickHandler;
import com.sencha.gxt.widget.core.client.form.ComboBox;
import com.sencha.gxt.widget.core.client.form.FieldLabel;
/**
*
* @author "Giancarlo Panichi" email: <a
* href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
*
*/
public class ColumnMappingPanel extends FramedPanel {
protected static final String WIDTH = "520px";
protected static final String HEIGHT = "400px";
protected static final String COMBOWIDTH = "220px";
protected static final String CONTAINERHEIGHT = "340px";
protected static final String CONTAINERWIDTH = "500px";
protected ColumnMappingPanel thisPanel;
protected ColumnMappingDialog parent;
protected TRId trId;
protected ColumnData selectedColumn;
protected TabResource dimensionTR;
protected ColumnData referenceColumn;
protected EventBus eventBus;
protected VerticalLayoutContainer vert;
protected String itemIdSourceValueArg;
protected String itemIdTargetValueArg;
protected String itemIdBtnAdd;
protected String itemIdBtnDel;
protected ColumnMappingList columnMappingList;
protected ArrayList<ColumnMappingData> mapping;
private TextButton btnSave;
private TextButton btnClose;
/**
*
*
* @param parent
* @param trId
* @param selectedColumn
* @param dimensionTR
* @param referenceColumn
* @param eventBus
*/
public ColumnMappingPanel(ColumnMappingDialog parent, TRId trId,
ColumnData selectedColumn, TabResource dimensionTR,
ColumnData referenceColumn, EventBus eventBus) {
this.parent = parent;
this.trId = trId;
this.selectedColumn = selectedColumn;
this.dimensionTR = dimensionTR;
this.referenceColumn = referenceColumn;
this.eventBus = eventBus;
thisPanel = this;
Log.debug("ColumnMappingPanel: [parent:" + parent + " , trId:" + trId
+ ", selectedColumn:" + selectedColumn + ", dimensionTR:"
+ dimensionTR + ", columnReference:" + referenceColumn
+ ", eventBus:" + eventBus + "]");
columnMappingList = new ColumnMappingList();
mapping = new ArrayList<ColumnMappingData>();
initPanel();
create();
}
protected void initPanel() {
setHeaderVisible(false);
setBodyBorder(false);
}
protected void create() {
itemIdSourceValueArg = "SourceArg" + selectedColumn.getName();
itemIdTargetValueArg = "TargetArg" + selectedColumn.getName();
SimpleContainer container = new SimpleContainer();
container.setHeight(CONTAINERHEIGHT);
container.setWidth(CONTAINERWIDTH);
btnSave = new TextButton("Save");
btnSave.setIcon(ResourceBundle.INSTANCE.save());
btnSave.setIconAlign(IconAlign.RIGHT);
btnSave.setToolTip("Save");
btnSave.addSelectHandler(new SelectHandler() {
public void onSelect(SelectEvent event) {
Log.debug("Pressed Save");
btnSave.disable();
save();
}
});
btnClose = new TextButton("Close");
btnClose.setIcon(ResourceBundle.INSTANCE.close());
btnClose.setIconAlign(IconAlign.RIGHT);
btnClose.setToolTip("Close");
btnClose.addSelectHandler(new SelectHandler() {
public void onSelect(SelectEvent event) {
Log.debug("Pressed Close");
close();
}
});
HBoxLayoutContainer flowButton = new HBoxLayoutContainer();
flowButton.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE);
flowButton.setPack(BoxLayoutPack.CENTER);
flowButton.add(btnSave, new BoxLayoutData(new Margins(10, 4, 10, 4)));
flowButton.add(btnClose, new BoxLayoutData(new Margins(10, 4, 10, 4)));
vert = new VerticalLayoutContainer();
vert.setScrollMode(ScrollMode.AUTO);
vert.setAdjustForScroll(true);
setColumnMappingData();
container.add(vert);
container.forceLayout();
FieldLabel rowsLabel = new FieldLabel(null, "Select rows");
rowsLabel.getElement().applyStyles("font-weight:bold");
VerticalLayoutContainer vPanel = new VerticalLayoutContainer();
vPanel.add(rowsLabel, new VerticalLayoutData(1, -1, new Margins(1)));
vPanel.add(container, new VerticalLayoutData(1, -1));
vPanel.add(flowButton, new VerticalLayoutData(1, -1, new Margins(1)));
add(vPanel);
forceLayout();
}
protected void save() {
int lenght = vert.getWidgetCount();
int i = 0;
for (; i < lenght; i++) {
HBoxLayoutContainer h = (HBoxLayoutContainer) vert.getWidget(i);
if (h != null) {
@SuppressWarnings("unchecked")
ComboBox<DimensionRow> comboSourceValue = (ComboBox<DimensionRow>) h
.getItemByItemId(itemIdSourceValueArg);
DimensionRow sourceValue = comboSourceValue.getValue();
if (sourceValue != null) {
@SuppressWarnings("unchecked")
ComboBox<DimensionRow> comboTargetValue = (ComboBox<DimensionRow>) h
.getItemByItemId(itemIdTargetValueArg);
DimensionRow targetValue = comboTargetValue.getValue();
if (targetValue != null) {
ColumnMappingData columnMappingData = new ColumnMappingData(
sourceValue, targetValue);
mapping.add(columnMappingData);
}
}
} else {
}
}
if (mapping.size() > 0) {
columnMappingList = new ColumnMappingList("1", "map", mapping);
if (parent != null) {
parent.saveMapping(columnMappingList);
}
} else {
UtilsGXT3.info("Attention", "Creates a valid mapping");
btnSave.enable();
}
}
protected void close() {
if (parent != null) {
parent.close();
}
hide();
}
protected void setColumnMappingData() {
final HBoxLayoutContainer horiz = new HBoxLayoutContainer();
// Source Combo
DimensionRowsProperties propsSource = GWT
.create(DimensionRowsProperties.class);
ListStore<DimensionRow> storeComboSourceValue = new ListStore<DimensionRow>(
propsSource.rowId());
final ComboBox<DimensionRow> comboSourceValue = new ComboBox<DimensionRow>(
storeComboSourceValue, propsSource.value());
comboSourceValue.setItemId(itemIdSourceValueArg);
Log.debug("ComboSourceValue created");
final DimensionRowSelectionListener sourceValueSelectedListener = new DimensionRowSelectionListener() {
@Override
public void selectedDimensionRow(DimensionRow dimensionRow) {
Log.debug("Source DimensionRow selected: " + dimensionRow);
comboSourceValue.setValue(dimensionRow, true);
}
@Override
public void abortedDimensionRowSelection() {
Log.debug("Source DimensionRow selection aborted");
}
@Override
public void failedDimensionRowSelection(String reason, String detail) {
Log.error("Source DimensionRow selection error: " + reason);
}
};
comboSourceValue.addTriggerClickHandler(new TriggerClickHandler() {
@Override
public void onTriggerClick(TriggerClickEvent event) {
Log.debug("ComboSourceValue TriggerClickEvent");
comboSourceValue.collapse();
CellData cellData = new CellData("", selectedColumn.getName(),
selectedColumn.getColumnId(),
selectedColumn.getLabel(), null, 0, 0);
DimensionRowSelectionDialog dimensionRowSelectionDialog = new DimensionRowSelectionDialog(
selectedColumn, cellData, true, false, true, false, true, eventBus);
dimensionRowSelectionDialog
.addListener(sourceValueSelectedListener);
dimensionRowSelectionDialog.show();
}
});
comboSourceValue.setEmptyText("Select a source...");
comboSourceValue.setWidth(COMBOWIDTH);
comboSourceValue.setEditable(false);
comboSourceValue.setTriggerAction(TriggerAction.ALL);
// Target Combo
DimensionRowsProperties propsTarget = GWT
.create(DimensionRowsProperties.class);
ListStore<DimensionRow> storeComboTargetValue = new ListStore<DimensionRow>(
propsTarget.rowId());
final ComboBox<DimensionRow> comboTargetValue = new ComboBox<DimensionRow>(
storeComboTargetValue, propsTarget.value());
comboTargetValue.setItemId(itemIdTargetValueArg);
Log.debug("ComboTargetValue created");
final DimensionRowSelectionListener targetValueSelectedListener = new DimensionRowSelectionListener() {
@Override
public void selectedDimensionRow(DimensionRow dimensionRow) {
Log.debug("Target DimensionRow selected: " + dimensionRow);
comboTargetValue.setValue(dimensionRow, true);
}
@Override
public void abortedDimensionRowSelection() {
Log.debug("Target DimensionRow selection aborted");
}
@Override
public void failedDimensionRowSelection(String reason, String detail) {
Log.error("Target DimensionRow selection error: " + reason);
}
};
comboTargetValue.addTriggerClickHandler(new TriggerClickHandler() {
@Override
public void onTriggerClick(TriggerClickEvent event) {
Log.debug("ComboTargetValue TriggerClickEvent");
comboTargetValue.collapse();
CellData cellData = new CellData("", referenceColumn.getName(),
referenceColumn.getColumnId(), referenceColumn
.getLabel(), null, 0, 0);
DimensionRowSelectionDialog dimensionRowSelectionDialog = new DimensionRowSelectionDialog(
referenceColumn, cellData, true, false, true, false, true, eventBus);
dimensionRowSelectionDialog
.addListener(targetValueSelectedListener);
dimensionRowSelectionDialog.show();
}
});
comboTargetValue.setEmptyText("Select a target...");
comboTargetValue.setWidth(COMBOWIDTH);
comboTargetValue.setEditable(false);
comboTargetValue.setTriggerAction(TriggerAction.ALL);
final IconButton btnAdd = new IconButton();
btnAdd.setItemId(itemIdBtnAdd);
btnAdd.setIcon(ResourceBundle.INSTANCE.add());
btnAdd.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
Log.debug("Clicked btnAdd");
addColumnMappingData();
thisPanel.forceLayout();
vert.forceLayout();
}
});
btnAdd.setVisible(true);
final IconButton btnDel = new IconButton();
btnDel.setItemId(itemIdBtnDel);
btnDel.setIcon(ResourceBundle.INSTANCE.delete());
btnDel.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
Log.debug("Clicked btnDel");
vert.remove(horiz);
if (vert.getWidgetCount() == 0) {
setColumnMappingData();
} else {
}
thisPanel.forceLayout();
vert.forceLayout();
}
});
btnDel.setVisible(false);
horiz.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE);
horiz.setPack(BoxLayoutPack.START);
horiz.add(comboSourceValue, new BoxLayoutData(new Margins(2, 1, 2, 1)));
horiz.add(comboTargetValue, new BoxLayoutData(new Margins(2, 1, 2, 1)));
horiz.add(btnAdd, new BoxLayoutData(new Margins(2, 1, 2, 1)));
horiz.add(btnDel, new BoxLayoutData(new Margins(2, 1, 2, 1)));
vert.add(horiz);
}
protected void addColumnMappingData() {
final HBoxLayoutContainer horiz = new HBoxLayoutContainer();
// Source Combo
DimensionRowsProperties propsSource = GWT
.create(DimensionRowsProperties.class);
ListStore<DimensionRow> storeComboSourceValue = new ListStore<DimensionRow>(
propsSource.rowId());
final ComboBox<DimensionRow> comboSourceValue = new ComboBox<DimensionRow>(
storeComboSourceValue, propsSource.value());
comboSourceValue.setItemId(itemIdSourceValueArg);
Log.debug("ComboSourceValue created");
final DimensionRowSelectionListener sourceValueSelectedListener = new DimensionRowSelectionListener() {
@Override
public void selectedDimensionRow(DimensionRow dimensionRow) {
Log.debug("Source DimensionRow selected: " + dimensionRow);
comboSourceValue.setValue(dimensionRow, true);
}
@Override
public void abortedDimensionRowSelection() {
Log.debug("Source DimensionRow selection aborted");
}
@Override
public void failedDimensionRowSelection(String reason, String detail) {
Log.error("Source DimensionRow selection error: " + reason);
}
};
comboSourceValue.addTriggerClickHandler(new TriggerClickHandler() {
@Override
public void onTriggerClick(TriggerClickEvent event) {
Log.debug("ComboSourceValue TriggerClickEvent");
comboSourceValue.collapse();
CellData cellData = new CellData("", selectedColumn.getName(),
selectedColumn.getColumnId(),
selectedColumn.getLabel(), null, 0, 0);
DimensionRowSelectionDialog dimensionRowSelectionDialog = new DimensionRowSelectionDialog(
selectedColumn, cellData, true, false, true, false, true, eventBus);
dimensionRowSelectionDialog
.addListener(sourceValueSelectedListener);
dimensionRowSelectionDialog.show();
}
});
comboSourceValue.setEmptyText("Select a source...");
comboSourceValue.setWidth(COMBOWIDTH);
comboSourceValue.setEditable(false);
comboSourceValue.setTriggerAction(TriggerAction.ALL);
// Target Combo
DimensionRowsProperties propsTarget = GWT
.create(DimensionRowsProperties.class);
ListStore<DimensionRow> storeComboTargetValue = new ListStore<DimensionRow>(
propsTarget.rowId());
final ComboBox<DimensionRow> comboTargetValue = new ComboBox<DimensionRow>(
storeComboTargetValue, propsTarget.value());
comboTargetValue.setItemId(itemIdTargetValueArg);
Log.debug("ComboTargetValue created");
final DimensionRowSelectionListener targetValueSelectedListener = new DimensionRowSelectionListener() {
@Override
public void selectedDimensionRow(DimensionRow dimensionRow) {
Log.debug("Target DimensionRow selected: " + dimensionRow);
comboTargetValue.setValue(dimensionRow, true);
}
@Override
public void abortedDimensionRowSelection() {
Log.debug("Target DimensionRow selection aborted");
}
@Override
public void failedDimensionRowSelection(String reason, String detail) {
Log.error("Target DimensionRow selection error: " + reason);
}
};
comboTargetValue.addTriggerClickHandler(new TriggerClickHandler() {
@Override
public void onTriggerClick(TriggerClickEvent event) {
Log.debug("ComboTargetValue TriggerClickEvent");
comboTargetValue.collapse();
CellData cellData = new CellData("", referenceColumn.getName(),
referenceColumn.getColumnId(), referenceColumn
.getLabel(), null, 0, 0);
DimensionRowSelectionDialog dimensionRowSelectionDialog = new DimensionRowSelectionDialog(
referenceColumn, cellData, true, false, true, false, true, eventBus);
dimensionRowSelectionDialog
.addListener(targetValueSelectedListener);
dimensionRowSelectionDialog.show();
}
});
comboTargetValue.setEmptyText("Select a target...");
comboTargetValue.setWidth(COMBOWIDTH);
comboTargetValue.setEditable(false);
comboTargetValue.setTriggerAction(TriggerAction.ALL);
final IconButton btnAdd = new IconButton();
btnAdd.setItemId(itemIdBtnAdd);
btnAdd.setIcon(ResourceBundle.INSTANCE.add());
btnAdd.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
Log.debug("Clicked btnAdd");
addColumnMappingData();
thisPanel.forceLayout();
vert.forceLayout();
}
});
btnAdd.setVisible(true);
final IconButton btnDel = new IconButton();
btnDel.setItemId(itemIdBtnDel);
btnDel.setIcon(ResourceBundle.INSTANCE.delete());
btnDel.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
Log.debug("Clicked btnDel");
vert.remove(horiz);
if (vert.getWidgetCount() == 0) {
setColumnMappingData();
} else {
}
thisPanel.forceLayout();
vert.forceLayout();
}
});
btnDel.setVisible(true);
horiz.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE);
horiz.setPack(BoxLayoutPack.START);
horiz.add(comboSourceValue, new BoxLayoutData(new Margins(2, 1, 2, 1)));
horiz.add(comboTargetValue, new BoxLayoutData(new Margins(2, 1, 2, 1)));
horiz.add(btnAdd, new BoxLayoutData(new Margins(2, 1, 2, 1)));
horiz.add(btnDel, new BoxLayoutData(new Margins(2, 1, 2, 1)));
vert.add(horiz);
}
}