jdk-24/test/jdk/java/awt/PrintJob/PrintCompatibilityTest.java
2024-10-01 04:32:55 +00:00

447 lines
15 KiB
Java

/*
* Copyright (c) 1999, 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.Canvas;
import java.awt.Checkbox;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.JobAttributes;
import java.awt.Label;
import java.awt.List;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.PageAttributes;
import java.awt.Panel;
import java.awt.PrintJob;
import java.awt.Scrollbar;
import java.awt.ScrollPane;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.JobAttributes.DialogType;
import java.awt.PageAttributes.OriginType;
import java.util.Enumeration;
import java.util.Properties;
/*
* @test
* @bug 4247583
* @key printer
* @library /java/awt/regtesthelpers
* @build PassFailJFrame
* @summary Tests that the old Properties API still works
* @run main/manual PrintCompatibilityTest
*/
public class PrintCompatibilityTest {
public static void main(String[] args) throws Exception {
String INSTRUCTIONS = """
A frame window will appear.
Choose 'Print to Printer...' from the 'Print' menu. Make sure that you print
to a printer, not a file. Examine the output and verify that the frame and all
the components in it get printed properly.
Known problems:
* The text in the second row of the menubar is not indented correctly.
You can also use the 'Print to Screen...' command for a quick manual check that
printing works, but this is only for debugging purposes.""";
PassFailJFrame.builder()
.title("PrintComponentTest Test Instructions")
.instructions(INSTRUCTIONS)
.rows((int) INSTRUCTIONS.lines().count() + 2)
.columns(60)
.testTimeOut(10)
.testUI(new MainFrame())
.logArea(8)
.build()
.awaitAndCheck();
}
}
class MainFrame extends Frame {
private LWContainer lwc;
public MainFrame() {
super("PrintCompatibilityTest");
setSize(800, 400);
setLayout(new FlowLayout());
// peered components
Button button = new Button("Button");
button.setFont(new Font("Dialog", Font.PLAIN, 12));
add(button);
add(new TestCanvas());
Checkbox cbox = new Checkbox("Checkbox", true);
cbox.setFont(new Font("DialogInput", Font.PLAIN, 12));
add(cbox);
Choice choice = new Choice();
choice.add("Choice 1");
choice.add("Choice Two");
choice.setFont(new Font("Monospaced", Font.PLAIN, 12));
add(choice);
Label label = new Label("Label");
label.setFont(new Font("Serif", Font.PLAIN, 12));
add(label);
List list = new List();
list.add("List 1");
list.add("List Two");
list.setFont(new Font("SansSerif", Font.PLAIN, 12));
add(list);
add(new Scrollbar(Scrollbar.VERTICAL) );
add(new Scrollbar(Scrollbar.HORIZONTAL) );
ScrollPane scrollpane = new ScrollPane();
Button spButton = new Button("Button in a scrollpane");
spButton.setFont(new Font("Monospaced", Font.PLAIN, 12));
scrollpane.add(spButton);
add(scrollpane);
TextArea textarea = new TextArea("TextArea", 3, 30);
textarea.setFont(new Font("Dialog", Font.ITALIC, 10));
add(textarea);
TextField textfield = new TextField("TextField");
textfield.setFont(new Font("DialogInput", Font.ITALIC, 10));
add(textfield);
// nested components
Panel panel1 = new Panel();
panel1.setLayout(new FlowLayout());
panel1.setBackground(Color.red);
this.add(panel1);
Button p1Button = new Button("level 2");
p1Button.setFont(new Font("Monospaced", Font.ITALIC, 10));
panel1.add(p1Button);
Panel panel2 = new Panel();
panel2.setLayout(new FlowLayout());
panel2.setBackground(Color.green);
panel1.add(panel2);
Button p2Button = new Button("level 3");
p2Button.setFont(new Font("Serif", Font.ITALIC, 10));
panel2.add(p2Button);
// lightweight components
LWButton lwbutton = new LWButton("LWbutton");
lwbutton.setFont(new Font("SansSerif", Font.ITALIC, 10));
add(lwbutton);
lwc = new LWContainer("LWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainerLWContainer");
lwc.setFont(new Font("Monospaced", Font.ITALIC, 10));
add(lwc);
Button lwcButton1 = new Button("HW Button 1");
Button lwcButton2 = new Button("HW Button 2");
LWButton lwcButton3 = new LWButton("LW Button");
lwcButton1.setFont(new Font("Dialog", Font.BOLD, 14));
lwcButton2.setFont(new Font("DialogInput", Font.BOLD, 14));
lwcButton3.setFont(new Font("Monospaced", Font.BOLD, 14));
lwc.add(lwcButton1);
lwc.add(lwcButton2);
lwc.add(lwcButton3);
// overlapping components
add(new ZOrderPanel());
///////////////////////
Menu menu = new Menu("Print");
Menu menu2 = new Menu("File");
Menu menu3 = new Menu("Edit");
Menu menu4 = new Menu("ReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyLong");
menu2.setFont(new Font("SansSerif", Font.BOLD, 20));
menu2.setEnabled(false);
menu3.setFont(new Font("Monospaced", Font.ITALIC, 18));
menu3.setEnabled(false);
menu4.setEnabled(false);
MenuItem itemPrinter = new MenuItem("Print to Printer...");
MenuItem itemScreen = new MenuItem("Print to Screen...");
menu.add(itemPrinter);
menu.add(itemScreen);
MenuBar menuBar = new MenuBar();
menuBar.add( menu );
menuBar.add( menu2 );
menuBar.add( menu3 );
menuBar.add( menu4 );
setMenuBar(menuBar);
itemPrinter.addActionListener( new ActionPrint() );
itemScreen.addActionListener( new ActionPrintToScreen() );
setVisible(true);
}
static void printProps(Properties props)
{
Enumeration propNames = props.propertyNames();
while (propNames.hasMoreElements()) {
String propName = (String)propNames.nextElement();
PassFailJFrame.log( propName + " = " + props.getProperty(propName));
}
}
class ActionPrint implements ActionListener {
private final int ITERATIONS = 1;
private Properties props = new Properties();
public void actionPerformed(ActionEvent ev) {
PassFailJFrame.log("About to show print dialog...");
printProps(props);
PrintJob pj = getToolkit().getPrintJob(
MainFrame.this, "Print test!", props);
if (pj == null) {
return;
}
Dimension d = pj.getPageDimension();
PassFailJFrame.log("About to print...");
PassFailJFrame.log("Dimensions: " + d);
printProps(props);
// For xor mode set, there is a printing issue with number of copies to be print.
// So, ITERATIONS are changed to 1 from 3.
// So, for now the XOR related code is commented out.
//boolean xor = false;
for (int i = 0; i < ITERATIONS; i++) {
Graphics g = pj.getGraphics();
g.setColor(Color.red);
//if (xor) {
// g.setXORMode(Color.blue);
//}
g.translate(13, 13);
printAll(g);
g.dispose();
//xor = (xor) ? false : true;
}
// For xor mode set, LWC components don't get printed.
// So, for now the code is commented out and separate bug
// (JDK-8340495) is filed to handle it.
// one more page so that we can test printing a lightweight
// at the top of the hierarchy (BugId 4212564)
//Graphics g = pj.getGraphics();
//g.setColor(Color.red);
//g.translate(13, 13);
//lwc.printAll(g);
//g.dispose();
// end 4212564
pj.end();
}
}
class ActionPrintToScreen implements ActionListener {
public void actionPerformed(ActionEvent ev) {
PrintFrame printFrame = new PrintFrame(MainFrame.this);
printFrame.show();
Graphics g = printFrame.getGraphics();
g.setColor(Color.red);
printAll(g);
g.dispose();
}
}
// Frame window that displays results of printing
// main window to a screen Graphics-- useful for
// quick testing of printing
class PrintFrame extends Frame
{
private Component printComponent;
public PrintFrame( Component c )
{
super("Print to Screen");
printComponent = c ;
addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
setVisible(false);
dispose();
}
}
);
setSize(printComponent.getSize());
setResizable(false);
}
public void paint( Graphics g ) {
printComponent.printAll(g);
}
}
class LWButton extends Component {
String label;
int width = 100;
int height = 30;
public LWButton(String label) {
super();
this.label = label;
}
public void paint(Graphics g) {
Dimension d = getSize();
g.setColor(Color.orange);
g.setFont(getFont());
g.fillRect(0, 0, d.width, d.height);
g.setColor(Color.black);
int x = 5;
int y = (d.height - 5);
g.drawString(label, x, y);
}
public Dimension getPreferredSize()
{
return new Dimension(width, height);
}
}
class LWContainer extends Container {
String label;
int width = 300;
int height = 100;
public LWContainer(String label) {
super();
this.label = label;
setLayout(new FlowLayout());
}
public void paint(Graphics g) {
super.paint(g);
Dimension d = getSize();
g.setColor(Color.green);
g.setFont(getFont());
g.drawLine(0, 0, d.width - 1, 0);
g.drawLine(d.width - 1, 0, d.width - 1, d.height - 1);
g.drawLine(d.width - 1, d.height - 1, 0, d.height - 1);
g.drawLine(0, d.height - 1, 0, 0);
g.setColor(Color.black);
int x = 5;
int y = (d.height - 5);
g.drawString(label, x, y);
}
public Dimension getPreferredSize()
{
return new Dimension(width, height);
}
}
class TestCanvas extends Canvas {
int width = 100;
int height = 100;
public void paint(Graphics g) {
g.setColor(Color.blue);
g.fillRoundRect(10, 10, 50, 50, 15, 30);
g.setColor(Color.red);
g.fillOval(70, 70, 25, 25);
}
public Dimension getPreferredSize() {
return new Dimension(width, height);
}
}
class ZOrderPanel extends Panel
{
ZOrderPanel()
{
setLayout(null);
Component first, second, third, fourth;
setVisible(true);
// add first component
first = makeBox("Second", Color.blue,
new Font("Serif", Font.BOLD, 14),
-1);
// insert on top
second = makeBox("First", Color.yellow,
new Font("SansSerif", Font.BOLD, 14),
0);
// put at the back
fourth = makeBox("Fourth", Color.red,
new Font("Monospaced", Font.BOLD, 14),
2);
// insert in last position
third = makeBox("Third", Color.green,
new Font("Dialog", Font.PLAIN, 12),
3);
// swap third and fourth to correct positions
remove(third);
add(third, 2);
// re-validate so third and fourth peers change position
validate();
// now make things really interesting with a lightweight
// component at the top of the z-order, that should print
// _below_ the native guys to match the screen...
add(new LWButton("LWButton"), 0);
}
public Dimension preferredSize()
{
return new Dimension(260, 80);
}
public void layout()
{
int i, n;
Insets ins = getInsets();
n = getComponentCount();
for (i = n-1; i >= 0; i--) {
Component p = getComponent(i);
p.setBounds(ins.left + 40 * i, ins.top + 5 * i, 60, 60);
}
}
public Component makeBox(String s, Color c, Font f, int index)
{
Label l = new Label(s);
l.setBackground(c);
l.setAlignment(Label.RIGHT);
l.setFont(f);
add(l, index);
validate();
return l;
}
}
}