/* * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander 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 3 of the License, or * (at your option) any later version. * * muCommander 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, see <http://www.gnu.org/licenses/>. */ package com.mucommander.ui.helper; import javax.swing.*; import java.util.List; import java.util.Vector; /** * MnemonicHelper provides a way to easily set mnemonics to UI components, without having to bother * with remembering which ones have already been assigned to another component. * * <p>To use it: simply create a new instance and keep calling {@link #getMnemonic(String)} * to get mnemonics from the giving pieces of text.</p> * * @author Maxence Bernard */ public class MnemonicHelper { /** Current list of previously assigned mnemonics */ private List<Character> takenMnemonics; /** * Creates a new blank MnemonicHelper. */ public MnemonicHelper() { takenMnemonics = new Vector<Character>(); } /** * Finds and returns first character in the given string that's not already as a mnemonic. * * <p>Returned mnemonic will be added to current internal list of taken mnemonics * and won't ever be used again by this instance.</p> * * @return the character to be used as a mnemonic, always in lower case, 0 if no * mnemonic was available for this piece of text. 0 is returned if a <code>null</code> string is passed. * @param text text to get a mnemonic from. */ public char getMnemonic(String text) { // Returns 0 in case of null string if(text==null || text.length()==0) return 0; // Find first letter available for mnemonic (keyboard shortcut) int mnemonicPos = 0; char mnemonic; text = text.toLowerCase(); int textLength = text.length(); do { mnemonic = text.charAt(mnemonicPos++); if(!isMnemonicUsed(mnemonic)) { takenMnemonics.add(mnemonic); return mnemonic; } } while(mnemonicPos<textLength); return 0; } /** * Convenience method that returns a mnemonic for the specified button. * Yields to the same result as if {@link #getMnemonic(String)} were called with JButton.getText(). * * @param button the button to get a mnemonic for * @return the character to be used as a mnemonic, always in lower case, 0 if no * mnemonic was available for this piece of text. 0 is returned if a <code>null</code> string is passed. */ public char getMnemonic(JButton button) { return getMnemonic(button.getText()); } /** * Returns <code>true</code> if the specified character has already been previously * used as a mnemonic, returned by {@link #getMnemonic(String)}. * * @param ch the character which will be tested for an existing mnemonic. * @return whether or not the character is already used in the mnemonics array. */ public boolean isMnemonicUsed(char ch) { return takenMnemonics.indexOf(new Character(ch))!=-1; } /** * Clears any previously registered mnemonics by {@link #getMnemonic(String)}. */ public void clear() { takenMnemonics.clear(); } }