blob: b090b9865b13173222e851acbb65d381635aa36c [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2005, 2019 SAP SE
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* SAP SE - initial API, implementation and documentation
* mwenz - Bug 323359 Avoid usage of java.lang.text, ICU4J etc.
* mwenz - Bug 323034 - Aligned vertical gaps between groups
* mwenz - Bug 370888 - API Access to export and print
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.graphiti.ui.internal.util.ui.print;
import org.eclipse.draw2d.PrintFigureOperation;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.graphiti.ui.internal.Messages;
import org.eclipse.graphiti.ui.internal.util.ui.DoubleField;
import org.eclipse.graphiti.ui.internal.util.ui.DoubleFieldWithDropDown;
import org.eclipse.graphiti.ui.print.IPrintConfiguration;
import org.eclipse.graphiti.ui.print.IPrintPreferences;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.printing.PrintDialog;
import org.eclipse.swt.printing.Printer;
import org.eclipse.swt.printing.PrinterData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
/**
* This is a dialog to choose positioning and scaling for a print operation.
*
* @see PrintFigureScaleableOperation
* @noinstantiate This class is not intended to be instantiated by clients.
* @noextend This class is not intended to be subclassed by clients.
*/
public class PrintFigureDialog extends AbstractFigureSelectionDialog implements IPrintConfiguration, ModifyListener,
PaintListener {
private static final String COLON = ":"; //$NON-NLS-1$
private static final int BEST_FIT = 0;
private static final int SCALE_XY = 1;
private static final int SCALE_STRETCH = 3;
private static final int CUSTOM_SIZE = 4;
public static final String decimalNumberFormat = "###0.00"; //$NON-NLS-1$
private static final int PREVIEW_SIZE = 220;
public static final double[] SCALE_FACTORS = new double[] { 0.5, 1.0, 2.0, 4.0 };
private static final double INCH_TO_CM_FACTOR = 2.54d;
private static final int WARNING_IF_MOREPAGES_THAN = 5;
// buttons for the buttonbar (additional to OK and CANCEL)
private static final int BUTTON_CHANGE_PRINTERDATA_ID = IDialogConstants.CLIENT_ID + 1;
// initial values
private Printer _printer;
private double _dpiScale;
// controls
private DoubleFieldWithDropDown _widthScaleText;
private DoubleFieldWithDropDown _heightScaleText;
private Button _pixelScaleButton;
private Button _dpiScaleButton;
private Canvas _preview;
private Composite _previewGroup;
private DoubleField _leftMarginText;
private DoubleField _topMarginText;
private Button _centerButton;
private Button _customScalingButton;
private Button _bestFitButton;
private Button _customSizeButton;
private DoubleField _customWidthText;
private DoubleField _customHeightText;
private Label _numberOfPagesInfo;
private Button _cmButton;
private Button _inchesButton;
private Button _aspectRatioButton;
// temporary values
private double _currentScale;
private double _aspectRatio;
private boolean _center = false;
private boolean _inches = true;
private boolean _aspectRatioOn = true;
private int _sizeMode = SCALE_XY;
/**
* Creates a new PrintFigureDialog.
*
* @param shell
* The Shell of this dialog.
* @param graphicalViewer
* The GraphicalViewer, which to print.
* @param printer
* The printer, to which to print
*/
public PrintFigureDialog(Shell shell, GraphicalViewer graphicalViewer, Printer printer) {
super(shell, graphicalViewer);
// call to initialize _image
setScaledImage(1.0);
_printer = printer;
_dpiScale = ((double) _printer.getDPI().x) / ((double) Display.getCurrent().getDPI().x);
_currentScale = _dpiScale;
if (_image != null) {
_aspectRatio = (double) _image.getBounds().width / _image.getBounds().height;
} else {
_aspectRatio = 1d;
}
}
// ===================== overwritten methods ==============================
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, BUTTON_CHANGE_PRINTERDATA_ID,
Messages.PrintFigureDialog_0_xfld, false);
super.createButtonsForButtonBar(parent);
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(Messages.PrintFigureDialog_3_xfld);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
GridLayout layout = new GridLayout(2, false);
layout.horizontalSpacing = 10;
composite.setLayout(layout);
// Takes column 1 row 1
createChooseFigureGroup(composite);
// Takes column 2 rows 1-4
_previewGroup = createPreviewGroup(composite);
// Takes column 1 row 2
createChooseSizeGroup(composite);
// Takes column 1 row 3
createPositionGroup(composite);
// Takes column 1 row 4
createUnitGroup(composite);
aspectRatioOnChanged();
updateControls();
return composite;
}
@Override
public void updateControls() {
super.updateControls();
_insideInternalModify = true;
try {
_widthScaleText.updateControl();
_heightScaleText.updateControl();
_customWidthText.updateControl();
_customHeightText.updateControl();
_leftMarginText.setEnabled(!_center && _sizeMode != SCALE_STRETCH);
_topMarginText.setEnabled(!_center && _sizeMode != SCALE_STRETCH);
_widthScaleText.setEnabled(_sizeMode == SCALE_XY);
_heightScaleText.setEnabled(_sizeMode == SCALE_XY);
_customWidthText.setEnabled(_sizeMode == CUSTOM_SIZE);
_customHeightText.setEnabled(_sizeMode == CUSTOM_SIZE);
_inchesButton.setEnabled((_sizeMode == CUSTOM_SIZE || !_center) && _sizeMode != SCALE_STRETCH);
_cmButton.setEnabled((_sizeMode == CUSTOM_SIZE || !_center) && _sizeMode != SCALE_STRETCH);
_preview.redraw();
} finally {
_insideInternalModify = false;
}
}
public void paintControl(PaintEvent e) {
Rectangle printRegion = getPrintRegion();
org.eclipse.swt.graphics.Rectangle previewRegion = _preview.getClientArea();
Point size = getScaledImageSize(printRegion, previewRegion);
Point margins = determineMargins(printRegion, previewRegion, size.x, size.y);
if (_image != null) {
e.gc.drawImage(_image, 0, 0, _image.getBounds().width, _image.getBounds().height, margins.x, margins.y, size.x, size.y);
e.gc.drawRectangle(margins.x, margins.y, size.x - 1, size.y - 1);
} else {
e.gc.drawText(Messages.PrintFigureDialog_39_xmsg, 1, 1);
}
adjustPrinterValuesUsingPreview(margins.x, margins.y, size.x, size.y, printRegion, previewRegion);
}
// ====================== private helper methods ==========================
private Group createUnitGroup(Composite composite) {
Group unitGroup = new Group(composite, SWT.NONE);
unitGroup.setText(Messages.PrintFigureDialog_4_xfld);
GridLayout layout = new GridLayout(1, false);
unitGroup.setLayout(layout);
unitGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
_cmButton = new Button(unitGroup, SWT.RADIO);
_cmButton.setText(Messages.PrintFigureDialog_5_xfld);
GridData data3 = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
_cmButton.setLayoutData(data3);
_cmButton.addSelectionListener(this);
_inchesButton = new Button(unitGroup, SWT.RADIO);
_inchesButton.setText(Messages.PrintFigureDialog_6_xfld);
GridData data2 = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
_inchesButton.setLayoutData(data2);
_inchesButton.addSelectionListener(this);
Label info = new Label(unitGroup, SWT.NONE);
info.setText(Messages.PrintFigureDialog_7_xfld);
info.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
// set defaults
_cmButton.setSelection(false);
_inchesButton.setSelection(true);
return unitGroup;
}
private Composite createPreviewGroup(Composite composite) {
Composite previewGroup = new Composite(composite, SWT.NONE);
previewGroup.setLayout(new GridLayout(1, false));
GridData grid = new GridData(SWT.FILL, SWT.TOP, true, false);
grid.verticalSpan = 4;
previewGroup.setLayoutData(grid);
Label previewLabel = new Label(previewGroup, SWT.NONE);
previewLabel.setText(Messages.PrintFigureDialog_8_xfld + COLON);
previewLabel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
_preview = new Canvas(previewGroup, SWT.BORDER);
GridData previewGrid = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
previewGrid.widthHint = PREVIEW_SIZE;
previewGrid.heightHint = (int) (PREVIEW_SIZE * ((double) _printer.getClientArea().height / _printer.getClientArea().width));
previewGrid.verticalSpan = 1;
_preview.setLayoutData(previewGrid);
_preview.setBackground(_preview.getDisplay().getSystemColor(SWT.COLOR_WHITE));
_preview.addPaintListener(this);
_numberOfPagesInfo = new Label(previewGroup, SWT.NONE);
_numberOfPagesInfo.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_END
| GridData.GRAB_HORIZONTAL));
refreshOutputPagesInfo();
return previewGroup;
}
private void refreshOutputPagesInfo() {
String text = Messages.PrintFigureDialog_9_xmsg + " " + getNumberOfPages(); //$NON-NLS-1$
_numberOfPagesInfo.setText(text);
_numberOfPagesInfo.getParent().layout();
}
private Group createChooseSizeGroup(Composite composite) {
Group scaleGroup = new Group(composite, SWT.NONE);
scaleGroup.setText(Messages.PrintFigureDialog_11_xfld);
GridLayout layout = new GridLayout(3, false);
scaleGroup.setLayout(layout);
scaleGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
_bestFitButton = new Button(scaleGroup, SWT.RADIO);
_bestFitButton.addSelectionListener(this);
_bestFitButton.setText(Messages.PrintFigureDialog_12_xfld);
new Label(scaleGroup, SWT.NONE);
new Label(scaleGroup, SWT.NONE);
_customScalingButton = new Button(scaleGroup, SWT.RADIO);
_customScalingButton.addSelectionListener(this);
_customScalingButton.setSelection(true);
_customScalingButton.setText(Messages.PrintFigureDialog_14_xfld + ":"); //$NON-NLS-1$
Label widthComboText = new Label(scaleGroup, SWT.NONE);
widthComboText.setText(Messages.PrintFigureDialog_16_xfld + ": "); //$NON-NLS-1$
widthComboText.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
_widthScaleText = new DoubleFieldWithDropDown(scaleGroup, SWT.NONE, _preferences, DefaultPrintPreferences.SCALE_FACTOR_X,
SCALE_FACTORS);
_widthScaleText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
_widthScaleText.addModifyListener(this);
new Label(scaleGroup, SWT.NONE);
Label heightComboText = new Label(scaleGroup, SWT.NONE);
heightComboText.setText(Messages.PrintFigureDialog_20_xfld + ": "); //$NON-NLS-1$
heightComboText.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
_heightScaleText = new DoubleFieldWithDropDown(scaleGroup, SWT.NONE, _preferences, DefaultPrintPreferences.SCALE_FACTOR_Y,
SCALE_FACTORS);
_heightScaleText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
_heightScaleText.addModifyListener(this);
_customSizeButton = new Button(scaleGroup, SWT.RADIO);
_customSizeButton.addSelectionListener(this);
_customSizeButton.setText(Messages.PrintFigureDialog_23_xfld + ":"); //$NON-NLS-1$
Label customWidthText = new Label(scaleGroup, SWT.NONE);
customWidthText.setText(Messages.PrintFigureDialog_26_xfld + ": "); //$NON-NLS-1$
customWidthText.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
_customWidthText = new DoubleField(scaleGroup, SWT.NONE, _preferences, DefaultPrintPreferences.WIDTH);
_customWidthText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
_customWidthText.addModifyListener(this);
new Label(scaleGroup, SWT.NONE);
Label customHeightText = new Label(scaleGroup, SWT.NONE);
customHeightText.setText(Messages.PrintFigureDialog_28_xfld + ": "); //$NON-NLS-1$
customHeightText.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
_customHeightText = new DoubleField(scaleGroup, SWT.NONE, _preferences, DefaultPrintPreferences.HEIGHT);
_customHeightText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
_customHeightText.addModifyListener(this);
_aspectRatioButton = new Button(scaleGroup, SWT.CHECK);
_aspectRatioButton.addSelectionListener(this);
_aspectRatioButton.setSelection(_aspectRatioOn);
_aspectRatioButton.setText(Messages.PrintFigureDialog_17_xfld);
// Label aspectRatioLabel = new Label(scaleGroup, SWT.NONE);
// aspectRatioLabel.setText(Messages.PrintFigureDialog_17_xfld);
// aspectRatioLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
return scaleGroup;
}
private Group createPositionGroup(Composite parent) {
Group posGroup = new Group(parent, SWT.NONE);
posGroup.setText(Messages.PrintFigureDialog_18_xfld);
GridLayout layout = new GridLayout(2, false);
posGroup.setLayout(layout);
posGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
Label leftMargin = new Label(posGroup, SWT.NONE);
leftMargin.setText(Messages.PrintFigureDialog_30_xfld + ": "); //$NON-NLS-1$
_leftMarginText = new DoubleField(posGroup, SWT.NONE, _preferences, DefaultPrintPreferences.LEFT_MARGIN);
GridData data2 = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
_leftMarginText.setLayoutData(data2);
_leftMarginText.addModifyListener(this);
Label topMargin = new Label(posGroup, SWT.NONE);
topMargin.setText(Messages.PrintFigureDialog_32_xfld + ": "); //$NON-NLS-1$
_topMarginText = new DoubleField(posGroup, SWT.NONE, _preferences, DefaultPrintPreferences.TOP_MARGIN);
GridData data3 = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
_topMarginText.setLayoutData(data3);
_topMarginText.addModifyListener(this);
_centerButton = new Button(posGroup, SWT.CHECK);
_centerButton.addSelectionListener(this);
_centerButton.setText(Messages.PrintFigureDialog_34_xfld);
new Label(posGroup, SWT.NONE);
return posGroup;
}
/**
* This method is currently not used, since "normal" user would not need it.
*/
// private Group createChooseScaleGroup(Composite composite) {
// Group dpiGroup = new Group(composite, SWT.NONE);
// dpiGroup.setText("Scale");
// GridLayout layout = new GridLayout(1, false);
// dpiGroup.setLayout(layout);
// GridData data = new GridData(GridData.GRAB_HORIZONTAL |
// GridData.FILL_BOTH);
// dpiGroup.setLayoutData(data);
//
// _pixelScaleButton = new Button(dpiGroup, SWT.RADIO);
// _pixelScaleButton.setText("1 monitor pixel == 1 paper dot");
// _pixelScaleButton.addSelectionListener(this);
// _pixelScaleButton.setLayoutData(new GridData(GridData.FILL_VERTICAL));
//
// _dpiScaleButton = new Button(dpiGroup, SWT.RADIO);
// _dpiScaleButton.setText("1 monitor inch == 1 paper inch");
// _dpiScaleButton.addSelectionListener(this);
// _dpiScaleButton.setLayoutData(new GridData(GridData.FILL_VERTICAL));
//
// // set defaults
// _pixelScaleButton.setSelection(false);
// _dpiScaleButton.setSelection(true);
// _currentScale = _dpiScale;
//
// return dpiGroup;
// }
// ============================= eventing =================================
@Override
public void buttonPressed(int buttonID) {
super.buttonPressed(buttonID);
if (buttonID == BUTTON_CHANGE_PRINTERDATA_ID) {
PrintDialog printDialog = new PrintDialog(this.getShell(), SWT.NONE);
PrinterData printData = printDialog.open();
if (!_printer.getPrinterData().equals(printData)) {
_printer = new Printer(printData);
// refresh preview
((GridData) (_preview.getLayoutData())).widthHint = PREVIEW_SIZE;
((GridData) (_preview.getLayoutData())).heightHint = (int) (PREVIEW_SIZE * ((double) _printer.getClientArea().height / _printer
.getClientArea().width));
_previewGroup.layout();
}
}
}
public void modifyText(ModifyEvent e) {
if (_insideInternalModify) // avoid endless-loops
return;
if (_aspectRatioOn) {
if (e.getSource() == _customWidthText.getText()) {
double width = _preferences.getDoublePreference(DefaultPrintPreferences.WIDTH);
_preferences.setDoublePreference(DefaultPrintPreferences.HEIGHT, width / _aspectRatio);
}
if (e.getSource() == _customHeightText.getText()) {
//
double height = _preferences.getDoublePreference(DefaultPrintPreferences.HEIGHT);
_preferences.setDoublePreference(DefaultPrintPreferences.WIDTH, height * _aspectRatio);
}
if (e.getSource() == _heightScaleText.getText()) {
if (_aspectRatioOn)
_preferences.setDoublePreference(DefaultPrintPreferences.SCALE_FACTOR_X, _preferences
.getDoublePreference(DefaultPrintPreferences.SCALE_FACTOR_Y));
}
if (e.getSource() == _widthScaleText.getText())
_preferences.setDoublePreference(DefaultPrintPreferences.SCALE_FACTOR_Y, _preferences
.getDoublePreference(DefaultPrintPreferences.SCALE_FACTOR_X));
}
updateControls();
}
@Override
public void widgetSelected(SelectionEvent e) {
super.widgetSelected(e);
if (_insideInternalModify) // avoid endless-loops
return;
if (e.getSource() == _pixelScaleButton || e.getSource() == _dpiScaleButton) {
_currentScale = _pixelScaleButton.getSelection() ? 1.0 : _dpiScale;
_preferences.setDoublePreference(DefaultPrintPreferences.CURRENT_SCALE, _currentScale);
}
if (e.getSource() == _centerButton) {
_center = _centerButton.getSelection();
}
if (e.getSource() == _customScalingButton) {
_sizeMode = SCALE_XY;
}
if (e.getSource() == _bestFitButton) {
if (_aspectRatioOn)
_sizeMode = BEST_FIT;
else
_sizeMode = SCALE_STRETCH;
}
if (e.getSource() == _customSizeButton) {
_sizeMode = CUSTOM_SIZE;
}
if (e.getSource() == _cmButton || e.getSource() == _inchesButton) {
_inches = _inchesButton.getSelection();
}
if (e.getSource() == _aspectRatioButton) {
aspectRatioOnChanged();
}
updateControls();
}
/**
* Pops up a warning if more than <code>WARNING_IF_MOREPAGES_THAN</code>
* pages are tp be printed and sets the scaled image for later retrieval for
* high quality printing.
*/
@Override
protected void okPressed() {
int numOfPages = getNumberOfPages();
boolean proceed = true;
if (numOfPages > WARNING_IF_MOREPAGES_THAN) {
String pagesText = Messages.PrintFigureDialog_10_xmsg + " " + numOfPages; //$NON-NLS-1$
proceed = MessageDialog.openQuestion(this.getShell(), Messages.PrintFigureDialog_22_xfld, pagesText + " \n" //$NON-NLS-1$
+ Messages.PrintFigureDialog_25_xfld);
}
if (proceed) {
setScaledImage(getMaximumOfXYImageScaleFactors());
super.okPressed();
}
}
// =========================== public access ==============================
public double getPrinterScaleFactor() {
return _preferences.getDoublePreference(DefaultPrintPreferences.SCALE_FACTOR) * _currentScale;
}
/**
* Returns the printer preferences as given through this dialog.
*
* @return The printer preferences as given through this dialog.
*/
public IPrintPreferences getPreferences() {
return _preferences;
}
public double getCurrentScale() {
return _currentScale;
}
public Printer getPrinter() {
return _printer;
}
// ========================= private helper methods =======================
private Rectangle getPrintRegion() {
// here any PrintOperation can be used, because the print-region is
// only dependent on the printer, and not on the image to print
PrintFigureOperation operation = new PrintFigureOperation(_printer, _figure);
Rectangle printRegion = operation.getPrintRegion();
return printRegion;
}
/**
* Returns a point containing the size of the image for the preview.
*
* @return A point containing the size of the image for the preview.
*/
private Point getScaledImageSize(Rectangle printRegion, org.eclipse.swt.graphics.Rectangle previewRegion) {
int imageWidth = (int) ((double) _figure.getBounds().width / (double) printRegion.width * previewRegion.width);
int imageHeight = (int) ((double) _figure.getBounds().height / (double) printRegion.height * previewRegion.height);
if (_sizeMode == SCALE_XY)
return new Point((int) (imageWidth * getPrinterScaleFactorX()), (int) (imageHeight * getPrinterScaleFactorY()));
if (_sizeMode == BEST_FIT) {
// compute best fit scalefactor
double widthRatio = imageWidth * _currentScale / previewRegion.width;
double heightRatio = imageHeight * _currentScale / previewRegion.height;
if (widthRatio > heightRatio)
return new Point(previewRegion.width, (int) (1 / widthRatio * imageHeight * _currentScale));
else
return new Point((int) (1 / heightRatio * imageWidth * _currentScale), previewRegion.height);
}
if (_sizeMode == SCALE_STRETCH) {
return new Point(previewRegion.width, previewRegion.height);
}
if (_sizeMode == CUSTOM_SIZE) {
// determine inches represented by preview
org.eclipse.swt.graphics.Point printerDPI = _printer.getDPI();
double widthInInches = (double) printRegion.width / printerDPI.x;
double heightInInches = (double) printRegion.height / printerDPI.y;
double width = _preferences.getDoublePreference(DefaultPrintPreferences.WIDTH);
double height = _preferences.getDoublePreference(DefaultPrintPreferences.HEIGHT);
width = previewRegion.width * (width / widthInInches);
height = previewRegion.height * (height / heightInInches);
if (_inches)
return new Point((int) width, (int) height);
else
return new Point((int) (width / INCH_TO_CM_FACTOR), (int) (height / INCH_TO_CM_FACTOR));
}
// shouldn't happen
throw new IllegalArgumentException(Messages.PrintFigureDialog_38_xfld + _sizeMode);
}
private double getPrinterScaleFactorX() {
return _preferences.getDoublePreference(DefaultPrintPreferences.SCALE_FACTOR_X) * _currentScale;
}
private double getPrinterScaleFactorY() {
return _preferences.getDoublePreference(DefaultPrintPreferences.SCALE_FACTOR_Y) * _currentScale;
}
/**
* determines margins depending on {@link _sizeMode} and {@link _center}.
*
* @return Point containing left and top margins as x and y values.
*/
private Point determineMargins(Rectangle printRegion, org.eclipse.swt.graphics.Rectangle previewRegion, int imageWidthScaled,
int imageHeightScaled) {
int leftMargin;
int topMargin;
if (!_center && _sizeMode != SCALE_STRETCH) {
double leftMarginPreference = _preferences.getDoublePreference(DefaultPrintPreferences.LEFT_MARGIN);
double topMarginPreference = _preferences.getDoublePreference(DefaultPrintPreferences.TOP_MARGIN);
leftMargin = (int) (leftMarginPreference * printRegion.width / previewRegion.width);
topMargin = (int) (topMarginPreference * printRegion.height / previewRegion.height);
// check if numbers represent inches or cm
if (!_inches) {
leftMargin = (int) (leftMargin / INCH_TO_CM_FACTOR);
topMargin = (int) (topMargin / INCH_TO_CM_FACTOR);
}
return new Point(leftMargin, topMargin);
} else if (_center && _sizeMode != SCALE_STRETCH) {
leftMargin = (int) ((double) (previewRegion.width - imageWidthScaled) / 2);
if (leftMargin < 0)
leftMargin = 0;
topMargin = (int) ((double) (previewRegion.height - imageHeightScaled) / 2);
if (topMargin < 0)
topMargin = 0;
return new Point(leftMargin, topMargin);
} else {
leftMargin = 0;
topMargin = 0;
return new Point(leftMargin, topMargin);
}
}
/**
* Transforms preview values into printer values and stores them in the
* IPrintPreferences.
*/
private void adjustPrinterValuesUsingPreview(int leftMargin, int topMargin, int imageWidthScaled, int imageHeightScaled,
Rectangle printRegion, org.eclipse.swt.graphics.Rectangle previewRegion) {
// conversion
double printerImageWidth = (double) imageWidthScaled * (double) printRegion.width / previewRegion.width;
double printerImageHeight = (double) imageHeightScaled * (double) printRegion.height / previewRegion.height;
double printerLeftMargin = (double) leftMargin * (double) printRegion.width / previewRegion.width;
double printerTopMargin = (double) topMargin * (double) printRegion.height / previewRegion.height;
// storing
_preferences.setDoublePreference(DefaultPrintPreferences.PRINTER_IMAGE_WIDTH, printerImageWidth);
_preferences.setDoublePreference(DefaultPrintPreferences.PRINTER_IMAGE_HEIGHT, printerImageHeight);
_preferences.setDoublePreference(DefaultPrintPreferences.PRINTER_LEFT_MARGIN, printerLeftMargin);
_preferences.setDoublePreference(DefaultPrintPreferences.PRINTER_TOP_MARGIN, printerTopMargin);
// as the printer values get updated, the number of pages may change
refreshOutputPagesInfo();
}
/**
* @return The number of pages which the current preferences would produce
* on the printer.
*/
private int getNumberOfPages() {
// determine pages to print
double width = _preferences.getDoublePreference(DefaultPrintPreferences.PRINTER_IMAGE_WIDTH);
double height = _preferences.getDoublePreference(DefaultPrintPreferences.PRINTER_IMAGE_HEIGHT);
double left = _preferences.getDoublePreference(DefaultPrintPreferences.PRINTER_LEFT_MARGIN);
double top = _preferences.getDoublePreference(DefaultPrintPreferences.PRINTER_TOP_MARGIN);
width += left;
height += top;
Rectangle clientSize = getPrintRegion();
int numberOfPages = ((int) Math.ceil(width / clientSize.width) * ((int) Math.ceil(height / clientSize.height)));
return numberOfPages;
}
/**
* @return maximum of scale factor for x- and y-axis as stored in
* <code>_preferences</code>.
*/
public double getMaximumOfXYImageScaleFactors() {
double width = _preferences.getDoublePreference(DefaultPrintPreferences.PRINTER_IMAGE_WIDTH);
double height = _preferences.getDoublePreference(DefaultPrintPreferences.PRINTER_IMAGE_HEIGHT);
double widthScale = width / _figure.getBounds().width;
double heightScale = height / _figure.getBounds().height;
return (widthScale > heightScale) ? widthScale : heightScale;
}
/**
* Updates the values, depending on the state of the aspect-ratio-on button.
*/
private void aspectRatioOnChanged() {
_aspectRatioOn = _aspectRatioButton.getSelection();
if (_aspectRatioOn) { // even update if _sizeMode != CUSTOM_SIZE,
// because it is always visible
// update preferences
double width = _preferences.getDoublePreference(DefaultPrintPreferences.WIDTH);
_preferences.setDoublePreference(DefaultPrintPreferences.HEIGHT, width / _aspectRatio);
}
if (_aspectRatioOn && _sizeMode == SCALE_STRETCH)
_sizeMode = BEST_FIT;
if (!_aspectRatioOn && _sizeMode == BEST_FIT)
_sizeMode = SCALE_STRETCH;
if (_aspectRatioOn && _sizeMode == SCALE_XY)
_preferences.setDoublePreference(DefaultPrintPreferences.SCALE_FACTOR_Y, _preferences
.getDoublePreference(DefaultPrintPreferences.SCALE_FACTOR_X));
}
public int configure() {
return open();
}
}