1/*
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import java.awt.Button;
25import java.awt.Canvas;
26import java.awt.Checkbox;
27import java.awt.Choice;
28import java.awt.Component;
29import java.awt.Container;
30import java.awt.Dimension;
31import java.awt.Frame;
32import java.awt.Graphics;
33import java.awt.GridLayout;
34import java.awt.Label;
35import java.awt.List;
36import java.awt.Panel;
37import java.awt.ScrollPane;
38import java.awt.Scrollbar;
39import java.awt.TextArea;
40import java.awt.TextField;
41import java.awt.Toolkit;
42import java.awt.image.BufferedImage;
43
44/*
45  @test
46  @key headful
47  @bug 6596915
48  @summary Test Component.paintAll() method
49  @author sergey.bylokhov@oracle.com: area=awt.component
50  @library ../../../../lib/testlibrary/
51  @build ExtendedRobot
52  @run main PaintAll
53*/
54public class PaintAll {
55
56    private static volatile boolean lwPainted;
57    private static volatile boolean buttonPainted;
58    private static volatile boolean canvasPainted;
59    private static volatile boolean checkboxPainted;
60    private static volatile boolean choicePainted;
61    private static volatile boolean containerPainted;
62    private static volatile boolean framePainted;
63    private static volatile boolean labelPainted;
64    private static volatile boolean listPainted;
65    private static volatile boolean panelPainted;
66    private static volatile boolean scrollbarPainted;
67    private static volatile boolean scrollPanePainted;
68    private static volatile boolean textAreaPainted;
69    private static volatile boolean textFieldPainted;
70    private static ExtendedRobot robot = null;
71
72    private static final Button buttonStub = new Button() {
73        @Override
74        public void paint(final Graphics g) {
75            buttonPainted = true;
76        }
77    };
78
79    private static final Canvas canvasStub = new Canvas() {
80        @Override
81        public void paint(final Graphics g) {
82            canvasPainted = true;
83        }
84    };
85
86    private static final Checkbox checkboxStub = new Checkbox() {
87        @Override
88        public void paint(final Graphics g) {
89            checkboxPainted = true;
90        }
91    };
92
93    private static final Choice choiceStub = new Choice() {
94        @Override
95        public void paint(final Graphics g) {
96            choicePainted = true;
97        }
98    };
99
100    private static final Component lwComponentStub = new Component() {
101        @Override
102        public void paint(final Graphics g) {
103            lwPainted = true;
104        }
105    };
106
107    private static final Container containerStub = new Container() {
108        @Override
109        public void paint(final Graphics g) {
110            containerPainted = true;
111        }
112    };
113
114    private static final Frame frame = new Frame() {
115        @Override
116        public void paint(final Graphics g) {
117            super.paint(g);
118            framePainted = true;
119        }
120    };
121
122    private static final Label labelStub = new Label() {
123        @Override
124        public void paint(final Graphics g) {
125            labelPainted = true;
126        }
127    };
128
129    private static final List listStub = new List() {
130        @Override
131        public void paint(final Graphics g) {
132            listPainted = true;
133        }
134    };
135
136    private static final Panel panelStub = new Panel() {
137        @Override
138        public void paint(final Graphics g) {
139            panelPainted = true;
140        }
141    };
142
143    private static final Scrollbar scrollbarStub = new Scrollbar() {
144        @Override
145        public void paint(final Graphics g) {
146            scrollbarPainted = true;
147        }
148    };
149
150    private static final ScrollPane scrollPaneStub = new ScrollPane() {
151        @Override
152        public void paint(final Graphics g) {
153            scrollPanePainted = true;
154        }
155    };
156
157    private static final TextArea textAreaStub = new TextArea() {
158        @Override
159        public void paint(final Graphics g) {
160            textAreaPainted = true;
161        }
162    };
163
164    private static final TextField textFieldStub = new TextField() {
165        @Override
166        public void paint(final Graphics g) {
167            textFieldPainted = true;
168        }
169    };
170
171    public static void main(final String[] args) throws Exception {
172        //Frame initialisation
173        final BufferedImage graphicsProducer =
174                new BufferedImage(BufferedImage.TYPE_INT_ARGB, 1, 1);
175
176        final Graphics g = graphicsProducer.getGraphics();
177
178        frame.setLayout(new GridLayout());
179        frame.add(buttonStub);
180        frame.add(canvasStub);
181        frame.add(checkboxStub);
182        frame.add(choiceStub);
183        frame.add(lwComponentStub);
184        frame.add(containerStub);
185        frame.add(labelStub);
186        frame.add(listStub);
187        frame.add(panelStub);
188        frame.add(scrollbarStub);
189        frame.add(scrollPaneStub);
190        frame.add(textAreaStub);
191        frame.add(textFieldStub);
192        frame.setSize(new Dimension(500, 500));
193        frame.setLocationRelativeTo(null);
194        frame.setVisible(true);
195        sleep();
196
197        //Check results.
198        validation();
199
200        //Reset all flags to 'false'.
201        initPaintedFlags();
202
203        //Tested method.
204        frame.paintAll(g);
205        sleep();
206
207        //Check results.
208        validation();
209        cleanup();
210    }
211
212    private static void initPaintedFlags() {
213        lwPainted = false;
214        buttonPainted = false;
215        canvasPainted = false;
216        checkboxPainted = false;
217        choicePainted = false;
218        containerPainted = false;
219        framePainted = false;
220        labelPainted = false;
221        listPainted = false;
222        panelPainted = false;
223        scrollbarPainted = false;
224        scrollPanePainted = false;
225        textAreaPainted = false;
226        textFieldPainted = false;
227    }
228
229    private static void validation() {
230        if (!buttonPainted) {
231            fail("Paint is not called a Button "
232                 + "when paintAll() invoked on a parent");
233        }
234        if (!canvasPainted) {
235            fail("Paint is not called a Canvas "
236                 + "when paintAll() invoked on a parent");
237        }
238        if (!checkboxPainted) {
239            fail("Paint is not called a Checkbox "
240                 + "when paintAll() invoked on a parent");
241        }
242        if (!choicePainted) {
243            fail("Paint is not called a Choice "
244                 + "when paintAll() invoked on a parent");
245        }
246        if (!lwPainted) {
247            fail("Paint is not called on a lightweight"
248                 + " subcomponent when paintAll() invoked on a parent");
249        }
250        if (!containerPainted) {
251            fail("Paint is not called on a Container"
252                 + " subcomponent when paintAll() invoked on a parent");
253        }
254        if (!labelPainted) {
255            fail("Paint is not called on a Label"
256                 + " subcomponent when paintAll() invoked on a parent");
257        }
258        if (!listPainted) {
259            fail("Paint is not called on a List"
260                 + " subcomponent when paintAll() invoked on a parent");
261        }
262        if (!panelPainted) {
263            fail("Paint is not called on a Panel"
264                 + " subcomponent when paintAll() invoked on a parent");
265        }
266        if (!scrollbarPainted) {
267            fail("Paint is not called on a Scrollbar"
268                 + " subcomponent when paintAll() invoked on a parent");
269        }
270        if (!scrollPanePainted) {
271            fail("Paint is not called on a ScrollPane"
272                 + " subcomponent when paintAll() invoked on a parent");
273        }
274        if (!textAreaPainted) {
275            fail("Paint is not called on a TextArea"
276                 + " subcomponent when paintAll() invoked on a parent");
277        }
278        if (!textFieldPainted) {
279            fail("Paint is not called on a TextField"
280                 + " subcomponent when paintAll() invoked on a parent");
281        }
282        if (!framePainted) {
283            fail("Paint is not called on a Frame when paintAll()");
284        }
285    }
286
287    private static void sleep() {
288        if(robot == null) {
289            try {
290                robot = new ExtendedRobot();
291            }catch(Exception ex) {
292                ex.printStackTrace();
293                throw new RuntimeException("Unexpected failure");
294            }
295        }
296        robot.waitForIdle(500);
297    }
298
299    private static void fail(final String message) {
300        cleanup();
301        throw new RuntimeException(message);
302    }
303
304    private static void cleanup() {
305        frame.dispose();
306    }
307}
308