/****************************************************************************** | |
* 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.common.ui.printing; | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
import java.util.List; | |
import java.util.Locale; | |
import org.eclipse.gmf.runtime.common.core.util.Log; | |
import org.eclipse.gmf.runtime.common.core.util.StringStatics; | |
import org.eclipse.gmf.runtime.common.core.util.Trace; | |
import org.eclipse.gmf.runtime.common.ui.printing.internal.CommonPrintingDebugOptions; | |
import org.eclipse.gmf.runtime.common.ui.printing.internal.CommonPrintingStatusCodes; | |
import org.eclipse.gmf.runtime.common.ui.printing.internal.PrintingPlugin; | |
import org.eclipse.swt.printing.PrinterData; | |
import org.eclipse.ui.PlatformUI; | |
/** | |
* The PrintHelper implements the IPrintHelper interface for the platform | |
* specfic print code. | |
* | |
* This is for Win32. | |
* | |
* @author wdiu, Wayne Diu | |
*/ | |
public class PrintHelper implements IPrintHelper { | |
/** | |
* Dynamic link library name without the extension | |
*/ | |
private static final String DLL_NAME = "DiagramPrint"; //$NON-NLS-1$ | |
/** | |
* Country and language separator | |
*/ | |
private static final String SEPARATOR = StringStatics.UNDER_SCORE; | |
// to avoid throwing exceptions because of trying to load dlls for | |
// unsupported locales, maintain an array of supported countries and | |
// languages | |
// in the array below, if there are multiple entries for the same | |
// language, put the country specific one first | |
/** | |
* Supported languages strings. Default locale is SUPPORTED[0]. | |
*/ | |
private static final String SUPPORTED[] = { | |
"en", "ar", "cs", "da", "de", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ | |
"el", "es", "fi", "hu", "fr", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ | |
"it", "iw", "ja", "ko", "nl", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ | |
"no", "nb", "nn", "pl", "pt", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ | |
"pt_BR", "ru", "sv", "tr", "zh", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ | |
"zh_CN", "zh_TW", "zh_HK" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ | |
/** | |
* Default locale, English language | |
*/ | |
private static final String DEFAULT_LOCALE = SUPPORTED[0]; | |
/* | |
* Load the dll | |
*/ | |
static { | |
// Although a far nicer way to do this dll loading is by using | |
// Bundle-NativeCode in manifest.mf, we are not doing it that way | |
// because of Bugzilla | |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=153902 | |
// When the Bugzilla has been fixed, this static block can be replaced | |
// with one line of code | |
// System.loadLibrary("DiagramPrint"); | |
List<String> supported = new ArrayList<String>(Arrays.asList(SUPPORTED)); | |
String localizedVersion = DEFAULT_LOCALE; | |
Locale defaultLocale = Locale.getDefault(); | |
String language = defaultLocale.getLanguage().toLowerCase(); | |
String country = defaultLocale.getCountry().toUpperCase(); | |
String countrySpecificLocale = language + SEPARATOR + country; | |
if (supported.contains(countrySpecificLocale)) { | |
localizedVersion = countrySpecificLocale; | |
} else if (supported.contains(language)) { | |
localizedVersion = language; | |
} | |
try { | |
System.loadLibrary(DLL_NAME + SEPARATOR + localizedVersion); | |
} catch (UnsatisfiedLinkError ule) { | |
Log.error(PrintingPlugin.getDefault(), | |
CommonPrintingStatusCodes.RESOURCE_FAILURE, | |
"Failed to load DiagramPrint dll for " //$NON-NLS-1$ | |
+ localizedVersion); | |
Trace.catching(PrintingPlugin.getDefault(), | |
CommonPrintingDebugOptions.EXCEPTIONS_CATCHING, | |
PrintHelper.class, "Link", ule); //$NON-NLS-1$ | |
Trace.throwing(PrintingPlugin.getDefault(), | |
CommonPrintingDebugOptions.EXCEPTIONS_THROWING, | |
PrintHelper.class, "Link", ule); //$NON-NLS-1$*/ | |
throw ule; | |
} | |
} | |
/* | |
* Static methods from dll | |
*/ | |
/* | |
* Set methods | |
*/ | |
/** | |
* Init print dialog box's scale fit to. | |
* | |
* @param m | |
* @param n | |
*/ | |
public static native void initScaleFitTo(int m, int n); | |
/** | |
* Init print dialog box's scale percent. | |
* | |
* @param percent | |
*/ | |
public static native void initScalePercent(int percent); | |
/** | |
* Resets the dialog. Call this before addDiagramString if you've already | |
* added strings. | |
*/ | |
public static native void resetDialog(); | |
/** | |
* Add a string to the diagrams list of the dialog box. | |
* | |
* @param string | |
*/ | |
public static native void addDiagramString(String string); | |
/** | |
* Set the owner hwnd so that the displyed print dialog is modal. | |
* | |
* @param windowClass | |
* String with class | |
* @param title | |
* String with shell title | |
*/ | |
public static native void setHwndOwner(String windowClass, String title); | |
/** | |
* Allows to set the orientation (portrait/landscape) in the print dialog. | |
* | |
* @param isLandscape | |
* true if orientation should be landscape, false otherwise. | |
*/ | |
public static native void setOrientation(boolean isLandscape); | |
/** | |
* Allows to set the paper size in the print dialog. | |
* | |
* @param index | |
* index of type of paper size, | |
* @see org.eclipse.gmf.runtime.diagram.ui.internal.pagesetup.PageSetupPageType | |
* for the type of paper sizes available and their indices. | |
* @param width | |
* specifies the custom width of the paper. Leave as 0 if paper | |
* size index is user-defined. | |
* @param height | |
* specifies the custom width of the paper. Leave as 0 if paper | |
* size index is user-defined. | |
*/ | |
public static native void setPaperSize(int index, double width, | |
double height); | |
/* | |
* Get methods | |
*/ | |
/** | |
* If not > 0 then user has clicked percent scaling | |
* | |
* @return scale to m int | |
*/ | |
public static native int getScaleFitToM(); | |
/** | |
* If not > 0 then user has clicked percent scaling | |
* | |
* @return scale to n int | |
*/ | |
public static native int getScaleFitToN(); | |
/** | |
* If not > 0 then user has clicked fit to m x n scaling | |
* | |
* @return scale percent int | |
*/ | |
public static native int getScalePercent(); | |
/** | |
* Returns true if the diagram at the index was selected | |
* | |
* @param index | |
* the index of the diagrams you passed in | |
* @return true if selected, false if not selected | |
*/ | |
public static native boolean isDiagramSelected(int index); | |
// one of the three is unnecssary, but it makes more sense | |
/** | |
* Returns if diagram print range all was selected | |
* | |
* @return true if selected, false if not selected | |
*/ | |
public static native boolean getDiagramPrintRangeAll(); | |
/** | |
* Returns if diagram print range current was selected | |
* | |
* @return true if selected, false if not selected | |
*/ | |
public static native boolean getDiagramPrintRangeCurrent(); | |
/** | |
* Returns if diagram print range selection was selected | |
* | |
* @return true if selected, false if not selected | |
*/ | |
public static native boolean getDiagramPrintRangeSelection(); | |
// one of the three is unnecssary, but it makes more sense | |
/** | |
* Returns if print range all was selected | |
* | |
* @return true if selected, false if not selected | |
*/ | |
public static native boolean getPrintRangeAll(); | |
/** | |
* Returns if print range pages was selected | |
* | |
* @return true if selected, false if not selected | |
*/ | |
public static native boolean getPrintRangePages(); | |
/** | |
* Returns if collate was selected | |
* | |
* @return true if selected, false if not selected | |
*/ | |
public static native boolean getCollate(); | |
/** | |
* Returns the pages from int value, check if (getPrintRangesPages()) first. | |
* | |
* @return int of the pages from box | |
*/ | |
public static native int getPagesFrom(); | |
/** | |
* Returns the pages from int value, check if (getPrintRangesPages()) first. | |
* | |
* @return int of the pages to box | |
*/ | |
public static native int getPagesTo(); | |
/** | |
* Returns the number of copies the user wants to print. This is nCopies | |
* from PRINTDLG | |
* | |
* @return int with the number of copies | |
*/ | |
public static native int getNumberOfCopies(); | |
/* | |
* Don't do getDevMode() and gethDevNames() for hDevMode and hDevNames from | |
* PRINTDLG because they are filled by passing in PrinterData to open.. | |
*/ | |
/** | |
* Opens the dialog box. | |
* | |
* @param pd | |
* @return <code>true</code> if dialog box opened succesfully, | |
* <code>false</code> otherwise | |
*/ | |
public static native boolean open(PrinterData pd); | |
/** | |
* Open the print dialog box with the diagram list. | |
* | |
* XXX: internal access SWT_Window0 is a hardcoded internal access string | |
* | |
* @param diagramList | |
*/ | |
public PrinterData openPrintDlg(List diagramList) { | |
// set owner to make it modal | |
String title = PlatformUI.getWorkbench().getActiveWorkbenchWindow() | |
.getShell().getText(); | |
assert null != title : "title cannot be null"; //$NON-NLS-1$ | |
// XXX: internal access | |
// SWT_Window0 is a hardcoded internal access string of the class | |
// name and it could change. However, setHwndOwner will try to | |
// obtain the window even if it can't find that matching class by | |
// using the window's title. | |
setHwndOwner("SWT_Window0", title); //$NON-NLS-1$ | |
// initialize dialog | |
resetDialog(); | |
if (diagramList != null) { | |
for (int c = 0; c < diagramList.size(); c++) { | |
assert (diagramList.get(c) instanceof String); | |
addDiagramString((String) diagramList.get(c)); | |
} | |
} | |
// prevent default initialization from empty constructor | |
PrinterData printerData = new PrinterData(StringStatics.BLANK, | |
StringStatics.BLANK); | |
if (open(printerData)) { | |
// save the printerData | |
if (getPrintRangePages()) { | |
printerData.scope = PrinterData.PAGE_RANGE; | |
printerData.startPage = getPagesFrom(); | |
printerData.endPage = getPagesTo(); | |
} else /* if (getPrintRangeAll()) */{ | |
printerData.scope = PrinterData.ALL_PAGES; | |
} | |
printerData.printToFile = false; | |
// not supported by dialog, no need to set printerData.fileName | |
printerData.copyCount = getNumberOfCopies(); | |
printerData.collate = getCollate(); | |
} else { | |
return null; | |
} | |
return printerData; | |
} | |
/** | |
* Make an instance of PrintHelper | |
*/ | |
public PrintHelper() { | |
/* empty constructor */ | |
} | |
/* | |
* The get methods to hide the static methods | |
*/ | |
/** | |
* If not > 0 then user has clicked percent scaling | |
* | |
* @return scale to m int | |
*/ | |
public int getDlgScaleFitToM() { | |
return getScaleFitToM(); | |
} | |
/** | |
* If not > 0 then user has clicked percent scaling | |
* | |
* @return scale to n int | |
*/ | |
public int getDlgScaleFitToN() { | |
return getScaleFitToN(); | |
} | |
/** | |
* If not > 0 then user has clicked fit to m x n scaling | |
* | |
* @return scale percent int | |
*/ | |
public int getDlgScalePercent() { | |
return getScalePercent(); | |
} | |
/** | |
* Returns true if the diagram at the index was selected | |
* | |
* @param index | |
* the index of the diagrams you passed in | |
* @return true if selected, false if not selected | |
*/ | |
public boolean isDlgDiagramSelected(int index) { | |
return isDiagramSelected(index); | |
} | |
// one of the three is unnecssary, but it makes more sense | |
/** | |
* Returns if diagram print range all was selected | |
* | |
* @return true if selected, false if not selected | |
*/ | |
public boolean getDlgDiagramPrintRangeAll() { | |
return getDiagramPrintRangeAll(); | |
} | |
/** | |
* Returns if diagram print range current was selected | |
* | |
* @return true if selected, false if not selected | |
*/ | |
public boolean getDlgDiagramPrintRangeCurrent() { | |
return getDiagramPrintRangeCurrent(); | |
} | |
/** | |
* Returns if diagram print range selection was selected | |
* | |
* @return true if selected, false if not selected | |
*/ | |
public boolean getDlgDiagramPrintRangeSelection() { | |
return getDiagramPrintRangeSelection(); | |
} | |
// one of the three is unnecssary, but it makes more sense | |
/** | |
* Returns if print range all was selected | |
* | |
* @return true if selected, false if not selected | |
*/ | |
public boolean getDlgPrintRangeAll() { | |
return getPrintRangeAll(); | |
} | |
/** | |
* Returns if print range pages was selected | |
* | |
* @return true if selected, false if not selected | |
*/ | |
public boolean getDlgPrintRangePages() { | |
return getPrintRangePages(); | |
} | |
/** | |
* Returns if collate was selected | |
* | |
* @return true if selected, false if not selected | |
*/ | |
public boolean getDlgCollate() { | |
return getCollate(); | |
} | |
/** | |
* Returns the pages from int value, check if (getDlgPrintRangesPages()) | |
* first. | |
* | |
* @return int of the pages from box | |
*/ | |
public int getDlgPagesFrom() { | |
return getPagesFrom(); | |
} | |
/** | |
* Returns the pages from int value, check if (getDlgPrintRangesPages()) | |
* first. | |
* | |
* @return int of the pages to box | |
*/ | |
public int getDlgPagesTo() { | |
return getPagesTo(); | |
} | |
/** | |
* Returns the number of copies the user wants to print. This is nCopies | |
* from PRINTDLG | |
* | |
* @return int with the number of copies | |
*/ | |
public int getDlgNumberOfCopies() { | |
return getNumberOfCopies(); | |
} | |
/** | |
* Allows to set the orientation (portrait/landscape) in the print dialog. | |
* | |
* @param isLandscape | |
* true if orientation should be landscape, false otherwise. | |
*/ | |
public void setDlgOrientation(boolean bLandscape) { | |
setOrientation(bLandscape); | |
} | |
/** | |
* Allows to set the paper size in the print dialog. | |
* | |
* @param index | |
* index of type of paper size, | |
* @see org.eclipse.gmf.runtime.diagram.ui.internal.pagesetup.PageSetupPageType | |
* for the type of paper sizes available and their indices. | |
* @param width | |
* specifies the custom width of the paper. Leave as 0 if paper | |
* size index is user-defined. | |
* @param height | |
* specifies the custom width of the paper. Leave as 0 if paper | |
* size index is user-defined. | |
*/ | |
public void setDlgPaperSize(int index, double width, double height) { | |
setPaperSize(index, width, height); | |
} | |
/** | |
* Initialize the scaling factor in the print dialog. | |
*/ | |
public void setScaleFactor(int scaleFactor) { | |
initScalePercent(scaleFactor); | |
} | |
/** | |
* Initialize the scale width and height in the print dialog. | |
*/ | |
public void setScaleToWidthHeight(int width, int height) { | |
initScaleFitTo(width, height); | |
} | |
} |