001    /*
002     * Created on Jan 13, 2009
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
005     * the License. You may obtain a copy of the License at
006     *
007     * http://www.apache.org/licenses/LICENSE-2.0
008     *
009     * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
010     * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
011     * specific language governing permissions and limitations under the License.
012     *
013     * Copyright @2009-2010 the original author or authors.
014     */
015    package org.fest.swing.fixture;
016    
017    import static org.fest.swing.timing.Timeout.timeout;
018    
019    import java.awt.Component;
020    import java.awt.Container;
021    import java.awt.Dialog;
022    
023    import javax.swing.JButton;
024    import javax.swing.JCheckBox;
025    import javax.swing.JComboBox;
026    import javax.swing.JFileChooser;
027    import javax.swing.JLabel;
028    import javax.swing.JList;
029    import javax.swing.JMenuItem;
030    import javax.swing.JOptionPane;
031    import javax.swing.JPanel;
032    import javax.swing.JProgressBar;
033    import javax.swing.JRadioButton;
034    import javax.swing.JScrollBar;
035    import javax.swing.JScrollPane;
036    import javax.swing.JSlider;
037    import javax.swing.JSpinner;
038    import javax.swing.JSplitPane;
039    import javax.swing.JTabbedPane;
040    import javax.swing.JTable;
041    import javax.swing.JToggleButton;
042    import javax.swing.JToolBar;
043    import javax.swing.JTree;
044    import javax.swing.text.JTextComponent;
045    
046    import org.fest.swing.core.GenericTypeMatcher;
047    import org.fest.swing.exception.ComponentLookupException;
048    import org.fest.swing.exception.WaitTimedOutError;
049    import org.fest.swing.timing.Timeout;
050    
051    /**
052     * Understands lookup of <code>{@link Component}</code>s contained in a <code>{@link Container}</code>.
053     *
054     * @author Alex Ruiz
055     */
056    public interface ComponentContainerFixture {
057    
058      /** The timeout to use when looking for a dialog. It's value is 100 ms. **/
059      public static Timeout DEFAULT_DIALOG_LOOKUP_TIMEOUT = timeout(100);
060    
061      /**
062       * Returns a <code>{@link JButton}</code> found in this fixture's <code>{@link Container}</code>.
063       * @return a fixture that manages the <code>JButton</code> found.
064       * @throws ComponentLookupException if a <code>JButton</code> could not be found.
065       * @throws ComponentLookupException if more than one <code>JButton</code> is found.
066       */
067      JButtonFixture button();
068    
069      /**
070       * Finds a <code>{@link JButton}</code> in this fixture's <code>{@link Container}</code>, that matches the
071       * specified search criteria.
072       * @param matcher contains the search criteria for finding a <code>JButton</code>.
073       * @return a fixture that manages the <code>JButton</code> found.
074       * @throws ComponentLookupException if a <code>JButton</code> that matches the given search criteria could not be
075       * found.
076       * @throws ComponentLookupException if more than one <code>JButton</code> that matches the given search criteria is
077       * found.
078       */
079      JButtonFixture button(GenericTypeMatcher<? extends JButton> matcher);
080    
081      /**
082       * Finds a <code>{@link JButton}</code> in this fixture's <code>{@link Container}</code>, which name matches the
083       * specified one.
084       * @param name the name to match.
085       * @return a fixture that manages the <code>JButton</code> found.
086       * @throws ComponentLookupException if a <code>JButton</code> having a matching name could not be found.
087       * @throws ComponentLookupException if more than one <code>JButton</code> having a matching name is found.
088       */
089      JButtonFixture button(String name);
090    
091      /**
092       * Returns a <code>{@link JCheckBox}</code> found in this fixture's <code>{@link Container}</code>.
093       * @return a fixture that manages the <code>JCheckBox</code> found.
094       * @throws ComponentLookupException if a <code>JCheckBox</code> could not be found.
095       * @throws ComponentLookupException if more than one <code>JCheckBox</code> is found.
096       */
097      JCheckBoxFixture checkBox();
098    
099      /**
100       * Finds a <code>{@link JCheckBox}</code> in this fixture's <code>{@link Container}</code>, that matches the
101       * specified search criteria.
102       * @param matcher contains the search criteria for finding a <code>JCheckBox</code>.
103       * @return a fixture that manages the <code>JCheckBox</code> found.
104       * @throws ComponentLookupException if a <code>JCheckBox</code> that matches the given search criteria could not be
105       * found.
106       * @throws ComponentLookupException if more than one <code>JCheckBox</code> that matches the given search criteria is
107       * found.
108       */
109      JCheckBoxFixture checkBox(GenericTypeMatcher<? extends JCheckBox> matcher);
110    
111      /**
112       * Finds a <code>{@link JCheckBox}</code> in this fixture's <code>{@link Container}</code>, which name matches
113       * the specified one.
114       * @param name the name to match.
115       * @return a fixture that manages the <code>JCheckBox</code> found.
116       * @throws ComponentLookupException if a <code>JCheckBox</code> having a matching name could not be found.
117       */
118      JCheckBoxFixture checkBox(String name);
119    
120      /**
121       * Returns a <code>{@link JComboBox}</code> found in this fixture's <code>{@link Container}</code>.
122       * @return a fixture that manages the <code>JComboBox</code> found.
123       * @throws ComponentLookupException if a <code>JComboBox</code> could not be found.
124       * @throws ComponentLookupException if more than one <code>JComboBox</code> is found.
125       */
126      JComboBoxFixture comboBox();
127    
128      /**
129       * Finds a <code>{@link JComboBox}</code> in this fixture's <code>{@link Container}</code>, that matches the
130       * specified search criteria.
131       * @param matcher contains the search criteria for finding a <code>JComboBox</code>.
132       * @return a fixture that manages the <code>JComboBox</code> found.
133       * @throws ComponentLookupException if a <code>JComboBox</code> that matches the given search criteria could not be
134       * found.
135       * @throws ComponentLookupException if more than one <code>JComboBox</code> that matches the given search criteria is
136       * found.
137       */
138      JComboBoxFixture comboBox(GenericTypeMatcher<? extends JComboBox> matcher);
139    
140      /**
141       * Finds a <code>{@link JComboBox}</code> in this fixture's <code>{@link Container}</code>, which name matches
142       * the specified one.
143       * @param name the name to match.
144       * @return a fixture that manages the <code>JComboBox</code> found.
145       * @throws ComponentLookupException if a <code>JComboBox</code> having a matching name could not be found.
146       * @throws ComponentLookupException if more than one <code>JComboBox</code> having a matching name is found.
147       */
148      JComboBoxFixture comboBox(String name);
149    
150      /**
151       * Returns the only <code>{@link Dialog}</code> currently available (if any.) This method uses the value defined in
152       * <code>{@link #DEFAULT_DIALOG_LOOKUP_TIMEOUT}</code> as the default lookup timeout.
153       * @return a fixture that manages the <code>Dialog</code> found.
154       * @throws WaitTimedOutError if a <code>Dialog</code> could not be found.
155       * @see #dialog(Timeout)
156       */
157      DialogFixture dialog();
158    
159      /**
160       * Returns the only <code>{@link Dialog}</code> currently available (if any.)
161       * @param timeout the amount of time to wait for a <code>Dialog</code> to be found.
162       * @return a fixture that manages the <code>Dialog</code> found.
163       * @throws WaitTimedOutError if a <code>Dialog</code> could not be found.
164       * @since 1.2
165       */
166      DialogFixture dialog(Timeout timeout);
167    
168      /**
169       * Finds a <code>{@link Dialog}</code> that matches the specified search criteria. This method uses the value defined
170       * in <code>{@link #DEFAULT_DIALOG_LOOKUP_TIMEOUT}</code> as the default lookup timeout.
171       * @param matcher contains the search criteria for finding a <code>Dialog</code>.
172       * @return a fixture that manages the <code>Dialog</code> found.
173       * @throws WaitTimedOutError if a <code>Dialog</code> that matches the given search criteria could not be found.
174       * @see #dialog(GenericTypeMatcher, Timeout)
175       */
176      DialogFixture dialog(GenericTypeMatcher<? extends Dialog> matcher);
177    
178      /**
179       * Finds a <code>{@link Dialog}</code> that matches the specified search criteria.
180       * @param matcher contains the search criteria for finding a <code>Dialog</code>.
181       * @param timeout the amount of time to wait for a <code>Dialog</code> to be found.
182       * @return a fixture that manages the <code>Dialog</code> found.
183       * @throws WaitTimedOutError if a <code>Dialog</code> that matches the given search criteria could not be found.
184       * @since 1.2
185       */
186      DialogFixture dialog(GenericTypeMatcher<? extends Dialog> matcher, Timeout timeout);
187    
188      /**
189       * Finds a <code>{@link Dialog}</code> with a name matching the specified one. This method uses the value defined in
190       * <code>{@link #DEFAULT_DIALOG_LOOKUP_TIMEOUT}</code> as the default lookup timeout.
191       * @param name the name to match.
192       * @return a fixture that manages the <code>Dialog</code> found.
193       * @throws WaitTimedOutError if a <code>Dialog</code> that a matching name could not be found.
194       * @see #dialog(String, Timeout)
195       */
196      DialogFixture dialog(String name);
197    
198      /**
199       * Finds a <code>{@link Dialog}</code> with a name matching the specified one.
200       * @param name the name to match.
201       * @param timeout the amount of time to wait for a <code>Dialog</code> to be found.
202       * @return a fixture that manages the <code>Dialog</code> found.
203       * @throws WaitTimedOutError if a <code>Dialog</code> that a matching name could not be found.
204       * @since 1.2
205       */
206      DialogFixture dialog(String name, Timeout timeout);
207    
208      /**
209       * Returns the only <code>{@link JFileChooser}</code> currently available (if any.)  This method uses the value
210       * defined in <code>{@link #DEFAULT_DIALOG_LOOKUP_TIMEOUT}</code> as the default lookup timeout.
211       * @return a fixture that manages the <code>JFileChooser</code> found.
212       * @throws WaitTimedOutError if a <code>JFileChooser</code> could not be found.
213       * @see #fileChooser(Timeout)
214       */
215      JFileChooserFixture fileChooser();
216    
217      /**
218       * Returns the only <code>{@link JFileChooser}</code> currently available (if any.)
219       * @param timeout the amount of time to wait for a <code>JFileChooser</code> to be found.
220       * @return a fixture that manages the <code>JFileChooser</code> found.
221       * @throws WaitTimedOutError if a <code>JFileChooser</code> could not be found.
222       */
223      JFileChooserFixture fileChooser(Timeout timeout);
224    
225      /**
226       * Finds a <code>{@link JFileChooser}</code> that matches the specified search criteria. This method uses the value
227       * defined in <code>{@link #DEFAULT_DIALOG_LOOKUP_TIMEOUT}</code> as the default lookup timeout.
228       * @param matcher contains the search criteria for finding a <code>JFileChooser</code>.
229       * @return a fixture that manages the <code>JFileChooser</code> found.
230       * @throws WaitTimedOutError if a <code>JFileChooser</code> could not be found.
231       * @see #fileChooser(GenericTypeMatcher, Timeout)
232       */
233      JFileChooserFixture fileChooser(GenericTypeMatcher<? extends JFileChooser> matcher);
234    
235      /**
236       * Finds a <code>{@link JFileChooser}</code> that matches the specified search criteria.
237       * @param matcher contains the search criteria for finding a <code>JFileChooser</code>.
238       * @param timeout the amount of time to wait for a <code>JFileChooser</code> to be found.
239       * @return a fixture that manages the <code>JFileChooser</code> found.
240       * @throws WaitTimedOutError if a <code>JFileChooser</code> could not be found.
241       */
242      JFileChooserFixture fileChooser(GenericTypeMatcher<? extends JFileChooser> matcher, Timeout timeout);
243    
244      /**
245       * Finds a <code>{@link JFileChooser}</code> with a name matching the specified one. This method uses the value
246       * defined in <code>{@link #DEFAULT_DIALOG_LOOKUP_TIMEOUT}</code> as the default lookup timeout.
247       * @param name the name to match.
248       * @return a fixture that manages the <code>JFileChooser</code> found.
249       * @throws WaitTimedOutError if a <code>JFileChooser</code> could not be found.
250       * @see #fileChooser(String, Timeout)
251       */
252      JFileChooserFixture fileChooser(String name);
253    
254      /**
255       * Finds a <code>{@link JFileChooser}</code> with a name matching the specified one.
256       * @param name the name to match.
257       * @param timeout the amount of time to wait for a <code>JFileChooser</code> to be found.
258       * @return a fixture that manages the <code>JFileChooser</code> found.
259       * @throws WaitTimedOutError if a <code>JFileChooser</code> could not be found.
260       */
261      JFileChooserFixture fileChooser(String name, Timeout timeout);
262    
263      /**
264       * Returns a <code>{@link JLabel}</code> found in this fixture's <code>{@link Container}</code>.
265       * @return a fixture that manages the <code>JLabel</code> found.
266       * @throws ComponentLookupException if a <code>JLabel</code> could not be found.
267       * @throws ComponentLookupException if more than one <code>JLabel</code> is found.
268       */
269      JLabelFixture label();
270    
271      /**
272       * Finds a <code>{@link JLabel}</code> in this fixture's <code>{@link Container}</code>, that matches the
273       * specified search criteria.
274       * @param matcher contains the search criteria for finding a <code>JLabel</code>.
275       * @return a fixture that manages the <code>JLabel</code> found.
276       * @throws ComponentLookupException if a <code>JLabel</code> that matches the given search criteria could not be
277       * found.
278       * @throws ComponentLookupException if more than one <code>JLabel</code> that matches the given search criteria is
279       * found.
280       */
281      JLabelFixture label(GenericTypeMatcher<? extends JLabel> matcher);
282    
283      /**
284       * Finds a <code>{@link JLabel}</code> in this fixture's <code>{@link Container}</code>, which name matches the
285       * specified one.
286       * @param name the name to match.
287       * @return a fixture that manages the <code>JLabel</code> found.
288       * @throws ComponentLookupException if a <code>JLabel</code> having a matching name could not be found.
289       * @throws ComponentLookupException if more than one <code>JLabel</code> having a matching name could is found.
290       */
291      JLabelFixture label(String name);
292    
293      /**
294       * Returns a <code>{@link JList}</code> found in this fixture's <code>{@link Container}</code>.
295       * @return a fixture that manages the <code>JList</code> found.
296       * @throws ComponentLookupException if a <code>JList</code> could not be found.
297       * @throws ComponentLookupException if more than one <code>JList</code> is found.
298       */
299      JListFixture list();
300    
301      /**
302       * Finds a <code>{@link JList}</code> in this fixture's <code>{@link Container}</code>, that matches the
303       * specified search criteria.
304       * @param matcher contains the search criteria for finding a <code>JList</code>.
305       * @return a fixture that manages the <code>JList</code> found.
306       * @throws ComponentLookupException if a <code>JList</code> that matches the given search criteria could not be found.
307       * @throws ComponentLookupException if more than one <code>JList</code> that matches the given search criteria is
308       * found.
309       */
310      JListFixture list(GenericTypeMatcher<? extends JList> matcher);
311    
312      /**
313       * Finds a <code>{@link JList}</code> in this fixture's <code>{@link Container}</code>, which name matches the
314       * specified one.
315       * @param name the name to match.
316       * @return a fixture that manages the <code>JList</code> found.
317       * @throws ComponentLookupException if a <code>JList</code> having a matching name could not be found.
318       * @throws ComponentLookupException if more than one <code>JList</code> having a matching name is found.
319       */
320      JListFixture list(String name);
321    
322      /**
323       * Finds a <code>{@link JMenuItem}</code> in this fixture's <code>{@link Container}</code>, which path matches
324       * the given one.
325       * <p>
326       * For example, if we are looking for the menu with text "New" contained under the menu with text "File", we can
327       * simply call
328       *
329       * <pre>
330       * JMenuItemFixture menuItem = container.<strong>menuItemWithPath(&quot;File&quot;, &quot;Menu&quot;)</strong>;
331       * </pre>
332       *
333       * </p>
334       * @param path the path of the menu to find.
335       * @return a fixture that manages the <code>JMenuItem</code> found.
336       * @throws ComponentLookupException if a <code>JMenuItem</code> under the given path could not be found.
337       * @throws AssertionError if the <code>Component</code> found under the given path is not a <code>JMenuItem</code>.
338       */
339      JMenuItemFixture menuItemWithPath(String... path);
340    
341      /**
342       * Finds a <code>{@link JMenuItem}</code>, contained in this fixture's <code>{@link Container}</code>,
343       * which name matches the specified one.
344       * @param name the name to match.
345       * @return a fixture that manages the <code>JMenuItem</code> found.
346       * @throws ComponentLookupException if a <code>JMenuItem</code> having a matching name could not be found.
347       * @throws ComponentLookupException if more than one <code>JMenuItem</code> having a matching name is found.
348       */
349      JMenuItemFixture menuItem(String name);
350    
351      /**
352       * Finds a <code>{@link JMenuItem}</code>, contained in this fixture's <code>{@link Container}</code>,
353       * that matches the specified search criteria.
354       * @param matcher contains the search criteria for finding a <code>JMenuItem</code>.
355       * @return a fixture that manages the <code>JMenuItem</code> found.
356       * @throws ComponentLookupException if a <code>JMenuItem</code> that matches the given search criteria could not be
357       * found.
358       * @throws ComponentLookupException if more than one <code>JMenuItem</code> that matches the given search criteria is
359       * found.
360       */
361      JMenuItemFixture menuItem(GenericTypeMatcher<? extends JMenuItem> matcher);
362    
363      /**
364       * Returns the only <code>{@link JOptionPane}</code> currently available (if any.) This method uses the value defined
365       * in <code>{@link #DEFAULT_DIALOG_LOOKUP_TIMEOUT}</code> as the default lookup timeout.
366       * @return a fixture that manages the <code>JOptionPane</code> found.
367       * @throws WaitTimedOutError if a <code>JOptionPane</code> could not be found.
368       * @see #optionPane(Timeout)
369       */
370      JOptionPaneFixture optionPane();
371    
372      /**
373       * Returns the only <code>{@link JOptionPane}</code> currently available (if any.)
374       * @param timeout the amount of time to wait for a <code>JOptionPane</code> to be found.
375       * @return a fixture that manages the <code>JOptionPane</code> found.
376       * @throws WaitTimedOutError if a <code>JOptionPane</code> could not be found.
377       */
378      JOptionPaneFixture optionPane(Timeout timeout);
379    
380      /**
381       * Returns a <code>{@link JPanel}</code> found in this fixture's <code>{@link Container}</code>.
382       * @return a fixture that manages the <code>JPanel</code> found.
383       * @throws ComponentLookupException if a <code>JPanel</code> could not be found.
384       * @throws ComponentLookupException if more than one <code>JPanel</code> is found.
385       */
386      JPanelFixture panel();
387    
388      /**
389       * Finds a <code>{@link JPanel}</code> in this fixture's <code>{@link Container}</code>, that matches the
390       * specified search criteria.
391       * @param matcher contains the search criteria for finding a <code>JPanel</code>.
392       * @return a fixture that manages the <code>JPanel</code> found.
393       * @throws ComponentLookupException if a <code>JPanel</code> that matches the given search criteria could not be
394       * found.
395       * @throws ComponentLookupException if more than one <code>JPanel</code> that matches the given search criteria is
396       * found.
397       */
398      JPanelFixture panel(GenericTypeMatcher<? extends JPanel> matcher);
399    
400      /**
401       * Finds a <code>{@link JPanel}</code> in this fixture's <code>{@link Container}</code>, which name matches
402       * the specified one.
403       * @param name the name to match.
404       * @return a fixture that manages the <code>JPanel</code> found.
405       * @throws ComponentLookupException if a <code>JPanel</code> having a matching name could not be found.
406       */
407      JPanelFixture panel(String name);
408    
409      /**
410       * Returns a <code>{@link JProgressBar}</code> found in this fixture's <code>{@link Container}</code>.
411       * @return a fixture that manages the <code>JProgressBar</code> found.
412       * @throws ComponentLookupException if a <code>JProgressBar</code> could not be found.
413       * @throws ComponentLookupException if more than one <code>JProgressBar</code> is found.
414       */
415      JProgressBarFixture progressBar();
416    
417      /**
418       * Finds a <code>{@link JProgressBar}</code> in this fixture's <code>{@link Container}</code>, that matches the
419       * specified search criteria.
420       * @param matcher contains the search criteria for finding a <code>JProgressBar</code>.
421       * @return a fixture that manages the <code>JProgressBar</code> found.
422       * @throws ComponentLookupException if a <code>JProgressBar</code> that matches the given search criteria could not be
423       * found.
424       * @throws ComponentLookupException if more than one <code>JProgressBar</code> that matches the given search criteria
425       * is found.
426       */
427      JProgressBarFixture progressBar(GenericTypeMatcher<? extends JProgressBar> matcher);
428    
429      /**
430       * Finds a <code>{@link JProgressBar}</code> in this fixture's <code>{@link Container}</code>, which name matches
431       * the specified one.
432       * @param name the name to match.
433       * @return a fixture that manages the <code>JProgressBar</code> found.
434       * @throws ComponentLookupException if a <code>JProgressBar</code> having a matching name could not be found.
435       */
436      JProgressBarFixture progressBar(String name);
437    
438      /**
439       * Returns a <code>{@link JRadioButton}</code> found in this fixture's <code>{@link Container}</code>.
440       * @return a fixture that manages the <code>JRadioButton</code> found.
441       * @throws ComponentLookupException if a <code>JRadioButton</code> could not be found.
442       * @throws ComponentLookupException if more than one <code>JRadioButton</code> is found.
443       */
444      JRadioButtonFixture radioButton();
445    
446      /**
447       * Finds a <code>{@link JRadioButton}</code> in this fixture's <code>{@link Container}</code>, that matches the
448       * specified search criteria.
449       * @param matcher contains the search criteria for finding a <code>JRadioButton</code>.
450       * @return a fixture that manages the <code>JRadioButton</code> found.
451       * @throws ComponentLookupException if a <code>JRadioButton</code> that matches the given search criteria could not be
452       * found.
453       * @throws ComponentLookupException if more than one <code>JRadioButton</code> that matches the given search criteria
454       * is found.
455       */
456      JRadioButtonFixture radioButton(GenericTypeMatcher<? extends JRadioButton> matcher);
457    
458      /**
459       * Finds a <code>{@link JRadioButton}</code> in this fixture's <code>{@link Container}</code>, which name matches
460       * the specified one.
461       * @param name the name to match.
462       * @return a fixture that manages the <code>JRadioButton</code> found.
463       * @throws ComponentLookupException if a <code>JRadioButton</code> having a matching name could not be found.
464       * @throws ComponentLookupException if more than one <code>JRadioButton</code> having a matching name is found.
465       */
466      JRadioButtonFixture radioButton(String name);
467    
468      /**
469       * Returns a <code>{@link JScrollBar}</code> found in this fixture's <code>{@link Container}</code>.
470       * @return a fixture that manages the <code>JScrollBar</code> found.
471       * @throws ComponentLookupException if a <code>JScrollBar</code> could not be found.
472       * @throws ComponentLookupException if more than one <code>JScrollBar</code> is found.
473       */
474      JScrollBarFixture scrollBar();
475    
476      /**
477       * Finds a <code>{@link JScrollBar}</code> in this fixture's <code>{@link Container}</code>, that matches the
478       * specified search criteria.
479       * @param matcher contains the search criteria for finding a <code>JScrollBar</code>.
480       * @return a fixture that manages the <code>JScrollBar</code> found.
481       * @throws ComponentLookupException if a <code>JScrollBar</code> that matches the given search criteria could not be
482       * found.
483       * @throws ComponentLookupException if more than one <code>JScrollBar</code> that matches the given search criteria is
484       * found.
485       */
486      JScrollBarFixture scrollBar(GenericTypeMatcher<? extends JScrollBar> matcher);
487    
488      /**
489       * Finds a <code>{@link JScrollBar}</code> in this fixture's <code>{@link Container}</code>, which name matches the
490       * specified one.
491       * @param name the name to match.
492       * @return a fixture that manages the <code>JScrollBar</code> found.
493       * @throws ComponentLookupException if a <code>JScrollBar</code> having a matching name could not be found.
494       * @throws ComponentLookupException if more than one <code>JScrollBar</code> having a matching name is found.
495       */
496      JScrollBarFixture scrollBar(String name);
497    
498      /**
499       * Returns a <code>{@link JScrollPane}</code> found in this fixture's <code>{@link Container}</code>.
500       * @return a fixture that manages the <code>JScrollPane</code> found.
501       * @throws ComponentLookupException if a <code>JScrollPane</code> could not be found.
502       * @throws ComponentLookupException if more than one <code>JScrollPane</code> is found.
503       */
504      JScrollPaneFixture scrollPane();
505    
506      /**
507       * Finds a <code>{@link JScrollPane}</code> in this fixture's <code>{@link Container}</code>, that matches the
508       * specified search criteria.
509       * @param matcher contains the search criteria for finding a <code>JScrollPane</code>.
510       * @return a fixture that manages the <code>JScrollPane</code> found.
511       * @throws ComponentLookupException if a <code>JScrollPane</code> that matches the given search criteria could not be
512       * found.
513       * @throws ComponentLookupException if more than one <code>JScrollPane</code> that matches the given search criteria
514       * is found.
515       */
516      JScrollPaneFixture scrollPane(GenericTypeMatcher<? extends JScrollPane> matcher);
517    
518      /**
519       * Finds a <code>{@link JScrollPane}</code> in this fixture's <code>{@link Container}</code>, which name matches the
520       * specified one.
521       * @param name the name to match.
522       * @return a fixture that manages the <code>JScrollPane</code> found.
523       * @throws ComponentLookupException if a <code>JScrollPane</code> having a matching name could not be found.
524       * @throws ComponentLookupException if more than one <code>JScrollPane</code> having a matching name is found.
525       */
526      JScrollPaneFixture scrollPane(String name);
527    
528      /**
529       * Returns a <code>{@link JSlider}</code> found in this fixture's <code>{@link Container}</code>.
530       * @return a fixture that manages the <code>JSlider</code> found.
531       * @throws ComponentLookupException if a <code>JSlider</code> could not be found.
532       * @throws ComponentLookupException if more than one <code>JSlider</code> is found.
533       */
534      JSliderFixture slider();
535    
536      /**
537       * Finds a <code>{@link JSlider}</code> in this fixture's <code>{@link Container}</code>, that matches the
538       * specified search criteria.
539       * @param matcher contains the search criteria for finding a <code>JSlider</code>.
540       * @return a fixture that manages the <code>JSlider</code> found.
541       * @throws ComponentLookupException if a <code>JSlider</code> that matches the given search criteria could not be
542       * found.
543       * @throws ComponentLookupException if more than one <code>JSlider</code> that matches the given search criteria is
544       * found.
545       */
546      JSliderFixture slider(GenericTypeMatcher<? extends JSlider> matcher);
547    
548      /**
549       * Finds a <code>{@link JSlider}</code> in this fixture's <code>{@link Container}</code>, which name matches the
550       * specified one.
551       * @param name the name to match.
552       * @return a fixture that manages the <code>JSlider</code> found.
553       * @throws ComponentLookupException if a <code>JSlider</code> having a matching name could not be found.
554       * @throws ComponentLookupException if more than one <code>JSlider</code> having a matching name is found.
555       */
556      JSliderFixture slider(String name);
557    
558      /**
559       * Returns a <code>{@link JSpinner}</code> found in this fixture's <code>{@link Container}</code>.
560       * @return a fixture that manages the <code>JSpinner</code> found.
561       * @throws ComponentLookupException if a <code>JSpinner</code> could not be found.
562       * @throws ComponentLookupException if more than one <code>JSpinner</code> is found.
563       */
564      JSpinnerFixture spinner();
565    
566      /**
567       * Finds a <code>{@link JSpinner}</code> in this fixture's <code>{@link Container}</code>, that matches the
568       * specified search criteria.
569       * @param matcher contains the search criteria for finding a <code>JSpinner</code>.
570       * @return a fixture that manages the <code>JSpinner</code> found.
571       * @throws ComponentLookupException if a <code>JSpinner</code> that matches the given search criteria could not be
572       * found.
573       * @throws ComponentLookupException if more than one <code>JSpinner</code> that matches the given search criteria is
574       * found.
575       */
576      JSpinnerFixture spinner(GenericTypeMatcher<? extends JSpinner> matcher);
577    
578      /**
579       * Finds a <code>{@link JSpinner}</code> in this fixture's <code>{@link Container}</code>, which name matches the
580       * specified one.
581       * @param name the name to match.
582       * @return a fixture that manages the <code>JSpinner</code> found.
583       * @throws ComponentLookupException if a <code>JSpinner</code> having a matching name could not be found.
584       * @throws ComponentLookupException if more than one <code>JSpinner</code> having a matching name is found.
585       */
586      JSpinnerFixture spinner(String name);
587    
588      /**
589       * Returns the <code>{@link JSplitPane}</code> found in this fixture's <code>{@link Container}</code>.
590       * @return a fixture that manages the <code>JSplitPane</code> found.
591       * @throws ComponentLookupException if a <code>JSplitPane</code> could not be found.
592       * @throws ComponentLookupException if more than one <code>JSplitPane</code> is found.
593       */
594      JSplitPaneFixture splitPane();
595    
596      /**
597       * Finds a <code>{@link JSplitPane}</code> in this fixture's <code>{@link Container}</code>, that matches the
598       * specified search criteria.
599       * @param matcher contains the search criteria for finding a <code>JSplitPane</code>.
600       * @return a fixture that manages the <code>JSplitPane</code> found.
601       * @throws ComponentLookupException if a <code>JSplitPane</code> that matches the given search criteria could not be
602       * found.
603       * @throws ComponentLookupException if more than one <code>JSplitPane</code> that matches the given search criteria is
604       * found.
605       */
606      JSplitPaneFixture splitPane(GenericTypeMatcher<? extends JSplitPane> matcher);
607    
608      /**
609       * Finds a <code>{@link JSplitPane}</code> in this fixture's <code>{@link Container}</code>, which name matches
610       * the specified one.
611       * @param name the name to match.
612       * @return a fixture that manages the <code>JSplitPane</code> found.
613       * @throws ComponentLookupException if a <code>JSplitPane</code> having a matching name could not be found.
614       * @throws ComponentLookupException if more than one <code>JSplitPane</code> having a matching name is found.
615       */
616      JSplitPaneFixture splitPane(String name);
617    
618      /**
619       * Returns a <code>{@link JTabbedPane}</code> found in this fixture's <code>{@link Container}</code>.
620       * @return a fixture that manages the <code>JTabbedPane</code> found.
621       * @throws ComponentLookupException if a <code>JTabbedPane</code> could not be found.
622       * @throws ComponentLookupException if more than one <code>JTabbedPane</code> is found.
623       */
624      JTabbedPaneFixture tabbedPane();
625    
626      /**
627       * Finds a <code>{@link JTabbedPane}</code> in this fixture's <code>{@link Container}</code>, that matches the
628       * specified search criteria.
629       * @param matcher contains the search criteria for finding a <code>JTabbedPane</code>.
630       * @return a fixture that manages the <code>JTabbedPane</code> found.
631       * @throws ComponentLookupException if a <code>JTabbedPane</code> that matches the given search criteria could not be
632       * found.
633       * @throws ComponentLookupException if more than one <code>JTabbedPane</code> that matches the given search criteria
634       * is found.
635       */
636      JTabbedPaneFixture tabbedPane(GenericTypeMatcher<? extends JTabbedPane> matcher);
637    
638      /**
639       * Finds a <code>{@link JTabbedPane}</code> in this fixture's <code>{@link Container}</code>, which name matches
640       * the specified one.
641       * @param name the name to match.
642       * @return a fixture that manages the <code>JTabbedPane</code> found.
643       * @throws ComponentLookupException if a <code>JTabbedPane</code> having a matching name could not be found.
644       * @throws ComponentLookupException if more than one <code>JTabbedPane</code> having a matching name is found.
645       */
646      JTabbedPaneFixture tabbedPane(String name);
647    
648      /**
649       * Returns a <code>{@link JTable}</code> found in this fixture's <code>{@link Container}</code>.
650       * @return a fixture that manages the <code>JTable</code> found.
651       * @throws ComponentLookupException if a <code>JTable</code> having a matching name could not be found.
652       * @throws ComponentLookupException if more than one <code>JTable</code> having a matching name is found.
653       */
654      JTableFixture table();
655    
656      /**
657       * Finds a <code>{@link JTable}</code> in this fixture's <code>{@link Container}</code>, that matches the
658       * specified search criteria.
659       * @param matcher contains the search criteria for finding a <code>JTable</code>.
660       * @return a fixture that manages the <code>JTable</code> found.
661       * @throws ComponentLookupException if a <code>JTable</code> that matches the given search criteria could not be
662       * found.
663       * @throws ComponentLookupException if more than one <code>JTable</code> that matches the given search criteria is
664       * found.
665       */
666      JTableFixture table(GenericTypeMatcher<? extends JTable> matcher);
667    
668      /**
669       * Finds a <code>{@link JTable}</code> in this fixture's <code>{@link Container}</code>, which name matches the
670       * specified one.
671       * @param name the name to match.
672       * @return a fixture that manages the <code>JTable</code> found.
673       * @throws ComponentLookupException if a <code>JTable</code> having a matching name could not be found.
674       * @throws ComponentLookupException if more than one <code>JTable</code> having a matching name is found.
675       */
676      JTableFixture table(String name);
677    
678      /**
679       * Returns a <code>{@link JTextComponent}</code> found in this fixture's <code>{@link Container}</code>.
680       * @return a fixture that manages the <code>JTextComponent</code> found.
681       * @throws ComponentLookupException if a <code>JTextComponent</code> having a matching name could not be found.
682       * @throws ComponentLookupException if more than one <code>JTextComponent</code> having a matching name is found.
683       */
684      JTextComponentFixture textBox();
685    
686      /**
687       * Finds a <code>{@link JTextComponent}</code> in this fixture's <code>{@link Container}</code> managed by this
688       * fixture, that matches the specified search criteria.
689       * @param matcher contains the search criteria for finding a <code>JTextComponent</code>.
690       * @return a fixture that manages the <code>JTextComponent</code> found.
691       * @throws ComponentLookupException if a <code>JTextComponent</code> that matches the given search criteria could not
692       * be found.
693       * @throws ComponentLookupException if more than one <code>JTextComponent</code> that matches the given search
694       * criteria is found.
695       */
696      JTextComponentFixture textBox(GenericTypeMatcher<? extends JTextComponent> matcher);
697    
698      /**
699       * Finds a <code>{@link JTextComponent}</code> in this fixture's <code>{@link Container}</code> managed by this
700       * fixture, which name matches the specified one.
701       * @param name the name to match.
702       * @return a fixture that manages the <code>JTextComponent</code> found.
703       * @throws ComponentLookupException if a <code>JTextComponent</code> having a matching name could not be found.
704       * @throws ComponentLookupException if more than one <code>JTextComponent</code> having a matching name is found.
705       */
706      JTextComponentFixture textBox(String name);
707    
708      /**
709       * Returns a <code>{@link JToggleButton}</code> found in this fixture's <code>{@link Container}</code>.
710       * @return a fixture that manages the <code>JToggleButton</code> found.
711       * @throws ComponentLookupException if a <code>JToggleButton</code> could not be found.
712       * @throws ComponentLookupException if more than one <code>JToggleButton</code> is found.
713       */
714      JToggleButtonFixture toggleButton();
715    
716      /**
717       * Finds a <code>{@link JToggleButton}</code> in this fixture's <code>{@link Container}</code>, that matches the
718       * specified search criteria.
719       * @param matcher contains the search criteria for finding a <code>JToggleButton</code>.
720       * @return a fixture that manages the <code>JToggleButton</code> found.
721       * @throws ComponentLookupException if a <code>JToggleButton</code> that matches the given search criteria could not
722       * be found.
723       * @throws ComponentLookupException if more than one <code>JToggleButton</code> that matches the given search criteria
724       * is found.
725       */
726      JToggleButtonFixture toggleButton(GenericTypeMatcher<? extends JToggleButton> matcher);
727    
728      /**
729       * Finds a <code>{@link JToggleButton}</code> in this fixture's <code>{@link Container}</code>, which name matches
730       * the specified one.
731       * @param name the name to match.
732       * @return a fixture that manages the <code>JToggleButton</code> found.
733       * @throws ComponentLookupException if a <code>JToggleButton</code> having a matching name could not be found.
734       * @throws ComponentLookupException if more than one <code>JToggleButton</code> having a matching name is found.
735       */
736      JToggleButtonFixture toggleButton(String name);
737    
738      /**
739       * Returns a <code>{@link JToolBar}</code> found in this fixture's <code>{@link Container}</code>.
740       * @return a fixture that manages the <code>JToolBar</code> found.
741       * @throws ComponentLookupException if a <code>JToolBar</code> having a matching name could not be found.
742       * @throws ComponentLookupException if more than one <code>JToolBar</code> having a matching name could is found.
743       */
744      JToolBarFixture toolBar();
745    
746      /**
747       * Finds a <code>{@link JToolBar}</code> in this fixture's <code>{@link Container}</code>, that matches the
748       * specified search criteria.
749       * @param matcher contains the search criteria for finding a <code>JToolBar</code>.
750       * @return a fixture that manages the <code>JToolBar</code> found.
751       * @throws ComponentLookupException if a <code>JToolBar</code> that matches the given search criteria could not be
752       * found.
753       * @throws ComponentLookupException if more than one <code>JToolBar</code> that matches the given search criteria is
754       * found.
755       */
756      JToolBarFixture toolBar(GenericTypeMatcher<? extends JToolBar> matcher);
757    
758      /**
759       * Finds a <code>{@link JToolBar}</code> in this fixture's <code>{@link Container}</code>, which name matches the
760       * specified one.
761       * @param name the name to match.
762       * @return a fixture that manages the <code>JToolBar</code> found.
763       * @throws ComponentLookupException if a <code>JToolBar</code> having a matching name could not be found.
764       * @throws ComponentLookupException if more than one <code>JToolBar</code> having a matching name is found.
765       */
766      JToolBarFixture toolBar(String name);
767    
768      /**
769       * Returns a <code>{@link JTree}</code> found in this fixture's <code>{@link Container}</code>.
770       * @return a fixture that manages the <code>JTree</code> found.
771       * @throws ComponentLookupException if a <code>JTree</code> having a matching name could not be found.
772       * @throws ComponentLookupException if more than one <code>JTree</code> having a matching name is found.
773       */
774      JTreeFixture tree();
775    
776      /**
777       * Finds a <code>{@link JTree}</code> in this fixture's <code>{@link Container}</code>, that matches the
778       * specified search criteria.
779       * @param matcher contains the search criteria for finding a <code>JTree</code>.
780       * @return a fixture that manages the <code>JTree</code> found.
781       * @throws ComponentLookupException if a <code>JTree</code> that matches the given search criteria could not be found.
782       * @throws ComponentLookupException if more than one <code>JTree</code> that matches the given search criteria is
783       * found.
784       */
785      JTreeFixture tree(GenericTypeMatcher<? extends JTree> matcher);
786    
787      /**
788       * Finds a <code>{@link JTree}</code> in this fixture's <code>{@link Container}</code>, which name matches the
789       * specified one.
790       * @param name the name to match.
791       * @return a fixture that manages the <code>JTree</code> found.
792       * @throws ComponentLookupException if a <code>JTree</code> having a matching name could not be found.
793       * @throws ComponentLookupException if more than one <code>JTree</code> having a matching name is found.
794       */
795      JTreeFixture tree(String name);
796    
797      /**
798       * Returns a <code>{@link ComponentFixture}</code> managing a component inside this fixture's
799       * <code>{@link Container}</code>. This is an extension method, to allow implementations of
800       * <code>{@link ContainerFixture}</code> handle custom GUI components.
801       * @param <C> the type of <code>Component</code> the fixture to return can handle.
802       * @param <F> the type of <code>ComponentFixture</code> to return.
803       * @param extension the <code>ComponentFixtureExtension</code> that creates the <code>ComponentFixture</code> to
804       * return.
805       * @return a <code>ComponentFixture</code> managing a component inside this fixture's <code>Container</code>.
806       */
807      <C extends Component, F extends ComponentFixture<C>> F with(ComponentFixtureExtension<C, F> extension);
808    }