Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 96895 Details for
Bug 228057
[Printing] Print preview should take into account fit to page settings
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
preview fit to page settings
Printing_fitToPagePreview.patch (text/plain), 18.16 KB, created by
James Bruck
on 2008-04-21 13:19:07 EDT
(
hide
)
Description:
preview fit to page settings
Filename:
MIME Type:
Creator:
James Bruck
Created:
2008-04-21 13:19:07 EDT
Size:
18.16 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.gmf.runtime.diagram.ui.printing >Index: src/org/eclipse/gmf/runtime/diagram/ui/printing/internal/printpreview/PrintPreviewHelper.java >=================================================================== >RCS file: /cvsroot/modeling/org.eclipse.gmf/plugins/org.eclipse.gmf.runtime.diagram.ui.printing/src/org/eclipse/gmf/runtime/diagram/ui/printing/internal/printpreview/PrintPreviewHelper.java,v >retrieving revision 1.15 >diff -u -r1.15 PrintPreviewHelper.java >--- src/org/eclipse/gmf/runtime/diagram/ui/printing/internal/printpreview/PrintPreviewHelper.java 8 Apr 2008 02:16:31 -0000 1.15 >+++ src/org/eclipse/gmf/runtime/diagram/ui/printing/internal/printpreview/PrintPreviewHelper.java 21 Apr 2008 17:13:32 -0000 >@@ -11,6 +11,7 @@ > > package org.eclipse.gmf.runtime.diagram.ui.printing.internal.printpreview; > >+ > import java.util.ArrayList; > import java.util.List; > >@@ -31,6 +32,8 @@ > import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; > import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramRootEditPart; > import org.eclipse.gmf.runtime.diagram.ui.editparts.IDiagramPreferenceSupport; >+import org.eclipse.gmf.runtime.diagram.ui.internal.editparts.PageBreakEditPart; >+import org.eclipse.gmf.runtime.diagram.ui.internal.figures.PageBreaksFigure; > import org.eclipse.gmf.runtime.diagram.ui.internal.pagesetup.PageInfoHelper; > import org.eclipse.gmf.runtime.diagram.ui.internal.pagesetup.PageInfoHelper.PageMargins; > import org.eclipse.gmf.runtime.diagram.ui.internal.properties.WorkspaceViewerProperties; >@@ -70,6 +73,7 @@ > import org.eclipse.swt.widgets.Menu; > import org.eclipse.swt.widgets.MenuItem; > import org.eclipse.swt.widgets.Shell; >+import org.eclipse.swt.widgets.Text; > import org.eclipse.swt.widgets.ToolBar; > import org.eclipse.swt.widgets.ToolItem; > import org.eclipse.ui.IEditorPart; >@@ -80,10 +84,12 @@ > * methods, so you must create an instance of this class. > * > * Call doPrintPreview() after you've made an instance. >+ * >+ * This class should be combined with the DiagramPrinter to reuse functionality. > * > * @author Wayne Diu, wdiu > */ >-public class PrintPreviewHelper { >+public class PrintPreviewHelper{ > > /** > * Action helper for print. This must be passed in to have something happen >@@ -279,8 +285,19 @@ > > /** > * The print preview helper is capable of showing zoom input. >+ * userScale is a value between 0 and 1. > */ > protected double userScale = 1; >+ >+ /** >+ * The amount to offset images. This is currently used with fit-to-page option. >+ */ >+ protected Point translated = new Point(0,0); >+ >+ /** >+ * Determine if we should consider fit to page options or not. >+ */ >+ private boolean fitToPage = false; > > /** > * Initialize all toolbar images >@@ -337,6 +354,8 @@ > public void doPrintPreview(IPrintActionHelper prActionHelper) { > this.printActionHelper = prActionHelper; > >+ setUserScale(PrintHelperUtil.getScale()); >+ > if (getDiagramEditorPart() == null) { > MessageDialog > .openInformation(PlatformUI.getWorkbench() >@@ -413,6 +432,7 @@ > public void widgetSelected(SelectionEvent e) { > //should not be enabled > Assert.isNotNull(printActionHelper); >+ > printActionHelper > .doPrint(PlatformUI.getWorkbench() > .getActiveWorkbenchWindow().getActivePage() >@@ -470,11 +490,8 @@ > if (userY < 0) > userY = 0; > } >- >- updateLeftRightUpDownButtonsForToolbar(); >- >- updateCompositeForNumberOfColumns(numberOfRowsToDisplay, >- numberOfColumnsToDisplay); >+ >+ refreshComposite(); > > } > >@@ -553,9 +570,7 @@ > public void widgetSelected(SelectionEvent e) { > if (userX > 0) { > userX--; >- updateCompositeForNumberOfColumns(numberOfRowsToDisplay, >- numberOfColumnsToDisplay); >- updateLeftRightUpDownButtonsForToolbar(); >+ refreshComposite(); > } > } > >@@ -589,9 +604,7 @@ > //check for max pages to be safe > if (!(userX + numberOfColumnsToDisplay + 1 > getTotalNumberOfColumns())) { > userX++; >- updateCompositeForNumberOfColumns(numberOfRowsToDisplay, >- numberOfColumnsToDisplay); >- updateLeftRightUpDownButtonsForToolbar(); >+ refreshComposite(); > } > } > >@@ -615,9 +628,7 @@ > public void widgetSelected(SelectionEvent e) { > if (userY > 0) { > userY--; >- updateCompositeForNumberOfColumns(numberOfRowsToDisplay, >- numberOfColumnsToDisplay); >- updateLeftRightUpDownButtonsForToolbar(); >+ refreshComposite(); > } > } > >@@ -641,9 +652,7 @@ > public void widgetSelected(SelectionEvent e) { > if (!(userY + numberOfRowsToDisplay + 1 > getTotalNumberOfRows())) { > userY++; >- updateCompositeForNumberOfColumns(numberOfRowsToDisplay, >- numberOfColumnsToDisplay); >- updateLeftRightUpDownButtonsForToolbar(); >+ refreshComposite(); > } > } > >@@ -654,7 +663,39 @@ > widgetSelected(e); > } > }); >+ >+ new ToolItem(bar, SWT.SEPARATOR); >+ >+ ToolItem separator = new ToolItem(bar, SWT.SEPARATOR); >+ Text textField = new Text(bar, SWT.SINGLE | SWT.BORDER); >+ textField.setText("XXXXX");//$NON-NLS-1$ >+ textField.setEnabled(true); >+ textField.pack(); >+ textField.setText(getDisplayScale(PrintHelperUtil.getScale())); >+ >+ separator.setWidth(textField.getBounds().width); >+ separator.setControl(textField); >+ >+ textField.addSelectionListener(new SelectionListener() { >+ >+ public void widgetSelected(SelectionEvent e) { >+ // do nothing. >+ } >+ >+ public void widgetDefaultSelected(SelectionEvent e) { >+ String scaleFactor = ((Text) e.getSource()).getText(); > >+ int percentageIndex = scaleFactor.indexOf("%"); //$NON-NLS-1$ >+ if (percentageIndex > 0) { >+ scaleFactor = scaleFactor.substring(0, percentageIndex); >+ } >+ int scalePercentage = Integer.parseInt(scaleFactor); >+ setPercentScaling(scalePercentage); >+ refreshComposite(); >+ ((Text) e.getSource()).setText(getDisplayScale(scalePercentage)); >+ } >+ }); >+ > new ToolItem(bar, SWT.SEPARATOR); > closeTool = new ToolItem(bar, SWT.NULL); > closeTool.setToolTipText(DiagramUIPrintingMessages.PrintPreview_CloseToolItem); >@@ -690,17 +731,16 @@ > > composite = new Composite(body, SWT.NULL); > composite.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true)); >- >- updateCompositeForNumberOfColumns(numberOfRowsToDisplay, numberOfColumnsToDisplay); >- >- updateLeftRightUpDownButtonsForToolbar(); >+ >+ refreshComposite(); > > shell.open(); > while (!shell.isDisposed()) { > if (!display.readAndDispatch()) > display.sleep(); > } >- >+ >+ dispose(); > shell.dispose(); > > } >@@ -926,6 +966,17 @@ > } > > /** >+ * A convenience method for refreshing the displayed image in the preview. >+ */ >+ private void refreshComposite(){ >+ >+ updateCompositeForNumberOfColumns(numberOfRowsToDisplay, >+ numberOfColumnsToDisplay); >+ >+ updateLeftRightUpDownButtonsForToolbar(); >+ } >+ >+ /** > * Draw the composite centered on the body based on the number of columns. > * Also calls the method to make the images and insert them into the > * composite. >@@ -984,10 +1035,6 @@ > > PageMargins margins = PageInfoHelper.getPageMargins(getPreferenceStore(), getMapMode()); > >- margins.left /= userScale; >- margins.right /= userScale; >- margins.bottom /= userScale; >- margins.top /= userScale; > > //make sure height and width are not 0, if too small <4, don't bother > if (!(imageHeight <= 4 || imageWidth <= 4)) { >@@ -998,6 +1045,16 @@ > > scale *= userScale; > >+ margins.left /= userScale; >+ margins.right /= userScale; >+ margins.bottom /= userScale; >+ margins.top /= userScale; >+ >+ Rectangle figureBounds = getDiagramEditPart().getChildrenBounds(); >+ >+ translated = new Point((int) (-figureBounds.x * scale ), >+ (int) (-figureBounds.y * scale)); >+ > for (int i = 0; i < numberOfRows; i++) { > for (int j = 0; j < numberOfColumns; j++) { > Label label = new Label(composite, SWT.NULL); >@@ -1007,7 +1064,6 @@ > imageList.add(pageImg); > } > } >- > } > > composite.pack(); >@@ -1091,28 +1147,18 @@ > > //if mmg's font is null, gc.setFont will use a default font > gc.setFont(mmg.getFont()); >- drawPage(mmg, gc, scale, row, col, margins); >- >+ >+ if (fitToPage) { >+ Rectangle figureBounds = getDiagramEditPart().getChildrenBounds(); >+ drawFitToPage(scale, getDiagramEditPart(), figureBounds, >+ getPreferenceStore(), margins, mmg, row, col); >+ } else { >+ drawPage(mmg, gc, scale, row, col, margins); >+ } >+ > gc.dispose(); > > return image; >- >- } >- >- /** >- * Convenience method to determine if a page at row y and >- * column x exists. >- * Pages start at 1. >- * >- * For example, the first page is 1-1. >- * >- * @param x, column number of the page to check >- * @param y, row number of the page to check >- * >- * @return boolean true if the page exists, false if it doesn't >- */ >- private boolean doesPageExist(int x, int y) { >- return x > 0 && y > 0 && x <= getTotalNumberOfColumns() && y <= getTotalNumberOfRows(); > } > > /** >@@ -1137,13 +1183,14 @@ > * displaying in the print preview. > */ > protected void drawPage(Graphics g, GC gc, float scale, int row, int col, PageMargins margins) { >+ > org.eclipse.draw2d.geometry.Point pageSize = PageInfoHelper >- .getPageSize(getPreferenceStore(), false, getMapMode()); >+ .getPageSize(getPreferenceStore(), false, getMapMode()); > > g.pushState(); > > Rectangle bounds = getBounds(); >- >+ > int scaledPageSizeWidth = (int)(pageSize.x/userScale) ; > int scaledPageSizeHeight = (int)(pageSize.y/userScale) ; > >@@ -1205,6 +1252,70 @@ > > g.popState(); > } >+ >+ /** >+ * The real rendering of the page to the given graphical object occurs here. >+ */ >+ protected void drawFitToPage(float scale, DiagramEditPart dgrmEP, >+ Rectangle figureBounds, IPreferenceStore fPreferences, >+ PageMargins margins, Graphics g, int rowIndex, int colIndex) { >+ >+ org.eclipse.draw2d.geometry.Point pageSize = PageInfoHelper >+ .getPageSize(fPreferences, false, getMapMode()); >+ >+ int width = pageSize.x, height = pageSize.y; >+ >+ g.pushState(); >+ >+ g.translate(translated.x, translated.y); >+ g.scale(scale); >+ >+ int translateX = -(width * (colIndex + userX)); >+ int translateY = -(height * (rowIndex + userY)); >+ >+ int scaledTranslateX = (int) ((translateX / scale)); >+ int scaledTranslateY = (int) ((translateY / scale)); >+ >+ >+ scaledTranslateX += ((margins.left * (colIndex+1)) + (margins.right * (colIndex + userX))); >+ scaledTranslateY += ((margins.top * (rowIndex+1)) + (margins.bottom * (rowIndex + userY))); >+ >+ g.translate(scaledTranslateX, scaledTranslateY); >+ >+ int scaledWidth = (int) ((width / scale) * userScale); >+ int scaledHeight = (int) ((height / scale) * userScale); >+ >+ Rectangle clip = new Rectangle( >+ (scaledWidth - margins.left - margins.right) >+ * (colIndex + userX) + figureBounds.x, >+ (scaledHeight - margins.bottom - margins.top) >+ * (rowIndex + userY) + figureBounds.y, scaledWidth >+ - margins.right - margins.left, scaledHeight >+ - margins.top - margins.bottom); >+ g.clipRect(clip); >+ >+ dgrmEP.getLayer(LayerConstants.PRINTABLE_LAYERS).paint(g); >+ >+ g.popState(); >+ } >+ >+ >+ /** >+ * Convenience method to determine if a page at row y and >+ * column x exists. >+ * Pages start at 1. >+ * >+ * For example, the first page is 1-1. >+ * >+ * @param x, column number of the page to check >+ * @param y, row number of the page to check >+ * >+ * @return boolean true if the page exists, false if it doesn't >+ */ >+ private boolean doesPageExist(int x, int y) { >+ return x > 0 && y > 0 && x <= getTotalNumberOfColumns() && y <= getTotalNumberOfRows(); >+ } >+ > > /** > * Safely dispose an image >@@ -1271,9 +1382,126 @@ > ScaledGraphics scaledGraphics) { > return new MapModeGraphics(scaledGraphics, getMapMode()); > } >- >- public void setUserScale(double userScale){ >- this.userScale = userScale; >+ >+ /** >+ * Sets the scale factor. >+ * >+ * @param scale : valid input is an integer larger than 0 representing a scale percentage >+ */ >+ private void setUserScale(int scale){ >+ userScale = scale/100f; >+ PrintHelperUtil.setScale(scale); > } >+ >+ /** >+ * Prepare a string appropriate to show the scale factor to the user. >+ * >+ * @param scale the scale factor, an integer greater than 0. >+ * @return A string of the scale factor to be displayed to the user. >+ */ >+ private String getDisplayScale(int scale) { >+ return String.valueOf(scale) + "%"; //$NON-NLS-1$ >+ } >+ > >+ /** >+ * Determine the page count when fit to page is used. >+ * >+ * @param dgrmEP - The diagram edit part >+ * @param figureBounds - The bounds of the figure >+ * @param pageSize - Page size >+ * @param applyUserScale - The user scale >+ * @return Point.x contains the total number of pages that span in a column >+ * Point.y contains the total number of pages that span in a row >+ */ >+ protected org.eclipse.draw2d.geometry.Point getPageCount( >+ DiagramEditPart dgrmEP, Rectangle figureBounds, >+ org.eclipse.draw2d.geometry.Point pageSize, boolean applyUserScale) { >+ RootEditPart rootEditPart = dgrmEP.getRoot(); >+ >+ if (rootEditPart instanceof DiagramRootEditPart) { >+ >+ DiagramRootEditPart diagramRootEditPart = (DiagramRootEditPart) rootEditPart; >+ PageBreakEditPart pageBreakEditPart = diagramRootEditPart >+ .getPageBreakEditPart(); >+ >+ double fNumCols = ((PageBreaksFigure) pageBreakEditPart.getFigure()) >+ .getPageCount().y >+ * (applyUserScale ? userScale : 1); >+ >+ double fNumRows = ((PageBreaksFigure) pageBreakEditPart.getFigure()) >+ .getPageCount().x >+ * (applyUserScale ? userScale : 1); >+ >+ int numCols = (int) Math.ceil(fNumCols); >+ int numRows = (int) Math.ceil(fNumRows); >+ >+ return new org.eclipse.draw2d.geometry.Point(numCols, numRows); >+ >+ } else { >+ double fNumRows = (figureBounds.height * (applyUserScale ? userScale : 1)) >+ / pageSize.y; >+ int numRows = (int) Math.ceil(fNumRows); >+ >+ double fNumCols = (figureBounds.width * (applyUserScale ? userScale : 1)) >+ / pageSize.x; >+ int numCols = (int) Math.ceil(fNumCols); >+ >+ return new org.eclipse.draw2d.geometry.Point(numCols, numRows); >+ } >+ } >+ >+ /** >+ * Reset the fit to page flag and set the user scale when the >+ * preview is triggered from the print dialog. >+ * >+ * @param userScale a whole number greater than zero >+ */ >+ public void setPercentScaling(int userScale){ >+ fitToPage = false; >+ setUserScale(userScale); >+ } >+ >+ /** >+ * Recalculates a zoom ratio that can be used when displaying fit to page. >+ * >+ * @param rows The number of rows to fit the display to. >+ * @param columns The number of columns to fit the display to. >+ */ >+ public void setFitToPage(int rows, int columns) { >+ >+ fitToPage = true; >+ >+ initializeMapMode(); >+ Rectangle figureBounds = PrintHelperUtil.getPageBreakBounds( >+ getDiagramEditPart(), true); >+ >+ org.eclipse.draw2d.geometry.Point pageBounds = PageInfoHelper >+ .getPageSize(getPreferenceStore(), getMapMode()); >+ org.eclipse.draw2d.geometry.Point pageCount = getPageCount( >+ getDiagramEditPart(), figureBounds, pageBounds, true); >+ int numCols = pageCount.x; >+ int numRows = pageCount.y; >+ >+ float actualWidth = 0; >+ float actualHeight = 0; >+ >+ if (rows == 1 && columns == 1) { >+ figureBounds = getDiagramEditPart().getChildrenBounds(); >+ actualWidth = figureBounds.width; >+ actualHeight = figureBounds.height; >+ } else { >+ actualWidth = numCols * pageBounds.x; >+ actualHeight = numRows * pageBounds.y; >+ } >+ >+ int totalHeight = (rows * pageBounds.y); >+ int totalWidth = (columns * pageBounds.x); >+ >+ int vScale = (int) ((totalHeight * 100) / actualHeight); >+ int hScale = (int) ((totalWidth * 100) / actualWidth); >+ >+ setUserScale(Math.min(hScale, vScale)); >+ } >+ > } >\ No newline at end of file >#P org.eclipse.gmf.runtime.diagram.ui.printing.render >Index: src/org/eclipse/gmf/runtime/diagram/ui/printing/render/dialogs/ActionsBlock.java >=================================================================== >RCS file: /cvsroot/modeling/org.eclipse.gmf/plugins/org.eclipse.gmf.runtime.diagram.ui.printing.render/src/org/eclipse/gmf/runtime/diagram/ui/printing/render/dialogs/ActionsBlock.java,v >retrieving revision 1.3 >diff -u -r1.3 ActionsBlock.java >--- src/org/eclipse/gmf/runtime/diagram/ui/printing/render/dialogs/ActionsBlock.java 4 Apr 2008 21:50:20 -0000 1.3 >+++ src/org/eclipse/gmf/runtime/diagram/ui/printing/render/dialogs/ActionsBlock.java 21 Apr 2008 17:13:33 -0000 >@@ -14,6 +14,7 @@ > import org.eclipse.gmf.runtime.common.ui.action.actions.IPrintActionHelper; > import org.eclipse.gmf.runtime.diagram.ui.printing.internal.l10n.DiagramUIPrintingMessages; > import org.eclipse.gmf.runtime.diagram.ui.printing.internal.printpreview.PrintPreviewHelper; >+import org.eclipse.gmf.runtime.diagram.ui.printing.internal.util.PrintHelperUtil; > import org.eclipse.gmf.runtime.diagram.ui.printing.render.actions.EnhancedPrintActionHelper; > import org.eclipse.gmf.runtime.diagram.ui.printing.render.internal.printpreview.RenderedPrintPreviewHelper; > import org.eclipse.gmf.runtime.diagram.ui.printing.render.model.PrintOptions; >@@ -75,9 +76,22 @@ > break; > default: > PrintPreviewHelper previewHelper = getPrintPreviewHelper(); >- previewHelper.setUserScale(options.getScaleFactor() / 100f); >+ >+ PrintHelperUtil.setScale(options.getScaleFactor()); >+ PrintHelperUtil.setScaleToWidth(options.getFitToPagesWidth()); >+ PrintHelperUtil.setScaleToHeight(options.getFitToPagesHeight()); > previewHelper.enablePrinting(false); >+ >+ if (options.isPercentScaling()) { >+ previewHelper.setPercentScaling(options.getScaleFactor()); >+ } else { >+ previewHelper.setFitToPage(options.getFitToPagesWidth(), >+ options.getFitToPagesHeight()); >+ } >+ > previewHelper.doPrintPreview(getPrintActionHelper()); >+ >+ options.setScaleFactor(PrintHelperUtil.getScale()); > } > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 228057
:
96895