/* * This is part of Geomajas, a GIS framework, http://www.geomajas.org/. * * Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium. * * The program is available in open source according to the GNU Affero * General Public License. All contributions in this program are covered * by the Geomajas Contributors License Agreement. For full licensing * details, see LICENSE.txt in the project root. */ package org.geomajas.plugin.printing.client.widget; import java.util.LinkedHashMap; import com.google.gwt.i18n.client.LocaleInfo; import org.geomajas.gwt.client.Geomajas; import org.geomajas.gwt.client.command.AbstractCommandCallback; import org.geomajas.gwt.client.command.GwtCommand; import org.geomajas.gwt.client.command.GwtCommandDispatcher; import org.geomajas.gwt.client.util.WidgetLayout; import org.geomajas.gwt.client.widget.MapWidget; import org.geomajas.plugin.printing.client.PrintingMessages; import org.geomajas.plugin.printing.client.template.DefaultTemplateBuilder; import org.geomajas.plugin.printing.client.template.PageSize; import org.geomajas.plugin.printing.client.util.PrintingLayout; import org.geomajas.plugin.printing.client.util.UrlBuilder; import org.geomajas.plugin.printing.command.dto.PrintGetTemplateRequest; import org.geomajas.plugin.printing.command.dto.PrintGetTemplateResponse; import org.geomajas.plugin.printing.command.dto.PrintTemplateInfo; import org.geomajas.plugin.rasterizing.client.image.ImageUrlService; import org.geomajas.plugin.rasterizing.client.image.ImageUrlServiceImpl; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.HTMLPanel; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.IButton; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.CheckboxItem; import com.smartgwt.client.widgets.form.fields.FormItemIcon; import com.smartgwt.client.widgets.form.fields.RadioGroupItem; import com.smartgwt.client.widgets.form.fields.SelectItem; import com.smartgwt.client.widgets.form.fields.SliderItem; import com.smartgwt.client.widgets.form.fields.StaticTextItem; import com.smartgwt.client.widgets.form.fields.TextItem; import com.smartgwt.client.widgets.layout.VLayout; import com.smartgwt.client.widgets.tab.Tab; import com.smartgwt.client.widgets.tab.TabSet; /** * Canvas for choosing print preferences and printing. * * @author Jan De Moerloose */ public class PrintPreferencesCanvas extends Canvas { private static final PrintingMessages MESSAGES = GWT.create(PrintingMessages.class); private static final String ORIENTATION = "orientation"; private static final String LANDSCAPE = "landscape"; private static final String PORTRAIT = "portrait"; private static final String TITLE = "title"; private static final String SIZE = "size"; private static final String DOWNLOAD_TYPE = "downloadType"; private static final String SAVE = "save"; private static final String OPEN = "open"; private static final String FILENAME = "filename"; private static final String EXTENSION = ".pdf"; /** * This section is added after the dispatcher url. */ private static final String DISPATCHING_SERVICE = "printing"; private static final String URL_DOCUMENT_ID = "documentId"; private static final String URL_NAME = "name"; private static final String URL_TOKEN = "userToken"; private static final String URL_DOWNLOAD = "download"; private static final String URL_DOWNLOAD_YES = "1"; private static final String URL_DOWNLOAD_NO = "0"; private TextItem titleItem; private TextItem fileNameItem; private SelectItem sizeItem; private RadioGroupItem orientationGroup; private SliderItem rasterDpiSlider; private CheckboxItem arrowCheckbox; private CheckboxItem scaleBarCheckbox; private RadioGroupItem downloadTypeGroup; private FormItemIcon barIcon; private MapWidget mapWidget; private ImageUrlService imageUrlService = new ImageUrlServiceImpl(); public PrintPreferencesCanvas(MapWidget mapWidget) { this.mapWidget = mapWidget; // tab set TabSet tabs = new TabSet(); tabs.setWidth(PrintingLayout.printPreferencesWidth); tabs.setHeight(PrintingLayout.printPreferencesHeight); // create the one and only tab pane Tab mainPreferences = new Tab(); mainPreferences.setTitle(MESSAGES.printPrefsChoose()); // create the form DynamicForm form = new DynamicForm(); // title titleItem = new TextItem(); titleItem.setName(TITLE); titleItem.setTitle(MESSAGES.printPrefsTitleText()); // size sizeItem = new SelectItem(); sizeItem.setName(SIZE); sizeItem.setTitle(MESSAGES.printPrefsSize()); sizeItem.setValueMap(PageSize.getAllNames()); sizeItem.setValue(PageSize.A4.getName()); // orientation orientationGroup = new RadioGroupItem(); orientationGroup.setName(ORIENTATION); orientationGroup.setTitle(MESSAGES.printPrefsOrientation()); LinkedHashMap<String, String> orientations = new LinkedHashMap<String, String>(); orientations.put(LANDSCAPE, MESSAGES.printPrefsLandscape()); orientations.put(PORTRAIT, MESSAGES.printPrefsPortrait()); orientationGroup.setValueMap(orientations); orientationGroup.setVertical(false); orientationGroup.setValue(LANDSCAPE); // raster dpi slider rasterDpiSlider = new SliderItem(); rasterDpiSlider.setTitle(MESSAGES.printPrefsRasterDPI()); rasterDpiSlider.setWidth(PrintingLayout.printPreferencesResolutionWidth); rasterDpiSlider.setHeight(PrintingLayout.printPreferencesResolutionHeight); rasterDpiSlider.setMinValue(72); rasterDpiSlider.setMaxValue(600); rasterDpiSlider.setNumValues(5); // north arrow arrowCheckbox = new CheckboxItem(); arrowCheckbox.setValue(true); arrowCheckbox.setTitle(MESSAGES.printPrefsWithArrow()); // scale bar scaleBarCheckbox = new CheckboxItem(); scaleBarCheckbox.setValue(true); scaleBarCheckbox.setTitle(MESSAGES.printPrefsWithScaleBar()); // filename fileNameItem = new TextItem(); fileNameItem.setName(FILENAME); fileNameItem.setTitle(MESSAGES.printPrefsFileName()); fileNameItem.setValue(mapWidget.getMapModel().getMapInfo().getId() + EXTENSION); // progress indicator barIcon = new FormItemIcon(); barIcon.setHeight(PrintingLayout.iconWaitHeight); barIcon.setWidth(PrintingLayout.iconWaitWidth); StaticTextItem statusText = new StaticTextItem(MESSAGES.printPrefsStatus()); statusText.setIcons(barIcon); barIcon.setSrc(PrintingLayout.iconWaitBlank); // download type downloadTypeGroup = new RadioGroupItem(); downloadTypeGroup.setName(DOWNLOAD_TYPE); downloadTypeGroup.setTitle(MESSAGES.printPrefsDownloadType()); LinkedHashMap<String, String> types = new LinkedHashMap<String, String>(); types.put(SAVE, MESSAGES.printPrefsSaveAsFile()); types.put(OPEN, MESSAGES.printPrefsOpenInBrowserWindow()); downloadTypeGroup.setValueMap(types); downloadTypeGroup.setVertical(false); downloadTypeGroup.setValue(SAVE); form.setFields(titleItem, sizeItem, orientationGroup, arrowCheckbox, scaleBarCheckbox, rasterDpiSlider, fileNameItem, downloadTypeGroup, statusText); mainPreferences.setPane(form); tabs.setTabs(mainPreferences); IButton printButton = new IButton(); printButton.setTitle(MESSAGES.printPrefsPrint()); printButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { print(); } }); VLayout vLayout = new VLayout(); vLayout.setMembersMargin(WidgetLayout.marginLarge); vLayout.addMember(tabs); vLayout.addMember(printButton); addChild(vLayout); } private void stopProgress() { barIcon.setSrc(PrintingLayout.iconWaitBlank); redraw(); } private void startProgress() { barIcon.setSrc(PrintingLayout.iconWaitMoving); redraw(); } protected void print() { startProgress(); PrintGetTemplateRequest request = new PrintGetTemplateRequest(); imageUrlService.makeRasterizable(mapWidget); DefaultTemplateBuilder builder = new DefaultTemplateBuilder(); builder.setApplicationId(mapWidget.getApplicationId()); builder.setMapModel(mapWidget.getMapModel()); builder.setMarginX((int) PrintingLayout.templateMarginX); builder.setMarginY((int) PrintingLayout.templateMarginY); PageSize size = PageSize.getByName((String) sizeItem.getValue()); if (LANDSCAPE.equals(orientationGroup.getValue())) { builder.setPageHeight(size.getWidth()); builder.setPageWidth(size.getHeight()); } else { builder.setPageHeight(size.getHeight()); builder.setPageWidth(size.getWidth()); } builder.setTitleText((String) titleItem.getValue()); builder.setWithArrow((Boolean) arrowCheckbox.getValue()); builder.setWithScaleBar((Boolean) scaleBarCheckbox.getValue()); builder.setRasterDpi((Integer) rasterDpiSlider.getValue()); PrintTemplateInfo template = builder.buildTemplate(); template.getPage().setLocale(LocaleInfo.getCurrentLocale().getLocaleName()); request.setTemplate(template); final GwtCommand command = new GwtCommand(PrintGetTemplateRequest.COMMAND); command.setCommandRequest(request); GwtCommandDispatcher.getInstance().execute(command, new AbstractCommandCallback<PrintGetTemplateResponse>() { public void execute(PrintGetTemplateResponse response) { stopProgress(); UrlBuilder url = new UrlBuilder(Geomajas.getDispatcherUrl()); url.addPath(DISPATCHING_SERVICE); url.addParameter(URL_DOCUMENT_ID, response.getDocumentId()); url.addParameter(URL_NAME, (String) fileNameItem.getValue()); url.addParameter(URL_TOKEN, command.getUserToken()); if (SAVE.equals(downloadTypeGroup.getValue())) { url.addParameter(URL_DOWNLOAD, URL_DOWNLOAD_YES); String encodedUrl = url.toString(); // create a hidden iframe to avoid popups ??? HTMLPanel hiddenFrame = new HTMLPanel("<iframe src='" + encodedUrl + "'+style='position:absolute;width:0;height:0;border:0'>"); hiddenFrame.setVisible(false); addChild(hiddenFrame); } else { url.addParameter(URL_DOWNLOAD, URL_DOWNLOAD_NO); String encodedUrl = url.toString(); com.google.gwt.user.client.Window.open(encodedUrl, "_blank", null); } } }); } }