389 lines
13 KiB
Java
389 lines
13 KiB
Java
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" <a
|
|
* href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
|
|
*
|
|
*/
|
|
public class CreateRuleOnTableDefinitionCard extends WizardCard {
|
|
|
|
public interface DataTypePropertiesCombo extends
|
|
PropertyAccess<ColumnDataType> {
|
|
|
|
@Path("id")
|
|
ModelKeyProvider<ColumnDataType> id();
|
|
|
|
LabelProvider<ColumnDataType> label();
|
|
|
|
}
|
|
|
|
private static int seq;
|
|
private CreateRuleOnTableDefinitionCard thisCard;
|
|
private TDRuleTableType tdRuleTableType;
|
|
private Grid<RuleColumnPlaceHolderDescriptor> grid;
|
|
private ListStore<RuleColumnPlaceHolderDescriptor> 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<RuleColumnPlaceHolderDescriptor, String> labelColumn = new ColumnConfig<RuleColumnPlaceHolderDescriptor, String>(
|
|
props.label(), 220, "Label");
|
|
ColumnConfig<RuleColumnPlaceHolderDescriptor, ColumnDataType> columnDataTypeColumn = new ColumnConfig<RuleColumnPlaceHolderDescriptor, ColumnDataType>(
|
|
props.columnDataType(), 130, "Data Type");
|
|
|
|
ArrayList<ColumnConfig<RuleColumnPlaceHolderDescriptor, ?>> l = new ArrayList<ColumnConfig<RuleColumnPlaceHolderDescriptor, ?>>();
|
|
l.add(labelColumn);
|
|
l.add(columnDataTypeColumn);
|
|
|
|
ColumnModel<RuleColumnPlaceHolderDescriptor> columns = new ColumnModel<RuleColumnPlaceHolderDescriptor>(
|
|
l);
|
|
|
|
store = new ListStore<RuleColumnPlaceHolderDescriptor>(props.id());
|
|
|
|
final GridSelectionModel<RuleColumnPlaceHolderDescriptor> sm = new GridSelectionModel<RuleColumnPlaceHolderDescriptor>();
|
|
sm.setSelectionMode(SelectionMode.SINGLE);
|
|
|
|
grid = new Grid<RuleColumnPlaceHolderDescriptor>(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<RuleColumnPlaceHolderDescriptor> ds = new GridDragSource<RuleColumnPlaceHolderDescriptor>(
|
|
grid);
|
|
ds.addDragStartHandler(new DndDragStartHandler() {
|
|
|
|
@Override
|
|
public void onDragStart(DndDragStartEvent event) {
|
|
@SuppressWarnings("unchecked")
|
|
ArrayList<RuleColumnPlaceHolderDescriptor> draggingSelection = (ArrayList<RuleColumnPlaceHolderDescriptor>) event
|
|
.getData();
|
|
Log.debug("Start Drag: " + draggingSelection);
|
|
|
|
}
|
|
});
|
|
GridDropTarget<RuleColumnPlaceHolderDescriptor> dt = new GridDropTarget<RuleColumnPlaceHolderDescriptor>(
|
|
grid);
|
|
dt.setFeedback(Feedback.BOTH);
|
|
dt.setAllowSelfAsSource(true);
|
|
|
|
// EDITING //
|
|
DataTypePropertiesCombo dataTypePropertiesCombo = GWT
|
|
.create(DataTypePropertiesCombo.class);
|
|
|
|
ListStore<ColumnDataType> storeComboColumnDataType = new ListStore<ColumnDataType>(
|
|
dataTypePropertiesCombo.id());
|
|
storeComboColumnDataType.addAll(ColumnDataType.asList());
|
|
|
|
ComboBox<ColumnDataType> comboColumnDataType = new ComboBox<ColumnDataType>(
|
|
storeComboColumnDataType, dataTypePropertiesCombo.label());
|
|
comboColumnDataType.setClearValueOnParseError(false);
|
|
|
|
comboColumnDataType.setTriggerAction(TriggerAction.ALL);
|
|
|
|
final TextField labelField = new TextField();
|
|
labelField.addValidator(new EmptyValidator<String>());
|
|
|
|
final GridRowEditing<RuleColumnPlaceHolderDescriptor> editing = new GridRowEditing<RuleColumnPlaceHolderDescriptor>(
|
|
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<RuleColumnPlaceHolderDescriptor>() {
|
|
|
|
@Override
|
|
public void onBeforeStartEdit(
|
|
BeforeStartEditEvent<RuleColumnPlaceHolderDescriptor> event) {
|
|
addButton.setEnabled(false);
|
|
setEnableNextButton(false);
|
|
}
|
|
});
|
|
|
|
editing.addCancelEditHandler(new CancelEditHandler<RuleColumnPlaceHolderDescriptor>() {
|
|
|
|
@Override
|
|
public void onCancelEdit(
|
|
CancelEditEvent<RuleColumnPlaceHolderDescriptor> event) {
|
|
store.rejectChanges();
|
|
addButton.setEnabled(true);
|
|
setEnableNextButton(true);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
editing.addCompleteEditHandler(new CompleteEditHandler<RuleColumnPlaceHolderDescriptor>() {
|
|
|
|
@Override
|
|
public void onCompleteEdit(
|
|
CompleteEditEvent<RuleColumnPlaceHolderDescriptor> 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<RuleColumnPlaceHolderDescriptor>(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());
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
public void dispose() {
|
|
|
|
}
|
|
|
|
}
|