1 /*
   2  * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package org.netbeans.jemmy.operators;
  24 
  25 import java.awt.Component;
  26 import java.awt.Container;
  27 import java.awt.Rectangle;
  28 import java.beans.PropertyVetoException;
  29 import java.util.Hashtable;
  30 
  31 import javax.swing.Icon;
  32 import javax.swing.JDesktopPane;
  33 import javax.swing.JInternalFrame;
  34 import javax.swing.JLayeredPane;
  35 import javax.swing.JMenuBar;
  36 import javax.swing.JScrollPane;
  37 import javax.swing.JInternalFrame.JDesktopIcon;
  38 import javax.swing.event.InternalFrameListener;
  39 import javax.swing.plaf.InternalFrameUI;
  40 
  41 import org.netbeans.jemmy.ComponentChooser;
  42 import org.netbeans.jemmy.ComponentSearcher;
  43 import org.netbeans.jemmy.JemmyInputException;
  44 import org.netbeans.jemmy.JemmyProperties;
  45 import org.netbeans.jemmy.Outputable;
  46 import org.netbeans.jemmy.TestOut;
  47 import org.netbeans.jemmy.TimeoutExpiredException;
  48 import org.netbeans.jemmy.Timeoutable;
  49 import org.netbeans.jemmy.Timeouts;
  50 import org.netbeans.jemmy.drivers.DriverManager;
  51 import org.netbeans.jemmy.drivers.FrameDriver;
  52 import org.netbeans.jemmy.drivers.InternalFrameDriver;
  53 import org.netbeans.jemmy.drivers.WindowDriver;
  54 import org.netbeans.jemmy.util.EmptyVisualizer;
  55 
  56 /**
  57  * Class provides necessary functionality to operate with
  58  * javax.swing.JInternalFrame component.
  59  *
  60  * Some methods can throw WrongInternalFrameStateException exception.
  61  *
  62  * <BR><BR>Timeouts used: <BR>
  63  * ComponentOperator.WaitComponentTimeout - time to wait component displayed
  64  * <BR>
  65  * ComponentOperator.MouseClickTimeout - time between mouse pressing and
  66  * releasing <BR>
  67  * AbstractButtonOperator.PushButtonTimeout - time between button pressing and
  68  * releasing<BR>
  69  * JScrollBarOperator.WholeScrollTimeout - time for the whole scrolling <BR>.
  70  *
  71  * @see org.netbeans.jemmy.Timeouts
  72  * @see WrongInternalFrameStateException
  73  * @author Alexandre Iline (alexandre.iline@oracle.com)
  74  */
  75 public class JInternalFrameOperator extends JComponentOperator
  76         implements Outputable, Timeoutable {
  77 
  78     /**
  79      * Identifier for a "title" property.
  80      *
  81      * @see #getDump
  82      */
  83     public static final String TITLE_DPROP = "Title";
  84 
  85     /**
  86      * Identifier for a "state" property.
  87      *
  88      * @see #getDump
  89      */
  90     public static final String STATE_DPROP = "State";
  91 
  92     /**
  93      * Identifier for a "normal" value of "state" property.
  94      *
  95      * @see #getDump
  96      */
  97     public static final String STATE_NORMAL_DPROP_VALUE = "NORMAL";
  98 
  99     /**
 100      * Identifier for a "closed" value of "state" property.
 101      *
 102      * @see #getDump
 103      */
 104     public static final String STATE_CLOSED_DPROP_VALUE = "CLOSED";
 105 
 106     /**
 107      * Identifier for a "iconified" value of "state" property.
 108      *
 109      * @see #getDump
 110      */
 111     public static final String STATE_ICONIFIED_DPROP_VALUE = "ICONIFIED";
 112 
 113     /**
 114      * Identifier for a "maximized" value of "state" property.
 115      *
 116      * @see #getDump
 117      */
 118     public static final String STATE_MAXIMAZED_DPROP_VALUE = "MAXIMIZED";
 119 
 120     /**
 121      * Identifier for a "resizable" property.
 122      *
 123      * @see #getDump
 124      */
 125     public static final String IS_RESIZABLE_DPROP = "Resizable";
 126 
 127     /**
 128      * Identifier for a "selected" property.
 129      *
 130      * @see #getDump
 131      */
 132     public static final String IS_SELECTED_DPROP = "Selected";
 133 
 134     /**
 135      * A minimizing button.
 136      */
 137     protected JButtonOperator minOper = null;
 138 
 139     /**
 140      * A maximizing button.
 141      */
 142     protected JButtonOperator maxOper = null;
 143 
 144     /**
 145      * A close button.
 146      */
 147     protected JButtonOperator closeOper = null;
 148 
 149     /**
 150      * A title operator.
 151      */
 152     protected ContainerOperator<?> titleOperator = null;
 153     private TestOut output;
 154     private Timeouts timeouts;
 155     private JDesktopIconOperator iconOperator;
 156 
 157     WindowDriver wDriver;
 158     FrameDriver fDriver;
 159     InternalFrameDriver iDriver;
 160 
 161     /**
 162      * Constructor.
 163      *
 164      * @param b a component
 165      */
 166     public JInternalFrameOperator(JInternalFrame b) {
 167         super(b);
 168         wDriver = DriverManager.getWindowDriver(getClass());
 169         fDriver = DriverManager.getFrameDriver(getClass());
 170         iDriver = DriverManager.getInternalFrameDriver(getClass());
 171     }
 172 
 173     /**
 174      * Constructs a JInternalFrameOperator object.
 175      *
 176      * @param cont a container
 177      * @param chooser a component chooser specifying searching criteria.
 178      * @param index an index between appropriate ones.
 179      */
 180     public JInternalFrameOperator(ContainerOperator<?> cont, ComponentChooser chooser, int index) {
 181         this((JInternalFrame) cont.
 182                 waitSubComponent(new JInternalFrameFinder(chooser),
 183                         index));
 184         copyEnvironment(cont);
 185     }
 186 
 187     /**
 188      * Constructs a JInternalFrameOperator object.
 189      *
 190      * @param cont a container
 191      * @param chooser a component chooser specifying searching criteria.
 192      */
 193     public JInternalFrameOperator(ContainerOperator<?> cont, ComponentChooser chooser) {
 194         this(cont, chooser, 0);
 195     }
 196 
 197     /**
 198      * Constructor. Waits component in container first. Uses cont's timeout and
 199      * output for waiting and to init operator.
 200      *
 201      * @param cont a container
 202      * @param text Button text.
 203      * @param index Ordinal component index.
 204      * @see ComponentOperator#isCaptionEqual(String, String, boolean, boolean)
 205      *
 206      */
 207     public JInternalFrameOperator(ContainerOperator<?> cont, String text, int index) {
 208         this(findOne(cont, text, index));
 209         copyEnvironment(cont);
 210     }
 211 
 212     /**
 213      * Constructor. Waits component in container first. Uses cont's timeout and
 214      * output for waiting and to init operator.
 215      *
 216      * @param cont a container
 217      * @param text Button text.
 218      * @see ComponentOperator#isCaptionEqual(String, String, boolean, boolean)
 219      *
 220      */
 221     public JInternalFrameOperator(ContainerOperator<?> cont, String text) {
 222         this(cont, text, 0);
 223     }
 224 
 225     /**
 226      * Constructor. Waits component in container first. Uses cont's timeout and
 227      * output for waiting and to init operator.
 228      *
 229      * @param cont a container
 230      * @param index Ordinal component index.
 231      *
 232      */
 233     public JInternalFrameOperator(ContainerOperator<?> cont, int index) {
 234         this((JInternalFrame) waitComponent(cont,
 235                 new JInternalFrameFinder(),
 236                 index));
 237         copyEnvironment(cont);
 238     }
 239 
 240     /**
 241      * Constructor. Waits component in container first. Uses cont's timeout and
 242      * output for waiting and to init operator.
 243      *
 244      * @param cont a container
 245      *
 246      */
 247     public JInternalFrameOperator(ContainerOperator<?> cont) {
 248         this(cont, 0);
 249     }
 250 
 251     /**
 252      * Searches JInternalframe in container.
 253      *
 254      * @param cont Container to search component in.
 255      * @param chooser a component chooser specifying searching criteria.
 256      * @param index Ordinal component index.
 257      * @return JInternalframe instance or null if component was not found.
 258      */
 259     public static JInternalFrame findJInternalFrame(Container cont, ComponentChooser chooser, int index) {
 260         Component res = findComponent(cont, new JInternalFrameFinder(chooser), index);
 261         if (res instanceof JInternalFrame) {
 262             return (JInternalFrame) res;
 263         } else if (res instanceof JInternalFrame.JDesktopIcon) {
 264             return ((JInternalFrame.JDesktopIcon) res).getInternalFrame();
 265         } else {
 266             return null;
 267         }
 268     }
 269 
 270     /**
 271      * Searches JInternalframe in container.
 272      *
 273      * @param cont Container to search component in.
 274      * @param chooser a component chooser specifying searching criteria.
 275      * @return JInternalframe instance or null if component was not found.
 276      */
 277     public static JInternalFrame findJInternalFrame(Container cont, ComponentChooser chooser) {
 278         return findJInternalFrame(cont, chooser, 0);
 279     }
 280 
 281     /**
 282      * Searches JInternalframe by title.
 283      *
 284      * @param cont Container to search component in.
 285      * @param text Component text.
 286      * @param ce Compare text exactly.
 287      * @param ccs Compare text case sensitively.
 288      * @param index Ordinal component index.
 289      * @return JInternalframe instance or null if component was not found.
 290      * @see ComponentOperator#isCaptionEqual(String, String, boolean, boolean)
 291      */
 292     public static JInternalFrame findJInternalFrame(Container cont, String text, boolean ce, boolean ccs, int index) {
 293         return (findJInternalFrame(cont,
 294                 new JInternalFrameByTitleFinder(text,
 295                         new DefaultStringComparator(ce, ccs)),
 296                 index));
 297     }
 298 
 299     /**
 300      * Searches JInternalframe by title.
 301      *
 302      * @param cont Container to search component in.
 303      * @param text Component text.
 304      * @param ce Compare text exactly.
 305      * @param ccs Compare text case sensitively.
 306      * @return JInternalframe instance or null if component was not found.
 307      * @see ComponentOperator#isCaptionEqual(String, String, boolean, boolean)
 308      */
 309     public static JInternalFrame findJInternalFrame(Container cont, String text, boolean ce, boolean ccs) {
 310         return findJInternalFrame(cont, text, ce, ccs, 0);
 311     }
 312 
 313     /**
 314      * Searches JInternalFrame object which component lies on.
 315      *
 316      * @param comp Component to find JInternalFrame under.
 317      * @param chooser org.netbeans.jemmy.ComponentChooser implementation.
 318      * @return JInternalFrame instance or null if component was not found.
 319      */
 320     public static JInternalFrame findJInternalFrameUnder(Component comp, ComponentChooser chooser) {
 321         return (JInternalFrame) findContainerUnder(comp, new JInternalFrameFinder(chooser));
 322     }
 323 
 324     /**
 325      * Searches JInternalFrame object which component lies on.
 326      *
 327      * @param comp Component to find JInternalFrame under.
 328      * @return JInternalFrame instance or null if component was not found.
 329      */
 330     public static JInternalFrame findJInternalFrameUnder(Component comp) {
 331         return findJInternalFrameUnder(comp, new JInternalFrameFinder());
 332     }
 333 
 334     /**
 335      * Waits JInternalframe in container.
 336      *
 337      * @param cont Container to search component in.
 338      * @param chooser a component chooser specifying searching criteria.
 339      * @param index Ordinal component index.
 340      * @return JInternalframe instance.
 341      *
 342      */
 343     public static JInternalFrame waitJInternalFrame(final Container cont, final ComponentChooser chooser, final int index) {
 344         Component res = waitComponent(cont, new JInternalFrameFinder(chooser), index);
 345         if (res instanceof JInternalFrame) {
 346             return (JInternalFrame) res;
 347         } else if (res instanceof JInternalFrame.JDesktopIcon) {
 348             return ((JInternalFrame.JDesktopIcon) res).getInternalFrame();
 349         } else {
 350             throw (new TimeoutExpiredException(chooser.getDescription()));
 351         }
 352     }
 353 
 354     /**
 355      * Waits JInternalframe in container.
 356      *
 357      * @param cont Container to search component in.
 358      * @param chooser a component chooser specifying searching criteria.
 359      * @return JInternalframe instance.
 360      *
 361      */
 362     public static JInternalFrame waitJInternalFrame(Container cont, ComponentChooser chooser) {
 363         return waitJInternalFrame(cont, chooser, 0);
 364     }
 365 
 366     /**
 367      * Waits JInternalframe by title.
 368      *
 369      * @param cont Container to search component in.
 370      * @param text Component text.
 371      * @param ce Compare text exactly.
 372      * @param ccs Compare text case sensitively.
 373      * @param index Ordinal component index.
 374      * @return JInternalframe instance.
 375      * @see ComponentOperator#isCaptionEqual(String, String, boolean, boolean)
 376      *
 377      */
 378     public static JInternalFrame waitJInternalFrame(Container cont, String text, boolean ce, boolean ccs, int index) {
 379         return (waitJInternalFrame(cont,
 380                 new JInternalFrameByTitleFinder(text,
 381                         new DefaultStringComparator(ce, ccs)),
 382                 index));
 383     }
 384 
 385     /**
 386      * Waits JInternalframe by title.
 387      *
 388      * @param cont Container to search component in.
 389      * @param text Component text.
 390      * @param ce Compare text exactly.
 391      * @param ccs Compare text case sensitively.
 392      * @return JInternalframe instance.
 393      * @see ComponentOperator#isCaptionEqual(String, String, boolean, boolean)
 394      *
 395      */
 396     public static JInternalFrame waitJInternalFrame(Container cont, String text, boolean ce, boolean ccs) {
 397         return waitJInternalFrame(cont, text, ce, ccs, 0);
 398     }
 399 
 400     @Override
 401     public void setOutput(TestOut out) {
 402         output = out;
 403         super.setOutput(output.createErrorOutput());
 404     }
 405 
 406     @Override
 407     public TestOut getOutput() {
 408         return output;
 409     }
 410 
 411     @Override
 412     public void setTimeouts(Timeouts times) {
 413         timeouts = times;
 414         super.setTimeouts(timeouts);
 415     }
 416 
 417     @Override
 418     public Timeouts getTimeouts() {
 419         return timeouts;
 420     }
 421 
 422     /**
 423      * Iconifies frame. Note: frame should not be iconified and should be
 424      * iconifiable.
 425      *
 426      * @throws WrongInternalFrameStateException
 427      *
 428      */
 429     public void iconify() {
 430         output.printLine("Iconify JInternalFrame\n    : " + toStringSource());
 431         output.printGolden("Iconify JInternalFrame \"" + getTitle() + "\"");
 432         checkIconified(false);
 433         makeComponentVisible();
 434         fDriver.iconify(this);
 435         if (getVerification()) {
 436             waitIcon(true);
 437         }
 438     }
 439 
 440     /**
 441      * Deiconifies frame. Note: frame should be iconified.
 442      *
 443      * @throws WrongInternalFrameStateException
 444      *
 445      */
 446     public void deiconify() {
 447         output.printLine("Deiconify JInternalFrame\n    : " + toStringSource());
 448         output.printGolden("Deiconify JInternalFrame \"" + getTitle() + "\"");
 449         checkIconified(true);
 450         fDriver.deiconify(this);
 451         if (getVerification()) {
 452             waitIcon(false);
 453         }
 454     }
 455 
 456     /**
 457      * Maximizes frame. Note: frame should not be iconified.
 458      *
 459      * @throws WrongInternalFrameStateException
 460      */
 461     public void maximize() {
 462         output.printLine("Maximize JInternalFrame\n    : " + toStringSource());
 463         output.printGolden("Maximize JInternalFrame \"" + getTitle() + "\"");
 464         checkIconified(false);
 465         makeComponentVisible();
 466         fDriver.maximize(this);
 467         if (getVerification()) {
 468             waitMaximum(true);
 469         }
 470     }
 471 
 472     /**
 473      * Demaximizes frame. Note: frame should not be iconified.
 474      *
 475      * @throws WrongInternalFrameStateException
 476      */
 477     public void demaximize() {
 478         output.printLine("Demaximize JInternalFrame\n    : " + toStringSource());
 479         output.printGolden("Demaximize JInternalFrame \"" + getTitle() + "\"");
 480         checkIconified(false);
 481         makeComponentVisible();
 482         fDriver.demaximize(this);
 483         if (getVerification()) {
 484             waitMaximum(false);
 485         }
 486     }
 487 
 488     /**
 489      * Moves frame to new location. Note: frame should not be iconified.
 490      *
 491      * @param x X coordinate of a new frame location.
 492      * @param y Y coordinate of a new frame location.
 493      * @throws WrongInternalFrameStateException
 494      */
 495     public void move(int x, int y) {
 496         checkIconified(false);
 497         output.printLine("Move JInternalFrame to ("
 498                 + Integer.toString(x) + ","
 499                 + Integer.toString(y) + ")"
 500                 + " position\n    : " + toStringSource());
 501         output.printGolden("Move " + getTitle()
 502                 + " JInternalFrame to ("
 503                 + Integer.toString(x) + ","
 504                 + Integer.toString(y) + ")"
 505                 + " position");
 506         checkIconified(false);
 507         wDriver.move(this, x, y);
 508     }
 509 
 510     /**
 511      * Resizes frame. Note: frame should not be iconified.
 512      *
 513      * @param width New frame width.
 514      * @param height New frame height.
 515      * @throws WrongInternalFrameStateException
 516      */
 517     public void resize(int width, int height) {
 518         output.printLine("Resize JInternalFrame to ("
 519                 + Integer.toString(width) + ","
 520                 + Integer.toString(height) + ")"
 521                 + " size\n    : " + toStringSource());
 522         output.printGolden("Resize " + getTitle()
 523                 + " JInternalFrame to ("
 524                 + Integer.toString(width) + ","
 525                 + Integer.toString(height) + ")"
 526                 + " size");
 527         checkIconified(false);
 528         wDriver.resize(this, width, height);
 529     }
 530 
 531     /**
 532      * Activates frame. Note: frame should not be iconified.
 533      *
 534      * @throws WrongInternalFrameStateException
 535      */
 536     public void activate() {
 537         checkIconified(false);
 538         wDriver.activate(this);
 539     }
 540 
 541     /**
 542      * Closes the frame.
 543      */
 544     public void close() {
 545         checkIconified(false);
 546         wDriver.requestClose(this);
 547     }
 548 
 549     /**
 550      * Scrolls to internal frame's rectangle.
 551      *
 552      * @param x Horizontal rectangle coordinate
 553      * @param y Vertical rectangle coordinate
 554      * @param width rectangle width
 555      * @param height rectangle height
 556      *
 557      */
 558     public void scrollToRectangle(int x, int y, int width, int height) {
 559         output.printTrace("Scroll desktop pane to make \"" + getTitle() + "\" internal frame visible");
 560         output.printGolden("Scroll desktop pane to make \"" + getTitle() + "\" internal frame visible");
 561         makeComponentVisible();
 562         //try to find JScrollPane under.
 563         JScrollPane scroll;
 564         if (isIcon()) {
 565             scroll
 566                     = (JScrollPane) iconOperator.getContainer(new JScrollPaneOperator.JScrollPaneFinder(ComponentSearcher.
 567                             getTrueChooser("JScrollPane")));
 568         } else {
 569             scroll
 570                     = (JScrollPane) getContainer(new JScrollPaneOperator.JScrollPaneFinder(ComponentSearcher.
 571                             getTrueChooser("JScrollPane")));
 572         }
 573         if (scroll == null) {
 574             return;
 575         }
 576         JScrollPaneOperator scroller = new JScrollPaneOperator(scroll);
 577         scroller.copyEnvironment(this);
 578         scroller.setVisualizer(new EmptyVisualizer());
 579         scroller.scrollToComponentRectangle(isIcon() ? iconOperator.getSource() : getSource(),
 580                 x, y, width, height);
 581     }
 582 
 583     /**
 584      * Scrolls to internal frame's rectangle.
 585      *
 586      * @param rect a rectangle to scroll to.
 587      */
 588     public void scrollToRectangle(Rectangle rect) {
 589         scrollToRectangle(rect.x, rect.y, rect.width, rect.height);
 590     }
 591 
 592     /**
 593      * Scrolls to internal frame.
 594      *
 595      */
 596     public void scrollToFrame() {
 597         if (isIcon()) {
 598             scrollToRectangle(0, 0, iconOperator.getWidth(), iconOperator.getHeight());
 599         } else {
 600             scrollToRectangle(0, 0, getWidth(), getHeight());
 601         }
 602     }
 603 
 604     /**
 605      * Waits for a minimize button inside the title pane.
 606      *
 607      * @return a button operator
 608      */
 609     public JButtonOperator getMinimizeButton() {
 610         initOperators();
 611         return minOper;
 612     }
 613 
 614     /**
 615      * Waits for a maximize button inside the title pane.
 616      *
 617      * @return a button operator
 618      */
 619     public JButtonOperator getMaximizeButton() {
 620         initOperators();
 621         return maxOper;
 622     }
 623 
 624     /**
 625      * Waits for a close button inside the title pane.
 626      *
 627      * @return a button operator
 628      */
 629     public JButtonOperator getCloseButton() {
 630         initOperators();
 631         return closeOper;
 632     }
 633 
 634     /**
 635      * Waits for the title pane.
 636      *
 637      * @return a button operator
 638      */
 639     public ContainerOperator<?> getTitleOperator() {
 640         initOperators();
 641         return titleOperator;
 642     }
 643 
 644     /**
 645      * Creates an operator for an desktop icon.
 646      *
 647      * @return an icon operator.
 648      */
 649     public JDesktopIconOperator getIconOperator() {
 650         initOperators();
 651         return iconOperator;
 652     }
 653 
 654     /**
 655      * Waits for the frame to be iconified or deiconified.
 656      *
 657      * @param icon whether the frame needs to be iconified.
 658      */
 659     public void waitIcon(final boolean icon) {
 660         waitState(new ComponentChooser() {
 661             @Override
 662             public boolean checkComponent(Component comp) {
 663                 return ((JInternalFrame) comp).isIcon() == icon;
 664             }
 665 
 666             @Override
 667             public String getDescription() {
 668                 return "Iconified JInternalFrame";
 669             }
 670 
 671             @Override
 672             public String toString() {
 673                 return "JInternalFrameOperator.waitIcon.ComponentChooser{description = " + getDescription() + '}';
 674             }
 675         });
 676     }
 677 
 678     /**
 679      * Waits for the frame to be maximized or demaximized.
 680      *
 681      * @param maximum whether the frame needs to be maximized.
 682      */
 683     public void waitMaximum(final boolean maximum) {
 684         waitState(new ComponentChooser() {
 685             @Override
 686             public boolean checkComponent(Component comp) {
 687                 return ((JInternalFrame) comp).isMaximum() == maximum;
 688             }
 689 
 690             @Override
 691             public String getDescription() {
 692                 return "Maximizied JInternalFrame";
 693             }
 694 
 695             @Override
 696             public String toString() {
 697                 return "JInternalFrameOperator.waitMaximum.ComponentChooser{description = " + getDescription() + '}';
 698             }
 699         });
 700     }
 701 
 702     /**
 703      * Returns information about component.
 704      */
 705     @Override
 706     public Hashtable<String, Object> getDump() {
 707         Hashtable<String, Object> result = super.getDump();
 708         result.put(TITLE_DPROP, ((JInternalFrame) getSource()).getTitle());
 709         String state = STATE_NORMAL_DPROP_VALUE;
 710         if (((JInternalFrame) getSource()).isClosed()) {
 711             state = STATE_CLOSED_DPROP_VALUE;
 712         } else if (((JInternalFrame) getSource()).isIcon()) {
 713             state = STATE_ICONIFIED_DPROP_VALUE;
 714         } else if (((JInternalFrame) getSource()).isMaximum()) {
 715             state = STATE_MAXIMAZED_DPROP_VALUE;
 716         }
 717         result.put(STATE_DPROP, state);
 718         result.put(IS_RESIZABLE_DPROP, ((JInternalFrame) getSource()).isResizable() ? "true" : "false");
 719         result.put(IS_SELECTED_DPROP, ((JInternalFrame) getSource()).isSelected() ? "true" : "false");
 720         return result;
 721     }
 722 
 723     ////////////////////////////////////////////////////////
 724     //Mapping                                             //
 725     /**
 726      * Maps
 727      * {@code JInternalFrame.addInternalFrameListener(InternalFrameListener)}
 728      * through queue
 729      */
 730     public void addInternalFrameListener(final InternalFrameListener internalFrameListener) {
 731         runMapping(new MapVoidAction("addInternalFrameListener") {
 732             @Override
 733             public void map() {
 734                 ((JInternalFrame) getSource()).addInternalFrameListener(internalFrameListener);
 735             }
 736         });
 737     }
 738 
 739     /**
 740      * Maps {@code JInternalFrame.dispose()} through queue
 741      */
 742     public void dispose() {
 743         runMapping(new MapVoidAction("dispose") {
 744             @Override
 745             public void map() {
 746                 ((JInternalFrame) getSource()).dispose();
 747             }
 748         });
 749     }
 750 
 751     /**
 752      * Maps {@code JInternalFrame.getContentPane()} through queue
 753      */
 754     public Container getContentPane() {
 755         return (runMapping(new MapAction<Container>("getContentPane") {
 756             @Override
 757             public Container map() {
 758                 return ((JInternalFrame) getSource()).getContentPane();
 759             }
 760         }));
 761     }
 762 
 763     /**
 764      * Maps {@code JInternalFrame.getDefaultCloseOperation()} through queue
 765      */
 766     public int getDefaultCloseOperation() {
 767         return (runMapping(new MapIntegerAction("getDefaultCloseOperation") {
 768             @Override
 769             public int map() {
 770                 return ((JInternalFrame) getSource()).getDefaultCloseOperation();
 771             }
 772         }));
 773     }
 774 
 775     /**
 776      * Maps {@code JInternalFrame.getDesktopIcon()} through queue
 777      */
 778     public JDesktopIcon getDesktopIcon() {
 779         return (runMapping(new MapAction<JDesktopIcon>("getDesktopIcon") {
 780             @Override
 781             public JDesktopIcon map() {
 782                 return ((JInternalFrame) getSource()).getDesktopIcon();
 783             }
 784         }));
 785     }
 786 
 787     /**
 788      * Maps {@code JInternalFrame.getDesktopPane()} through queue
 789      */
 790     public JDesktopPane getDesktopPane() {
 791         return (runMapping(new MapAction<JDesktopPane>("getDesktopPane") {
 792             @Override
 793             public JDesktopPane map() {
 794                 return ((JInternalFrame) getSource()).getDesktopPane();
 795             }
 796         }));
 797     }
 798 
 799     /**
 800      * Maps {@code JInternalFrame.getFrameIcon()} through queue
 801      */
 802     public Icon getFrameIcon() {
 803         return (runMapping(new MapAction<Icon>("getFrameIcon") {
 804             @Override
 805             public Icon map() {
 806                 return ((JInternalFrame) getSource()).getFrameIcon();
 807             }
 808         }));
 809     }
 810 
 811     /**
 812      * Maps {@code JInternalFrame.getGlassPane()} through queue
 813      */
 814     public Component getGlassPane() {
 815         return (runMapping(new MapAction<Component>("getGlassPane") {
 816             @Override
 817             public Component map() {
 818                 return ((JInternalFrame) getSource()).getGlassPane();
 819             }
 820         }));
 821     }
 822 
 823     /**
 824      * Maps {@code JInternalFrame.getJMenuBar()} through queue
 825      */
 826     public JMenuBar getJMenuBar() {
 827         return (runMapping(new MapAction<JMenuBar>("getJMenuBar") {
 828             @Override
 829             public JMenuBar map() {
 830                 return ((JInternalFrame) getSource()).getJMenuBar();
 831             }
 832         }));
 833     }
 834 
 835     /**
 836      * Maps {@code JInternalFrame.getLayer()} through queue
 837      */
 838     public int getLayer() {
 839         return (runMapping(new MapIntegerAction("getLayer") {
 840             @Override
 841             public int map() {
 842                 return ((JInternalFrame) getSource()).getLayer();
 843             }
 844         }));
 845     }
 846 
 847     /**
 848      * Maps {@code JInternalFrame.getLayeredPane()} through queue
 849      */
 850     public JLayeredPane getLayeredPane() {
 851         return (runMapping(new MapAction<JLayeredPane>("getLayeredPane") {
 852             @Override
 853             public JLayeredPane map() {
 854                 return ((JInternalFrame) getSource()).getLayeredPane();
 855             }
 856         }));
 857     }
 858 
 859     /**
 860      * Maps {@code JInternalFrame.getTitle()} through queue
 861      */
 862     public String getTitle() {
 863         return (runMapping(new MapAction<String>("getTitle") {
 864             @Override
 865             public String map() {
 866                 return ((JInternalFrame) getSource()).getTitle();
 867             }
 868         }));
 869     }
 870 
 871     /**
 872      * Maps {@code JInternalFrame.getUI()} through queue
 873      */
 874     public InternalFrameUI getUI() {
 875         return (runMapping(new MapAction<InternalFrameUI>("getUI") {
 876             @Override
 877             public InternalFrameUI map() {
 878                 return ((JInternalFrame) getSource()).getUI();
 879             }
 880         }));
 881     }
 882 
 883     /**
 884      * Maps {@code JInternalFrame.getWarningString()} through queue
 885      */
 886     public String getWarningString() {
 887         return (runMapping(new MapAction<String>("getWarningString") {
 888             @Override
 889             public String map() {
 890                 return ((JInternalFrame) getSource()).getWarningString();
 891             }
 892         }));
 893     }
 894 
 895     /**
 896      * Maps {@code JInternalFrame.isClosable()} through queue
 897      */
 898     public boolean isClosable() {
 899         return (runMapping(new MapBooleanAction("isClosable") {
 900             @Override
 901             public boolean map() {
 902                 return ((JInternalFrame) getSource()).isClosable();
 903             }
 904         }));
 905     }
 906 
 907     /**
 908      * Maps {@code JInternalFrame.isClosed()} through queue
 909      */
 910     public boolean isClosed() {
 911         return (runMapping(new MapBooleanAction("isClosed") {
 912             @Override
 913             public boolean map() {
 914                 return ((JInternalFrame) getSource()).isClosed();
 915             }
 916         }));
 917     }
 918 
 919     /**
 920      * Maps {@code JInternalFrame.isIcon()} through queue
 921      */
 922     public boolean isIcon() {
 923         return (runMapping(new MapBooleanAction("isIcon") {
 924             @Override
 925             public boolean map() {
 926                 return ((JInternalFrame) getSource()).isIcon();
 927             }
 928         }));
 929     }
 930 
 931     /**
 932      * Maps {@code JInternalFrame.isIconifiable()} through queue
 933      */
 934     public boolean isIconifiable() {
 935         return (runMapping(new MapBooleanAction("isIconifiable") {
 936             @Override
 937             public boolean map() {
 938                 return ((JInternalFrame) getSource()).isIconifiable();
 939             }
 940         }));
 941     }
 942 
 943     /**
 944      * Maps {@code JInternalFrame.isMaximizable()} through queue
 945      */
 946     public boolean isMaximizable() {
 947         return (runMapping(new MapBooleanAction("isMaximizable") {
 948             @Override
 949             public boolean map() {
 950                 return ((JInternalFrame) getSource()).isMaximizable();
 951             }
 952         }));
 953     }
 954 
 955     /**
 956      * Maps {@code JInternalFrame.isMaximum()} through queue
 957      */
 958     public boolean isMaximum() {
 959         return (runMapping(new MapBooleanAction("isMaximum") {
 960             @Override
 961             public boolean map() {
 962                 return ((JInternalFrame) getSource()).isMaximum();
 963             }
 964         }));
 965     }
 966 
 967     /**
 968      * Maps {@code JInternalFrame.isResizable()} through queue
 969      */
 970     public boolean isResizable() {
 971         return (runMapping(new MapBooleanAction("isResizable") {
 972             @Override
 973             public boolean map() {
 974                 return ((JInternalFrame) getSource()).isResizable();
 975             }
 976         }));
 977     }
 978 
 979     /**
 980      * Maps {@code JInternalFrame.isSelected()} through queue
 981      */
 982     public boolean isSelected() {
 983         return (runMapping(new MapBooleanAction("isSelected") {
 984             @Override
 985             public boolean map() {
 986                 return ((JInternalFrame) getSource()).isSelected();
 987             }
 988         }));
 989     }
 990 
 991     /**
 992      * Maps {@code JInternalFrame.moveToBack()} through queue
 993      */
 994     public void moveToBack() {
 995         runMapping(new MapVoidAction("moveToBack") {
 996             @Override
 997             public void map() {
 998                 ((JInternalFrame) getSource()).moveToBack();
 999             }
1000         });
1001     }
1002 
1003     /**
1004      * Maps {@code JInternalFrame.moveToFront()} through queue
1005      */
1006     public void moveToFront() {
1007         runMapping(new MapVoidAction("moveToFront") {
1008             @Override
1009             public void map() {
1010                 ((JInternalFrame) getSource()).moveToFront();
1011             }
1012         });
1013     }
1014 
1015     /**
1016      * Maps {@code JInternalFrame.pack()} through queue
1017      */
1018     public void pack() {
1019         runMapping(new MapVoidAction("pack") {
1020             @Override
1021             public void map() {
1022                 ((JInternalFrame) getSource()).pack();
1023             }
1024         });
1025     }
1026 
1027     /**
1028      * Maps
1029      * {@code JInternalFrame.removeInternalFrameListener(InternalFrameListener)}
1030      * through queue
1031      */
1032     public void removeInternalFrameListener(final InternalFrameListener internalFrameListener) {
1033         runMapping(new MapVoidAction("removeInternalFrameListener") {
1034             @Override
1035             public void map() {
1036                 ((JInternalFrame) getSource()).removeInternalFrameListener(internalFrameListener);
1037             }
1038         });
1039     }
1040 
1041     /**
1042      * Maps {@code JInternalFrame.setClosable(boolean)} through queue
1043      */
1044     public void setClosable(final boolean b) {
1045         runMapping(new MapVoidAction("setClosable") {
1046             @Override
1047             public void map() {
1048                 ((JInternalFrame) getSource()).setClosable(b);
1049             }
1050         });
1051     }
1052 
1053     /**
1054      * Maps {@code JInternalFrame.setClosed(boolean)} through queue
1055      */
1056     public void setClosed(final boolean b) {
1057         runMapping(new MapVoidAction("setClosed") {
1058             @Override
1059             public void map() throws PropertyVetoException {
1060                 ((JInternalFrame) getSource()).setClosed(b);
1061             }
1062         });
1063     }
1064 
1065     /**
1066      * Maps {@code JInternalFrame.setContentPane(Container)} through queue
1067      */
1068     public void setContentPane(final Container container) {
1069         runMapping(new MapVoidAction("setContentPane") {
1070             @Override
1071             public void map() {
1072                 ((JInternalFrame) getSource()).setContentPane(container);
1073             }
1074         });
1075     }
1076 
1077     /**
1078      * Maps {@code JInternalFrame.setDefaultCloseOperation(int)} through queue
1079      */
1080     public void setDefaultCloseOperation(final int i) {
1081         runMapping(new MapVoidAction("setDefaultCloseOperation") {
1082             @Override
1083             public void map() {
1084                 ((JInternalFrame) getSource()).setDefaultCloseOperation(i);
1085             }
1086         });
1087     }
1088 
1089     /**
1090      * Maps {@code JInternalFrame.setDesktopIcon(JDesktopIcon)} through queue
1091      */
1092     public void setDesktopIcon(final JDesktopIcon jDesktopIcon) {
1093         runMapping(new MapVoidAction("setDesktopIcon") {
1094             @Override
1095             public void map() {
1096                 ((JInternalFrame) getSource()).setDesktopIcon(jDesktopIcon);
1097             }
1098         });
1099     }
1100 
1101     /**
1102      * Maps {@code JInternalFrame.setFrameIcon(Icon)} through queue
1103      */
1104     public void setFrameIcon(final Icon icon) {
1105         runMapping(new MapVoidAction("setFrameIcon") {
1106             @Override
1107             public void map() {
1108                 ((JInternalFrame) getSource()).setFrameIcon(icon);
1109             }
1110         });
1111     }
1112 
1113     /**
1114      * Maps {@code JInternalFrame.setGlassPane(Component)} through queue
1115      */
1116     public void setGlassPane(final Component component) {
1117         runMapping(new MapVoidAction("setGlassPane") {
1118             @Override
1119             public void map() {
1120                 ((JInternalFrame) getSource()).setGlassPane(component);
1121             }
1122         });
1123     }
1124 
1125     /**
1126      * Maps {@code JInternalFrame.setIcon(boolean)} through queue
1127      */
1128     public void setIcon(final boolean b) {
1129         runMapping(new MapVoidAction("setIcon") {
1130             @Override
1131             public void map() throws PropertyVetoException {
1132                 ((JInternalFrame) getSource()).setIcon(b);
1133             }
1134         });
1135     }
1136 
1137     /**
1138      * Maps {@code JInternalFrame.setIconifiable(boolean)} through queue
1139      */
1140     public void setIconifiable(final boolean b) {
1141         runMapping(new MapVoidAction("setIconifiable") {
1142             @Override
1143             public void map() {
1144                 ((JInternalFrame) getSource()).setIconifiable(b);
1145             }
1146         });
1147     }
1148 
1149     /**
1150      * Maps {@code JInternalFrame.setJMenuBar(JMenuBar)} through queue
1151      */
1152     public void setJMenuBar(final JMenuBar jMenuBar) {
1153         runMapping(new MapVoidAction("setJMenuBar") {
1154             @Override
1155             public void map() {
1156                 ((JInternalFrame) getSource()).setJMenuBar(jMenuBar);
1157             }
1158         });
1159     }
1160 
1161     /**
1162      * Maps {@code JInternalFrame.setLayer(Integer)} through queue
1163      */
1164     public void setLayer(final Integer integer) {
1165         runMapping(new MapVoidAction("setLayer") {
1166             @Override
1167             public void map() {
1168                 ((JInternalFrame) getSource()).setLayer(integer);
1169             }
1170         });
1171     }
1172 
1173     /**
1174      * Maps {@code JInternalFrame.setLayeredPane(JLayeredPane)} through queue
1175      */
1176     public void setLayeredPane(final JLayeredPane jLayeredPane) {
1177         runMapping(new MapVoidAction("setLayeredPane") {
1178             @Override
1179             public void map() {
1180                 ((JInternalFrame) getSource()).setLayeredPane(jLayeredPane);
1181             }
1182         });
1183     }
1184 
1185     /**
1186      * Maps {@code JInternalFrame.setMaximizable(boolean)} through queue
1187      */
1188     public void setMaximizable(final boolean b) {
1189         runMapping(new MapVoidAction("setMaximizable") {
1190             @Override
1191             public void map() {
1192                 ((JInternalFrame) getSource()).setMaximizable(b);
1193             }
1194         });
1195     }
1196 
1197     /**
1198      * Maps {@code JInternalFrame.setMaximum(boolean)} through queue
1199      */
1200     public void setMaximum(final boolean b) {
1201         runMapping(new MapVoidAction("setMaximum") {
1202             @Override
1203             public void map() throws PropertyVetoException {
1204                 ((JInternalFrame) getSource()).setMaximum(b);
1205             }
1206         });
1207     }
1208 
1209     /**
1210      * Maps {@code JInternalFrame.setResizable(boolean)} through queue
1211      */
1212     public void setResizable(final boolean b) {
1213         runMapping(new MapVoidAction("setResizable") {
1214             @Override
1215             public void map() {
1216                 ((JInternalFrame) getSource()).setResizable(b);
1217             }
1218         });
1219     }
1220 
1221     /**
1222      * Maps {@code JInternalFrame.setSelected(boolean)} through queue
1223      */
1224     public void setSelected(final boolean b) {
1225         runMapping(new MapVoidAction("setSelected") {
1226             @Override
1227             public void map() throws PropertyVetoException {
1228                 ((JInternalFrame) getSource()).setSelected(b);
1229             }
1230         });
1231     }
1232 
1233     /**
1234      * Maps {@code JInternalFrame.setTitle(String)} through queue
1235      */
1236     public void setTitle(final String string) {
1237         runMapping(new MapVoidAction("setTitle") {
1238             @Override
1239             public void map() {
1240                 ((JInternalFrame) getSource()).setTitle(string);
1241             }
1242         });
1243     }
1244 
1245     /**
1246      * Maps {@code JInternalFrame.setUI(InternalFrameUI)} through queue
1247      */
1248     public void setUI(final InternalFrameUI internalFrameUI) {
1249         runMapping(new MapVoidAction("setUI") {
1250             @Override
1251             public void map() {
1252                 ((JInternalFrame) getSource()).setUI(internalFrameUI);
1253             }
1254         });
1255     }
1256 
1257     /**
1258      * Maps {@code JInternalFrame.toBack()} through queue
1259      */
1260     public void toBack() {
1261         runMapping(new MapVoidAction("toBack") {
1262             @Override
1263             public void map() {
1264                 ((JInternalFrame) getSource()).toBack();
1265             }
1266         });
1267     }
1268 
1269     /**
1270      * Maps {@code JInternalFrame.toFront()} through queue
1271      */
1272     public void toFront() {
1273         runMapping(new MapVoidAction("toFront") {
1274             @Override
1275             public void map() {
1276                 ((JInternalFrame) getSource()).toFront();
1277             }
1278         });
1279     }
1280 
1281     //End of mapping                                      //
1282     ////////////////////////////////////////////////////////
1283     /**
1284      * Uses InternalframeDriver to get a title pane.
1285      *
1286      * @return a title pane.
1287      */
1288     protected Container findTitlePane() {
1289         return (Container) iDriver.getTitlePane(this);
1290     }
1291 
1292     /**
1293      * Initiaites suboperators.
1294      */
1295     protected void initOperators() {
1296         iconOperator = new JDesktopIconOperator(((JInternalFrame) getSource()).getDesktopIcon());
1297         iconOperator.copyEnvironment(this);
1298         Container titlePane = findTitlePane();
1299         if (!isIcon() && titlePane != null) {
1300             if (titleOperator == null) {
1301                 titleOperator = new ContainerOperator<>(titlePane);
1302                 int bttCount = 0;
1303                 if (getContainer(new ComponentChooser() {
1304                     @Override
1305                     public boolean checkComponent(Component comp) {
1306                         return comp instanceof JDesktopPane;
1307                     }
1308 
1309                     @Override
1310                     public String getDescription() {
1311                         return "Desctop pane";
1312                     }
1313 
1314                     @Override
1315                     public String toString() {
1316                         return "JInternalFrameOperator.initOperators.ComponentChooser{description = " + getDescription() + '}';
1317                     }
1318                 }) != null) {
1319                     minOper = new JButtonOperator(titleOperator, bttCount);
1320                     bttCount++;
1321                     if (((JInternalFrame) getSource()).isMaximizable()) {
1322                         maxOper = new JButtonOperator(titleOperator, bttCount);
1323                         bttCount++;
1324                     } else {
1325                         maxOper = null;
1326                     }
1327                 } else {
1328                     minOper = null;
1329                     maxOper = null;
1330                 }
1331                 if (isClosable()) {
1332                     closeOper = new JButtonOperator(titleOperator, bttCount);
1333                 } else {
1334                     closeOper = null;
1335                 }
1336             }
1337         } else {
1338             titleOperator = null;
1339             minOper = null;
1340             maxOper = null;
1341             closeOper = null;
1342         }
1343     }
1344 
1345     //throw exception if state is wrong
1346     private void checkIconified(boolean shouldBeIconified) {
1347         if (shouldBeIconified && !isIcon()
1348                 || !shouldBeIconified && isIcon()) {
1349             throw (new WrongInternalFrameStateException("JInternal frame should "
1350                     + (shouldBeIconified ? "" : "not")
1351                     + " be iconified to produce this operation",
1352                     getSource()));
1353         }
1354     }
1355 
1356     private static JInternalFrame findOne(ContainerOperator<?> cont, String text, int index) {
1357         Component source = waitComponent(cont,
1358                 new JInternalFrameByTitleFinder(text,
1359                         cont.getComparator()),
1360                 index);
1361         if (source instanceof JInternalFrame) {
1362             return (JInternalFrame) source;
1363         } else if (source instanceof JInternalFrame.JDesktopIcon) {
1364             return ((JInternalFrame.JDesktopIcon) source).getInternalFrame();
1365         } else {
1366             throw (new TimeoutExpiredException("No internal frame was found"));
1367         }
1368     }
1369 
1370     /**
1371      * Exception can be throwht if as a result of an attempt to produce
1372      * operation for the frame in incorrect state. Like activate iconified
1373      * frame, for example.
1374      */
1375     public static class WrongInternalFrameStateException extends JemmyInputException {
1376 
1377         private static final long serialVersionUID = 42L;
1378 
1379         /**
1380          * Constructs a JInternalFrameOperator$WrongInternalFrameStateException
1381          * object.
1382          *
1383          * @param message an exception message.
1384          * @param comp an internal frame.
1385          */
1386         public WrongInternalFrameStateException(String message, Component comp) {
1387             super(message, comp);
1388         }
1389     }
1390 
1391     /**
1392      * Allows to find component by title.
1393      */
1394     public static class JInternalFrameByTitleFinder implements ComponentChooser {
1395 
1396         String label;
1397         StringComparator comparator;
1398 
1399         /**
1400          * Constructs JInternalFrameByTitleFinder.
1401          *
1402          * @param lb a text pattern
1403          * @param comparator specifies string comparision algorithm.
1404          */
1405         public JInternalFrameByTitleFinder(String lb, StringComparator comparator) {
1406             label = lb;
1407             this.comparator = comparator;
1408         }
1409 
1410         /**
1411          * Constructs JInternalFrameByTitleFinder.
1412          *
1413          * @param lb a text pattern
1414          */
1415         public JInternalFrameByTitleFinder(String lb) {
1416             this(lb, Operator.getDefaultStringComparator());
1417         }
1418 
1419         @Override
1420         public boolean checkComponent(Component comp) {
1421             if (comp instanceof JInternalFrame || comp instanceof JInternalFrame.JDesktopIcon) {
1422                 JInternalFrame frame = null;
1423                 if (comp instanceof JInternalFrame) {
1424                     frame = (JInternalFrame) comp;
1425                 } else {
1426                     JDesktopIconOperator io = new JDesktopIconOperator((JInternalFrame.JDesktopIcon) comp);
1427                     frame = io.getInternalFrame();
1428                 }
1429                 if (frame.getTitle() != null) {
1430                     return (comparator.equals(frame.getTitle(),
1431                             label));
1432                 }
1433             }
1434             return false;
1435         }
1436 
1437         @Override
1438         public String getDescription() {
1439             return "JInternalFrame with title \"" + label + "\"";
1440         }
1441 
1442         @Override
1443         public String toString() {
1444             return "JInternalFrameByTitleFinder{" + "label=" + label + ", comparator=" + comparator + '}';
1445         }
1446     }
1447 
1448     /**
1449      * Class to operate with javax.swing.JInternalFrame.JDesktopIconOperator
1450      * component.
1451      */
1452     public static class JDesktopIconOperator extends JComponentOperator
1453             implements Outputable, Timeoutable {
1454 
1455         private TestOut output;
1456         private Timeouts timeouts;
1457 
1458         /**
1459          * Constructs JDesktopIconOperator.
1460          *
1461          * @param b a component
1462          */
1463         public JDesktopIconOperator(JInternalFrame.JDesktopIcon b) {
1464             super(b);
1465             setOutput(JemmyProperties.getCurrentOutput());
1466             setTimeouts(JemmyProperties.getCurrentTimeouts());
1467         }
1468 
1469         @Override
1470         public void setOutput(TestOut out) {
1471             output = out;
1472             super.setOutput(output.createErrorOutput());
1473         }
1474 
1475         @Override
1476         public TestOut getOutput() {
1477             return output;
1478         }
1479 
1480         @Override
1481         public void setTimeouts(Timeouts times) {
1482             timeouts = times;
1483             super.setTimeouts(timeouts);
1484         }
1485 
1486         @Override
1487         public Timeouts getTimeouts() {
1488             return timeouts;
1489         }
1490 
1491         /**
1492          * Creates an operator for the correspondent intenal frame.
1493          *
1494          * @return an operator.
1495          */
1496         public JInternalFrame getInternalFrame() {
1497             return ((JInternalFrame) getEventDispatcher().
1498                     invokeExistingMethod("getInternalFrame",
1499                             null,
1500                             null,
1501                             output));
1502         }
1503 
1504         /**
1505          * Pushs the deiconifying button.
1506          */
1507         public void pushButton() {
1508             new JButtonOperator(this).push();
1509         }
1510     }
1511 
1512     /**
1513      * Checks component type.
1514      */
1515     public static class JInternalFrameFinder implements ComponentChooser {
1516 
1517         ComponentChooser sf = null;
1518 
1519         /**
1520          * Constructs JInternalFrameFinder.
1521          *
1522          * @param sf other searching criteria.
1523          */
1524         public JInternalFrameFinder(ComponentChooser sf) {
1525             this.sf = sf;
1526         }
1527 
1528         /**
1529          * Constructs JInternalFrameFinder.
1530          */
1531         public JInternalFrameFinder() {
1532             this(ComponentSearcher.getTrueChooser("JInternalFrame or JInternalFrame.JDesktopIcon"));
1533         }
1534 
1535         @Override
1536         public boolean checkComponent(Component comp) {
1537             return ((comp instanceof JInternalFrame || comp instanceof JInternalFrame.JDesktopIcon)
1538                     && sf.checkComponent(comp));
1539         }
1540 
1541         @Override
1542         public String getDescription() {
1543             return sf.getDescription();
1544         }
1545 
1546         @Override
1547         public String toString() {
1548             return "JInternalFrameFinder{" + "sf=" + sf + '}';
1549         }
1550     }
1551 
1552 }