jdk/test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/DialogWaiter.java
changeset 36744 a00905527ec2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sanity/client/lib/jemmy/src/org/netbeans/jemmy/DialogWaiter.java	Wed Mar 30 19:05:58 2016 -0700
@@ -0,0 +1,672 @@
+/*
+ * Copyright (c) 1997, 2016, 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.
+ */
+package org.netbeans.jemmy;
+
+import java.awt.Component;
+import java.awt.Dialog;
+import java.awt.Window;
+
+/**
+ * A DialogWaiter is a utility class used to look or wait for Dialogs. It
+ * contains methods to search for a Dialog among the currently showing Dialogs
+ * as well as methods that wait for a Dialog to show within an allotted time
+ * period.
+ *
+ * Searches and waits can either involve search criteria applied by a
+ * ComponentChooser instance or a search criteria based on the Dialog title.
+ * Searches and waits can both be restricted to dialogs owned by a given window.
+ *
+ * <BR><BR>Timeouts used: <BR>
+ * DialogWaiter.WaitDialogTimeout - time to wait dialog displayed <BR>
+ * DialogWaiter.AfterDialogTimeout - time to sleep after dialog has been
+ * displayed <BR>
+ *
+ * @see org.netbeans.jemmy.Timeouts
+ *
+ * @author Alexandre Iline (alexandre.iline@oracle.com)
+ */
+public class DialogWaiter extends WindowWaiter implements Timeoutable, Outputable {
+
+    private final static long WAIT_TIME = 60000;
+    private final static long AFTER_WAIT_TIME = 0;
+
+    private Timeouts timeouts;
+    private TestOut output;
+
+    /**
+     * Constructor.
+     */
+    public DialogWaiter() {
+        super();
+        setTimeouts(JemmyProperties.getProperties().getTimeouts());
+    }
+
+    /**
+     * Searches for a dialog. Search among the currently showing dialogs for one
+     * that meets the search criteria applied by the
+     * {@code ComponentChooser} parameter.
+     *
+     * @param cc A component chooser used to define and apply the search
+     * criteria.
+     * @return a reference to the first dialog that is showing and that meets
+     * the search criteria. If no such dialog can be found, a {@code null}
+     * reference is returned.
+     */
+    public static Dialog getDialog(ComponentChooser cc) {
+        return (Dialog) WindowWaiter.getWindow(new DialogSubChooser(cc));
+    }
+
+    /**
+     * Searches for a dialog. The search proceeds among the currently showing
+     * dialogs for the {@code index+1}'th dialog that meets the criteria
+     * defined and applied by the {@code ComonentChooser} parameter.
+     *
+     * @param cc A component chooser used to define and apply the search
+     * criteria.
+     * @param index The ordinal index of the dialog in the set of currently
+     * displayed dialogs. The first index is 0.
+     * @return a reference to the {@code index+1}'th dialog that is showing
+     * and that meets the search criteria. If there are fewer than
+     * {@code index+1} dialogs, a {@code null} reference is returned.
+     */
+    public static Dialog getDialog(ComponentChooser cc, int index) {
+        return (Dialog) WindowWaiter.getWindow(new DialogSubChooser(cc), index);
+    }
+
+    /**
+     * Searches for a dialog by title. The search proceeds among the currently
+     * showing dialogs for the first with a suitable title.
+     *
+     * @param title Dialog title or subtitle.
+     * @param ce If {@code true} and the search is case sensitive, then a
+     * match occurs when the {@code title} argument is a substring of a
+     * dialog title. If {@code false} and the search is case sensitive,
+     * then the {@code title} argument and the dialog title must be the
+     * same. If {@code true} and the search is case insensitive, then a
+     * match occurs when the {@code title} argument is a substring of the
+     * dialog title after changing both to upper case. If {@code false} and
+     * the search is case insensitive, then a match occurs when the
+     * {@code title} argument is a substring of the dialog title after
+     * changing both to upper case.
+     * @param cc If {@code true} the search is case sensitive; otherwise,
+     * the search is case insensitive.
+     * @return a reference to the first dialog that is showing and that has a
+     * suitable title. If no such dialog can be found, a {@code null}
+     * reference is returned.
+     */
+    public static Dialog getDialog(String title, boolean ce, boolean cc) {
+        return (Dialog) WindowWaiter.getWindow(new DialogByTitleChooser(title, ce, cc));
+    }
+
+    /**
+     * Searches for a dialog by title. The search is for the
+     * {@code index+1}'th dialog among the currently showing dialogs that
+     * possess a suitable title.
+     *
+     * @param title Dialog title or subtitle.
+     * @param ce If {@code true} and the search is case sensitive, then a
+     * match occurs when the {@code title} argument is a substring of a
+     * dialog title. If {@code false} and the search is case sensitive,
+     * then the {@code title} argument and the dialog title must be the
+     * same. If {@code true} and the search is case insensitive, then a
+     * match occurs when the {@code title} argument is a substring of the
+     * dialog title after changing both to upper case. If {@code false} and
+     * the search is case insensitive, then a match occurs when the
+     * {@code title} argument is a substring of the dialog title after
+     * changing both to upper case.
+     * @param cc If {@code true} the search is case sensitive; otherwise,
+     * the search is case insensitive.
+     * @param index Ordinal index between appropriate dialogs
+     * @return a reference to the {@code index+1}'th dialog that is showing
+     * and that has a suitable title. If there are fewer than
+     * {@code index+1} dialogs, a {@code null} reference is returned.
+     */
+    public static Dialog getDialog(String title, boolean ce, boolean cc, int index) {
+        return getDialog(new DialogByTitleChooser(title, ce, cc), index);
+    }
+
+    /**
+     * Searches for a dialog. Search among the currently showing dialogs for the
+     * first that is both owned by the {@code java.awt.Window}
+     * {@code owner} and that meets the search criteria applied by the
+     * {@code ComponentChooser} parameter.
+     *
+     * @param owner The owner window of the dialogs to be searched.
+     * @param cc A component chooser used to define and apply the search
+     * criteria.
+     * @return a reference to the first dialog that is showing, has a proper
+     * owner window, and that meets the search criteria. If no such dialog can
+     * be found, a {@code null} reference is returned.
+     */
+    public static Dialog getDialog(Window owner, ComponentChooser cc) {
+        return (Dialog) WindowWaiter.getWindow(owner, new DialogSubChooser(cc));
+    }
+
+    /**
+     * Searches for a dialog. The search proceeds among the currently showing
+     * dialogs for the {@code index+1}'th dialog that is both owned by the
+     * {@code java.awt.Window} {@code owner} and that meets the
+     * criteria defined and applied by the {@code ComponentChooser}
+     * parameter.
+     *
+     * @param owner The owner window of all the dialogs to be searched.
+     * @param cc A component chooser used to define and apply the search
+     * criteria.
+     * @param index Ordinal index between appropriate dialogs
+     * @return a reference to the {@code index+1}'th dialog that is
+     * showing, has the proper window ownership, and that meets the search
+     * criteria. If there are fewer than {@code index+1} dialogs, a
+     * {@code null} reference is returned.
+     */
+    public static Dialog getDialog(Window owner, ComponentChooser cc, int index) {
+        return (Dialog) WindowWaiter.getWindow(owner, new DialogSubChooser(cc), index);
+    }
+
+    /**
+     * Searches for a dialog by title. The search proceeds among the currently
+     * showing dialogs that are owned by the {@code java.awt.Window}
+     * {@code owner} for the first with a suitable title.
+     *
+     * @param owner A window - owner of a dialods to be checked.
+     * @param title Dialog title or subtitle.
+     * @param ce If {@code true} and the search is case sensitive, then a
+     * match occurs when the {@code title} argument is a substring of a
+     * dialog title. If {@code false} and the search is case sensitive,
+     * then the {@code title} argument and the dialog title must be the
+     * same. If {@code true} and the search is case insensitive, then a
+     * match occurs when the {@code title} argument is a substring of the
+     * dialog title after changing both to upper case. If {@code false} and
+     * the search is case insensitive, then a match occurs when the
+     * {@code title} argument is a substring of the dialog title after
+     * changing both to upper case.
+     * @param cc If {@code true} the search is case sensitive; otherwise,
+     * the search is case insensitive.
+     * @return a reference to the first dialog that is showing, has the proper
+     * window ownership, and a suitable title. If no such dialog can be found, a
+     * {@code null} reference is returned.
+     */
+    public static Dialog getDialog(Window owner, String title, boolean ce, boolean cc) {
+        return (Dialog) WindowWaiter.getWindow(owner, new DialogByTitleChooser(title, ce, cc));
+    }
+
+    /**
+     * Searches for a dialog by title. The search is for the
+     * {@code index+1}'th dialog among the currently showing dialogs that
+     * are owned by the {@code java.awt.Window} {@code owner} and that
+     * have a suitable title.
+     *
+     * @param owner ?title? Dialog title or subtitle.
+     * @param title ?ce? If {@code true} and the search is case sensitive,
+     * then a match occurs when the {@code title} argument is a substring
+     * of a dialog title. If {@code false} and the search is case
+     * sensitive, then the {@code title} argument and the dialog title must
+     * be the same. If {@code true} and the search is case insensitive,
+     * then a match occurs when the {@code title} argument is a substring
+     * of the dialog title after changing both to upper case. If
+     * {@code false} and the search is case insensitive, then a match
+     * occurs when the {@code title} argument is a substring of the dialog
+     * title after changing both to upper case.
+     * @param ce ?cc? If {@code true} the search is case sensitive;
+     * otherwise, the search is case insensitive.
+     * @param cc ?index? The ordinal index of the dialog in the set of currently
+     * displayed dialogs with the proper window ownership and a suitable title.
+     * The first index is 0.
+     * @param index Ordinal index between appropriate dialogs
+     * @return a reference to the {@code index+1}'th dialog that is
+     * showing, has the proper window ownership, and a suitable title. If there
+     * are fewer than {@code index+1} dialogs, a {@code null}
+     * reference is returned.
+     */
+    public static Dialog getDialog(Window owner, String title, boolean ce, boolean cc, int index) {
+        return getDialog(owner, new DialogByTitleChooser(title, ce, cc), index);
+    }
+
+    static {
+        Timeouts.initDefault("DialogWaiter.WaitDialogTimeout", WAIT_TIME);
+        Timeouts.initDefault("DialogWaiter.AfterDialogTimeout", AFTER_WAIT_TIME);
+    }
+
+    /**
+     * Defines current timeouts.
+     *
+     * @param timeouts ?t? A collection of timeout assignments.
+     * @see org.netbeans.jemmy.Timeouts
+     * @see org.netbeans.jemmy.Timeoutable
+     * @see #getTimeouts
+     */
+    @Override
+    public void setTimeouts(Timeouts timeouts) {
+        this.timeouts = timeouts;
+        Timeouts times = timeouts.cloneThis();
+        times.setTimeout("WindowWaiter.WaitWindowTimeout",
+                timeouts.getTimeout("DialogWaiter.WaitDialogTimeout"));
+        times.setTimeout("WindowWaiter.AfterWindowTimeout",
+                timeouts.getTimeout("DialogWaiter.AfterDialogTimeout"));
+        super.setTimeouts(times);
+    }
+
+    /**
+     * Return current timeouts.
+     *
+     * @return the collection of current timeout assignments.
+     * @see org.netbeans.jemmy.Timeouts
+     * @see org.netbeans.jemmy.Timeoutable
+     * @see #setTimeouts
+     */
+    @Override
+    public Timeouts getTimeouts() {
+        return timeouts;
+    }
+
+    /**
+     * Defines print output streams or writers.
+     *
+     * @param output ?out? Identify the streams or writers used for print
+     * output.
+     * @see org.netbeans.jemmy.TestOut
+     * @see org.netbeans.jemmy.Outputable
+     * @see #getOutput
+     */
+    @Override
+    public void setOutput(TestOut output) {
+        this.output = output;
+        super.setOutput(output);
+    }
+
+    /**
+     * Returns print output streams or writers.
+     *
+     * @return an object that contains references to objects for printing to
+     * output and err streams.
+     * @see org.netbeans.jemmy.TestOut
+     * @see org.netbeans.jemmy.Outputable
+     * @see #setOutput
+     */
+    @Override
+    public TestOut getOutput() {
+        return output;
+    }
+
+    /**
+     * Waits for a dialog to show. Wait for the {@code index+1}'th dialog
+     * that meets the criteria defined and applied by the
+     * {@code ComonentChooser} parameter to show up.
+     *
+     * @param ch A component chooser used to define and apply the search
+     * criteria.
+     * @param index The ordinal index of the dialog in the set of currently
+     * displayed dialogs. The first index is 0.
+     * @return a reference to the {@code index+1}'th dialog that shows and
+     * that meets the search criteria. If fewer than {@code index+1}
+     * dialogs show up in the allotted time period then a {@code null}
+     * reference is returned.
+     * @throws TimeoutExpiredException
+     * @see org.netbeans.jemmy.WindowWaiter#actionProduced(Object)
+     * @exception InterruptedException
+     */
+    public Dialog waitDialog(ComponentChooser ch, int index)
+            throws InterruptedException {
+        setTimeouts(timeouts);
+        return (Dialog) waitWindow(new DialogSubChooser(ch), index);
+    }
+
+    /**
+     * Waits for a dialog to show. Wait for a dialog that meets the search
+     * criteria applied by the {@code ComponentChooser} parameter to show
+     * up.
+     *
+     * @param ch A component chooser used to define and apply the search
+     * criteria.
+     * @return a reference to the first dialog that shows and that meets the
+     * search criteria. If no such dialog can be found within the time period
+     * allotted, a {@code null} reference is returned.
+     * @throws TimeoutExpiredException
+     * @see org.netbeans.jemmy.WindowWaiter#actionProduced(Object)
+     * @exception InterruptedException
+     */
+    public Dialog waitDialog(ComponentChooser ch)
+            throws InterruptedException {
+        return waitDialog(ch, 0);
+    }
+
+    /**
+     * Waits for a dialog to show. Wait for the {@code index+1}'th dialog
+     * to show with a suitable title.
+     *
+     * @param title Dialog title or subtitle.
+     * @param compareExactly If {@code true} and the search is case
+     * sensitive, then a match occurs when the {@code title} argument is a
+     * substring of a dialog title. If {@code false} and the search is case
+     * sensitive, then the {@code title} argument and the dialog title must
+     * be the same. If {@code true} and the search is case insensitive,
+     * then a match occurs when the {@code title} argument is a substring
+     * of the dialog title after changing both to upper case. If
+     * {@code false} and the search is case insensitive, then a match
+     * occurs when the {@code title} argument is a substring of the dialog
+     * title after changing both to upper case.
+     * @param compareCaseSensitive If {@code true} the search is case
+     * sensitive; otherwise, the search is case insensitive.
+     * @param index The ordinal index of the dialog in the set of currently
+     * displayed dialogs with the proper window ownership and a suitable title.
+     * The first index is 0.
+     * @return a reference to the {@code index+1}'th dialog to show and
+     * that has a suitable title. If no such dialog can be found within the time
+     * period allotted, a {@code null} reference is returned.
+     * @throws TimeoutExpiredException
+     * @see org.netbeans.jemmy.WindowWaiter#actionProduced(Object)
+     * @exception InterruptedException
+     */
+    public Dialog waitDialog(String title, boolean compareExactly, boolean compareCaseSensitive, int index)
+            throws InterruptedException {
+        return waitDialog(new DialogByTitleChooser(title, compareExactly, compareCaseSensitive), index);
+    }
+
+    /**
+     * Waits for a dialog to show. Wait for the first dialog to show with a
+     * suitable title.
+     *
+     * @param title Dialog title or subtitle.
+     * @param compareExactly If {@code true} and the search is case
+     * sensitive, then a match occurs when the {@code title} argument is a
+     * substring of a dialog title. If {@code false} and the search is case
+     * sensitive, then the {@code title} argument and the dialog title must
+     * be the same. If {@code true} and the search is case insensitive,
+     * then a match occurs when the {@code title} argument is a substring
+     * of the dialog title after changing both to upper case. If
+     * {@code false} and the search is case insensitive, then a match
+     * occurs when the {@code title} argument is a substring of the dialog
+     * title after changing both to upper case.
+     * @param compareCaseSensitive If {@code true} the search is case
+     * sensitive; otherwise, the search is case insensitive.
+     * @return a reference to the first dialog to show and that has a suitable
+     * title. If no such dialog can be found within the time period allotted, a
+     * {@code null} reference is returned.
+     * @throws TimeoutExpiredException
+     * @see org.netbeans.jemmy.WindowWaiter#actionProduced(Object)
+     * @exception InterruptedException
+     */
+    public Dialog waitDialog(String title, boolean compareExactly, boolean compareCaseSensitive)
+            throws InterruptedException {
+        return waitDialog(title, compareExactly, compareCaseSensitive, 0);
+    }
+
+    /**
+     * Waits for a dialog to show. Wait for the {@code index+1}'th dialog
+     * to show that is both owned by the {@code java.awt.Window}
+     * {@code owner} and that meets the criteria defined and applied by the
+     * {@code ComponentChooser} parameter.
+     *
+     * @param owner The owner window of all the dialogs to be searched.
+     * @param ch A component chooser used to define and apply the search
+     * criteria.
+     * @param index The ordinal index of the dialog in the set of currently
+     * displayed dialogs with the proper window ownership and a suitable title.
+     * The first index is 0.
+     * @return a reference to the {@code index+1}'th dialog to show that
+     * has the proper window ownership, and that meets the search criteria. If
+     * there are fewer than {@code index+1} dialogs, a {@code null}
+     * reference is returned.
+     * @throws TimeoutExpiredException
+     * @see org.netbeans.jemmy.WindowWaiter#actionProduced(Object)
+     * @exception InterruptedException
+     */
+    public Dialog waitDialog(Window owner, ComponentChooser ch, int index)
+            throws InterruptedException {
+        setTimeouts(timeouts);
+        return (Dialog) waitWindow(owner, new DialogSubChooser(ch), index);
+    }
+
+    /**
+     * Waits for a dialog to show. Wait for the first dialog to show that is
+     * both owned by the {@code java.awt.Window} {@code owner} and
+     * that meets the criteria defined and applied by the
+     * {@code ComponentChooser} parameter.
+     *
+     * @param owner The owner window of all the dialogs to be searched.
+     * @param ch A component chooser used to define and apply the search
+     * criteria.
+     * @return a reference to the first dialog to show that has the proper
+     * window ownership, and that meets the search criteria. If there is no such
+     * dialog, a {@code null} reference is returned.
+     * @throws TimeoutExpiredException
+     * @see org.netbeans.jemmy.WindowWaiter#actionProduced(Object)
+     * @exception InterruptedException
+     */
+    public Dialog waitDialog(Window owner, ComponentChooser ch)
+            throws InterruptedException {
+        return waitDialog(owner, ch, 0);
+    }
+
+    /**
+     * Waits for a dialog to show. Wait for the {@code index+1}'th dialog
+     * to show with the proper owner and a suitable title.
+     *
+     * @param owner The owner window of all the dialogs to be searched.
+     * @param title Dialog title or subtitle.
+     * @param compareExactly If {@code true} and the search is case
+     * sensitive, then a match occurs when the {@code title} argument is a
+     * substring of a dialog title. If {@code false} and the search is case
+     * sensitive, then the {@code title} argument and the dialog title must
+     * be the same. If {@code true} and the search is case insensitive,
+     * then a match occurs when the {@code title} argument is a substring
+     * of the dialog title after changing both to upper case. If
+     * {@code false} and the search is case insensitive, then a match
+     * occurs when the {@code title} argument is a substring of the dialog
+     * title after changing both to upper case.
+     * @param compareCaseSensitive If {@code true} the search is case
+     * sensitive; otherwise, the search is case insensitive.
+     * @param index Ordinal index between appropriate dialogs
+     * @return a reference to the {@code index+1}'th dialog to show that
+     * has both the proper owner window and a suitable title. If no such dialog
+     * can be found within the time period allotted, a {@code null}
+     * reference is returned.
+     * @throws TimeoutExpiredException
+     * @see org.netbeans.jemmy.WindowWaiter#actionProduced(Object)
+     * @exception InterruptedException
+     */
+    public Dialog waitDialog(Window owner, String title, boolean compareExactly, boolean compareCaseSensitive, int index)
+            throws InterruptedException {
+        return waitDialog(owner, new DialogByTitleChooser(title, compareExactly, compareCaseSensitive), index);
+    }
+
+    /**
+     * Waits for a dialog to show. Wait for the first dialog to show with the
+     * proper owner and a suitable title.
+     *
+     * @see org.netbeans.jemmy.WindowWaiter#actionProduced(Object)
+     * @param owner The owner window of all the dialogs to be searched.
+     * @param title Dialog title or subtitle.
+     * @param compareExactly If {@code true} and the search is case
+     * sensitive, then a match occurs when the {@code title} argument is a
+     * substring of a dialog title. If {@code false} and the search is case
+     * sensitive, then the {@code title} argument and the dialog title must
+     * be the same. If {@code true} and the search is case insensitive,
+     * then a match occurs when the {@code title} argument is a substring
+     * of the dialog title after changing both to upper case. If
+     * {@code false} and the search is case insensitive, then a match
+     * occurs when the {@code title} argument is a substring of the dialog
+     * title after changing both to upper case.
+     * @param compareCaseSensitive If {@code true} the search is case
+     * sensitive; otherwise, the search is case insensitive.
+     * @return a reference to the first dialog to show and that has both the
+     * proper owner and a suitable title. If no such dialog can be found within
+     * the time period allotted, a {@code null} reference is returned.
+     * @throws TimeoutExpiredException
+     * @exception InterruptedException
+     */
+    public Dialog waitDialog(Window owner, String title, boolean compareExactly, boolean compareCaseSensitive)
+            throws InterruptedException {
+        return waitDialog(owner, title, compareExactly, compareCaseSensitive, 0);
+    }
+
+    /**
+     * @see org.netbeans.jemmy.Waiter#getWaitingStartedMessage()
+     */
+    @Override
+    protected String getWaitingStartedMessage() {
+        return "Start to wait dialog \"" + getComponentChooser().getDescription() + "\" opened";
+    }
+
+    /**
+     * Overrides WindowWaiter.getTimeoutExpiredMessage. Returns the timeout
+     * expired message value.
+     *
+     * @see org.netbeans.jemmy.Waiter#getTimeoutExpiredMessage(long)
+     * @param spendedTime Time spent for waiting
+     * @return A message string.
+     */
+    @Override
+    protected String getTimeoutExpiredMessage(long spendedTime) {
+        return ("Dialog \"" + getComponentChooser().getDescription() + "\" has not been opened in "
+                + spendedTime + " milliseconds");
+    }
+
+    /**
+     * Overrides WindowWaiter.getActionProducedMessage. Returns the action
+     * produced message value.
+     *
+     * @see org.netbeans.jemmy.Waiter#getActionProducedMessage(long, Object)
+     * @param spendedTime Time spent for waiting
+     * @param result A result of the action
+     * @return A message string.
+     */
+    @Override
+    protected String getActionProducedMessage(long spendedTime, final Object result) {
+        String resultToString;
+        if (result instanceof Component) {
+            // run toString in dispatch thread
+            resultToString = new QueueTool().invokeSmoothly(
+                    new QueueTool.QueueAction<String>("result.toString()") {
+                @Override
+                public String launch() {
+                    return result.toString();
+                }
+            }
+            );
+        } else {
+            resultToString = result.toString();
+        }
+        return ("Dialog \"" + getComponentChooser().getDescription() + "\" has been opened in "
+                + spendedTime + " milliseconds"
+                + "\n    " + resultToString);
+    }
+
+    /**
+     * @see org.netbeans.jemmy.Waiter#getGoldenWaitingStartedMessage()
+     */
+    @Override
+    protected String getGoldenWaitingStartedMessage() {
+        return "Start to wait dialog \"" + getComponentChooser().getDescription() + "\" opened";
+    }
+
+    /**
+     * @see org.netbeans.jemmy.Waiter#getGoldenTimeoutExpiredMessage()
+     */
+    @Override
+    protected String getGoldenTimeoutExpiredMessage() {
+        return "Dialog \"" + getComponentChooser().getDescription() + "\" has not been opened";
+    }
+
+    /**
+     * @see org.netbeans.jemmy.Waiter#getGoldenActionProducedMessage()
+     */
+    @Override
+    protected String getGoldenActionProducedMessage() {
+        return "Dialog \"" + getComponentChooser().getDescription() + "\" has been opened";
+    }
+
+    private static class DialogSubChooser implements ComponentChooser {
+
+        private ComponentChooser chooser;
+
+        public DialogSubChooser(ComponentChooser c) {
+            super();
+            chooser = c;
+        }
+
+        @Override
+        public boolean checkComponent(Component comp) {
+            if (comp instanceof Dialog) {
+                return ((FIND_INVISIBLE_WINDOWS || (comp.isShowing() && comp.isVisible()))
+                        && chooser.checkComponent(comp));
+            } else {
+                return false;
+            }
+        }
+
+        @Override
+        public String getDescription() {
+            return chooser.getDescription();
+        }
+
+        @Override
+        public String toString() {
+            return "DialogSubChooser{" + "chooser=" + chooser + '}';
+        }
+    }
+
+    private static class DialogByTitleChooser implements ComponentChooser {
+
+        String title;
+        boolean compareExactly;
+        boolean compareCaseSensitive;
+
+        public DialogByTitleChooser(String t, boolean ce, boolean cc) {
+            super();
+            title = t;
+            compareExactly = ce;
+            compareCaseSensitive = cc;
+        }
+
+        @Override
+        public boolean checkComponent(Component comp) {
+            if (comp instanceof Dialog) {
+                if ((FIND_INVISIBLE_WINDOWS || (comp.isShowing() && comp.isVisible()))
+                        && ((Dialog) comp).getTitle() != null) {
+                    String titleToComp = ((Dialog) comp).getTitle();
+                    String contextToComp = title;
+                    if (compareCaseSensitive) {
+                        titleToComp = titleToComp.toUpperCase();
+                        contextToComp = contextToComp.toUpperCase();
+                    }
+                    if (compareExactly) {
+                        return titleToComp.equals(contextToComp);
+                    } else {
+                        return titleToComp.contains(contextToComp);
+                    }
+                }
+            }
+            return false;
+        }
+
+        @Override
+        public String getDescription() {
+            return title;
+        }
+
+        @Override
+        public String toString() {
+            return "DialogByTitleChooser{" + "title=" + title + ", compareExactly=" + compareExactly + ", compareCaseSensitive=" + compareCaseSensitive + '}';
+        }
+    }
+}