package org.activityinfo.ui.client.page.entry.form; /* * #%L * ActivityInfo Server * %% * Copyright (C) 2009 - 2013 UNICEF * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import com.extjs.gxt.ui.client.event.ButtonEvent; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.MessageBoxEvent; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.widget.MessageBox; import com.extjs.gxt.ui.client.widget.Window; import com.extjs.gxt.ui.client.widget.button.Button; import com.extjs.gxt.ui.client.widget.layout.FlowLayout; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.IFrameElement; import com.google.gwt.resources.client.TextResource; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Frame; import org.activityinfo.i18n.shared.I18N; import org.activityinfo.legacy.client.Dispatcher; import org.activityinfo.legacy.client.monitor.MaskingAsyncMonitor; import org.activityinfo.legacy.shared.command.GetActivityForm; import org.activityinfo.legacy.shared.model.*; import org.activityinfo.ui.client.page.entry.form.resources.SiteFormResources; public class PrintDataEntryForm extends Window { private StringBuilder html; private Frame frame; private Dispatcher dispatcher; public PrintDataEntryForm(Dispatcher dispatcher) { this.dispatcher = dispatcher; setHeadingText(I18N.CONSTANTS.preview()); setWidth(450); setHeight(250); frame = new Frame(); frame.getElement().setPropertyInt("frameBorder", 0); frame.setSize("100%", "100%"); setLayout(new FlowLayout()); add(frame); getButtonBar().add(new Button(I18N.CONSTANTS.printForm(), new SelectionListener<ButtonEvent>() { @Override public void componentSelected(ButtonEvent ce) { doPrint(getFrameElement()); } })); getButtonBar().add(new Button(I18N.CONSTANTS.close(), new SelectionListener<ButtonEvent>() { @Override public void componentSelected(ButtonEvent ce) { PrintDataEntryForm.this.hide(); } })); } public void print(final int activityId) { setVisible(true); dispatcher.execute(new GetActivityForm(activityId), new MaskingAsyncMonitor(this, I18N.CONSTANTS.loading()), new AsyncCallback<ActivityFormDTO>() { @Override public void onFailure(Throwable caught) { showError(caught); } @Override public void onSuccess(ActivityFormDTO result) { renderForm(result); } }); } private void renderForm(ActivityFormDTO activity) { try { String html = render(activity); getFrameElement().getStyle().setBackgroundColor("white"); fillIframe(getFrameElement(), html); } catch (Exception e) { showError(e); } } private final native void fillIframe(IFrameElement iframe, String content) /*-{ var doc = iframe.document; if (iframe.contentDocument) { doc = iframe.contentDocument; // For NS6 } else if (iframe.contentWindow) { doc = iframe.contentWindow.document; // For IE5.5 and IE6 } // Put the content in the iframe doc.open(); doc.writeln(content); doc.close(); }-*/; private void showError(Throwable e) { MessageBox.alert(I18N.CONSTANTS.error(), "There was an error printing the data entry form: " + e.getMessage(), new Listener<MessageBoxEvent>() { @Override public void handleEvent(MessageBoxEvent be) { PrintDataEntryForm.this.hide(); } }); } private String render(ActivityFormDTO activity) { String contents = getFormContents(); contents = contents.replace("{$activityName}", activity.getName()) .replace("{$databaseName}", activity.getDatabaseName()) .replace("{$activityName}", activity.getName()) .replace("{$projectName}", addProjects(activity)) .replace("{$indicators}", addIndicators(activity)) .replace("{$attributes}", addAttributes(activity)); html = new StringBuilder(); html.append(contents); return html.toString(); } private String addProjects(ActivityFormDTO activity) { String result = ""; for (ProjectDTO projectDTO : activity.getProjects()) { result += projectDTO.getName() + ","; } return result; } private String getFormContents() { TextResource formPage = SiteFormResources.INSTANCE.collectionForm(); return formPage.getText(); } private void schedulePrint() { Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { doPrint(getFrameElement()); } }); } private static native void doPrint(IFrameElement frame) /*-{ var contentWindow = frame.contentWindow; contentWindow.focus(); contentWindow.print(); }-*/; private String addIndicators(ActivityFormDTO activity) { StringBuilder builder = new StringBuilder(); builder.append("<table border=\"1px\" align=\"left\" cellpadding=\"0\" cellspacing=\"0\" " + "class=\"form-detail\">"); for (IndicatorGroup group : activity.groupIndicators()) { if (group.getName() != null) { builder.append("<tr><td colspan='3'><h3 class='indicatorGroup'> " + group.getName() + "</h3><td></tr>"); } builder.append("<tr>"); builder.append("<td>Indicator</td>"); builder.append("<td>Valeur</td>"); builder.append("<td>Units</td>"); builder.append("</tr>"); for (IndicatorDTO indicator : group.getIndicators()) { addIndicator(indicator, builder); } } builder.append("</table>"); return builder.toString(); } private void addIndicator(IndicatorDTO indicator, StringBuilder builder) { builder.append("<tr>"); builder.append("<td>" + indicator.getName() + "</td>"); builder.append("<td> </td>"); builder.append("<td>" + indicator.getUnits() + "</td>"); builder.append("</tr>"); } private String addAttributes(ActivityFormDTO activity) { StringBuilder builder = new StringBuilder(); for (AttributeGroupDTO attributeGroup : activity.getAttributeGroups()) { builder.append("<tr>"); builder.append("<td id=\"field-set\" valign=\"top\">" + attributeGroup.getName() + ":</td><td>"); attributeCheckBoxGroup(attributeGroup, builder); builder.append("</td></tr>"); } return builder.toString(); } private void attributeCheckBoxGroup(AttributeGroupDTO group, StringBuilder builder) { for (AttributeDTO attribture : group.getAttributes()) { builder.append("[ ] " + attribture.getName() + "<br />"); } } private IFrameElement getFrameElement() { return frame.getElement().cast(); } }