/* * 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; } } }