Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/java.desktop/share/classes/sun/awt/ScrollPaneWheelScroller.java
41152 views
1
/*
2
* Copyright (c) 2000, 2013, 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. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package sun.awt;
27
28
import java.awt.ScrollPane;
29
import java.awt.Insets;
30
import java.awt.Adjustable;
31
import java.awt.event.MouseWheelEvent;
32
33
import sun.util.logging.PlatformLogger;
34
35
/*
36
* ScrollPaneWheelScroller is a helper class for implmenenting mouse wheel
37
* scrolling on a java.awt.ScrollPane. It contains only static methods.
38
* No objects of this class may be instantiated, thus it is declared abstract.
39
*/
40
public abstract class ScrollPaneWheelScroller {
41
42
private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.ScrollPaneWheelScroller");
43
44
private ScrollPaneWheelScroller() {}
45
46
/*
47
* Called from ScrollPane.processMouseWheelEvent()
48
*/
49
public static void handleWheelScrolling(ScrollPane sp, MouseWheelEvent e) {
50
if (log.isLoggable(PlatformLogger.Level.FINER)) {
51
log.finer("x = " + e.getX() + ", y = " + e.getY() + ", src is " + e.getSource());
52
}
53
int increment = 0;
54
55
if (sp != null && e.getScrollAmount() != 0) {
56
Adjustable adj = getAdjustableToScroll(sp);
57
if (adj != null) {
58
increment = getIncrementFromAdjustable(adj, e);
59
if (log.isLoggable(PlatformLogger.Level.FINER)) {
60
log.finer("increment from adjustable(" + adj.getClass() + ") : " + increment);
61
}
62
scrollAdjustable(adj, increment);
63
}
64
}
65
}
66
67
/*
68
* Given a ScrollPane, determine which Scrollbar should be scrolled by the
69
* mouse wheel, if any.
70
*/
71
public static Adjustable getAdjustableToScroll(ScrollPane sp) {
72
int policy = sp.getScrollbarDisplayPolicy();
73
74
// if policy is display always or never, use vert
75
if (policy == ScrollPane.SCROLLBARS_ALWAYS ||
76
policy == ScrollPane.SCROLLBARS_NEVER) {
77
if (log.isLoggable(PlatformLogger.Level.FINER)) {
78
log.finer("using vertical scrolling due to scrollbar policy");
79
}
80
return sp.getVAdjustable();
81
82
}
83
else {
84
85
Insets ins = sp.getInsets();
86
int vertScrollWidth = sp.getVScrollbarWidth();
87
88
if (log.isLoggable(PlatformLogger.Level.FINER)) {
89
log.finer("insets: l = " + ins.left + ", r = " + ins.right +
90
", t = " + ins.top + ", b = " + ins.bottom);
91
log.finer("vertScrollWidth = " + vertScrollWidth);
92
}
93
94
// Check if scrollbar is showing by examining insets of the
95
// ScrollPane
96
if (ins.right >= vertScrollWidth) {
97
if (log.isLoggable(PlatformLogger.Level.FINER)) {
98
log.finer("using vertical scrolling because scrollbar is present");
99
}
100
return sp.getVAdjustable();
101
}
102
else {
103
int horizScrollHeight = sp.getHScrollbarHeight();
104
if (ins.bottom >= horizScrollHeight) {
105
if (log.isLoggable(PlatformLogger.Level.FINER)) {
106
log.finer("using horiz scrolling because scrollbar is present");
107
}
108
return sp.getHAdjustable();
109
}
110
else {
111
if (log.isLoggable(PlatformLogger.Level.FINER)) {
112
log.finer("using NO scrollbar becsause neither is present");
113
}
114
return null;
115
}
116
}
117
}
118
}
119
120
/*
121
* Given the info in a MouseWheelEvent and an Adjustable to scroll, return
122
* the amount by which the Adjustable should be adjusted. This value may
123
* be positive or negative.
124
*/
125
public static int getIncrementFromAdjustable(Adjustable adj,
126
MouseWheelEvent e) {
127
if (log.isLoggable(PlatformLogger.Level.FINE)) {
128
if (adj == null) {
129
log.fine("Assertion (adj != null) failed");
130
}
131
}
132
133
int increment = 0;
134
135
if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {
136
increment = e.getUnitsToScroll() * adj.getUnitIncrement();
137
}
138
else if (e.getScrollType() == MouseWheelEvent.WHEEL_BLOCK_SCROLL) {
139
increment = adj.getBlockIncrement() * e.getWheelRotation();
140
}
141
return increment;
142
}
143
144
/*
145
* Scroll the given Adjustable by the given amount. Checks the Adjustable's
146
* bounds and sets the new value to the Adjustable.
147
*/
148
public static void scrollAdjustable(Adjustable adj, int amount) {
149
if (log.isLoggable(PlatformLogger.Level.FINE)) {
150
if (adj == null) {
151
log.fine("Assertion (adj != null) failed");
152
}
153
if (amount == 0) {
154
log.fine("Assertion (amount != 0) failed");
155
}
156
}
157
158
int current = adj.getValue();
159
int upperLimit = adj.getMaximum() - adj.getVisibleAmount();
160
if (log.isLoggable(PlatformLogger.Level.FINER)) {
161
log.finer("doScrolling by " + amount);
162
}
163
164
if (amount > 0 && current < upperLimit) { // still some room to scroll
165
// down
166
if (current + amount < upperLimit) {
167
adj.setValue(current + amount);
168
return;
169
}
170
else {
171
adj.setValue(upperLimit);
172
return;
173
}
174
}
175
else if (amount < 0 && current > adj.getMinimum()) { // still some room
176
// to scroll up
177
if (current + amount > adj.getMinimum()) {
178
adj.setValue(current + amount);
179
return;
180
}
181
else {
182
adj.setValue(adj.getMinimum());
183
return;
184
}
185
}
186
}
187
}
188
189