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 */
23package org.netbeans.jemmy.operators;
24
25import java.awt.Component;
26import java.awt.Point;
27import java.awt.Rectangle;
28
29import javax.swing.JTable;
30import javax.swing.event.ChangeEvent;
31import javax.swing.event.ListSelectionEvent;
32import javax.swing.event.TableColumnModelEvent;
33import javax.swing.plaf.TableHeaderUI;
34import javax.swing.table.JTableHeader;
35import javax.swing.table.TableCellRenderer;
36import javax.swing.table.TableColumn;
37import javax.swing.table.TableColumnModel;
38
39import org.netbeans.jemmy.ComponentChooser;
40import org.netbeans.jemmy.ComponentSearcher;
41import org.netbeans.jemmy.Outputable;
42import org.netbeans.jemmy.TestOut;
43import org.netbeans.jemmy.Timeoutable;
44import org.netbeans.jemmy.Timeouts;
45import org.netbeans.jemmy.drivers.DriverManager;
46import org.netbeans.jemmy.drivers.OrderedListDriver;
47
48/**
49 * ComponentOperator.BeforeDragTimeout - time to sleep before column moving <BR>
50 * ComponentOperator.AfterDragTimeout - time to sleep after column moving <BR>
51 * ComponentOperator.WaitComponentTimeout - time to wait component displayed
52 * <BR>.
53 *
54 * @author Alexandre Iline (alexandre.iline@oracle.com)
55 *
56 */
57public class JTableHeaderOperator extends JComponentOperator
58        implements Outputable, Timeoutable {
59
60    private TestOut output;
61    private Timeouts timeouts;
62
63    private OrderedListDriver driver;
64
65    /**
66     * Constructor.
67     *
68     * @param b a component
69     */
70    public JTableHeaderOperator(JTableHeader b) {
71        super(b);
72        driver = DriverManager.getOrderedListDriver(getClass());
73    }
74
75    /**
76     * Constructs a JTableHeaderOperator object.
77     *
78     * @param cont a container
79     * @param chooser a component chooser specifying searching criteria.
80     * @param index an index between appropriate ones.
81     */
82    public JTableHeaderOperator(ContainerOperator<?> cont, ComponentChooser chooser, int index) {
83        this((JTableHeader) cont.
84                waitSubComponent(new JTableHeaderFinder(chooser),
85                        index));
86        copyEnvironment(cont);
87    }
88
89    /**
90     * Constructs a JTableHeaderOperator object.
91     *
92     * @param cont a container
93     * @param chooser a component chooser specifying searching criteria.
94     */
95    public JTableHeaderOperator(ContainerOperator<?> cont, ComponentChooser chooser) {
96        this(cont, chooser, 0);
97    }
98
99    /**
100     * Constructs a JTableHeaderOperator object.
101     *
102     * @param cont a container
103     * @param index an index between appropriate ones.
104     */
105    public JTableHeaderOperator(ContainerOperator<?> cont, int index) {
106        this((JTableHeader) waitComponent(cont,
107                new JTableHeaderFinder(ComponentSearcher.
108                        getTrueChooser("Any JTableHeader")),
109                index));
110        copyEnvironment(cont);
111    }
112
113    /**
114     * Constructs a JTableHeaderOperator object.
115     *
116     * @param cont a container
117     */
118    public JTableHeaderOperator(ContainerOperator<?> cont) {
119        this(cont, 0);
120    }
121
122    @Override
123    public void setTimeouts(Timeouts times) {
124        this.timeouts = times;
125        super.setTimeouts(timeouts);
126    }
127
128    @Override
129    public Timeouts getTimeouts() {
130        return timeouts;
131    }
132
133    @Override
134    public void setOutput(TestOut out) {
135        output = out;
136        super.setOutput(output);
137    }
138
139    @Override
140    public TestOut getOutput() {
141        return output;
142    }
143
144    /**
145     * Selects a column.
146     *
147     * @param columnIndex an index of a column to select.
148     */
149    public void selectColumn(int columnIndex) {
150        driver.selectItem(this, columnIndex);
151    }
152
153    /**
154     * Selects some columns.
155     *
156     * @param columnIndices indices of columns to select.
157     */
158    public void selectColumns(int[] columnIndices) {
159        driver.selectItems(this, columnIndices);
160    }
161
162    /**
163     * Moves a column to a different location.
164     *
165     * @param moveColumn an original column index.
166     * @param moveTo a desctination column index.
167     */
168    public void moveColumn(int moveColumn, int moveTo) {
169        driver.moveItem(this, moveColumn, moveTo);
170    }
171
172    /**
173     * Return a point to click on column header.
174     *
175     * @param columnIndex an index of a column to click on.
176     * @return the point to click.
177     */
178    public Point getPointToClick(int columnIndex) {
179        Rectangle rect = getHeaderRect(columnIndex);
180        return (new Point(rect.x + rect.width / 2,
181                rect.y + rect.height / 2));
182    }
183
184    @Override
185    public void copyEnvironment(Operator anotherOperator) {
186        super.copyEnvironment(anotherOperator);
187        driver
188                = (OrderedListDriver) DriverManager.
189                getDriver(DriverManager.ORDEREDLIST_DRIVER_ID,
190                        getClass(),
191                        anotherOperator.getProperties());
192    }
193
194    ////////////////////////////////////////////////////////
195    //Mapping                                             //
196    /**
197     * Maps {@code JTableHeader.setTable(JTable)} through queue
198     */
199    public void setTable(final JTable jTable) {
200        runMapping(new MapVoidAction("setTable") {
201            @Override
202            public void map() {
203                ((JTableHeader) getSource()).setTable(jTable);
204            }
205        });
206    }
207
208    /**
209     * Maps {@code JTableHeader.getTable()} through queue
210     */
211    public JTable getTable() {
212        return (runMapping(new MapAction<JTable>("getTable") {
213            @Override
214            public JTable map() {
215                return ((JTableHeader) getSource()).getTable();
216            }
217        }));
218    }
219
220    /**
221     * Maps {@code JTableHeader.setReorderingAllowed(boolean)} through queue
222     */
223    public void setReorderingAllowed(final boolean b) {
224        runMapping(new MapVoidAction("setReorderingAllowed") {
225            @Override
226            public void map() {
227                ((JTableHeader) getSource()).setReorderingAllowed(b);
228            }
229        });
230    }
231
232    /**
233     * Maps {@code JTableHeader.getReorderingAllowed()} through queue
234     */
235    public boolean getReorderingAllowed() {
236        return (runMapping(new MapBooleanAction("getReorderingAllowed") {
237            @Override
238            public boolean map() {
239                return ((JTableHeader) getSource()).getReorderingAllowed();
240            }
241        }));
242    }
243
244    /**
245     * Maps {@code JTableHeader.setResizingAllowed(boolean)} through queue
246     */
247    public void setResizingAllowed(final boolean b) {
248        runMapping(new MapVoidAction("setResizingAllowed") {
249            @Override
250            public void map() {
251                ((JTableHeader) getSource()).setResizingAllowed(b);
252            }
253        });
254    }
255
256    /**
257     * Maps {@code JTableHeader.getResizingAllowed()} through queue
258     */
259    public boolean getResizingAllowed() {
260        return (runMapping(new MapBooleanAction("getResizingAllowed") {
261            @Override
262            public boolean map() {
263                return ((JTableHeader) getSource()).getResizingAllowed();
264            }
265        }));
266    }
267
268    /**
269     * Maps {@code JTableHeader.getDraggedColumn()} through queue
270     */
271    public TableColumn getDraggedColumn() {
272        return (runMapping(new MapAction<TableColumn>("getDraggedColumn") {
273            @Override
274            public TableColumn map() {
275                return ((JTableHeader) getSource()).getDraggedColumn();
276            }
277        }));
278    }
279
280    /**
281     * Maps {@code JTableHeader.getDraggedDistance()} through queue
282     */
283    public int getDraggedDistance() {
284        return (runMapping(new MapIntegerAction("getDraggedDistance") {
285            @Override
286            public int map() {
287                return ((JTableHeader) getSource()).getDraggedDistance();
288            }
289        }));
290    }
291
292    /**
293     * Maps {@code JTableHeader.getResizingColumn()} through queue
294     */
295    public TableColumn getResizingColumn() {
296        return (runMapping(new MapAction<TableColumn>("getResizingColumn") {
297            @Override
298            public TableColumn map() {
299                return ((JTableHeader) getSource()).getResizingColumn();
300            }
301        }));
302    }
303
304    /**
305     * Maps {@code JTableHeader.setUpdateTableInRealTime(boolean)} through queue
306     */
307    public void setUpdateTableInRealTime(final boolean b) {
308        runMapping(new MapVoidAction("setUpdateTableInRealTime") {
309            @Override
310            public void map() {
311                ((JTableHeader) getSource()).setUpdateTableInRealTime(b);
312            }
313        });
314    }
315
316    /**
317     * Maps {@code JTableHeader.getUpdateTableInRealTime()} through queue
318     */
319    public boolean getUpdateTableInRealTime() {
320        return (runMapping(new MapBooleanAction("getUpdateTableInRealTime") {
321            @Override
322            public boolean map() {
323                return ((JTableHeader) getSource()).getUpdateTableInRealTime();
324            }
325        }));
326    }
327
328    /**
329     * Maps {@code JTableHeader.setDefaultRenderer(TableCellRenderer)}
330     * through queue
331     */
332    public void setDefaultRenderer(final TableCellRenderer tableCellRenderer) {
333        runMapping(new MapVoidAction("setDefaultRenderer") {
334            @Override
335            public void map() {
336                ((JTableHeader) getSource()).setDefaultRenderer(tableCellRenderer);
337            }
338        });
339    }
340
341    /**
342     * Maps {@code JTableHeader.getDefaultRenderer()} through queue
343     */
344    public TableCellRenderer getDefaultRenderer() {
345        return (runMapping(new MapAction<TableCellRenderer>("getDefaultRenderer") {
346            @Override
347            public TableCellRenderer map() {
348                return ((JTableHeader) getSource()).getDefaultRenderer();
349            }
350        }));
351    }
352
353    /**
354     * Maps {@code JTableHeader.columnAtPoint(Point)} through queue
355     */
356    public int columnAtPoint(final Point point) {
357        return (runMapping(new MapIntegerAction("columnAtPoint") {
358            @Override
359            public int map() {
360                return ((JTableHeader) getSource()).columnAtPoint(point);
361            }
362        }));
363    }
364
365    /**
366     * Maps {@code JTableHeader.getHeaderRect(int)} through queue
367     */
368    public Rectangle getHeaderRect(final int i) {
369        return (runMapping(new MapAction<Rectangle>("getHeaderRect") {
370            @Override
371            public Rectangle map() {
372                return ((JTableHeader) getSource()).getHeaderRect(i);
373            }
374        }));
375    }
376
377    /**
378     * Maps {@code JTableHeader.getUI()} through queue
379     */
380    public TableHeaderUI getUI() {
381        return (runMapping(new MapAction<TableHeaderUI>("getUI") {
382            @Override
383            public TableHeaderUI map() {
384                return ((JTableHeader) getSource()).getUI();
385            }
386        }));
387    }
388
389    /**
390     * Maps {@code JTableHeader.setUI(TableHeaderUI)} through queue
391     */
392    public void setUI(final TableHeaderUI tableHeaderUI) {
393        runMapping(new MapVoidAction("setUI") {
394            @Override
395            public void map() {
396                ((JTableHeader) getSource()).setUI(tableHeaderUI);
397            }
398        });
399    }
400
401    /**
402     * Maps {@code JTableHeader.setColumnModel(TableColumnModel)} through queue
403     */
404    public void setColumnModel(final TableColumnModel tableColumnModel) {
405        runMapping(new MapVoidAction("setColumnModel") {
406            @Override
407            public void map() {
408                ((JTableHeader) getSource()).setColumnModel(tableColumnModel);
409            }
410        });
411    }
412
413    /**
414     * Maps {@code JTableHeader.getColumnModel()} through queue
415     */
416    public TableColumnModel getColumnModel() {
417        return (runMapping(new MapAction<TableColumnModel>("getColumnModel") {
418            @Override
419            public TableColumnModel map() {
420                return ((JTableHeader) getSource()).getColumnModel();
421            }
422        }));
423    }
424
425    /**
426     * Maps {@code JTableHeader.columnAdded(TableColumnModelEvent)} through queue
427     */
428    public void columnAdded(final TableColumnModelEvent tableColumnModelEvent) {
429        runMapping(new MapVoidAction("columnAdded") {
430            @Override
431            public void map() {
432                ((JTableHeader) getSource()).columnAdded(tableColumnModelEvent);
433            }
434        });
435    }
436
437    /**
438     * Maps {@code JTableHeader.columnRemoved(TableColumnModelEvent)}
439     * through queue
440     */
441    public void columnRemoved(final TableColumnModelEvent tableColumnModelEvent) {
442        runMapping(new MapVoidAction("columnRemoved") {
443            @Override
444            public void map() {
445                ((JTableHeader) getSource()).columnRemoved(tableColumnModelEvent);
446            }
447        });
448    }
449
450    /**
451     * Maps {@code JTableHeader.columnMoved(TableColumnModelEvent)} through queue
452     */
453    public void columnMoved(final TableColumnModelEvent tableColumnModelEvent) {
454        runMapping(new MapVoidAction("columnMoved") {
455            @Override
456            public void map() {
457                ((JTableHeader) getSource()).columnMoved(tableColumnModelEvent);
458            }
459        });
460    }
461
462    /**
463     * Maps {@code JTableHeader.columnMarginChanged(ChangeEvent)} through queue
464     */
465    public void columnMarginChanged(final ChangeEvent changeEvent) {
466        runMapping(new MapVoidAction("columnMarginChanged") {
467            @Override
468            public void map() {
469                ((JTableHeader) getSource()).columnMarginChanged(changeEvent);
470            }
471        });
472    }
473
474    /**
475     * Maps {@code JTableHeader.columnSelectionChanged(ListSelectionEvent)}
476     * through queue
477     */
478    public void columnSelectionChanged(final ListSelectionEvent listSelectionEvent) {
479        runMapping(new MapVoidAction("columnSelectionChanged") {
480            @Override
481            public void map() {
482                ((JTableHeader) getSource()).columnSelectionChanged(listSelectionEvent);
483            }
484        });
485    }
486
487    /**
488     * Maps {@code JTableHeader.resizeAndRepaint()} through queue
489     */
490    public void resizeAndRepaint() {
491        runMapping(new MapVoidAction("resizeAndRepaint") {
492            @Override
493            public void map() {
494                ((JTableHeader) getSource()).resizeAndRepaint();
495            }
496        });
497    }
498
499    /**
500     * Maps {@code JTableHeader.setDraggedColumn(TableColumn)} through queue
501     */
502    public void setDraggedColumn(final TableColumn tableColumn) {
503        runMapping(new MapVoidAction("setDraggedColumn") {
504            @Override
505            public void map() {
506                ((JTableHeader) getSource()).setDraggedColumn(tableColumn);
507            }
508        });
509    }
510
511    /**
512     * Maps {@code JTableHeader.setDraggedDistance(int)} through queue
513     */
514    public void setDraggedDistance(final int i) {
515        runMapping(new MapVoidAction("setDraggedDistance") {
516            @Override
517            public void map() {
518                ((JTableHeader) getSource()).setDraggedDistance(i);
519            }
520        });
521    }
522
523    /**
524     * Maps {@code JTableHeader.setResizingColumn(TableColumn)} through queue
525     */
526    public void setResizingColumn(final TableColumn tableColumn) {
527        runMapping(new MapVoidAction("setResizingColumn") {
528            @Override
529            public void map() {
530                ((JTableHeader) getSource()).setResizingColumn(tableColumn);
531            }
532        });
533    }
534
535    //End of mapping                                      //
536    ////////////////////////////////////////////////////////
537    /**
538     * Checks component type.
539     */
540    public static class JTableHeaderFinder implements ComponentChooser {
541
542        ComponentChooser subFinder;
543
544        /**
545         * Constructs JTableHeaderFinder.
546         *
547         * @param sf other searching criteria.
548         */
549        public JTableHeaderFinder(ComponentChooser sf) {
550            subFinder = sf;
551        }
552
553        @Override
554        public boolean checkComponent(Component comp) {
555            if (comp instanceof JTableHeader) {
556                return subFinder.checkComponent(comp);
557            }
558            return false;
559        }
560
561        @Override
562        public String getDescription() {
563            return subFinder.getDescription();
564        }
565
566        @Override
567        public String toString() {
568            return "JTableHeaderFinder{" + "subFinder=" + subFinder + '}';
569        }
570    }
571}
572