package org.gcube.portlets.user.td.columnwidget.client.dimension; import java.util.ArrayList; import org.gcube.portlets.user.td.columnwidget.client.properties.ColumnDataPropertiesCombo; 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.expressionwidget.client.properties.TabResourceProperties; import org.gcube.portlets.user.td.gwtservice.client.rpc.TDGWTServiceAsync; import org.gcube.portlets.user.td.gwtservice.shared.exception.TDGWTIsFinalException; 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.TabResource; 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.column.ColumnData; import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.core.client.GWT; 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.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.util.Margins; import com.sencha.gxt.data.shared.LabelProvider; import com.sencha.gxt.data.shared.ListStore; import com.sencha.gxt.widget.core.client.FramedPanel; import com.sencha.gxt.widget.core.client.Window; 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.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; import com.sencha.gxt.widget.core.client.info.Info; /** * * @author "Giancarlo Panichi" * */ public class ConnectCodelistDialog extends Window implements CodelistSelectionListener { protected String WIDTH = "500px"; protected String HEIGHT = "150px"; protected ArrayList listeners; protected ComboBox comboDimensionType = null; protected FieldLabel comboDimensionTypeLabel; protected ListStore storeComboDimensionType; protected ComboBox comboColumnReferenceType = null; protected FieldLabel comboColumnReferenceTypeLabel; protected ListStore storeComboColumnReferenceType; protected EventBus eventBus; private TextButton btnApply; private TextButton btnClose; public ConnectCodelistDialog(EventBus eventBus) { listeners = new ArrayList(); this.eventBus = eventBus; initWindow(); create(); } protected void create() { final FramedPanel panel = new FramedPanel(); panel.setHeaderVisible(false); panel.setBodyBorder(false); // Attach Codelist // comboDimensionType TabResourceProperties propsDimensionType = GWT .create(TabResourceProperties.class); storeComboDimensionType = new ListStore( propsDimensionType.id()); comboDimensionType = new ComboBox(storeComboDimensionType, propsDimensionType.label()); Log.trace("ComboDimensionType created"); addHandlersForComboDimensionType(propsDimensionType.label()); comboDimensionType.setEmptyText("Select a Codelist..."); comboDimensionType.setWidth(191); comboDimensionType.setEditable(false); comboDimensionType.setTriggerAction(TriggerAction.ALL); comboDimensionTypeLabel = new FieldLabel(comboDimensionType, "Codelist"); // ColumnReferenceType ColumnDataPropertiesCombo propsColumnReferenceType = GWT .create(ColumnDataPropertiesCombo.class); storeComboColumnReferenceType = new ListStore( propsColumnReferenceType.id()); comboColumnReferenceType = new ComboBox( storeComboColumnReferenceType, propsColumnReferenceType.label()); Log.trace("ComboColumnReferenceType created"); addHandlersForComboColumnReferenceType(propsColumnReferenceType.label()); comboColumnReferenceType.setEmptyText("Select a Column Reference..."); comboColumnReferenceType.setWidth(191); comboColumnReferenceType.setEditable(false); comboColumnReferenceType.setTriggerAction(TriggerAction.ALL); comboColumnReferenceTypeLabel = new FieldLabel( comboColumnReferenceType, "Column"); // Buttons btnApply = new TextButton("Connect"); btnApply.setIcon(ResourceBundle.INSTANCE.codelistLink()); btnApply.setIconAlign(IconAlign.RIGHT); btnApply.setToolTip("Connect"); btnApply.addSelectHandler(new SelectHandler() { public void onSelect(SelectEvent event) { Log.debug("Pressed Connect"); connectCodelist(); } }); 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); BoxLayoutData boxLayoutData=new BoxLayoutData(new Margins(2, 4, 2, 4)); flowButton.add(btnApply, boxLayoutData); flowButton.add(btnClose, boxLayoutData); VerticalLayoutContainer v = new VerticalLayoutContainer(); v.add(comboDimensionTypeLabel, new VerticalLayoutData(1, -1)); v.add(comboColumnReferenceTypeLabel, new VerticalLayoutData(1, -1)); v.add(flowButton, new VerticalLayoutData(1, 36, new Margins(5, 2, 5, 2))); panel.add(v); add(panel); comboColumnReferenceTypeLabel.setVisible(false); } protected void addHandlersForComboDimensionType( final LabelProvider labelProvider) { comboDimensionType.addTriggerClickHandler(new TriggerClickHandler() { @Override public void onTriggerClick(TriggerClickEvent event) { Log.debug("ComboDimension TriggerClickEvent"); callDialogCodelistSelection(); comboDimensionType.collapse(); } }); } protected void addHandlersForComboColumnReferenceType( final LabelProvider labelProvider) { comboColumnReferenceType .addSelectionHandler(new SelectionHandler() { public void onSelection(SelectionEvent event) { Info.display( "Column Reference Selected", "You selected " + (event.getSelectedItem() == null ? "nothing" : labelProvider.getLabel(event .getSelectedItem()) + "!")); Log.debug("ComboColumnReferenceType selected: " + event.getSelectedItem()); } }); } private void connectCodelist() { TabResource codelist = comboDimensionType.getCurrentValue(); if (codelist == null) { Log.debug("No codelist selected"); UtilsGXT3.alert("Attention", "Select a valid codelist"); } else { ColumnData connection = comboColumnReferenceType.getCurrentValue(); if (connection == null) { Log.debug("No connection selected"); UtilsGXT3.alert("Attention", "Select a valid column"); } else { fireCompleted(connection); } } } protected void callDialogCodelistSelection() { CodelistSelectionDialog dialogCodelistSelection = new CodelistSelectionDialog( eventBus); dialogCodelistSelection.addListener(this); dialogCodelistSelection.show(); } @Override public void selected(TabResource tabResource) { Log.debug("Selected Codelist: " + tabResource); storeComboDimensionType.clear(); storeComboDimensionType.add(tabResource); storeComboDimensionType.commitChanges(); comboDimensionType.setValue(tabResource); retrieveConnectedColumnData(tabResource); } @Override public void aborted() { Log.debug("Select Codelist Aborted"); } @Override public void failed(String reason, String detail) { Log.error("Select Codelist Failed[reason: " + reason + " , detail:" + detail + "]"); } protected void retrieveConnectedColumnData(TabResource tabResource) { TDGWTServiceAsync.INSTANCE.getColumnsForDimension( tabResource.getTrId(), new AsyncCallback>() { @Override public void onFailure(Throwable caught) { if (caught instanceof TDGWTSessionExpiredException) { eventBus.fireEvent(new SessionExpiredEvent( SessionExpiredType.EXPIREDONSERVER)); } else { if (caught instanceof TDGWTIsLockedException) { Log.error(caught.getLocalizedMessage()); UtilsGXT3.alert("Error Locked", caught.getLocalizedMessage()); } else { if (caught instanceof TDGWTIsFinalException) { Log.error(caught.getLocalizedMessage()); UtilsGXT3.alert("Error Final", caught.getLocalizedMessage()); } else { Log.debug("Error retrieving columns: " + caught.getLocalizedMessage()); UtilsGXT3 .alert("Error retrieving columns", "Error retrieving columns on server!"); } } } } @Override public void onSuccess(ArrayList result) { storeComboColumnReferenceType.clear(); storeComboColumnReferenceType.addAll(result); storeComboColumnReferenceType.commitChanges(); comboColumnReferenceTypeLabel.setVisible(true); comboColumnReferenceType.setMinListWidth(191); comboColumnReferenceTypeLabel.forceLayout(); } }); } protected void initWindow() { setWidth(WIDTH); setHeight(HEIGHT); setBodyBorder(false); setResizable(false); setHeadingText("Connect"); setModal(true); setClosable(true); getHeader().setIcon(ResourceBundle.INSTANCE.codelistLink()); } /** * {@inheritDoc} */ @Override protected void initTools() { super.initTools(); closeBtn.addSelectHandler(new SelectHandler() { public void onSelect(SelectEvent event) { close(); } }); } protected void close() { fireAborted(); hide(); } public void addListener(ConnectCodelistListener listener) { listeners.add(listener); } public void removeListener(ConnectCodelistListener listener) { listeners.remove(listener); } public void fireCompleted(ColumnData connection) { for (ConnectCodelistListener listener : listeners) listener.selectedConnectCodelist(connection); hide(); } public void fireAborted() { for (ConnectCodelistListener listener : listeners) listener.abortedConnectCodelist(); hide(); } public void fireFailed(String reason, String details) { for (ConnectCodelistListener listener : listeners) listener.failedConnectCodelist(reason, details); hide(); } }