8320676: Manual printer tests have no Pass/Fail buttons, instructions close set 1

Reviewed-by: honkar, achung, aivanov
This commit is contained in:
Renjith Kannath Pariyangad 2024-04-02 13:22:17 +00:00 committed by Alexey Ivanov
parent 5ac067f6d6
commit 7eb78e3320
5 changed files with 690 additions and 1266 deletions
test/jdk/java/awt/print

@ -1,5 +1,5 @@
/*
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
* 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
@ -21,333 +21,224 @@
* questions.
*/
/**
import java.awt.Button;
import java.awt.Checkbox;
import java.awt.Color;
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.event.ItemEvent;
import java.awt.event.ItemListener;
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;
/*
* @test
* @bug 4197377
* @bug 4299145
* @bug 6358747
* @bug 6574633
* @summary Page setup dialog settings
* @bug 4197377 4299145 6358747 6574633
* @key printer
* @summary Page setup dialog settings
* @library /java/awt/regtesthelpers
* @build PassFailJFrame
* @run main/manual PageSetupDialog
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
public class PageSetupDialog extends Frame implements Printable {
PrinterJob myPrinterJob;
PageFormat myPageFormat;
Label pw, ph, pglm, pgiw, pgrm, pgtm, pgih, pgbm;
Label myWidthLabel;
Label myHeightLabel;
Label myImageableXLabel;
Label myImageableYLabel;
Label myImageableRightLabel;
Label myImageableBottomLabel;
Label myImageableWidthLabel;
Label myImageableHeightLabel;
Label myOrientationLabel;
Checkbox reverseCB;
boolean alpha = false;
boolean reverse = false;
PrinterJob myPrinterJob;
PageFormat myPageFormat;
Label pw, ph, pglm, pgiw, pgrm, pgtm, pgih, pgbm;
Label myWidthLabel;
Label myHeightLabel;
Label myImageableXLabel;
Label myImageableYLabel;
Label myImageableRightLabel;
Label myImageableBottomLabel;
Label myImageableWidthLabel;
Label myImageableHeightLabel;
Label myOrientationLabel;
Checkbox reverseCB;
boolean alpha = false;
boolean reverse = false;
private static final String INSTRUCTIONS =
" This test is very flexible and requires much interaction.\n" +
" If the platform print dialog supports it, adjust orientation\n" +
" and margins and print pages and compare the results with the request.";
protected void displayPageFormatAttributes() {
myWidthLabel.setText("Format Width = " + (float)myPageFormat.getWidth());
myHeightLabel.setText("Format Height = " + (float)myPageFormat.getHeight());
myImageableXLabel.setText
("Format Left Margin = " + (float)myPageFormat.getImageableX());
myImageableRightLabel.setText
("Format Right Margin = " + (float)(myPageFormat.getWidth() -
(myPageFormat.getImageableX() + myPageFormat.getImageableWidth())));
myImageableWidthLabel.setText
("Format ImageableWidth = " + (float)myPageFormat.getImageableWidth());
myImageableYLabel.setText
("Format Top Margin = " + (float)myPageFormat.getImageableY());
myImageableBottomLabel.setText
("Format Bottom Margin = " + (float)(myPageFormat.getHeight() -
(myPageFormat.getImageableY() + myPageFormat.getImageableHeight())));
myImageableHeightLabel.setText
("Format ImageableHeight = " + (float)myPageFormat.getImageableHeight());
int o = myPageFormat.getOrientation();
if (o == PageFormat.LANDSCAPE && reverse) {
o = PageFormat.REVERSE_LANDSCAPE;
myPageFormat.setOrientation(PageFormat.REVERSE_LANDSCAPE);
} else if (o == PageFormat.REVERSE_LANDSCAPE && !reverse) {
o = PageFormat.LANDSCAPE;
myPageFormat.setOrientation(PageFormat.LANDSCAPE);
protected void displayPageFormatAttributes() {
myWidthLabel.setText("Format Width = " + myPageFormat.getWidth());
myHeightLabel.setText("Format Height = " + myPageFormat.getHeight());
myImageableXLabel.setText("Format Left Margin = "
+ myPageFormat.getImageableX());
myImageableRightLabel.setText("Format Right Margin = "
+ (myPageFormat.getWidth()
- (myPageFormat.getImageableX() + myPageFormat.getImageableWidth())));
myImageableWidthLabel.setText("Format ImageableWidth = "
+ myPageFormat.getImageableWidth());
myImageableYLabel.setText("Format Top Margin = "
+ myPageFormat.getImageableY());
myImageableBottomLabel.setText("Format Bottom Margin = "
+ (myPageFormat.getHeight()
- (myPageFormat.getImageableY() + myPageFormat.getImageableHeight())));
myImageableHeightLabel.setText("Format ImageableHeight = "
+ myPageFormat.getImageableHeight());
int o = myPageFormat.getOrientation();
if (o == PageFormat.LANDSCAPE && reverse) {
o = PageFormat.REVERSE_LANDSCAPE;
myPageFormat.setOrientation(PageFormat.REVERSE_LANDSCAPE);
} else if (o == PageFormat.REVERSE_LANDSCAPE && !reverse) {
o = PageFormat.LANDSCAPE;
myPageFormat.setOrientation(PageFormat.LANDSCAPE);
}
myOrientationLabel.setText
("Format Orientation = " +
(switch (o) {
case PageFormat.PORTRAIT -> "PORTRAIT";
case PageFormat.LANDSCAPE -> "LANDSCAPE";
case PageFormat.REVERSE_LANDSCAPE -> "REVERSE_LANDSCAPE";
default -> "<invalid>";
}));
Paper p = myPageFormat.getPaper();
pw.setText("Paper Width = " + p.getWidth());
ph.setText("Paper Height = " + p.getHeight());
pglm.setText("Paper Left Margin = " + p.getImageableX());
pgiw.setText("Paper Imageable Width = " + p.getImageableWidth());
pgrm.setText("Paper Right Margin = "
+ (p.getWidth()
- (p.getImageableX() + p.getImageableWidth())));
pgtm.setText("Paper Top Margin = " + p.getImageableY());
pgih.setText("Paper Imageable Height = " + p.getImageableHeight());
pgbm.setText("Paper Bottom Margin = "
+ (p.getHeight()
- (p.getImageableY() + p.getImageableHeight())));
}
myOrientationLabel.setText
("Format Orientation = " +
(o == PageFormat.PORTRAIT ? "PORTRAIT" :
o == PageFormat.LANDSCAPE ? "LANDSCAPE" :
o == PageFormat.REVERSE_LANDSCAPE ? "REVERSE_LANDSCAPE" :
"<invalid>"));
Paper p = myPageFormat.getPaper();
pw.setText("Paper Width = " + (float)p.getWidth());
ph.setText("Paper Height = " + (float)p.getHeight());
pglm.setText("Paper Left Margin = " + (float)p.getImageableX());
pgiw.setText("Paper Imageable Width = " + (float)p.getImageableWidth());
pgrm.setText("Paper Right Margin = " +
(float)(p.getWidth() - (p.getImageableX()+p.getImageableWidth())));
pgtm.setText("Paper Top Margin = " + (float)p.getImageableY());
pgih.setText("Paper Imageable Height = " + (float)p.getImageableHeight());
pgbm.setText("Paper Bottom Margin = " +
(float)(p.getHeight() - (p.getImageableY()+p.getImageableHeight())));
}
public PageSetupDialog() {
super ("Page Dialog Test");
myPrinterJob = PrinterJob.getPrinterJob();
myPageFormat = new PageFormat();
Paper p = new Paper();
double margin = 1.5*72;
p.setImageableArea(margin, margin,
p.getWidth()-2*margin, p.getHeight()-2*margin);
myPageFormat.setPaper(p);
Panel c = new Panel();
c.setLayout (new GridLayout (9, 2, 0, 0));
c.add (reverseCB = new Checkbox("reverse if landscape"));
c.add (myOrientationLabel = new Label());
c.add (myWidthLabel = new Label());
c.add (pw = new Label());
c.add (myImageableXLabel = new Label());
c.add (pglm = new Label());
c.add (myImageableRightLabel = new Label());
c.add (pgrm = new Label());
c.add (myImageableWidthLabel = new Label());
c.add (pgiw = new Label());
c.add (myHeightLabel = new Label());
c.add (ph = new Label());
c.add (myImageableYLabel = new Label());
c.add (pgtm = new Label());
c.add (myImageableHeightLabel = new Label());
c.add (pgih = new Label());
c.add (myImageableBottomLabel = new Label());
c.add (pgbm = new Label());
public PageSetupDialog() {
super("Page Dialog Test");
myPrinterJob = PrinterJob.getPrinterJob();
myPageFormat = new PageFormat();
Paper p = new Paper();
double margin = 1.5 * 72;
p.setImageableArea(margin, margin,
p.getWidth() - 2 * margin, p.getHeight() - 2 * margin);
myPageFormat.setPaper(p);
Panel c = new Panel();
c.setLayout(new GridLayout(9, 2, 0, 0));
c.add(reverseCB = new Checkbox("reverse if landscape"));
c.add(myOrientationLabel = new Label());
c.add(myWidthLabel = new Label());
c.add(pw = new Label());
c.add(myImageableXLabel = new Label());
c.add(pglm = new Label());
c.add(myImageableRightLabel = new Label());
c.add(pgrm = new Label());
c.add(myImageableWidthLabel = new Label());
c.add(pgiw = new Label());
c.add(myHeightLabel = new Label());
c.add(ph = new Label());
c.add(myImageableYLabel = new Label());
c.add(pgtm = new Label());
c.add(myImageableHeightLabel = new Label());
c.add(pgih = new Label());
c.add(myImageableBottomLabel = new Label());
c.add(pgbm = new Label());
reverseCB.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
reverse = e.getStateChange() == ItemEvent.SELECTED;
int o = myPageFormat.getOrientation();
if (o == PageFormat.LANDSCAPE ||
o == PageFormat.REVERSE_LANDSCAPE) {
displayPageFormatAttributes();
}
reverseCB.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
reverse = e.getStateChange() == ItemEvent.SELECTED;
int o = myPageFormat.getOrientation();
if (o == PageFormat.LANDSCAPE ||
o == PageFormat.REVERSE_LANDSCAPE) {
displayPageFormatAttributes();
}
});
}
});
add("Center", c);
displayPageFormatAttributes();
Panel panel = new Panel();
Button pageButton = new Button ("Page Setup...");
pageButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
myPageFormat = myPrinterJob.pageDialog (myPageFormat);
displayPageFormatAttributes();
add("Center", c);
displayPageFormatAttributes();
Panel panel = new Panel();
Button pageButton = new Button("Page Setup...");
pageButton.addActionListener(e -> {
myPageFormat = myPrinterJob.pageDialog(myPageFormat);
displayPageFormatAttributes();
});
Button printButton = new Button("Print ...");
printButton.addActionListener(e -> {
if (myPrinterJob.printDialog()) {
myPrinterJob.setPrintable(PageSetupDialog.this, myPageFormat);
alpha = false;
try {
myPrinterJob.print();
} catch (PrinterException pe) {
pe.printStackTrace();
PassFailJFrame.forceFail("Test failed because of PrinterException");
}
});
Button printButton = new Button ("Print ...");
printButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
try {
if (myPrinterJob.printDialog()) {
myPrinterJob.setPrintable(PageSetupDialog.this,
myPageFormat);
alpha = false;
myPrinterJob.print();
}
} catch (PrinterException pe ) {
}
}
});
Button printAlphaButton = new Button("Print w/Alpha...");
printAlphaButton.addActionListener(e -> {
if (myPrinterJob.printDialog()) {
myPrinterJob.setPrintable(PageSetupDialog.this, myPageFormat);
alpha = true;
try {
myPrinterJob.print();
} catch (PrinterException pe) {
pe.printStackTrace();
PassFailJFrame.forceFail("Test failed because of PrinterException");
}
});
Button printAlphaButton = new Button ("Print w/Alpha...");
printAlphaButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
try {
if (myPrinterJob.printDialog()) {
myPrinterJob.setPrintable(PageSetupDialog.this,
myPageFormat);
alpha = true;
myPrinterJob.print();
}
} catch (PrinterException pe ) {
}
}
});
panel.add (pageButton);
panel.add (printButton);
panel.add (printAlphaButton);
add("South", panel);
addWindowListener (new WindowAdapter() {
public void windowClosing (WindowEvent e) {
dispose();
System.exit (0);
}
}
});
panel.add(pageButton);
panel.add(printButton);
panel.add(printAlphaButton);
add("South", panel);
pack();
}
});
//setSize (280, 550);
pack();
setVisible (true);
}
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
if (pageIndex > 0) {
return Printable.NO_SUCH_PAGE;
}
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
Graphics2D g2d = (Graphics2D) graphics;
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
g2d.drawString("ORIGIN(" + pageFormat.getImageableX() + "," +
pageFormat.getImageableY() + ")", 20, 20);
g2d.drawString("X THIS WAY", 200, 50);
g2d.drawString("Y THIS WAY", 60, 200);
g2d.drawString("Graphics is " + g2d.getClass().getName(), 100, 100);
g2d.drawRect(0, 0,
(int) pageFormat.getImageableWidth(),
(int) pageFormat.getImageableHeight());
if (alpha) {
g2d.setColor(new Color(0, 0, 255, 192));
} else {
g2d.setColor(Color.blue);
}
g2d.drawRect(1, 1,
(int) pageFormat.getImageableWidth() - 2,
(int) pageFormat.getImageableHeight() - 2);
if (pageIndex > 0) {
return Printable.NO_SUCH_PAGE;
}
return Printable.PAGE_EXISTS;
}
Graphics2D g2d = (Graphics2D)graphics;
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
g2d.drawString("ORIGIN("+pageFormat.getImageableX()+","+
pageFormat.getImageableY()+")", 20, 20);
g2d.drawString("X THIS WAY", 200, 50);
g2d.drawString("Y THIS WAY", 60 , 200);
g2d.drawString("Graphics is " + g2d.getClass().getName(), 100, 100);
g2d.drawRect(0,0,(int)pageFormat.getImageableWidth(),
(int)pageFormat.getImageableHeight());
if (alpha) {
g2d.setColor(new Color(0,0,255,192));
} else {
g2d.setColor(Color.blue);
}
g2d.drawRect(1,1,(int)pageFormat.getImageableWidth()-2,
(int)pageFormat.getImageableHeight()-2);
return Printable.PAGE_EXISTS;
}
public static void main( String[] args) {
String[] instructions =
{
"You must have a printer available to perform this test",
"This test is very flexible and requires much interaction.",
"If the platform print dialog supports it, adjust orientation",
"and margins and print pages and compare the results with the",
"request."
};
Sysout.createDialog( );
Sysout.printInstructions( instructions );
new PageSetupDialog();
}
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(PageSetupDialog::new)
.rows((int) INSTRUCTIONS.lines().count() + 1)
.columns(45)
.build()
.awaitAndCheck();
}
}
class Sysout {
private static TestDialog dialog;
public static void createDialogWithInstructions( String[] instructions )
{
dialog = new TestDialog( new Frame(), "Instructions" );
dialog.printInstructions( instructions );
dialog.show();
println( "Any messages for the tester will display here." );
}
public static void createDialog( )
{
dialog = new TestDialog( new Frame(), "Instructions" );
String[] defInstr = { "Instructions will appear here. ", "" } ;
dialog.printInstructions( defInstr );
dialog.show();
println( "Any messages for the tester will display here." );
}
public static void printInstructions( String[] instructions )
{
dialog.printInstructions( instructions );
}
public static void println( String messageIn )
{
dialog.displayMessage( messageIn );
}
}// Sysout class
/**
This is part of the standard test machinery. It provides a place for the
test instructions to be displayed, and a place for interactive messages
to the user to be displayed.
To have the test instructions displayed, see Sysout.
To have a message to the user be displayed, see Sysout.
Do not call anything in this dialog directly.
*/
class TestDialog extends Dialog {
TextArea instructionsText;
TextArea messageText;
int maxStringLength = 80;
//DO NOT call this directly, go through Sysout
public TestDialog( Frame frame, String name )
{
super( frame, name );
int scrollBoth = TextArea.SCROLLBARS_BOTH;
instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
add( "North", instructionsText );
messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
add("Center", messageText);
pack();
show();
}// TestDialog()
//DO NOT call this directly, go through Sysout
public void printInstructions( String[] instructions )
{
//Clear out any current instructions
instructionsText.setText( "" );
//Go down array of instruction strings
String printStr, remainingStr;
for( int i=0; i < instructions.length; i++ )
{
//chop up each into pieces maxSringLength long
remainingStr = instructions[ i ];
while( remainingStr.length() > 0 )
{
//if longer than max then chop off first max chars to print
if( remainingStr.length() >= maxStringLength )
{
//Try to chop on a word boundary
int posOfSpace = remainingStr.
lastIndexOf( ' ', maxStringLength - 1 );
if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
printStr = remainingStr.substring( 0, posOfSpace + 1 );
remainingStr = remainingStr.substring( posOfSpace + 1 );
}
//else just print
else
{
printStr = remainingStr;
remainingStr = "";
}
instructionsText.append( printStr + "\n" );
}// while
}// for
}//printInstructions()
//DO NOT call this directly, go through Sysout
public void displayMessage( String messageIn )
{
messageText.append( messageIn + "\n" );
}
}// TestDialog class

@ -1,5 +1,5 @@
/*
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
* 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
@ -21,218 +21,98 @@
* questions.
*/
/**
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterAbortException;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
/*
* @test
* @bug 4245280
* @summary PrinterJob not cancelled when PrinterJob.cancel() is used
* @key printer
* @summary PrinterJob not cancelled when PrinterJob.cancel() is used
* @library /java/awt/regtesthelpers
* @build PassFailJFrame
* @run main/manual PrinterJobCancel
*/
import java.awt.* ;
import java.awt.print.* ;
public class PrinterJobCancel extends Thread implements Printable {
private final PrinterJob pj;
private final boolean okayed;
private static final String INSTRUCTIONS =
"Test that print job cancellation works.\n\n" +
"This test starts after clicking OK / Print button.\n" +
"While the print job is in progress, the test automatically cancels it.\n" +
"The test will complete automatically.";
PrinterJob pj ;
boolean okayed;
public static void main(String[] args) throws Exception {
if (PrinterJob.lookupPrintServices().length == 0) {
throw new RuntimeException("Printer not configured or available.");
}
public static void main ( String args[] ) {
PassFailJFrame passFailJFrame = PassFailJFrame.builder()
.instructions(INSTRUCTIONS)
.rows((int) INSTRUCTIONS.lines().count() + 1)
.columns(45)
.build();
String[] instructions =
{
"Test that print job cancellation works.",
"You must have a printer available to perform this test.",
"This test silently starts a print job and while the job is",
"still being printed, cancels the print job",
"You should see a message on System.out that the job",
"was properly cancelled.",
"You will need to kill the application manually since regression",
"tests apparently aren't supposed to call System.exit()"
};
Sysout.createDialog( );
Sysout.printInstructions( instructions );
PrinterJobCancel pjc = new PrinterJobCancel() ;
if (pjc.okayed) {
pjc.start();
try {
Thread.sleep(5000);
pjc.pj.cancel();
} catch ( InterruptedException e ) {
}
}
}
public PrinterJobCancel() {
pj = PrinterJob.getPrinterJob() ;
pj.setPrintable(this);
okayed = pj.printDialog();
}
public void run() {
boolean cancelWorked = false;
try {
pj.print() ;
PrinterJobCancel pjc = new PrinterJobCancel();
if (pjc.okayed) {
pjc.start();
Thread.sleep(5000);
pjc.pj.cancel();
} else {
PassFailJFrame.forceFail("User cancelled printing");
}
passFailJFrame.awaitAndCheck();
}
catch ( PrinterAbortException paex ) {
cancelWorked = true;
System.out.println("Job was properly cancelled and we");
System.out.println("got the expected PrintAbortException");
public PrinterJobCancel() {
pj = PrinterJob.getPrinterJob();
pj.setPrintable(this);
okayed = pj.printDialog();
}
catch ( PrinterException prex ) {
System.out.println("This is wrong .. we shouldn't be here");
System.out.println("Looks like a test failure");
prex.printStackTrace() ;
//throw prex;
public void run() {
boolean cancelWorked = false;
try {
pj.print();
} catch (PrinterAbortException paex) {
cancelWorked = true;
System.out.println("Job was properly cancelled and we");
System.out.println("got the expected PrintAbortException");
PassFailJFrame.forcePass();
} catch (PrinterException prex) {
prex.printStackTrace();
PassFailJFrame.forceFail("Unexpected PrinterException caught:" + prex.getMessage());
} finally {
System.out.println("DONE PRINTING");
if (!cancelWorked) {
PassFailJFrame.forceFail("Didn't get the expected PrintAbortException");
}
}
}
finally {
System.out.println("DONE PRINTING");
if (!cancelWorked) {
System.out.println("Looks like the test failed - we didn't get");
System.out.println("the expected PrintAbortException ");
}
@Override
public int print(Graphics g, PageFormat pagef, int pidx) {
if (pidx > 5) {
return (Printable.NO_SUCH_PAGE);
}
Graphics2D g2d = (Graphics2D) g;
g2d.translate(pagef.getImageableX(), pagef.getImageableY());
g2d.setColor(Color.black);
g2d.drawString(("This is page" + (pidx + 1)), 60, 80);
// Need to slow things down a bit .. important not to try this
// on the event dispatching thread of course.
try {
Thread.sleep(2000);
} catch (InterruptedException ignored) {
}
return Printable.PAGE_EXISTS;
}
//System.exit(0);
}
public int print(Graphics g, PageFormat pagef, int pidx) {
if (pidx > 5) {
return( Printable.NO_SUCH_PAGE ) ;
}
Graphics2D g2d = (Graphics2D)g;
g2d.translate(pagef.getImageableX(), pagef.getImageableY());
g2d.setColor(Color.black);
g2d.drawString(("This is page"+(pidx+1)), 60 , 80);
// Need to slow things down a bit .. important not to try this
// on the event dispathching thread of course.
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
return ( Printable.PAGE_EXISTS );
}
}
class Sysout {
private static TestDialog dialog;
public static void createDialogWithInstructions( String[] instructions )
{
dialog = new TestDialog( new Frame(), "Instructions" );
dialog.printInstructions( instructions );
dialog.show();
println( "Any messages for the tester will display here." );
}
public static void createDialog( )
{
dialog = new TestDialog( new Frame(), "Instructions" );
String[] defInstr = { "Instructions will appear here. ", "" } ;
dialog.printInstructions( defInstr );
dialog.show();
println( "Any messages for the tester will display here." );
}
public static void printInstructions( String[] instructions )
{
dialog.printInstructions( instructions );
}
public static void println( String messageIn )
{
dialog.displayMessage( messageIn );
}
}// Sysout class
/**
This is part of the standard test machinery. It provides a place for the
test instructions to be displayed, and a place for interactive messages
to the user to be displayed.
To have the test instructions displayed, see Sysout.
To have a message to the user be displayed, see Sysout.
Do not call anything in this dialog directly.
*/
class TestDialog extends Dialog {
TextArea instructionsText;
TextArea messageText;
int maxStringLength = 80;
//DO NOT call this directly, go through Sysout
public TestDialog( Frame frame, String name )
{
super( frame, name );
int scrollBoth = TextArea.SCROLLBARS_BOTH;
instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
add( "North", instructionsText );
messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
add("Center", messageText);
pack();
show();
}// TestDialog()
//DO NOT call this directly, go through Sysout
public void printInstructions( String[] instructions )
{
//Clear out any current instructions
instructionsText.setText( "" );
//Go down array of instruction strings
String printStr, remainingStr;
for( int i=0; i < instructions.length; i++ )
{
//chop up each into pieces maxSringLength long
remainingStr = instructions[ i ];
while( remainingStr.length() > 0 )
{
//if longer than max then chop off first max chars to print
if( remainingStr.length() >= maxStringLength )
{
//Try to chop on a word boundary
int posOfSpace = remainingStr.
lastIndexOf( ' ', maxStringLength - 1 );
if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
printStr = remainingStr.substring( 0, posOfSpace + 1 );
remainingStr = remainingStr.substring( posOfSpace + 1 );
}
//else just print
else
{
printStr = remainingStr;
remainingStr = "";
}
instructionsText.append( printStr + "\n" );
}// while
}// for
}//printInstructions()
//DO NOT call this directly, go through Sysout
public void displayMessage( String messageIn )
{
messageText.append( messageIn + "\n" );
}
}// TestDialog class

@ -1,5 +1,5 @@
/*
* Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
* 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
@ -21,55 +21,63 @@
* questions.
*/
/**
*
* test
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterJob;
/*
* @test
* @bug 4884389 7183516
* @key printer
* @library /java/awt/regtesthelpers
* @build PassFailJFrame
* @summary Font specified with face name loses style on printing
* @run main/manual PrintAllFonts
*/
import java.awt.*;
import java.awt.print.*;
import java.awt.GraphicsEnvironment;
public class PrintAllFonts implements Printable {
private static final int LINE_HEIGHT = 18;
private static final int FONT_SIZE = 14;
static Font[] allFonts;
int fontNum = 0;
int startNum = 0;
int lineHeight = 18;
boolean done = false;
int thisPage = 0;
private final Font[] allFonts =
GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
private int fontNum = 0;
private int startNum = 0;
private int thisPage = 0;
private static final String INSTRUCTIONS =
"This bug is system dependent and is not always reproducible.\n" +
"Font names will be printed in two columns.\n" +
"First column non synthesised and second column with synthesised italic.\n" +
"A passing test will have all text printed with correct font style.";
public static void main(String[] args) throws Exception {
if (PrinterJob.lookupPrintServices().length == 0) {
throw new RuntimeException("Printer not configured or available.");
}
String[] instructions =
{
"You must have a printer available to perform this test and should use Win 98.",
"This bug is system dependent and is not always reproducible.",
" ",
"A passing test will have all text printed with correct font style.",
};
Sysout.createDialog( );
Sysout.printInstructions( instructions );
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
allFonts = ge.getAllFonts();
PassFailJFrame passFailJFrame = PassFailJFrame.builder()
.instructions(INSTRUCTIONS)
.testTimeOut(10)
.rows((int) INSTRUCTIONS.lines().count() + 1)
.columns(45)
.build();
PrinterJob pj = PrinterJob.getPrinterJob();
pj.setPrintable(new PrintAllFonts());
if (pj.printDialog()) {
pj.print();
pj.print();
} else {
PassFailJFrame.forceFail("User cancelled printing");
}
passFailJFrame.awaitAndCheck();
}
@Override
public int print(Graphics g, PageFormat pf, int pageIndex) {
if (fontNum >= allFonts.length && pageIndex > thisPage) {
return NO_SUCH_PAGE;
}
@ -79,18 +87,20 @@ public class PrintAllFonts implements Printable {
} else {
fontNum = startNum;
}
int fontsPerPage = (int) pf.getImageableHeight() / LINE_HEIGHT - 1;
int x = (int) pf.getImageableX() + 10;
int y = (int) pf.getImageableY() + LINE_HEIGHT;
g.setColor(Color.black);
int hgt = (int)pf.getImageableHeight();
int fontsPerPage = hgt/lineHeight;
int x = (int)pf.getImageableX()+10;
int y = (int)pf.getImageableY()+lineHeight;
for (int n = 0; n < fontsPerPage; n++) {
Font f = allFonts[fontNum].deriveFont(Font.PLAIN, 16);
Font f = allFonts[fontNum].deriveFont(Font.PLAIN, FONT_SIZE);
Font fi = allFonts[fontNum].deriveFont(Font.ITALIC, FONT_SIZE);
g.setFont(f);
g.drawString(f.getFontName(), x, y);
y+= lineHeight;
g.setFont(fi);
g.drawString(f.getFontName(), (int) (x + pf.getImageableWidth() / 2), y);
y += LINE_HEIGHT;
fontNum++;
if (fontNum >= allFonts.length) {
break;
@ -99,117 +109,3 @@ public class PrintAllFonts implements Printable {
return PAGE_EXISTS;
}
}
class Sysout {
private static TestDialog dialog;
public static void createDialogWithInstructions( String[] instructions )
{
dialog = new TestDialog( new Frame(), "Instructions" );
dialog.printInstructions( instructions );
dialog.show();
println( "Any messages for the tester will display here." );
}
public static void createDialog( )
{
dialog = new TestDialog( new Frame(), "Instructions" );
String[] defInstr = { "Instructions will appear here. ", "" } ;
dialog.printInstructions( defInstr );
dialog.show();
println( "Any messages for the tester will display here." );
}
public static void printInstructions( String[] instructions )
{
dialog.printInstructions( instructions );
}
public static void println( String messageIn )
{
dialog.displayMessage( messageIn );
}
}// Sysout class
/**
This is part of the standard test machinery. It provides a place for the
test instructions to be displayed, and a place for interactive messages
to the user to be displayed.
To have the test instructions displayed, see Sysout.
To have a message to the user be displayed, see Sysout.
Do not call anything in this dialog directly.
*/
class TestDialog extends Dialog {
TextArea instructionsText;
TextArea messageText;
int maxStringLength = 80;
//DO NOT call this directly, go through Sysout
public TestDialog( Frame frame, String name )
{
super( frame, name );
int scrollBoth = TextArea.SCROLLBARS_BOTH;
instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
add( "North", instructionsText );
messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
add("Center", messageText);
pack();
show();
}// TestDialog()
//DO NOT call this directly, go through Sysout
public void printInstructions( String[] instructions )
{
//Clear out any current instructions
instructionsText.setText( "" );
//Go down array of instruction strings
String printStr, remainingStr;
for( int i=0; i < instructions.length; i++ )
{
//chop up each into pieces maxSringLength long
remainingStr = instructions[ i ];
while( remainingStr.length() > 0 )
{
//if longer than max then chop off first max chars to print
if( remainingStr.length() >= maxStringLength )
{
//Try to chop on a word boundary
int posOfSpace = remainingStr.
lastIndexOf( ' ', maxStringLength - 1 );
if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
printStr = remainingStr.substring( 0, posOfSpace + 1 );
remainingStr = remainingStr.substring( posOfSpace + 1 );
}
//else just print
else
{
printStr = remainingStr;
remainingStr = "";
}
instructionsText.append( printStr + "\n" );
}// while
}// for
}//printInstructions()
//DO NOT call this directly, go through Sysout
public void displayMessage( String messageIn )
{
messageText.append( messageIn + "\n" );
}
}// TestDialog class

@ -1,5 +1,5 @@
/*
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
* 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
@ -21,407 +21,283 @@
* 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
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
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;
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>";
};
}
protected 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()));
int o = myPageFormat.getOrientation();
myOrientationLabel.setText
("Format Orientation = " +
(o == PageFormat.PORTRAIT ? "PORTRAIT" :
o == PageFormat.LANDSCAPE ? "LANDSCAPE" :
o == PageFormat.REVERSE_LANDSCAPE ? "REVERSE_LANDSCAPE" :
"<invalid>"));
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()));
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())));
}
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) {
d = d * 10.0 + 0.5;
d = Math.floor(d) /10.0;
String ds = Double.toString(d);
int decimal_pos = ds.indexOf(".");
int len = ds.length();
if (len > decimal_pos+2) {
return ds.substring(0, decimal_pos+2);
} else {
return ds;
}
}
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());
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);
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());
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);
add(pp);
Panel epp = new Panel();
epp.setLayout (new GridLayout (6, 2, 0, 0));
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());
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();
add(epp);
displayPageFormatAttributes();
Panel panel = new Panel();
Button defButton = new Button ("Default Page");
defButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
myPageFormat = myPrinterJob.defaultPage();
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(new ActionListener() {
public void actionPerformed (ActionEvent e) {
myPageFormat = myPrinterJob.pageDialog (myPageFormat);
displayPageFormatAttributes();
}
});
Button printButton = new Button ("Print");
printButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
try {
//if (myPrinterJob.printDialog()) {
myPrinterJob.setPrintable(ValidatePage.this,
myPageFormat);
myPrinterJob.print();
// }
} catch (PrinterException pe ) {
}
}
});
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(new ActionListener() {
public void actionPerformed (ActionEvent e) {
myPrinterJob.printDialog();
}
});
Button chooseButton = new Button("Printer...");
chooseButton.addActionListener(e -> myPrinterJob.printDialog());
Button validateButton = new Button ("Validate Page");
validateButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
myPageFormat = myPrinterJob.validatePage(myPageFormat);
displayPageFormatAttributes();
}
});
Button setButton = new Button ("Set Paper");
setButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
try {
Paper p = 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());
p.setSize(pwid, phgt);
p.setImageableArea(pimx, pimy, pimwid, pimhgt);
myPageFormat.setPaper(p);
displayPageFormatAttributes();
} catch (NumberFormatException nfe) {
}
}
});
panel.add (setButton);
panel.add (defButton);
panel.add (pageButton);
panel.add (chooseButton);
panel.add (validateButton);
panel.add (printButton);
add(panel);
TextArea ta = new TextArea(7, 60);
String ls = System.getProperty("line.Separator", "\n");
ta.setText(
"When validating a page, the process is 1st to find the closest matching " + ls +
"paper size, next to make sure the requested imageable area fits within " + ls +
"the printer's imageable area for that paper size. Finally the top and " + ls +
"left margins will be shrunk if they are too great for the adjusted " + ls +
"imageable area to fit at that position. They will shrink by the minimum" + ls +
"needed to accomodate the imageable area."+ls+ls+
"To test 6229507, put the minimum margins (all 0s) in Page Setup dialog."+ls+
"Compare Imageable width, height, and margins of portrait against landscape.");
ta.setEditable(false);
add(ta);
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.");
addWindowListener (new WindowAdapter() {
public void windowClosing (WindowEvent e) {
dispose();
System.exit (0);
}
ta.setEditable(false);
add(ta);
setSize(700, 500);
}
});
setSize (500, 630);
setVisible (true);
}
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
if (pageIndex > 0) {
return Printable.NO_SUCH_PAGE;
}
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
System.out.println("Format Orientation = "
+ getOrientation(pageFormat.getOrientation()));
if (pageIndex > 0) {
return Printable.NO_SUCH_PAGE;
}
Graphics2D g2d = (Graphics2D) graphics;
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);
int o = pageFormat.getOrientation();
return Printable.PAGE_EXISTS;
}
System.out.println("Format Orientation = " +
(o == PageFormat.PORTRAIT ? "PORTRAIT" :
o == PageFormat.LANDSCAPE ? "LANDSCAPE" :
o == PageFormat.REVERSE_LANDSCAPE ? "REVERSE_LANDSCAPE" :
"<invalid>"));
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);
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.";
return Printable.PAGE_EXISTS;
}
public static void main( String[] args) {
String[] instructions =
{
"You must have a printer available to perform this test",
"This test is very flexible and requires much interaction.",
"There are several buttons.",
"Set Paper: if all fields are valid numbers it sets the Paper object.",
"This is used to create arbitrary nonsensical paper sizes to help",
"test validatePage.",
"Default Page: sets a default page. This should always be valid.",
"Page Setup: brings up the page dialog. You must OK this dialog",
"for it to have any effect. You can use this to set different size,",
"orientation and margins - which of course affect imageable area.",
"Printer: Used to set the current printer. Useful because current",
"printer affects the choice of paper sizes available.",
"You must OK this dialog for it to have any effect.",
"Validate Page:",
"The most important button in the test. By setting nonsensical",
"or valid papers with varying margins etc, this should always find",
"the closest",
"match within the limits of what is possible on the current printer.",
"Print: to the current printer. Not vital for this test.",
"request."
};
Sysout.createDialog( );
Sysout.printInstructions( instructions );
new ValidatePage();
}
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();
}
}
class Sysout {
private static TestDialog dialog;
public static void createDialogWithInstructions( String[] instructions )
{
dialog = new TestDialog( new Frame(), "Instructions" );
dialog.printInstructions( instructions );
dialog.show();
println( "Any messages for the tester will display here." );
}
public static void createDialog( )
{
dialog = new TestDialog( new Frame(), "Instructions" );
String[] defInstr = { "Instructions will appear here. ", "" } ;
dialog.printInstructions( defInstr );
dialog.show();
println( "Any messages for the tester will display here." );
}
public static void printInstructions( String[] instructions )
{
dialog.printInstructions( instructions );
}
public static void println( String messageIn )
{
dialog.displayMessage( messageIn );
}
}// Sysout class
/**
This is part of the standard test machinery. It provides a place for the
test instructions to be displayed, and a place for interactive messages
to the user to be displayed.
To have the test instructions displayed, see Sysout.
To have a message to the user be displayed, see Sysout.
Do not call anything in this dialog directly.
*/
class TestDialog extends Dialog {
TextArea instructionsText;
TextArea messageText;
int maxStringLength = 80;
//DO NOT call this directly, go through Sysout
public TestDialog( Frame frame, String name )
{
super( frame, name );
int scrollBoth = TextArea.SCROLLBARS_BOTH;
instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
add( "North", instructionsText );
messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
add("Center", messageText);
pack();
show();
}// TestDialog()
//DO NOT call this directly, go through Sysout
public void printInstructions( String[] instructions )
{
//Clear out any current instructions
instructionsText.setText( "" );
//Go down array of instruction strings
String printStr, remainingStr;
for( int i=0; i < instructions.length; i++ )
{
//chop up each into pieces maxSringLength long
remainingStr = instructions[ i ];
while( remainingStr.length() > 0 )
{
//if longer than max then chop off first max chars to print
if( remainingStr.length() >= maxStringLength )
{
//Try to chop on a word boundary
int posOfSpace = remainingStr.
lastIndexOf( ' ', maxStringLength - 1 );
if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
printStr = remainingStr.substring( 0, posOfSpace + 1 );
remainingStr = remainingStr.substring( posOfSpace + 1 );
}
//else just print
else
{
printStr = remainingStr;
remainingStr = "";
}
instructionsText.append( printStr + "\n" );
}// while
}// for
}//printInstructions()
//DO NOT call this directly, go through Sysout
public void displayMessage( String messageIn )
{
messageText.append( messageIn + "\n" );
}
}// TestDialog class

@ -1,5 +1,5 @@
/*
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
* 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
@ -21,248 +21,129 @@
* questions.
*/
/**
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
/*
* @test
* @bug 4242639
* @summary Printing quality problem on Canon and NEC
* @key printer
* @library /java/awt/regtesthelpers
* @build PassFailJFrame
* @run main/manual RasterTest
*/
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.awt.print.*;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
public class RasterTest extends Frame implements ActionListener {
private final RasterCanvas c;
private static final String INSTRUCTIONS =
"This test uses rendering operations which force the implementation\n" +
"to print the page as a raster\n" +
"You should see two square images, the 1st containing overlapping\n" +
"composited squares, the lower image shows a gradient paint.\n" +
"The printed output should match the on-screen display, although\n" +
"only colour printers will be able to accurately reproduce the\n" +
"subtle color changes.";
private RasterCanvas c;
public static void main(String[] args) throws Exception {
if (PrinterJob.lookupPrintServices().length == 0) {
throw new RuntimeException("Printer not configured or available.");
}
public static void main(String args[]) {
String[] instructions =
{
"You must have a printer available to perform this test",
"This test uses rendering operations which force the implementation",
"to print the page as a raster",
"You should see two square images, the 1st containing overlapping",
"composited squares, the lower image shows a gradient paint.",
"The printed output should match the on-screen display, although",
"only colour printers will be able to accurately reproduce the",
"subtle color changes."
};
Sysout.createDialog( );
Sysout.printInstructions( instructions );
PassFailJFrame.builder()
.instructions(INSTRUCTIONS)
.testUI(RasterTest::new)
.rows((int) INSTRUCTIONS.lines().count() + 1)
.columns(45)
.build()
.awaitAndCheck();
}
RasterTest f = new RasterTest();
f.show();
}
public RasterTest() {
public RasterTest() {
super("Java 2D Raster Printing");
c = new RasterCanvas();
add("Center", c);
Button printButton = new Button("Print");
printButton.addActionListener(this);
add("South", printButton);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
pack();
c = new RasterCanvas();
add("Center", c);
Button printButton = new Button("Print");
printButton.addActionListener(this);
add("South", printButton);
pack();
setBackground(Color.white);
}
}
public void actionPerformed(ActionEvent e) {
PrinterJob pj = PrinterJob.getPrinterJob();
public void actionPerformed(ActionEvent e) {
if (pj.printDialog()) {
pj.setPrintable(c);
try {
pj.print();
} catch (PrinterException pe) {
pe.printStackTrace();
PassFailJFrame.forceFail("Test failed because of PrinterException");
}
}
}
PrinterJob pj = PrinterJob.getPrinterJob();
private static class RasterCanvas extends Canvas implements Printable {
@Override
public int print(Graphics g, PageFormat pgFmt, int pgIndex) {
if (pgIndex > 0) {
return Printable.NO_SUCH_PAGE;
}
if (pj != null && pj.printDialog()) {
pj.setPrintable(c);
try {
pj.print();
} catch (PrinterException pe) {
} finally {
System.err.println("PRINT RETURNED");
}
}
Graphics2D g2d = (Graphics2D) g;
g2d.translate(pgFmt.getImageableX(), pgFmt.getImageableY());
doPaint(g2d);
return Printable.PAGE_EXISTS;
}
@Override
public void paint(Graphics g) {
doPaint(g);
}
private void doPaint(Graphics g) {
BufferedImage bimg = new BufferedImage(200, 200,
BufferedImage.TYPE_INT_ARGB);
Graphics ig = bimg.getGraphics();
Color alphared = new Color(255, 0, 0, 128);
Color alphagreen = new Color(0, 255, 0, 128);
Color alphablue = new Color(0, 0, 255, 128);
ig.setColor(alphared);
ig.fillRect(0, 0, 200, 200);
ig.setColor(alphagreen);
ig.fillRect(25, 25, 150, 150);
ig.setColor(alphablue);
ig.fillRect(75, 75, 125, 125);
g.drawImage(bimg, 10, 25, this);
ig.dispose();
GradientPaint gp =
new GradientPaint(10.0f, 10.0f, alphablue, 210.0f, 210.0f, alphared, true);
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(gp);
g2.fillRect(10, 240, 200, 200);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
}
}
class RasterCanvas extends Canvas implements Printable {
public int print(Graphics g, PageFormat pgFmt, int pgIndex) {
if (pgIndex > 0)
return Printable.NO_SUCH_PAGE;
Graphics2D g2d= (Graphics2D)g;
g2d.translate(pgFmt.getImageableX(), pgFmt.getImageableY());
doPaint(g2d);
return Printable.PAGE_EXISTS;
}
public void paint(Graphics g) {
doPaint(g);
}
public void paintComponent(Graphics g) {
doPaint(g);
}
public void doPaint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.black);
BufferedImage bimg = new BufferedImage(200, 200,
BufferedImage.TYPE_INT_ARGB);
Graphics ig = bimg.getGraphics();
Color alphared = new Color(255, 0, 0, 128);
Color alphagreen = new Color(0, 255, 0, 128);
Color alphablue = new Color(0, 0, 255, 128);
ig.setColor(alphared);
ig.fillRect(0,0,200,200);
ig.setColor(alphagreen);
ig.fillRect(25,25,150,150);
ig.setColor(alphablue);
ig.fillRect(75,75,125,125);
g.drawImage(bimg, 10, 25, this);
GradientPaint gp =
new GradientPaint(10.0f, 10.0f, alphablue, 210.0f, 210.0f, alphared, true);
g2.setPaint(gp);
g2.fillRect(10, 240, 200, 200);
}
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
}
}
class Sysout {
private static TestDialog dialog;
public static void createDialogWithInstructions( String[] instructions )
{
dialog = new TestDialog( new Frame(), "Instructions" );
dialog.printInstructions( instructions );
dialog.show();
println( "Any messages for the tester will display here." );
}
public static void createDialog( )
{
dialog = new TestDialog( new Frame(), "Instructions" );
String[] defInstr = { "Instructions will appear here. ", "" } ;
dialog.printInstructions( defInstr );
dialog.show();
println( "Any messages for the tester will display here." );
}
public static void printInstructions( String[] instructions )
{
dialog.printInstructions( instructions );
}
public static void println( String messageIn )
{
dialog.displayMessage( messageIn );
}
}// Sysout class
/**
This is part of the standard test machinery. It provides a place for the
test instructions to be displayed, and a place for interactive messages
to the user to be displayed.
To have the test instructions displayed, see Sysout.
To have a message to the user be displayed, see Sysout.
Do not call anything in this dialog directly.
*/
class TestDialog extends Dialog {
TextArea instructionsText;
TextArea messageText;
int maxStringLength = 80;
//DO NOT call this directly, go through Sysout
public TestDialog( Frame frame, String name )
{
super( frame, name );
int scrollBoth = TextArea.SCROLLBARS_BOTH;
instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
add( "North", instructionsText );
messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
add("Center", messageText);
pack();
show();
}// TestDialog()
//DO NOT call this directly, go through Sysout
public void printInstructions( String[] instructions )
{
//Clear out any current instructions
instructionsText.setText( "" );
//Go down array of instruction strings
String printStr, remainingStr;
for( int i=0; i < instructions.length; i++ )
{
//chop up each into pieces maxSringLength long
remainingStr = instructions[ i ];
while( remainingStr.length() > 0 )
{
//if longer than max then chop off first max chars to print
if( remainingStr.length() >= maxStringLength )
{
//Try to chop on a word boundary
int posOfSpace = remainingStr.
lastIndexOf( ' ', maxStringLength - 1 );
if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
printStr = remainingStr.substring( 0, posOfSpace + 1 );
remainingStr = remainingStr.substring( posOfSpace + 1 );
}
//else just print
else
{
printStr = remainingStr;
remainingStr = "";
}
instructionsText.append( printStr + "\n" );
}// while
}// for
}//printInstructions()
//DO NOT call this directly, go through Sysout
public void displayMessage( String messageIn )
{
messageText.append( messageIn + "\n" );
}
}// TestDialog class