JInternalFrameOperator.java revision 13978:1993af50385d
1218065Sadrian/*
2218065Sadrian * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
3240592Sadrian * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4218065Sadrian *
5218065Sadrian * This code is free software; you can redistribute it and/or modify it
6218065Sadrian * under the terms of the GNU General Public License version 2 only, as
7218065Sadrian * published by the Free Software Foundation.
8218065Sadrian *
9218065Sadrian * This code is distributed in the hope that it will be useful, but WITHOUT
10218065Sadrian * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11218065Sadrian * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12218065Sadrian * version 2 for more details (a copy is included in the LICENSE file that
13218065Sadrian * accompanied this code).
14218065Sadrian *
15218065Sadrian * You should have received a copy of the GNU General Public License version
16218065Sadrian * 2 along with this work; if not, write to the Free Software Foundation,
17218065Sadrian * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18218065Sadrian *
19218065Sadrian * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20218065Sadrian * or visit www.oracle.com if you need additional information or have any
21218065Sadrian * questions.
22218065Sadrian */
23218065Sadrianpackage org.netbeans.jemmy.operators;
24218065Sadrian
25218065Sadrianimport java.awt.Component;
26218065Sadrianimport java.awt.Container;
27218065Sadrianimport java.awt.Rectangle;
28218065Sadrianimport java.beans.PropertyVetoException;
29218065Sadrianimport java.util.Hashtable;
30218065Sadrian
31218065Sadrianimport javax.swing.Icon;
32218065Sadrianimport javax.swing.JDesktopPane;
33218065Sadrianimport javax.swing.JInternalFrame;
34218065Sadrianimport javax.swing.JLayeredPane;
35218065Sadrianimport javax.swing.JMenuBar;
36218065Sadrianimport javax.swing.JScrollPane;
37218065Sadrianimport javax.swing.JInternalFrame.JDesktopIcon;
38218065Sadrianimport javax.swing.event.InternalFrameListener;
39218065Sadrianimport javax.swing.plaf.InternalFrameUI;
40218065Sadrian
41218065Sadrianimport org.netbeans.jemmy.ComponentChooser;
42218065Sadrianimport org.netbeans.jemmy.ComponentSearcher;
43218065Sadrianimport org.netbeans.jemmy.JemmyInputException;
44218065Sadrianimport org.netbeans.jemmy.JemmyProperties;
45218065Sadrianimport org.netbeans.jemmy.Outputable;
46218065Sadrianimport org.netbeans.jemmy.TestOut;
47218065Sadrianimport org.netbeans.jemmy.TimeoutExpiredException;
48218065Sadrianimport org.netbeans.jemmy.Timeoutable;
49218065Sadrianimport org.netbeans.jemmy.Timeouts;
50218065Sadrianimport org.netbeans.jemmy.drivers.DriverManager;
51218065Sadrianimport org.netbeans.jemmy.drivers.FrameDriver;
52218065Sadrianimport org.netbeans.jemmy.drivers.InternalFrameDriver;
53218065Sadrianimport org.netbeans.jemmy.drivers.WindowDriver;
54218065Sadrianimport org.netbeans.jemmy.util.EmptyVisualizer;
55218065Sadrian
56218065Sadrian/**
57218065Sadrian * Class provides necessary functionality to operate with
58218065Sadrian * javax.swing.JInternalFrame component.
59218065Sadrian *
60218065Sadrian * Some methods can throw WrongInternalFrameStateException exception.
61218065Sadrian *
62218065Sadrian * <BR><BR>Timeouts used: <BR>
63218065Sadrian * ComponentOperator.WaitComponentTimeout - time to wait component displayed
64218065Sadrian * <BR>
65218065Sadrian * ComponentOperator.MouseClickTimeout - time between mouse pressing and
66218065Sadrian * releasing <BR>
67218065Sadrian * AbstractButtonOperator.PushButtonTimeout - time between button pressing and
68218065Sadrian * releasing<BR>
69218065Sadrian * JScrollBarOperator.WholeScrollTimeout - time for the whole scrolling <BR>.
70218065Sadrian *
71218065Sadrian * @see org.netbeans.jemmy.Timeouts
72218065Sadrian * @see WrongInternalFrameStateException
73218065Sadrian * @author Alexandre Iline (alexandre.iline@oracle.com)
74218065Sadrian */
75218065Sadrianpublic class JInternalFrameOperator extends JComponentOperator
76218065Sadrian        implements Outputable, Timeoutable {
77218065Sadrian
78218065Sadrian    /**
79218065Sadrian     * Identifier for a "title" property.
80218065Sadrian     *
81227364Sadrian     * @see #getDump
82218065Sadrian     */
83218065Sadrian    public static final String TITLE_DPROP = "Title";
84218065Sadrian
85218065Sadrian    /**
86218065Sadrian     * Identifier for a "state" property.
87218065Sadrian     *
88218065Sadrian     * @see #getDump
89218065Sadrian     */
90218065Sadrian    public static final String STATE_DPROP = "State";
91218065Sadrian
92218065Sadrian    /**
93218065Sadrian     * Identifier for a "normal" value of "state" property.
94218065Sadrian     *
95218065Sadrian     * @see #getDump
96218065Sadrian     */
97218065Sadrian    public static final String STATE_NORMAL_DPROP_VALUE = "NORMAL";
98218065Sadrian
99218065Sadrian    /**
100218065Sadrian     * Identifier for a "closed" value of "state" property.
101218065Sadrian     *
102218240Sadrian     * @see #getDump
103218065Sadrian     */
104242782Sadrian    public static final String STATE_CLOSED_DPROP_VALUE = "CLOSED";
105242782Sadrian
106242782Sadrian    /**
107242782Sadrian     * Identifier for a "iconified" value of "state" property.
108218154Sadrian     *
109227364Sadrian     * @see #getDump
110227364Sadrian     */
111227364Sadrian    public static final String STATE_ICONIFIED_DPROP_VALUE = "ICONIFIED";
112227364Sadrian
113240946Sadrian    /**
114240946Sadrian     * Identifier for a "maximized" value of "state" property.
115240946Sadrian     *
116240946Sadrian     * @see #getDump
117240946Sadrian     */
118241170Sadrian    public static final String STATE_MAXIMAZED_DPROP_VALUE = "MAXIMIZED";
119241170Sadrian
120241170Sadrian    /**
121227364Sadrian     * Identifier for a "resizable" property.
122227364Sadrian     *
123227364Sadrian     * @see #getDump
124227364Sadrian     */
125236872Sadrian    public static final String IS_RESIZABLE_DPROP = "Resizable";
126236872Sadrian
127227364Sadrian    /**
128227364Sadrian     * Identifier for a "selected" property.
129240639Sadrian     *
130240639Sadrian     * @see #getDump
131240639Sadrian     */
132227364Sadrian    public static final String IS_SELECTED_DPROP = "Selected";
133243162Sadrian
134243162Sadrian    /**
135243162Sadrian     * A minimizing button.
136243162Sadrian     */
137243162Sadrian    protected JButtonOperator minOper = null;
138243162Sadrian
139243162Sadrian    /**
140243162Sadrian     * A maximizing button.
141243162Sadrian     */
142243162Sadrian    protected JButtonOperator maxOper = null;
143243162Sadrian
144243162Sadrian    /**
145243162Sadrian     * A close button.
146243162Sadrian     */
147243162Sadrian    protected JButtonOperator closeOper = null;
148243162Sadrian
149243162Sadrian    /**
150243162Sadrian     * A title operator.
151243162Sadrian     */
152243162Sadrian    protected ContainerOperator<?> titleOperator = null;
153243162Sadrian    private TestOut output;
154243162Sadrian    private Timeouts timeouts;
155243162Sadrian    private JDesktopIconOperator iconOperator;
156243162Sadrian
157243162Sadrian    WindowDriver wDriver;
158243162Sadrian    FrameDriver fDriver;
159243162Sadrian    InternalFrameDriver iDriver;
160243162Sadrian
161243162Sadrian    /**
162227364Sadrian     * Constructor.
163218154Sadrian     *
164218154Sadrian     * @param b a component
165218154Sadrian     */
166218154Sadrian    public JInternalFrameOperator(JInternalFrame b) {
167218154Sadrian        super(b);
168239198Sadrian        wDriver = DriverManager.getWindowDriver(getClass());
169239198Sadrian        fDriver = DriverManager.getFrameDriver(getClass());
170218154Sadrian        iDriver = DriverManager.getInternalFrameDriver(getClass());
171218154Sadrian    }
172227364Sadrian
173227364Sadrian    /**
174227364Sadrian     * Constructs a JInternalFrameOperator object.
175227364Sadrian     *
176227364Sadrian     * @param cont a container
177227364Sadrian     * @param chooser a component chooser specifying searching criteria.
178227364Sadrian     * @param index an index between appropriate ones.
179227364Sadrian     */
180227364Sadrian    public JInternalFrameOperator(ContainerOperator<?> cont, ComponentChooser chooser, int index) {
181227364Sadrian        this((JInternalFrame) cont.
182227364Sadrian                waitSubComponent(new JInternalFrameFinder(chooser),
183227364Sadrian                        index));
184227364Sadrian        copyEnvironment(cont);
185227364Sadrian    }
186227364Sadrian
187227364Sadrian    /**
188227364Sadrian     * Constructs a JInternalFrameOperator object.
189227364Sadrian     *
190227364Sadrian     * @param cont a container
191227364Sadrian     * @param chooser a component chooser specifying searching criteria.
192240639Sadrian     */
193240639Sadrian    public JInternalFrameOperator(ContainerOperator<?> cont, ComponentChooser chooser) {
194240639Sadrian        this(cont, chooser, 0);
195240639Sadrian    }
196240639Sadrian
197240639Sadrian    /**
198240639Sadrian     * Constructor. Waits component in container first. Uses cont's timeout and
199240639Sadrian     * output for waiting and to init operator.
200240639Sadrian     *
201240639Sadrian     * @param cont a container
202240639Sadrian     * @param text Button text.
203240639Sadrian     * @param index Ordinal component index.
204240639Sadrian     * @see ComponentOperator#isCaptionEqual(String, String, boolean, boolean)
205240639Sadrian     *
206240639Sadrian     */
207240639Sadrian    public JInternalFrameOperator(ContainerOperator<?> cont, String text, int index) {
208227364Sadrian        this(findOne(cont, text, index));
209227364Sadrian        copyEnvironment(cont);
210227364Sadrian    }
211227364Sadrian
212227364Sadrian    /**
213227364Sadrian     * Constructor. Waits component in container first. Uses cont's timeout and
214227364Sadrian     * output for waiting and to init operator.
215227364Sadrian     *
216227364Sadrian     * @param cont a container
217227364Sadrian     * @param text Button text.
218227364Sadrian     * @see ComponentOperator#isCaptionEqual(String, String, boolean, boolean)
219227364Sadrian     *
220227364Sadrian     */
221227364Sadrian    public JInternalFrameOperator(ContainerOperator<?> cont, String text) {
222227364Sadrian        this(cont, text, 0);
223227364Sadrian    }
224227364Sadrian
225227364Sadrian    /**
226227364Sadrian     * Constructor. Waits component in container first. Uses cont's timeout and
227227364Sadrian     * output for waiting and to init operator.
228227364Sadrian     *
229227364Sadrian     * @param cont a container
230227364Sadrian     * @param index Ordinal component index.
231227364Sadrian     *
232227364Sadrian     */
233227364Sadrian    public JInternalFrameOperator(ContainerOperator<?> cont, int index) {
234227364Sadrian        this((JInternalFrame) waitComponent(cont,
235240946Sadrian                new JInternalFrameFinder(),
236227364Sadrian                index));
237227364Sadrian        copyEnvironment(cont);
238218065Sadrian    }
239218065Sadrian
240218065Sadrian    /**
241218065Sadrian     * Constructor. Waits component in container first. Uses cont's timeout and
242218065Sadrian     * output for waiting and to init operator.
243218065Sadrian     *
244218065Sadrian     * @param cont a container
245218065Sadrian     *
246227344Sadrian     */
247218065Sadrian    public JInternalFrameOperator(ContainerOperator<?> cont) {
248227344Sadrian        this(cont, 0);
249236993Sadrian    }
250218065Sadrian
251218065Sadrian    /**
252218065Sadrian     * Searches JInternalframe in container.
253218065Sadrian     *
254218065Sadrian     * @param cont Container to search component in.
255218065Sadrian     * @param chooser a component chooser specifying searching criteria.
256218065Sadrian     * @param index Ordinal component index.
257218065Sadrian     * @return JInternalframe instance or null if component was not found.
258218065Sadrian     */
259218065Sadrian    public static JInternalFrame findJInternalFrame(Container cont, ComponentChooser chooser, int index) {
260218065Sadrian        Component res = findComponent(cont, new JInternalFrameFinder(chooser), index);
261218065Sadrian        if (res instanceof JInternalFrame) {
262218065Sadrian            return (JInternalFrame) res;
263218065Sadrian        } else if (res instanceof JInternalFrame.JDesktopIcon) {
264218065Sadrian            return ((JInternalFrame.JDesktopIcon) res).getInternalFrame();
265218065Sadrian        } else {
266218065Sadrian            return null;
267218065Sadrian        }
268237000Sadrian    }
269237000Sadrian
270218065Sadrian    /**
271234009Sadrian     * Searches JInternalframe in container.
272234009Sadrian     *
273218065Sadrian     * @param cont Container to search component in.
274218065Sadrian     * @param chooser a component chooser specifying searching criteria.
275218065Sadrian     * @return JInternalframe instance or null if component was not found.
276218065Sadrian     */
277227344Sadrian    public static JInternalFrame findJInternalFrame(Container cont, ComponentChooser chooser) {
278218065Sadrian        return findJInternalFrame(cont, chooser, 0);
279218065Sadrian    }
280218065Sadrian
281227344Sadrian    /**
282218065Sadrian     * Searches JInternalframe by title.
283218065Sadrian     *
284218065Sadrian     * @param cont Container to search component in.
285218065Sadrian     * @param text Component text.
286218065Sadrian     * @param ce Compare text exactly.
287218065Sadrian     * @param ccs Compare text case sensitively.
288218065Sadrian     * @param index Ordinal component index.
289218065Sadrian     * @return JInternalframe instance or null if component was not found.
290218065Sadrian     * @see ComponentOperator#isCaptionEqual(String, String, boolean, boolean)
291218065Sadrian     */
292218065Sadrian    public static JInternalFrame findJInternalFrame(Container cont, String text, boolean ce, boolean ccs, int index) {
293218065Sadrian        return (findJInternalFrame(cont,
294218065Sadrian                new JInternalFrameByTitleFinder(text,
295218065Sadrian                        new DefaultStringComparator(ce, ccs)),
296218065Sadrian                index));
297218065Sadrian    }
298218065Sadrian
299218065Sadrian    /**
300218065Sadrian     * Searches JInternalframe by title.
301218065Sadrian     *
302218065Sadrian     * @param cont Container to search component in.
303218065Sadrian     * @param text Component text.
304218065Sadrian     * @param ce Compare text exactly.
305218065Sadrian     * @param ccs Compare text case sensitively.
306218065Sadrian     * @return JInternalframe instance or null if component was not found.
307218065Sadrian     * @see ComponentOperator#isCaptionEqual(String, String, boolean, boolean)
308218065Sadrian     */
309218065Sadrian    public static JInternalFrame findJInternalFrame(Container cont, String text, boolean ce, boolean ccs) {
310218065Sadrian        return findJInternalFrame(cont, text, ce, ccs, 0);
311218065Sadrian    }
312218065Sadrian
313218065Sadrian    /**
314218065Sadrian     * Searches JInternalFrame object which component lies on.
315248985Sadrian     *
316218065Sadrian     * @param comp Component to find JInternalFrame under.
317218065Sadrian     * @param chooser org.netbeans.jemmy.ComponentChooser implementation.
318218065Sadrian     * @return JInternalFrame instance or null if component was not found.
319218065Sadrian     */
320218065Sadrian    public static JInternalFrame findJInternalFrameUnder(Component comp, ComponentChooser chooser) {
321218065Sadrian        return (JInternalFrame) findContainerUnder(comp, new JInternalFrameFinder(chooser));
322218065Sadrian    }
323218065Sadrian
324218065Sadrian    /**
325218065Sadrian     * Searches JInternalFrame object which component lies on.
326248985Sadrian     *
327218065Sadrian     * @param comp Component to find JInternalFrame under.
328248985Sadrian     * @return JInternalFrame instance or null if component was not found.
329218065Sadrian     */
330218065Sadrian    public static JInternalFrame findJInternalFrameUnder(Component comp) {
331218065Sadrian        return findJInternalFrameUnder(comp, new JInternalFrameFinder());
332218065Sadrian    }
333218065Sadrian
334218065Sadrian    /**
335218065Sadrian     * Waits JInternalframe in container.
336218065Sadrian     *
337218065Sadrian     * @param cont Container to search component in.
338218065Sadrian     * @param chooser a component chooser specifying searching criteria.
339218065Sadrian     * @param index Ordinal component index.
340218065Sadrian     * @return JInternalframe instance.
341218065Sadrian     *
342218065Sadrian     */
343248985Sadrian    public static JInternalFrame waitJInternalFrame(final Container cont, final ComponentChooser chooser, final int index) {
344218065Sadrian        Component res = waitComponent(cont, new JInternalFrameFinder(chooser), index);
345218065Sadrian        if (res instanceof JInternalFrame) {
346218065Sadrian            return (JInternalFrame) res;
347218065Sadrian        } else if (res instanceof JInternalFrame.JDesktopIcon) {
348218065Sadrian            return ((JInternalFrame.JDesktopIcon) res).getInternalFrame();
349218065Sadrian        } else {
350218065Sadrian            throw (new TimeoutExpiredException(chooser.getDescription()));
351218065Sadrian        }
352218065Sadrian    }
353218065Sadrian
354218065Sadrian    /**
355218065Sadrian     * Waits JInternalframe in container.
356218065Sadrian     *
357218065Sadrian     * @param cont Container to search component in.
358227360Sadrian     * @param chooser a component chooser specifying searching criteria.
359242656Sadrian     * @return JInternalframe instance.
360242656Sadrian     *
361242656Sadrian     */
362227360Sadrian    public static JInternalFrame waitJInternalFrame(Container cont, ComponentChooser chooser) {
363218065Sadrian        return waitJInternalFrame(cont, chooser, 0);
364242656Sadrian    }
365242656Sadrian
366242656Sadrian    /**
367218065Sadrian     * Waits JInternalframe by title.
368218065Sadrian     *
369242656Sadrian     * @param cont Container to search component in.
370239290Sadrian     * @param text Component text.
371239051Sadrian     * @param ce Compare text exactly.
372239051Sadrian     * @param ccs Compare text case sensitively.
373239290Sadrian     * @param index Ordinal component index.
374239380Sadrian     * @return JInternalframe instance.
375239051Sadrian     * @see ComponentOperator#isCaptionEqual(String, String, boolean, boolean)
376238708Sadrian     *
377238708Sadrian     */
378238708Sadrian    public static JInternalFrame waitJInternalFrame(Container cont, String text, boolean ce, boolean ccs, int index) {
379238708Sadrian        return (waitJInternalFrame(cont,
380238708Sadrian                new JInternalFrameByTitleFinder(text,
381218065Sadrian                        new DefaultStringComparator(ce, ccs)),
382218065Sadrian                index));
383218065Sadrian    }
384218065Sadrian
385239290Sadrian    /**
386239290Sadrian     * Waits JInternalframe by title.
387248527Sadrian     *
388248527Sadrian     * @param cont Container to search component in.
389248527Sadrian     * @param text Component text.
390239290Sadrian     * @param ce Compare text exactly.
391248527Sadrian     * @param ccs Compare text case sensitively.
392239290Sadrian     * @return JInternalframe instance.
393239290Sadrian     * @see ComponentOperator#isCaptionEqual(String, String, boolean, boolean)
394239290Sadrian     *
395239290Sadrian     */
396239290Sadrian    public static JInternalFrame waitJInternalFrame(Container cont, String text, boolean ce, boolean ccs) {
397242656Sadrian        return waitJInternalFrame(cont, text, ce, ccs, 0);
398239290Sadrian    }
399239290Sadrian
400239290Sadrian    @Override
401239290Sadrian    public void setOutput(TestOut out) {
402239290Sadrian        output = out;
403239290Sadrian        super.setOutput(output.createErrorOutput());
404239290Sadrian    }
405239051Sadrian
406239290Sadrian    @Override
407239290Sadrian    public TestOut getOutput() {
408239290Sadrian        return output;
409239290Sadrian    }
410239290Sadrian
411239290Sadrian    @Override
412239051Sadrian    public void setTimeouts(Timeouts times) {
413239290Sadrian        timeouts = times;
414239290Sadrian        super.setTimeouts(timeouts);
415239290Sadrian    }
416239290Sadrian
417239290Sadrian    @Override
418218065Sadrian    public Timeouts getTimeouts() {
419239409Sadrian        return timeouts;
420218065Sadrian    }
421239409Sadrian
422239290Sadrian    /**
423239051Sadrian     * Iconifies frame. Note: frame should not be iconified and should be
424239051Sadrian     * iconifiable.
425244109Sadrian     *
426244109Sadrian     * @throws WrongInternalFrameStateException
427244109Sadrian     *
428244109Sadrian     */
429239051Sadrian    public void iconify() {
430239409Sadrian        output.printLine("Iconify JInternalFrame\n    : " + toStringSource());
431239051Sadrian        output.printGolden("Iconify JInternalFrame \"" + getTitle() + "\"");
432239051Sadrian        checkIconified(false);
433239290Sadrian        makeComponentVisible();
434244109Sadrian        fDriver.iconify(this);
435239380Sadrian        if (getVerification()) {
436218065Sadrian            waitIcon(true);
437239409Sadrian        }
438218065Sadrian    }
439240255Sadrian
440242656Sadrian    /**
441242656Sadrian     * Deiconifies frame. Note: frame should be iconified.
442242656Sadrian     *
443242656Sadrian     * @throws WrongInternalFrameStateException
444242656Sadrian     *
445242656Sadrian     */
446242656Sadrian    public void deiconify() {
447242656Sadrian        output.printLine("Deiconify JInternalFrame\n    : " + toStringSource());
448242656Sadrian        output.printGolden("Deiconify JInternalFrame \"" + getTitle() + "\"");
449240255Sadrian        checkIconified(true);
450240333Sadrian        fDriver.deiconify(this);
451240255Sadrian        if (getVerification()) {
452242656Sadrian            waitIcon(false);
453242656Sadrian        }
454242656Sadrian    }
455242656Sadrian
456242656Sadrian    /**
457242656Sadrian     * Maximizes frame. Note: frame should not be iconified.
458242656Sadrian     *
459242656Sadrian     * @throws WrongInternalFrameStateException
460242656Sadrian     */
461242656Sadrian    public void maximize() {
462242656Sadrian        output.printLine("Maximize JInternalFrame\n    : " + toStringSource());
463242656Sadrian        output.printGolden("Maximize JInternalFrame \"" + getTitle() + "\"");
464242656Sadrian        checkIconified(false);
465242656Sadrian        makeComponentVisible();
466242656Sadrian        fDriver.maximize(this);
467242656Sadrian        if (getVerification()) {
468242656Sadrian            waitMaximum(true);
469242656Sadrian        }
470242656Sadrian    }
471242656Sadrian
472239380Sadrian    /**
473239409Sadrian     * Demaximizes frame. Note: frame should not be iconified.
474239290Sadrian     *
475239290Sadrian     * @throws WrongInternalFrameStateException
476239290Sadrian     */
477239290Sadrian    public void demaximize() {
478239409Sadrian        output.printLine("Demaximize JInternalFrame\n    : " + toStringSource());
479239290Sadrian        output.printGolden("Demaximize JInternalFrame \"" + getTitle() + "\"");
480239290Sadrian        checkIconified(false);
481239290Sadrian        makeComponentVisible();
482239290Sadrian        fDriver.demaximize(this);
483239290Sadrian        if (getVerification()) {
484239290Sadrian            waitMaximum(false);
485239290Sadrian        }
486218065Sadrian    }
487233990Sadrian
488218154Sadrian    /**
489218154Sadrian     * Moves frame to new location. Note: frame should not be iconified.
490227364Sadrian     *
491238947Sadrian     * @param x X coordinate of a new frame location.
492238947Sadrian     * @param y Y coordinate of a new frame location.
493238947Sadrian     * @throws WrongInternalFrameStateException
494238947Sadrian     */
495238947Sadrian    public void move(int x, int y) {
496238947Sadrian        checkIconified(false);
497238947Sadrian        output.printLine("Move JInternalFrame to ("
498238947Sadrian                + Integer.toString(x) + ","
499238947Sadrian                + Integer.toString(y) + ")"
500238947Sadrian                + " position\n    : " + toStringSource());
501238947Sadrian        output.printGolden("Move " + getTitle()
502238947Sadrian                + " JInternalFrame to ("
503238947Sadrian                + Integer.toString(x) + ","
504238947Sadrian                + Integer.toString(y) + ")"
505238947Sadrian                + " position");
506238947Sadrian        checkIconified(false);
507238947Sadrian        wDriver.move(this, x, y);
508238947Sadrian    }
509238947Sadrian
510238947Sadrian    /**
511238947Sadrian     * Resizes frame. Note: frame should not be iconified.
512238947Sadrian     *
513238947Sadrian     * @param width New frame width.
514238947Sadrian     * @param height New frame height.
515243647Sadrian     * @throws WrongInternalFrameStateException
516238947Sadrian     */
517243647Sadrian    public void resize(int width, int height) {
518243647Sadrian        output.printLine("Resize JInternalFrame to ("
519243647Sadrian                + Integer.toString(width) + ","
520243647Sadrian                + Integer.toString(height) + ")"
521243647Sadrian                + " size\n    : " + toStringSource());
522243647Sadrian        output.printGolden("Resize " + getTitle()
523243647Sadrian                + " JInternalFrame to ("
524243647Sadrian                + Integer.toString(width) + ","
525243647Sadrian                + Integer.toString(height) + ")"
526238947Sadrian                + " size");
527238947Sadrian        checkIconified(false);
528238947Sadrian        wDriver.resize(this, width, height);
529238947Sadrian    }
530238947Sadrian
531238947Sadrian    /**
532238947Sadrian     * Activates frame. Note: frame should not be iconified.
533238947Sadrian     *
534238947Sadrian     * @throws WrongInternalFrameStateException
535238947Sadrian     */
536238947Sadrian    public void activate() {
537238947Sadrian        checkIconified(false);
538238947Sadrian        wDriver.activate(this);
539238947Sadrian    }
540238947Sadrian
541238947Sadrian    /**
542238947Sadrian     * Closes the frame.
543238947Sadrian     */
544238947Sadrian    public void close() {
545227364Sadrian        checkIconified(false);
546227364Sadrian        wDriver.requestClose(this);
547227364Sadrian    }
548227364Sadrian
549227364Sadrian    /**
550227364Sadrian     * Scrolls to internal frame's rectangle.
551227364Sadrian     *
552227364Sadrian     * @param x Horizontal rectangle coordinate
553227364Sadrian     * @param y Vertical rectangle coordinate
554242656Sadrian     * @param width rectangle width
555227364Sadrian     * @param height rectangle height
556227364Sadrian     *
557227364Sadrian     */
558227364Sadrian    public void scrollToRectangle(int x, int y, int width, int height) {
559227364Sadrian        output.printTrace("Scroll desktop pane to make \"" + getTitle() + "\" internal frame visible");
560242951Sadrian        output.printGolden("Scroll desktop pane to make \"" + getTitle() + "\" internal frame visible");
561242951Sadrian        makeComponentVisible();
562242951Sadrian        //try to find JScrollPane under.
563242951Sadrian        JScrollPane scroll;
564242951Sadrian        if (isIcon()) {
565242951Sadrian            scroll
566242951Sadrian                    = (JScrollPane) iconOperator.getContainer(new JScrollPaneOperator.JScrollPaneFinder(ComponentSearcher.
567242951Sadrian                            getTrueChooser("JScrollPane")));
568242951Sadrian        } else {
569227364Sadrian            scroll
570242656Sadrian                    = (JScrollPane) getContainer(new JScrollPaneOperator.JScrollPaneFinder(ComponentSearcher.
571242656Sadrian                            getTrueChooser("JScrollPane")));
572227364Sadrian        }
573227364Sadrian        if (scroll == null) {
574227364Sadrian            return;
575227364Sadrian        }
576227364Sadrian        JScrollPaneOperator scroller = new JScrollPaneOperator(scroll);
577227364Sadrian        scroller.copyEnvironment(this);
578227364Sadrian        scroller.setVisualizer(new EmptyVisualizer());
579242656Sadrian        scroller.scrollToComponentRectangle(isIcon() ? iconOperator.getSource() : getSource(),
580242656Sadrian                x, y, width, height);
581242656Sadrian    }
582242656Sadrian
583242656Sadrian    /**
584242656Sadrian     * Scrolls to internal frame's rectangle.
585242656Sadrian     *
586242656Sadrian     * @param rect a rectangle to scroll to.
587242656Sadrian     */
588242656Sadrian    public void scrollToRectangle(Rectangle rect) {
589242656Sadrian        scrollToRectangle(rect.x, rect.y, rect.width, rect.height);
590242656Sadrian    }
591242656Sadrian
592242656Sadrian    /**
593242656Sadrian     * Scrolls to internal frame.
594242656Sadrian     *
595242656Sadrian     */
596227364Sadrian    public void scrollToFrame() {
597227364Sadrian        if (isIcon()) {
598242656Sadrian            scrollToRectangle(0, 0, iconOperator.getWidth(), iconOperator.getHeight());
599242656Sadrian        } else {
600242656Sadrian            scrollToRectangle(0, 0, getWidth(), getHeight());
601242656Sadrian        }
602242656Sadrian    }
603242656Sadrian
604242656Sadrian    /**
605242656Sadrian     * Waits for a minimize button inside the title pane.
606242656Sadrian     *
607242656Sadrian     * @return a button operator
608242656Sadrian     */
609242656Sadrian    public JButtonOperator getMinimizeButton() {
610242656Sadrian        initOperators();
611242656Sadrian        return minOper;
612242656Sadrian    }
613242656Sadrian
614242656Sadrian    /**
615242656Sadrian     * Waits for a maximize button inside the title pane.
616242656Sadrian     *
617242656Sadrian     * @return a button operator
618242656Sadrian     */
619242656Sadrian    public JButtonOperator getMaximizeButton() {
620242656Sadrian        initOperators();
621242656Sadrian        return maxOper;
622242656Sadrian    }
623242656Sadrian
624242656Sadrian    /**
625242656Sadrian     * Waits for a close button inside the title pane.
626242656Sadrian     *
627242656Sadrian     * @return a button operator
628242656Sadrian     */
629242656Sadrian    public JButtonOperator getCloseButton() {
630227364Sadrian        initOperators();
631227364Sadrian        return closeOper;
632227364Sadrian    }
633227364Sadrian
634238609Sadrian    /**
635238609Sadrian     * Waits for the title pane.
636227364Sadrian     *
637227364Sadrian     * @return a button operator
638227364Sadrian     */
639227364Sadrian    public ContainerOperator<?> getTitleOperator() {
640227364Sadrian        initOperators();
641227364Sadrian        return titleOperator;
642227364Sadrian    }
643227364Sadrian
644227364Sadrian    /**
645227364Sadrian     * Creates an operator for an desktop icon.
646227364Sadrian     *
647227364Sadrian     * @return an icon operator.
648227364Sadrian     */
649227364Sadrian    public JDesktopIconOperator getIconOperator() {
650227364Sadrian        initOperators();
651227364Sadrian        return iconOperator;
652227364Sadrian    }
653227364Sadrian
654227364Sadrian    /**
655243047Sadrian     * Waits for the frame to be iconified or deiconified.
656243047Sadrian     *
657243047Sadrian     * @param icon whether the frame needs to be iconified.
658243047Sadrian     */
659243047Sadrian    public void waitIcon(final boolean icon) {
660243047Sadrian        waitState(new ComponentChooser() {
661243047Sadrian            @Override
662243047Sadrian            public boolean checkComponent(Component comp) {
663243047Sadrian                return ((JInternalFrame) comp).isIcon() == icon;
664243047Sadrian            }
665243047Sadrian
666243047Sadrian            @Override
667243047Sadrian            public String getDescription() {
668243047Sadrian                return "Iconified JInternalFrame";
669243047Sadrian            }
670243047Sadrian
671243047Sadrian            @Override
672243047Sadrian            public String toString() {
673243047Sadrian                return "JInternalFrameOperator.waitIcon.ComponentChooser{description = " + getDescription() + '}';
674243047Sadrian            }
675243047Sadrian        });
676243047Sadrian    }
677243047Sadrian
678243047Sadrian    /**
679243047Sadrian     * Waits for the frame to be maximized or demaximized.
680227364Sadrian     *
681227364Sadrian     * @param maximum whether the frame needs to be maximized.
682227364Sadrian     */
683239051Sadrian    public void waitMaximum(final boolean maximum) {
684239051Sadrian        waitState(new ComponentChooser() {
685239051Sadrian            @Override
686239051Sadrian            public boolean checkComponent(Component comp) {
687239051Sadrian                return ((JInternalFrame) comp).isMaximum() == maximum;
688239051Sadrian            }
689239051Sadrian
690244109Sadrian            @Override
691239051Sadrian            public String getDescription() {
692239051Sadrian                return "Maximizied JInternalFrame";
693239051Sadrian            }
694244109Sadrian
695239051Sadrian            @Override
696239051Sadrian            public String toString() {
697227364Sadrian                return "JInternalFrameOperator.waitMaximum.ComponentChooser{description = " + getDescription() + '}';
698227364Sadrian            }
699227364Sadrian        });
700227364Sadrian    }
701243786Sadrian
702243786Sadrian    /**
703227364Sadrian     * Returns information about component.
704227364Sadrian     */
705248676Sadrian    @Override
706250735Sadrian    public Hashtable<String, Object> getDump() {
707250735Sadrian        Hashtable<String, Object> result = super.getDump();
708250735Sadrian        result.put(TITLE_DPROP, ((JInternalFrame) getSource()).getTitle());
709250735Sadrian        String state = STATE_NORMAL_DPROP_VALUE;
710250735Sadrian        if (((JInternalFrame) getSource()).isClosed()) {
711250735Sadrian            state = STATE_CLOSED_DPROP_VALUE;
712250735Sadrian        } else if (((JInternalFrame) getSource()).isIcon()) {
713250735Sadrian            state = STATE_ICONIFIED_DPROP_VALUE;
714250735Sadrian        } else if (((JInternalFrame) getSource()).isMaximum()) {
715250735Sadrian            state = STATE_MAXIMAZED_DPROP_VALUE;
716250735Sadrian        }
717250735Sadrian        result.put(STATE_DPROP, state);
718250735Sadrian        result.put(IS_RESIZABLE_DPROP, ((JInternalFrame) getSource()).isResizable() ? "true" : "false");
719248676Sadrian        result.put(IS_SELECTED_DPROP, ((JInternalFrame) getSource()).isSelected() ? "true" : "false");
720248713Sadrian        return result;
721248713Sadrian    }
722227364Sadrian
723227364Sadrian    ////////////////////////////////////////////////////////
724227364Sadrian    //Mapping                                             //
725248713Sadrian    /**
726227364Sadrian     * Maps
727248713Sadrian     * {@code JInternalFrame.addInternalFrameListener(InternalFrameListener)}
728227364Sadrian     * through queue
729227364Sadrian     */
730227364Sadrian    public void addInternalFrameListener(final InternalFrameListener internalFrameListener) {
731248713Sadrian        runMapping(new MapVoidAction("addInternalFrameListener") {
732248713Sadrian            @Override
733248713Sadrian            public void map() {
734227364Sadrian                ((JInternalFrame) getSource()).addInternalFrameListener(internalFrameListener);
735227364Sadrian            }
736248671Sadrian        });
737227364Sadrian    }
738227364Sadrian
739227364Sadrian    /**
740227364Sadrian     * Maps {@code JInternalFrame.dispose()} through queue
741227364Sadrian     */
742227364Sadrian    public void dispose() {
743229949Sadrian        runMapping(new MapVoidAction("dispose") {
744229949Sadrian            @Override
745227364Sadrian            public void map() {
746227364Sadrian                ((JInternalFrame) getSource()).dispose();
747250783Sadrian            }
748227364Sadrian        });
749227364Sadrian    }
750218065Sadrian
751218065Sadrian    /**
752218065Sadrian     * Maps {@code JInternalFrame.getContentPane()} through queue
753218065Sadrian     */
754218065Sadrian    public Container getContentPane() {
755218065Sadrian        return (runMapping(new MapAction<Container>("getContentPane") {
756218065Sadrian            @Override
757243786Sadrian            public Container map() {
758218065Sadrian                return ((JInternalFrame) getSource()).getContentPane();
759227364Sadrian            }
760227364Sadrian        }));
761227364Sadrian    }
762227364Sadrian
763250783Sadrian    /**
764250783Sadrian     * Maps {@code JInternalFrame.getDefaultCloseOperation()} through queue
765250783Sadrian     */
766250783Sadrian    public int getDefaultCloseOperation() {
767250783Sadrian        return (runMapping(new MapIntegerAction("getDefaultCloseOperation") {
768250783Sadrian            @Override
769250783Sadrian            public int map() {
770227651Sadrian                return ((JInternalFrame) getSource()).getDefaultCloseOperation();
771227651Sadrian            }
772227651Sadrian        }));
773227651Sadrian    }
774227651Sadrian
775227651Sadrian    /**
776227651Sadrian     * Maps {@code JInternalFrame.getDesktopIcon()} through queue
777227651Sadrian     */
778227651Sadrian    public JDesktopIcon getDesktopIcon() {
779227651Sadrian        return (runMapping(new MapAction<JDesktopIcon>("getDesktopIcon") {
780227651Sadrian            @Override
781227651Sadrian            public JDesktopIcon map() {
782227651Sadrian                return ((JInternalFrame) getSource()).getDesktopIcon();
783227651Sadrian            }
784227651Sadrian        }));
785227651Sadrian    }
786227651Sadrian
787250783Sadrian    /**
788227651Sadrian     * Maps {@code JInternalFrame.getDesktopPane()} through queue
789227651Sadrian     */
790227651Sadrian    public JDesktopPane getDesktopPane() {
791227651Sadrian        return (runMapping(new MapAction<JDesktopPane>("getDesktopPane") {
792227651Sadrian            @Override
793227651Sadrian            public JDesktopPane map() {
794227651Sadrian                return ((JInternalFrame) getSource()).getDesktopPane();
795227651Sadrian            }
796250783Sadrian        }));
797218065Sadrian    }
798250783Sadrian
799250783Sadrian    /**
800250783Sadrian     * Maps {@code JInternalFrame.getFrameIcon()} through queue
801250783Sadrian     */
802250783Sadrian    public Icon getFrameIcon() {
803250783Sadrian        return (runMapping(new MapAction<Icon>("getFrameIcon") {
804250783Sadrian            @Override
805250783Sadrian            public Icon map() {
806250783Sadrian                return ((JInternalFrame) getSource()).getFrameIcon();
807250783Sadrian            }
808250783Sadrian        }));
809250783Sadrian    }
810250783Sadrian
811250783Sadrian    /**
812250783Sadrian     * Maps {@code JInternalFrame.getGlassPane()} through queue
813250783Sadrian     */
814250783Sadrian    public Component getGlassPane() {
815250783Sadrian        return (runMapping(new MapAction<Component>("getGlassPane") {
816250783Sadrian            @Override
817240899Sadrian            public Component map() {
818250783Sadrian                return ((JInternalFrame) getSource()).getGlassPane();
819250783Sadrian            }
820250783Sadrian        }));
821250783Sadrian    }
822250783Sadrian
823250783Sadrian    /**
824250783Sadrian     * Maps {@code JInternalFrame.getJMenuBar()} through queue
825250783Sadrian     */
826250783Sadrian    public JMenuBar getJMenuBar() {
827250783Sadrian        return (runMapping(new MapAction<JMenuBar>("getJMenuBar") {
828240899Sadrian            @Override
829250783Sadrian            public JMenuBar map() {
830250783Sadrian                return ((JInternalFrame) getSource()).getJMenuBar();
831250783Sadrian            }
832250783Sadrian        }));
833250783Sadrian    }
834250783Sadrian
835250783Sadrian    /**
836250783Sadrian     * Maps {@code JInternalFrame.getLayer()} through queue
837250783Sadrian     */
838250783Sadrian    public int getLayer() {
839250783Sadrian        return (runMapping(new MapIntegerAction("getLayer") {
840250783Sadrian            @Override
841250783Sadrian            public int map() {
842250783Sadrian                return ((JInternalFrame) getSource()).getLayer();
843250783Sadrian            }
844250783Sadrian        }));
845250783Sadrian    }
846250783Sadrian
847250783Sadrian    /**
848250783Sadrian     * Maps {@code JInternalFrame.getLayeredPane()} through queue
849250783Sadrian     */
850250783Sadrian    public JLayeredPane getLayeredPane() {
851250783Sadrian        return (runMapping(new MapAction<JLayeredPane>("getLayeredPane") {
852250783Sadrian            @Override
853250783Sadrian            public JLayeredPane map() {
854250783Sadrian                return ((JInternalFrame) getSource()).getLayeredPane();
855250783Sadrian            }
856250783Sadrian        }));
857250783Sadrian    }
858250783Sadrian
859250783Sadrian    /**
860250783Sadrian     * Maps {@code JInternalFrame.getTitle()} through queue
861250783Sadrian     */
862250783Sadrian    public String getTitle() {
863250783Sadrian        return (runMapping(new MapAction<String>("getTitle") {
864250783Sadrian            @Override
865250783Sadrian            public String map() {
866250783Sadrian                return ((JInternalFrame) getSource()).getTitle();
867250783Sadrian            }
868250783Sadrian        }));
869250783Sadrian    }
870250783Sadrian
871250783Sadrian    /**
872250783Sadrian     * Maps {@code JInternalFrame.getUI()} through queue
873240899Sadrian     */
874250783Sadrian    public InternalFrameUI getUI() {
875250783Sadrian        return (runMapping(new MapAction<InternalFrameUI>("getUI") {
876240899Sadrian            @Override
877250783Sadrian            public InternalFrameUI map() {
878240899Sadrian                return ((JInternalFrame) getSource()).getUI();
879250783Sadrian            }
880250783Sadrian        }));
881250783Sadrian    }
882250783Sadrian
883250783Sadrian    /**
884250783Sadrian     * Maps {@code JInternalFrame.getWarningString()} through queue
885250783Sadrian     */
886250783Sadrian    public String getWarningString() {
887250783Sadrian        return (runMapping(new MapAction<String>("getWarningString") {
888250783Sadrian            @Override
889250783Sadrian            public String map() {
890250783Sadrian                return ((JInternalFrame) getSource()).getWarningString();
891240899Sadrian            }
892250783Sadrian        }));
893250783Sadrian    }
894250783Sadrian
895250783Sadrian    /**
896250783Sadrian     * Maps {@code JInternalFrame.isClosable()} through queue
897250735Sadrian     */
898250783Sadrian    public boolean isClosable() {
899250783Sadrian        return (runMapping(new MapBooleanAction("isClosable") {
900250783Sadrian            @Override
901250783Sadrian            public boolean map() {
902250735Sadrian                return ((JInternalFrame) getSource()).isClosable();
903250783Sadrian            }
904250783Sadrian        }));
905250783Sadrian    }
906250783Sadrian
907250783Sadrian    /**
908250783Sadrian     * Maps {@code JInternalFrame.isClosed()} through queue
909250783Sadrian     */
910250783Sadrian    public boolean isClosed() {
911250783Sadrian        return (runMapping(new MapBooleanAction("isClosed") {
912250783Sadrian            @Override
913250783Sadrian            public boolean map() {
914250783Sadrian                return ((JInternalFrame) getSource()).isClosed();
915250783Sadrian            }
916250783Sadrian        }));
917250783Sadrian    }
918250783Sadrian
919250783Sadrian    /**
920250783Sadrian     * Maps {@code JInternalFrame.isIcon()} through queue
921250783Sadrian     */
922227364Sadrian    public boolean isIcon() {
923218065Sadrian        return (runMapping(new MapBooleanAction("isIcon") {
924227364Sadrian            @Override
925227364Sadrian            public boolean map() {
926227364Sadrian                return ((JInternalFrame) getSource()).isIcon();
927227364Sadrian            }
928227364Sadrian        }));
929238930Sadrian    }
930238930Sadrian
931227364Sadrian    /**
932227364Sadrian     * Maps {@code JInternalFrame.isIconifiable()} through queue
933232707Sadrian     */
934218065Sadrian    public boolean isIconifiable() {
935248671Sadrian        return (runMapping(new MapBooleanAction("isIconifiable") {
936227364Sadrian            @Override
937232707Sadrian            public boolean map() {
938227364Sadrian                return ((JInternalFrame) getSource()).isIconifiable();
939232707Sadrian            }
940232707Sadrian        }));
941227364Sadrian    }
942227364Sadrian
943227364Sadrian    /**
944250783Sadrian     * Maps {@code JInternalFrame.isMaximizable()} through queue
945250783Sadrian     */
946250783Sadrian    public boolean isMaximizable() {
947250783Sadrian        return (runMapping(new MapBooleanAction("isMaximizable") {
948250783Sadrian            @Override
949250783Sadrian            public boolean map() {
950250783Sadrian                return ((JInternalFrame) getSource()).isMaximizable();
951250783Sadrian            }
952250783Sadrian        }));
953250783Sadrian    }
954250783Sadrian
955250783Sadrian    /**
956250783Sadrian     * Maps {@code JInternalFrame.isMaximum()} through queue
957250783Sadrian     */
958250783Sadrian    public boolean isMaximum() {
959250783Sadrian        return (runMapping(new MapBooleanAction("isMaximum") {
960250783Sadrian            @Override
961250783Sadrian            public boolean map() {
962250783Sadrian                return ((JInternalFrame) getSource()).isMaximum();
963250783Sadrian            }
964250783Sadrian        }));
965250783Sadrian    }
966250783Sadrian
967239120Sadrian    /**
968227364Sadrian     * Maps {@code JInternalFrame.isResizable()} through queue
969218065Sadrian     */
970218065Sadrian    public boolean isResizable() {
971227364Sadrian        return (runMapping(new MapBooleanAction("isResizable") {
972227364Sadrian            @Override
973227364Sadrian            public boolean map() {
974227364Sadrian                return ((JInternalFrame) getSource()).isResizable();
975227364Sadrian            }
976227364Sadrian        }));
977238930Sadrian    }
978238930Sadrian
979227364Sadrian    /**
980243786Sadrian     * Maps {@code JInternalFrame.isSelected()} through queue
981227364Sadrian     */
982243162Sadrian    public boolean isSelected() {
983243162Sadrian        return (runMapping(new MapBooleanAction("isSelected") {
984243162Sadrian            @Override
985243162Sadrian            public boolean map() {
986243162Sadrian                return ((JInternalFrame) getSource()).isSelected();
987227364Sadrian            }
988227364Sadrian        }));
989227364Sadrian    }
990227364Sadrian
991227364Sadrian    /**
992227364Sadrian     * Maps {@code JInternalFrame.moveToBack()} through queue
993218154Sadrian     */
994218154Sadrian    public void moveToBack() {
995229949Sadrian        runMapping(new MapVoidAction("moveToBack") {
996229949Sadrian            @Override
997218154Sadrian            public void map() {
998233330Sadrian                ((JInternalFrame) getSource()).moveToBack();
999233330Sadrian            }
1000233330Sadrian        });
1001233330Sadrian    }
1002233330Sadrian
1003233330Sadrian    /**
1004233330Sadrian     * Maps {@code JInternalFrame.moveToFront()} through queue
1005233330Sadrian     */
1006233330Sadrian    public void moveToFront() {
1007218154Sadrian        runMapping(new MapVoidAction("moveToFront") {
1008218154Sadrian            @Override
1009218154Sadrian            public void map() {
1010218154Sadrian                ((JInternalFrame) getSource()).moveToFront();
1011218154Sadrian            }
1012218154Sadrian        });
1013218154Sadrian    }
1014218154Sadrian
1015218154Sadrian    /**
1016218154Sadrian     * Maps {@code JInternalFrame.pack()} through queue
1017218154Sadrian     */
1018218154Sadrian    public void pack() {
1019218154Sadrian        runMapping(new MapVoidAction("pack") {
1020218154Sadrian            @Override
1021218154Sadrian            public void map() {
1022218154Sadrian                ((JInternalFrame) getSource()).pack();
1023218154Sadrian            }
1024229949Sadrian        });
1025218154Sadrian    }
1026218154Sadrian
1027218154Sadrian    /**
1028218154Sadrian     * Maps
1029218154Sadrian     * {@code JInternalFrame.removeInternalFrameListener(InternalFrameListener)}
1030218154Sadrian     * through queue
1031218154Sadrian     */
1032218154Sadrian    public void removeInternalFrameListener(final InternalFrameListener internalFrameListener) {
1033218154Sadrian        runMapping(new MapVoidAction("removeInternalFrameListener") {
1034218154Sadrian            @Override
1035218154Sadrian            public void map() {
1036218154Sadrian                ((JInternalFrame) getSource()).removeInternalFrameListener(internalFrameListener);
1037218154Sadrian            }
1038218154Sadrian        });
1039218154Sadrian    }
1040218154Sadrian
1041218154Sadrian    /**
1042218154Sadrian     * Maps {@code JInternalFrame.setClosable(boolean)} through queue
1043218154Sadrian     */
1044218154Sadrian    public void setClosable(final boolean b) {
1045218154Sadrian        runMapping(new MapVoidAction("setClosable") {
1046218154Sadrian            @Override
1047218154Sadrian            public void map() {
1048218154Sadrian                ((JInternalFrame) getSource()).setClosable(b);
1049218154Sadrian            }
1050218154Sadrian        });
1051229949Sadrian    }
1052218154Sadrian
1053218154Sadrian    /**
1054233989Sadrian     * Maps {@code JInternalFrame.setClosed(boolean)} through queue
1055233989Sadrian     */
1056233989Sadrian    public void setClosed(final boolean b) {
1057233989Sadrian        runMapping(new MapVoidAction("setClosed") {
1058233989Sadrian            @Override
1059233989Sadrian            public void map() throws PropertyVetoException {
1060233989Sadrian                ((JInternalFrame) getSource()).setClosed(b);
1061233989Sadrian            }
1062233989Sadrian        });
1063233989Sadrian    }
1064233989Sadrian
1065233989Sadrian    /**
1066233989Sadrian     * Maps {@code JInternalFrame.setContentPane(Container)} through queue
1067233989Sadrian     */
1068233989Sadrian    public void setContentPane(final Container container) {
1069233989Sadrian        runMapping(new MapVoidAction("setContentPane") {
1070233989Sadrian            @Override
1071233989Sadrian            public void map() {
1072233989Sadrian                ((JInternalFrame) getSource()).setContentPane(container);
1073233989Sadrian            }
1074233989Sadrian        });
1075233989Sadrian    }
1076233989Sadrian
1077233989Sadrian    /**
1078233989Sadrian     * Maps {@code JInternalFrame.setDefaultCloseOperation(int)} through queue
1079233989Sadrian     */
1080233989Sadrian    public void setDefaultCloseOperation(final int i) {
1081233989Sadrian        runMapping(new MapVoidAction("setDefaultCloseOperation") {
1082233989Sadrian            @Override
1083233989Sadrian            public void map() {
1084233989Sadrian                ((JInternalFrame) getSource()).setDefaultCloseOperation(i);
1085233989Sadrian            }
1086233989Sadrian        });
1087233989Sadrian    }
1088233989Sadrian
1089233989Sadrian    /**
1090233989Sadrian     * Maps {@code JInternalFrame.setDesktopIcon(JDesktopIcon)} through queue
1091233989Sadrian     */
1092233989Sadrian    public void setDesktopIcon(final JDesktopIcon jDesktopIcon) {
1093233989Sadrian        runMapping(new MapVoidAction("setDesktopIcon") {
1094233989Sadrian            @Override
1095233989Sadrian            public void map() {
1096233989Sadrian                ((JInternalFrame) getSource()).setDesktopIcon(jDesktopIcon);
1097233989Sadrian            }
1098233989Sadrian        });
1099233989Sadrian    }
1100233989Sadrian
1101233989Sadrian    /**
1102233989Sadrian     * Maps {@code JInternalFrame.setFrameIcon(Icon)} through queue
1103233989Sadrian     */
1104233989Sadrian    public void setFrameIcon(final Icon icon) {
1105233989Sadrian        runMapping(new MapVoidAction("setFrameIcon") {
1106233989Sadrian            @Override
1107233989Sadrian            public void map() {
1108233989Sadrian                ((JInternalFrame) getSource()).setFrameIcon(icon);
1109233989Sadrian            }
1110233989Sadrian        });
1111233989Sadrian    }
1112233989Sadrian
1113233989Sadrian    /**
1114233989Sadrian     * Maps {@code JInternalFrame.setGlassPane(Component)} through queue
1115233989Sadrian     */
1116233989Sadrian    public void setGlassPane(final Component component) {
1117233989Sadrian        runMapping(new MapVoidAction("setGlassPane") {
1118233989Sadrian            @Override
1119233989Sadrian            public void map() {
1120233989Sadrian                ((JInternalFrame) getSource()).setGlassPane(component);
1121233989Sadrian            }
1122233989Sadrian        });
1123233989Sadrian    }
1124233989Sadrian
1125233989Sadrian    /**
1126233989Sadrian     * Maps {@code JInternalFrame.setIcon(boolean)} through queue
1127233989Sadrian     */
1128233989Sadrian    public void setIcon(final boolean b) {
1129233989Sadrian        runMapping(new MapVoidAction("setIcon") {
1130233989Sadrian            @Override
1131233989Sadrian            public void map() throws PropertyVetoException {
1132233989Sadrian                ((JInternalFrame) getSource()).setIcon(b);
1133233989Sadrian            }
1134233989Sadrian        });
1135233989Sadrian    }
1136233989Sadrian
1137233989Sadrian    /**
1138233989Sadrian     * Maps {@code JInternalFrame.setIconifiable(boolean)} through queue
1139233989Sadrian     */
1140233989Sadrian    public void setIconifiable(final boolean b) {
1141233989Sadrian        runMapping(new MapVoidAction("setIconifiable") {
1142233989Sadrian            @Override
1143233989Sadrian            public void map() {
1144233989Sadrian                ((JInternalFrame) getSource()).setIconifiable(b);
1145233989Sadrian            }
1146233989Sadrian        });
1147233989Sadrian    }
1148233989Sadrian
1149233989Sadrian    /**
1150233989Sadrian     * Maps {@code JInternalFrame.setJMenuBar(JMenuBar)} through queue
1151233989Sadrian     */
1152233989Sadrian    public void setJMenuBar(final JMenuBar jMenuBar) {
1153233989Sadrian        runMapping(new MapVoidAction("setJMenuBar") {
1154233989Sadrian            @Override
1155246745Sadrian            public void map() {
1156233989Sadrian                ((JInternalFrame) getSource()).setJMenuBar(jMenuBar);
1157233989Sadrian            }
1158233989Sadrian        });
1159233989Sadrian    }
1160242144Sadrian
1161242144Sadrian    /**
1162242144Sadrian     * Maps {@code JInternalFrame.setLayer(Integer)} through queue
1163242144Sadrian     */
1164233989Sadrian    public void setLayer(final Integer integer) {
1165233989Sadrian        runMapping(new MapVoidAction("setLayer") {
1166246745Sadrian            @Override
1167233989Sadrian            public void map() {
1168233989Sadrian                ((JInternalFrame) getSource()).setLayer(integer);
1169233989Sadrian            }
1170233989Sadrian        });
1171233989Sadrian    }
1172233989Sadrian
1173233989Sadrian    /**
1174233989Sadrian     * Maps {@code JInternalFrame.setLayeredPane(JLayeredPane)} through queue
1175233989Sadrian     */
1176233989Sadrian    public void setLayeredPane(final JLayeredPane jLayeredPane) {
1177233989Sadrian        runMapping(new MapVoidAction("setLayeredPane") {
1178233989Sadrian            @Override
1179233989Sadrian            public void map() {
1180233989Sadrian                ((JInternalFrame) getSource()).setLayeredPane(jLayeredPane);
1181233989Sadrian            }
1182233989Sadrian        });
1183233989Sadrian    }
1184233989Sadrian
1185218932Sadrian    /**
1186218932Sadrian     * Maps {@code JInternalFrame.setMaximizable(boolean)} through queue
1187227364Sadrian     */
1188218157Sadrian    public void setMaximizable(final boolean b) {
1189218932Sadrian        runMapping(new MapVoidAction("setMaximizable") {
1190218932Sadrian            @Override
1191218157Sadrian            public void map() {
1192218157Sadrian                ((JInternalFrame) getSource()).setMaximizable(b);
1193218157Sadrian            }
1194218157Sadrian        });
1195218157Sadrian    }
1196218157Sadrian
1197218157Sadrian    /**
1198218932Sadrian     * Maps {@code JInternalFrame.setMaximum(boolean)} through queue
1199218932Sadrian     */
1200218932Sadrian    public void setMaximum(final boolean b) {
1201218932Sadrian        runMapping(new MapVoidAction("setMaximum") {
1202218932Sadrian            @Override
1203218932Sadrian            public void map() throws PropertyVetoException {
1204229949Sadrian                ((JInternalFrame) getSource()).setMaximum(b);
1205218932Sadrian            }
1206218932Sadrian        });
1207218932Sadrian    }
1208218932Sadrian
1209218932Sadrian    /**
1210218932Sadrian     * Maps {@code JInternalFrame.setResizable(boolean)} through queue
1211218932Sadrian     */
1212218932Sadrian    public void setResizable(final boolean b) {
1213218932Sadrian        runMapping(new MapVoidAction("setResizable") {
1214218932Sadrian            @Override
1215218932Sadrian            public void map() {
1216218932Sadrian                ((JInternalFrame) getSource()).setResizable(b);
1217218932Sadrian            }
1218218932Sadrian        });
1219218932Sadrian    }
1220218932Sadrian
1221229949Sadrian    /**
1222218932Sadrian     * Maps {@code JInternalFrame.setSelected(boolean)} through queue
1223218932Sadrian     */
1224218157Sadrian    public void setSelected(final boolean b) {
1225218157Sadrian        runMapping(new MapVoidAction("setSelected") {
1226218157Sadrian            @Override
1227218157Sadrian            public void map() throws PropertyVetoException {
1228218157Sadrian                ((JInternalFrame) getSource()).setSelected(b);
1229218157Sadrian            }
1230218157Sadrian        });
1231218157Sadrian    }
1232218157Sadrian
1233218157Sadrian    /**
1234218157Sadrian     * Maps {@code JInternalFrame.setTitle(String)} through queue
1235218932Sadrian     */
1236218932Sadrian    public void setTitle(final String string) {
1237218157Sadrian        runMapping(new MapVoidAction("setTitle") {
1238218157Sadrian            @Override
1239218932Sadrian            public void map() {
1240218157Sadrian                ((JInternalFrame) getSource()).setTitle(string);
1241218157Sadrian            }
1242218932Sadrian        });
1243218932Sadrian    }
1244218157Sadrian
1245218157Sadrian    /**
1246218932Sadrian     * Maps {@code JInternalFrame.setUI(InternalFrameUI)} through queue
1247218157Sadrian     */
1248218932Sadrian    public void setUI(final InternalFrameUI internalFrameUI) {
1249229949Sadrian        runMapping(new MapVoidAction("setUI") {
1250218157Sadrian            @Override
1251218157Sadrian            public void map() {
1252227364Sadrian                ((JInternalFrame) getSource()).setUI(internalFrameUI);
1253227364Sadrian            }
1254227364Sadrian        });
1255227364Sadrian    }
1256227364Sadrian
1257227364Sadrian    /**
1258227364Sadrian     * Maps {@code JInternalFrame.toBack()} through queue
1259227364Sadrian     */
1260227364Sadrian    public void toBack() {
1261227364Sadrian        runMapping(new MapVoidAction("toBack") {
1262227364Sadrian            @Override
1263227364Sadrian            public void map() {
1264227364Sadrian                ((JInternalFrame) getSource()).toBack();
1265227364Sadrian            }
1266227364Sadrian        });
1267218065Sadrian    }
1268227364Sadrian
1269227364Sadrian    /**
1270227364Sadrian     * Maps {@code JInternalFrame.toFront()} through queue
1271227364Sadrian     */
1272227364Sadrian    public void toFront() {
1273227364Sadrian        runMapping(new MapVoidAction("toFront") {
1274227364Sadrian            @Override
1275227364Sadrian            public void map() {
1276227364Sadrian                ((JInternalFrame) getSource()).toFront();
1277233966Sadrian            }
1278227364Sadrian        });
1279227364Sadrian    }
1280227364Sadrian
1281227364Sadrian    //End of mapping                                      //
1282227364Sadrian    ////////////////////////////////////////////////////////
1283227364Sadrian    /**
1284227364Sadrian     * Uses InternalframeDriver to get a title pane.
1285227364Sadrian     *
1286227364Sadrian     * @return a title pane.
1287227364Sadrian     */
1288227364Sadrian    protected Container findTitlePane() {
1289227364Sadrian        return (Container) iDriver.getTitlePane(this);
1290227364Sadrian    }
1291227364Sadrian
1292227364Sadrian    /**
1293227364Sadrian     * Initiaites suboperators.
1294227364Sadrian     */
1295227364Sadrian    protected void initOperators() {
1296227364Sadrian        iconOperator = new JDesktopIconOperator(((JInternalFrame) getSource()).getDesktopIcon());
1297227364Sadrian        iconOperator.copyEnvironment(this);
1298227364Sadrian        Container titlePane = findTitlePane();
1299227364Sadrian        if (!isIcon() && titlePane != null) {
1300227364Sadrian            if (titleOperator == null) {
1301227364Sadrian                titleOperator = new ContainerOperator<>(titlePane);
1302227364Sadrian                int bttCount = 0;
1303227364Sadrian                if (getContainer(new ComponentChooser() {
1304227364Sadrian                    @Override
1305227364Sadrian                    public boolean checkComponent(Component comp) {
1306227364Sadrian                        return comp instanceof JDesktopPane;
1307227364Sadrian                    }
1308227364Sadrian
1309227364Sadrian                    @Override
1310227364Sadrian                    public String getDescription() {
1311227364Sadrian                        return "Desctop pane";
1312233966Sadrian                    }
1313227364Sadrian
1314227364Sadrian                    @Override
1315227364Sadrian                    public String toString() {
1316227364Sadrian                        return "JInternalFrameOperator.initOperators.ComponentChooser{description = " + getDescription() + '}';
1317227364Sadrian                    }
1318227364Sadrian                }) != null) {
1319227364Sadrian                    minOper = new JButtonOperator(titleOperator, bttCount);
1320227364Sadrian                    bttCount++;
1321238961Sadrian                    if (((JInternalFrame) getSource()).isMaximizable()) {
1322238961Sadrian                        maxOper = new JButtonOperator(titleOperator, bttCount);
1323238961Sadrian                        bttCount++;
1324238961Sadrian                    } else {
1325238961Sadrian                        maxOper = null;
1326227364Sadrian                    }
1327227364Sadrian                } else {
1328227364Sadrian                    minOper = null;
1329227364Sadrian                    maxOper = null;
1330227364Sadrian                }
1331239051Sadrian                if (isClosable()) {
1332239051Sadrian                    closeOper = new JButtonOperator(titleOperator, bttCount);
1333239051Sadrian                } else {
1334239051Sadrian                    closeOper = null;
1335239051Sadrian                }
1336227364Sadrian            }
1337227364Sadrian        } else {
1338227364Sadrian            titleOperator = null;
1339227364Sadrian            minOper = null;
1340227364Sadrian            maxOper = null;
1341227364Sadrian            closeOper = null;
1342227364Sadrian        }
1343242951Sadrian    }
1344242951Sadrian
1345242951Sadrian    //throw exception if state is wrong
1346242951Sadrian    private void checkIconified(boolean shouldBeIconified) {
1347227364Sadrian        if (shouldBeIconified && !isIcon()
1348227364Sadrian                || !shouldBeIconified && isIcon()) {
1349227364Sadrian            throw (new WrongInternalFrameStateException("JInternal frame should "
1350227364Sadrian                    + (shouldBeIconified ? "" : "not")
1351227364Sadrian                    + " be iconified to produce this operation",
1352227364Sadrian                    getSource()));
1353227364Sadrian        }
1354227364Sadrian    }
1355227364Sadrian
1356233966Sadrian    private static JInternalFrame findOne(ContainerOperator<?> cont, String text, int index) {
1357227364Sadrian        Component source = waitComponent(cont,
1358227364Sadrian                new JInternalFrameByTitleFinder(text,
1359227364Sadrian                        cont.getComparator()),
1360227364Sadrian                index);
1361227364Sadrian        if (source instanceof JInternalFrame) {
1362227364Sadrian            return (JInternalFrame) source;
1363227364Sadrian        } else if (source instanceof JInternalFrame.JDesktopIcon) {
1364227364Sadrian            return ((JInternalFrame.JDesktopIcon) source).getInternalFrame();
1365227364Sadrian        } else {
1366227364Sadrian            throw (new TimeoutExpiredException("No internal frame was found"));
1367238947Sadrian        }
1368238947Sadrian    }
1369242656Sadrian
1370227364Sadrian    /**
1371227364Sadrian     * Exception can be throwht if as a result of an attempt to produce
1372227364Sadrian     * operation for the frame in incorrect state. Like activate iconified
1373227364Sadrian     * frame, for example.
1374227364Sadrian     */
1375227364Sadrian    public static class WrongInternalFrameStateException extends JemmyInputException {
1376227364Sadrian
1377227364Sadrian        private static final long serialVersionUID = 42L;
1378227364Sadrian
1379227364Sadrian        /**
1380227364Sadrian         * Constructs a JInternalFrameOperator$WrongInternalFrameStateException
1381227364Sadrian         * object.
1382227364Sadrian         *
1383227364Sadrian         * @param message an exception message.
1384227364Sadrian         * @param comp an internal frame.
1385227364Sadrian         */
1386227364Sadrian        public WrongInternalFrameStateException(String message, Component comp) {
1387227364Sadrian            super(message, comp);
1388227364Sadrian        }
1389227364Sadrian    }
1390227364Sadrian
1391227364Sadrian    /**
1392227364Sadrian     * Allows to find component by title.
1393227364Sadrian     */
1394227364Sadrian    public static class JInternalFrameByTitleFinder implements ComponentChooser {
1395227364Sadrian
1396227364Sadrian        String label;
1397227364Sadrian        StringComparator comparator;
1398227364Sadrian
1399227364Sadrian        /**
1400227364Sadrian         * Constructs JInternalFrameByTitleFinder.
1401227364Sadrian         *
1402227364Sadrian         * @param lb a text pattern
1403227364Sadrian         * @param comparator specifies string comparision algorithm.
1404227364Sadrian         */
1405227364Sadrian        public JInternalFrameByTitleFinder(String lb, StringComparator comparator) {
1406227364Sadrian            label = lb;
1407227364Sadrian            this.comparator = comparator;
1408227364Sadrian        }
1409227364Sadrian
1410227364Sadrian        /**
1411227364Sadrian         * Constructs JInternalFrameByTitleFinder.
1412227364Sadrian         *
1413227364Sadrian         * @param lb a text pattern
1414227364Sadrian         */
1415227364Sadrian        public JInternalFrameByTitleFinder(String lb) {
1416227364Sadrian            this(lb, Operator.getDefaultStringComparator());
1417227364Sadrian        }
1418240883Sadrian
1419240883Sadrian        @Override
1420240883Sadrian        public boolean checkComponent(Component comp) {
1421240883Sadrian            if (comp instanceof JInternalFrame || comp instanceof JInternalFrame.JDesktopIcon) {
1422240883Sadrian                JInternalFrame frame = null;
1423240883Sadrian                if (comp instanceof JInternalFrame) {
1424245708Sadrian                    frame = (JInternalFrame) comp;
1425240883Sadrian                } else {
1426243786Sadrian                    JDesktopIconOperator io = new JDesktopIconOperator((JInternalFrame.JDesktopIcon) comp);
1427240883Sadrian                    frame = io.getInternalFrame();
1428245708Sadrian                }
1429240883Sadrian                if (frame.getTitle() != null) {
1430245708Sadrian                    return (comparator.equals(frame.getTitle(),
1431240883Sadrian                            label));
1432240883Sadrian                }
1433240883Sadrian            }
1434240883Sadrian            return false;
1435250665Sadrian        }
1436250665Sadrian
1437250665Sadrian        @Override
1438250665Sadrian        public String getDescription() {
1439250665Sadrian            return "JInternalFrame with title \"" + label + "\"";
1440250665Sadrian        }
1441250665Sadrian
1442250665Sadrian        @Override
1443250665Sadrian        public String toString() {
1444250665Sadrian            return "JInternalFrameByTitleFinder{" + "label=" + label + ", comparator=" + comparator + '}';
1445250665Sadrian        }
1446250665Sadrian    }
1447250665Sadrian
1448250665Sadrian    /**
1449250665Sadrian     * Class to operate with javax.swing.JInternalFrame.JDesktopIconOperator
1450250665Sadrian     * component.
1451250665Sadrian     */
1452250665Sadrian    public static class JDesktopIconOperator extends JComponentOperator
1453250665Sadrian            implements Outputable, Timeoutable {
1454250665Sadrian
1455250665Sadrian        private TestOut output;
1456250665Sadrian        private Timeouts timeouts;
1457250665Sadrian
1458250665Sadrian        /**
1459250665Sadrian         * Constructs JDesktopIconOperator.
1460250665Sadrian         *
1461250665Sadrian         * @param b a component
1462250665Sadrian         */
1463250665Sadrian        public JDesktopIconOperator(JInternalFrame.JDesktopIcon b) {
1464250665Sadrian            super(b);
1465250665Sadrian            setOutput(JemmyProperties.getCurrentOutput());
1466250665Sadrian            setTimeouts(JemmyProperties.getCurrentTimeouts());
1467250665Sadrian        }
1468250665Sadrian
1469250665Sadrian        @Override
1470250665Sadrian        public void setOutput(TestOut out) {
1471250665Sadrian            output = out;
1472250665Sadrian            super.setOutput(output.createErrorOutput());
1473250665Sadrian        }
1474250665Sadrian
1475250665Sadrian        @Override
1476250665Sadrian        public TestOut getOutput() {
1477250665Sadrian            return output;
1478250665Sadrian        }
1479250665Sadrian
1480250665Sadrian        @Override
1481250665Sadrian        public void setTimeouts(Timeouts times) {
1482250665Sadrian            timeouts = times;
1483250665Sadrian            super.setTimeouts(timeouts);
1484250665Sadrian        }
1485250665Sadrian
1486250665Sadrian        @Override
1487250665Sadrian        public Timeouts getTimeouts() {
1488250665Sadrian            return timeouts;
1489250665Sadrian        }
1490250665Sadrian
1491250665Sadrian        /**
1492250665Sadrian         * Creates an operator for the correspondent intenal frame.
1493250665Sadrian         *
1494250665Sadrian         * @return an operator.
1495250665Sadrian         */
1496250665Sadrian        public JInternalFrame getInternalFrame() {
1497250665Sadrian            return ((JInternalFrame) getEventDispatcher().
1498227364Sadrian                    invokeExistingMethod("getInternalFrame",
1499227364Sadrian                            null,
1500227364Sadrian                            null,
1501227364Sadrian                            output));
1502227364Sadrian        }
1503227364Sadrian
1504227364Sadrian        /**
1505227364Sadrian         * Pushs the deiconifying button.
1506227364Sadrian         */
1507250665Sadrian        public void pushButton() {
1508250665Sadrian            new JButtonOperator(this).push();
1509250665Sadrian        }
1510250665Sadrian    }
1511227364Sadrian
1512227364Sadrian    /**
1513227364Sadrian     * Checks component type.
1514227364Sadrian     */
1515227364Sadrian    public static class JInternalFrameFinder implements ComponentChooser {
1516240883Sadrian
1517240883Sadrian        ComponentChooser sf = null;
1518227364Sadrian
1519243786Sadrian        /**
1520227364Sadrian         * Constructs JInternalFrameFinder.
1521240883Sadrian         *
1522240883Sadrian         * @param sf other searching criteria.
1523240883Sadrian         */
1524240883Sadrian        public JInternalFrameFinder(ComponentChooser sf) {
1525240883Sadrian            this.sf = sf;
1526240883Sadrian        }
1527240883Sadrian
1528240883Sadrian        /**
1529240883Sadrian         * Constructs JInternalFrameFinder.
1530240883Sadrian         */
1531240883Sadrian        public JInternalFrameFinder() {
1532227364Sadrian            this(ComponentSearcher.getTrueChooser("JInternalFrame or JInternalFrame.JDesktopIcon"));
1533227364Sadrian        }
1534233989Sadrian
1535233989Sadrian        @Override
1536233989Sadrian        public boolean checkComponent(Component comp) {
1537227364Sadrian            return ((comp instanceof JInternalFrame || comp instanceof JInternalFrame.JDesktopIcon)
1538227364Sadrian                    && sf.checkComponent(comp));
1539227364Sadrian        }
1540240883Sadrian
1541240883Sadrian        @Override
1542240724Sadrian        public String getDescription() {
1543240883Sadrian            return sf.getDescription();
1544240883Sadrian        }
1545240883Sadrian
1546227364Sadrian        @Override
1547227364Sadrian        public String toString() {
1548227364Sadrian            return "JInternalFrameFinder{" + "sf=" + sf + '}';
1549227364Sadrian        }
1550240722Sadrian    }
1551240722Sadrian
1552240722Sadrian}
1553240722Sadrian