/* * Copyright 2011 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.formbuilder.client.effect.view; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jbpm.formapi.client.CommonGlobals; import org.jbpm.formapi.shared.api.Data; import org.jbpm.formbuilder.client.FormBuilderGlobals; import org.jbpm.formbuilder.client.bus.UndoableEvent; import org.jbpm.formbuilder.client.bus.UndoableHandler; import org.jbpm.formbuilder.client.effect.IoBindingEffect; import org.jbpm.formbuilder.client.messages.I18NConstants; import org.jbpm.formbuilder.shared.task.ExternalDataRef; import org.jbpm.formbuilder.shared.task.TaskPropertyRef; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.EventBus; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.VerticalPanel; public class IoBindingEffectView extends PopupPanel { private final I18NConstants i18n = FormBuilderGlobals.getInstance().getI18n(); private final EventBus bus = CommonGlobals.getInstance().getEventBus(); private final ListBox inputList; private final ListBox outputList; private final CheckBox externalDataCheckbox; private final ExternalDataSourcePanel externalDataPanel; private final IoBindingEffect effect; public IoBindingEffectView(IoBindingEffect ioBindingEffect) { this.effect = ioBindingEffect; HTML title = new HTML("<strong>" + i18n.SelectIoConfig() + "</strong>"); title.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); this.inputList = createVisualList(effect.getItem().getInput(), effect.getIoRef().getInputs()); this.outputList = createVisualList(effect.getItem().getOutput(), effect.getIoRef().getOutputs()); this.externalDataCheckbox = new CheckBox(); this.externalDataPanel = new ExternalDataSourcePanel(); Button applyButton = new Button(i18n.ConfirmButton()); applyButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { onApplyBinding(); } }); Button cancelButton = new Button(i18n.CancelButton()); cancelButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { hide(); } }); FlexTable table = new FlexTable(); table.setWidget(0, 0, new Label(i18n.LabelInput())); table.setWidget(0, 1, inputList); table.setWidget(1, 0, new Label(i18n.LabelOutput())); table.setWidget(1, 1, outputList); table.setWidget(2, 0, externalDataCheckbox); table.setWidget(2, 1, createExternalDataPanel()); table.setWidget(3, 0, applyButton); table.setWidget(3, 1, cancelButton); VerticalPanel vPanel = new VerticalPanel(); vPanel.add(title); vPanel.add(table); setWidget(vPanel); } private void onApplyBinding() { Map<String, Object> dataSnapshot = new HashMap<String, Object>(); String selectedInput = inputList.getValue(inputList.getSelectedIndex()); if (selectedInput != null && !"".equals(selectedInput)) { dataSnapshot.put("newInput", effect.getIoRef().getInput(selectedInput)); } else { dataSnapshot.put("newInput", null); } dataSnapshot.put("oldInput", effect.getInput()); String selectedOutput = outputList.getValue(outputList.getSelectedIndex()); if (selectedOutput != null && !"".equals(selectedOutput)) { dataSnapshot.put("newOutput", effect.getIoRef().getOutput(selectedOutput)); } else { dataSnapshot.put("newOutput", null); } dataSnapshot.put("oldOutput", effect.getOutput()); dataSnapshot.put("newExtData", externalDataPanel.getData()); dataSnapshot.put("oldExtData", effect.getExtData()); bus.fireEvent(new UndoableEvent(dataSnapshot, new UndoableHandler() { @Override public void onEvent(UndoableEvent event) { } @Override public void undoAction(UndoableEvent event) { effect.setInput((TaskPropertyRef) event.getData("oldInput")); effect.setOutput((TaskPropertyRef) event.getData("oldOutput")); effect.setExtData((ExternalDataRef) event.getData("oldExtData")); effect.fire(); } @Override public void doAction(UndoableEvent event) { effect.setInput((TaskPropertyRef) event.getData("newInput")); effect.setOutput((TaskPropertyRef) event.getData("newOutput")); effect.setExtData((ExternalDataRef) event.getData("newExtData")); effect.fire(); } })); hide(); } private ListBox createVisualList(Data ioData, List<TaskPropertyRef> ioList) { ListBox inputList = new ListBox(); String selectedInputName = ioData == null ? null : ioData.getName(); inputList.addItem("", ""); for (TaskPropertyRef io : ioList) { inputList.addItem(io.getName() + " (" + io.getSourceExpresion() + ")", io.getName()); if (selectedInputName != null && io.getName().equals(selectedInputName)) { inputList.setSelectedIndex(inputList.getItemCount() - 1); } } return inputList; } private VerticalPanel createExternalDataPanel() { final VerticalPanel panel = new VerticalPanel(); final Label message = new Label("Obtain input from external source"); panel.add(message); externalDataCheckbox.addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { panel.clear(); if (event.getValue()) { panel.add(new Label("Disregard input from external source")); externalDataPanel.flagData(); panel.add(externalDataPanel); } else { externalDataPanel.unflagData(); panel.add(message); } } }); return panel; } }