package org.gcube.portlets.user.td.replacebyexternalwidget.client; import java.util.ArrayList; import java.util.HashMap; 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.tr.ColumnData; import org.gcube.portlets.user.td.gwtservice.shared.tr.replacebyexternal.ReplaceByExternalColumnsMapping; import org.gcube.portlets.user.td.replacebyexternalwidget.client.custom.IconButton; import org.gcube.portlets.user.td.replacebyexternalwidget.client.properties.ColumnDataProperties; import org.gcube.portlets.user.td.replacebyexternalwidget.client.resources.ReplaceByExternalResourceBundle; 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.TRId; import org.gcube.portlets.user.td.widgetcommonevent.shared.tr.column.ColumnDataType; import org.gcube.portlets.user.td.wizardwidget.client.dataresource.ResourceBundle; import org.gcube.portlets.user.td.wizardwidget.client.util.UtilsGXT3; 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.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.user.client.rpc.AsyncCallback; 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.ContentPanel; 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.ResizeContainer; 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.form.ComboBox; import com.sencha.gxt.widget.core.client.form.FieldLabel; /** * * @author "Giancarlo Panichi" email: g.panichi@isti.cnr.it * */ public class ColumnMappingPanel extends ContentPanel { private static final String COMBOWIDTH = "200px"; // private static final String COLUMNLABELWIDTH = "120px"; protected ResourceBundle res; protected ColumnMappingCard parent; protected VerticalLayoutContainer vert; protected ArrayList currentColumns; protected ArrayList externalColumns; protected ResizeContainer thisPanel; protected HashMap columnMap; protected ArrayList listColumnsMapping; protected String itemIdCurrentColumn = "itemIdCurrentColumn"; protected String itemIdExternalColumn = "itemIdExternalColumn"; protected String itemIdLabelColumn = "itemIdLabelColumn"; protected String itemIdBtnAdd = "itemIdBtnAdd"; protected String itemIdBtnDel = "itemIdBtnDel"; /** * * @param parent * @param res */ public ColumnMappingPanel(ColumnMappingCard parent, ResourceBundle res) { super(); this.res = res; this.parent = parent; thisPanel = this; Log.debug("ColumnMappingPanel"); init(); retrieveSourceColumns(); } public ArrayList getCurrentColumns() { return currentColumns; } public ArrayList getExternalColumns() { return externalColumns; } protected void init() { setHeaderVisible(false); setBodyStyle("backgroundColor:#DFE8F6;"); forceLayoutOnResize = true; } protected void create() { SimpleContainer container = new SimpleContainer(); vert = new VerticalLayoutContainer(); vert.setScrollMode(ScrollMode.AUTO); vert.setAdjustForScroll(true); container.add(vert); setColumnMap(); String currentTRLabel = parent.replaceByExternalSession.getCurrentTabularResource() .getName(); FieldLabel sourceColumnLabel = new FieldLabel(null, currentTRLabel); sourceColumnLabel.getElement().applyStyles("font-weight:bold"); sourceColumnLabel.setWidth(COMBOWIDTH); sourceColumnLabel.setLabelSeparator(""); String unionTRLabel = parent.replaceByExternalSession.getExternalTabularResource() .getName(); FieldLabel unionColumnLabel = new FieldLabel(null, unionTRLabel); unionColumnLabel.getElement().applyStyles("font-weight:bold"); unionColumnLabel.setWidth(COMBOWIDTH); unionColumnLabel.setLabelSeparator(""); final HBoxLayoutContainer horiz = new HBoxLayoutContainer(); horiz.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE); horiz.setPack(BoxLayoutPack.START); horiz.add(sourceColumnLabel, new BoxLayoutData(new Margins(2, 1, 2, 1))); horiz.add(unionColumnLabel, new BoxLayoutData(new Margins(2, 1, 2, 1))); VerticalLayoutContainer vPanel = new VerticalLayoutContainer(); vPanel.setScrollMode(ScrollMode.AUTO); vPanel.setAdjustForScroll(true); vPanel.add(horiz, new VerticalLayoutData(1, -1, new Margins(1, 1, 1, 10))); vPanel.add(container, new VerticalLayoutData(1, -1, new Margins(1, 1, 1, 10))); add(vPanel); forceLayout(); } private void retrieveSourceColumns() { TRId trId = parent.replaceByExternalSession.getTrId(); TDGWTServiceAsync.INSTANCE.getColumns(trId, new AsyncCallback>() { @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()); UtilsGXT3.alert("Error Locked", caught.getLocalizedMessage()); } else { Log.debug("Error retrieving source columns: " + caught.getLocalizedMessage()); UtilsGXT3 .alert("Error retrieving current columns", "Error retrieving current columns on server!"); } } } @Override public void onSuccess(ArrayList result) { currentColumns = result; retrieveUnionColumns(); } }); } private void retrieveUnionColumns() { TRId trId = parent.replaceByExternalSession.getExternalTabularResource().getTrId(); TDGWTServiceAsync.INSTANCE.getColumns(trId, new AsyncCallback>() { @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()); UtilsGXT3.alert("Error Locked", caught.getLocalizedMessage()); } else { Log.debug("Error retrieving union columns: " + caught.getLocalizedMessage()); UtilsGXT3 .alert("Error retrieving external columns", "Error retrieving external columns on server!"); } } } @Override public void onSuccess(ArrayList result) { externalColumns = result; create(); } }); } protected void setColumnMap() { final HBoxLayoutContainer horiz = new HBoxLayoutContainer(); // Current Combo ColumnDataProperties propsCurrentColumn = GWT .create(ColumnDataProperties.class); ListStore storeComboCurrentColumn = new ListStore( propsCurrentColumn.id()); storeComboCurrentColumn.addAll(currentColumns); final ComboBox comboCurrentColumn = new ComboBox( storeComboCurrentColumn, propsCurrentColumn.label()); comboCurrentColumn.setItemId(itemIdCurrentColumn); Log.debug("ComboSourceColumn created"); comboCurrentColumn.setEmptyText("Select a column..."); comboCurrentColumn.setWidth(COMBOWIDTH); comboCurrentColumn.setEditable(false); comboCurrentColumn.setTriggerAction(TriggerAction.ALL); // External Combo ColumnDataProperties propsExternalColumn = GWT .create(ColumnDataProperties.class); final ListStore storeComboExternalColumn = new ListStore( propsExternalColumn.id()); final ComboBox comboExternalColumn = new ComboBox( storeComboExternalColumn, propsExternalColumn.label()); comboExternalColumn.setItemId(itemIdExternalColumn); Log.debug("ComboExternalColumn created"); comboExternalColumn.disable(); comboExternalColumn.setEmptyText("Select a column..."); comboExternalColumn.setWidth(COMBOWIDTH); comboExternalColumn.setEditable(false); comboExternalColumn.setTriggerAction(TriggerAction.ALL); final IconButton btnAdd = new IconButton(); btnAdd.setItemId(itemIdBtnAdd); btnAdd.setIcon(ReplaceByExternalResourceBundle.INSTANCE.add()); btnAdd.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { Log.debug("Clicked btnAdd"); addColumnMap(); thisPanel.forceLayout(); vert.forceLayout(); } }); btnAdd.setVisible(true); final IconButton btnDel = new IconButton(); btnDel.setItemId(itemIdBtnDel); btnDel.setIcon(ReplaceByExternalResourceBundle.INSTANCE.delete()); btnDel.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { Log.debug("Clicked btnDel"); vert.remove(horiz); if (vert.getWidgetCount() == 0) { setColumnMap(); } else { } thisPanel.forceLayout(); vert.forceLayout(); } }); btnDel.setVisible(false); comboCurrentColumn .addSelectionHandler(new SelectionHandler() { @Override public void onSelection(SelectionEvent event) { comboExternalColumn.reset(); storeComboExternalColumn.clear(); ColumnData selectedCurrentColumn = event .getSelectedItem(); storeComboExternalColumn.clear(); for (ColumnData col : externalColumns) { if (selectedCurrentColumn.getDataTypeName() .compareTo(ColumnDataType.Text.toString()) == 0 || col.getDataTypeName().compareTo( ColumnDataType.Text.toString()) == 0) { storeComboExternalColumn.add(col); } else { if ((col.getDataTypeName().compareTo( ColumnDataType.Integer.toString()) == 0 && selectedCurrentColumn .getDataTypeName().compareTo( ColumnDataType.Numeric .toString()) == 0) || (col.getDataTypeName().compareTo( ColumnDataType.Numeric .toString()) == 0 && selectedCurrentColumn .getDataTypeName().compareTo( ColumnDataType.Integer .toString()) == 0)) { storeComboExternalColumn.add(col); } else { if (col.getDataTypeName().compareTo( selectedCurrentColumn .getDataTypeName()) == 0) { storeComboExternalColumn.add(col); } else { } } } } storeComboExternalColumn.commitChanges(); comboExternalColumn.redraw(); comboExternalColumn.enable(); } }); horiz.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE); horiz.setPack(BoxLayoutPack.START); // horiz.add(columnLabel, new BoxLayoutData(new Margins(2, 1, 2, 1))); horiz.add(comboCurrentColumn, new BoxLayoutData(new Margins(2, 1, 2, 1))); horiz.add(comboExternalColumn, 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 addColumnMap() { final HBoxLayoutContainer horiz = new HBoxLayoutContainer(); // Current Combo ColumnDataProperties propsCurrentColumn = GWT .create(ColumnDataProperties.class); ListStore storeComboCurrentColumn = new ListStore( propsCurrentColumn.id()); storeComboCurrentColumn.addAll(currentColumns); final ComboBox comboCurrentColumn = new ComboBox( storeComboCurrentColumn, propsCurrentColumn.label()); comboCurrentColumn.setItemId(itemIdCurrentColumn); Log.debug("ComboCurrentColumn created"); comboCurrentColumn.setEmptyText("Select a column..."); comboCurrentColumn.setWidth(COMBOWIDTH); comboCurrentColumn.setEditable(false); comboCurrentColumn.setTriggerAction(TriggerAction.ALL); // External Combo ColumnDataProperties propsExternalColumn = GWT .create(ColumnDataProperties.class); final ListStore storeComboExternalColumn = new ListStore( propsExternalColumn.id()); final ComboBox comboExternalColumn = new ComboBox( storeComboExternalColumn, propsExternalColumn.label()); comboExternalColumn.setItemId(itemIdExternalColumn); Log.debug("ComboExternalColumn created"); comboExternalColumn.disable(); comboExternalColumn.setEmptyText("Select a column..."); comboExternalColumn.setWidth(COMBOWIDTH); comboExternalColumn.setEditable(false); comboExternalColumn.setTriggerAction(TriggerAction.ALL); final IconButton btnAdd = new IconButton(); btnAdd.setItemId(itemIdBtnAdd); btnAdd.setIcon(ReplaceByExternalResourceBundle.INSTANCE.add()); btnAdd.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { Log.debug("Clicked btnAdd"); addColumnMap(); thisPanel.forceLayout(); vert.forceLayout(); } }); btnAdd.setVisible(true); final IconButton btnDel = new IconButton(); btnDel.setItemId(itemIdBtnDel); btnDel.setIcon(ReplaceByExternalResourceBundle.INSTANCE.delete()); btnDel.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { Log.debug("Clicked btnDel"); vert.remove(horiz); if (vert.getWidgetCount() == 0) { setColumnMap(); } else { } thisPanel.forceLayout(); vert.forceLayout(); } }); btnDel.setVisible(true); comboCurrentColumn .addSelectionHandler(new SelectionHandler() { @Override public void onSelection(SelectionEvent event) { comboExternalColumn.reset(); storeComboExternalColumn.clear(); ColumnData selectedCurrentColumn = event .getSelectedItem(); storeComboExternalColumn.clear(); for (ColumnData col : externalColumns) { if (selectedCurrentColumn.getDataTypeName() .compareTo(ColumnDataType.Text.toString()) == 0 || col.getDataTypeName().compareTo( ColumnDataType.Text.toString()) == 0) { storeComboExternalColumn.add(col); } else { if ((col.getDataTypeName().compareTo( ColumnDataType.Integer.toString()) == 0 && selectedCurrentColumn .getDataTypeName().compareTo( ColumnDataType.Numeric .toString()) == 0) || (col.getDataTypeName().compareTo( ColumnDataType.Numeric .toString()) == 0 && selectedCurrentColumn .getDataTypeName().compareTo( ColumnDataType.Integer .toString()) == 0)) { storeComboExternalColumn.add(col); } else { if (col.getDataTypeName().compareTo( selectedCurrentColumn .getDataTypeName()) == 0) { storeComboExternalColumn.add(col); } else { } } } } storeComboExternalColumn.commitChanges(); comboExternalColumn.redraw(); comboExternalColumn.enable(); } }); horiz.setHBoxLayoutAlign(HBoxLayoutAlign.MIDDLE); horiz.setPack(BoxLayoutPack.START); // horiz.add(columnLabel, new BoxLayoutData(new Margins(2, 1, 2, 1))); horiz.add(comboCurrentColumn, new BoxLayoutData(new Margins(2, 1, 2, 1))); horiz.add(comboExternalColumn, 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); } /** * * @return */ protected ArrayList getSelectedMap() { listColumnsMapping = new ArrayList(); int lenght = vert.getWidgetCount(); int i = 0; for (; i < lenght; i++) { HBoxLayoutContainer h = (HBoxLayoutContainer) vert.getWidget(i); if (h != null) { @SuppressWarnings("unchecked") ComboBox comboCurrentColumn = (ComboBox) h .getItemByItemId(itemIdCurrentColumn); ColumnData currentColumn = comboCurrentColumn.getCurrentValue(); if (currentColumn != null) { @SuppressWarnings("unchecked") ComboBox comboExternalColumn = (ComboBox) h .getItemByItemId(itemIdExternalColumn); ColumnData externalColumn = comboExternalColumn.getCurrentValue(); if (externalColumn != null) { ReplaceByExternalColumnsMapping colMatch = new ReplaceByExternalColumnsMapping( "default", currentColumn, externalColumn); listColumnsMapping.add(colMatch); } else { Log.debug("External Column is null"); } } else { Log.debug("Current Column is null"); } } else { Log.debug("HorizontalContainer is null"); } } return listColumnsMapping; } }