Java tutorial
/****************************************************************************** * Copyright (c) 2002, 2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation ****************************************************************************/ package org.eclipse.gmf.runtime.diagram.ui.internal.pagesetup; import java.awt.geom.Point2D; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gmf.runtime.common.core.util.Log; import org.eclipse.gmf.runtime.common.core.util.Trace; import org.eclipse.gmf.runtime.common.ui.util.DisplayUtils; import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; import org.eclipse.gmf.runtime.diagram.ui.figures.IExpandableFigure; import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIDebugOptions; import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIPlugin; import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIStatusCodes; import org.eclipse.gmf.runtime.diagram.ui.internal.properties.WorkspaceViewerProperties; import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTError; import org.eclipse.swt.printing.Printer; /** * Helper to get information about a page. Used by page breaks and print * preview. * * @author Wayne Diu, wdiu */ public class PageInfoHelper { /** * Calculate the diagram bounds excluding the page breaks figure * * @param diagramEditPart, the diagram edit part containing the diagram * we are calculating the bounds for. * @param pageBreakClass, figures of this class should be ignored * * @return rectangle bounds of the diagram's children */ public static Rectangle getChildrenBounds(DiagramEditPart diagramEditPart, Class pageBreakClass) { Rectangle diagramRec = null; Point location = new Point(); IFigure f = diagramEditPart.getContentPane(); List list = f.getChildren(); if (java.util.Collections.EMPTY_LIST == list) { return new Rectangle(); } boolean init = true; for (int i = 0; i < list.size(); i++) { Figure childFigure = (Figure) list.get(i); if (pageBreakClass != null && pageBreakClass.isInstance(childFigure)) { continue; } Rectangle r = null; Point childLocation = null; if (childFigure instanceof IExpandableFigure) { r = ((IExpandableFigure) childFigure).getExtendedBounds(); childLocation = r.getLocation(); } else { r = childFigure.getBounds(); childLocation = childFigure.getLocation(); } if (init) { location.x = childLocation.x; location.y = childLocation.y; diagramRec = r; init = false; } diagramRec = diagramRec.getUnion(r); if (childLocation.x < location.x) { location.x = childLocation.x; } if (childLocation.y < location.y) { location.y = childLocation.y; } } if (diagramRec == null) { // The diagram is empty return new Rectangle(); } else { diagramRec.x = location.x; diagramRec.y = location.y; } return diagramRec; } /** * Utility method that calculate the printer page size. * @return point the page size point.x == width, point.y == height */ public static Point getPageSize(IPreferenceStore store, IMapMode mm) { return getPageSize(store, true, mm); } /** * Utility method that calculate the printer page size. * @return point the page size point.x == width, point.y == height */ public static Point getPageSize(IPreferenceStore store, boolean subtractMargins, IMapMode mm) { double paperSizeWidth = store.getDouble(WorkspaceViewerProperties.PREF_PAGE_WIDTH); double paperSizeHeight = store.getDouble(WorkspaceViewerProperties.PREF_PAGE_HEIGHT); double leftMargin = store.getDouble(WorkspaceViewerProperties.PREF_MARGIN_LEFT); double topMargin = store.getDouble(WorkspaceViewerProperties.PREF_MARGIN_TOP); double bottomMargin = store.getDouble(WorkspaceViewerProperties.PREF_MARGIN_BOTTOM); double rightMargin = store.getDouble(WorkspaceViewerProperties.PREF_MARGIN_RIGHT); //if (nnn // .LANDSCAPE // .equals( // store.getString(WorkspaceViewerProperties.PAGE_ORIENTATION))) { // double temp = paperSizeWidth; // paperSizeWidth = paperSizeHeight; // paperSizeHeight = temp; //} if (store.getBoolean(WorkspaceViewerProperties.PREF_USE_LANDSCAPE)) { double temp = paperSizeWidth; paperSizeWidth = paperSizeHeight; paperSizeHeight = temp; } // inches double width = paperSizeWidth; double height = paperSizeHeight; if (subtractMargins) { width -= (leftMargin + rightMargin); height -= (topMargin + bottomMargin); } int[] paperSize = { 0, 0 }; org.eclipse.swt.widgets.Display display = DisplayUtils.getDisplay(); org.eclipse.swt.graphics.Point displayDPI = display.getDPI(); paperSize[0] = mm.DPtoLP((int) (width * displayDPI.x)); paperSize[1] = mm.DPtoLP((int) (height * displayDPI.y)); return new Point(paperSize[0], paperSize[1]); } /** * Returns a page type (e.g. PSPageType.A4) based on the * size of the page in the default printer. If no printer is * installed a default of PSPageType.LETTER is returned. * * @return String the default page size name */ static public String getPrinterPageType() { //String pageType = nnn.LETTER; String pageType = PageSetupPageType.LETTER.getName(); Printer printer = null; try { printer = new Printer(); } catch (SWTError e) { //I cannot printer.dispose(); because it may not have been //initialized Trace.catching(DiagramUIPlugin.getInstance(), DiagramUIDebugOptions.EXCEPTIONS_CATCHING, PageInfoHelper.class, "getPrinterPage", //$NON-NLS-1$ e); if (e.code == SWT.ERROR_NO_HANDLES) { //it might have really been ERROR_NO_HANDLES, but there's //no way for me to really know return pageType; } //if (e.code != SWT.ERROR_NO_HANDLES) Log.error(DiagramUIPlugin.getInstance(), DiagramUIStatusCodes.GENERAL_UI_FAILURE, "Failed to make instance of Printer object", e); //$NON-NLS-1$ //else if another swt error Trace.throwing(DiagramUIPlugin.getInstance(), DiagramUIDebugOptions.EXCEPTIONS_CATCHING, PageInfoHelper.class, "getPrinterPage", //$NON-NLS-1$ e); throw e; } if (printer != null) { // Physical page size in pixels org.eclipse.swt.graphics.Rectangle physicalSize = printer.getBounds(); org.eclipse.swt.graphics.Point dpi = printer.getDPI(); // Convert physical size to inches. Point2D.Double size = new Point2D.Double(physicalSize.width / dpi.x, physicalSize.height / dpi.y); Map pageTypes = getPaperSizesMap(); Set<Entry<?, ?>> pageTypeEntrySet = pageTypes.entrySet(); boolean first = true; double bestFit = 0.0; for (Entry<?, ?> pageTypeEntry : pageTypeEntrySet) { String thisPageType = (String) pageTypeEntry.getKey(); Point2D.Double thisSize = (Point2D.Double) pageTypeEntry.getValue(); if (first) { bestFit = size.distance(thisSize); pageType = thisPageType; first = false; continue; } double thisFit = size.distance(thisSize); if (thisFit < bestFit) { bestFit = thisFit; pageType = thisPageType; } } printer.dispose(); } return pageType; } private static final Map pageSizes = new HashMap(); static { pageSizes.put(PageSetupPageType.LETTER, new Point2D.Double(8.5, 11)); pageSizes.put(PageSetupPageType.LEGAL, new Point2D.Double(8.5, 14)); pageSizes.put(PageSetupPageType.EXECUTIVE, new Point2D.Double(7.25, 10.5)); pageSizes.put(PageSetupPageType.llX17, new Point2D.Double(11, 17)); pageSizes.put(PageSetupPageType.A3, new Point2D.Double(11.69, 16.54)); pageSizes.put(PageSetupPageType.A4, new Point2D.Double(8.268, 11.69)); pageSizes.put(PageSetupPageType.B4, new Point2D.Double(14.33, 10.12)); pageSizes.put(PageSetupPageType.B5, new Point2D.Double(7.165, 10.12)); } public static final Map getPaperSizesMap() { return pageSizes; } public static final class PageMargins { public int left; public int right; public int top; public int bottom; } public static PageMargins getPageMargins(IPreferenceStore preferenceStore, IMapMode mm) { org.eclipse.swt.graphics.Point displayDPI = DisplayUtils.getDisplay().getDPI(); PageMargins margins = new PageMargins(); margins.left = mm.DPtoLP( (int) (displayDPI.x * preferenceStore.getDouble(WorkspaceViewerProperties.PREF_MARGIN_LEFT))); margins.right = mm.DPtoLP( (int) (displayDPI.x * preferenceStore.getDouble(WorkspaceViewerProperties.PREF_MARGIN_RIGHT))); margins.top = mm.DPtoLP( (int) (displayDPI.y * preferenceStore.getDouble(WorkspaceViewerProperties.PREF_MARGIN_TOP))); margins.bottom = mm.DPtoLP( (int) (displayDPI.y * preferenceStore.getDouble(WorkspaceViewerProperties.PREF_MARGIN_BOTTOM))); return margins; } }