/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.navigator.ui.widget;
/*******************************************************************************
Copyright (c) : EIG (Environmental Informatics Group)
http://www.htw-saarland.de/eig
Prof. Dr. Reiner Guettler
Prof. Dr. Ralf Denzer
HTWdS
Hochschule fuer Technik und Wirtschaft des Saarlandes
Goebenstr. 40
66117 Saarbruecken
Germany
Programmers : Pascal
Project : WuNDA 2
Filename :
Version : 1.0
Purpose :
Created : 01.10.1999
History :
*******************************************************************************/
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
/**
* Eine in eine JScrollPane eingebettete JListbox in der nur ein Element angezeigt wird.<br>
* Duch das Klicken auf die < und > Buttons der ScrollPane wird der Wert der Listbox dekrementiert bzw. inkrementiert.
*
* @version $Revision$, $Date$
* @deprecated use javax.swing.JSpinner instead.
*/
public class SingleLineListBox extends JScrollPane implements ChangeListener {
//~ Instance fields --------------------------------------------------------
protected int lastScrollBarPosition = 0;
protected int selectedIndex = 0;
protected int visibleIndex = 0;
protected JList listBox;
protected JScrollBar thisScrollBar;
protected BoundedRangeModel sourceScroll;
protected boolean initVisibleCalled = false;
protected boolean synchronisation = false;
protected boolean enabled = true;
//~ Constructors -----------------------------------------------------------
/**
* Konstruiert eine neue SingleLineListBox die mit einem Integer-Array gefuellt wird. Das erste sichtbare Element
* hat den Index 0.
*
* @param value Das Interger-Array mit dem die ListBox gefuellt wird.
*/
public SingleLineListBox(final Integer[] value) {
listBox = new JList(value);
listBox.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
listBox.setVisibleRowCount(1);
this.setViewportView(listBox);
// listBox.setFixedCellHeight(23);
listBox.setSelectedIndex(listBox.getFirstVisibleIndex());
// listBox.addListSelectionListener(this);
initSingleLineListBox();
}
/**
* Konstruiert eine neue SingleLineListBox die mit einem Integer-Array gefuellt wird. Der Index des ersten
* sichtbaren Elements kann angegeben werden.
*
* @param value Das Interger-Array mit dem die ListBox gefuellt wird.
* @param visibleIndex Der erste sichtbare Wert.
*/
public SingleLineListBox(final Integer[] value, final int visibleIndex) {
listBox = new JList(value);
listBox.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
listBox.setVisibleRowCount(1);
this.visibleIndex = visibleIndex;
this.setViewportView(listBox);
initSingleLineListBox();
}
/**
* Creates a new SingleLineListBox object.
*
* @param firstValue DOCUMENT ME!
* @param lastValue DOCUMENT ME!
* @param increment DOCUMENT ME!
*/
public SingleLineListBox(final int firstValue, int lastValue, final int increment) {
final Integer[] value = new Integer[((lastValue - firstValue) / increment) + 1];
for (int i = 0; i < value.length; i++) {
value[i] = new Integer(lastValue);
lastValue -= increment;
}
listBox = new JList(value);
listBox.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
listBox.setVisibleRowCount(1);
this.setViewportView(listBox);
listBox.setSelectedIndex(listBox.getFirstVisibleIndex());
initSingleLineListBox();
}
/**
* Creates a new SingleLineListBox object.
*
* @param firstValue DOCUMENT ME!
* @param lastValue DOCUMENT ME!
* @param increment DOCUMENT ME!
* @param visibleIndex DOCUMENT ME!
*/
public SingleLineListBox(final int firstValue, int lastValue, final int increment, final int visibleIndex) {
final Integer[] value = new Integer[((lastValue - firstValue) / increment) + 1];
for (int i = 0; i < value.length; i++) {
value[i] = new Integer(lastValue);
lastValue -= increment;
}
listBox = new JList(value);
listBox.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
listBox.setVisibleRowCount(1);
this.visibleIndex = visibleIndex;
this.setViewportView(listBox);
initSingleLineListBox();
}
//~ Methods ----------------------------------------------------------------
/**
* Initialisierungsmethode<br>
* Wird nur von den Konstruktoren aufgerufen.
*/
protected void initSingleLineListBox() {
listBox.setSelectionBackground(listBox.getBackground());
listBox.setSelectionForeground(listBox.getForeground());
selectedIndex = listBox.getSelectedIndex();
thisScrollBar = this.getVerticalScrollBar();
lastScrollBarPosition = thisScrollBar.getModel().getValue();
}
/**
* Initialisierungsmethode<br>
* Wird nur einmal aufgerufen, nachdem die Komponente sichtbar gemacht wurde.
*/
protected synchronized void initVisible() {
if ((!initVisibleCalled) && (this.getParent() != null)) {
this.initVisibleCalled = true;
this.setVisibleIndex(visibleIndex);
setEnabled(enabled);
sourceScroll = thisScrollBar.getModel();
sourceScroll.addChangeListener(this);
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public JList getListBox() {
return listBox;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public int getSelectedIndex() {
return listBox.getSelectedIndex();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public java.lang.Object getSelectedValue() {
return listBox.getSelectedValue();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public int getSelectedIntValue() {
return ((Integer)listBox.getSelectedValue()).intValue();
}
/**
* Setzt das sichtbare Element der ListBox und waehlt es aus.
*
* @param visibleIndex DOCUMENT ME!
*
* @visibleIndex Der Index des sichtbaren Elements.
*/
public synchronized void setVisibleIndex(final int visibleIndex) {
synchronisation = true;
// damit es keine java.lang.ArrayIndexOutOfBoundsException gibt
if ((visibleIndex <= (listBox.getModel().getSize() - 1)) && (visibleIndex >= 0)) {
this.selectedIndex = visibleIndex;
listBox.setSelectedIndex(selectedIndex);
this.validate();
listBox.ensureIndexIsVisible(selectedIndex);
lastScrollBarPosition = thisScrollBar.getModel().getValue();
// NavigatorLogger.printMessage("lastScrollBarPosition: " + lastScrollBarPosition);
if (listBox.getSelectedIndex() != listBox.getFirstVisibleIndex()) {
// NavigatorLogger.printMessage("setVisibleIndex(): " + listBox.getSelectedIndex() + " != " +
// listBox.getFirstVisibleIndex()); selectedIndex = listBox.getFirstVisibleIndex();
listBox.ensureIndexIsVisible(selectedIndex);
listBox.setSelectedIndex(selectedIndex);
}
} else {
listBox.setSelectedIndex(listBox.getFirstVisibleIndex());
}
// this.validate();
// NavigatorLogger.printMessage("synchronisation: " + synchronisation);
// NavigatorLogger.printMessage("initVisibleCalled: " + initVisibleCalled);
// NavigatorLogger.printMessage("============================================");
// NavigatorLogger.printMessage("visibleIndex: " + visibleIndex);
// NavigatorLogger.printMessage("SelectedIndex: " + listBox.getSelectedIndex());
// NavigatorLogger.printMessage("SelectedValue: " + listBox.getSelectedValue());
// NavigatorLogger.printMessage("============================================");
synchronisation = false;
}
/**
* DOCUMENT ME!
*
* @param value DOCUMENT ME!
*/
public void setSelectedValue(final int value) {
synchronisation = true;
listBox.setSelectedValue(new Integer(value), true);
selectedIndex = listBox.getFirstVisibleIndex();
lastScrollBarPosition = thisScrollBar.getModel().getValue();
// NavigatorLogger.printMessage("setSelectedValue: " + value);
// NavigatorLogger.printMessage("setSelectedValue selectedIndex: " + selectedIndex);
// NavigatorLogger.printMessage("setSelectedValue lastScrollBarPosition: " + lastScrollBarPosition);
synchronisation = false;
}
@Override
public synchronized void setEnabled(final boolean enabled) {
this.enabled = enabled;
if (isVisible() && initVisibleCalled) {
super.setEnabled(enabled);
listBox.setEnabled(enabled);
thisScrollBar.setEnabled(enabled);
}
}
/**
* DOCUMENT ME!
*
* @param li DOCUMENT ME!
*/
public void addListSelectionListener(final ListSelectionListener li) {
listBox.addListSelectionListener(li);
}
/**
* Musste ueberschrieben werden, da die Hoehe der SingleLineListBox immer gleich bleiben muss!
*
* @return DOCUMENT ME!
*/
@Override
public Dimension getMaximumSize() {
return new Dimension((int)super.getMaximumSize().getWidth(), (int)getPreferredSize().getHeight());
}
@Override
public void paintComponents(final Graphics g) {
super.paintComponents(g);
initVisible();
}
@Override
public void paintAll(final Graphics g) {
super.paintAll(g);
initVisible();
}
@Override
public void repaint() {
super.repaint();
initVisible();
}
@Override
public void repaint(final long l) {
super.repaint(l);
initVisible();
}
@Override
public void repaint(final int i1, final int i2, final int i3, final int i4) {
super.repaint(i1, i2, i3, i4);
initVisible();
}
@Override
public void repaint(final long l, final int i1, final int i2, final int i3, final int i4) {
super.repaint(l, i1, i2, i3, i4);
initVisible();
}
@Override
public void update(final Graphics g) {
super.update(g);
initVisible();
}
// CHANGE LISTENER =====================================================/**/
@Override
public synchronized void stateChanged(final ChangeEvent ce) {
// Wenn ein Element mit setVisibleIndex(int visibleIndex) ausgewaehlt wird
// darf der ChangeListener nicht gleichzeitig den aktuellen Index veraendern
// Deshalb ist manuelle Synchronisation notwendig.
if (!synchronisation && initVisibleCalled) {
synchronisation = true;
final BoundedRangeModel sourceScroll = (BoundedRangeModel)ce.getSource();
int scrollBarPosition = sourceScroll.getValue();
// NavigatorLogger.printMessage("stateChanged: lastScrollBarPosition: " + lastScrollBarPosition);
// NavigatorLogger.printMessage("stateChanged: scrollBarPosition: " + scrollBarPosition);
if ((lastScrollBarPosition - scrollBarPosition) < 0) {
selectedIndex++;
} else if ((lastScrollBarPosition - scrollBarPosition) > 0) {
selectedIndex--;
}
// Falls irgendetwas schiefgeht, werden die beiden Indizes synchronisiert
// Duerfte theoretisch nicht passieren ;o)
if (listBox.getSelectedIndex() != listBox.getFirstVisibleIndex()) {
// NavigatorLogger.printMessage("stateChanged Fehler: FirstVisibleIndex: " +
// listBox.getFirstVisibleIndex()); NavigatorLogger.printMessage("stateChanged Fehler: SelectedIndex: "
// + listBox.getSelectedIndex()); NavigatorLogger.printMessage("stateChanged Fehler: SelectedValue: " +
// listBox.getSelectedValue());
// NavigatorLogger.printMessage("==================================================================");
selectedIndex = listBox.getFirstVisibleIndex();
listBox.setSelectedIndex(selectedIndex);
listBox.ensureIndexIsVisible(selectedIndex);
scrollBarPosition = sourceScroll.getValue();
// NavigatorLogger.printMessage("stateChanged Fehler: FirstVisibleIndex: " +
// listBox.getFirstVisibleIndex()); NavigatorLogger.printMessage("stateChanged Fehler: SelectedIndex: "
// + listBox.getSelectedIndex()); NavigatorLogger.printMessage("stateChanged Fehler: SelectedValue: " +
// listBox.getSelectedValue());
} else {
listBox.setSelectedIndex(selectedIndex);
listBox.ensureIndexIsVisible(selectedIndex);
// NavigatorLogger.printMessage("stateChanged: FirstVisibleIndex: " + listBox.getFirstVisibleIndex());
// NavigatorLogger.printMessage("stateChanged: SelectedIndex: " + listBox.getSelectedIndex());
// NavigatorLogger.printMessage("stateChanged: SelectedValue: " + listBox.getSelectedValue());
}
lastScrollBarPosition = scrollBarPosition;
synchronisation = false;
}
}
}