/**
*#########################################################################
*
* A component of the Gatherer application, part of the Greenstone digital
* library suite from the New Zealand Digital Library Project at the
* University of Waikato, New Zealand.
*
*
*
* Author: John Thompson, Greenstone Digital Library, University of Waikato
*
*
*
* Copyright (C) 1999 New Zealand Digital Library Project
*
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*########################################################################
*/
package org.greenstone.gatherer.gui;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;
import org.greenstone.gatherer.Configuration;
import org.greenstone.gatherer.util.Utility;
/**
* @author John Thompson, Greenstone Digital Library, University of Waikato
* @version 2.3
*/
public class GComboBox
extends JComboBox {
private Color background = null;
private Color foreground = null;
private Color editable_background = null;
private Color editable_foreground = null;
private Color selection_background = null;
private Color selection_foreground = null;
private boolean sort_objects = true;
public GComboBox() {
super();
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
init();
setOpaque(!Utility.isMac());
}
public GComboBox(boolean editable) {
super();
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
setOpaque(!Utility.isMac());
setEditable(editable);
init();
}
public GComboBox(ArrayList data) {
super(data.toArray());
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
setOpaque(!Utility.isMac());
init();
}
public GComboBox(ArrayList data, boolean editable) {
super(data.toArray());
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
setOpaque(!Utility.isMac());
setEditable(editable);
init();
}
public GComboBox(ArrayList data, boolean editable, boolean sorted) {
super(data.toArray());
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
setOpaque(!Utility.isMac());
setEditable(editable);
setSorted(sorted);
init();
}
public GComboBox(ComboBoxModel model) {
super(model);
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
setOpaque(!Utility.isMac());
init();
}
public GComboBox(ComboBoxModel model, boolean editable) {
super(model);
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
setOpaque(!Utility.isMac());
setEditable(editable);
init();
}
public GComboBox(Object data[]) {
super(data);
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
setOpaque(!Utility.isMac());
init();
}
public GComboBox(Object data[], boolean editable) {
super(data);
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
setOpaque(!Utility.isMac());
setEditable(editable);
init();
}
public GComboBox(Object data[], boolean editable, boolean sorted) {
super(data);
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
setOpaque(!Utility.isMac());
setEditable(editable);
setSorted(sorted);
init();
}
public GComboBox(Vector data) {
super(data);
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
setOpaque(!Utility.isMac());
init();
}
public GComboBox(Vector data, boolean editable) {
super(data);
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
setOpaque(!Utility.isMac());
setEditable(editable);
init();
}
public void setSorted(boolean sort) {
sort_objects = sort;
}
public int add(Object object) {
if (dataModel instanceof Model) {
return ((Model) dataModel).add(object);
}
else {
return -1;
}
}
public Object get(int index) {
return dataModel.getElementAt(index);
}
public void clear() {
if (dataModel instanceof Model) {
((Model) dataModel).clear();
}
}
public void init() {
Model model = new Model();
ComboBoxModel old_model = (ComboBoxModel) getModel();
setModel(model);
setOpaque(true);
// Restore any data given into our model
for(int i = 0; i < old_model.getSize(); i++) {
model.add(old_model.getElementAt(i));
}
// Change component
UI ui = new UI();
setUI(ui);
ui.setButtonBackground();
// Initialization
this.background = Configuration.getColor("coloring.collection_tree_background", false);
this.foreground = Configuration.getColor("coloring.collection_tree_foreground", false);
this.editable_background = Configuration.getColor("coloring.editable_background", false);
this.editable_foreground = Configuration.getColor("coloring.editable_foreground", false);
this.selection_background = Configuration.getColor("coloring.collection_selection_background", false);
this.selection_foreground = Configuration.getColor("coloring.collection_selection_foreground", false);
if (isEditable()) {
this.setBackground(editable_background);
this.setForeground(editable_foreground);
}
else {
this.setBackground(background);
this.setForeground(foreground);
}
setBorder(BorderFactory.createLoweredBevelBorder());
setRenderer(new Renderer());
}
/** Overridden to do nothing.
* @param background
*/
public void setBackground(Color background) {
}
public void setBackgroundEditableColor(Color editable_background) {
this.editable_background = editable_background;
}
public void setBackgroundNonSelectionColor(Color background) {
this.background = background;
}
public void setBackgroundSelectionColor(Color selection_background) {
this.selection_background = selection_background;
}
public void setEditable(boolean editable) {
setEditor(new Editor());
super.setEditable(editable);
if (isEditable()) {
this.setBackground(editable_background);
this.setForeground(editable_foreground);
}
else {
this.setBackground(background);
this.setForeground(foreground);
}
}
public void setTextEditableColor(Color editable_foreground) {
this.editable_foreground = editable_foreground;
}
public void setTextNonSelectionColor(Color foreground) {
this.foreground = foreground;
}
public void setTextSelectionColor(Color selection_foreground) {
this.selection_foreground = selection_foreground;
}
private class Editor
extends JTextField
implements ComboBoxEditor {
public Editor() {
setOpaque(true);
if (isEditable()) {
setBackground(editable_background);
setForeground(editable_foreground);
}
else {
setBackground(background);
setForeground(foreground);
}
setSelectionColor(selection_background);
setSelectedTextColor(selection_foreground);
}
public Component getEditorComponent() {
return this;
}
public Object getItem() {
return getText();
}
public void setItem(Object item) {
if(item != null) {
setText(item.toString());
}
else {
setText("");
}
}
}
private class Model
extends DefaultComboBoxModel {
public int add(Object extension) {
int position = 0;
String extension_str = extension.toString().toLowerCase();
while(extension != null && position < getSize()) {
String sibling = getElementAt(position).toString().toLowerCase();
int order = extension_str.compareTo(sibling);
// If we are now less than the sibling, insert here.
if(sort_objects && order < 0) {
insertElementAt(extension, position);
extension = null;
}
// We are equal to the sibling, thus we already exist in list. Done.
else if(order == 0) {
extension = null;
}
// Continue searching.
else {
position++;
}
}
if(extension != null) {
position = getSize();
addElement(extension);
}
return position;
}
public void clear() {
removeAllElements();
}
}
private class Renderer
extends JLabel
implements ListCellRenderer {
public Renderer() {
super("");
this.setOpaque(true);
this.setComponentOrientation(org.greenstone.gatherer.Dictionary.getOrientation());
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if(value != null) {
this.setText(value.toString());
}
else {
this.setText("");
}
if(isSelected) {
this.setBackground(selection_background);
this.setForeground(selection_foreground);
}
else if (isEditable()) {
this.setBackground(editable_background);
this.setForeground(editable_foreground);
}
else {
this.setBackground(background);
this.setForeground(foreground);
}
return this;
}
}
private class UI
extends BasicComboBoxUI {
public UI() {
super();
}
protected ComboPopup createPopup() {
BasicComboPopup popup = new BasicComboPopup(comboBox);
// ---- I don't know why this code is here... maybe it is needed for the Mac? ----
// {
// public void show() {
// if(comboBox.getMaximumRowCount() > 0) {
// Dimension popupSize = new Dimension( comboBox.getWidth(), getPopupHeightForRowCount( comboBox.getMaximumRowCount()));
// Rectangle popupBounds = new Rectangle( 0, 0, popupSize.width, popupSize.height);
// scroller.setMaximumSize( popupBounds.getSize() );
// scroller.setPreferredSize( popupBounds.getSize() );
// scroller.setMinimumSize( popupBounds.getSize() );
// list.invalidate();
// int selectedIndex = comboBox.getSelectedIndex();
// if ( selectedIndex == -1 ) {
// list.clearSelection();
// }
// else {
// list.setSelectedIndex( selectedIndex );
// }
// list.ensureIndexIsVisible( list.getSelectedIndex() );
// setLightWeightPopupEnabled( comboBox.isLightWeightPopupEnabled() );
// show(arrowButton, arrowButton.getSize().width - (popupSize.width + 4), arrowButton.getSize().height);
// }
// }
// };
popup.getAccessibleContext().setAccessibleParent(comboBox);
return popup;
}
public void setButtonBackground() {
arrowButton.setBackground(Configuration.getColor("coloring.button_background", false));
}
}
}