org.eclipse.gmf.runtime.diagram.ui.internal.pagesetup.PageInfoHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.gmf.runtime.diagram.ui.internal.pagesetup.PageInfoHelper.java

Source

/******************************************************************************
 * 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;
    }
}