d@9611: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde d@9611: * Software engineering by d@9611: * Björnsen Beratende Ingenieure GmbH d@9611: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt d@9611: * d@9611: * This file is Free Software under the GNU AGPL (>=v3) d@9611: * and comes with ABSOLUTELY NO WARRANTY! Check out the d@9611: * documentation coming with Dive4Elements River for details. d@9611: */ d@9611: package org.dive4elements.river.client.client.ui.sinfo; d@9611: d@9611: import java.util.ArrayList; d@9611: import java.util.List; d@9611: d@9611: import org.dive4elements.river.client.client.ui.AbstractUIProvider; d@9611: import org.dive4elements.river.client.client.ui.DatacageWidget; d@9611: import org.dive4elements.river.client.client.ui.DatacageWidgetData; d@9611: import org.dive4elements.river.client.client.ui.PanelHelper; d@9611: import org.dive4elements.river.client.shared.model.Data; d@9611: import org.dive4elements.river.client.shared.model.DataItem; d@9611: import org.dive4elements.river.client.shared.model.DataList; d@9611: import org.dive4elements.river.client.shared.model.DefaultData; d@9611: import org.dive4elements.river.client.shared.model.DefaultDataItem; d@9624: import org.dive4elements.river.client.shared.model.InfrastructureServerClientXChange; d@9624: import org.dive4elements.river.client.shared.model.InfrastructureServerClientXChange.Element; d@9611: import org.dive4elements.river.client.shared.model.User; d@9611: d@9611: import com.google.gwt.core.client.GWT; d@9611: import com.smartgwt.client.types.ListGridFieldType; d@9611: import com.smartgwt.client.util.SC; d@9611: import com.smartgwt.client.widgets.Button; d@9611: import com.smartgwt.client.widgets.Canvas; d@9611: import com.smartgwt.client.widgets.Label; d@9611: import com.smartgwt.client.widgets.events.ClickEvent; d@9611: import com.smartgwt.client.widgets.events.ClickHandler; d@9611: import com.smartgwt.client.widgets.grid.ListGrid; d@9611: import com.smartgwt.client.widgets.grid.ListGridField; d@9611: import com.smartgwt.client.widgets.grid.ListGridRecord; d@9611: import com.smartgwt.client.widgets.grid.events.RecordClickEvent; d@9611: import com.smartgwt.client.widgets.grid.events.RecordClickHandler; d@9611: import com.smartgwt.client.widgets.layout.HLayout; d@9611: import com.smartgwt.client.widgets.layout.Layout; d@9611: import com.smartgwt.client.widgets.layout.VLayout; d@9611: import com.smartgwt.client.widgets.tree.TreeNode; d@9611: d@9611: /** d@9611: * @author Domenico Nardi Tironi d@9611: * d@9611: */ d@9611: public class FloodInfrastructurePanel extends AbstractUIProvider { d@9611: private static final long serialVersionUID = 1L; d@9611: d@9611: private static final String datakey = "flood_infrastructure"; d@9611: private ListGrid elements = new ListGrid(); d@9611: d@9611: private final User m_user; d@9611: d@9624: private final InfrastructureServerClientXChange xchangeHelper = new InfrastructureServerClientXChange(); d@9624: d@9624: private Button submit; d@9624: d@9611: public FloodInfrastructurePanel(final User user) { d@9611: this.m_user = user; d@9611: } d@9611: d@9624: protected final ListGrid createTable(final Layout root, final DataList data, final String width) { d@9611: d@9611: final Label title = new Label(data.get(0).getDescription()); d@9611: title.setHeight("35px"); d@9611: d@9611: this.elements.setWidth(width); d@9611: this.elements.setHeight(300); d@9611: this.elements.setShowHeaderContextMenu(false); d@9611: this.elements.setCanReorderFields(false); d@9611: this.elements.setCanSort(true); d@9611: this.elements.setSortField("to"); d@9611: this.elements.setCanResizeFields(false); d@9611: d@9624: this.elements.setCanEdit(false); d@9611: d@9624: final ListGridField groupIdField = new ListGridField("group_id", "groupId"); d@9624: groupIdField.setHidden(true); d@9611: d@9624: final ListGridField groupField = createField("group_label", "Infrastruktur BWaStr");// this.MSG.uinfo_vegetation_zones_label()); d@9611: d@9624: final ListGridField typeIdField = new ListGridField("type_id", "typeId"); d@9624: typeIdField.setHidden(true); d@9624: d@9624: final ListGridField typeField = createField("type_label", "Typ/Bezeichnung");// this.MSG.uinfo_vegetation_zones_label()); d@9611: d@9611: final ListGridField removeField = PanelHelper.createRemoveField(this.elements, GWT.getHostPageBaseURL() + this.MSG.removeFeature()); d@9611: this.elements.addRecordClickHandler(new RecordClickHandler() { // adding another custom record-Remove-Handler which is not included in the d@9611: @Override d@9611: public void onRecordClick(final RecordClickEvent event) { d@9611: if (event.getField().getName().equals(removeField.getName())) { d@9624: final ListGridRecord r = event.getRecord(); d@9624: final Element infrastr = new Element(r.getAttribute("group_id"), r.getAttribute("group_label"), r.getAttribute("type_id"), d@9624: r.getAttribute("type_label")); d@9624: FloodInfrastructurePanel.this.xchangeHelper.removeObject(infrastr); d@9624: d@9624: validateInput(); d@9611: } d@9611: } d@9611: }); d@9624: this.elements.setFields(groupIdField, groupField, typeIdField, typeField, removeField); d@9611: d@9611: root.setWidth(width); d@9611: root.addMember(title); d@9611: root.addMember(this.elements); d@9611: root.addMember(PanelHelper.getSpacer(3)); d@9611: root.addMember(PanelHelper.getSpacer(3)); d@9611: return this.elements; d@9624: } d@9611: d@9624: private ListGridField createField(final String id, final String label) { d@9624: final ListGridField field = new ListGridField(id, label);// this.MSG.uinfo_vegetation_zones_label()); d@9624: field.setType(ListGridFieldType.TEXT); d@9624: field.setWidth("*"); // 245 d@9624: field.setCanSort(false); d@9624: field.setCanDragResize(true); d@9624: field.setCanEdit(false); d@9624: return field; d@9611: } d@9611: d@9611: @Override d@9611: public final VLayout create(final DataList data) { d@9611: final VLayout layout = new VLayout(); d@9611: d@9624: final List items = data.getAll(); d@9624: final Data str = getData(items, datakey); d@9624: final DataItem[] strItems = str.getItems(); d@9624: if (strItems.length > 0) d@9624: this.xchangeHelper.parseAndAdd(strItems[0].getStringValue()); d@9624: d@9611: final Canvas helper = createHelper(data); d@9611: if (helper != null) d@9611: this.helperContainer.addMember(helper); d@9611: d@9624: this.submit = (Button) getNextButton(); d@9611: d@9611: final VLayout root = new VLayout(); d@9611: root.setWidth(450); d@9611: createWidget(root, data); d@9611: d@9611: layout.addMember(root); d@9624: layout.addMember(this.submit); d@9611: d@9611: return layout; d@9611: } d@9611: d@9624: private void validateInput() { d@9624: if (this.xchangeHelper.getItems().size() > 0) d@9624: this.submit.enable(); d@9624: else d@9624: this.submit.disable(); d@9624: } d@9611: d@9624: private Canvas createHelper(final DataList dataList) { d@9624: d@9624: final DatacageWidgetData data = new DatacageWidgetData(this.artifact, this.m_user, "sinfo_floodduration_infrastructures", "load-system:true", false); d@9611: d@9611: final DatacageWidget datacage = new DatacageWidget(data); d@9611: d@9611: final Button plusBtn = new Button("Hinzufügen"); // this.MSG.uinfo_inundation_duration_set_vegetation_zone() d@9611: plusBtn.addClickHandler(new ClickHandler() { d@9611: @Override d@9611: public void onClick(final ClickEvent event) { d@9611: handlePlusClicked(datacage); d@9611: } d@9611: }); d@9611: d@9611: final VLayout helperLayout = new VLayout(); d@9611: helperLayout.addMember(datacage); d@9611: helperLayout.addMember(plusBtn); d@9611: d@9611: return helperLayout; d@9611: } d@9611: d@9611: private void handlePlusClicked(final DatacageWidget datacage) { d@9611: final List selection = datacage.getPlainSelection(); d@9611: if (selection == null || selection.isEmpty()) { d@9624: SC.say(FloodInfrastructurePanel.this.MSG.warning()); d@9611: return; d@9611: } d@9611: d@9624: for (final TreeNode selectedNode : selection) { d@9624: final String groupId = selectedNode.getAttribute("group_id"); // node-names from meta-data.xml d@9624: final String groupLabel = selectedNode.getAttribute("group_label"); d@9624: final String typeId = selectedNode.getAttribute("type_id"); d@9624: final String typeLabel = selectedNode.getAttribute("type_label"); d@9611: d@9624: if (isEmpty(groupId) || isEmpty(groupLabel) || isEmpty(typeId) || isEmpty(typeLabel)) d@9624: continue; d@9611: d@9624: final InfrastructureServerClientXChange.Element infrastr = new InfrastructureServerClientXChange.Element(groupId, groupLabel, typeId, typeLabel); d@9624: if (this.xchangeHelper.containsObject(infrastr)) d@9624: continue; d@9611: d@9624: this.xchangeHelper.addObject(infrastr); d@9624: d@9624: this.elements.addData(createEntry(infrastr)); d@9624: } d@9624: validateInput(); d@9611: } d@9611: d@9624: private boolean isEmpty(final String test) { d@9624: if (test == null) d@9624: return true; d@9624: if (test.trim().equals("")) d@9624: return true; d@9624: return false; d@9624: } d@9611: d@9624: public final ListGridRecord createEntry(final InfrastructureServerClientXChange.Element row) { d@9611: final ListGridRecord r = new ListGridRecord(); d@9624: r.setAttribute("group_id", row.getGroupId()); d@9624: r.setAttribute("group_label", row.getGroupLabel()); d@9624: r.setAttribute("type_id", row.getTypeId()); d@9624: r.setAttribute("type_label", row.getTypeLabel()); d@9611: return r; d@9611: } d@9611: d@9611: public void createWidget(final Layout root, final DataList data) { d@9611: d@9624: this.elements = createTable(root, data, "420"); d@9611: d@9624: for (final Element item : this.xchangeHelper.getItems()) d@9624: this.elements.addData(createEntry(item)); d@9624: validateInput(); d@9611: } d@9611: d@9611: @Override d@9611: public Canvas createOld(final DataList dataList) { d@9611: final HLayout layout = new HLayout(); d@9611: layout.setWidth("400px"); d@9611: final VLayout vLayout = new VLayout(); d@9611: vLayout.setWidth(130); d@9611: final Label label = new Label(dataList.getLabel()); d@9611: label.setWidth("200px"); d@9611: label.setHeight("25px"); d@9611: d@9611: final List items = dataList.getAll(); d@9611: final Data str = getData(items, datakey); d@9611: final DataItem[] strItems = str.getItems(); d@9611: d@9624: final List items1 = InfrastructureServerClientXChange.parse(strItems[0].getStringValue()); d@9624: d@9624: final StringBuilder builder = new StringBuilder(); d@9624: d@9624: for (final Element infrastr : items1) { d@9624: builder.append(infrastr.getGroupLabel()).append(" - ").append(infrastr.getTypeLabel()).append("; "); d@9624: } d@9624: if (builder.length() > 1) d@9624: builder.deleteCharAt(builder.length() - 2); d@9624: else d@9624: builder.append(" - keine Auswahl - (will never appear because the workflow is being disabled when the table is empty) "); d@9624: final Label dateLabel = new Label(builder.toString()); d@9611: dateLabel.setHeight("20px"); d@9611: vLayout.addMember(dateLabel); d@9611: d@9611: final Canvas back = getBackButton(dataList.getState()); d@9611: layout.addMember(label); d@9611: layout.addMember(vLayout); d@9611: layout.addMember(back); d@9611: d@9611: return layout; d@9611: } d@9611: d@9611: @Override d@9611: protected final Data[] getData() { d@9611: final List data = new ArrayList(); d@9611: d@9611: final ListGridRecord[] lgr = this.elements.getRecords(); d@9611: if (lgr.length == 0) { d@9611: } d@9624: final String dataStr = this.xchangeHelper.parseListToDataString(); d@9611: d@9624: final DataItem item = new DefaultDataItem(datakey, null, d@9624: dataStr.equals("") ? "Non-Empty Value -> createOld would be called (not necessary, because workflow is disabled when table is empty)" d@9624: : dataStr); d@9611: data.add(new DefaultData(datakey, null, null, new DataItem[] { item })); d@9611: return data.toArray(new Data[data.size()]); d@9611: } d@9611: d@9611: }