package org.gcube.portlets.user.td.rulewidget.client.multicolumn; import java.util.ArrayList; import org.gcube.portlets.user.td.expressionwidget.client.properties.RuleColumnPlaceHolderDescriptorProperties; import org.gcube.portlets.user.td.gwtservice.shared.rule.RuleColumnPlaceHolderDescriptor; import org.gcube.portlets.user.td.gwtservice.shared.rule.type.TDRuleTableType; import org.gcube.portlets.user.td.rulewidget.client.resources.ResourceBundle; import org.gcube.portlets.user.td.widgetcommonevent.shared.tr.column.ColumnDataType; import org.gcube.portlets.user.td.wizardwidget.client.WizardCard; 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.editor.client.Editor.Path; import com.google.gwt.user.client.Command; 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.Style.SelectionMode; import com.sencha.gxt.core.client.util.Margins; import com.sencha.gxt.core.client.util.Padding; import com.sencha.gxt.data.shared.LabelProvider; import com.sencha.gxt.data.shared.ListStore; import com.sencha.gxt.data.shared.ModelKeyProvider; import com.sencha.gxt.data.shared.PropertyAccess; import com.sencha.gxt.dnd.core.client.DND.Feedback; import com.sencha.gxt.dnd.core.client.DndDragStartEvent; import com.sencha.gxt.dnd.core.client.DndDragStartEvent.DndDragStartHandler; import com.sencha.gxt.dnd.core.client.GridDragSource; import com.sencha.gxt.dnd.core.client.GridDropTarget; import com.sencha.gxt.widget.core.client.box.AlertMessageBox; import com.sencha.gxt.widget.core.client.button.ButtonBar; import com.sencha.gxt.widget.core.client.button.TextButton; import com.sencha.gxt.widget.core.client.container.MarginData; 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.BeforeStartEditEvent; import com.sencha.gxt.widget.core.client.event.BeforeStartEditEvent.BeforeStartEditHandler; import com.sencha.gxt.widget.core.client.event.CancelEditEvent; import com.sencha.gxt.widget.core.client.event.CancelEditEvent.CancelEditHandler; import com.sencha.gxt.widget.core.client.event.CompleteEditEvent; import com.sencha.gxt.widget.core.client.event.CompleteEditEvent.CompleteEditHandler; 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.form.ComboBox; import com.sencha.gxt.widget.core.client.form.FormPanel; import com.sencha.gxt.widget.core.client.form.TextField; import com.sencha.gxt.widget.core.client.form.validator.EmptyValidator; import com.sencha.gxt.widget.core.client.grid.ColumnConfig; import com.sencha.gxt.widget.core.client.grid.ColumnModel; import com.sencha.gxt.widget.core.client.grid.Grid; import com.sencha.gxt.widget.core.client.grid.Grid.GridCell; import com.sencha.gxt.widget.core.client.grid.GridSelectionModel; import com.sencha.gxt.widget.core.client.grid.editing.GridRowEditing; import com.sencha.gxt.widget.core.client.toolbar.ToolBar; /** * * @author "Giancarlo Panichi" g.panichi@isti.cnr.it * */ public class CreateRuleOnTableDefinitionCard extends WizardCard { public interface DataTypePropertiesCombo extends PropertyAccess { @Path("id") ModelKeyProvider id(); LabelProvider label(); } private static int seq; private CreateRuleOnTableDefinitionCard thisCard; private TDRuleTableType tdRuleTableType; private Grid grid; private ListStore store; private boolean addStatus; public CreateRuleOnTableDefinitionCard() { super("Columns Definition", "N.B. Use drag and drop in order to change the position of the columns"); this.thisCard = this; FormPanel panel = createPanel(); setCenterWidget(panel, new MarginData(0)); } protected FormPanel createPanel() { FormPanel panel = new FormPanel(); panel.setLabelWidth(90); panel.getElement().setPadding(new Padding(5)); VerticalLayoutContainer v = new VerticalLayoutContainer(); panel.add(v); // Grid RuleColumnPlaceHolderDescriptorProperties props = GWT .create(RuleColumnPlaceHolderDescriptorProperties.class); ColumnConfig labelColumn = new ColumnConfig( props.label(), 220, "Label"); ColumnConfig columnDataTypeColumn = new ColumnConfig( props.columnDataType(), 130, "Data Type"); ArrayList> l = new ArrayList>(); l.add(labelColumn); l.add(columnDataTypeColumn); ColumnModel columns = new ColumnModel( l); store = new ListStore(props.id()); final GridSelectionModel sm = new GridSelectionModel(); sm.setSelectionMode(SelectionMode.SINGLE); grid = new Grid(store, columns); grid.setSelectionModel(sm); grid.getView().setStripeRows(true); grid.getView().setColumnLines(true); grid.getView().setAutoFill(true); grid.setBorders(false); grid.setLoadMask(true); grid.setColumnReordering(false); grid.getView().setAutoExpandColumn(labelColumn); grid.getView().setSortingEnabled(false); GridDragSource ds = new GridDragSource( grid); ds.addDragStartHandler(new DndDragStartHandler() { @Override public void onDragStart(DndDragStartEvent event) { @SuppressWarnings("unchecked") ArrayList draggingSelection = (ArrayList) event .getData(); Log.debug("Start Drag: " + draggingSelection); } }); GridDropTarget dt = new GridDropTarget( grid); dt.setFeedback(Feedback.BOTH); dt.setAllowSelfAsSource(true); // EDITING // DataTypePropertiesCombo dataTypePropertiesCombo = GWT .create(DataTypePropertiesCombo.class); ListStore storeComboColumnDataType = new ListStore( dataTypePropertiesCombo.id()); storeComboColumnDataType.addAll(ColumnDataType.asList()); ComboBox comboColumnDataType = new ComboBox( storeComboColumnDataType, dataTypePropertiesCombo.label()); comboColumnDataType.setClearValueOnParseError(false); comboColumnDataType.setTriggerAction(TriggerAction.ALL); final TextField labelField = new TextField(); labelField.addValidator(new EmptyValidator()); final GridRowEditing editing = new GridRowEditing( grid); editing.addEditor(labelColumn, labelField); editing.addEditor(columnDataTypeColumn, comboColumnDataType); final TextButton addButton = new TextButton("Add Column"); addButton.setIcon(ResourceBundle.INSTANCE.columnAdd24()); addButton.setIconAlign(IconAlign.TOP); addButton.setToolTip("Add Column"); addButton.addSelectHandler(new SelectHandler() { @Override public void onSelect(SelectEvent event) { store.size(); RuleColumnPlaceHolderDescriptor descriptor = new RuleColumnPlaceHolderDescriptor( String.valueOf(seq++), "", ColumnDataType.Text); editing.cancelEditing(); addStatus = true; editing.getCancelButton().setVisible(false); store.add(descriptor); int row = store.indexOf(descriptor); editing.startEditing(new GridCell(row, 0)); } }); TextButton deleteBtn = new TextButton("Delete"); deleteBtn.addSelectHandler(new SelectEvent.SelectHandler() { public void onSelect(SelectEvent event) { GridCell cell = editing.getActiveCell(); int rowIndex = cell.getRow(); editing.cancelEditing(); store.remove(rowIndex); store.commitChanges(); editing.getCancelButton().setVisible(true); addButton.setEnabled(true); setEnableNextButton(true); if (addStatus) { addStatus = false; } } }); ButtonBar buttonBar = editing.getButtonBar(); buttonBar.add(deleteBtn); editing.addBeforeStartEditHandler(new BeforeStartEditHandler() { @Override public void onBeforeStartEdit( BeforeStartEditEvent event) { addButton.setEnabled(false); setEnableNextButton(false); } }); editing.addCancelEditHandler(new CancelEditHandler() { @Override public void onCancelEdit( CancelEditEvent event) { store.rejectChanges(); addButton.setEnabled(true); setEnableNextButton(true); } }); editing.addCompleteEditHandler(new CompleteEditHandler() { @Override public void onCompleteEdit( CompleteEditEvent event) { try { String label = labelField.getCurrentValue(); Log.debug("Current Label: " + label); boolean exist = false; GridCell cell = event.getEditCell(); int rowIndex = cell.getRow(); RuleColumnPlaceHolderDescriptor ruleColumnPlaceHolderDescriptor = store .get(rowIndex); Log.debug("Store: " + store.getAll().toString()); for (RuleColumnPlaceHolderDescriptor descriptor : store .getAll()) { if (ruleColumnPlaceHolderDescriptor.getId().compareTo( descriptor.getId()) != 0 && label.compareToIgnoreCase(descriptor .getLabel()) == 0) { exist = true; break; } } Log.debug("Exist: " + exist); if (exist) { Log.debug("AddStatus: " + addStatus); if (addStatus) { addStatus = false; store.remove(rowIndex); store.commitChanges(); } else { store.rejectChanges(); } UtilsGXT3 .alert("Attention", "This label is already present, please choose another(case insensitive)!"); } else { store.commitChanges(); } editing.getCancelButton().setVisible(true); addButton.setEnabled(true); setEnableNextButton(true); } catch (Throwable e) { Log.error("Error in CreateRuleOnTableDefinitionCard: " + e.getLocalizedMessage()); e.printStackTrace(); } } }); // ToolBar toolBar = new ToolBar(); toolBar.add(addButton); v.add(toolBar, new VerticalLayoutData(1, -1, new Margins(0))); v.add(grid, new VerticalLayoutData(1, 1, new Margins(0))); return panel; } @Override public void setup() { Log.debug("CreateRuleOnTableDefinitionCard Setup"); Command sayNextCard = new Command() { public void execute() { Log.debug("CreateRuleOnTableDefinitionCard Call sayNextCard"); checkData(); } }; Command sayPreviousCard = new Command() { public void execute() { try { getWizardWindow().previousCard(); getWizardWindow().removeCard(thisCard); Log.info("Remove CreateRuleOnTableDefinitionCard"); } catch (Exception e) { Log.error("sayPreviousCard :" + e.getLocalizedMessage()); } } }; getWizardWindow().setPreviousButtonCommand(sayPreviousCard); getWizardWindow().setNextButtonCommand(sayNextCard); setEnableBackButton(false); setBackButtonVisible(false); setEnableNextButton(true); } protected void checkData() { getWizardWindow().setEnableNextButton(false); getWizardWindow().setEnableBackButton(false); HideHandler hideHandler = new HideHandler() { public void onHide(HideEvent event) { getWizardWindow().setEnableNextButton(true); getWizardWindow().setEnableBackButton(false); } }; if (store == null || store.size() <= 0) { AlertMessageBox d = new AlertMessageBox("Attention", "Add at least one column"); d.addHideHandler(hideHandler); d.setModal(false); d.show(); return; } tdRuleTableType = new TDRuleTableType( new ArrayList(store.getAll())); goNext(); } protected void goNext(){ try { CreateRuleOnTableExpressionCard createRuleOnTableExpressionCard = new CreateRuleOnTableExpressionCard( tdRuleTableType); getWizardWindow().addCard(createRuleOnTableExpressionCard); getWizardWindow().nextCard(); } catch (Exception e) { Log.error("sayNextCard :" + e.getLocalizedMessage()); e.printStackTrace(); } } @Override public void dispose() { } }