/* * JBoss, Home of Professional Open Source. * Copyright 2006, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.bpm.console.client.report; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.*; import org.gwt.mosaic.ui.client.layout.GridLayout; import org.gwt.mosaic.ui.client.layout.GridLayoutData; import org.gwt.mosaic.ui.client.layout.MosaicPanel; import org.jboss.bpm.report.model.ReportParameter; import org.jboss.bpm.report.model.ReportReference; import org.jboss.errai.workspaces.client.framework.Preferences; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Report parameter input. * * @author Heiko.Braun <heiko.braun@jboss.com> */ public class ReportParameterForm extends MosaicPanel { private List<InputField> fields = new ArrayList<InputField>(); private Preferences prefs; public ReportParameterForm(ReportReference reportReference, ReportParamCallback callback) { this.prefs = GWT.create(Preferences.class); this.add(getFormPanel(reportReference, callback)); } private Widget getFormPanel(final ReportReference reportRef, final ReportParamCallback callback) { MosaicPanel p = new MosaicPanel(); p.setPadding(5); p.add(createForm(reportRef, callback)); return p; } private MosaicPanel createForm(final ReportReference reportRef, final ReportParamCallback callback) { boolean hasParameters = reportRef.getParameterMetaData().size()>0; int numRows = hasParameters ? reportRef.getParameterMetaData().size() + 1 : 2; MosaicPanel form = new MosaicPanel(new GridLayout(2, numRows)); final Button createBtn = new Button("Create Report", new ClickHandler() { public void onClick(ClickEvent clickEvent) { Map<String, String> values = new HashMap<String, String>(); for (InputField field : fields) { values.put(field.id, field.getValue()); } if(!values.isEmpty()) { writePrefs(values, reportRef); } callback.onSumbit(values); } }); Map<String,String> preferenceValues = readPrefs(reportRef); for(final ReportParameter reportParam : reportRef.getParameterMetaData()) { String promptText = reportParam.getPromptText() != null ? reportParam.getPromptText() : reportParam.getName(); String helpText = reportParam.getHelptext() != null ? reportParam.getHelptext() : ""; final TextBox textBox = new TextBox(); String prefValue = preferenceValues.get(reportParam.getName()); if(prefValue !=null) textBox.setText(prefValue); // retain reference to values final InputField field = new InputField() { String getValue() { return textBox.getText(); } { widget = textBox; id = reportParam.getName(); } }; fields.add(field); form.add(new HTML("<b>"+promptText+"</b><br/>"+helpText)); form.add(textBox); } // fallback if(!hasParameters) { form.add(new HTML("This report doesn't require any paramters.") , new GridLayoutData(2,1, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_TOP)); } // submit form.add(new HTML("")); form.add(createBtn, new GridLayoutData(HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_BOTTOM)); return form; } private void writePrefs(Map<String, String> values, ReportReference reportRef) { String name = reportRef.getTitle().replaceAll(" ","_"); String prefKey = "bpm-form-"+name; StringBuffer sb = new StringBuffer(); int i = 1; for(String key : values.keySet()) { sb.append(key).append("=").append(values.get(key)); if(i<values.keySet().size()) sb.append(","); i++; } prefs.set(prefKey, sb.toString()); } private Map<String, String> readPrefs(ReportReference reportRef) { Map<String,String> values = new HashMap<String,String>(); String name = reportRef.getTitle().replaceAll(" ","_"); String prefKey = "bpm-form-"+name; if(prefs.has(prefKey)) { String prefValue = prefs.get(prefKey); String[] tokens = prefValue.split(","); for(int i=0; i<tokens.length; i++) { String[] tuple = tokens[i].split("="); values.put(tuple[0], tuple[1]); } } return values; } private class InputField { Widget widget; String id; String getValue() { throw new IllegalArgumentException("Override this method"); } } }