jdk/src/java.desktop/share/classes/javax/swing/JList.java
author martin
Thu, 30 Oct 2014 07:31:41 -0700
changeset 28059 e576535359cc
parent 25859 3317bb8137f4
child 28236 610561ed1847
permissions -rw-r--r--
8067377: My hobby: caning, then then canning, the the can-can Summary: Fix ALL the stutters! Reviewed-by: rriggs, mchung, lancea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
22574
7f8ce0c8c20a 8032627: Add @SuppressWarnings("serial") to appropriate javax.swing classes
darcy
parents: 21982
diff changeset
     2
 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5449
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5449
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5449
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5449
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5449
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
package javax.swing;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
5449
21bec46ee9e3 6899413: Fix for CR #6878399 should be refactored
alexp
parents: 4378
diff changeset
    28
import java.awt.*;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
import java.awt.event.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
import java.util.Vector;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
import java.util.Locale;
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
    33
import java.util.ArrayList;
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
    34
import java.util.Collections;
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
    35
import java.util.List;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
466
6acd5ec503a8 4935607: RFE: LTP: Should be possible to set the TRANSIENT attribute of propertiies to FALSE
malenkov
parents: 2
diff changeset
    37
import java.beans.PropertyChangeEvent;
6acd5ec503a8 4935607: RFE: LTP: Should be possible to set the TRANSIENT attribute of propertiies to FALSE
malenkov
parents: 2
diff changeset
    38
import java.beans.PropertyChangeListener;
6acd5ec503a8 4935607: RFE: LTP: Should be possible to set the TRANSIENT attribute of propertiies to FALSE
malenkov
parents: 2
diff changeset
    39
import java.beans.Transient;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
import javax.swing.event.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
import javax.accessibility.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
import javax.swing.plaf.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
import javax.swing.text.Position;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
import java.io.ObjectOutputStream;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
import java.io.ObjectInputStream;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
import java.io.IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
import java.io.Serializable;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
import sun.swing.SwingUtilities2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
import sun.swing.SwingUtilities2.Section;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
import static sun.swing.SwingUtilities2.Section.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
/**
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
 * A component that displays a list of objects and allows the user to select
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
 * one or more items. A separate model, {@code ListModel}, maintains the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
 * contents of the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
 * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
 * It's easy to display an array or Vector of objects, using the {@code JList}
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
 * constructor that automatically builds a read-only {@code ListModel} instance
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
 * for you:
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
 * <pre>
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
    65
 * {@code
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
 * // Create a JList that displays strings from an array
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
 * String[] data = {"one", "two", "three", "four"};
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
    69
 * JList<String> myList = new JList<String>(data);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
 * // Create a JList that displays the superclasses of JList.class, by
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
 * // creating it with a Vector populated with this data
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
 *
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
    74
 * Vector<Class<?>> superClasses = new Vector<Class<?>>();
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
    75
 * Class<JList> rootClass = javax.swing.JList.class;
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
    76
 * for(Class<?> cls = rootClass; cls != null; cls = cls.getSuperclass()) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
 *     superClasses.addElement(cls);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
 * }
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
    79
 * JList<Class<?>> myList = new JList<Class<?>>(superClasses);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
 * // The automatically created model is stored in JList's "model"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
 * // property, which you can retrieve
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
 *
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
    84
 * ListModel<Class<?>> model = myList.getModel();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
 * for(int i = 0; i < model.getSize(); i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
 *     System.out.println(model.getElementAt(i));
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
 * }
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
    88
 * }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
 * </pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
 * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
 * A {@code ListModel} can be supplied directly to a {@code JList} by way of a
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
 * constructor or the {@code setModel} method. The contents need not be static -
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
 * the number of items, and the values of items can change over time. A correct
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
 * {@code ListModel} implementation notifies the set of
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
 * {@code javax.swing.event.ListDataListener}s that have been added to it, each
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
 * time a change occurs. These changes are characterized by a
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
 * {@code javax.swing.event.ListDataEvent}, which identifies the range of list
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
 * indices that have been modified, added, or removed. {@code JList}'s
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
 * {@code ListUI} is responsible for keeping the visual representation up to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
 * date with changes, by listening to the model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
 * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
 * Simple, dynamic-content, {@code JList} applications can use the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
 * {@code DefaultListModel} class to maintain list elements. This class
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
 * implements the {@code ListModel} interface and also provides a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
 * <code>java.util.Vector</code>-like API. Applications that need a more
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
 * custom <code>ListModel</code> implementation may instead wish to subclass
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
 * {@code AbstractListModel}, which provides basic support for managing and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
 * notifying listeners. For example, a read-only implementation of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
 * {@code AbstractListModel}:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
 * <pre>
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   111
 * {@code
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
 * // This list model has about 2^16 elements.  Enjoy scrolling.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
 *
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   114
 * ListModel<String> bigData = new AbstractListModel<String>() {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
 *     public int getSize() { return Short.MAX_VALUE; }
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   116
 *     public String getElementAt(int index) { return "Index " + index; }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
 * };
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   118
 * }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
 * </pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
 * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
 * The selection state of a {@code JList} is managed by another separate
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
 * model, an instance of {@code ListSelectionModel}. {@code JList} is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
 * initialized with a selection model on construction, and also contains
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
 * methods to query or set this selection model. Additionally, {@code JList}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
 * provides convenient methods for easily managing the selection. These methods,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
 * such as {@code setSelectedIndex} and {@code getSelectedValue}, are cover
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
 * methods that take care of the details of interacting with the selection
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
 * model. By default, {@code JList}'s selection model is configured to allow any
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
 * combination of items to be selected at a time; selection mode
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
 * {@code MULTIPLE_INTERVAL_SELECTION}. The selection mode can be changed
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
 * on the selection model directly, or via {@code JList}'s cover method.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
 * Responsibility for updating the selection model in response to user gestures
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
 * lies with the list's {@code ListUI}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
 * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
 * A correct {@code ListSelectionModel} implementation notifies the set of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
 * {@code javax.swing.event.ListSelectionListener}s that have been added to it
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
 * each time a change to the selection occurs. These changes are characterized
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
 * by a {@code javax.swing.event.ListSelectionEvent}, which identifies the range
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
 * of the selection change.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
 * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
 * The preferred way to listen for changes in list selection is to add
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
 * {@code ListSelectionListener}s directly to the {@code JList}. {@code JList}
28059
e576535359cc 8067377: My hobby: caning, then then canning, the the can-can
martin
parents: 25859
diff changeset
   143
 * then takes care of listening to the selection model and notifying your
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
 * listeners of change.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
 * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
 * Responsibility for listening to selection changes in order to keep the list's
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
 * visual representation up to date lies with the list's {@code ListUI}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
 * <p>
21592
da6abe91602a 8025234: [javadoc] fix some errors in javax.swing.**
yan
parents: 20458
diff changeset
   149
 * <a name="renderer"></a>
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
 * Painting of cells in a {@code JList} is handled by a delegate called a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
 * cell renderer, installed on the list as the {@code cellRenderer} property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
 * The renderer provides a {@code java.awt.Component} that is used
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
 * like a "rubber stamp" to paint the cells. Each time a cell needs to be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
 * painted, the list's {@code ListUI} asks the cell renderer for the component,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
 * moves it into place, and has it paint the contents of the cell by way of its
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
 * {@code paint} method. A default cell renderer, which uses a {@code JLabel}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
 * component to render, is installed by the lists's {@code ListUI}. You can
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
 * substitute your own renderer using code like this:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
 * <pre>
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   160
 * {@code
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
 *  // Display an icon and a string for each object in the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
 *
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   163
 * class MyCellRenderer extends JLabel implements ListCellRenderer<Object> {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
 *     final static ImageIcon longIcon = new ImageIcon("long.gif");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
 *     final static ImageIcon shortIcon = new ImageIcon("short.gif");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
 *     // This is the only method defined by ListCellRenderer.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
 *     // We just reconfigure the JLabel each time we're called.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
 *     public Component getListCellRendererComponent(
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   171
 *       JList<?> list,           // the list
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
 *       Object value,            // value to display
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
 *       int index,               // cell index
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
 *       boolean isSelected,      // is the cell selected
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
 *       boolean cellHasFocus)    // does the cell have focus
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
 *     {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
 *         String s = value.toString();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
 *         setText(s);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
 *         setIcon((s.length() > 10) ? longIcon : shortIcon);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
 *         if (isSelected) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
 *             setBackground(list.getSelectionBackground());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
 *             setForeground(list.getSelectionForeground());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
 *         } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
 *             setBackground(list.getBackground());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
 *             setForeground(list.getForeground());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
 *         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
 *         setEnabled(list.isEnabled());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
 *         setFont(list.getFont());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
 *         setOpaque(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
 *         return this;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
 *     }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
 * }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
 * myList.setCellRenderer(new MyCellRenderer());
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   195
 * }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
 * </pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
 * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
 * Another job for the cell renderer is in helping to determine sizing
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
 * information for the list. By default, the list's {@code ListUI} determines
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
 * the size of cells by asking the cell renderer for its preferred
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
 * size for each list item. This can be expensive for large lists of items.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
 * To avoid these calculations, you can set a {@code fixedCellWidth} and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
 * {@code fixedCellHeight} on the list, or have these values calculated
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
 * automatically based on a single prototype value:
21592
da6abe91602a 8025234: [javadoc] fix some errors in javax.swing.**
yan
parents: 20458
diff changeset
   205
 * <a name="prototype_example"></a>
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
 * <pre>
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   207
 * {@code
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   208
 * JList<String> bigDataList = new JList<String>(bigData);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
 * // We don't want the JList implementation to compute the width
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
 * // or height of all of the list cells, so we give it a string
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
 * // that's as big as we'll need for any cell.  It uses this to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
 * // compute values for the fixedCellWidth and fixedCellHeight
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
 * // properties.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
 * bigDataList.setPrototypeCellValue("Index 1234567890");
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   217
 * }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
 * </pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
 * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
 * {@code JList} doesn't implement scrolling directly. To create a list that
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
 * scrolls, make it the viewport view of a {@code JScrollPane}. For example:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
 * <pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
 * JScrollPane scrollPane = new JScrollPane(myList);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
 * // Or in two steps:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
 * JScrollPane scrollPane = new JScrollPane();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
 * scrollPane.getViewport().setView(myList);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
 * </pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
 * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
 * {@code JList} doesn't provide any special handling of double or triple
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
 * (or N) mouse clicks, but it's easy to add a {@code MouseListener} if you
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
 * wish to take action on these events. Use the {@code locationToIndex}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
 * method to determine what cell was clicked. For example:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
 * <pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
 * MouseListener mouseListener = new MouseAdapter() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
 *     public void mouseClicked(MouseEvent e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
 *         if (e.getClickCount() == 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
 *             int index = list.locationToIndex(e.getPoint());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
 *             System.out.println("Double clicked on Item " + index);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
 *          }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
 *     }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
 * };
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
 * list.addMouseListener(mouseListener);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
 * </pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
 * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
 * <strong>Warning:</strong> Swing is not thread safe. For more
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
 * information see <a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
 * href="package-summary.html#threading">Swing's Threading
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
 * Policy</a>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
 * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
 * <strong>Warning:</strong>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
 * Serialized objects of this class will not be compatible with
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
 * future Swing releases. The current serialization support is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
 * appropriate for short term storage or RMI between applications running
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
 * the same version of Swing.  As of 1.4, support for long term storage
20458
f2423fb3fd19 8025840: Fix all the doclint warnings about trademark
cl
parents: 20455
diff changeset
   256
 * of all JavaBeans&trade;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
 * has been added to the <code>java.beans</code> package.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
 * Please see {@link java.beans.XMLEncoder}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
 * <p>
20455
f6f9a0c2796b 8020688: Broken links in documentation at http://docs.oracle.com/javase/6/docs/api/index.
mcherkas
parents: 7668
diff changeset
   260
 * See <a href="http://docs.oracle.com/javase/tutorial/uiswing/components/list.html">How to Use Lists</a>
f6f9a0c2796b 8020688: Broken links in documentation at http://docs.oracle.com/javase/6/docs/api/index.
mcherkas
parents: 7668
diff changeset
   261
 * in <a href="http://docs.oracle.com/javase/tutorial/"><em>The Java Tutorial</em></a>
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
 * for further documentation.
23715
54ae9dd9df73 8039074: Tidy warnings cleanup for javax.swing
yan
parents: 22574
diff changeset
   263
 *
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
 * @see ListModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
 * @see AbstractListModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
 * @see DefaultListModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
 * @see ListSelectionModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
 * @see DefaultListSelectionModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
 * @see ListCellRenderer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
 * @see DefaultListCellRenderer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
 *
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   272
 * @param <E> the type of the elements of this list
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   273
 *
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
 * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
 *   attribute: isContainer false
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
 * description: A component which allows for the selection of one or more objects from a list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
 * @author Hans Muller
25201
4adc75e0c4e5 8046485: Add missing @since tag under javax.swing.*
henryjen
parents: 23715
diff changeset
   279
 * @since 1.2
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
 */
22574
7f8ce0c8c20a 8032627: Add @SuppressWarnings("serial") to appropriate javax.swing classes
darcy
parents: 21982
diff changeset
   281
@SuppressWarnings("serial") // Same-version serialization only
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   282
public class JList<E> extends JComponent implements Scrollable, Accessible
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
     * @see #getUIClassID
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
     * @see #readObject
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
    private static final String uiClassID = "ListUI";
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
     * Indicates a vertical layout of cells, in a single column;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
     * the default layout.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
     * @see #setLayoutOrientation
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
     * @since 1.4
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
    public static final int VERTICAL = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
     * Indicates a "newspaper style" layout with cells flowing vertically
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
     * then horizontally.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
     * @see #setLayoutOrientation
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
     * @since 1.4
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
    public static final int VERTICAL_WRAP = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
     * Indicates a "newspaper style" layout with cells flowing horizontally
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
     * then vertically.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
     * @see #setLayoutOrientation
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
     * @since 1.4
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
    public static final int HORIZONTAL_WRAP = 2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
    private int fixedCellWidth = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
    private int fixedCellHeight = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
    private int horizontalScrollIncrement = -1;
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   317
    private E prototypeCellValue;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
    private int visibleRowCount = 8;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
    private Color selectionForeground;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
    private Color selectionBackground;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
    private boolean dragEnabled;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
    private ListSelectionModel selectionModel;
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   324
    private ListModel<E> dataModel;
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   325
    private ListCellRenderer<? super E> cellRenderer;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
    private ListSelectionListener selectionListener;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
90ce3da70b43 Initial load
duke
parents:
diff changeset
   328
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
     * How to lay out the cells; defaults to <code>VERTICAL</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   331
    private int layoutOrientation;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
90ce3da70b43 Initial load
duke
parents:
diff changeset
   333
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
     * The drop mode for this component.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
    private DropMode dropMode = DropMode.USE_SELECTION;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   337
90ce3da70b43 Initial load
duke
parents:
diff changeset
   338
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   339
     * The drop location.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   340
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   341
    private transient DropLocation dropLocation;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
90ce3da70b43 Initial load
duke
parents:
diff changeset
   343
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   344
     * A subclass of <code>TransferHandler.DropLocation</code> representing
90ce3da70b43 Initial load
duke
parents:
diff changeset
   345
     * a drop location for a <code>JList</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   346
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   347
     * @see #getDropLocation
90ce3da70b43 Initial load
duke
parents:
diff changeset
   348
     * @since 1.6
90ce3da70b43 Initial load
duke
parents:
diff changeset
   349
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
    public static final class DropLocation extends TransferHandler.DropLocation {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   351
        private final int index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
        private final boolean isInsert;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
        private DropLocation(Point p, int index, boolean isInsert) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
            super(p);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
            this.index = index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   357
            this.isInsert = isInsert;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   358
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   359
90ce3da70b43 Initial load
duke
parents:
diff changeset
   360
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   361
         * Returns the index where dropped data should be placed in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   362
         * list. Interpretation of the value depends on the drop mode set on
90ce3da70b43 Initial load
duke
parents:
diff changeset
   363
         * the associated component. If the drop mode is either
90ce3da70b43 Initial load
duke
parents:
diff changeset
   364
         * <code>DropMode.USE_SELECTION</code> or <code>DropMode.ON</code>,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   365
         * the return value is an index of a row in the list. If the drop mode is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   366
         * <code>DropMode.INSERT</code>, the return value refers to the index
90ce3da70b43 Initial load
duke
parents:
diff changeset
   367
         * where the data should be inserted. If the drop mode is
90ce3da70b43 Initial load
duke
parents:
diff changeset
   368
         * <code>DropMode.ON_OR_INSERT</code>, the value of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   369
         * <code>isInsert()</code> indicates whether the index is an index
90ce3da70b43 Initial load
duke
parents:
diff changeset
   370
         * of a row, or an insert index.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   371
         * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   372
         * <code>-1</code> indicates that the drop occurred over empty space,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   373
         * and no index could be calculated.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   374
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
         * @return the drop index
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
        public int getIndex() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   378
            return index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   379
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
90ce3da70b43 Initial load
duke
parents:
diff changeset
   381
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   382
         * Returns whether or not this location represents an insert
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
         * location.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
         * @return whether or not this is an insert location
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
        public boolean isInsert() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
            return isInsert;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   390
90ce3da70b43 Initial load
duke
parents:
diff changeset
   391
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   392
         * Returns a string representation of this drop location.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   393
         * This method is intended to be used for debugging purposes,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   394
         * and the content and format of the returned string may vary
90ce3da70b43 Initial load
duke
parents:
diff changeset
   395
         * between implementations.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   396
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
         * @return a string representation of this drop location
90ce3da70b43 Initial load
duke
parents:
diff changeset
   398
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   399
        public String toString() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   400
            return getClass().getName()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   401
                   + "[dropPoint=" + getDropPoint() + ","
90ce3da70b43 Initial load
duke
parents:
diff changeset
   402
                   + "index=" + index + ","
90ce3da70b43 Initial load
duke
parents:
diff changeset
   403
                   + "insert=" + isInsert + "]";
90ce3da70b43 Initial load
duke
parents:
diff changeset
   404
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   405
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   406
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
     * Constructs a {@code JList} that displays elements from the specified,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
     * {@code non-null}, model. All {@code JList} constructors delegate to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   410
     * this one.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
     * This constructor registers the list with the {@code ToolTipManager},
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
     * allowing for tooltips to be provided by the cell renderers.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
     * @param dataModel the model for the list
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
     * @exception IllegalArgumentException if the model is {@code null}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
     */
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   418
    public JList(ListModel<E> dataModel)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
        if (dataModel == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   421
            throw new IllegalArgumentException("dataModel must be non null");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
        // Register with the ToolTipManager so that tooltips from the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
        // renderer show through.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
        ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
        toolTipManager.registerComponent(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
        layoutOrientation = VERTICAL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
        this.dataModel = dataModel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
        selectionModel = createSelectionModel();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
        setAutoscrolls(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
        setOpaque(true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
        updateUI();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
     * Constructs a <code>JList</code> that displays the elements in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
     * the specified array. This constructor creates a read-only model
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
     * for the given array, and then delegates to the constructor that
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
     * takes a {@code ListModel}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
     * Attempts to pass a {@code null} value to this method results in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
     * undefined behavior and, most likely, exceptions. The created model
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
     * references the given array directly. Attempts to modify the array
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
     * after constructing the list results in undefined behavior.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   449
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   450
     * @param  listData  the array of Objects to be loaded into the data model,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   451
     *                   {@code non-null}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   452
     */
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   453
    public JList(final E[] listData)
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
        this (
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   456
            new AbstractListModel<E>() {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
                public int getSize() { return listData.length; }
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   458
                public E getElementAt(int i) { return listData[i]; }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
        );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
     * Constructs a <code>JList</code> that displays the elements in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
     * the specified <code>Vector</code>. This constructor creates a read-only
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
     * model for the given {@code Vector}, and then delegates to the constructor
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
     * that takes a {@code ListModel}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   469
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   470
     * Attempts to pass a {@code null} value to this method results in
90ce3da70b43 Initial load
duke
parents:
diff changeset
   471
     * undefined behavior and, most likely, exceptions. The created model
90ce3da70b43 Initial load
duke
parents:
diff changeset
   472
     * references the given {@code Vector} directly. Attempts to modify the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
     * {@code Vector} after constructing the list results in undefined behavior.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
     * @param  listData  the <code>Vector</code> to be loaded into the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
     *                   data model, {@code non-null}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
     */
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   478
    public JList(final Vector<? extends E> listData) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   479
        this (
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   480
            new AbstractListModel<E>() {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   481
                public int getSize() { return listData.size(); }
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   482
                public E getElementAt(int i) { return listData.elementAt(i); }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   483
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   484
        );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   485
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   486
90ce3da70b43 Initial load
duke
parents:
diff changeset
   487
90ce3da70b43 Initial load
duke
parents:
diff changeset
   488
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   489
     * Constructs a <code>JList</code> with an empty, read-only, model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   490
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   491
    public JList() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   492
        this (
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   493
            new AbstractListModel<E>() {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
              public int getSize() { return 0; }
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   495
              public E getElementAt(int i) { throw new IndexOutOfBoundsException("No Data Model"); }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   497
        );
90ce3da70b43 Initial load
duke
parents:
diff changeset
   498
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   499
90ce3da70b43 Initial load
duke
parents:
diff changeset
   500
90ce3da70b43 Initial load
duke
parents:
diff changeset
   501
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   502
     * Returns the {@code ListUI}, the look and feel object that
90ce3da70b43 Initial load
duke
parents:
diff changeset
   503
     * renders this component.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   504
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
     * @return the <code>ListUI</code> object that renders this component
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
    public ListUI getUI() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
        return (ListUI)ui;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   509
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
     * Sets the {@code ListUI}, the look and feel object that
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
     * renders this component.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
     * @param ui  the <code>ListUI</code> object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
     * @see UIDefaults#getUI
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
     *        bound: true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   520
     *       hidden: true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
     *    attribute: visualUpdate true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
     *  description: The UI object that implements the Component's LookAndFeel.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
    public void setUI(ListUI ui) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   525
        super.setUI(ui);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   526
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
     * Resets the {@code ListUI} property by setting it to the value provided
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
     * by the current look and feel. If the current cell renderer was installed
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
     * by the developer (rather than the look and feel itself), this also causes
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
     * the cell renderer and its children to be updated, by calling
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
     * {@code SwingUtilities.updateComponentTreeUI} on it.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
     * @see UIManager#getUI
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
     * @see SwingUtilities#updateComponentTreeUI
90ce3da70b43 Initial load
duke
parents:
diff changeset
   538
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
    public void updateUI() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
        setUI((ListUI)UIManager.getUI(this));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   542
        ListCellRenderer<? super E> renderer = getCellRenderer();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
        if (renderer instanceof Component) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   544
            SwingUtilities.updateComponentTreeUI((Component)renderer);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   545
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   546
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
     * Returns {@code "ListUI"}, the <code>UIDefaults</code> key used to look
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
     * up the name of the {@code javax.swing.plaf.ListUI} class that defines
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
     * the look and feel for this component.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   553
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   554
     * @return the string "ListUI"
90ce3da70b43 Initial load
duke
parents:
diff changeset
   555
     * @see JComponent#getUIClassID
90ce3da70b43 Initial load
duke
parents:
diff changeset
   556
     * @see UIDefaults#getUI
90ce3da70b43 Initial load
duke
parents:
diff changeset
   557
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   558
    public String getUIClassID() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   559
        return uiClassID;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   560
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   561
90ce3da70b43 Initial load
duke
parents:
diff changeset
   562
90ce3da70b43 Initial load
duke
parents:
diff changeset
   563
    /* -----private-----
90ce3da70b43 Initial load
duke
parents:
diff changeset
   564
     * This method is called by setPrototypeCellValue and setCellRenderer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
     * to update the fixedCellWidth and fixedCellHeight properties from the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   566
     * current value of prototypeCellValue (if it's non null).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   567
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   568
     * This method sets fixedCellWidth and fixedCellHeight but does <b>not</b>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   569
     * generate PropertyChangeEvents for them.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   570
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   571
     * @see #setPrototypeCellValue
90ce3da70b43 Initial load
duke
parents:
diff changeset
   572
     * @see #setCellRenderer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   573
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   574
    private void updateFixedCellSize()
90ce3da70b43 Initial load
duke
parents:
diff changeset
   575
    {
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   576
        ListCellRenderer<? super E> cr = getCellRenderer();
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   577
        E value = getPrototypeCellValue();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   578
90ce3da70b43 Initial load
duke
parents:
diff changeset
   579
        if ((cr != null) && (value != null)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   580
            Component c = cr.getListCellRendererComponent(this, value, 0, false, false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   581
90ce3da70b43 Initial load
duke
parents:
diff changeset
   582
            /* The ListUI implementation will add Component c to its private
90ce3da70b43 Initial load
duke
parents:
diff changeset
   583
             * CellRendererPane however we can't assume that's already
90ce3da70b43 Initial load
duke
parents:
diff changeset
   584
             * been done here.  So we temporarily set the one "inherited"
90ce3da70b43 Initial load
duke
parents:
diff changeset
   585
             * property that may affect the renderer components preferred size:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   586
             * its font.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   587
             */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   588
            Font f = c.getFont();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   589
            c.setFont(getFont());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   590
90ce3da70b43 Initial load
duke
parents:
diff changeset
   591
            Dimension d = c.getPreferredSize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   592
            fixedCellWidth = d.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   593
            fixedCellHeight = d.height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   594
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
            c.setFont(f);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   597
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   598
90ce3da70b43 Initial load
duke
parents:
diff changeset
   599
90ce3da70b43 Initial load
duke
parents:
diff changeset
   600
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   601
     * Returns the "prototypical" cell value -- a value used to calculate a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   602
     * fixed width and height for cells. This can be {@code null} if there
90ce3da70b43 Initial load
duke
parents:
diff changeset
   603
     * is no such value.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   604
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   605
     * @return the value of the {@code prototypeCellValue} property
90ce3da70b43 Initial load
duke
parents:
diff changeset
   606
     * @see #setPrototypeCellValue
90ce3da70b43 Initial load
duke
parents:
diff changeset
   607
     */
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   608
    public E getPrototypeCellValue() {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   609
        return prototypeCellValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   610
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   611
90ce3da70b43 Initial load
duke
parents:
diff changeset
   612
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   613
     * Sets the {@code prototypeCellValue} property, and then (if the new value
90ce3da70b43 Initial load
duke
parents:
diff changeset
   614
     * is {@code non-null}), computes the {@code fixedCellWidth} and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   615
     * {@code fixedCellHeight} properties by requesting the cell renderer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   616
     * component for the given value (and index 0) from the cell renderer, and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   617
     * using that component's preferred size.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   618
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   619
     * This method is useful when the list is too long to allow the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   620
     * {@code ListUI} to compute the width/height of each cell, and there is a
90ce3da70b43 Initial load
duke
parents:
diff changeset
   621
     * single cell value that is known to occupy as much space as any of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   622
     * others, a so-called prototype.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   623
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   624
     * While all three of the {@code prototypeCellValue},
90ce3da70b43 Initial load
duke
parents:
diff changeset
   625
     * {@code fixedCellHeight}, and {@code fixedCellWidth} properties may be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   626
     * modified by this method, {@code PropertyChangeEvent} notifications are
90ce3da70b43 Initial load
duke
parents:
diff changeset
   627
     * only sent when the {@code prototypeCellValue} property changes.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   628
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   629
     * To see an example which sets this property, see the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
     * <a href="#prototype_example">class description</a> above.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
     * The default value of this property is <code>null</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   634
     * This is a JavaBeans bound property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   635
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
     * @param prototypeCellValue  the value on which to base
90ce3da70b43 Initial load
duke
parents:
diff changeset
   637
     *                          <code>fixedCellWidth</code> and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   638
     *                          <code>fixedCellHeight</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   639
     * @see #getPrototypeCellValue
90ce3da70b43 Initial load
duke
parents:
diff changeset
   640
     * @see #setFixedCellWidth
90ce3da70b43 Initial load
duke
parents:
diff changeset
   641
     * @see #setFixedCellHeight
90ce3da70b43 Initial load
duke
parents:
diff changeset
   642
     * @see JComponent#addPropertyChangeListener
90ce3da70b43 Initial load
duke
parents:
diff changeset
   643
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
   644
     *       bound: true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   645
     *   attribute: visualUpdate true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   646
     * description: The cell prototype value, used to compute cell width and height.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   647
     */
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   648
    public void setPrototypeCellValue(E prototypeCellValue) {
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   649
        E oldValue = this.prototypeCellValue;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   650
        this.prototypeCellValue = prototypeCellValue;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   651
90ce3da70b43 Initial load
duke
parents:
diff changeset
   652
        /* If the prototypeCellValue has changed and is non-null,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   653
         * then recompute fixedCellWidth and fixedCellHeight.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   654
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   655
90ce3da70b43 Initial load
duke
parents:
diff changeset
   656
        if ((prototypeCellValue != null) && !prototypeCellValue.equals(oldValue)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   657
            updateFixedCellSize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   658
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   659
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
        firePropertyChange("prototypeCellValue", oldValue, prototypeCellValue);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   661
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
90ce3da70b43 Initial load
duke
parents:
diff changeset
   664
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
     * Returns the value of the {@code fixedCellWidth} property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   666
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
     * @return the fixed cell width
90ce3da70b43 Initial load
duke
parents:
diff changeset
   668
     * @see #setFixedCellWidth
90ce3da70b43 Initial load
duke
parents:
diff changeset
   669
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   670
    public int getFixedCellWidth() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   671
        return fixedCellWidth;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   672
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   673
90ce3da70b43 Initial load
duke
parents:
diff changeset
   674
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   675
     * Sets a fixed value to be used for the width of every cell in the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   676
     * If {@code width} is -1, cell widths are computed in the {@code ListUI}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
     * by applying <code>getPreferredSize</code> to the cell renderer component
90ce3da70b43 Initial load
duke
parents:
diff changeset
   678
     * for each list element.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   679
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   680
     * The default value of this property is {@code -1}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   681
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   682
     * This is a JavaBeans bound property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   683
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   684
     * @param width the width to be used for all cells in the list
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
     * @see #setPrototypeCellValue
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
     * @see #setFixedCellWidth
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
     * @see JComponent#addPropertyChangeListener
90ce3da70b43 Initial load
duke
parents:
diff changeset
   688
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
     *       bound: true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
     *   attribute: visualUpdate true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
     * description: Defines a fixed cell width when greater than zero.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   692
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   693
    public void setFixedCellWidth(int width) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
        int oldValue = fixedCellWidth;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   695
        fixedCellWidth = width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   696
        firePropertyChange("fixedCellWidth", oldValue, fixedCellWidth);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
90ce3da70b43 Initial load
duke
parents:
diff changeset
   700
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   701
     * Returns the value of the {@code fixedCellHeight} property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   702
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   703
     * @return the fixed cell height
90ce3da70b43 Initial load
duke
parents:
diff changeset
   704
     * @see #setFixedCellHeight
90ce3da70b43 Initial load
duke
parents:
diff changeset
   705
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   706
    public int getFixedCellHeight() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   707
        return fixedCellHeight;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   708
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
90ce3da70b43 Initial load
duke
parents:
diff changeset
   710
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   711
     * Sets a fixed value to be used for the height of every cell in the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   712
     * If {@code height} is -1, cell heights are computed in the {@code ListUI}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   713
     * by applying <code>getPreferredSize</code> to the cell renderer component
90ce3da70b43 Initial load
duke
parents:
diff changeset
   714
     * for each list element.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   715
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   716
     * The default value of this property is {@code -1}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   717
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   718
     * This is a JavaBeans bound property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
     *
28059
e576535359cc 8067377: My hobby: caning, then then canning, the the can-can
martin
parents: 25859
diff changeset
   720
     * @param height the height to be used for all cells in the list
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
     * @see #setPrototypeCellValue
90ce3da70b43 Initial load
duke
parents:
diff changeset
   722
     * @see #setFixedCellWidth
90ce3da70b43 Initial load
duke
parents:
diff changeset
   723
     * @see JComponent#addPropertyChangeListener
90ce3da70b43 Initial load
duke
parents:
diff changeset
   724
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
   725
     *       bound: true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   726
     *   attribute: visualUpdate true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
     * description: Defines a fixed cell height when greater than zero.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   728
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
    public void setFixedCellHeight(int height) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   730
        int oldValue = fixedCellHeight;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   731
        fixedCellHeight = height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   732
        firePropertyChange("fixedCellHeight", oldValue, fixedCellHeight);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   733
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   734
90ce3da70b43 Initial load
duke
parents:
diff changeset
   735
90ce3da70b43 Initial load
duke
parents:
diff changeset
   736
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   737
     * Returns the object responsible for painting list items.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
     * @return the value of the {@code cellRenderer} property
90ce3da70b43 Initial load
duke
parents:
diff changeset
   740
     * @see #setCellRenderer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   741
     */
466
6acd5ec503a8 4935607: RFE: LTP: Should be possible to set the TRANSIENT attribute of propertiies to FALSE
malenkov
parents: 2
diff changeset
   742
    @Transient
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   743
    public ListCellRenderer<? super E> getCellRenderer() {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   744
        return cellRenderer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   745
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   746
90ce3da70b43 Initial load
duke
parents:
diff changeset
   747
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   748
     * Sets the delegate that is used to paint each cell in the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   749
     * The job of a cell renderer is discussed in detail in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   750
     * <a href="#renderer">class level documentation</a>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   751
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   752
     * If the {@code prototypeCellValue} property is {@code non-null},
90ce3da70b43 Initial load
duke
parents:
diff changeset
   753
     * setting the cell renderer also causes the {@code fixedCellWidth} and
90ce3da70b43 Initial load
duke
parents:
diff changeset
   754
     * {@code fixedCellHeight} properties to be re-calculated. Only one
90ce3da70b43 Initial load
duke
parents:
diff changeset
   755
     * <code>PropertyChangeEvent</code> is generated however -
90ce3da70b43 Initial load
duke
parents:
diff changeset
   756
     * for the <code>cellRenderer</code> property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   757
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   758
     * The default value of this property is provided by the {@code ListUI}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   759
     * delegate, i.e. by the look and feel implementation.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   760
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   761
     * This is a JavaBeans bound property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   762
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   763
     * @param cellRenderer the <code>ListCellRenderer</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   764
     *                          that paints list cells
90ce3da70b43 Initial load
duke
parents:
diff changeset
   765
     * @see #getCellRenderer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   766
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
   767
     *       bound: true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   768
     *   attribute: visualUpdate true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   769
     * description: The component used to draw the cells.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   770
     */
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   771
    public void setCellRenderer(ListCellRenderer<? super E> cellRenderer) {
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
   772
        ListCellRenderer<? super E> oldValue = this.cellRenderer;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   773
        this.cellRenderer = cellRenderer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   774
90ce3da70b43 Initial load
duke
parents:
diff changeset
   775
        /* If the cellRenderer has changed and prototypeCellValue
90ce3da70b43 Initial load
duke
parents:
diff changeset
   776
         * was set, then recompute fixedCellWidth and fixedCellHeight.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   777
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   778
        if ((cellRenderer != null) && !cellRenderer.equals(oldValue)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   779
            updateFixedCellSize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   780
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   781
90ce3da70b43 Initial load
duke
parents:
diff changeset
   782
        firePropertyChange("cellRenderer", oldValue, cellRenderer);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   783
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   784
90ce3da70b43 Initial load
duke
parents:
diff changeset
   785
90ce3da70b43 Initial load
duke
parents:
diff changeset
   786
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   787
     * Returns the color used to draw the foreground of selected items.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   788
     * {@code DefaultListCellRenderer} uses this color to draw the foreground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   789
     * of items in the selected state, as do the renderers installed by most
90ce3da70b43 Initial load
duke
parents:
diff changeset
   790
     * {@code ListUI} implementations.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   791
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   792
     * @return the color to draw the foreground of selected items
90ce3da70b43 Initial load
duke
parents:
diff changeset
   793
     * @see #setSelectionForeground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   794
     * @see DefaultListCellRenderer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   795
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   796
    public Color getSelectionForeground() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   797
        return selectionForeground;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   798
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   799
90ce3da70b43 Initial load
duke
parents:
diff changeset
   800
90ce3da70b43 Initial load
duke
parents:
diff changeset
   801
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   802
     * Sets the color used to draw the foreground of selected items, which
90ce3da70b43 Initial load
duke
parents:
diff changeset
   803
     * cell renderers can use to render text and graphics.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   804
     * {@code DefaultListCellRenderer} uses this color to draw the foreground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   805
     * of items in the selected state, as do the renderers installed by most
90ce3da70b43 Initial load
duke
parents:
diff changeset
   806
     * {@code ListUI} implementations.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   807
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   808
     * The default value of this property is defined by the look and feel
90ce3da70b43 Initial load
duke
parents:
diff changeset
   809
     * implementation.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   810
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   811
     * This is a JavaBeans bound property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   812
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   813
     * @param selectionForeground  the {@code Color} to use in the foreground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   814
     *                             for selected list items
90ce3da70b43 Initial load
duke
parents:
diff changeset
   815
     * @see #getSelectionForeground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   816
     * @see #setSelectionBackground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   817
     * @see #setForeground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   818
     * @see #setBackground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   819
     * @see #setFont
90ce3da70b43 Initial load
duke
parents:
diff changeset
   820
     * @see DefaultListCellRenderer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   821
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
   822
     *       bound: true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   823
     *   attribute: visualUpdate true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   824
     * description: The foreground color of selected cells.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   825
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   826
    public void setSelectionForeground(Color selectionForeground) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   827
        Color oldValue = this.selectionForeground;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   828
        this.selectionForeground = selectionForeground;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   829
        firePropertyChange("selectionForeground", oldValue, selectionForeground);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   830
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   831
90ce3da70b43 Initial load
duke
parents:
diff changeset
   832
90ce3da70b43 Initial load
duke
parents:
diff changeset
   833
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   834
     * Returns the color used to draw the background of selected items.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   835
     * {@code DefaultListCellRenderer} uses this color to draw the background
90ce3da70b43 Initial load
duke
parents:
diff changeset
   836
     * of items in the selected state, as do the renderers installed by most
90ce3da70b43 Initial load
duke
parents:
diff changeset
   837
     * {@code ListUI} implementations.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   838
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   839
     * @return the color to draw the background of selected items
90ce3da70b43 Initial load
duke
parents:
diff changeset
   840
     * @see #setSelectionBackground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   841
     * @see DefaultListCellRenderer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   842
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   843
    public Color getSelectionBackground() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   844
        return selectionBackground;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   845
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   846
90ce3da70b43 Initial load
duke
parents:
diff changeset
   847
90ce3da70b43 Initial load
duke
parents:
diff changeset
   848
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   849
     * Sets the color used to draw the background of selected items, which
90ce3da70b43 Initial load
duke
parents:
diff changeset
   850
     * cell renderers can use fill selected cells.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   851
     * {@code DefaultListCellRenderer} uses this color to fill the background
90ce3da70b43 Initial load
duke
parents:
diff changeset
   852
     * of items in the selected state, as do the renderers installed by most
90ce3da70b43 Initial load
duke
parents:
diff changeset
   853
     * {@code ListUI} implementations.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   854
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   855
     * The default value of this property is defined by the look
90ce3da70b43 Initial load
duke
parents:
diff changeset
   856
     * and feel implementation.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   857
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   858
     * This is a JavaBeans bound property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   859
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   860
     * @param selectionBackground  the {@code Color} to use for the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   861
     *                             background of selected cells
90ce3da70b43 Initial load
duke
parents:
diff changeset
   862
     * @see #getSelectionBackground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   863
     * @see #setSelectionForeground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   864
     * @see #setForeground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   865
     * @see #setBackground
90ce3da70b43 Initial load
duke
parents:
diff changeset
   866
     * @see #setFont
90ce3da70b43 Initial load
duke
parents:
diff changeset
   867
     * @see DefaultListCellRenderer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   868
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
   869
     *       bound: true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   870
     *   attribute: visualUpdate true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   871
     * description: The background color of selected cells.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   872
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   873
    public void setSelectionBackground(Color selectionBackground) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   874
        Color oldValue = this.selectionBackground;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   875
        this.selectionBackground = selectionBackground;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   876
        firePropertyChange("selectionBackground", oldValue, selectionBackground);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   877
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   878
90ce3da70b43 Initial load
duke
parents:
diff changeset
   879
90ce3da70b43 Initial load
duke
parents:
diff changeset
   880
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   881
     * Returns the value of the {@code visibleRowCount} property. See the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   882
     * documentation for {@link #setVisibleRowCount} for details on how to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   883
     * interpret this value.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   884
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   885
     * @return the value of the {@code visibleRowCount} property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   886
     * @see #setVisibleRowCount
90ce3da70b43 Initial load
duke
parents:
diff changeset
   887
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   888
    public int getVisibleRowCount() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   889
        return visibleRowCount;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   890
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   891
90ce3da70b43 Initial load
duke
parents:
diff changeset
   892
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   893
     * Sets the {@code visibleRowCount} property, which has different meanings
90ce3da70b43 Initial load
duke
parents:
diff changeset
   894
     * depending on the layout orientation: For a {@code VERTICAL} layout
90ce3da70b43 Initial load
duke
parents:
diff changeset
   895
     * orientation, this sets the preferred number of rows to display without
90ce3da70b43 Initial load
duke
parents:
diff changeset
   896
     * requiring scrolling; for other orientations, it affects the wrapping of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   897
     * cells.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   898
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   899
     * In {@code VERTICAL} orientation:<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   900
     * Setting this property affects the return value of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   901
     * {@link #getPreferredScrollableViewportSize} method, which is used to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   902
     * calculate the preferred size of an enclosing viewport. See that method's
90ce3da70b43 Initial load
duke
parents:
diff changeset
   903
     * documentation for more details.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   904
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   905
     * In {@code HORIZONTAL_WRAP} and {@code VERTICAL_WRAP} orientations:<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   906
     * This affects how cells are wrapped. See the documentation of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   907
     * {@link #setLayoutOrientation} for more details.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   908
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   909
     * The default value of this property is {@code 8}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   910
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   911
     * Calling this method with a negative value results in the property
90ce3da70b43 Initial load
duke
parents:
diff changeset
   912
     * being set to {@code 0}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   913
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   914
     * This is a JavaBeans bound property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   915
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   916
     * @param visibleRowCount  an integer specifying the preferred number of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   917
     *                         rows to display without requiring scrolling
90ce3da70b43 Initial load
duke
parents:
diff changeset
   918
     * @see #getVisibleRowCount
90ce3da70b43 Initial load
duke
parents:
diff changeset
   919
     * @see #getPreferredScrollableViewportSize
90ce3da70b43 Initial load
duke
parents:
diff changeset
   920
     * @see #setLayoutOrientation
90ce3da70b43 Initial load
duke
parents:
diff changeset
   921
     * @see JComponent#getVisibleRect
90ce3da70b43 Initial load
duke
parents:
diff changeset
   922
     * @see JViewport
90ce3da70b43 Initial load
duke
parents:
diff changeset
   923
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
   924
     *       bound: true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   925
     *   attribute: visualUpdate true
90ce3da70b43 Initial load
duke
parents:
diff changeset
   926
     * description: The preferred number of rows to display without
90ce3da70b43 Initial load
duke
parents:
diff changeset
   927
     *              requiring scrolling
90ce3da70b43 Initial load
duke
parents:
diff changeset
   928
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   929
    public void setVisibleRowCount(int visibleRowCount) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   930
        int oldValue = this.visibleRowCount;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   931
        this.visibleRowCount = Math.max(0, visibleRowCount);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   932
        firePropertyChange("visibleRowCount", oldValue, visibleRowCount);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   933
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   934
90ce3da70b43 Initial load
duke
parents:
diff changeset
   935
90ce3da70b43 Initial load
duke
parents:
diff changeset
   936
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   937
     * Returns the layout orientation property for the list: {@code VERTICAL}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   938
     * if the layout is a single column of cells, {@code VERTICAL_WRAP} if the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   939
     * layout is "newspaper style" with the content flowing vertically then
90ce3da70b43 Initial load
duke
parents:
diff changeset
   940
     * horizontally, or {@code HORIZONTAL_WRAP} if the layout is "newspaper
90ce3da70b43 Initial load
duke
parents:
diff changeset
   941
     * style" with the content flowing horizontally then vertically.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   942
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   943
     * @return the value of the {@code layoutOrientation} property
90ce3da70b43 Initial load
duke
parents:
diff changeset
   944
     * @see #setLayoutOrientation
90ce3da70b43 Initial load
duke
parents:
diff changeset
   945
     * @since 1.4
90ce3da70b43 Initial load
duke
parents:
diff changeset
   946
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   947
    public int getLayoutOrientation() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   948
        return layoutOrientation;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   949
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   950
90ce3da70b43 Initial load
duke
parents:
diff changeset
   951
90ce3da70b43 Initial load
duke
parents:
diff changeset
   952
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   953
     * Defines the way list cells are layed out. Consider a {@code JList}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   954
     * with five cells. Cells can be layed out in one of the following ways:
21982
fd6e5fe509df 8029264: [doclint] more doclint and tidy cleanup
yan
parents: 21592
diff changeset
   955
     *
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   956
     * <pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   957
     * VERTICAL:          0
90ce3da70b43 Initial load
duke
parents:
diff changeset
   958
     *                    1
90ce3da70b43 Initial load
duke
parents:
diff changeset
   959
     *                    2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   960
     *                    3
90ce3da70b43 Initial load
duke
parents:
diff changeset
   961
     *                    4
90ce3da70b43 Initial load
duke
parents:
diff changeset
   962
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   963
     * HORIZONTAL_WRAP:   0  1  2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   964
     *                    3  4
90ce3da70b43 Initial load
duke
parents:
diff changeset
   965
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   966
     * VERTICAL_WRAP:     0  3
90ce3da70b43 Initial load
duke
parents:
diff changeset
   967
     *                    1  4
90ce3da70b43 Initial load
duke
parents:
diff changeset
   968
     *                    2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   969
     * </pre>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   970
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   971
     * A description of these layouts follows:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   972
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   973
     * <table border="1"
90ce3da70b43 Initial load
duke
parents:
diff changeset
   974
     *  summary="Describes layouts VERTICAL, HORIZONTAL_WRAP, and VERTICAL_WRAP">
20458
f2423fb3fd19 8025840: Fix all the doclint warnings about trademark
cl
parents: 20455
diff changeset
   975
     *   <tr><th><p style="text-align:left">Value</p></th><th><p style="text-align:left">Description</p></th></tr>
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   976
     *   <tr><td><code>VERTICAL</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   977
     *       <td>Cells are layed out vertically in a single column.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   978
     *   <tr><td><code>HORIZONTAL_WRAP</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   979
     *       <td>Cells are layed out horizontally, wrapping to a new row as
90ce3da70b43 Initial load
duke
parents:
diff changeset
   980
     *           necessary. If the {@code visibleRowCount} property is less than
90ce3da70b43 Initial load
duke
parents:
diff changeset
   981
     *           or equal to zero, wrapping is determined by the width of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   982
     *           list; otherwise wrapping is done in such a way as to ensure
90ce3da70b43 Initial load
duke
parents:
diff changeset
   983
     *           {@code visibleRowCount} rows in the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   984
     *   <tr><td><code>VERTICAL_WRAP</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   985
     *       <td>Cells are layed out vertically, wrapping to a new column as
90ce3da70b43 Initial load
duke
parents:
diff changeset
   986
     *           necessary. If the {@code visibleRowCount} property is less than
90ce3da70b43 Initial load
duke
parents:
diff changeset
   987
     *           or equal to zero, wrapping is determined by the height of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   988
     *           list; otherwise wrapping is done at {@code visibleRowCount} rows.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   989
     *  </table>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   990
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   991
     * The default value of this property is <code>VERTICAL</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   992
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
   993
     * @param layoutOrientation the new layout orientation, one of:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   994
     *        {@code VERTICAL}, {@code HORIZONTAL_WRAP} or {@code VERTICAL_WRAP}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   995
     * @see #getLayoutOrientation
90ce3da70b43 Initial load
duke
parents:
diff changeset
   996
     * @see #setVisibleRowCount
90ce3da70b43 Initial load
duke
parents:
diff changeset
   997
     * @see #getScrollableTracksViewportHeight
90ce3da70b43 Initial load
duke
parents:
diff changeset
   998
     * @see #getScrollableTracksViewportWidth
90ce3da70b43 Initial load
duke
parents:
diff changeset
   999
     * @throws IllegalArgumentException if {@code layoutOrientation} isn't one of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1000
     *         allowable values
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1001
     * @since 1.4
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1002
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1003
     *       bound: true
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1004
     *   attribute: visualUpdate true
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1005
     * description: Defines the way list cells are layed out.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1006
     *        enum: VERTICAL JList.VERTICAL
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1007
     *              HORIZONTAL_WRAP JList.HORIZONTAL_WRAP
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1008
     *              VERTICAL_WRAP JList.VERTICAL_WRAP
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1009
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1010
    public void setLayoutOrientation(int layoutOrientation) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1011
        int oldValue = this.layoutOrientation;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1012
        switch (layoutOrientation) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1013
        case VERTICAL:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1014
        case VERTICAL_WRAP:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1015
        case HORIZONTAL_WRAP:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1016
            this.layoutOrientation = layoutOrientation;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1017
            firePropertyChange("layoutOrientation", oldValue, layoutOrientation);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1018
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1019
        default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1020
            throw new IllegalArgumentException("layoutOrientation must be one of: VERTICAL, HORIZONTAL_WRAP or VERTICAL_WRAP");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1021
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1022
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1023
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1024
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1025
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1026
     * Returns the smallest list index that is currently visible.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1027
     * In a left-to-right {@code componentOrientation}, the first visible
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1028
     * cell is found closest to the list's upper-left corner. In right-to-left
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1029
     * orientation, it is found closest to the upper-right corner.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1030
     * If nothing is visible or the list is empty, {@code -1} is returned.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1031
     * Note that the returned cell may only be partially visible.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1032
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1033
     * @return the index of the first visible cell
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1034
     * @see #getLastVisibleIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1035
     * @see JComponent#getVisibleRect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1036
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1037
    public int getFirstVisibleIndex() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1038
        Rectangle r = getVisibleRect();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1039
        int first;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1040
        if (this.getComponentOrientation().isLeftToRight()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1041
            first = locationToIndex(r.getLocation());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1042
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1043
            first = locationToIndex(new Point((r.x + r.width) - 1, r.y));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1044
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1045
        if (first != -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1046
            Rectangle bounds = getCellBounds(first, first);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1047
            if (bounds != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1048
                SwingUtilities.computeIntersection(r.x, r.y, r.width, r.height, bounds);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1049
                if (bounds.width == 0 || bounds.height == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1050
                    first = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1051
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1052
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1053
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1054
        return first;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1055
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1056
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1057
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1058
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1059
     * Returns the largest list index that is currently visible.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1060
     * If nothing is visible or the list is empty, {@code -1} is returned.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1061
     * Note that the returned cell may only be partially visible.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1062
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1063
     * @return the index of the last visible cell
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1064
     * @see #getFirstVisibleIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1065
     * @see JComponent#getVisibleRect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1066
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1067
    public int getLastVisibleIndex() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1068
        boolean leftToRight = this.getComponentOrientation().isLeftToRight();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1069
        Rectangle r = getVisibleRect();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1070
        Point lastPoint;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1071
        if (leftToRight) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1072
            lastPoint = new Point((r.x + r.width) - 1, (r.y + r.height) - 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1073
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1074
            lastPoint = new Point(r.x, (r.y + r.height) - 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1075
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1076
        int location = locationToIndex(lastPoint);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1077
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1078
        if (location != -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1079
            Rectangle bounds = getCellBounds(location, location);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1080
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1081
            if (bounds != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1082
                SwingUtilities.computeIntersection(r.x, r.y, r.width, r.height, bounds);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1083
                if (bounds.width == 0 || bounds.height == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1084
                    // Try the top left(LTR) or top right(RTL) corner, and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1085
                    // then go across checking each cell for HORIZONTAL_WRAP.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1086
                    // Try the lower left corner, and then go across checking
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1087
                    // each cell for other list layout orientation.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1088
                    boolean isHorizontalWrap =
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1089
                        (getLayoutOrientation() == HORIZONTAL_WRAP);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1090
                    Point visibleLocation = isHorizontalWrap ?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1091
                        new Point(lastPoint.x, r.y) :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1092
                        new Point(r.x, lastPoint.y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1093
                    int last;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1094
                    int visIndex = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1095
                    int lIndex = location;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1096
                    location = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1097
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1098
                    do {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1099
                        last = visIndex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1100
                        visIndex = locationToIndex(visibleLocation);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1101
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1102
                        if (visIndex != -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1103
                            bounds = getCellBounds(visIndex, visIndex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1104
                            if (visIndex != lIndex && bounds != null &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1105
                                bounds.contains(visibleLocation)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1106
                                location = visIndex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1107
                                if (isHorizontalWrap) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1108
                                    visibleLocation.y = bounds.y + bounds.height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1109
                                    if (visibleLocation.y >= lastPoint.y) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1110
                                        // Past visible region, bail.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1111
                                        last = visIndex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1112
                                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1113
                                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1114
                                else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1115
                                    visibleLocation.x = bounds.x + bounds.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1116
                                    if (visibleLocation.x >= lastPoint.x) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1117
                                        // Past visible region, bail.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1118
                                        last = visIndex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1119
                                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1120
                                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1121
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1122
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1123
                            else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1124
                                last = visIndex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1125
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1126
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1127
                    } while (visIndex != -1 && last != visIndex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1128
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1129
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1130
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1131
        return location;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1132
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1133
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1134
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1135
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1136
     * Scrolls the list within an enclosing viewport to make the specified
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1137
     * cell completely visible. This calls {@code scrollRectToVisible} with
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1138
     * the bounds of the specified cell. For this method to work, the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1139
     * {@code JList} must be within a <code>JViewport</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1140
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1141
     * If the given index is outside the list's range of cells, this method
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1142
     * results in nothing.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1143
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1144
     * @param index  the index of the cell to make visible
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1145
     * @see JComponent#scrollRectToVisible
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1146
     * @see #getVisibleRect
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1147
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1148
    public void ensureIndexIsVisible(int index) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1149
        Rectangle cellBounds = getCellBounds(index, index);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1150
        if (cellBounds != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1151
            scrollRectToVisible(cellBounds);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1152
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1153
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1154
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1155
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1156
     * Turns on or off automatic drag handling. In order to enable automatic
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1157
     * drag handling, this property should be set to {@code true}, and the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1158
     * list's {@code TransferHandler} needs to be {@code non-null}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1159
     * The default value of the {@code dragEnabled} property is {@code false}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1160
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1161
     * The job of honoring this property, and recognizing a user drag gesture,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1162
     * lies with the look and feel implementation, and in particular, the list's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1163
     * {@code ListUI}. When automatic drag handling is enabled, most look and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1164
     * feels (including those that subclass {@code BasicLookAndFeel}) begin a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1165
     * drag and drop operation whenever the user presses the mouse button over
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1166
     * an item and then moves the mouse a few pixels. Setting this property to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1167
     * {@code true} can therefore have a subtle effect on how selections behave.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1168
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1169
     * If a look and feel is used that ignores this property, you can still
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1170
     * begin a drag and drop operation by calling {@code exportAsDrag} on the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1171
     * list's {@code TransferHandler}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1172
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1173
     * @param b whether or not to enable automatic drag handling
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1174
     * @exception HeadlessException if
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1175
     *            <code>b</code> is <code>true</code> and
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1176
     *            <code>GraphicsEnvironment.isHeadless()</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1177
     *            returns <code>true</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1178
     * @see java.awt.GraphicsEnvironment#isHeadless
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1179
     * @see #getDragEnabled
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1180
     * @see #setTransferHandler
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1181
     * @see TransferHandler
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1182
     * @since 1.4
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1183
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1184
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1185
     *  description: determines whether automatic drag handling is enabled
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1186
     *        bound: false
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1187
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1188
    public void setDragEnabled(boolean b) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1189
        if (b && GraphicsEnvironment.isHeadless()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1190
            throw new HeadlessException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1191
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1192
        dragEnabled = b;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1193
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1194
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1195
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1196
     * Returns whether or not automatic drag handling is enabled.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1197
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1198
     * @return the value of the {@code dragEnabled} property
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1199
     * @see #setDragEnabled
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1200
     * @since 1.4
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1201
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1202
    public boolean getDragEnabled() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1203
        return dragEnabled;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1204
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1205
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1206
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1207
     * Sets the drop mode for this component. For backward compatibility,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1208
     * the default for this property is <code>DropMode.USE_SELECTION</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1209
     * Usage of one of the other modes is recommended, however, for an
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1210
     * improved user experience. <code>DropMode.ON</code>, for instance,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1211
     * offers similar behavior of showing items as selected, but does so without
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1212
     * affecting the actual selection in the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1213
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1214
     * <code>JList</code> supports the following drop modes:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1215
     * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1216
     *    <li><code>DropMode.USE_SELECTION</code></li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1217
     *    <li><code>DropMode.ON</code></li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1218
     *    <li><code>DropMode.INSERT</code></li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1219
     *    <li><code>DropMode.ON_OR_INSERT</code></li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1220
     * </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1221
     * The drop mode is only meaningful if this component has a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1222
     * <code>TransferHandler</code> that accepts drops.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1223
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1224
     * @param dropMode the drop mode to use
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1225
     * @throws IllegalArgumentException if the drop mode is unsupported
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1226
     *         or <code>null</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1227
     * @see #getDropMode
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1228
     * @see #getDropLocation
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1229
     * @see #setTransferHandler
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1230
     * @see TransferHandler
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1231
     * @since 1.6
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1232
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1233
    public final void setDropMode(DropMode dropMode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1234
        if (dropMode != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1235
            switch (dropMode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1236
                case USE_SELECTION:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1237
                case ON:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1238
                case INSERT:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1239
                case ON_OR_INSERT:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1240
                    this.dropMode = dropMode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1241
                    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1242
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1243
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1244
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1245
        throw new IllegalArgumentException(dropMode + ": Unsupported drop mode for list");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1246
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1247
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1248
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1249
     * Returns the drop mode for this component.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1250
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1251
     * @return the drop mode for this component
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1252
     * @see #setDropMode
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1253
     * @since 1.6
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1254
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1255
    public final DropMode getDropMode() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1256
        return dropMode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1257
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1258
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1259
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1260
     * Calculates a drop location in this component, representing where a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1261
     * drop at the given point should insert data.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1262
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1263
     * @param p the point to calculate a drop location for
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1264
     * @return the drop location, or <code>null</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1265
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1266
    DropLocation dropLocationForPoint(Point p) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1267
        DropLocation location = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1268
        Rectangle rect = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1269
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1270
        int index = locationToIndex(p);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1271
        if (index != -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1272
            rect = getCellBounds(index, index);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1273
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1274
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1275
        switch(dropMode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1276
            case USE_SELECTION:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1277
            case ON:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1278
                location = new DropLocation(p,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1279
                    (rect != null && rect.contains(p)) ? index : -1,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1280
                    false);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1281
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1282
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1283
            case INSERT:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1284
                if (index == -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1285
                    location = new DropLocation(p, getModel().getSize(), true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1286
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1287
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1288
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1289
                if (layoutOrientation == HORIZONTAL_WRAP) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1290
                    boolean ltr = getComponentOrientation().isLeftToRight();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1291
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1292
                    if (SwingUtilities2.liesInHorizontal(rect, p, ltr, false) == TRAILING) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1293
                        index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1294
                    // special case for below all cells
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1295
                    } else if (index == getModel().getSize() - 1 && p.y >= rect.y + rect.height) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1296
                        index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1297
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1298
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1299
                    if (SwingUtilities2.liesInVertical(rect, p, false) == TRAILING) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1300
                        index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1301
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1302
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1303
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1304
                location = new DropLocation(p, index, true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1305
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1306
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1307
            case ON_OR_INSERT:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1308
                if (index == -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1309
                    location = new DropLocation(p, getModel().getSize(), true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1310
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1311
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1312
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1313
                boolean between = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1314
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1315
                if (layoutOrientation == HORIZONTAL_WRAP) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1316
                    boolean ltr = getComponentOrientation().isLeftToRight();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1317
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1318
                    Section section = SwingUtilities2.liesInHorizontal(rect, p, ltr, true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1319
                    if (section == TRAILING) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1320
                        index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1321
                        between = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1322
                    // special case for below all cells
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1323
                    } else if (index == getModel().getSize() - 1 && p.y >= rect.y + rect.height) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1324
                        index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1325
                        between = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1326
                    } else if (section == LEADING) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1327
                        between = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1328
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1329
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1330
                    Section section = SwingUtilities2.liesInVertical(rect, p, true);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1331
                    if (section == LEADING) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1332
                        between = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1333
                    } else if (section == TRAILING) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1334
                        index++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1335
                        between = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1336
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1337
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1338
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1339
                location = new DropLocation(p, index, between);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1340
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1341
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1342
            default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1343
                assert false : "Unexpected drop mode";
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1344
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1345
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1346
        return location;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1347
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1348
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1349
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1350
     * Called to set or clear the drop location during a DnD operation.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1351
     * In some cases, the component may need to use it's internal selection
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1352
     * temporarily to indicate the drop location. To help facilitate this,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1353
     * this method returns and accepts as a parameter a state object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1354
     * This state object can be used to store, and later restore, the selection
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1355
     * state. Whatever this method returns will be passed back to it in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1356
     * future calls, as the state parameter. If it wants the DnD system to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1357
     * continue storing the same state, it must pass it back every time.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1358
     * Here's how this is used:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1359
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1360
     * Let's say that on the first call to this method the component decides
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1361
     * to save some state (because it is about to use the selection to show
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1362
     * a drop index). It can return a state object to the caller encapsulating
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1363
     * any saved selection state. On a second call, let's say the drop location
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1364
     * is being changed to something else. The component doesn't need to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1365
     * restore anything yet, so it simply passes back the same state object
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1366
     * to have the DnD system continue storing it. Finally, let's say this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1367
     * method is messaged with <code>null</code>. This means DnD
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1368
     * is finished with this component for now, meaning it should restore
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1369
     * state. At this point, it can use the state parameter to restore
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1370
     * said state, and of course return <code>null</code> since there's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1371
     * no longer anything to store.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1372
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1373
     * @param location the drop location (as calculated by
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1374
     *        <code>dropLocationForPoint</code>) or <code>null</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1375
     *        if there's no longer a valid drop location
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1376
     * @param state the state object saved earlier for this component,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1377
     *        or <code>null</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1378
     * @param forDrop whether or not the method is being called because an
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1379
     *        actual drop occurred
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1380
     * @return any saved state for this component, or <code>null</code> if none
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1381
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1382
    Object setDropLocation(TransferHandler.DropLocation location,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1383
                           Object state,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1384
                           boolean forDrop) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1385
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1386
        Object retVal = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1387
        DropLocation listLocation = (DropLocation)location;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1388
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1389
        if (dropMode == DropMode.USE_SELECTION) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1390
            if (listLocation == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1391
                if (!forDrop && state != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1392
                    setSelectedIndices(((int[][])state)[0]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1393
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1394
                    int anchor = ((int[][])state)[1][0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1395
                    int lead = ((int[][])state)[1][1];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1396
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1397
                    SwingUtilities2.setLeadAnchorWithoutSelection(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1398
                            getSelectionModel(), lead, anchor);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1399
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1400
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1401
                if (dropLocation == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1402
                    int[] inds = getSelectedIndices();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1403
                    retVal = new int[][] {inds, {getAnchorSelectionIndex(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1404
                                                 getLeadSelectionIndex()}};
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1405
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1406
                    retVal = state;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1407
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1408
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1409
                int index = listLocation.getIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1410
                if (index == -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1411
                    clearSelection();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1412
                    getSelectionModel().setAnchorSelectionIndex(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1413
                    getSelectionModel().setLeadSelectionIndex(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1414
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1415
                    setSelectionInterval(index, index);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1416
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1417
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1418
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1419
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1420
        DropLocation old = dropLocation;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1421
        dropLocation = listLocation;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1422
        firePropertyChange("dropLocation", old, dropLocation);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1423
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1424
        return retVal;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1425
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1426
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1427
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1428
     * Returns the location that this component should visually indicate
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1429
     * as the drop location during a DnD operation over the component,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1430
     * or {@code null} if no location is to currently be shown.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1431
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1432
     * This method is not meant for querying the drop location
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1433
     * from a {@code TransferHandler}, as the drop location is only
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1434
     * set after the {@code TransferHandler}'s <code>canImport</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1435
     * has returned and has allowed for the location to be shown.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1436
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1437
     * When this property changes, a property change event with
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1438
     * name "dropLocation" is fired by the component.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1439
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1440
     * By default, responsibility for listening for changes to this property
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1441
     * and indicating the drop location visually lies with the list's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1442
     * {@code ListUI}, which may paint it directly and/or install a cell
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1443
     * renderer to do so. Developers wishing to implement custom drop location
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1444
     * painting and/or replace the default cell renderer, may need to honor
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1445
     * this property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1446
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1447
     * @return the drop location
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1448
     * @see #setDropMode
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1449
     * @see TransferHandler#canImport(TransferHandler.TransferSupport)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1450
     * @since 1.6
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1451
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1452
    public final DropLocation getDropLocation() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1453
        return dropLocation;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1454
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1455
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1456
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1457
     * Returns the next list element whose {@code toString} value
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1458
     * starts with the given prefix.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1459
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1460
     * @param prefix the string to test for a match
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1461
     * @param startIndex the index for starting the search
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1462
     * @param bias the search direction, either
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1463
     * Position.Bias.Forward or Position.Bias.Backward.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1464
     * @return the index of the next list element that
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1465
     * starts with the prefix; otherwise {@code -1}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1466
     * @exception IllegalArgumentException if prefix is {@code null}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1467
     * or startIndex is out of bounds
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1468
     * @since 1.4
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1469
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1470
    public int getNextMatch(String prefix, int startIndex, Position.Bias bias) {
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1471
        ListModel<E> model = getModel();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1472
        int max = model.getSize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1473
        if (prefix == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1474
            throw new IllegalArgumentException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1475
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1476
        if (startIndex < 0 || startIndex >= max) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1477
            throw new IllegalArgumentException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1478
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1479
        prefix = prefix.toUpperCase();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1480
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1481
        // start search from the next element after the selected element
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1482
        int increment = (bias == Position.Bias.Forward) ? 1 : -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1483
        int index = startIndex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1484
        do {
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1485
            E element = model.getElementAt(index);
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1486
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1487
            if (element != null) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1488
                String string;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1489
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1490
                if (element instanceof String) {
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1491
                    string = ((String)element).toUpperCase();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1492
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1493
                else {
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1494
                    string = element.toString();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1495
                    if (string != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1496
                        string = string.toUpperCase();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1497
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1498
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1499
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1500
                if (string != null && string.startsWith(prefix)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1501
                    return index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1502
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1503
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1504
            index = (index + increment + max) % max;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1505
        } while (index != startIndex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1506
        return -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1507
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1508
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1509
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1510
     * Returns the tooltip text to be used for the given event. This overrides
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1511
     * {@code JComponent}'s {@code getToolTipText} to first check the cell
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1512
     * renderer component for the cell over which the event occurred, returning
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1513
     * its tooltip text, if any. This implementation allows you to specify
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1514
     * tooltip text on the cell level, by using {@code setToolTipText} on your
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1515
     * cell renderer component.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1516
     * <p>
21592
da6abe91602a 8025234: [javadoc] fix some errors in javax.swing.**
yan
parents: 20458
diff changeset
  1517
     * <strong>Note:</strong> For <code>JList</code> to properly display the
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1518
     * tooltips of its renderers in this manner, <code>JList</code> must be a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1519
     * registered component with the <code>ToolTipManager</code>. This registration
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1520
     * is done automatically in the constructor. However, if at a later point
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1521
     * <code>JList</code> is unregistered, by way of a call to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1522
     * {@code setToolTipText(null)}, tips from the renderers will no longer display.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1523
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1524
     * @param event the {@code MouseEvent} to fetch the tooltip text for
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1525
     * @see JComponent#setToolTipText
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1526
     * @see JComponent#getToolTipText
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1527
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1528
    public String getToolTipText(MouseEvent event) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1529
        if(event != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1530
            Point p = event.getPoint();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1531
            int index = locationToIndex(p);
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1532
            ListCellRenderer<? super E> r = getCellRenderer();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1533
            Rectangle cellBounds;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1534
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1535
            if (index != -1 && r != null && (cellBounds =
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1536
                               getCellBounds(index, index)) != null &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1537
                               cellBounds.contains(p.x, p.y)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1538
                ListSelectionModel lsm = getSelectionModel();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1539
                Component rComponent = r.getListCellRendererComponent(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1540
                           this, getModel().getElementAt(index), index,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1541
                           lsm.isSelectedIndex(index),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1542
                           (hasFocus() && (lsm.getLeadSelectionIndex() ==
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1543
                                           index)));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1544
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1545
                if(rComponent instanceof JComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1546
                    MouseEvent      newEvent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1547
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1548
                    p.translate(-cellBounds.x, -cellBounds.y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1549
                    newEvent = new MouseEvent(rComponent, event.getID(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1550
                                              event.getWhen(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1551
                                              event.getModifiers(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1552
                                              p.x, p.y,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1553
                                              event.getXOnScreen(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1554
                                              event.getYOnScreen(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1555
                                              event.getClickCount(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1556
                                              event.isPopupTrigger(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1557
                                              MouseEvent.NOBUTTON);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1558
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1559
                    String tip = ((JComponent)rComponent).getToolTipText(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1560
                                              newEvent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1561
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1562
                    if (tip != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1563
                        return tip;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1564
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1565
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1566
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1567
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1568
        return super.getToolTipText();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1569
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1570
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1571
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1572
     * --- ListUI Delegations ---
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1573
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1574
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1575
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1576
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1577
     * Returns the cell index closest to the given location in the list's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1578
     * coordinate system. To determine if the cell actually contains the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1579
     * specified location, compare the point against the cell's bounds,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1580
     * as provided by {@code getCellBounds}. This method returns {@code -1}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1581
     * if the model is empty
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1582
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1583
     * This is a cover method that delegates to the method of the same name
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1584
     * in the list's {@code ListUI}. It returns {@code -1} if the list has
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1585
     * no {@code ListUI}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1586
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1587
     * @param location the coordinates of the point
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1588
     * @return the cell index closest to the given location, or {@code -1}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1589
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1590
    public int locationToIndex(Point location) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1591
        ListUI ui = getUI();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1592
        return (ui != null) ? ui.locationToIndex(this, location) : -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1593
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1594
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1595
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1596
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1597
     * Returns the origin of the specified item in the list's coordinate
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1598
     * system. This method returns {@code null} if the index isn't valid.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1599
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1600
     * This is a cover method that delegates to the method of the same name
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1601
     * in the list's {@code ListUI}. It returns {@code null} if the list has
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1602
     * no {@code ListUI}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1603
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1604
     * @param index the cell index
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1605
     * @return the origin of the cell, or {@code null}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1606
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1607
    public Point indexToLocation(int index) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1608
        ListUI ui = getUI();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1609
        return (ui != null) ? ui.indexToLocation(this, index) : null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1610
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1611
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1612
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1613
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1614
     * Returns the bounding rectangle, in the list's coordinate system,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1615
     * for the range of cells specified by the two indices.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1616
     * These indices can be supplied in any order.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1617
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1618
     * If the smaller index is outside the list's range of cells, this method
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1619
     * returns {@code null}. If the smaller index is valid, but the larger
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1620
     * index is outside the list's range, the bounds of just the first index
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1621
     * is returned. Otherwise, the bounds of the valid range is returned.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1622
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1623
     * This is a cover method that delegates to the method of the same name
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1624
     * in the list's {@code ListUI}. It returns {@code null} if the list has
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1625
     * no {@code ListUI}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1626
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1627
     * @param index0 the first index in the range
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1628
     * @param index1 the second index in the range
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1629
     * @return the bounding rectangle for the range of cells, or {@code null}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1630
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1631
    public Rectangle getCellBounds(int index0, int index1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1632
        ListUI ui = getUI();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1633
        return (ui != null) ? ui.getCellBounds(this, index0, index1) : null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1634
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1635
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1636
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1637
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1638
     * --- ListModel Support ---
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1639
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1640
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1641
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1642
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1643
     * Returns the data model that holds the list of items displayed
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1644
     * by the <code>JList</code> component.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1645
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1646
     * @return the <code>ListModel</code> that provides the displayed
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1647
     *                          list of items
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1648
     * @see #setModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1649
     */
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1650
    public ListModel<E> getModel() {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1651
        return dataModel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1652
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1653
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1654
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1655
     * Sets the model that represents the contents or "value" of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1656
     * list, notifies property change listeners, and then clears the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1657
     * list's selection.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1658
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1659
     * This is a JavaBeans bound property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1660
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1661
     * @param model  the <code>ListModel</code> that provides the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1662
     *                                          list of items for display
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1663
     * @exception IllegalArgumentException  if <code>model</code> is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1664
     *                                          <code>null</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1665
     * @see #getModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1666
     * @see #clearSelection
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1667
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1668
     *       bound: true
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1669
     *   attribute: visualUpdate true
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1670
     * description: The object that contains the data to be drawn by this JList.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1671
     */
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1672
    public void setModel(ListModel<E> model) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1673
        if (model == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1674
            throw new IllegalArgumentException("model must be non null");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1675
        }
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1676
        ListModel<E> oldValue = dataModel;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1677
        dataModel = model;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1678
        firePropertyChange("model", oldValue, dataModel);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1679
        clearSelection();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1680
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1681
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1682
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1683
    /**
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1684
     * Constructs a read-only <code>ListModel</code> from an array of items,
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1685
     * and calls {@code setModel} with this model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1686
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1687
     * Attempts to pass a {@code null} value to this method results in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1688
     * undefined behavior and, most likely, exceptions. The created model
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1689
     * references the given array directly. Attempts to modify the array
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1690
     * after invoking this method results in undefined behavior.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1691
     *
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1692
     * @param listData an array of {@code E} containing the items to
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1693
     *        display in the list
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1694
     * @see #setModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1695
     */
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1696
    public void setListData(final E[] listData) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1697
        setModel (
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1698
            new AbstractListModel<E>() {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1699
                public int getSize() { return listData.length; }
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1700
                public E getElementAt(int i) { return listData[i]; }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1701
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1702
        );
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1703
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1704
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1705
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1706
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1707
     * Constructs a read-only <code>ListModel</code> from a <code>Vector</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1708
     * and calls {@code setModel} with this model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1709
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1710
     * Attempts to pass a {@code null} value to this method results in
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1711
     * undefined behavior and, most likely, exceptions. The created model
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1712
     * references the given {@code Vector} directly. Attempts to modify the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1713
     * {@code Vector} after invoking this method results in undefined behavior.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1714
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1715
     * @param listData a <code>Vector</code> containing the items to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1716
     *                                          display in the list
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1717
     * @see #setModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1718
     */
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1719
    public void setListData(final Vector<? extends E> listData) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1720
        setModel (
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1721
            new AbstractListModel<E>() {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1722
                public int getSize() { return listData.size(); }
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  1723
                public E getElementAt(int i) { return listData.elementAt(i); }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1724
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1725
        );
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1726
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1727
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1728
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1729
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1730
     * --- ListSelectionModel delegations and extensions ---
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1731
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1732
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1733
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1734
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1735
     * Returns an instance of {@code DefaultListSelectionModel}; called
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1736
     * during construction to initialize the list's selection model
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1737
     * property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1738
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1739
     * @return a {@code DefaultListSelecitonModel}, used to initialize
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1740
     *         the list's selection model property during construction
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1741
     * @see #setSelectionModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1742
     * @see DefaultListSelectionModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1743
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1744
    protected ListSelectionModel createSelectionModel() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1745
        return new DefaultListSelectionModel();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1746
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1747
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1748
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1749
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1750
     * Returns the current selection model. The selection model maintains the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1751
     * selection state of the list. See the class level documentation for more
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1752
     * details.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1753
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1754
     * @return the <code>ListSelectionModel</code> that maintains the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1755
     *         list's selections
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1756
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1757
     * @see #setSelectionModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1758
     * @see ListSelectionModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1759
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1760
    public ListSelectionModel getSelectionModel() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1761
        return selectionModel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1762
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1763
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1764
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1765
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1766
     * Notifies {@code ListSelectionListener}s added directly to the list
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1767
     * of selection changes made to the selection model. {@code JList}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1768
     * listens for changes made to the selection in the selection model,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1769
     * and forwards notification to listeners added to the list directly,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1770
     * by calling this method.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1771
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1772
     * This method constructs a {@code ListSelectionEvent} with this list
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1773
     * as the source, and the specified arguments, and sends it to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1774
     * registered {@code ListSelectionListeners}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1775
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1776
     * @param firstIndex the first index in the range, {@code <= lastIndex}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1777
     * @param lastIndex the last index in the range, {@code >= firstIndex}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1778
     * @param isAdjusting whether or not this is one in a series of
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1779
     *        multiple events, where changes are still being made
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1780
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1781
     * @see #addListSelectionListener
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1782
     * @see #removeListSelectionListener
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1783
     * @see javax.swing.event.ListSelectionEvent
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1784
     * @see EventListenerList
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1785
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1786
    protected void fireSelectionValueChanged(int firstIndex, int lastIndex,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1787
                                             boolean isAdjusting)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1788
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1789
        Object[] listeners = listenerList.getListenerList();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1790
        ListSelectionEvent e = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1791
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1792
        for (int i = listeners.length - 2; i >= 0; i -= 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1793
            if (listeners[i] == ListSelectionListener.class) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1794
                if (e == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1795
                    e = new ListSelectionEvent(this, firstIndex, lastIndex,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1796
                                               isAdjusting);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1797
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1798
                ((ListSelectionListener)listeners[i+1]).valueChanged(e);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1799
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1800
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1801
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1802
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1803
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1804
    /* A ListSelectionListener that forwards ListSelectionEvents from
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1805
     * the selectionModel to the JList ListSelectionListeners.  The
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1806
     * forwarded events only differ from the originals in that their
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1807
     * source is the JList instead of the selectionModel itself.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1808
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1809
    private class ListSelectionHandler implements ListSelectionListener, Serializable
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1810
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1811
        public void valueChanged(ListSelectionEvent e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1812
            fireSelectionValueChanged(e.getFirstIndex(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1813
                                      e.getLastIndex(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1814
                                      e.getValueIsAdjusting());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1815
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1816
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1817
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1818
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1819
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1820
     * Adds a listener to the list, to be notified each time a change to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1821
     * selection occurs; the preferred way of listening for selection state
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1822
     * changes. {@code JList} takes care of listening for selection state
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1823
     * changes in the selection model, and notifies the given listener of
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1824
     * each change. {@code ListSelectionEvent}s sent to the listener have a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1825
     * {@code source} property set to this list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1826
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1827
     * @param listener the {@code ListSelectionListener} to add
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1828
     * @see #getSelectionModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1829
     * @see #getListSelectionListeners
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1830
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1831
    public void addListSelectionListener(ListSelectionListener listener)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1832
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1833
        if (selectionListener == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1834
            selectionListener = new ListSelectionHandler();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1835
            getSelectionModel().addListSelectionListener(selectionListener);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1836
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1837
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1838
        listenerList.add(ListSelectionListener.class, listener);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1839
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1840
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1841
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1842
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1843
     * Removes a selection listener from the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1844
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1845
     * @param listener the {@code ListSelectionListener} to remove
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1846
     * @see #addListSelectionListener
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1847
     * @see #getSelectionModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1848
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1849
    public void removeListSelectionListener(ListSelectionListener listener) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1850
        listenerList.remove(ListSelectionListener.class, listener);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1851
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1852
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1853
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1854
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1855
     * Returns an array of all the {@code ListSelectionListener}s added
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1856
     * to this {@code JList} by way of {@code addListSelectionListener}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1857
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1858
     * @return all of the {@code ListSelectionListener}s on this list, or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1859
     *         an empty array if no listeners have been added
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1860
     * @see #addListSelectionListener
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1861
     * @since 1.4
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1862
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1863
    public ListSelectionListener[] getListSelectionListeners() {
1301
15e81207e1f2 6727662: Code improvement and warnings removing from swing packages
rupashka
parents: 466
diff changeset
  1864
        return listenerList.getListeners(ListSelectionListener.class);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1865
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1866
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1867
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1868
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1869
     * Sets the <code>selectionModel</code> for the list to a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1870
     * non-<code>null</code> <code>ListSelectionModel</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1871
     * implementation. The selection model handles the task of making single
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1872
     * selections, selections of contiguous ranges, and non-contiguous
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1873
     * selections.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1874
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1875
     * This is a JavaBeans bound property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1876
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1877
     * @param selectionModel  the <code>ListSelectionModel</code> that
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1878
     *                          implements the selections
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1879
     * @exception IllegalArgumentException   if <code>selectionModel</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1880
     *                                          is <code>null</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1881
     * @see #getSelectionModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1882
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1883
     *       bound: true
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1884
     * description: The selection model, recording which cells are selected.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1885
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1886
    public void setSelectionModel(ListSelectionModel selectionModel) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1887
        if (selectionModel == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1888
            throw new IllegalArgumentException("selectionModel must be non null");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1889
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1890
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1891
        /* Remove the forwarding ListSelectionListener from the old
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1892
         * selectionModel, and add it to the new one, if necessary.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1893
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1894
        if (selectionListener != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1895
            this.selectionModel.removeListSelectionListener(selectionListener);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1896
            selectionModel.addListSelectionListener(selectionListener);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1897
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1898
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1899
        ListSelectionModel oldValue = this.selectionModel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1900
        this.selectionModel = selectionModel;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1901
        firePropertyChange("selectionModel", oldValue, selectionModel);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1902
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1903
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1904
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1905
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1906
     * Sets the selection mode for the list. This is a cover method that sets
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1907
     * the selection mode directly on the selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1908
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1909
     * The following list describes the accepted selection modes:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1910
     * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1911
     * <li>{@code ListSelectionModel.SINGLE_SELECTION} -
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1912
     *   Only one list index can be selected at a time. In this mode,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1913
     *   {@code setSelectionInterval} and {@code addSelectionInterval} are
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1914
     *   equivalent, both replacing the current selection with the index
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1915
     *   represented by the second argument (the "lead").
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1916
     * <li>{@code ListSelectionModel.SINGLE_INTERVAL_SELECTION} -
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1917
     *   Only one contiguous interval can be selected at a time.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1918
     *   In this mode, {@code addSelectionInterval} behaves like
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1919
     *   {@code setSelectionInterval} (replacing the current selection},
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1920
     *   unless the given interval is immediately adjacent to or overlaps
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1921
     *   the existing selection, and can be used to grow the selection.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1922
     * <li>{@code ListSelectionModel.MULTIPLE_INTERVAL_SELECTION} -
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1923
     *   In this mode, there's no restriction on what can be selected.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1924
     *   This mode is the default.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1925
     * </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1926
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1927
     * @param selectionMode the selection mode
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1928
     * @see #getSelectionMode
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1929
     * @throws IllegalArgumentException if the selection mode isn't
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1930
     *         one of those allowed
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1931
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1932
     * description: The selection mode.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1933
     *        enum: SINGLE_SELECTION            ListSelectionModel.SINGLE_SELECTION
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1934
     *              SINGLE_INTERVAL_SELECTION   ListSelectionModel.SINGLE_INTERVAL_SELECTION
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1935
     *              MULTIPLE_INTERVAL_SELECTION ListSelectionModel.MULTIPLE_INTERVAL_SELECTION
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1936
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1937
    public void setSelectionMode(int selectionMode) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1938
        getSelectionModel().setSelectionMode(selectionMode);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1939
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1940
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1941
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1942
     * Returns the current selection mode for the list. This is a cover
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1943
     * method that delegates to the method of the same name on the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1944
     * list's selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1945
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1946
     * @return the current selection mode
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1947
     * @see #setSelectionMode
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1948
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1949
    public int getSelectionMode() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1950
        return getSelectionModel().getSelectionMode();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1951
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1952
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1953
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1954
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1955
     * Returns the anchor selection index. This is a cover method that
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1956
     * delegates to the method of the same name on the list's selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1957
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1958
     * @return the anchor selection index
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1959
     * @see ListSelectionModel#getAnchorSelectionIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1960
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1961
    public int getAnchorSelectionIndex() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1962
        return getSelectionModel().getAnchorSelectionIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1963
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1964
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1965
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1966
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1967
     * Returns the lead selection index. This is a cover method that
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1968
     * delegates to the method of the same name on the list's selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1969
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1970
     * @return the lead selection index
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1971
     * @see ListSelectionModel#getLeadSelectionIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1972
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1973
     * description: The lead selection index.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1974
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1975
    public int getLeadSelectionIndex() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1976
        return getSelectionModel().getLeadSelectionIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1977
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1978
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1979
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1980
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1981
     * Returns the smallest selected cell index, or {@code -1} if the selection
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1982
     * is empty. This is a cover method that delegates to the method of the same
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1983
     * name on the list's selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1984
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1985
     * @return the smallest selected cell index, or {@code -1}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1986
     * @see ListSelectionModel#getMinSelectionIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1987
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1988
    public int getMinSelectionIndex() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1989
        return getSelectionModel().getMinSelectionIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1990
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1991
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1992
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1993
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1994
     * Returns the largest selected cell index, or {@code -1} if the selection
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1995
     * is empty. This is a cover method that delegates to the method of the same
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1996
     * name on the list's selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1997
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1998
     * @return the largest selected cell index
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1999
     * @see ListSelectionModel#getMaxSelectionIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2000
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2001
    public int getMaxSelectionIndex() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2002
        return getSelectionModel().getMaxSelectionIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2003
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2004
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2005
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2006
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2007
     * Returns {@code true} if the specified index is selected,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2008
     * else {@code false}. This is a cover method that delegates to the method
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2009
     * of the same name on the list's selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2010
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2011
     * @param index index to be queried for selection state
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2012
     * @return {@code true} if the specified index is selected,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2013
     *         else {@code false}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2014
     * @see ListSelectionModel#isSelectedIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2015
     * @see #setSelectedIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2016
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2017
    public boolean isSelectedIndex(int index) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2018
        return getSelectionModel().isSelectedIndex(index);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2019
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2020
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2021
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2022
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2023
     * Returns {@code true} if nothing is selected, else {@code false}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2024
     * This is a cover method that delegates to the method of the same
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2025
     * name on the list's selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2026
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2027
     * @return {@code true} if nothing is selected, else {@code false}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2028
     * @see ListSelectionModel#isSelectionEmpty
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2029
     * @see #clearSelection
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2030
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2031
    public boolean isSelectionEmpty() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2032
        return getSelectionModel().isSelectionEmpty();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2033
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2034
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2035
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2036
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2037
     * Clears the selection; after calling this method, {@code isSelectionEmpty}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2038
     * will return {@code true}. This is a cover method that delegates to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2039
     * method of the same name on the list's selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2040
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2041
     * @see ListSelectionModel#clearSelection
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2042
     * @see #isSelectionEmpty
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2043
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2044
    public void clearSelection() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2045
        getSelectionModel().clearSelection();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2046
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2047
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2048
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2049
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2050
     * Selects the specified interval. Both {@code anchor} and {@code lead}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2051
     * indices are included. {@code anchor} doesn't have to be less than or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2052
     * equal to {@code lead}. This is a cover method that delegates to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2053
     * method of the same name on the list's selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2054
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2055
     * Refer to the documentation of the selection model class being used
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2056
     * for details on how values less than {@code 0} are handled.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2057
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2058
     * @param anchor the first index to select
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2059
     * @param lead the last index to select
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2060
     * @see ListSelectionModel#setSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2061
     * @see DefaultListSelectionModel#setSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2062
     * @see #createSelectionModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2063
     * @see #addSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2064
     * @see #removeSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2065
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2066
    public void setSelectionInterval(int anchor, int lead) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2067
        getSelectionModel().setSelectionInterval(anchor, lead);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2068
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2069
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2070
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2071
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2072
     * Sets the selection to be the union of the specified interval with current
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2073
     * selection. Both the {@code anchor} and {@code lead} indices are
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2074
     * included. {@code anchor} doesn't have to be less than or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2075
     * equal to {@code lead}. This is a cover method that delegates to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2076
     * method of the same name on the list's selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2077
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2078
     * Refer to the documentation of the selection model class being used
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2079
     * for details on how values less than {@code 0} are handled.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2080
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2081
     * @param anchor the first index to add to the selection
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2082
     * @param lead the last index to add to the selection
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2083
     * @see ListSelectionModel#addSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2084
     * @see DefaultListSelectionModel#addSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2085
     * @see #createSelectionModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2086
     * @see #setSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2087
     * @see #removeSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2088
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2089
    public void addSelectionInterval(int anchor, int lead) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2090
        getSelectionModel().addSelectionInterval(anchor, lead);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2091
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2092
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2093
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2094
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2095
     * Sets the selection to be the set difference of the specified interval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2096
     * and the current selection. Both the {@code index0} and {@code index1}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2097
     * indices are removed. {@code index0} doesn't have to be less than or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2098
     * equal to {@code index1}. This is a cover method that delegates to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2099
     * method of the same name on the list's selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2100
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2101
     * Refer to the documentation of the selection model class being used
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2102
     * for details on how values less than {@code 0} are handled.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2103
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2104
     * @param index0 the first index to remove from the selection
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2105
     * @param index1 the last index to remove from the selection
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2106
     * @see ListSelectionModel#removeSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2107
     * @see DefaultListSelectionModel#removeSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2108
     * @see #createSelectionModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2109
     * @see #setSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2110
     * @see #addSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2111
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2112
    public void removeSelectionInterval(int index0, int index1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2113
        getSelectionModel().removeSelectionInterval(index0, index1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2114
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2115
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2116
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2117
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2118
     * Sets the selection model's {@code valueIsAdjusting} property. When
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2119
     * {@code true}, upcoming changes to selection should be considered part
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2120
     * of a single change. This property is used internally and developers
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2121
     * typically need not call this method. For example, when the model is being
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2122
     * updated in response to a user drag, the value of the property is set
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2123
     * to {@code true} when the drag is initiated and set to {@code false}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2124
     * when the drag is finished. This allows listeners to update only
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2125
     * when a change has been finalized, rather than handling all of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2126
     * intermediate values.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2127
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2128
     * You may want to use this directly if making a series of changes
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2129
     * that should be considered part of a single change.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2130
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2131
     * This is a cover method that delegates to the method of the same name on
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2132
     * the list's selection model. See the documentation for
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2133
     * {@link javax.swing.ListSelectionModel#setValueIsAdjusting} for
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2134
     * more details.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2135
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2136
     * @param b the new value for the property
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2137
     * @see ListSelectionModel#setValueIsAdjusting
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2138
     * @see javax.swing.event.ListSelectionEvent#getValueIsAdjusting
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2139
     * @see #getValueIsAdjusting
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2140
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2141
    public void setValueIsAdjusting(boolean b) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2142
        getSelectionModel().setValueIsAdjusting(b);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2143
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2144
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2145
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2146
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2147
     * Returns the value of the selection model's {@code isAdjusting} property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2148
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2149
     * This is a cover method that delegates to the method of the same name on
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2150
     * the list's selection model.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2151
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2152
     * @return the value of the selection model's {@code isAdjusting} property.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2153
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2154
     * @see #setValueIsAdjusting
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2155
     * @see ListSelectionModel#getValueIsAdjusting
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2156
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2157
    public boolean getValueIsAdjusting() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2158
        return getSelectionModel().getValueIsAdjusting();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2159
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2160
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2161
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2162
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2163
     * Returns an array of all of the selected indices, in increasing
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2164
     * order.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2165
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2166
     * @return all of the selected indices, in increasing order,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2167
     *         or an empty array if nothing is selected
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2168
     * @see #removeSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2169
     * @see #addListSelectionListener
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2170
     */
466
6acd5ec503a8 4935607: RFE: LTP: Should be possible to set the TRANSIENT attribute of propertiies to FALSE
malenkov
parents: 2
diff changeset
  2171
    @Transient
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2172
    public int[] getSelectedIndices() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2173
        ListSelectionModel sm = getSelectionModel();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2174
        int iMin = sm.getMinSelectionIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2175
        int iMax = sm.getMaxSelectionIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2176
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2177
        if ((iMin < 0) || (iMax < 0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2178
            return new int[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2179
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2180
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2181
        int[] rvTmp = new int[1+ (iMax - iMin)];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2182
        int n = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2183
        for(int i = iMin; i <= iMax; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2184
            if (sm.isSelectedIndex(i)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2185
                rvTmp[n++] = i;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2186
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2187
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2188
        int[] rv = new int[n];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2189
        System.arraycopy(rvTmp, 0, rv, 0, n);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2190
        return rv;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2191
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2192
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2193
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2194
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2195
     * Selects a single cell. Does nothing if the given index is greater
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2196
     * than or equal to the model size. This is a convenience method that uses
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2197
     * {@code setSelectionInterval} on the selection model. Refer to the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2198
     * documentation for the selection model class being used for details on
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2199
     * how values less than {@code 0} are handled.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2200
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2201
     * @param index the index of the cell to select
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2202
     * @see ListSelectionModel#setSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2203
     * @see #isSelectedIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2204
     * @see #addListSelectionListener
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2205
     * @beaninfo
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2206
     * description: The index of the selected cell.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2207
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2208
    public void setSelectedIndex(int index) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2209
        if (index >= getModel().getSize()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2210
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2211
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2212
        getSelectionModel().setSelectionInterval(index, index);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2213
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2214
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2215
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2216
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2217
     * Changes the selection to be the set of indices specified by the given
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2218
     * array. Indices greater than or equal to the model size are ignored.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2219
     * This is a convenience method that clears the selection and then uses
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2220
     * {@code addSelectionInterval} on the selection model to add the indices.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2221
     * Refer to the documentation of the selection model class being used for
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2222
     * details on how values less than {@code 0} are handled.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2223
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2224
     * @param indices an array of the indices of the cells to select,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2225
     *                {@code non-null}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2226
     * @see ListSelectionModel#addSelectionInterval
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2227
     * @see #isSelectedIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2228
     * @see #addListSelectionListener
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2229
     * @throws NullPointerException if the given array is {@code null}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2230
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2231
    public void setSelectedIndices(int[] indices) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2232
        ListSelectionModel sm = getSelectionModel();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2233
        sm.clearSelection();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2234
        int size = getModel().getSize();
1301
15e81207e1f2 6727662: Code improvement and warnings removing from swing packages
rupashka
parents: 466
diff changeset
  2235
        for (int i : indices) {
15e81207e1f2 6727662: Code improvement and warnings removing from swing packages
rupashka
parents: 466
diff changeset
  2236
            if (i < size) {
15e81207e1f2 6727662: Code improvement and warnings removing from swing packages
rupashka
parents: 466
diff changeset
  2237
                sm.addSelectionInterval(i, i);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2238
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2239
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2240
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2241
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2242
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2243
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2244
     * Returns an array of all the selected values, in increasing order based
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2245
     * on their indices in the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2246
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2247
     * @return the selected values, or an empty array if nothing is selected
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2248
     * @see #isSelectedIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2249
     * @see #getModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2250
     * @see #addListSelectionListener
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2251
     *
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2252
     * @deprecated As of JDK 1.7, replaced by {@link #getSelectedValuesList()}
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2253
     */
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2254
    @Deprecated
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2255
    public Object[] getSelectedValues() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2256
        ListSelectionModel sm = getSelectionModel();
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2257
        ListModel<E> dm = getModel();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2258
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2259
        int iMin = sm.getMinSelectionIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2260
        int iMax = sm.getMaxSelectionIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2261
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2262
        if ((iMin < 0) || (iMax < 0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2263
            return new Object[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2264
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2265
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2266
        Object[] rvTmp = new Object[1+ (iMax - iMin)];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2267
        int n = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2268
        for(int i = iMin; i <= iMax; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2269
            if (sm.isSelectedIndex(i)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2270
                rvTmp[n++] = dm.getElementAt(i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2271
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2272
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2273
        Object[] rv = new Object[n];
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2274
        System.arraycopy(rvTmp, 0, rv, 0, n);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2275
        return rv;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2276
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2277
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2278
    /**
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2279
     * Returns a list of all the selected items, in increasing order based
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2280
     * on their indices in the list.
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2281
     *
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2282
     * @return the selected items, or an empty list if nothing is selected
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2283
     * @see #isSelectedIndex
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2284
     * @see #getModel
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2285
     * @see #addListSelectionListener
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2286
     *
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2287
     * @since 1.7
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2288
     */
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2289
    public List<E> getSelectedValuesList() {
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2290
        ListSelectionModel sm = getSelectionModel();
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2291
        ListModel<E> dm = getModel();
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2292
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2293
        int iMin = sm.getMinSelectionIndex();
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2294
        int iMax = sm.getMaxSelectionIndex();
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2295
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2296
        if ((iMin < 0) || (iMax < 0)) {
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2297
            return Collections.emptyList();
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2298
        }
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2299
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2300
        List<E> selectedItems = new ArrayList<E>();
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2301
        for(int i = iMin; i <= iMax; i++) {
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2302
            if (sm.isSelectedIndex(i)) {
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2303
                selectedItems.add(dm.getElementAt(i));
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2304
            }
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2305
        }
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2306
        return selectedItems;
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2307
    }
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2308
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2309
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2310
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2311
     * Returns the smallest selected cell index; <i>the selection</i> when only
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2312
     * a single item is selected in the list. When multiple items are selected,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2313
     * it is simply the smallest selected index. Returns {@code -1} if there is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2314
     * no selection.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2315
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2316
     * This method is a cover that delegates to {@code getMinSelectionIndex}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2317
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2318
     * @return the smallest selected cell index
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2319
     * @see #getMinSelectionIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2320
     * @see #addListSelectionListener
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2321
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2322
    public int getSelectedIndex() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2323
        return getMinSelectionIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2324
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2325
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2326
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2327
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2328
     * Returns the value for the smallest selected cell index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2329
     * <i>the selected value</i> when only a single item is selected in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2330
     * list. When multiple items are selected, it is simply the value for the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2331
     * smallest selected index. Returns {@code null} if there is no selection.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2332
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2333
     * This is a convenience method that simply returns the model value for
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2334
     * {@code getMinSelectionIndex}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2335
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2336
     * @return the first selected value
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2337
     * @see #getMinSelectionIndex
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2338
     * @see #getModel
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2339
     * @see #addListSelectionListener
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2340
     */
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2341
    public E getSelectedValue() {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2342
        int i = getMinSelectionIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2343
        return (i == -1) ? null : getModel().getElementAt(i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2344
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2345
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2346
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2347
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2348
     * Selects the specified object from the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2349
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2350
     * @param anObject      the object to select
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2351
     * @param shouldScroll  {@code true} if the list should scroll to display
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2352
     *                      the selected object, if one exists; otherwise {@code false}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2353
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2354
    public void setSelectedValue(Object anObject,boolean shouldScroll) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2355
        if(anObject == null)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2356
            setSelectedIndex(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2357
        else if(!anObject.equals(getSelectedValue())) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2358
            int i,c;
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  2359
            ListModel<E> dm = getModel();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2360
            for(i=0,c=dm.getSize();i<c;i++)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2361
                if(anObject.equals(dm.getElementAt(i))){
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2362
                    setSelectedIndex(i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2363
                    if(shouldScroll)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2364
                        ensureIndexIsVisible(i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2365
                    repaint();  /** FIX-ME setSelectedIndex does not redraw all the time with the basic l&f**/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2366
                    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2367
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2368
            setSelectedIndex(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2369
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2370
        repaint(); /** FIX-ME setSelectedIndex does not redraw all the time with the basic l&f**/
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2371
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2372
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2373
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2374
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2375
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2376
     * --- The Scrollable Implementation ---
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2377
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2378
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2379
    private void checkScrollableParameters(Rectangle visibleRect, int orientation) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2380
        if (visibleRect == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2381
            throw new IllegalArgumentException("visibleRect must be non-null");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2382
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2383
        switch (orientation) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2384
        case SwingConstants.VERTICAL:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2385
        case SwingConstants.HORIZONTAL:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2386
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2387
        default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2388
            throw new IllegalArgumentException("orientation must be one of: VERTICAL, HORIZONTAL");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2389
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2390
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2391
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2392
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2393
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2394
     * Computes the size of viewport needed to display {@code visibleRowCount}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2395
     * rows. The value returned by this method depends on the layout
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2396
     * orientation:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2397
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2398
     * <b>{@code VERTICAL}:</b>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2399
     * <br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2400
     * This is trivial if both {@code fixedCellWidth} and {@code fixedCellHeight}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2401
     * have been set (either explicitly or by specifying a prototype cell value).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2402
     * The width is simply the {@code fixedCellWidth} plus the list's horizontal
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2403
     * insets. The height is the {@code fixedCellHeight} multiplied by the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2404
     * {@code visibleRowCount}, plus the list's vertical insets.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2405
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2406
     * If either {@code fixedCellWidth} or {@code fixedCellHeight} haven't been
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2407
     * specified, heuristics are used. If the model is empty, the width is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2408
     * the {@code fixedCellWidth}, if greater than {@code 0}, or a hard-coded
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2409
     * value of {@code 256}. The height is the {@code fixedCellHeight} multiplied
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2410
     * by {@code visibleRowCount}, if {@code fixedCellHeight} is greater than
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2411
     * {@code 0}, otherwise it is a hard-coded value of {@code 16} multiplied by
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2412
     * {@code visibleRowCount}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2413
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2414
     * If the model isn't empty, the width is the preferred size's width,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2415
     * typically the width of the widest list element. The height is the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2416
     * {@code fixedCellHeight} multiplied by the {@code visibleRowCount},
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2417
     * plus the list's vertical insets.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2418
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2419
     * <b>{@code VERTICAL_WRAP} or {@code HORIZONTAL_WRAP}:</b>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2420
     * <br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2421
     * This method simply returns the value from {@code getPreferredSize}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2422
     * The list's {@code ListUI} is expected to override {@code getPreferredSize}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2423
     * to return an appropriate value.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2424
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2425
     * @return a dimension containing the size of the viewport needed
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2426
     *          to display {@code visibleRowCount} rows
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2427
     * @see #getPreferredScrollableViewportSize
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2428
     * @see #setPrototypeCellValue
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2429
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2430
    public Dimension getPreferredScrollableViewportSize()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2431
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2432
        if (getLayoutOrientation() != VERTICAL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2433
            return getPreferredSize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2434
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2435
        Insets insets = getInsets();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2436
        int dx = insets.left + insets.right;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2437
        int dy = insets.top + insets.bottom;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2438
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2439
        int visibleRowCount = getVisibleRowCount();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2440
        int fixedCellWidth = getFixedCellWidth();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2441
        int fixedCellHeight = getFixedCellHeight();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2442
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2443
        if ((fixedCellWidth > 0) && (fixedCellHeight > 0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2444
            int width = fixedCellWidth + dx;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2445
            int height = (visibleRowCount * fixedCellHeight) + dy;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2446
            return new Dimension(width, height);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2447
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2448
        else if (getModel().getSize() > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2449
            int width = getPreferredSize().width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2450
            int height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2451
            Rectangle r = getCellBounds(0, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2452
            if (r != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2453
                height = (visibleRowCount * r.height) + dy;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2454
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2455
            else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2456
                // Will only happen if UI null, shouldn't matter what we return
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2457
                height = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2458
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2459
            return new Dimension(width, height);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2460
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2461
        else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2462
            fixedCellWidth = (fixedCellWidth > 0) ? fixedCellWidth : 256;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2463
            fixedCellHeight = (fixedCellHeight > 0) ? fixedCellHeight : 16;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2464
            return new Dimension(fixedCellWidth, fixedCellHeight * visibleRowCount);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2465
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2466
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2467
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2468
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2469
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2470
     * Returns the distance to scroll to expose the next or previous
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2471
     * row (for vertical scrolling) or column (for horizontal scrolling).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2472
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2473
     * For horizontal scrolling, if the layout orientation is {@code VERTICAL},
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2474
     * then the list's font size is returned (or {@code 1} if the font is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2475
     * {@code null}).
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2476
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2477
     * @param visibleRect the view area visible within the viewport
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2478
     * @param orientation {@code SwingConstants.HORIZONTAL} or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2479
     *                    {@code SwingConstants.VERTICAL}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2480
     * @param direction less or equal to zero to scroll up/back,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2481
     *                  greater than zero for down/forward
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2482
     * @return the "unit" increment for scrolling in the specified direction;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2483
     *         always positive
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2484
     * @see #getScrollableBlockIncrement
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2485
     * @see Scrollable#getScrollableUnitIncrement
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2486
     * @throws IllegalArgumentException if {@code visibleRect} is {@code null}, or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2487
     *         {@code orientation} isn't one of {@code SwingConstants.VERTICAL} or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2488
     *         {@code SwingConstants.HORIZONTAL}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2489
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2490
    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2491
    {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2492
        checkScrollableParameters(visibleRect, orientation);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2493
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2494
        if (orientation == SwingConstants.VERTICAL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2495
            int row = locationToIndex(visibleRect.getLocation());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2496
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2497
            if (row == -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2498
                return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2499
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2500
            else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2501
                /* Scroll Down */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2502
                if (direction > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2503
                    Rectangle r = getCellBounds(row, row);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2504
                    return (r == null) ? 0 : r.height - (visibleRect.y - r.y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2505
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2506
                /* Scroll Up */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2507
                else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2508
                    Rectangle r = getCellBounds(row, row);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2509
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2510
                    /* The first row is completely visible and it's row 0.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2511
                     * We're done.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2512
                     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2513
                    if ((r.y == visibleRect.y) && (row == 0))  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2514
                        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2515
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2516
                    /* The first row is completely visible, return the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2517
                     * height of the previous row or 0 if the first row
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2518
                     * is the top row of the list.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2519
                     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2520
                    else if (r.y == visibleRect.y) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2521
                        Point loc = r.getLocation();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2522
                        loc.y--;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2523
                        int prevIndex = locationToIndex(loc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2524
                        Rectangle prevR = getCellBounds(prevIndex, prevIndex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2525
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2526
                        if (prevR == null || prevR.y >= r.y) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2527
                            return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2528
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2529
                        return prevR.height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2530
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2531
                    /* The first row is partially visible, return the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2532
                     * height of hidden part.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2533
                     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2534
                    else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2535
                        return visibleRect.y - r.y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2536
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2537
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2538
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2539
        } else if (orientation == SwingConstants.HORIZONTAL &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2540
                           getLayoutOrientation() != JList.VERTICAL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2541
            boolean leftToRight = getComponentOrientation().isLeftToRight();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2542
            int index;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2543
            Point leadingPoint;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2544
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2545
            if (leftToRight) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2546
                leadingPoint = visibleRect.getLocation();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2547
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2548
            else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2549
                leadingPoint = new Point(visibleRect.x + visibleRect.width -1,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2550
                                         visibleRect.y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2551
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2552
            index = locationToIndex(leadingPoint);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2553
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2554
            if (index != -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2555
                Rectangle cellBounds = getCellBounds(index, index);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2556
                if (cellBounds != null && cellBounds.contains(leadingPoint)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2557
                    int leadingVisibleEdge;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2558
                    int leadingCellEdge;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2559
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2560
                    if (leftToRight) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2561
                        leadingVisibleEdge = visibleRect.x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2562
                        leadingCellEdge = cellBounds.x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2563
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2564
                    else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2565
                        leadingVisibleEdge = visibleRect.x + visibleRect.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2566
                        leadingCellEdge = cellBounds.x + cellBounds.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2567
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2568
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2569
                    if (leadingCellEdge != leadingVisibleEdge) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2570
                        if (direction < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2571
                            // Show remainder of leading cell
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2572
                            return Math.abs(leadingVisibleEdge - leadingCellEdge);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2573
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2574
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2575
                        else if (leftToRight) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2576
                            // Hide rest of leading cell
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2577
                            return leadingCellEdge + cellBounds.width - leadingVisibleEdge;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2578
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2579
                        else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2580
                            // Hide rest of leading cell
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2581
                            return leadingVisibleEdge - cellBounds.x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2582
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2583
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2584
                    // ASSUME: All cells are the same width
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2585
                    return cellBounds.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2586
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2587
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2588
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2589
        Font f = getFont();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2590
        return (f != null) ? f.getSize() : 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2591
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2592
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2593
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2594
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2595
     * Returns the distance to scroll to expose the next or previous block.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2596
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2597
     * For vertical scrolling, the following rules are used:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2598
     * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2599
     * <li>if scrolling down, returns the distance to scroll so that the last
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2600
     * visible element becomes the first completely visible element
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2601
     * <li>if scrolling up, returns the distance to scroll so that the first
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2602
     * visible element becomes the last completely visible element
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2603
     * <li>returns {@code visibleRect.height} if the list is empty
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2604
     * </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2605
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2606
     * For horizontal scrolling, when the layout orientation is either
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2607
     * {@code VERTICAL_WRAP} or {@code HORIZONTAL_WRAP}:
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2608
     * <ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2609
     * <li>if scrolling right, returns the distance to scroll so that the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2610
     * last visible element becomes
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2611
     * the first completely visible element
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2612
     * <li>if scrolling left, returns the distance to scroll so that the first
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2613
     * visible element becomes the last completely visible element
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2614
     * <li>returns {@code visibleRect.width} if the list is empty
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2615
     * </ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2616
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2617
     * For horizontal scrolling and {@code VERTICAL} orientation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2618
     * returns {@code visibleRect.width}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2619
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2620
     * Note that the value of {@code visibleRect} must be the equal to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2621
     * {@code this.getVisibleRect()}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2622
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2623
     * @param visibleRect the view area visible within the viewport
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2624
     * @param orientation {@code SwingConstants.HORIZONTAL} or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2625
     *                    {@code SwingConstants.VERTICAL}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2626
     * @param direction less or equal to zero to scroll up/back,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2627
     *                  greater than zero for down/forward
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2628
     * @return the "block" increment for scrolling in the specified direction;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2629
     *         always positive
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2630
     * @see #getScrollableUnitIncrement
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2631
     * @see Scrollable#getScrollableBlockIncrement
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2632
     * @throws IllegalArgumentException if {@code visibleRect} is {@code null}, or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2633
     *         {@code orientation} isn't one of {@code SwingConstants.VERTICAL} or
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2634
     *         {@code SwingConstants.HORIZONTAL}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2635
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2636
    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2637
        checkScrollableParameters(visibleRect, orientation);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2638
        if (orientation == SwingConstants.VERTICAL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2639
            int inc = visibleRect.height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2640
            /* Scroll Down */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2641
            if (direction > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2642
                // last cell is the lowest left cell
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2643
                int last = locationToIndex(new Point(visibleRect.x, visibleRect.y+visibleRect.height-1));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2644
                if (last != -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2645
                    Rectangle lastRect = getCellBounds(last,last);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2646
                    if (lastRect != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2647
                        inc = lastRect.y - visibleRect.y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2648
                        if ( (inc == 0) && (last < getModel().getSize()-1) ) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2649
                            inc = lastRect.height;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2650
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2651
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2652
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2653
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2654
            /* Scroll Up */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2655
            else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2656
                int newFirst = locationToIndex(new Point(visibleRect.x, visibleRect.y-visibleRect.height));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2657
                int first = getFirstVisibleIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2658
                if (newFirst != -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2659
                    if (first == -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2660
                        first = locationToIndex(visibleRect.getLocation());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2661
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2662
                    Rectangle newFirstRect = getCellBounds(newFirst,newFirst);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2663
                    Rectangle firstRect = getCellBounds(first,first);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2664
                    if ((newFirstRect != null) && (firstRect!=null)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2665
                        while ( (newFirstRect.y + visibleRect.height <
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2666
                                 firstRect.y + firstRect.height) &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2667
                                (newFirstRect.y < firstRect.y) ) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2668
                            newFirst++;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2669
                            newFirstRect = getCellBounds(newFirst,newFirst);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2670
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2671
                        inc = visibleRect.y - newFirstRect.y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2672
                        if ( (inc <= 0) && (newFirstRect.y > 0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2673
                            newFirst--;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2674
                            newFirstRect = getCellBounds(newFirst,newFirst);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2675
                            if (newFirstRect != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2676
                                inc = visibleRect.y - newFirstRect.y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2677
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2678
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2679
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2680
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2681
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2682
            return inc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2683
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2684
        else if (orientation == SwingConstants.HORIZONTAL &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2685
                 getLayoutOrientation() != JList.VERTICAL) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2686
            boolean leftToRight = getComponentOrientation().isLeftToRight();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2687
            int inc = visibleRect.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2688
            /* Scroll Right (in ltr mode) or Scroll Left (in rtl mode) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2689
            if (direction > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2690
                // position is upper right if ltr, or upper left otherwise
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2691
                int x = visibleRect.x + (leftToRight ? (visibleRect.width - 1) : 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2692
                int last = locationToIndex(new Point(x, visibleRect.y));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2693
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2694
                if (last != -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2695
                    Rectangle lastRect = getCellBounds(last,last);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2696
                    if (lastRect != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2697
                        if (leftToRight) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2698
                            inc = lastRect.x - visibleRect.x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2699
                        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2700
                            inc = visibleRect.x + visibleRect.width
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2701
                                      - (lastRect.x + lastRect.width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2702
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2703
                        if (inc < 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2704
                            inc += lastRect.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2705
                        } else if ( (inc == 0) && (last < getModel().getSize()-1) ) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2706
                            inc = lastRect.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2707
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2708
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2709
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2710
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2711
            /* Scroll Left (in ltr mode) or Scroll Right (in rtl mode) */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2712
            else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2713
                // position is upper left corner of the visibleRect shifted
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2714
                // left by the visibleRect.width if ltr, or upper right shifted
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2715
                // right by the visibleRect.width otherwise
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2716
                int x = visibleRect.x + (leftToRight
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2717
                                         ? -visibleRect.width
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2718
                                         : visibleRect.width - 1 + visibleRect.width);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2719
                int first = locationToIndex(new Point(x, visibleRect.y));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2720
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2721
                if (first != -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2722
                    Rectangle firstRect = getCellBounds(first,first);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2723
                    if (firstRect != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2724
                        // the right of the first cell
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2725
                        int firstRight = firstRect.x + firstRect.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2726
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2727
                        if (leftToRight) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2728
                            if ((firstRect.x < visibleRect.x - visibleRect.width)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2729
                                    && (firstRight < visibleRect.x)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2730
                                inc = visibleRect.x - firstRight;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2731
                            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2732
                                inc = visibleRect.x - firstRect.x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2733
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2734
                        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2735
                            int visibleRight = visibleRect.x + visibleRect.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2736
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2737
                            if ((firstRight > visibleRight + visibleRect.width)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2738
                                    && (firstRect.x > visibleRight)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2739
                                inc = firstRect.x - visibleRight;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2740
                            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2741
                                inc = firstRight - visibleRight;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2742
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2743
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2744
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2745
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2746
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2747
            return inc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2748
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2749
        return visibleRect.width;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2750
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2751
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2752
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2753
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2754
     * Returns {@code true} if this {@code JList} is displayed in a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2755
     * {@code JViewport} and the viewport is wider than the list's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2756
     * preferred width, or if the layout orientation is {@code HORIZONTAL_WRAP}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2757
     * and {@code visibleRowCount <= 0}; otherwise returns {@code false}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2758
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2759
     * If {@code false}, then don't track the viewport's width. This allows
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2760
     * horizontal scrolling if the {@code JViewport} is itself embedded in a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2761
     * {@code JScrollPane}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2762
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2763
     * @return whether or not an enclosing viewport should force the list's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2764
     *         width to match its own
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2765
     * @see Scrollable#getScrollableTracksViewportWidth
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2766
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2767
    public boolean getScrollableTracksViewportWidth() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2768
        if (getLayoutOrientation() == HORIZONTAL_WRAP &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2769
                                      getVisibleRowCount() <= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2770
            return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2771
        }
5449
21bec46ee9e3 6899413: Fix for CR #6878399 should be refactored
alexp
parents: 4378
diff changeset
  2772
        Container parent = SwingUtilities.getUnwrappedParent(this);
21bec46ee9e3 6899413: Fix for CR #6878399 should be refactored
alexp
parents: 4378
diff changeset
  2773
        if (parent instanceof JViewport) {
21bec46ee9e3 6899413: Fix for CR #6878399 should be refactored
alexp
parents: 4378
diff changeset
  2774
            return parent.getWidth() > getPreferredSize().width;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2775
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2776
        return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2777
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2778
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2779
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2780
     * Returns {@code true} if this {@code JList} is displayed in a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2781
     * {@code JViewport} and the viewport is taller than the list's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2782
     * preferred height, or if the layout orientation is {@code VERTICAL_WRAP}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2783
     * and {@code visibleRowCount <= 0}; otherwise returns {@code false}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2784
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2785
     * If {@code false}, then don't track the viewport's height. This allows
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2786
     * vertical scrolling if the {@code JViewport} is itself embedded in a
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2787
     * {@code JScrollPane}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2788
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2789
     * @return whether or not an enclosing viewport should force the list's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2790
     *         height to match its own
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2791
     * @see Scrollable#getScrollableTracksViewportHeight
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2792
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2793
    public boolean getScrollableTracksViewportHeight() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2794
        if (getLayoutOrientation() == VERTICAL_WRAP &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2795
                     getVisibleRowCount() <= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2796
            return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2797
        }
5449
21bec46ee9e3 6899413: Fix for CR #6878399 should be refactored
alexp
parents: 4378
diff changeset
  2798
        Container parent = SwingUtilities.getUnwrappedParent(this);
21bec46ee9e3 6899413: Fix for CR #6878399 should be refactored
alexp
parents: 4378
diff changeset
  2799
        if (parent instanceof JViewport) {
21bec46ee9e3 6899413: Fix for CR #6878399 should be refactored
alexp
parents: 4378
diff changeset
  2800
            return parent.getHeight() > getPreferredSize().height;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2801
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2802
        return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2803
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2804
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2805
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2806
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2807
     * See {@code readObject} and {@code writeObject} in {@code JComponent}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2808
     * for more information about serialization in Swing.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2809
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2810
    private void writeObject(ObjectOutputStream s) throws IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2811
        s.defaultWriteObject();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2812
        if (getUIClassID().equals(uiClassID)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2813
            byte count = JComponent.getWriteObjCounter(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2814
            JComponent.setWriteObjCounter(this, --count);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2815
            if (count == 0 && ui != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2816
                ui.installUI(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2817
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2818
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2819
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2820
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2821
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2822
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2823
     * Returns a {@code String} representation of this {@code JList}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2824
     * This method is intended to be used only for debugging purposes,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2825
     * and the content and format of the returned {@code String} may vary
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2826
     * between implementations. The returned {@code String} may be empty,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2827
     * but may not be {@code null}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2828
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2829
     * @return  a {@code String} representation of this {@code JList}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2830
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2831
    protected String paramString() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2832
        String selectionForegroundString = (selectionForeground != null ?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2833
                                            selectionForeground.toString() :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2834
                                            "");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2835
        String selectionBackgroundString = (selectionBackground != null ?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2836
                                            selectionBackground.toString() :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2837
                                            "");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2838
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2839
        return super.paramString() +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2840
        ",fixedCellHeight=" + fixedCellHeight +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2841
        ",fixedCellWidth=" + fixedCellWidth +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2842
        ",horizontalScrollIncrement=" + horizontalScrollIncrement +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2843
        ",selectionBackground=" + selectionBackgroundString +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2844
        ",selectionForeground=" + selectionForegroundString +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2845
        ",visibleRowCount=" + visibleRowCount +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2846
        ",layoutOrientation=" + layoutOrientation;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2847
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2848
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2849
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2850
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2851
     * --- Accessibility Support ---
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2852
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2853
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2854
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2855
     * Gets the {@code AccessibleContext} associated with this {@code JList}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2856
     * For {@code JList}, the {@code AccessibleContext} takes the form of an
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2857
     * {@code AccessibleJList}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2858
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2859
     * A new {@code AccessibleJList} instance is created if necessary.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2860
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2861
     * @return an {@code AccessibleJList} that serves as the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2862
     *         {@code AccessibleContext} of this {@code JList}
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2863
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2864
    public AccessibleContext getAccessibleContext() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2865
        if (accessibleContext == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2866
            accessibleContext = new AccessibleJList();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2867
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2868
        return accessibleContext;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2869
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2870
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2871
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2872
     * This class implements accessibility support for the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2873
     * {@code JList} class. It provides an implementation of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2874
     * Java Accessibility API appropriate to list user-interface
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2875
     * elements.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2876
     * <p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2877
     * <strong>Warning:</strong>
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2878
     * Serialized objects of this class will not be compatible with
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2879
     * future Swing releases. The current serialization support is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2880
     * appropriate for short term storage or RMI between applications running
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2881
     * the same version of Swing.  As of 1.4, support for long term storage
20458
f2423fb3fd19 8025840: Fix all the doclint warnings about trademark
cl
parents: 20455
diff changeset
  2882
     * of all JavaBeans&trade;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2883
     * has been added to the <code>java.beans</code> package.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2884
     * Please see {@link java.beans.XMLEncoder}.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2885
     */
22574
7f8ce0c8c20a 8032627: Add @SuppressWarnings("serial") to appropriate javax.swing classes
darcy
parents: 21982
diff changeset
  2886
    @SuppressWarnings("serial") // Same-version serialization only
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2887
    protected class AccessibleJList extends AccessibleJComponent
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2888
        implements AccessibleSelection, PropertyChangeListener,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2889
        ListSelectionListener, ListDataListener {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2890
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2891
        int leadSelectionIndex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2892
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2893
        public AccessibleJList() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2894
            super();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2895
            JList.this.addPropertyChangeListener(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2896
            JList.this.getSelectionModel().addListSelectionListener(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2897
            JList.this.getModel().addListDataListener(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2898
            leadSelectionIndex = JList.this.getLeadSelectionIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2899
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2900
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2901
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2902
         * Property Change Listener change method. Used to track changes
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2903
         * to the DataModel and ListSelectionModel, in order to re-set
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2904
         * listeners to those for reporting changes there via the Accessibility
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2905
         * PropertyChange mechanism.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2906
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2907
         * @param e PropertyChangeEvent
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2908
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2909
        public void propertyChange(PropertyChangeEvent e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2910
            String name = e.getPropertyName();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2911
            Object oldValue = e.getOldValue();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2912
            Object newValue = e.getNewValue();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2913
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2914
                // re-set listData listeners
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2915
            if (name.compareTo("model") == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2916
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2917
                if (oldValue != null && oldValue instanceof ListModel) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2918
                    ((ListModel) oldValue).removeListDataListener(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2919
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2920
                if (newValue != null && newValue instanceof ListModel) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2921
                    ((ListModel) newValue).addListDataListener(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2922
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2923
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2924
                // re-set listSelectionModel listeners
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2925
            } else if (name.compareTo("selectionModel") == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2926
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2927
                if (oldValue != null && oldValue instanceof ListSelectionModel) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2928
                    ((ListSelectionModel) oldValue).removeListSelectionListener(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2929
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2930
                if (newValue != null && newValue instanceof ListSelectionModel) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2931
                    ((ListSelectionModel) newValue).addListSelectionListener(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2932
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2933
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2934
                firePropertyChange(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2935
                    AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2936
                    Boolean.valueOf(false), Boolean.valueOf(true));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2937
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2938
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2939
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2940
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2941
         * List Selection Listener value change method. Used to fire
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2942
         * the property change
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2943
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2944
         * @param e ListSelectionEvent
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2945
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2946
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2947
        public void valueChanged(ListSelectionEvent e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2948
            int oldLeadSelectionIndex = leadSelectionIndex;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2949
            leadSelectionIndex = JList.this.getLeadSelectionIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2950
            if (oldLeadSelectionIndex != leadSelectionIndex) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2951
                Accessible oldLS, newLS;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2952
                oldLS = (oldLeadSelectionIndex >= 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2953
                        ? getAccessibleChild(oldLeadSelectionIndex)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2954
                        : null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2955
                newLS = (leadSelectionIndex >= 0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2956
                        ? getAccessibleChild(leadSelectionIndex)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2957
                        : null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2958
                firePropertyChange(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2959
                                   oldLS, newLS);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2960
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2961
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2962
            firePropertyChange(AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2963
                               Boolean.valueOf(false), Boolean.valueOf(true));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2964
            firePropertyChange(AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2965
                               Boolean.valueOf(false), Boolean.valueOf(true));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2966
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2967
            // Process the State changes for Multiselectable
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2968
            AccessibleStateSet s = getAccessibleStateSet();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2969
            ListSelectionModel lsm = JList.this.getSelectionModel();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2970
            if (lsm.getSelectionMode() != ListSelectionModel.SINGLE_SELECTION) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2971
                if (!s.contains(AccessibleState.MULTISELECTABLE)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2972
                    s.add(AccessibleState.MULTISELECTABLE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2973
                    firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2974
                                       null, AccessibleState.MULTISELECTABLE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2975
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2976
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2977
                if (s.contains(AccessibleState.MULTISELECTABLE)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2978
                    s.remove(AccessibleState.MULTISELECTABLE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2979
                    firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2980
                                       AccessibleState.MULTISELECTABLE, null);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2981
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2982
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2983
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2984
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2985
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2986
         * List Data Listener interval added method. Used to fire the visible data property change
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2987
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2988
         * @param e ListDataEvent
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2989
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2990
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2991
        public void intervalAdded(ListDataEvent e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2992
            firePropertyChange(AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2993
                               Boolean.valueOf(false), Boolean.valueOf(true));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2994
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2995
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2996
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2997
         * List Data Listener interval removed method. Used to fire the visible data property change
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2998
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  2999
         * @param e ListDataEvent
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3000
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3001
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3002
        public void intervalRemoved(ListDataEvent e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3003
            firePropertyChange(AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3004
                               Boolean.valueOf(false), Boolean.valueOf(true));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3005
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3006
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3007
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3008
         * List Data Listener contents changed method. Used to fire the visible data property change
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3009
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3010
         * @param e ListDataEvent
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3011
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3012
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3013
         public void contentsChanged(ListDataEvent e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3014
             firePropertyChange(AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3015
                                Boolean.valueOf(false), Boolean.valueOf(true));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3016
         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3017
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3018
    // AccessibleContext methods
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3019
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3020
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3021
         * Get the state set of this object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3022
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3023
         * @return an instance of AccessibleState containing the current state
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3024
         * of the object
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3025
         * @see AccessibleState
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3026
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3027
        public AccessibleStateSet getAccessibleStateSet() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3028
            AccessibleStateSet states = super.getAccessibleStateSet();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3029
            if (selectionModel.getSelectionMode() !=
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3030
                ListSelectionModel.SINGLE_SELECTION) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3031
                states.add(AccessibleState.MULTISELECTABLE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3032
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3033
            return states;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3034
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3035
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3036
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3037
         * Get the role of this object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3038
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3039
         * @return an instance of AccessibleRole describing the role of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3040
         * object
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3041
         * @see AccessibleRole
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3042
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3043
        public AccessibleRole getAccessibleRole() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3044
            return AccessibleRole.LIST;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3045
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3046
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3047
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3048
         * Returns the <code>Accessible</code> child contained at
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3049
         * the local coordinate <code>Point</code>, if one exists.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3050
         * Otherwise returns <code>null</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3051
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3052
         * @return the <code>Accessible</code> at the specified
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3053
         *    location, if it exists
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3054
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3055
        public Accessible getAccessibleAt(Point p) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3056
            int i = locationToIndex(p);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3057
            if (i >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3058
                return new AccessibleJListChild(JList.this, i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3059
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3060
                return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3061
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3062
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3063
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3064
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3065
         * Returns the number of accessible children in the object.  If all
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3066
         * of the children of this object implement Accessible, than this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3067
         * method should return the number of children of this object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3068
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3069
         * @return the number of accessible children in the object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3070
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3071
        public int getAccessibleChildrenCount() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3072
            return getModel().getSize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3073
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3074
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3075
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3076
         * Return the nth Accessible child of the object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3077
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3078
         * @param i zero-based index of child
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3079
         * @return the nth Accessible child of the object
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3080
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3081
        public Accessible getAccessibleChild(int i) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3082
            if (i >= getModel().getSize()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3083
                return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3084
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3085
                return new AccessibleJListChild(JList.this, i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3086
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3087
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3088
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3089
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3090
         * Get the AccessibleSelection associated with this object.  In the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3091
         * implementation of the Java Accessibility API for this class,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3092
         * return this object, which is responsible for implementing the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3093
         * AccessibleSelection interface on behalf of itself.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3094
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3095
         * @return this object
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3096
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3097
        public AccessibleSelection getAccessibleSelection() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3098
            return this;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3099
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3100
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3101
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3102
    // AccessibleSelection methods
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3103
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3104
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3105
         * Returns the number of items currently selected.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3106
         * If no items are selected, the return value will be 0.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3107
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3108
         * @return the number of items currently selected.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3109
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3110
         public int getAccessibleSelectionCount() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3111
             return JList.this.getSelectedIndices().length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3112
         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3113
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3114
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3115
         * Returns an Accessible representing the specified selected item
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3116
         * in the object.  If there isn't a selection, or there are
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3117
         * fewer items selected than the integer passed in, the return
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3118
         * value will be <code>null</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3119
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3120
         * @param i the zero-based index of selected items
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3121
         * @return an Accessible containing the selected item
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3122
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3123
         public Accessible getAccessibleSelection(int i) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3124
             int len = getAccessibleSelectionCount();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3125
             if (i < 0 || i >= len) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3126
                 return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3127
             } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3128
                 return getAccessibleChild(JList.this.getSelectedIndices()[i]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3129
             }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3130
         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3131
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3132
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3133
         * Returns true if the current child of this object is selected.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3134
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3135
         * @param i the zero-based index of the child in this Accessible
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3136
         * object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3137
         * @see AccessibleContext#getAccessibleChild
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3138
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3139
        public boolean isAccessibleChildSelected(int i) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3140
            return isSelectedIndex(i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3141
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3142
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3143
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3144
         * Adds the specified selected item in the object to the object's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3145
         * selection.  If the object supports multiple selections,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3146
         * the specified item is added to any existing selection, otherwise
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3147
         * it replaces any existing selection in the object.  If the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3148
         * specified item is already selected, this method has no effect.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3149
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3150
         * @param i the zero-based index of selectable items
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3151
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3152
         public void addAccessibleSelection(int i) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3153
             JList.this.addSelectionInterval(i, i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3154
         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3155
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3156
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3157
         * Removes the specified selected item in the object from the object's
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3158
         * selection.  If the specified item isn't currently selected, this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3159
         * method has no effect.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3160
         *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3161
         * @param i the zero-based index of selectable items
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3162
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3163
         public void removeAccessibleSelection(int i) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3164
             JList.this.removeSelectionInterval(i, i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3165
         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3166
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3167
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3168
         * Clears the selection in the object, so that nothing in the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3169
         * object is selected.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3170
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3171
         public void clearAccessibleSelection() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3172
             JList.this.clearSelection();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3173
         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3174
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3175
        /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3176
         * Causes every selected item in the object to be selected
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3177
         * if the object supports multiple selections.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3178
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3179
         public void selectAllAccessibleSelection() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3180
             JList.this.addSelectionInterval(0, getAccessibleChildrenCount() -1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3181
         }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3182
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3183
          /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3184
           * This class implements accessibility support appropriate
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3185
           * for list children.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3186
           */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3187
        protected class AccessibleJListChild extends AccessibleContext
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3188
                implements Accessible, AccessibleComponent {
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  3189
            private JList<E>     parent = null;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3190
            private int       indexInParent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3191
            private Component component = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3192
            private AccessibleContext accessibleContext = null;
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  3193
            private ListModel<E> listModel;
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  3194
            private ListCellRenderer<? super E> cellRenderer = null;
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  3195
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  3196
            public AccessibleJListChild(JList<E> parent, int indexInParent) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3197
                this.parent = parent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3198
                this.setAccessibleParent(parent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3199
                this.indexInParent = indexInParent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3200
                if (parent != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3201
                    listModel = parent.getModel();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3202
                    cellRenderer = parent.getCellRenderer();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3203
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3204
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3205
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3206
            private Component getCurrentComponent() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3207
                return getComponentAtIndex(indexInParent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3208
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3209
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3210
            private AccessibleContext getCurrentAccessibleContext() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3211
                Component c = getComponentAtIndex(indexInParent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3212
                if (c instanceof Accessible) {
1301
15e81207e1f2 6727662: Code improvement and warnings removing from swing packages
rupashka
parents: 466
diff changeset
  3213
                    return c.getAccessibleContext();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3214
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3215
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3216
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3217
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3218
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3219
            private Component getComponentAtIndex(int index) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3220
                if (index < 0 || index >= listModel.getSize()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3221
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3222
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3223
                if ((parent != null)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3224
                        && (listModel != null)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3225
                        && cellRenderer != null) {
4378
ef21a120cb18 6823603: Generics: JList
rupashka
parents: 4278
diff changeset
  3226
                    E value = listModel.getElementAt(index);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3227
                    boolean isSelected = parent.isSelectedIndex(index);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3228
                    boolean isFocussed = parent.isFocusOwner()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3229
                            && (index == parent.getLeadSelectionIndex());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3230
                    return cellRenderer.getListCellRendererComponent(
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3231
                            parent,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3232
                            value,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3233
                            index,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3234
                            isSelected,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3235
                            isFocussed);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3236
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3237
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3238
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3239
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3240
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3241
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3242
            // Accessible Methods
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3243
           /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3244
            * Get the AccessibleContext for this object. In the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3245
            * implementation of the Java Accessibility API for this class,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3246
            * returns this object, which is its own AccessibleContext.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3247
            *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3248
            * @return this object
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3249
            */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3250
            public AccessibleContext getAccessibleContext() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3251
                return this;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3252
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3253
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3254
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3255
            // AccessibleContext methods
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3256
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3257
            public String getAccessibleName() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3258
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3259
                if (ac != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3260
                    return ac.getAccessibleName();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3261
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3262
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3263
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3264
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3265
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3266
            public void setAccessibleName(String s) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3267
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3268
                if (ac != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3269
                    ac.setAccessibleName(s);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3270
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3271
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3272
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3273
            public String getAccessibleDescription() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3274
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3275
                if (ac != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3276
                    return ac.getAccessibleDescription();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3277
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3278
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3279
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3280
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3281
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3282
            public void setAccessibleDescription(String s) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3283
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3284
                if (ac != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3285
                    ac.setAccessibleDescription(s);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3286
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3287
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3288
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3289
            public AccessibleRole getAccessibleRole() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3290
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3291
                if (ac != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3292
                    return ac.getAccessibleRole();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3293
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3294
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3295
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3296
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3297
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3298
            public AccessibleStateSet getAccessibleStateSet() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3299
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3300
                AccessibleStateSet s;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3301
                if (ac != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3302
                    s = ac.getAccessibleStateSet();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3303
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3304
                    s = new AccessibleStateSet();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3305
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3306
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3307
                s.add(AccessibleState.SELECTABLE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3308
                if (parent.isFocusOwner()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3309
                    && (indexInParent == parent.getLeadSelectionIndex())) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3310
                    s.add(AccessibleState.ACTIVE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3311
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3312
                if (parent.isSelectedIndex(indexInParent)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3313
                    s.add(AccessibleState.SELECTED);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3314
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3315
                if (this.isShowing()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3316
                    s.add(AccessibleState.SHOWING);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3317
                } else if (s.contains(AccessibleState.SHOWING)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3318
                    s.remove(AccessibleState.SHOWING);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3319
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3320
                if (this.isVisible()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3321
                    s.add(AccessibleState.VISIBLE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3322
                } else if (s.contains(AccessibleState.VISIBLE)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3323
                    s.remove(AccessibleState.VISIBLE);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3324
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3325
                s.add(AccessibleState.TRANSIENT); // cell-rendered
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3326
                return s;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3327
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3328
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3329
            public int getAccessibleIndexInParent() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3330
                return indexInParent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3331
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3332
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3333
            public int getAccessibleChildrenCount() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3334
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3335
                if (ac != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3336
                    return ac.getAccessibleChildrenCount();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3337
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3338
                    return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3339
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3340
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3341
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3342
            public Accessible getAccessibleChild(int i) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3343
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3344
                if (ac != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3345
                    Accessible accessibleChild = ac.getAccessibleChild(i);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3346
                    ac.setAccessibleParent(this);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3347
                    return accessibleChild;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3348
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3349
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3350
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3351
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3352
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3353
            public Locale getLocale() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3354
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3355
                if (ac != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3356
                    return ac.getLocale();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3357
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3358
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3359
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3360
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3361
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3362
            public void addPropertyChangeListener(PropertyChangeListener l) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3363
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3364
                if (ac != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3365
                    ac.addPropertyChangeListener(l);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3366
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3367
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3368
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3369
            public void removePropertyChangeListener(PropertyChangeListener l) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3370
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3371
                if (ac != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3372
                    ac.removePropertyChangeListener(l);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3373
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3374
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3375
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3376
            public AccessibleAction getAccessibleAction() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3377
                return getCurrentAccessibleContext().getAccessibleAction();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3378
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3379
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3380
           /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3381
            * Get the AccessibleComponent associated with this object.  In the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3382
            * implementation of the Java Accessibility API for this class,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3383
            * return this object, which is responsible for implementing the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3384
            * AccessibleComponent interface on behalf of itself.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3385
            *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3386
            * @return this object
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3387
            */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3388
            public AccessibleComponent getAccessibleComponent() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3389
                return this; // to override getBounds()
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3390
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3391
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3392
            public AccessibleSelection getAccessibleSelection() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3393
                return getCurrentAccessibleContext().getAccessibleSelection();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3394
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3395
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3396
            public AccessibleText getAccessibleText() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3397
                return getCurrentAccessibleContext().getAccessibleText();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3398
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3399
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3400
            public AccessibleValue getAccessibleValue() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3401
                return getCurrentAccessibleContext().getAccessibleValue();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3402
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3403
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3404
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3405
            // AccessibleComponent methods
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3406
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3407
            public Color getBackground() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3408
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3409
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3410
                    return ((AccessibleComponent) ac).getBackground();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3411
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3412
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3413
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3414
                        return c.getBackground();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3415
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3416
                        return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3417
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3418
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3419
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3420
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3421
            public void setBackground(Color c) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3422
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3423
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3424
                    ((AccessibleComponent) ac).setBackground(c);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3425
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3426
                    Component cp = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3427
                    if (cp != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3428
                        cp.setBackground(c);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3429
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3430
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3431
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3432
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3433
            public Color getForeground() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3434
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3435
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3436
                    return ((AccessibleComponent) ac).getForeground();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3437
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3438
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3439
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3440
                        return c.getForeground();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3441
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3442
                        return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3443
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3444
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3445
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3446
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3447
            public void setForeground(Color c) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3448
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3449
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3450
                    ((AccessibleComponent) ac).setForeground(c);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3451
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3452
                    Component cp = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3453
                    if (cp != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3454
                        cp.setForeground(c);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3455
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3456
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3457
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3458
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3459
            public Cursor getCursor() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3460
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3461
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3462
                    return ((AccessibleComponent) ac).getCursor();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3463
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3464
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3465
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3466
                        return c.getCursor();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3467
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3468
                        Accessible ap = getAccessibleParent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3469
                        if (ap instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3470
                            return ((AccessibleComponent) ap).getCursor();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3471
                        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3472
                            return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3473
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3474
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3475
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3476
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3477
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3478
            public void setCursor(Cursor c) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3479
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3480
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3481
                    ((AccessibleComponent) ac).setCursor(c);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3482
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3483
                    Component cp = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3484
                    if (cp != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3485
                        cp.setCursor(c);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3486
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3487
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3488
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3489
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3490
            public Font getFont() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3491
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3492
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3493
                    return ((AccessibleComponent) ac).getFont();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3494
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3495
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3496
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3497
                        return c.getFont();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3498
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3499
                        return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3500
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3501
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3502
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3503
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3504
            public void setFont(Font f) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3505
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3506
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3507
                    ((AccessibleComponent) ac).setFont(f);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3508
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3509
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3510
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3511
                        c.setFont(f);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3512
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3513
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3514
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3515
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3516
            public FontMetrics getFontMetrics(Font f) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3517
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3518
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3519
                    return ((AccessibleComponent) ac).getFontMetrics(f);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3520
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3521
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3522
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3523
                        return c.getFontMetrics(f);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3524
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3525
                        return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3526
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3527
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3528
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3529
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3530
            public boolean isEnabled() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3531
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3532
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3533
                    return ((AccessibleComponent) ac).isEnabled();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3534
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3535
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3536
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3537
                        return c.isEnabled();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3538
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3539
                        return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3540
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3541
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3542
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3543
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3544
            public void setEnabled(boolean b) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3545
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3546
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3547
                    ((AccessibleComponent) ac).setEnabled(b);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3548
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3549
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3550
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3551
                        c.setEnabled(b);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3552
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3553
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3554
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3555
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3556
            public boolean isVisible() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3557
                int fi = parent.getFirstVisibleIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3558
                int li = parent.getLastVisibleIndex();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3559
                // The UI incorrectly returns a -1 for the last
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3560
                // visible index if the list is smaller than the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3561
                // viewport size.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3562
                if (li == -1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3563
                    li = parent.getModel().getSize() - 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3564
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3565
                return ((indexInParent >= fi)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3566
                        && (indexInParent <= li));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3567
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3568
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3569
            public void setVisible(boolean b) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3570
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3571
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3572
            public boolean isShowing() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3573
                return (parent.isShowing() && isVisible());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3574
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3575
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3576
            public boolean contains(Point p) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3577
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3578
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3579
                    Rectangle r = ((AccessibleComponent) ac).getBounds();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3580
                    return r.contains(p);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3581
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3582
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3583
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3584
                        Rectangle r = c.getBounds();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3585
                        return r.contains(p);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3586
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3587
                        return getBounds().contains(p);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3588
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3589
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3590
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3591
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3592
            public Point getLocationOnScreen() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3593
                if (parent != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3594
                    Point listLocation = parent.getLocationOnScreen();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3595
                    Point componentLocation = parent.indexToLocation(indexInParent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3596
                    if (componentLocation != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3597
                        componentLocation.translate(listLocation.x, listLocation.y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3598
                        return componentLocation;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3599
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3600
                        return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3601
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3602
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3603
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3604
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3605
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3606
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3607
            public Point getLocation() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3608
                if (parent != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3609
                    return parent.indexToLocation(indexInParent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3610
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3611
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3612
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3613
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3614
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3615
            public void setLocation(Point p) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3616
                if ((parent != null)  && (parent.contains(p))) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3617
                    ensureIndexIsVisible(indexInParent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3618
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3619
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3620
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3621
            public Rectangle getBounds() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3622
                if (parent != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3623
                    return parent.getCellBounds(indexInParent,indexInParent);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3624
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3625
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3626
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3627
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3628
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3629
            public void setBounds(Rectangle r) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3630
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3631
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3632
                    ((AccessibleComponent) ac).setBounds(r);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3633
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3634
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3635
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3636
            public Dimension getSize() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3637
                Rectangle cellBounds = this.getBounds();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3638
                if (cellBounds != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3639
                    return cellBounds.getSize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3640
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3641
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3642
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3643
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3644
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3645
            public void setSize (Dimension d) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3646
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3647
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3648
                    ((AccessibleComponent) ac).setSize(d);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3649
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3650
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3651
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3652
                        c.setSize(d);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3653
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3654
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3655
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3656
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3657
            public Accessible getAccessibleAt(Point p) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3658
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3659
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3660
                    return ((AccessibleComponent) ac).getAccessibleAt(p);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3661
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3662
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3663
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3664
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3665
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3666
            public boolean isFocusTraversable() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3667
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3668
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3669
                    return ((AccessibleComponent) ac).isFocusTraversable();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3670
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3671
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3672
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3673
                        return c.isFocusTraversable();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3674
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3675
                        return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3676
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3677
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3678
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3679
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3680
            public void requestFocus() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3681
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3682
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3683
                    ((AccessibleComponent) ac).requestFocus();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3684
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3685
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3686
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3687
                        c.requestFocus();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3688
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3689
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3690
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3691
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3692
            public void addFocusListener(FocusListener l) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3693
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3694
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3695
                    ((AccessibleComponent) ac).addFocusListener(l);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3696
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3697
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3698
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3699
                        c.addFocusListener(l);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3700
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3701
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3702
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3703
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3704
            public void removeFocusListener(FocusListener l) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3705
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3706
                if (ac instanceof AccessibleComponent) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3707
                    ((AccessibleComponent) ac).removeFocusListener(l);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3708
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3709
                    Component c = getCurrentComponent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3710
                    if (c != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3711
                        c.removeFocusListener(l);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3712
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3713
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3714
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3715
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3716
            // TIGER - 4733624
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3717
            /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3718
             * Returns the icon for the element renderer, as the only item
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3719
             * of an array of <code>AccessibleIcon</code>s or a <code>null</code> array
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3720
             * if the renderer component contains no icons.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3721
             *
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3722
             * @return an array containing the accessible icon
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3723
             *         or a <code>null</code> array if none
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3724
             * @since 1.3
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3725
             */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3726
            public AccessibleIcon [] getAccessibleIcon() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3727
                AccessibleContext ac = getCurrentAccessibleContext();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3728
                if (ac != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3729
                    return ac.getAccessibleIcon();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3730
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3731
                    return null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3732
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3733
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3734
        } // inner class AccessibleJListChild
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3735
    } // inner class AccessibleJList
90ce3da70b43 Initial load
duke
parents:
diff changeset
  3736
}