/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package org.apache.jmeter.gui.action;

import java.awt.event.ActionEvent;
import java.util.HashSet;
import java.util.Set;

import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import org.apache.jmeter.gui.GuiPackage;
import org.apache.jmeter.util.JMeterUtils;

/**
 * Implements the Look and Feel menu item.
 */
public class LookAndFeelCommand implements Command {

    private static final Set commands = new HashSet();

    static {
        UIManager.LookAndFeelInfo[] lfs = UIManager.getInstalledLookAndFeels();
        for (int i = 0; i < lfs.length; i++) {
            commands.add(ActionNames.LAF_PREFIX + lfs[i].getClassName());
        }

        try {
            String defaultUI = JMeterUtils.getPropDefault("jmeter.laf", UIManager
                    .getCrossPlatformLookAndFeelClassName());
            UIManager.setLookAndFeel(defaultUI);
        } catch (IllegalAccessException e) {
        } catch (ClassNotFoundException e) {
        } catch (InstantiationException e) {
        } catch (UnsupportedLookAndFeelException e) {
        }
    }

    public LookAndFeelCommand() {
    }

    public void doAction(ActionEvent ev) {
        try {
            String className = ev.getActionCommand().substring(4).replace('/', '.');
            UIManager.setLookAndFeel(className);
            SwingUtilities.updateComponentTreeUI(GuiPackage.getInstance().getMainFrame());
        } catch (javax.swing.UnsupportedLookAndFeelException e) {
            JMeterUtils.reportErrorToUser("Look and Feel unavailable:" + e.toString());
        } catch (InstantiationException e) {
            JMeterUtils.reportErrorToUser("Look and Feel unavailable:" + e.toString());
        } catch (ClassNotFoundException e) {
            JMeterUtils.reportErrorToUser("Look and Feel unavailable:" + e.toString());
        } catch (IllegalAccessException e) {
            JMeterUtils.reportErrorToUser("Look and Feel unavailable:" + e.toString());
        }
    }

    public Set getActionNames() {
        return commands;
    }
}

@@ -897,16 +897,41 @@
 ashSet;%0A
+import java.util.Locale;%0A
 import j
@@ -1253,16 +1253,95 @@
 mand %7B%0A%0A
+    private static final String JMETER_LAF = %22jmeter.laf%22; // $NON-NLS-1$%0A    %0A
     priv
@@ -1643,98 +1643,520 @@
     
-String defaultUI = JMeterUtils.getPropDefault(%22jmeter.laf%22, UIManager%0A                    
+UIManager.setLookAndFeel(getJMeterLaf());%0A        %7D catch (IllegalAccessException e) %7B%0A        %7D catch (ClassNotFoundException e) %7B%0A        %7D catch (InstantiationException e) %7B%0A        %7D catch (UnsupportedLookAndFeelException e) %7B%0A        %7D%0A    %7D%0A%0A    /**%0A     * Get LookAndFeel classname from the following properties:%0A     * %3Cul%3E%0A     * %3Cli%3Ejmeter.laf.&lt;os.name%3E - lowercased; spaces replaced by '_'%3C/li%3E%0A     * %3Cli%3Ejmeter.laf.&lt;os.family%3E - lowercased.%3C/li%3E%0A     * %3Cli%3Ejmeter.laf%3C/li%3E%0A     * %3Cli%3EUIManager
 .get
@@ -2194,258 +2194,856 @@
 me()
-);
+%3C/li%3E
 %0A     
-       UIManager.setLookAndFeel(defaultUI);%0A        %7D catch (IllegalAccessException e) %7B%0A        %7D catch (ClassNotFoundException e) %7B%0A        %7D catch (InstantiationException e) %7B%0A        %7D catch (UnsupportedLookAndFeelException e) %7B%0A        %7D
+* %3C/ul%3E%0A     * @return LAF classname%0A     */%0A    private static String getJMeterLaf()%7B%0A        String osName = System.getProperty(%22os.name%22) // $NON-NLS-1$%0A                        .toLowerCase(Locale.ENGLISH);%0A        String laf;%0A        // Spaces are not allowed in property names read from files%0A        laf = JMeterUtils.getProperty(JMETER_LAF+%22.%22+osName.replace(' ', '_'));%0A        if (laf != null) %7B%0A            return laf;%0A        %7D%0A        String osFamily = osName.substring(0, osName.indexOf(' '));// e.g. windows xp =%3E windows%0A        laf = JMeterUtils.getProperty(JMETER_LAF+%22.%22+osFamily);%0A        if (laf != null) %7B%0A            return laf;%0A        %7D%0A        laf = JMeterUtils.getProperty(JMETER_LAF);%0A        if (laf != null) %7B%0A            return laf;%0A        %7D%0A        return UIManager.getCrossPlatformLookAndFeelClassName();
 %0A   

Allow LAF override based on OS name