home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1997 October
/
Chip_1997-10_cd.bin
/
tema
/
sybase
/
powerj
/
java.z
/
List.java
< prev
next >
Wrap
Text File
|
1996-05-03
|
10KB
|
394 lines
/*
* @(#)List.java 1.25 96/04/01 Sami Shaio
*
* Copyright (c) 1994-1995 Sun Microsystems, Inc. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL purposes and without
* fee is hereby granted provided that this copyright notice
* appears in all copies. Please refer to the file "copyright.html"
* for further important copyright and licensing information.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
package java.awt;
import java.util.Vector;
import java.awt.peer.ListPeer;
/**
* A scrolling list of text items.
*
* @version 1.25, 01 Apr 1996
* @author Sami Shaio
*/
public class List extends Component {
Vector items = new Vector();
int rows = 0;
boolean multipleSelections = false;
int selected[] = new int[0];
int visibleIndex = -1;
/**
* Creates a new scrolling list initialized with no visible Lines
* or multiple selections.
*/
public List() {
this(0, false);
}
/**
* Creates a new scrolling list initialized with the specified
* number of visible lines and a boolean stating whether multiple
* selections are allowed or not.
* @param rows the number of items to show.
* @param multipleSelections if true then multiple selections are allowed.
*/
public List(int rows, boolean multipleSelections) {
this.rows = rows;
this.multipleSelections = multipleSelections;
}
/**
* Creates the peer for the list. The peer allows us to modify the
* list's appearance without changing its functionality.
*/
public synchronized void addNotify() {
peer = getToolkit().createList(this);
super.addNotify();
visibleIndex = -1;
}
/**
* Removes the peer for this list. The peer allows us to modify the
* list's appearance without changing its functionality.
*/
public synchronized void removeNotify() {
if (peer != null) {
ListPeer peer = (ListPeer)this.peer;
selected = peer.getSelectedIndexes();
}
super.removeNotify();
}
/**
* Returns the number of items in the list.
* @see #getItem
*/
public int countItems() {
return items.size();
}
/**
* Gets the item associated with the specified index.
* @param index the position of the item
* @see #countItems
*/
public String getItem(int index) {
return (String)items.elementAt(index);
}
/**
* Adds the specified item to the end of scrolling list.
* @param item the item to be added
*/
public synchronized void addItem(String item) {
addItem(item, -1);
}
/**
* Adds the specified item to the end of scrolling list.
* @param item the item to be added
* @param index the position at which to put in the item. The
* index is zero-based. If index is -1 then the item is added to
* the end. If index is greater than the number of items in the
* list, the item gets added at the end.
*/
public synchronized void addItem(String item, int index) {
if (index < -1 || index >= items.size()) {
index = -1;
}
if (index == -1) {
items.addElement(item);
} else {
items.insertElementAt(item, index);
}
ListPeer peer = (ListPeer)this.peer;
if (peer != null) {
peer.addItem(item, index);
}
}
/**
* Replaces the item at the given index.
* @param newValue the new value to replace the existing item
* @param index the position of the item to replace
*/
public synchronized void replaceItem(String newValue, int index) {
delItem(index);
addItem(newValue, index);
}
/**
* Clears the list.
* @see #delItem
* @see #delItems
*/
public synchronized void clear() {
if (peer != null) {
((ListPeer)peer).clear();
}
items = new Vector();
selected = new int[0];
}
/**
* Delete an item from the list.
*/
public synchronized void delItem(int position) {
delItems(position, position);
}
/**
* Delete multiple items from the list.
*/
public synchronized void delItems(int start, int end) {
for (int i=end; i >= start; i--) {
items.removeElementAt(i);
}
if (peer != null) {
((ListPeer)peer).delItems(start, end);
}
}
/**
* Get the selected item on the list or -1 if no item is selected.
* @see #select
* @see #deselect
* @see #isSelected
*/
public synchronized int getSelectedIndex() {
int sel[] = getSelectedIndexes();
return (sel.length == 1) ? sel[0] : -1;
}
/**
* Returns the selected indexes on the list.
* @see #select
* @see #deselect
* @see #isSelected
*/
public synchronized int[] getSelectedIndexes() {
ListPeer peer = (ListPeer)this.peer;
if (peer != null) {
selected = peer.getSelectedIndexes();
}
return selected;
}
/**
* Returns the selected item on the list or null if no item is selected.
* @see #select
* @see #deselect
* @see #isSelected
*/
public synchronized String getSelectedItem() {
int index = getSelectedIndex();
return (index < 0) ? null : getItem(index);
}
/**
* Returns the selected items on the list.
* @see #select
* @see #deselect
* @see #isSelected
*/
public synchronized String[] getSelectedItems() {
int sel[] = getSelectedIndexes();
String str[] = new String[sel.length];
for (int i = 0 ; i < sel.length ; i++) {
str[i] = getItem(sel[i]);
}
return str;
}
/**
* Selects the item at the specified index.
* @param index the position of the item to select
* @see #getSelectedItem
* @see #deselect
* @see #isSelected
*/
public synchronized void select(int index) {
ListPeer peer = (ListPeer)this.peer;
if (peer != null) {
peer.select(index);
return;
}
for (int i = 0 ; i < selected.length ; i++) {
if (selected[i] == index) {
return;
}
}
if (!multipleSelections) {
selected = new int[1];
selected[0] = index;
} else {
int newsel[] = new int[selected.length + 1];
System.arraycopy(selected, 0, newsel, 0, selected.length);
newsel[selected.length] = index;
selected = newsel;
}
}
/**
* Deselects the item at the specified index.
* @param index the position of the item to deselect
* @see #select
* @see #getSelectedItem
* @see #isSelected
*/
public synchronized void deselect(int index) {
ListPeer peer = (ListPeer)this.peer;
if (peer != null) {
peer.deselect(index);
}
for (int i = 0 ; i < selected.length ; i++) {
if (selected[i] == index) {
int newsel[] = new int[selected.length - 1];
System.arraycopy(selected, 0, newsel, 0, i);
System.arraycopy(selected, i+1, newsel, i, selected.length - (i+1));
selected = newsel;
return;
}
}
}
/**
* Returns true if the item at the specified index has been selected;
* false otherwise.
* @param index the item to be checked
* @see #select
* @see #deselect
* @see #isSelected
*/
public synchronized boolean isSelected(int index) {
int sel[] = getSelectedIndexes();
for (int i = 0 ; i < sel.length ; i++) {
if (sel[i] == index) {
return true;
}
}
return false;
}
/**
* Returns the number of visible lines in this list.
*/
public int getRows() {
return rows;
}
/**
* Returns true if this list allows multiple selections.
* @see #setMultipleSelections
*/
public boolean allowsMultipleSelections() {
return multipleSelections;
}
/**
* Sets whether this list should allow multiple selections or not.
* @param v the boolean to allow multiple selections
* @see #allowsMultipleSelections
*/
public void setMultipleSelections(boolean v) {
if (v != multipleSelections) {
multipleSelections = v;
ListPeer peer = (ListPeer)this.peer;
if (peer != null) {
peer.setMultipleSelections(v);
}
}
}
/**
* Gets the index of the item that was last made visible by the method
* makeVisible.
*/
public int getVisibleIndex() {
return visibleIndex;
}
/**
* Forces the item at the specified index to be visible.
* @param index the position of the item
* @see #getVisibleIndex
*/
public void makeVisible(int index) {
ListPeer peer = (ListPeer)this.peer;
visibleIndex = index;
if (peer != null) {
peer.makeVisible(index);
}
}
/**
* Returns the preferred dimensions needed for the list with the specified
* amount of rows.
* @param rows amount of rows in list.
*/
public Dimension preferredSize(int rows) {
ListPeer peer = (ListPeer)this.peer;
return (peer != null) ? peer.preferredSize(rows) : super.preferredSize();
}
/**
* Returns the preferred dimensions needed for the list.
* @return the preferred size with the specified number of rows if the
* row size is greater than 0.
*
*/
public Dimension preferredSize() {
return (rows > 0) ? preferredSize(rows) : super.preferredSize();
}
/**
* Returns the minimum dimensions needed for the amount of rows in the
* list.
* @param rows minimum amount of rows in the list
*/
public Dimension minimumSize(int rows) {
ListPeer peer = (ListPeer)this.peer;
return (peer != null) ? peer.minimumSize(rows) : super.minimumSize();
}
/**
* Returns the minimum dimensions needed for the list.
* @return the preferred size with the specified number of rows if
* the row size is greater than zero.
*/
public Dimension minimumSize() {
return (rows > 0) ? minimumSize(rows) : super.minimumSize();
}
/**
* Returns the parameter String of this list.
*/
protected String paramString() {
return super.paramString() + ",selected=" + getSelectedItem();
}
/* Can this field be tabbed to? */
boolean tabbable() {
return true;
}
}