/* * @(#)ComboBox.java 1.3 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media.ui; import java.awt.*; import java.awt.event.*; public class ComboBox extends Panel implements ItemListener { /************************************************************************* * Variables *************************************************************************/ TextField edit; Button bPullDown; PullDownList listWindow = null; List list = null; boolean mouseIn = false; /************************************************************************* * ComboBox Methods *************************************************************************/ public ComboBox() { this(3); } public ComboBox(int cols) { setLayout( new BorderLayout() ); edit = new TextField(cols); bPullDown = new Button("..."); add("Center", edit); add("East", bPullDown); list = new List(6); list.setBackground(Color.white); list.addItemListener( this ); bPullDown.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { pullDown(); } } ); bPullDown.addMouseListener( new MouseAdapter() { public void mouseEntered(MouseEvent me) { if (listWindow == null) firstTime(); mouseIn = true; } public void mouseExited(MouseEvent me) { mouseIn = false; } } ); } public void firstTime() { Component frame = this; while (!(frame instanceof Frame) && frame != null) { frame = frame.getParent(); } if (frame == null) { System.out.println("No frame found in hierarchy"); System.exit(0); } listWindow = new PullDownList( (Frame) frame, list); listWindow.validate(); } public void itemStateChanged(ItemEvent ie) { if (ie.getStateChange() == ItemEvent.SELECTED) { String s = list.getSelectedItem(); edit.setText(s); edit.selectAll(); pullDown(); } } public void pullDown() { if (listWindow.isVisible() == false) { listWindow.show(this); } else listWindow.setVisible(false); } public void addActionListener(ActionListener al) { edit.addActionListener(al); } public void removeActionListener(ActionListener al) { edit.removeActionListener(al); } public void addItemListener(ItemListener il) { list.addItemListener(il); } public void removeItemListener(ItemListener il) { list.removeItemListener(il); } /************************************************************************* * Text Related Methods *************************************************************************/ public String getText() { return edit.getText(); } public void setEditable(boolean f) { edit.setEditable(f); } /************************************************************************* * List Related Methods *************************************************************************/ public void add(String item) { list.add(item); } public void add(String item, int index) { list.add(item, index); } public void addItem(String item) { list.addItem(item); } public void addItem(String item, int index) { list.addItem(item, index); } public void delItem(int index) { list.delItem(index); } public String getSelectedItem() { return list.getSelectedItem(); } public int getSelectedIndex() { return list.getSelectedIndex(); } public void select(int index) { list.select(index); String s = list.getSelectedItem(); edit.setText(s); edit.selectAll(); } /************************************************************************* * Inner Classes *************************************************************************/ class PullDownList extends Window { List list; int height = 100; int HEIGHT = 100; public PullDownList(Frame f, List list) { super(f); setLayout( null ); setBackground(Color.black); this.list = list; this.add(list); list.addMouseListener( new MouseAdapter() { public void mouseEntered(MouseEvent e) { } } ); } public void show(Component parent) { Point p = parent.getLocationOnScreen(); Dimension psize = parent.getSize(); height = list.getPreferredSize().height; if (height == 0) height = HEIGHT; list.setBounds(1, 1, psize.width-2, HEIGHT); setBounds(p.x, p.y + psize.height, psize.width, HEIGHT + 2); validate(); setVisible(true); } public List getList() { return list; } } }