/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2010 Sun Microsystems, Inc. */ package org.opends.guitools.controlpanel.event; import java.awt.Component; import java.awt.Container; import java.awt.event.KeyEvent; import javax.swing.ComboBoxModel; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JComboBox.KeySelectionManager; import javax.swing.text.JTextComponent; /** * A class used to allow the user to type a sequence of characters that will * select automatically an item in the combo box. * Note that there must be one instance of this class per combo box. Two * combo boxes must not share the same ComboKeySelectionManager object and * two ComboKeySelectionManager must not be used by the same combo box. */ public class ComboKeySelectionManager implements KeySelectionManager { private JComboBox combo; private JList list; // The String that we are searching. private String lastSearchedString; private long lastSearchedTime; // The number of milliseconds we wait between types before considering that // the search starts again. private long RESET_BETWEEN_TYPES = 700; /** * Default constructor. * @param combo the combo box that is attached to this selection key manager. */ public ComboKeySelectionManager(JComboBox combo) { this.combo = combo; list = new JList(); } /** * {@inheritDoc} */ public int selectionForKey(char key, ComboBoxModel model) { int selectedIndex = -1; long currentTime = System.currentTimeMillis(); if (key == KeyEvent.VK_BACK_SPACE) { if (lastSearchedString == null) { lastSearchedString = ""; } else if (lastSearchedString.length() > 0) { lastSearchedString = lastSearchedString.substring(0, lastSearchedString.length() -1); } else { // Nothing to do. } } else { if (lastSearchedTime + RESET_BETWEEN_TYPES < currentTime) { // Reset the search. lastSearchedString = String.valueOf(key); } else { if (lastSearchedString == null) { lastSearchedString = String.valueOf(key); } else { lastSearchedString += key; } } } lastSearchedTime = currentTime; if (lastSearchedString.length() > 0) { for (int i = 0; i < model.getSize() && selectedIndex == -1; i++) { Object value = model.getElementAt(i); Component comp = combo.getRenderer().getListCellRendererComponent(list, value, i, true, true); String sValue; if (comp instanceof Container) { sValue = getDisplayedStringValue((Container)comp); if (sValue == null) { sValue = ""; } else { sValue = sValue.trim(); } } else { sValue = String.valueOf(value); } if (sValue.toLowerCase().startsWith(lastSearchedString.toLowerCase())) { selectedIndex = i; } } } return selectedIndex; } private String getDisplayedStringValue(Container c) { String sValue = null; if (c instanceof JLabel) { sValue = ((JLabel)c).getText(); } else if (c instanceof JTextComponent) { sValue = ((JTextComponent)c).getText(); } else { int nCount = c.getComponentCount(); for (int i=0 ; i<nCount && sValue == null; i++) { Component child = c.getComponent(i); if (child instanceof Container) { sValue = getDisplayedStringValue((Container)child); } } } return sValue; } }