tabular-data-extractcodelis.../src/main/java/org/gcube/portlets/user/td/extractcodelistwidget/client/TargetColumnsSelectionPanel...

567 lines
18 KiB
Java

package org.gcube.portlets.user.td.extractcodelistwidget.client;
import java.util.ArrayList;
import org.gcube.portlets.user.td.expressionwidget.client.properties.ColumnDataPropertiesCombo;
import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync;
import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTIsLockedException;
import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTSessionExpiredException;
import org.gcube.portlets.user.td.gwtservice.shared.extract.ExtractCodelistTargetColumn;
import org.gcube.portlets.user.td.gwtservice.shared.tr.TabResource;
import org.gcube.portlets.user.td.columnwidget.client.create.CreateDefColumnDialog;
import org.gcube.portlets.user.td.columnwidget.client.create.CreateDefColumnListener;
import org.gcube.portlets.user.td.columnwidget.client.dimension.CodelistSelectionDialog;
import org.gcube.portlets.user.td.columnwidget.client.dimension.CodelistSelectionListener;
import org.gcube.portlets.user.td.columnwidget.client.properties.ExtractCodelistDefColumnPropertiesCombo;
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.widgetcommonevent.client.event.SessionExpiredEvent;
import org.gcube.portlets.user.td.widgetcommonevent.client.type.SessionExpiredType;
import org.gcube.portlets.user.td.widgetcommonevent.shared.tr.TableType;
import org.gcube.portlets.user.td.widgetcommonevent.shared.tr.column.ColumnData;
import org.gcube.portlets.user.td.widgetcommonevent.shared.tr.column.ColumnMockUp;
import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.client.rpc.AsyncCallback;
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.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.CheckBox;
import com.sencha.gxt.widget.core.client.form.ComboBox;
import com.sencha.gxt.widget.core.client.form.FieldLabel;
import com.sencha.gxt.widget.core.client.form.TextField;
import com.sencha.gxt.widget.core.client.toolbar.ToolBar;
/**
*
* @author "Giancarlo Panichi" <a
* href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
*
*/
public class TargetColumnsSelectionPanel extends FramedPanel implements
CodelistSelectionListener {
private static final String COMBO_COLUMN = "comboColumn";
private static final String COMBO_DEF_COLUMN = "comboDefColumn";
private static final String CHECK_NEW = "checkNew";
private static final String WIDTH = "526px";
private static final String HEIGHT = "378px";
private static final String FIELDWIDTH = "526px";
private static final String FIELDSHEIGHT = "336px";
private static final int LABELSIZE = 120;
private static final int LABEL_SIZE_IN_CHAR = 17;
private static final int COMBOWIDTH = 270;
private TargetColumnsSelectionCard parent;
private TabResource connection;
private ArrayList<ColumnData> connectionColumns;
private ArrayList<ExtractCodelistTargetColumn> targetColumns;
private ToolBar toolBarHead;
private TextButton btnConnect;
private TextButton btnDisconnect;
private TextField connectionField;
private SimpleContainer form;
private VerticalLayoutContainer formLayout;
public TargetColumnsSelectionPanel(TargetColumnsSelectionCard parent) {
this.parent = parent;
connection = null;
Log.debug("Create TargetColumnsSelectionPanel()");
init();
create();
}
protected void init() {
setWidth(WIDTH);
setHeight(HEIGHT);
setHeaderVisible(false);
setBodyBorder(false);
}
protected void create() {
toolBarHead = new ToolBar();
// Connect Codelist
btnConnect = new TextButton();
btnConnect.setIcon(ResourceBundle.INSTANCE.codelistLink24());
btnConnect.setIconAlign(IconAlign.TOP);
btnConnect.setTitle("Connect Codelist");
btnConnect.addSelectHandler(new SelectHandler() {
public void onSelect(SelectEvent event) {
Log.debug("Pressed Connect");
btnConnect.disable();
connectCodelist();
}
});
toolBarHead.add(btnConnect);
// Disconnect Codelist
btnDisconnect = new TextButton();
btnDisconnect.setIcon(ResourceBundle.INSTANCE.codelistLinkBreak24());
btnDisconnect.setIconAlign(IconAlign.TOP);
btnDisconnect.setTitle("Disconnect Codelist");
btnDisconnect.addSelectHandler(new SelectHandler() {
public void onSelect(SelectEvent event) {
Log.debug("Pressed Disconnect");
btnDisconnect.disable();
disconnectCodelist();
}
});
toolBarHead.add(btnDisconnect);
connectionField = new TextField();
toolBarHead.add(connectionField);
form = new SimpleContainer();
form.setWidth(FIELDWIDTH);
form.setHeight(FIELDSHEIGHT);
formLayout = new VerticalLayoutContainer();
//formLayout.setScrollMode(ScrollMode.AUTO);
formLayout.setAdjustForScroll(true);
ArrayList<FieldLabel> fields = generateFields();
for (FieldLabel fl : fields) {
formLayout.add(fl, new VerticalLayoutData(1, -1, new Margins(1)));
}
form.add(formLayout);
VerticalLayoutContainer v = new VerticalLayoutContainer();
//v.setHeight(HEIGHT);
//v.setWidth(WIDTH);
v.add(toolBarHead, new VerticalLayoutData(1, -1, new Margins(0)));
v.add(form, new VerticalLayoutData(1, -1, new Margins(0)));
add(v);
connectionField.setValue("");
connectionField.setVisible(false);
btnDisconnect.setVisible(false);
btnConnect.setVisible(true);
btnConnect.enable();
}
protected ArrayList<FieldLabel> generateFields() {
ArrayList<FieldLabel> fields = new ArrayList<FieldLabel>();
int i = 0;
for (ColumnData sourceCol : parent.extractCodelistSession
.getSourceColumns()) {
String label = new String();
if (sourceCol != null && sourceCol.getLabel() != null) {
label = SafeHtmlUtils.htmlEscape(sourceCol.getLabel());
if (label.length() > LABEL_SIZE_IN_CHAR + 2) {
label = label.substring(0, LABEL_SIZE_IN_CHAR);
label += "...";
}
}
if (connection == null) {
FieldLabel fieldLabel = retrieveNewColumnLabel(i, sourceCol,
label);
fieldLabel.setLabelWidth(LABELSIZE);
fieldLabel.setId(sourceCol.getColumnId());
fields.add(fieldLabel);
} else {
FieldLabel fieldLabel = retrieveReferenceColumnLabel(i,
sourceCol, label);
fieldLabel.setLabelWidth(LABELSIZE);
fieldLabel.setId(sourceCol.getColumnId());
fields.add(fieldLabel);
}
i++;
}
return fields;
}
protected FieldLabel retrieveNewColumnLabel(final int index,
final ColumnData col, String label) {
// comboDefColumn
ExtractCodelistDefColumnPropertiesCombo props = GWT
.create(ExtractCodelistDefColumnPropertiesCombo.class);
ListStore<ColumnMockUp> storeComboDefColumn = new ListStore<ColumnMockUp>(
props.id());
final ComboBox<ColumnMockUp> comboDefColumn = new ComboBox<ColumnMockUp>(
storeComboDefColumn, props.label());
Log.debug("ComboDefColumn created");
final CreateDefColumnListener createDefColumnListener = new CreateDefColumnListener() {
@Override
public void failedDefColumnCreation(String reason, String details) {
Log.error("Change Value Failed:" + reason + " " + details);
}
@Override
public void completedDefColumnCreation(ColumnMockUp columnMockUp) {
comboDefColumn.setValue(columnMockUp, true);
}
@Override
public void abortedDefColumnCreation() {
Log.debug("Change Value Aborted");
}
};
comboDefColumn.addTriggerClickHandler(new TriggerClickHandler() {
@Override
public void onTriggerClick(TriggerClickEvent event) {
Log.debug("ComboDefColumn TriggerClickEvent");
comboDefColumn.collapse();
CreateDefColumnDialog createDefColumnDialog = new CreateDefColumnDialog(
TableType.CODELIST, parent.getEventBus());
createDefColumnDialog.addListener(createDefColumnListener);
createDefColumnDialog.show();
}
});
comboDefColumn.setEmptyText("Select a Column...");
comboDefColumn.setWidth(COMBOWIDTH);
comboDefColumn.setEditable(false);
comboDefColumn.setTriggerAction(TriggerAction.ALL);
FieldLabel columnLabel = new FieldLabel(comboDefColumn, label);
columnLabel.setId(col.getColumnId());
return columnLabel;
}
protected FieldLabel retrieveReferenceColumnLabel(int index,
final ColumnData col, String label) {
// comboDefColumn
ExtractCodelistDefColumnPropertiesCombo props = GWT
.create(ExtractCodelistDefColumnPropertiesCombo.class);
ListStore<ColumnMockUp> storeComboDefColumn = new ListStore<ColumnMockUp>(
props.id());
final ComboBox<ColumnMockUp> comboDefColumn = new ComboBox<ColumnMockUp>(
storeComboDefColumn, props.label());
comboDefColumn.setItemId(COMBO_DEF_COLUMN);
Log.debug("ComboDefColumn created");
final CreateDefColumnListener createDefColumnListener = new CreateDefColumnListener() {
@Override
public void failedDefColumnCreation(String reason, String details) {
Log.error("Change Value Failed:" + reason + " " + details);
}
@Override
public void completedDefColumnCreation(ColumnMockUp columnMockUp) {
comboDefColumn.setValue(columnMockUp, true);
}
@Override
public void abortedDefColumnCreation() {
Log.debug("Change Value Aborted");
}
};
comboDefColumn.addTriggerClickHandler(new TriggerClickHandler() {
@Override
public void onTriggerClick(TriggerClickEvent event) {
Log.debug("ComboDefColumn TriggerClickEvent");
comboDefColumn.collapse();
CreateDefColumnDialog createDefColumnDialog = new CreateDefColumnDialog(
TableType.CODELIST, parent.getEventBus());
createDefColumnDialog.addListener(createDefColumnListener);
createDefColumnDialog.show();
}
});
comboDefColumn.setEmptyText("Select a new column...");
comboDefColumn.setWidth(COMBOWIDTH);
comboDefColumn.setEditable(false);
comboDefColumn.setTriggerAction(TriggerAction.ALL);
// comboColumn
ColumnDataPropertiesCombo propsCod = GWT
.create(ColumnDataPropertiesCombo.class);
ListStore<ColumnData> storeComboColumn = new ListStore<ColumnData>(
propsCod.id());
storeComboColumn.addAll(connectionColumns);
final ComboBox<ColumnData> comboColumn = new ComboBox<ColumnData>(
storeComboColumn, propsCod.label());
comboColumn.setItemId(COMBO_COLUMN);
Log.debug("ComboColumn created");
comboColumn.setEmptyText("Select from Codelist...");
comboColumn.setWidth(COMBOWIDTH);
comboColumn.setEditable(false);
comboColumn.setTriggerAction(TriggerAction.ALL);
CheckBox checkNew = new CheckBox();
checkNew.setItemId(CHECK_NEW);
checkNew.setEnabled(true);
checkNew.setBoxLabel("New");
checkNew.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(ValueChangeEvent<Boolean> event) {
if (event.getValue()) {
comboColumn.setVisible(false);
comboDefColumn.setVisible(true);
forceLayout();
} else {
comboColumn.setVisible(true);
comboDefColumn.setVisible(false);
forceLayout();
}
}
});
HBoxLayoutContainer flowButton = new HBoxLayoutContainer();
flowButton.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE);
flowButton.setPack(BoxLayoutPack.START);
BoxLayoutData boxLayoutData=new BoxLayoutData(new Margins(2, 4, 2, 4));
flowButton.add(checkNew, boxLayoutData);
flowButton.add(comboColumn, boxLayoutData);
flowButton.add(comboDefColumn, boxLayoutData);
FieldLabel columnLabel = new FieldLabel(flowButton, label);
columnLabel.setId(col.getColumnId());
comboDefColumn.setVisible(false);
return columnLabel;
}
protected void disconnectCodelist() {
Log.debug("Disconnect codelist");
this.connection = null;
connectionField.setValue("");
connectionField.setVisible(false);
btnDisconnect.setVisible(false);
btnConnect.setVisible(true);
btnConnect.enable();
toolBarHead.forceLayout();
updatedForm();
}
protected void connectCodelist() {
CodelistSelectionDialog codelistSelectionDialog = new CodelistSelectionDialog(
parent.getEventBus());
codelistSelectionDialog.addListener(this);
codelistSelectionDialog.show();
}
@Override
public void selected(TabResource tabResource) {
Log.debug("Selected connection: " + tabResource);
this.connection = tabResource;
retrieveColumnData();
}
@Override
public void aborted() {
Log.debug("Connection Aborted");
btnConnect.enable();
}
@Override
public void failed(String reason, String detail) {
Log.debug("Connection Failed: " + reason + " " + detail);
UtilsGXT3.alert("Error on connect", reason);
btnConnect.enable();
}
protected void retrieveColumnData() {
TDGWTServiceAsync.INSTANCE.getColumnsForDimension(connection.getTrId(),
new AsyncCallback<ArrayList<ColumnData>>() {
@Override
public void onFailure(Throwable caught) {
if (caught instanceof TDGWTSessionExpiredException) {
parent.getEventBus()
.fireEvent(
new SessionExpiredEvent(
SessionExpiredType.EXPIREDONSERVER));
} else {
if (caught instanceof TDGWTIsLockedException) {
Log.error(caught.getLocalizedMessage());
parent.showErrorAndHide("Error Locked",
caught.getLocalizedMessage(), "", caught);
} else {
Log.debug("Error retrieving columns: "
+ caught.getLocalizedMessage());
parent.showErrorAndHide("Error retrieving columns",
"Error retrieving columns on server.",caught.getLocalizedMessage(), caught);
}
}
}
@Override
public void onSuccess(ArrayList<ColumnData> result) {
connectionColumns = result;
enableConnection();
}
});
}
protected void enableConnection() {
connectionField.setValue(connection.getName());
connectionField.setVisible(true);
btnDisconnect.setVisible(true);
btnConnect.setVisible(false);
btnConnect.enable();
toolBarHead.forceLayout();
updatedForm();
}
protected void updatedForm() {
form.clear();
formLayout = new VerticalLayoutContainer();
//formLayout.setScrollMode(ScrollMode.AUTO);
formLayout.setAdjustForScroll(true);
ArrayList<FieldLabel> fields = generateFields();
for (FieldLabel fl : fields) {
formLayout.add(fl, new VerticalLayoutData(1, -1, new Margins(1)));
}
form.add(formLayout);
forceLayout();
}
public boolean updateExtractCodelistSession() {
targetColumns = new ArrayList<ExtractCodelistTargetColumn>();
int i = 0;
int lenght = formLayout.getWidgetCount();
for (; i < lenght; i++) {
FieldLabel fieldLabel = (FieldLabel) formLayout.getWidget(i);
String columnId = fieldLabel.getId();
Log.debug("Field id:" + columnId);
ColumnData colCurrent = null;
for (ColumnData col : parent.extractCodelistSession
.getSourceColumns()) {
if (col.getColumnId().compareTo(columnId) == 0) {
colCurrent = col;
Log.debug("Column Match:" + colCurrent);
break;
}
}
if (colCurrent == null) {
UtilsGXT3.alert("Error creating form", "Error creating form!");
return false;
}
if (connection == null) {
@SuppressWarnings("unchecked")
ComboBox<ColumnMockUp> comboDefColumn = ((ComboBox<ColumnMockUp>) fieldLabel
.getWidget());
ColumnMockUp defNewColumn = comboDefColumn.getValue();
Log.debug("Retrieved: " + defNewColumn.toString());
ExtractCodelistTargetColumn extractCodelistTargetColumn = new ExtractCodelistTargetColumn(
colCurrent, defNewColumn);
Log.debug("New TargetColumn: " + extractCodelistTargetColumn);
targetColumns.add(extractCodelistTargetColumn);
} else {
HBoxLayoutContainer flowButton = (HBoxLayoutContainer) fieldLabel
.getWidget();
CheckBox checkNew = (CheckBox) flowButton
.getItemByItemId(CHECK_NEW);
if (checkNew == null) {
UtilsGXT3.alert("Error creating form",
"Error creating form for check radio!");
return false;
}
if (checkNew.getValue()) {
@SuppressWarnings("unchecked")
ComboBox<ColumnMockUp> comboDefColumn = (ComboBox<ColumnMockUp>) flowButton
.getItemByItemId(COMBO_DEF_COLUMN);
ColumnMockUp defNewColumn = comboDefColumn.getValue();
Log.debug("Retrieved: " + defNewColumn.toString());
ExtractCodelistTargetColumn extractCodelistTargetCol = new ExtractCodelistTargetColumn(
colCurrent, defNewColumn);
Log.debug("New TargetColumn:" + extractCodelistTargetCol);
targetColumns.add(extractCodelistTargetCol);
} else {
@SuppressWarnings("unchecked")
ComboBox<ColumnData> comboColumn = (ComboBox<ColumnData>) flowButton
.getItemByItemId(COMBO_COLUMN);
ColumnData columnData = comboColumn.getCurrentValue();
if (columnData == null) {
UtilsGXT3.alert("Attention", "Fill all column!");
return false;
} else {
ExtractCodelistTargetColumn extractCodelistTargetC = new ExtractCodelistTargetColumn(
colCurrent, columnData, connection.getTrId());
Log.debug("New TargetColumn:" + extractCodelistTargetC);
targetColumns.add(extractCodelistTargetC);
}
}
}
}
Log.debug("UpdateExtractCodelistSession:" + targetColumns);
parent.extractCodelistSession.setTargetColumns(targetColumns);
return true;
}
}