f@0: /* f@0: CCmI Editor - A Collaborative Cross-Modal Diagram Editing Tool f@0: f@0: Copyright (C) 2011 Queen Mary University of London (http://ccmi.eecs.qmul.ac.uk/) f@0: f@0: This program is free software: you can redistribute it and/or modify f@0: it under the terms of the GNU General Public License as published by f@0: the Free Software Foundation, either version 3 of the License, or f@0: (at your option) any later version. f@0: f@0: This program is distributed in the hope that it will be useful, f@0: but WITHOUT ANY WARRANTY; without even the implied warranty of f@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the f@0: GNU General Public License for more details. f@0: f@0: You should have received a copy of the GNU General Public License f@0: along with this program. If not, see . f@0: */ f@0: package uk.ac.qmul.eecs.ccmi.gui; f@0: f@0: import java.awt.event.ItemEvent; f@0: import java.awt.event.KeyEvent; f@0: import java.util.Vector; f@0: f@0: import javax.swing.ComboBoxModel; f@0: import javax.swing.JComboBox; f@0: f@0: /** f@0: * A ComboBox component which overrides the default behaviour when selecting items by the keyboard f@0: * up and down arrow keys. When the top is reached, if the user presses the up arrow key f@0: * instead of blocking on the first item, the LoopComboBox loops forward to the last item. Likewise, f@0: * when the bottom is reached and the user presses the down arrow key the LoopComboBox f@0: * loops back to the first item. f@0: * f@0: */ f@0: @SuppressWarnings("serial") f@0: public class LoopComboBox extends JComboBox { f@0: public LoopComboBox(){ f@0: super(); f@0: } f@0: f@0: public LoopComboBox(Object[] items){ f@0: super(items); f@0: } f@0: f@0: public LoopComboBox(ComboBoxModel aModel){ f@0: super(aModel); f@0: } f@0: f@0: public LoopComboBox(Vector items){ f@0: super(items); f@0: } f@0: f@0: @Override f@0: public void processKeyEvent(KeyEvent e) { f@0: if(dataModel.getSize() == 0){ f@0: super.processKeyEvent(e); f@0: }else{ f@0: if(e.getKeyCode() == KeyEvent.VK_DOWN f@0: && e.getID()==KeyEvent.KEY_PRESSED f@0: && getSelectedIndex() == getItemCount()-1){ f@0: setSelectedIndex(0); f@0: if(getItemCount() == 1) f@0: fireOneItemStateChanged(); f@0: }else if(e.getKeyCode() == KeyEvent.VK_UP f@0: && e.getID()==KeyEvent.KEY_PRESSED f@0: && getSelectedIndex() == 0){ f@0: setSelectedIndex(getItemCount()-1); f@0: if(getItemCount() == 1) f@0: fireOneItemStateChanged(); f@0: }else f@0: super.processKeyEvent(e); f@0: } f@0: } f@0: f@0: /* f@0: * when the comboBox has only one item the ItemStateChanged listeners ain't fired by default. f@0: * This behaviour has to be forced in order to have the item label to be spoken out by f@0: * the narrator, in spite of the item number . f@0: */ f@0: private void fireOneItemStateChanged(){ f@0: fireItemStateChanged(new ItemEvent( f@0: this, f@0: ItemEvent.ITEM_STATE_CHANGED, f@0: getSelectedItem(), f@0: ItemEvent.SELECTED f@0: )); f@0: } f@0: }