JSplitPaneDriver.java revision 13978:1993af50385d
1238384Sjkim/*
2238384Sjkim * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
3238384Sjkim * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4238384Sjkim *
5238384Sjkim * This code is free software; you can redistribute it and/or modify it
6238384Sjkim * under the terms of the GNU General Public License version 2 only, as
7238384Sjkim * published by the Free Software Foundation.
8238384Sjkim *
9238384Sjkim * This code is distributed in the hope that it will be useful, but WITHOUT
10238384Sjkim * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11238384Sjkim * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12238384Sjkim * version 2 for more details (a copy is included in the LICENSE file that
13238384Sjkim * accompanied this code).
14238384Sjkim *
15238384Sjkim * You should have received a copy of the GNU General Public License version
16238384Sjkim * 2 along with this work; if not, write to the Free Software Foundation,
17238384Sjkim * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18238384Sjkim *
19238384Sjkim * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20238384Sjkim * or visit www.oracle.com if you need additional information or have any
21238384Sjkim * questions.
22238384Sjkim */
23238384Sjkimpackage org.netbeans.jemmy.drivers.scrolling;
24238384Sjkim
25238384Sjkimimport javax.swing.JButton;
26238384Sjkimimport javax.swing.JSplitPane;
27238384Sjkim
28238384Sjkimimport org.netbeans.jemmy.ComponentSearcher;
29238384Sjkimimport org.netbeans.jemmy.drivers.ButtonDriver;
30238384Sjkimimport org.netbeans.jemmy.drivers.DriverManager;
31238384Sjkimimport org.netbeans.jemmy.drivers.LightSupportiveDriver;
32280304Sjkimimport org.netbeans.jemmy.drivers.ScrollDriver;
33280304Sjkimimport org.netbeans.jemmy.operators.ComponentOperator;
34280304Sjkimimport org.netbeans.jemmy.operators.ContainerOperator;
35280304Sjkimimport org.netbeans.jemmy.operators.JButtonOperator;
36280304Sjkimimport org.netbeans.jemmy.operators.JSplitPaneOperator;
37238384Sjkimimport org.netbeans.jemmy.operators.Operator;
38280304Sjkim
39280304Sjkim/**
40280304Sjkim * ScrollDriver for javax.swing.JSplitPane component type.
41238384Sjkim *
42280304Sjkim * @author Alexandre Iline(alexandre.iline@oracle.com)
43238384Sjkim */
44280304Sjkimpublic class JSplitPaneDriver extends LightSupportiveDriver implements ScrollDriver {
45280304Sjkim
46280304Sjkim    /**
47280304Sjkim     * Constructs a JSplitPaneDriver.
48280304Sjkim     */
49280304Sjkim    public JSplitPaneDriver() {
50238384Sjkim        super(new String[]{"org.netbeans.jemmy.operators.JSplitPaneOperator"});
51238384Sjkim    }
52238384Sjkim
53238384Sjkim    @Override
54238384Sjkim    public void scroll(ComponentOperator oper, ScrollAdjuster adj) {
55238384Sjkim        moveDividerTo((JSplitPaneOperator) oper, adj);
56280304Sjkim    }
57280304Sjkim
58280304Sjkim    @Override
59280304Sjkim    public void scrollToMinimum(ComponentOperator oper, int orientation) {
60280304Sjkim        expandTo((JSplitPaneOperator) oper, 0);
61238384Sjkim    }
62238384Sjkim
63238384Sjkim    @Override
64280304Sjkim    public void scrollToMaximum(ComponentOperator oper, int orientation) {
65280304Sjkim        expandTo((JSplitPaneOperator) oper, 1);
66280304Sjkim    }
67280304Sjkim
68238384Sjkim    private void moveDividerTo(JSplitPaneOperator oper, ScrollAdjuster adj) {
69280304Sjkim        ContainerOperator<?> divOper = oper.getDivider();
70280304Sjkim        /* workaround */
71280304Sjkim        if (oper.getDividerLocation() == -1) {
72280304Sjkim            moveTo(oper, divOper, divOper.getCenterX() - 1, divOper.getCenterY() - 1);
73280304Sjkim            if (oper.getDividerLocation() == -1) {
74280304Sjkim                moveTo(oper, divOper, divOper.getCenterX() + 1, divOper.getCenterY() + 1);
75280304Sjkim            }
76280304Sjkim        }
77280304Sjkim        if (oper.getOrientation() == JSplitPane.HORIZONTAL_SPLIT) {
78280304Sjkim            moveOnce(oper, divOper, adj, 0, oper.getWidth());
79280304Sjkim        } else {
80280304Sjkim            moveOnce(oper, divOper, adj, 0, oper.getHeight());
81280304Sjkim        }
82280304Sjkim    }
83280304Sjkim
84280304Sjkim    private void moveOnce(JSplitPaneOperator oper,
85280304Sjkim            ContainerOperator<?> divOper,
86280304Sjkim            ScrollAdjuster adj,
87280304Sjkim            int leftPosition,
88280304Sjkim            int rightPosition) {
89238384Sjkim        int currentPosition = 0;
90238384Sjkim        if (oper.getOrientation() == JSplitPane.HORIZONTAL_SPLIT) {
91280304Sjkim            currentPosition = (int) (divOper.getLocationOnScreen().getX()
92280304Sjkim                    - oper.getLocationOnScreen().getX());
93238384Sjkim        } else {
94238384Sjkim            currentPosition = (int) (divOper.getLocationOnScreen().getY()
95238384Sjkim                    - oper.getLocationOnScreen().getY());
96238384Sjkim        }
97238384Sjkim        int nextPosition = 0;
98238384Sjkim        if (adj.getScrollDirection() == ScrollAdjuster.DECREASE_SCROLL_DIRECTION) {
99238384Sjkim            nextPosition = (currentPosition + leftPosition) / 2;
100238384Sjkim            moveToPosition(oper, divOper, nextPosition - currentPosition);
101238384Sjkim            if (currentPosition
102238384Sjkim                    == ((adj.getScrollOrientation() == JSplitPane.HORIZONTAL_SPLIT)
103238384Sjkim                            ? (int) (divOper.getLocationOnScreen().getX()
104238384Sjkim                            - oper.getLocationOnScreen().getX())
105238384Sjkim                            : (int) (divOper.getLocationOnScreen().getY()
106238384Sjkim                            - oper.getLocationOnScreen().getY()))) {
107238384Sjkim                return;
108238384Sjkim            }
109238384Sjkim            moveOnce(oper, divOper, adj, leftPosition, currentPosition);
110238384Sjkim        } else if (adj.getScrollDirection() == ScrollAdjuster.INCREASE_SCROLL_DIRECTION) {
111238384Sjkim            nextPosition = (currentPosition + rightPosition) / 2;
112280304Sjkim            moveToPosition(oper, divOper, nextPosition - currentPosition);
113238384Sjkim            if (currentPosition
114238384Sjkim                    == ((adj.getScrollOrientation() == JSplitPane.HORIZONTAL_SPLIT)
115238384Sjkim                            ? (int) (divOper.getLocationOnScreen().getX()
116238384Sjkim                            - oper.getLocationOnScreen().getX())
117238384Sjkim                            : (int) (divOper.getLocationOnScreen().getY()
118238384Sjkim                            - oper.getLocationOnScreen().getY()))) {
119238384Sjkim                return;
120280304Sjkim            }
121280304Sjkim            moveOnce(oper, divOper, adj, currentPosition, rightPosition);
122238384Sjkim        } else { // (currentLocation == dividerLocation) - stop point
123238384Sjkim            return;
124280304Sjkim        }
125280304Sjkim    }
126280304Sjkim
127280304Sjkim    private void moveTo(JSplitPaneOperator oper, ComponentOperator divOper, int x, int y) {
128238384Sjkim        DriverManager.getMouseDriver(divOper).
129280304Sjkim                dragNDrop(divOper, divOper.getCenterX(), divOper.getCenterY(), x, y,
130280304Sjkim                        Operator.getDefaultMouseButton(), 0,
131280304Sjkim                        oper.getTimeouts().create("ComponentOperator.BeforeDragTimeout"),
132280304Sjkim                        oper.getTimeouts().create("ComponentOperator.AfterDragTimeout"));
133280304Sjkim    }
134280304Sjkim
135238384Sjkim    private void moveToPosition(JSplitPaneOperator oper, ComponentOperator divOper, int nextPosition) {
136280304Sjkim        if (System.getProperty("java.version").startsWith("1.2")) {
137280304Sjkim            oper.setDividerLocation(nextPosition);
138280304Sjkim        }
139280304Sjkim        if (oper.getOrientation() == JSplitPane.HORIZONTAL_SPLIT) {
140238384Sjkim            moveTo(oper, divOper, divOper.getCenterX() + nextPosition, divOper.getCenterY());
141280304Sjkim        } else {
142280304Sjkim            moveTo(oper, divOper, divOper.getCenterX(), divOper.getCenterY() + nextPosition);
143280304Sjkim        }
144280304Sjkim    }
145280304Sjkim
146280304Sjkim    private void expandTo(JSplitPaneOperator oper, int index) {
147238384Sjkim        ContainerOperator<?> divOper = oper.getDivider();
148238384Sjkim        JButtonOperator bo
149238384Sjkim                = new JButtonOperator((JButton) divOper.
150280304Sjkim                        waitSubComponent(new JButtonOperator.JButtonFinder(ComponentSearcher.
151280304Sjkim                                getTrueChooser("JButton")),
152280304Sjkim                                index));
153280304Sjkim        bo.copyEnvironment(divOper);
154280304Sjkim        ButtonDriver bdriver = DriverManager.getButtonDriver(bo);
155238384Sjkim        bdriver.push(bo);
156238384Sjkim        bdriver.push(bo);
157238384Sjkim    }
158280304Sjkim}
159280304Sjkim