Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/java.desktop/macosx/classes/sun/lwawt/LWListPeer.java
41153 views
1
/*
2
* Copyright (c) 2011, 2020, 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.lwawt;
27
28
import java.awt.Component;
29
import java.awt.Dimension;
30
import java.awt.Font;
31
import java.awt.Insets;
32
import java.awt.List;
33
import java.awt.Point;
34
import java.awt.SystemColor;
35
import java.awt.event.ActionEvent;
36
import java.awt.event.ItemEvent;
37
import java.awt.event.KeyEvent;
38
import java.awt.event.MouseEvent;
39
import java.awt.peer.ListPeer;
40
import java.util.Arrays;
41
42
import javax.swing.DefaultListModel;
43
import javax.swing.JList;
44
import javax.swing.JScrollBar;
45
import javax.swing.JScrollPane;
46
import javax.swing.JViewport;
47
import javax.swing.ListCellRenderer;
48
import javax.swing.ListSelectionModel;
49
import javax.swing.event.ListSelectionEvent;
50
import javax.swing.event.ListSelectionListener;
51
52
/**
53
* Lightweight implementation of {@link ListPeer}. Delegates most of the work to
54
* the {@link JList}, which is placed inside {@link JScrollPane}.
55
*/
56
final class LWListPeer extends LWComponentPeer<List, LWListPeer.ScrollableJList>
57
implements ListPeer {
58
59
/**
60
* The default number of visible rows.
61
*/
62
private static final int DEFAULT_VISIBLE_ROWS = 4; // From java.awt.List,
63
64
/**
65
* This text is used for cell bounds calculation.
66
*/
67
private static final String TEXT = "0123456789abcde";
68
69
LWListPeer(final List target, final PlatformComponent platformComponent) {
70
super(target, platformComponent);
71
if (!getTarget().isBackgroundSet()) {
72
getTarget().setBackground(SystemColor.text);
73
}
74
}
75
76
@Override
77
ScrollableJList createDelegate() {
78
return new ScrollableJList();
79
}
80
81
@Override
82
void initializeImpl() {
83
super.initializeImpl();
84
setMultipleMode(getTarget().isMultipleMode());
85
makeVisible(getTarget().getVisibleIndex());
86
final int[] selectedIndices = getTarget().getSelectedIndexes();
87
synchronized (getDelegateLock()) {
88
getDelegate().setSkipStateChangedEvent(true);
89
getDelegate().getView().setSelectedIndices(selectedIndices);
90
getDelegate().setSkipStateChangedEvent(false);
91
}
92
}
93
94
@Override
95
public boolean isFocusable() {
96
return true;
97
}
98
99
@Override
100
Component getDelegateFocusOwner() {
101
return getDelegate().getView();
102
}
103
104
@Override
105
public int[] getSelectedIndexes() {
106
synchronized (getDelegateLock()) {
107
return getDelegate().getView().getSelectedIndices();
108
}
109
}
110
111
@Override
112
public void add(final String item, final int index) {
113
synchronized (getDelegateLock()) {
114
getDelegate().getModel().add(index, item);
115
revalidate();
116
}
117
}
118
119
@Override
120
public void delItems(final int start, final int end) {
121
synchronized (getDelegateLock()) {
122
getDelegate().getModel().removeRange(start, end);
123
revalidate();
124
}
125
}
126
127
@Override
128
public void removeAll() {
129
synchronized (getDelegateLock()) {
130
getDelegate().getModel().removeAllElements();
131
revalidate();
132
}
133
}
134
135
@Override
136
public void select(final int index) {
137
synchronized (getDelegateLock()) {
138
getDelegate().setSkipStateChangedEvent(true);
139
getDelegate().getView().setSelectedIndex(index);
140
getDelegate().setSkipStateChangedEvent(false);
141
}
142
}
143
144
@Override
145
public void deselect(final int index) {
146
synchronized (getDelegateLock()) {
147
getDelegate().getView().getSelectionModel().
148
removeSelectionInterval(index, index);
149
}
150
}
151
152
@Override
153
public void makeVisible(final int index) {
154
synchronized (getDelegateLock()) {
155
getDelegate().getView().ensureIndexIsVisible(index);
156
}
157
}
158
159
@Override
160
public void setMultipleMode(final boolean m) {
161
synchronized (getDelegateLock()) {
162
getDelegate().getView().setSelectionMode(m ?
163
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION
164
: ListSelectionModel.SINGLE_SELECTION);
165
}
166
}
167
168
@Override
169
public Dimension getPreferredSize() {
170
return getMinimumSize();
171
}
172
173
@Override
174
public Dimension getMinimumSize() {
175
return getMinimumSize(DEFAULT_VISIBLE_ROWS);
176
}
177
178
@Override
179
public Dimension getPreferredSize(final int rows) {
180
return getMinimumSize(rows);
181
}
182
183
@Override
184
public Dimension getMinimumSize(final int rows) {
185
synchronized (getDelegateLock()) {
186
final Dimension size = getCellSize();
187
size.height *= rows;
188
// Always take vertical scrollbar into account.
189
final JScrollBar vbar = getDelegate().getVerticalScrollBar();
190
size.width += vbar != null ? vbar.getMinimumSize().width : 0;
191
// JScrollPane and JList insets
192
final Insets pi = getDelegate().getInsets();
193
final Insets vi = getDelegate().getView().getInsets();
194
size.width += pi.left + pi.right + vi.left + vi.right;
195
size.height += pi.top + pi.bottom + vi.top + vi.bottom;
196
return size;
197
}
198
}
199
200
private Dimension getCellSize() {
201
final JList<String> jList = getDelegate().getView();
202
final ListCellRenderer<? super String> cr = jList.getCellRenderer();
203
final Component cell = cr.getListCellRendererComponent(jList, TEXT, 0,
204
false, false);
205
return cell.getPreferredSize();
206
}
207
208
private void revalidate() {
209
synchronized (getDelegateLock()) {
210
getDelegate().getView().invalidate();
211
getDelegate().validate();
212
}
213
}
214
215
@SuppressWarnings("serial")// Safe: outer class is non-serializable.
216
final class ScrollableJList extends JScrollPane implements ListSelectionListener {
217
218
private boolean skipStateChangedEvent;
219
220
private final DefaultListModel<String> model =
221
new DefaultListModel<String>() {
222
@Override
223
public void add(final int index, final String element) {
224
if (index == -1) {
225
addElement(element);
226
} else {
227
super.add(index, element);
228
}
229
}
230
};
231
232
private int[] oldSelectedIndices = new int[0];
233
234
ScrollableJList() {
235
getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
236
final JList<String> list = new JListDelegate();
237
list.addListSelectionListener(this);
238
239
getViewport().setView(list);
240
241
// Pull the items from the target.
242
final String[] items = getTarget().getItems();
243
for (int i = 0; i < items.length; i++) {
244
model.add(i, items[i]);
245
}
246
}
247
248
public boolean isSkipStateChangedEvent() {
249
return skipStateChangedEvent;
250
}
251
252
public void setSkipStateChangedEvent(boolean skipStateChangedEvent) {
253
this.skipStateChangedEvent = skipStateChangedEvent;
254
}
255
256
@Override
257
@SuppressWarnings("unchecked")
258
public void valueChanged(final ListSelectionEvent e) {
259
if (!e.getValueIsAdjusting() && !isSkipStateChangedEvent()) {
260
final JList<?> source = (JList<?>) e.getSource();
261
for(int i = 0 ; i < source.getModel().getSize(); i++) {
262
263
final boolean wasSelected = Arrays.binarySearch(oldSelectedIndices, i) >= 0;
264
final boolean isSelected = source.isSelectedIndex(i);
265
266
if (wasSelected == isSelected) {
267
continue;
268
}
269
270
final int state = !wasSelected && isSelected ? ItemEvent.SELECTED: ItemEvent.DESELECTED;
271
272
LWListPeer.this.postEvent(new ItemEvent(getTarget(), ItemEvent.ITEM_STATE_CHANGED,
273
i, state));
274
}
275
oldSelectedIndices = source.getSelectedIndices();
276
}
277
}
278
279
@SuppressWarnings("unchecked")
280
public JList<String> getView() {
281
return (JList<String>) getViewport().getView();
282
}
283
284
public DefaultListModel<String> getModel() {
285
return model;
286
}
287
288
@Override
289
public void setEnabled(final boolean enabled) {
290
getView().setEnabled(enabled);
291
super.setEnabled(enabled);
292
}
293
294
@Override
295
public void setOpaque(final boolean isOpaque) {
296
super.setOpaque(isOpaque);
297
if (getView() != null) {
298
getView().setOpaque(isOpaque);
299
}
300
}
301
302
@Override
303
public void setFont(Font font) {
304
super.setFont(font);
305
if (getView() != null) {
306
getView().setFont(font);
307
LWListPeer.this.revalidate();
308
}
309
}
310
311
private final class JListDelegate extends JList<String> {
312
313
JListDelegate() {
314
super(model);
315
}
316
317
@Override
318
public boolean hasFocus() {
319
return getTarget().hasFocus();
320
}
321
322
@Override
323
@SuppressWarnings("deprecation")
324
protected void processMouseEvent(final MouseEvent e) {
325
super.processMouseEvent(e);
326
if (e.getID() == MouseEvent.MOUSE_CLICKED && e.getClickCount() == 2) {
327
final int index = locationToIndex(e.getPoint());
328
if (0 <= index && index < getModel().getSize()) {
329
LWListPeer.this.postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED,
330
getModel().getElementAt(index), e.getWhen(), e.getModifiers()));
331
}
332
}
333
}
334
335
@Override
336
@SuppressWarnings("deprecation")
337
protected void processKeyEvent(final KeyEvent e) {
338
super.processKeyEvent(e);
339
if (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == KeyEvent.VK_ENTER) {
340
final String selectedValue = getSelectedValue();
341
if(selectedValue != null){
342
LWListPeer.this.postEvent(new ActionEvent(getTarget(), ActionEvent.ACTION_PERFORMED,
343
selectedValue, e.getWhen(), e.getModifiers()));
344
}
345
}
346
}
347
348
//Needed for Autoscroller.
349
@Override
350
public Point getLocationOnScreen() {
351
return LWListPeer.this.getLocationOnScreen();
352
}
353
}
354
}
355
}
356
357