/*
* 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;
}
}