76fea80707
Reviewed-by: aivanov, serb
291 lines
9.5 KiB
Java
291 lines
9.5 KiB
Java
/*
|
|
* Copyright (c) 2018, 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.
|
|
*/
|
|
|
|
/* @test
|
|
@bug 8203796
|
|
@key printer
|
|
@run main/manual DialogOwnerTest
|
|
@summary Test DialogOwner API
|
|
*/
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.awt.GraphicsConfiguration;
|
|
import java.awt.GridLayout;
|
|
import java.awt.Window;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.print.PrinterJob;
|
|
import javax.print.PrintService;
|
|
import javax.print.PrintServiceLookup;
|
|
import javax.print.ServiceUI;
|
|
import javax.print.attribute.HashPrintRequestAttributeSet;
|
|
import javax.print.attribute.PrintRequestAttributeSet;
|
|
import javax.print.attribute.standard.DialogOwner;
|
|
import javax.print.attribute.standard.DialogTypeSelection;
|
|
import javax.swing.JButton;
|
|
import javax.swing.JCheckBox;
|
|
import javax.swing.JFrame;
|
|
import javax.swing.JPanel;
|
|
import javax.swing.JTextArea;
|
|
import javax.swing.SwingUtilities;
|
|
|
|
public class DialogOwnerTest extends JPanel {
|
|
|
|
static final int NONE = 0x0;
|
|
static final int PRINT = 0x1;
|
|
static final int PAGE = 0x2;
|
|
static final int SWING2D = 0x4;
|
|
static final int NATIVE2D = 0x8;
|
|
static final int SERVICEUI = 0x10;
|
|
|
|
static final int ONTOP = 0x20;
|
|
static final int OWNED = 0x40;
|
|
|
|
static PrintService[] services =
|
|
PrintServiceLookup.lookupPrintServices(null, null);
|
|
|
|
public static void main(String[] args) {
|
|
if (services.length == 0) {
|
|
System.out.println("No printers, exiting");
|
|
return;
|
|
} else {
|
|
service = PrinterJob.getPrinterJob().getPrintService();
|
|
}
|
|
SwingUtilities.invokeLater(() -> {
|
|
createUI();
|
|
});
|
|
while (!testFinished) {
|
|
try {
|
|
Thread.sleep(1000);
|
|
} catch (InterruptedException e){
|
|
}
|
|
}
|
|
if (!testPassed) {
|
|
throw new RuntimeException("TEST FAILED.");
|
|
}
|
|
}
|
|
|
|
|
|
static final String otherText =
|
|
"This window is used to test on top behaviour\n" +
|
|
"For tests that are 'Owned' or 'On Top' the dialog\n" +
|
|
"must always stay above this window. Verify this\n " +
|
|
"by moving the dialog so that it partially obscures\n" +
|
|
"this window and then trying to raise this window.";
|
|
|
|
static final String instructions =
|
|
" Instructions\n" +
|
|
"This tests that a print dialog stays on top of either another\n" +
|
|
"window, or on top of all windows.\n" +
|
|
"For Owned tests the window titled 'Owner Window' should always \n" +
|
|
"stay behind the print dialog.\n" +
|
|
"For On Top tests all windows should stay behind the print dialog \n" +
|
|
"This test tracks if you have checked all the scenarios and will\n" +
|
|
"not allow the test to pass unless you have visited them all.\n";
|
|
|
|
static PrintService service;
|
|
|
|
public DialogOwnerTest() {
|
|
super();
|
|
//setLayout(new GridLayout(24, 1));
|
|
}
|
|
|
|
static boolean isNative(int flags) {
|
|
return (flags & NATIVE2D) != 0;
|
|
}
|
|
|
|
static boolean isCommon(int flags) {
|
|
return (flags & SWING2D) != 0;
|
|
}
|
|
|
|
static boolean is2D(int flags) {
|
|
return (flags & SWING2D|NATIVE2D) != 0;
|
|
}
|
|
|
|
static boolean isPage(int flags) {
|
|
return (flags & PAGE ) != 0;
|
|
}
|
|
|
|
static JFrame frame;
|
|
static JFrame other;
|
|
static JButton pass;
|
|
static ArrayList<JPanel> panelList = new ArrayList<JPanel>();
|
|
static volatile boolean testPassed, testFinished;
|
|
|
|
int testCount = 0;
|
|
List<String> testList = new ArrayList<String>();
|
|
|
|
static void createUI() {
|
|
other = new JFrame("Owner Window");
|
|
JTextArea otherTextArea = new JTextArea(otherText, 10, 40);
|
|
other.add(otherTextArea);
|
|
other.pack();
|
|
other.setVisible(true);
|
|
other.setLocation(800, 100);
|
|
|
|
frame = new JFrame("Test Dialog Owner");
|
|
frame.pack();
|
|
JTextArea instructionsPanel = new JTextArea(instructions, 10, 50);
|
|
instructionsPanel.setEditable(false);
|
|
frame.add("North", instructionsPanel);
|
|
DialogOwnerTest test = new DialogOwnerTest();
|
|
|
|
test.addTest("Owned Swing Print", OWNED, frame, PRINT|SWING2D);
|
|
test.addTest("On Top Swing Print", ONTOP, null, PRINT|SWING2D);
|
|
|
|
test.addTest("Owned Swing Page", OWNED, frame, PAGE|SWING2D);
|
|
test.addTest("On Top Swing Page", ONTOP, null, PAGE|SWING2D);
|
|
|
|
test.addTest("Owned javax.print", OWNED, frame, PRINT|SERVICEUI);
|
|
test.addTest("On Top javax.print", OWNED, null, PRINT|SERVICEUI);
|
|
|
|
test.addTest("Owned Native Print", OWNED, frame, PRINT|NATIVE2D);
|
|
test.addTest("On Top Native Print", OWNED, null, PRINT|NATIVE2D);
|
|
|
|
test.addTest("Owned Native Page", OWNED, frame, PAGE|NATIVE2D);
|
|
test.addTest("On Top Native Page", OWNED, null, PAGE|NATIVE2D);
|
|
|
|
test.setLayout(new GridLayout(panelList.size()+2, 1));
|
|
|
|
pass = new JButton("Pass");
|
|
pass.setEnabled(false);
|
|
pass.addActionListener((ActionEvent e) -> {
|
|
if (test.testList.size() > 0) {
|
|
return;
|
|
}
|
|
frame.dispose();
|
|
other.dispose();
|
|
System.out.println("User says test passed.");
|
|
testPassed = true;
|
|
testFinished = true;
|
|
});
|
|
|
|
JButton fail = new JButton("Fail");
|
|
fail.addActionListener((ActionEvent e) -> {
|
|
frame.dispose();
|
|
other.dispose();
|
|
System.out.println("User says test failed.");
|
|
testPassed = false;
|
|
testFinished = true;
|
|
});
|
|
|
|
JPanel p = new JPanel();
|
|
p.add(pass);
|
|
p.add(fail);
|
|
test.add(p);
|
|
|
|
|
|
for (JPanel panel : panelList) {
|
|
test.add(panel);
|
|
}
|
|
|
|
frame.add("Center", test);
|
|
frame.pack();
|
|
frame.setLocation(0,0);
|
|
frame.setVisible(true);
|
|
}
|
|
|
|
boolean isSupported(PrintRequestAttributeSet aset,
|
|
int ownerFlags, Window owner, int dlgFlags) {
|
|
|
|
boolean supported = true;
|
|
DialogOwner ownerAttr = null;
|
|
if (ownerFlags != NONE) {
|
|
if (ownerFlags == ONTOP) {
|
|
ownerAttr = new DialogOwner();
|
|
} else if (ownerFlags == OWNED) {
|
|
ownerAttr = new DialogOwner(owner);
|
|
}
|
|
aset.add(ownerAttr);
|
|
}
|
|
if (is2D(dlgFlags)) {
|
|
DialogTypeSelection dst = null;
|
|
if (isNative(dlgFlags)) {
|
|
dst = DialogTypeSelection.NATIVE;
|
|
} else if (isCommon(dlgFlags)) {
|
|
dst = DialogTypeSelection.COMMON;
|
|
}
|
|
if (dst != null &&
|
|
!service.isAttributeValueSupported(dst, null, aset)) {
|
|
//System.out.println("This DialogType not supported");
|
|
supported = false;
|
|
}
|
|
if (dst != null) {
|
|
aset.add(dst);
|
|
}
|
|
if (ownerAttr != null &&
|
|
!service.isAttributeValueSupported(ownerAttr, null, aset)) {
|
|
//System.out.println("This DialogOwner not supported");
|
|
supported = false;
|
|
}
|
|
}
|
|
return supported;
|
|
}
|
|
|
|
void addTest(String title, int ownerFlags, Window owner, int dlgFlags) {
|
|
|
|
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
|
|
if (!isSupported(aset, ownerFlags, owner, dlgFlags)) {
|
|
return;
|
|
}
|
|
|
|
// if we are here then this is supportable and worth testing
|
|
// and the attribute set is configured.
|
|
|
|
String label = title + " Dialog";
|
|
JButton button = new JButton(label);
|
|
JCheckBox tested = new JCheckBox("Tested");
|
|
tested.setEnabled(false);
|
|
JPanel panel = new JPanel();
|
|
panel.add(tested);
|
|
panel.add(button);
|
|
panelList.add(panel);
|
|
//add(panel);
|
|
testList.add(title);
|
|
if (++testCount != testList.size()) {
|
|
throw new RuntimeException("Test titles must be unique");
|
|
}
|
|
|
|
button.addActionListener((ActionEvent e) -> {
|
|
tested.setSelected(true);
|
|
testList.remove(title);
|
|
if (testList.isEmpty()) {
|
|
pass.setEnabled(true);
|
|
}
|
|
|
|
if (is2D(dlgFlags)) {
|
|
PrinterJob job = PrinterJob.getPrinterJob();
|
|
if (isPage(dlgFlags)) {
|
|
job.pageDialog(aset);
|
|
} else {
|
|
job.printDialog(aset);
|
|
}
|
|
} else {
|
|
GraphicsConfiguration gc = null;
|
|
int x = 0, y = 0;
|
|
ServiceUI.printDialog(gc, x, y, services, services[0], null,aset);
|
|
}
|
|
});
|
|
}
|
|
}
|