<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">/*
 * WepsComboBox.java
 *
 * Created on June 9, 2006, 3:15 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package usda.weru.util;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.util.Vector;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;
import javax.swing.plaf.basic.BasicComboPopup;

/**
 * Extends JComboBox so that the dropdown list can be wider than the actually component.
 * @author Seemant Shrivastava 
 * @author Joseph Levin
 * Based on the code from http://forum.java.sun.com/thread.jspa?forumID=57&amp;messageID=2501520&amp;threadID=522572
 * @param &lt;E&gt;
 *
 */
public class WepsComboBox&lt;E&gt; extends JComboBox&lt;E&gt; {
    private static final long serialVersionUID = 1L;

	/**
	 *
	 */
	public WepsComboBox(){
        super();
        setRenderer(new InternalRenderer());
    }

	/**
	 *
	 * @param vector
	 */
	public WepsComboBox(Vector&lt;E&gt; vector){
        super(vector);
        setRenderer(new InternalRenderer());
    }

	/**
	 *
	 */
	@Override
    public void updateUI(){
        super.updateUI();
        resizeComboPopup();
    } 
    
    private void resizeComboPopup(){ 
        FontMetrics fm = getFontMetrics(getFont()); 
        BasicComboPopup popup = (BasicComboPopup)getUI().getAccessibleChild(this,0);        //Popup 
        if(popup==null) return; 
        int size = (int)getSize().getWidth(); 
        for(int i=0; i&lt;getItemCount(); i++){ 
            String str= getItemAt(i).toString() + "   ";
            if (str != null){
                if(size &lt; fm.stringWidth(str)) size = fm.stringWidth(str); 
            }
        } 
        if (getWidth() &gt; size) size = getWidth();
        Component comp = popup.getComponent(0);//JScrollPane 
        JScrollPane scrollpane=null; 
        int offset=0; 
        if(comp instanceof JScrollPane) { 
            scrollpane = (JScrollPane)comp; 
            if(scrollpane.getVerticalScrollBar().isVisible()) offset += scrollpane.getVerticalScrollBar().getWidth(); 
        } 
        popup.setPreferredSize(new Dimension(size+offset,popup.getPreferredSize().height)); 
        popup.setLayout(new BorderLayout()); popup.add(comp,BorderLayout.CENTER); 
    }

	/**
	 *
	 * @return
	 */
	@Override
    public Dimension getPreferredSize() {
        return super.getPreferredSize();
    }

	/**
	 *
	 */
	@Override
    public void firePopupMenuWillBecomeVisible() {
        resizeComboPopup();
        super.firePopupMenuWillBecomeVisible();
    }

	/**
	 *
	 * @param text
	 */
	public void setText(String text){        
        if (!isEditable()){
            setEditable(true);
            setSelectedItem(text);
            setEditable(false);        
        }
        else{
            setSelectedItem(text);
        }                   
    }
    
    private class InternalRenderer extends DefaultListCellRenderer{
        private static final long serialVersionUID = 1L;

        @Override
        public Dimension getPreferredSize() {
            Dimension size = super.getPreferredSize();
            size.width = 10;
            return size;
        }
        
    }

}
</pre></body></html>