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