/* * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.tools.visualvm.modules.startup; import javax.swing.AbstractButton; import javax.swing.UIManager; import org.openide.util.Utilities; /** * * @author Jiri Sedlacek */ final class Utils { /** * Tries to set the system LaF, silently ignores all errors. */ static void setSystemLaF() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Throwable t) {} } /** * Actual setter of the text & mnemonics for the AbstractButton or * their subclasses. We must copy necessary code from org.openide.awt.Mnemonics * because org.openide.awt module is not available yet when this code is called. * @param item AbstractButton * @param text new label */ static void setLocalizedText (AbstractButton button, String text) { if (text == null) { button.setText(null); return; } int i = findMnemonicAmpersand(text); if (i < 0) { // no '&' - don't set the mnemonic button.setText(text); button.setMnemonic(0); } else { button.setText(text.substring(0, i) + text.substring(i + 1)); if (Utilities.isMac()) { // there shall be no mnemonics on macosx. //#55864 return; } char ch = text.charAt(i + 1); // it's latin character or arabic digit, // setting it as mnemonics button.setMnemonic(ch); // If it's something like "Save &As", we need to set another // mnemonic index (at least under 1.4 or later) // see #29676 button.setDisplayedMnemonicIndex(i); } } /** * Searches for an ampersand in a string which indicates a mnemonic. * Recognizes the following cases: * <ul> * <li>"Drag & Drop", "Ampersand ('&')" - don't have mnemonic ampersand. * "&" is not found before " " (space), or if enclosed in "'" * (single quotation marks). * <li>"&File", "Save &As..." - do have mnemonic ampersand. * <li>"Rock & Ro&ll", "Underline the '&' &character" - also do have * mnemonic ampersand, but the second one. * </ul> * @param text text to search * @return the position of mnemonic ampersand in text, or -1 if there is none */ private static int findMnemonicAmpersand(String text) { int i = -1; do { // searching for the next ampersand i = text.indexOf('&', i + 1); // NOI18N if ((i >= 0) && ((i + 1) < text.length())) { // before ' ' if (text.charAt(i + 1) == ' ') { // NOI18N continue; // before ', and after ' } else if ((text.charAt(i + 1) == '\'') && (i > 0) && (text.charAt(i - 1) == '\'')) { // NOI18N continue; } // ampersand is marking mnemonics return i; } } while (i >= 0); return -1; } }