jdk-24/test/jdk/java/awt/Component/ComponentSerializationTest/ComponentSerializationTest.java
2024-09-30 22:09:39 +00:00

355 lines
11 KiB
Java

/*
* Copyright (c) 1998, 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.
*/
/*
* @test
* @bug 4146452
* @summary Tests serialization of peered and lightweight Components.
* @library /java/awt/regtesthelpers
* @build PassFailJFrame
* @run main/manual ComponentSerializationTest
*/
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Checkbox;
import java.awt.CheckboxMenuItem;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Label;
import java.awt.List;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.ScrollPane;
import java.awt.Scrollbar;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import javax.swing.JPanel;
public class ComponentSerializationTest extends JPanel {
private MainFrame mf;
private MainWindow mw;
private MainDialog md;
private MainFileDialog mfd;
private static final String INSTRUCTIONS = """
A Frame, a Window, and a Dialog should appear. From the Frame's
"Serialize" menu, select "Serialize!". Another Frame, Window, and
Dialog should appear exactly on top of the existing ones. The state
and functionality of the two sets of Windows should be identical. If
any errors or exceptions appear in the log area, or if the second set of
Windows is different from the first, the test fails. Otherwise, the
test passes.
""";
private static final ArrayList<Window> toDispose = new ArrayList<>();
public ComponentSerializationTest() {
mf = new MainFrame();
toDispose.add(mf);
mw = new MainWindow(mf);
toDispose.add(mw);
md = new MainDialog(mf);
toDispose.add(md);
mfd = new MainFileDialog(mf);
toDispose.add(mfd);
}
public static void main(String[] argc) throws InterruptedException,
InvocationTargetException {
PassFailJFrame.builder()
.title("Component Serialization Test")
.splitUI(ComponentSerializationTest::new)
.instructions(INSTRUCTIONS)
.columns(40)
.logArea()
.build()
.awaitAndCheck();
for (Window w : toDispose) {
if (w != null) {
EventQueue.invokeAndWait(w::dispose);
}
}
}
private void initWindow(Window w) {
w.setSize(600, 400);
w.setLayout(new FlowLayout());
// peered components
w.add(new Button("Button"));
w.add(new TestCanvas());
w.add(new Checkbox("Checkbox", true));
Choice choice = new Choice();
choice.add("Choice 1");
choice.add("Choice Two");
w.add(choice);
w.add(new Label("Label"));
List list = new List();
list.add("List 1");
list.add("List Two");
w.add(list);
w.add(new Scrollbar(Scrollbar.VERTICAL));
w.add(new Scrollbar(Scrollbar.HORIZONTAL));
ScrollPane scrollpane = new ScrollPane();
scrollpane.add(new Button("Button in a scrollpane"));
w.add(scrollpane);
w.add(new TextArea("TextArea", 3, 30));
w.add(new TextField("TextField"));
// nested components
Panel panel1 = new Panel();
panel1.setLayout(new FlowLayout());
panel1.setBackground(Color.red);
w.add(panel1);
panel1.add(new Button("level 2"));
Panel panel2 = new Panel();
panel2.setLayout(new FlowLayout());
panel2.setBackground(Color.green);
panel1.add(panel2);
panel2.add(new Button("level 3"));
// lightweight components
w.add(new LWButton("LWbutton") );
// overlapping components
w.add(new ZOrderPanel());
}
class MainWindow extends Window {
public MainWindow(Frame f) {
super(f);
initWindow(this);
setLocation(650, 0);
setVisible(true);
}
}
class MainDialog extends Dialog {
public MainDialog(Frame f) {
super(f, "MainDialog", false);
initWindow(this);
setLocation(0, 450);
setVisible(true);
}
}
class MainFileDialog extends FileDialog {
public MainFileDialog(Frame f) {
super(f, "MainFileDialog", FileDialog.SAVE);
setLocation(650, 450);
addNotify();
}
}
class MainFrame extends Frame {
public MainFrame() {
super("ComponentSerializationTest");
initWindow(this);
Menu menu = new Menu("Serialize");
Menu menu2 = new Menu("File");
Menu menu3 = new Menu("Edit");
Menu menu4 = new Menu("ReallyReallyReallyReallyReallyReallyReallyReally" +
"ReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyLong");
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 itemSerialize = new MenuItem("Serialize!");
CheckboxMenuItem itemCheck = new CheckboxMenuItem("Check me");
menu.add(itemSerialize);
menu.add(itemCheck);
MenuBar menuBar = new MenuBar();
menuBar.add(menu);
menuBar.add(menu2);
menuBar.add(menu3);
menuBar.add(menu4);
setMenuBar(menuBar);
itemSerialize.addActionListener(new ActionSerialize());
setLocation(0, 0);
setVisible(true);
}
}
class ActionSerialize implements ActionListener {
public void actionPerformed(ActionEvent ev) {
Frame f2 = null;
Window w2 = null;
Dialog d2 = null;
FileDialog fd2 = null;
try {
FileOutputStream fos = new FileOutputStream("tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(mf);
oos.writeObject(mw);
oos.writeObject(md);
oos.writeObject(mfd);
oos.flush();
FileInputStream fis = new FileInputStream("tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
f2 = (Frame)ois.readObject();
w2 = (Window)ois.readObject();
d2 = (Dialog)ois.readObject();
fd2= (FileDialog)ois.readObject();
} catch (Exception e) {
PassFailJFrame.log(e.getMessage());
}
if (f2 == null || w2 == null || d2 == null || fd2 == null) {
PassFailJFrame.log("ERROR: one of the components was not deserialized.");
PassFailJFrame.log("frame = " + f2);
PassFailJFrame.log("window = " + w2);
PassFailJFrame.log("dialog = " + d2);
PassFailJFrame.log("file dalog = " + fd2);
}
if (f2 != null) {
toDispose.add(f2);
f2.setVisible(true);
}
if (w2 != null) {
toDispose.add(w2);
w2.setVisible(true);
}
if (d2 != null) {
toDispose.add(d2);
d2.setVisible(true);
}
if (fd2 != null) {
toDispose.add(fd2);
fd2.addNotify();
}
}
}
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.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 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 {
public ZOrderPanel() {
setLayout(null);
Component first, second, third, fourth;
show();
first = makeBox("Second", Color.blue, -1);
second = makeBox("First", Color.yellow, 0);
fourth = makeBox("Fourth", Color.red, 2);
third = makeBox("Third", Color.green, 3);
remove(third);
add(third, 2);
validate();
add(new LWButton("LWButton"), 0);
}
public Dimension preferredSize() {
return new Dimension(260, 80);
}
public void layout() {
int i, n;
Insets ins = insets();
n = countComponents();
for (i = n - 1; i >= 0; i--) {
Component p = getComponent(i);
p.reshape(ins.left + 40 * i, ins.top + 5 * i, 60, 60);
}
}
public Component makeBox(String s, Color c, int index) {
Label l = new Label(s);
l.setBackground(c);
l.setAlignment(Label.RIGHT);
add(l, index);
validate();
return l;
}
}
}