package printing.tests; import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.printing.*; public class TestSetPrinterData { static PrinterData printerData = null; static Text fileNameText; static Button fileNameBrowseButton; static Combo paperDisplayNameCombo; static Text paperWidthText; static Text paperHeightText; static final String [] paperSizes = new String [] {"", PrinterData.PAPER_LETTER, PrinterData.PAPER_LEGAL, PrinterData.PAPER_A2, PrinterData.PAPER_A4, PrinterData.PAPER_A5, PrinterData.PAPER_A6, PrinterData.PAPER_B5, PrinterData.PAPER_JB5, PrinterData.PAPER_EXECUTIVE}; public static void main(String [] args) { //Printer.DEBUG = true; final Display display = new Display(); final Shell shell = new Shell(display); shell.setText("TestSetPrinterData"); shell.setLayout(new RowLayout()); Button printerDataButton = new Button(shell, SWT.PUSH); printerDataButton.setText("PrinterData"); printerDataButton.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e) { final Shell dialog = new Shell (shell, SWT.DIALOG_TRIM); dialog.setText("Enter PrinterData Test Values"); GridLayout gridLayout = new GridLayout (2, false); dialog.setLayout (gridLayout); PrinterData printerList[] = Printer.getPrinterList(); String driverAndNameList[] = new String[printerList.length]; for (int i = 0; i < printerList.length; i++) { driverAndNameList[i] = printerList[i].driver + ", " + printerList[i].name; } PrinterData defaultPrinter = Printer.getDefaultPrinterData(); if (defaultPrinter == null) { if (printerList.length == 0) { System.out.println("There are no printers."); return; } else { System.out.println("There are printers, but no default printer has been set. Assuming printer[0] is the default."); defaultPrinter = printerList[0]; } } new Label (dialog, SWT.NONE).setText ("Driver and Name:"); final Combo driverAndNameCombo = new Combo (dialog, SWT.DROP_DOWN | SWT.READ_ONLY); String current = ""; if (printerData == null) { current = defaultPrinter.driver + ", " + defaultPrinter.name; } else { current = printerData.driver + ", " + printerData.name; } driverAndNameCombo.setItems (driverAndNameList); driverAndNameCombo.setText (current); if (driverAndNameCombo.getText().length() == 0) { // On the Mac, the driver in the printer list is not the same as the driver returned by the printer dialog. driverAndNameCombo.add(current); driverAndNameCombo.setText (current); } driverAndNameCombo.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); new Label (dialog, SWT.NONE).setText ("Scope:"); final Combo scopeCombo = new Combo (dialog, SWT.DROP_DOWN | SWT.READ_ONLY); scopeCombo.setItems (new String [] {"ALL_PAGES", "PAGE_RANGE", "SELECTION"}); if (printerData == null) { scopeCombo.setText ("ALL_PAGES"); } else { scopeCombo.setText (printerData.scope == PrinterData.SELECTION ? "SELECTION" : printerData.scope == PrinterData.PAGE_RANGE ? "PAGE_RANGE" : "ALL_PAGES"); } scopeCombo.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); new Label (dialog, SWT.NONE).setText ("Start Page:"); final Spinner startPageSpinner = new Spinner (dialog, SWT.BORDER); startPageSpinner.setMaximum(99); if (printerData == null) { startPageSpinner.setSelection(1); } else { startPageSpinner.setSelection(printerData.startPage); } startPageSpinner.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); new Label (dialog, SWT.NONE).setText ("End Page:"); final Spinner endPageSpinner = new Spinner (dialog, SWT.BORDER); endPageSpinner.setMaximum(99); if (printerData == null) { } else { endPageSpinner.setSelection(printerData.endPage); } endPageSpinner.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); final Button printToFileCheckbox = new Button (dialog, SWT.CHECK); printToFileCheckbox.setText ("Print To File"); printToFileCheckbox.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); printToFileCheckbox.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e) { boolean enabled = printToFileCheckbox.getSelection(); fileNameText.setEnabled(enabled); fileNameBrowseButton.setEnabled(enabled); } }); if (printerData != null) { printToFileCheckbox.setSelection(printerData.printToFile); } fileNameBrowseButton = new Button (dialog, SWT.PUSH); fileNameBrowseButton.setText ("Browse..."); fileNameBrowseButton.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); fileNameBrowseButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { FileDialog dialog = new FileDialog(shell, SWT.OPEN); dialog.setFilterPath(fileNameText.getText()); String selectedFile = dialog.open(); if (selectedFile != null) { fileNameText.setText(selectedFile); } } }); new Label (dialog, SWT.NONE).setText ("File Name:"); fileNameText = new Text (dialog, SWT.BORDER); if (printerData == null) { fileNameText.setText (""); } else { fileNameText.setText (printerData.fileName == null ? "" : printerData.fileName); } fileNameText.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); fileNameText.setEnabled(false); fileNameBrowseButton.setEnabled(false); new Label (dialog, SWT.NONE).setText ("Copy Count:"); final Spinner copyCountSpinner = new Spinner (dialog, SWT.BORDER); copyCountSpinner.setMaximum(99); if (printerData == null) { copyCountSpinner.setSelection(1); } else { copyCountSpinner.setSelection(printerData.copyCount); } copyCountSpinner.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); final Button collateCheckbox = new Button (dialog, SWT.CHECK); collateCheckbox.setText ("Collate"); if (printerData != null) { collateCheckbox.setSelection(printerData.collate); } collateCheckbox.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); new Label(dialog, SWT.NONE); // filler new Label (dialog, SWT.NONE).setText ("Orientation:"); final Combo orientationCombo = new Combo (dialog, SWT.DROP_DOWN | SWT.READ_ONLY); orientationCombo.setItems (new String [] {"PORTRAIT", "LANDSCAPE"}); if (printerData == null) { orientationCombo.setText ("PORTRAIT"); } else { orientationCombo.setText (printerData.orientation == PrinterData.LANDSCAPE ? "LANDSCAPE" : "PORTRAIT"); } orientationCombo.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); new Label (dialog, SWT.NONE).setText ("Duplex:"); final Combo duplexCombo = new Combo (dialog, SWT.DROP_DOWN | SWT.READ_ONLY); duplexCombo.setItems (new String [] {"SIMPLEX", "HORIZONTAL", "VERTICAL"}); if (printerData == null) { duplexCombo.setText ("SIMPLEX"); } else { duplexCombo.setText (printerData.duplex == PrinterData.DUPLEX_HORIZONTAL ? "HORIZONTAL" : printerData.duplex == PrinterData.DUPLEX_VERTICAL ? "VERTICAL" : "SIMPLEX"); } duplexCombo.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); new Label (dialog, SWT.NONE).setText ("Pages per side:"); final Combo pagesPerSideCombo = new Combo (dialog, SWT.DROP_DOWN | SWT.READ_ONLY); pagesPerSideCombo.setItems (new String [] {"1", "2", "4", "6", "9", "16"}); if (printerData == null) { pagesPerSideCombo.setText ("1"); } else { pagesPerSideCombo.setText ("" + printerData.pagesPerSide); } pagesPerSideCombo.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); new Label (dialog, SWT.NONE).setText ("X Resolution (dpi):"); final Combo resolutionXCombo = new Combo (dialog, SWT.DROP_DOWN); resolutionXCombo.setItems (new String [] {"300", "600", "1200", "2400", "4800", "9600"}); if (printerData == null || (printerData != null && printerData.resolutionX == 0)) { resolutionXCombo.setText (""); } else { resolutionXCombo.setText ("" + printerData.resolutionX); } resolutionXCombo.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); new Label (dialog, SWT.NONE).setText ("Y Resolution (dpi):"); final Combo resolutionYCombo = new Combo (dialog, SWT.DROP_DOWN); resolutionYCombo.setItems (new String [] {"300", "600", "1200", "2400", "4800", "9600"}); if (printerData == null || (printerData != null && printerData.resolutionY == 0)) { resolutionYCombo.setText (""); } else { resolutionYCombo.setText ("" + printerData.resolutionY); } resolutionYCombo.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); new Label (dialog, SWT.NONE).setText ("Scale factor (%):"); final Combo scaleCombo = new Combo (dialog, SWT.DROP_DOWN); scaleCombo.setItems (new String [] {"25", "33", "50", "75", "100", "200", "400"}); if (printerData == null) { scaleCombo.setText ("100"); } else { scaleCombo.setText ("" + printerData.scale); } scaleCombo.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); // TODO: getPaperNameList should be changed to an instance method // TODO: getPaperNameList should somehow return both the names and the display names (and the height and width for each paper size). // TODO: Set the names into paperSizeNameCombo (filter out the standard names) and set the display names into paperDisplayNameCombo. // TODO: Should do this whenever user changes printer driver/name in driverAndNameCombo, since getPaperNameList is for a printer instance. Printer currentPrinter = new Printer(printerData); String [] paperNames = currentPrinter.getPaperNameList(); currentPrinter.dispose(); new Label (dialog, SWT.NONE).setText ("Paper size name:"); final Combo paperSizeNameCombo = new Combo (dialog, SWT.DROP_DOWN); String [] newNames = new String[paperSizes.length + paperNames.length]; System.arraycopy(paperSizes, 0, newNames, 0, paperSizes.length); System.arraycopy(paperNames, 0, newNames, paperSizes.length, paperNames.length); paperSizeNameCombo.setItems (newNames); if (printerData == null || printerData.paperSizeName == null) { paperSizeNameCombo.setText (""); } else { paperSizeNameCombo.setText (printerData.paperSizeName); } paperSizeNameCombo.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); paperSizeNameCombo.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { boolean enabled = !standardPaperSize(paperSizeNameCombo.getText()); paperDisplayNameCombo.setEnabled(enabled); paperWidthText.setEnabled(enabled); paperHeightText.setEnabled(enabled); } }); boolean enabled = printerData != null && !standardPaperSize(printerData.paperSizeName); new Label (dialog, SWT.NONE).setText ("Paper display name:"); paperDisplayNameCombo = new Combo (dialog, SWT.DROP_DOWN); paperDisplayNameCombo.setItems (paperNames); paperDisplayNameCombo.add("", 0); if (printerData == null || printerData.paperSizeName == null) { paperDisplayNameCombo.setText (""); } else { paperDisplayNameCombo.setText (printerData.paperSizeName); } paperDisplayNameCombo.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); paperDisplayNameCombo.setEnabled(enabled); paperDisplayNameCombo.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { String paperName = paperDisplayNameCombo.getText(); if (paperName.equals("")) { // TODO: not sure if these should be cleared when the combo is cleared paperWidthText.setText (""); paperHeightText.setText (""); } else { // TODO: need to set the values based on the paperNameCombo selection paperWidthText.setText ("0.0"); // TODO: where to get actual width? paperHeightText.setText ("0.0"); // TODO: where to get actual height? } } }); new Label (dialog, SWT.NONE).setText ("Paper width:"); paperWidthText = new Text (dialog, SWT.BORDER); if (printerData == null) { paperWidthText.setText (""); } else { paperWidthText.setText ("" + printerData.paperWidth); } paperWidthText.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); paperWidthText.setEnabled(enabled); new Label (dialog, SWT.NONE).setText ("Paper height:"); paperHeightText = new Text (dialog, SWT.BORDER); if (printerData == null) { paperHeightText.setText (""); } else { paperHeightText.setText ("" + printerData.paperHeight); } paperHeightText.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); paperHeightText.setEnabled(enabled); Composite buttons = new Composite(dialog, SWT.NONE); GridLayout layout = new GridLayout(3, true); layout.marginWidth = 0; buttons.setLayout(layout); buttons.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, true, false, 2, 1)); Button clear = new Button(buttons, SWT.PUSH); clear.setText("Null"); clear.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, false, false)); clear.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e) { printerData = null; dialog.dispose(); } }); Button defaults = new Button(buttons, SWT.PUSH); defaults.setText("Defaults"); defaults.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, true, false)); defaults.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e) { printerData = new PrinterData(); dialog.dispose(); } }); Button ok = new Button(buttons, SWT.PUSH); ok.setText("OK"); ok.setLayoutData (new GridData (SWT.FILL, SWT.CENTER, true, false)); ok.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e) { if (printerData == null) printerData = new PrinterData(); String driverAndName = driverAndNameCombo.getText(); printerData.driver = driverAndName.substring(0, driverAndName.indexOf(", ")); printerData.name = driverAndName.substring(driverAndName.indexOf(", ") + 2); String scope = scopeCombo.getText(); printerData.scope = scope.equals("PAGE_RANGE") ? PrinterData.PAGE_RANGE : scope.equals("SELECTION") ? PrinterData.SELECTION : PrinterData.ALL_PAGES; printerData.startPage = startPageSpinner.getSelection(); printerData.endPage = endPageSpinner.getSelection(); printerData.fileName = fileNameText.getText (); printerData.printToFile = printToFileCheckbox.getSelection(); printerData.copyCount = copyCountSpinner.getSelection(); printerData.collate = collateCheckbox.getSelection(); String orientation = orientationCombo.getText(); printerData.orientation = orientation.equals("LANDSCAPE") ? PrinterData.LANDSCAPE : PrinterData.PORTRAIT; String duplex = duplexCombo.getText(); printerData.duplex = duplex.equals("HORIZONTAL") ? PrinterData.DUPLEX_HORIZONTAL : duplex.equals("VERTICAL") ? PrinterData.DUPLEX_VERTICAL : PrinterData.DUPLEX_SIMPLEX; printerData.pagesPerSide = Integer.parseInt(pagesPerSideCombo.getText()); try { printerData.resolutionX = Integer.parseInt(resolutionXCombo.getText()); } catch (NumberFormatException ex) {} try { printerData.resolutionY = Integer.parseInt(resolutionYCombo.getText()); } catch (NumberFormatException ex) {} printerData.scale = Integer.parseInt(scaleCombo.getText()); String paperSizeName = paperSizeNameCombo.getText(); if (paperSizeName.equals("")) paperSizeName = null; printerData.paperSizeName = paperSizeName; if (!standardPaperSize(paperSizeName)) { printerData.paperDisplayName = paperDisplayNameCombo.getText(); try { printerData.paperWidth = Double.parseDouble(paperWidthText.getText()); } catch (NumberFormatException ex) {} try { printerData.paperHeight = Double.parseDouble(paperHeightText.getText()); } catch (NumberFormatException ex) {} } dialog.dispose(); } }); dialog.pack (); dialog.open (); } }); Button printDialogButton = new Button(shell, SWT.PUSH); printDialogButton.setText("PrintDialog"); printDialogButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { PrintDialog dialog = new PrintDialog(shell, SWT.NONE); if (printerData != null) { if (false) { // Old methods. Test for backward compatibility. dialog.setScope(printerData.scope); dialog.setStartPage(printerData.startPage); dialog.setEndPage(printerData.endPage); dialog.setPrintToFile(printerData.printToFile); } if (true) { // New method. Recommended way to seed dialog. dialog.setPrinterData(printerData); } } printerData = dialog.open(); logPrinterData(printerData); } }); Button printButton = new Button(shell, SWT.PUSH); printButton.setText("Print"); printButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { try { Printer printer = new Printer(printerData); Point dpi = printer.getDPI(); if (printer.startJob("SWT Printing Snippet")) { GC gc = new GC(printer); if (printer.startPage()) { int oneInch = dpi.x; gc.drawLine(oneInch, oneInch, 5 * oneInch, 5 * oneInch); gc.drawLine(5 * oneInch, oneInch, oneInch, 5 * oneInch); gc.drawString("Hello World!", oneInch, 2 * oneInch); gc.drawString("Printed on " + (printerData == null ? "default printer" : printerData.name) + " using SWT on " + SWT.getPlatform(), oneInch, oneInch * 5/2); printer.endPage(); } gc.dispose(); printer.endJob(); } printer.dispose(); } catch (SWTError ex) { MessageBox messageBox = new MessageBox(shell, SWT.ICON_ERROR); messageBox.setMessage("The PrinterData does not specify a valid printer and there is no default printer set."); messageBox.open(); } } }); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } static void logPrinterData(PrinterData data) { if (data != null) { System.out.println(data.toString()); // printer driver and name System.out.print("Scope: Print "); if (data.scope == PrinterData.PAGE_RANGE) { System.out.println("Pages: " + data.startPage + " To: " + data.endPage); } else if (data.scope == PrinterData.SELECTION) { System.out.println("Selection"); } else { System.out.println("All Pages"); } System.out.println("Print to file: " + data.printToFile); System.out.println("File name: " + data.fileName); System.out.println("Copy count: " + data.copyCount); System.out.println("Collate: " + data.collate); System.out.println("Orientation: " + (data.orientation == PrinterData.PORTRAIT ? "PORTRAIT" : data.orientation == PrinterData.LANDSCAPE ? "LANDSCAPE" : "UNKNOWN " + data.orientation)); System.out.println("Duplex: " + (data.duplex == PrinterData.DUPLEX_SIMPLEX ? "SIMPLEX" : data.duplex == PrinterData.DUPLEX_HORIZONTAL ? "HORIZONTAL" : data.duplex == PrinterData.DUPLEX_VERTICAL ? "VERTICAL": "UNKNOWN " + data.duplex)); System.out.println("Pages per side: " + data.pagesPerSide); System.out.println("X Resolution: " + data.resolutionX + " dpi"); System.out.println("Y Resolution: " + data.resolutionY + " dpi"); System.out.println("Scale factor: " + data.scale + "%"); System.out.println("Paper size: " + data.paperSizeName); if (!standardPaperSize(data.paperSizeName)) { System.out.println("Paper display name: " + data.paperDisplayName); System.out.println("Paper size: " + data.paperWidth + " x " + data.paperHeight); } } else { System.out.println("Cancelled"); } System.out.println(); } static boolean standardPaperSize(String paperSize) { if (paperSize == null) return false; for (int i = 1; i < paperSizes.length; i++) { if (paperSize.equals(paperSizes[i])) return true; } return false; } }