Authors: russell@unturf.com · brackishbert@gmail.com · foxhop.net · TimeHexOn.com Patches, unit tests, benchmarks, whitepaper, and outreach briefs. Public domain — no copyright claimed. Use freely.
303 lines
12 KiB
Java
303 lines
12 KiB
Java
/*
|
|
* Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
import java.awt.Button;
|
|
import java.awt.Color;
|
|
import java.awt.FlowLayout;
|
|
import java.awt.Frame;
|
|
import java.awt.Graphics;
|
|
import java.awt.Graphics2D;
|
|
import java.awt.GridLayout;
|
|
import java.awt.Label;
|
|
import java.awt.Panel;
|
|
import java.awt.TextArea;
|
|
import java.awt.TextField;
|
|
import java.awt.print.PageFormat;
|
|
import java.awt.print.Paper;
|
|
import java.awt.print.Printable;
|
|
import java.awt.print.PrinterException;
|
|
import java.awt.print.PrinterJob;
|
|
import javax.swing.JOptionPane;
|
|
|
|
/*
|
|
* @test
|
|
* @bug 4252108 6229507
|
|
* @key printer
|
|
* @summary PrinterJob.validatePage() is unimplemented.
|
|
* @library /java/awt/regtesthelpers
|
|
* @build PassFailJFrame
|
|
* @run main/manual ValidatePage
|
|
*/
|
|
public class ValidatePage extends Frame implements Printable {
|
|
PrinterJob myPrinterJob;
|
|
PageFormat myPageFormat;
|
|
Label pw, ph, pglm, pgrm, pgiw, pgih, pgtm, pgbm;
|
|
TextField tpw, tph, tpglm, tpgtm, tpgiw, tpgih;
|
|
Label myWidthLabel;
|
|
Label myHeightLabel;
|
|
Label myImageableXLabel;
|
|
Label myImageableYLabel;
|
|
Label myImageableRightLabel;
|
|
Label myImageableBottomLabel;
|
|
Label myImageableWidthLabel;
|
|
Label myImageableHeightLabel;
|
|
Label myOrientationLabel;
|
|
|
|
private static String getOrientation(int o) {
|
|
return switch (o) {
|
|
case PageFormat.PORTRAIT -> "PORTRAIT";
|
|
case PageFormat.LANDSCAPE -> "LANDSCAPE";
|
|
case PageFormat.REVERSE_LANDSCAPE -> "REVERSE_LANDSCAPE";
|
|
default -> "<invalid>";
|
|
};
|
|
}
|
|
|
|
private void displayPageFormatAttributes() {
|
|
myWidthLabel.setText("Format Width = " + drnd(myPageFormat.getWidth()));
|
|
myHeightLabel.setText("Format Height = " + drnd(myPageFormat.getHeight()));
|
|
myImageableXLabel.setText("Format Left Margin = " + drnd(myPageFormat.getImageableX()));
|
|
myImageableRightLabel.setText("Format Right Margin = "
|
|
+ drnd(myPageFormat.getWidth()
|
|
- (myPageFormat.getImageableX() + myPageFormat.getImageableWidth())));
|
|
myImageableWidthLabel.setText("Format ImageableWidth = "
|
|
+ drnd(myPageFormat.getImageableWidth()));
|
|
myImageableYLabel.setText("Format Top Margin = "
|
|
+ drnd(myPageFormat.getImageableY()));
|
|
myImageableBottomLabel.setText("Format Bottom Margin = "
|
|
+ drnd(myPageFormat.getHeight()
|
|
- (myPageFormat.getImageableY() + myPageFormat.getImageableHeight())));
|
|
myImageableHeightLabel.setText("Format ImageableHeight = "
|
|
+ drnd(myPageFormat.getImageableHeight()));
|
|
myOrientationLabel.setText("Format Orientation = "
|
|
+ getOrientation(myPageFormat.getOrientation()));
|
|
Paper p = myPageFormat.getPaper();
|
|
pw.setText("Paper Width = " + drnd(p.getWidth()));
|
|
ph.setText("Paper Height = " + drnd(p.getHeight()));
|
|
pglm.setText("Paper Left Margin = " + drnd(p.getImageableX()));
|
|
pgiw.setText("Paper Imageable Width = " + drnd(p.getImageableWidth()));
|
|
pgih.setText("Paper Imageable Height = " + drnd(p.getImageableHeight()));
|
|
|
|
pgrm.setText("Paper Right Margin = "
|
|
+ drnd(p.getWidth()
|
|
- (p.getImageableX() + p.getImageableWidth())));
|
|
pgtm.setText("Paper Top Margin = " + drnd(p.getImageableY()));
|
|
pgbm.setText("Paper Bottom Margin = "
|
|
+ drnd(p.getHeight()
|
|
- (p.getImageableY() + p.getImageableHeight())));
|
|
}
|
|
|
|
static String drnd(double d) {
|
|
return String.format("%.2f", d);
|
|
}
|
|
|
|
public ValidatePage() {
|
|
super("Validate Page Test");
|
|
myPrinterJob = PrinterJob.getPrinterJob();
|
|
myPageFormat = new PageFormat();
|
|
Paper p = new Paper();
|
|
p.setSize(28 * 72, 21.5 * 72);
|
|
myPageFormat.setPaper(p);
|
|
setLayout(new FlowLayout());
|
|
Panel pfp = new Panel();
|
|
pfp.setLayout(new GridLayout(9, 1, 0, 0));
|
|
pfp.add(myOrientationLabel = new Label());
|
|
pfp.add(myWidthLabel = new Label());
|
|
pfp.add(myImageableXLabel = new Label());
|
|
pfp.add(myImageableRightLabel = new Label());
|
|
pfp.add(myImageableWidthLabel = new Label());
|
|
pfp.add(myHeightLabel = new Label());
|
|
pfp.add(myImageableYLabel = new Label());
|
|
pfp.add(myImageableBottomLabel = new Label());
|
|
pfp.add(myImageableHeightLabel = new Label());
|
|
|
|
add(pfp);
|
|
|
|
Panel pp = new Panel();
|
|
pp.setLayout(new GridLayout(8, 1, 0, 0));
|
|
pp.add(pw = new Label());
|
|
pp.add(pglm = new Label());
|
|
pp.add(pgtm = new Label());
|
|
pp.add(ph = new Label());
|
|
pp.add(pgiw = new Label());
|
|
pp.add(pgih = new Label());
|
|
pp.add(pgrm = new Label());
|
|
pp.add(pgbm = new Label());
|
|
|
|
add(pp);
|
|
|
|
Panel epp = new Panel();
|
|
epp.setLayout(new GridLayout(6, 2, 0, 0));
|
|
|
|
epp.add(new Label("Page width:"));
|
|
epp.add(tpw = new TextField());
|
|
epp.add(new Label("Page height:"));
|
|
epp.add(tph = new TextField());
|
|
epp.add(new Label("Left Margin:"));
|
|
epp.add(tpglm = new TextField());
|
|
epp.add(new Label("Top margin:"));
|
|
epp.add(tpgtm = new TextField());
|
|
epp.add(new Label("Imageable Wid:"));
|
|
epp.add(tpgiw = new TextField());
|
|
epp.add(new Label("Imageable Hgt:"));
|
|
epp.add(tpgih = new TextField());
|
|
|
|
add(epp);
|
|
displayPageFormatAttributes();
|
|
|
|
Panel panel = new Panel();
|
|
Button defButton = new Button("Default Page");
|
|
defButton.addActionListener(e -> {
|
|
myPageFormat = myPrinterJob.defaultPage();
|
|
displayPageFormatAttributes();
|
|
});
|
|
|
|
Button pageButton = new Button("Page Setup...");
|
|
pageButton.addActionListener(e -> {
|
|
myPageFormat = myPrinterJob.pageDialog(myPageFormat);
|
|
displayPageFormatAttributes();
|
|
});
|
|
Button printButton = new Button("Print");
|
|
printButton.addActionListener(e -> {
|
|
try {
|
|
myPrinterJob.setPrintable(ValidatePage.this, myPageFormat);
|
|
myPrinterJob.print();
|
|
} catch (PrinterException pe) {
|
|
pe.printStackTrace();
|
|
PassFailJFrame.forceFail("Test failed because of PrinterException");
|
|
}
|
|
});
|
|
|
|
Button chooseButton = new Button("Printer...");
|
|
chooseButton.addActionListener(e -> myPrinterJob.printDialog());
|
|
|
|
Button validateButton = new Button("Validate Page");
|
|
validateButton.addActionListener(e -> {
|
|
myPageFormat = myPrinterJob.validatePage(myPageFormat);
|
|
displayPageFormatAttributes();
|
|
});
|
|
Button setButton = new Button("Set Paper");
|
|
setButton.addActionListener(e -> {
|
|
try {
|
|
Paper p1 = new Paper();
|
|
double pwid = Double.parseDouble(tpw.getText());
|
|
double phgt = Double.parseDouble(tph.getText());
|
|
double pimx = Double.parseDouble(tpglm.getText());
|
|
double pimy = Double.parseDouble(tpgtm.getText());
|
|
double pimwid = Double.parseDouble(tpgiw.getText());
|
|
double pimhgt = Double.parseDouble(tpgih.getText());
|
|
p1.setSize(pwid, phgt);
|
|
p1.setImageableArea(pimx, pimy, pimwid, pimhgt);
|
|
myPageFormat.setPaper(p1);
|
|
displayPageFormatAttributes();
|
|
} catch (NumberFormatException nfe) {
|
|
JOptionPane.showMessageDialog(ValidatePage.this,
|
|
"NumberFormatException occurred", "Error",
|
|
JOptionPane.ERROR_MESSAGE);
|
|
}
|
|
});
|
|
panel.add(setButton);
|
|
panel.add(defButton);
|
|
panel.add(pageButton);
|
|
panel.add(chooseButton);
|
|
panel.add(validateButton);
|
|
panel.add(printButton);
|
|
add(panel);
|
|
TextArea ta = new TextArea(10, 45);
|
|
ta.setText(
|
|
"When validating a page, the process is 1st to find the closest matching \n" +
|
|
"paper size, next to make sure the requested imageable area fits within \n" +
|
|
"the printer's imageable area for that paper size. Finally the top and \n" +
|
|
"left margins will be shrunk if they are too great for the adjusted \n" +
|
|
"imageable area to fit at that position. They will shrink by the minimum\n" +
|
|
"needed to accommodate the imageable area.\n \n \n" +
|
|
"To test 6229507, put the minimum margins (all 0s) in Page Setup dialog.\n" +
|
|
"Compare Imageable width, height, and margins of portrait against landscape.");
|
|
|
|
ta.setEditable(false);
|
|
add(ta);
|
|
setSize(700, 500);
|
|
}
|
|
|
|
@Override
|
|
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
|
|
if (pageIndex > 0) {
|
|
return Printable.NO_SUCH_PAGE;
|
|
}
|
|
|
|
System.out.println("Format Orientation = "
|
|
+ getOrientation(pageFormat.getOrientation()));
|
|
|
|
Graphics2D g2d = (Graphics2D) graphics;
|
|
|
|
System.out.println(g2d.getTransform());
|
|
System.out.println("ix=" + pageFormat.getImageableX() +
|
|
" iy=" + pageFormat.getImageableY());
|
|
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
|
|
g2d.drawString("ORIGIN", 20, 20);
|
|
g2d.drawString("X THIS WAY", 200, 50);
|
|
g2d.drawString("Y THIS WAY", 60, 200);
|
|
g2d.drawRect(0, 0,
|
|
(int) pageFormat.getImageableWidth(),
|
|
(int) pageFormat.getImageableHeight());
|
|
g2d.setColor(Color.blue);
|
|
g2d.drawRect(1, 1,
|
|
(int) pageFormat.getImageableWidth() - 2,
|
|
(int) pageFormat.getImageableHeight() - 2);
|
|
|
|
return Printable.PAGE_EXISTS;
|
|
}
|
|
|
|
private static final String INSTRUCTIONS =
|
|
"This test is very flexible and requires much interaction.\n" +
|
|
"There are several buttons.\n\n" +
|
|
"Set Paper: if all fields are valid numbers it sets the Paper object.\n" +
|
|
"This is used to create arbitrary nonsensical paper sizes to help\n" +
|
|
"test validatePage.\n\n" +
|
|
"Default Page: sets a default page. This should always be valid.\n\n" +
|
|
"Page Setup: brings up the page dialog. You must OK this dialog\n" +
|
|
"for it to have any effect. You can use this to set different size,\n" +
|
|
"orientation and margins - which of course affect imageable area.\n\n" +
|
|
"Printer: Used to set the current printer. Useful because current\n" +
|
|
"printer affects the choice of paper sizes available.\n" +
|
|
"You must OK this dialog for it to have any effect.\n\n" +
|
|
"Validate Page:The most important button in the test.\n" +
|
|
"By setting nonsensical or valid papers with varying margins etc,\n" +
|
|
"this should always find the closest match within the limits of\n" +
|
|
"what is possible on the current printer.\n\n" +
|
|
"Print: to the current printer. Not vital for this test request.";
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
if (PrinterJob.lookupPrintServices().length == 0) {
|
|
throw new RuntimeException("Printer not configured or available.");
|
|
}
|
|
|
|
PassFailJFrame.builder()
|
|
.instructions(INSTRUCTIONS)
|
|
.testTimeOut(10)
|
|
.testUI(ValidatePage::new)
|
|
.rows((int) INSTRUCTIONS.lines().count() + 1)
|
|
.columns(45)
|
|
.build()
|
|
.awaitAndCheck();
|
|
}
|
|
}
|