001    /*
002     * Copyright 2002-2004 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.richclient.application.config;
017    
018    import org.springframework.richclient.application.ApplicationException;
019    import org.springframework.util.Assert;
020    import org.springframework.util.StringUtils;
021    
022    import javax.swing.*;
023    import javax.swing.UIManager.LookAndFeelInfo;
024    import java.util.Iterator;
025    import java.util.Map;
026    import java.util.Properties;
027    
028    /**
029     * Configuerer for specifying global UIManager defaults.
030     * 
031     * @author Keith Donald
032     */
033    public class UIManagerConfigurer {
034    
035        private static final String CROSS_PLATFORM_LOOK_AND_FEEL_NAME = "crossPlatform";
036    
037        private static final String SYSTEM_LOOK_AND_FEEL_NAME = "system";
038    
039        public UIManagerConfigurer() {
040            this(true);
041        }
042    
043        public UIManagerConfigurer(boolean installPrePackagedDefaults) {
044            if (installPrePackagedDefaults) {
045                installPrePackagedUIManagerDefaults();
046            }
047            try {
048                doInstallCustomDefaults();
049            }
050            catch (Exception e) {
051                throw new ApplicationException("Unable to install subclass custom defaults", e);
052            }
053        }
054    
055        /**
056         * Template method subclasses may override to install custom look and feels
057         * or UIManager defaults.
058         * 
059         * @throws Exception
060         */
061        protected void doInstallCustomDefaults() throws Exception {
062    
063        }
064    
065        /**
066         * Initializes the UIManager defaults to values based on recommended,
067         * best-practices user interface design. This should generally be called
068         * once by an initializing application class.
069         */
070        private void installPrePackagedUIManagerDefaults() {
071            try {
072                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
073                UIManager.put("Tree.line", "Angled");
074                UIManager.put("Tree.leafIcon", null);
075                UIManager.put("Tree.closedIcon", null);
076                UIManager.put("Tree.openIcon", null);
077                UIManager.put("Tree.rightChildIndent", new Integer(10));
078            }
079            catch (Exception e) {
080                throw new ApplicationException("Unable to set defaults", e);
081            }
082        }
083    
084        public void setProperties(Properties properties) {
085            Iterator i = properties.entrySet().iterator();
086            while (i.hasNext()) {
087                Map.Entry entry = (Map.Entry)i.next();
088                UIManager.put(entry.getKey(), entry.getValue());
089            }
090        }
091    
092        public void setInstallCustomLookAndFeels(String[] customLookAndFeels) {
093            for (int i = 0; i < customLookAndFeels.length; i++) {
094                String[] feels = StringUtils.commaDelimitedListToStringArray(customLookAndFeels[i]);
095                Assert.isTrue(feels.length > 0, "LookAndFeelInfo definition should be in form: [name],<classname>");
096                String name = null;
097                String className;
098                if (feels.length == 1) {
099                    className = feels[0];
100                }
101                else if (feels.length > 1) {
102                    name = feels[0];
103                    className = feels[1];
104                }
105                else {
106                    throw new RuntimeException("Should not happen");
107                }
108                UIManager.installLookAndFeel(name, className);
109            }
110        }
111    
112        public void setLookAndFeel(Class lookAndFeel) {
113            setLookAndFeel(lookAndFeel.getName());
114        }
115    
116        public void setLookAndFeel(String className) {
117            try {
118                UIManager.setLookAndFeel(className);
119            }
120            catch (Exception e) {
121                throw new ApplicationException("Unable to set look and feel", e);
122            }
123        }
124    
125        public void setLookAndFeelWithName(String lookAndFeelName) {
126            try {
127                if (lookAndFeelName.equalsIgnoreCase(SYSTEM_LOOK_AND_FEEL_NAME)) {
128                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
129                }
130                else if (lookAndFeelName.equalsIgnoreCase(CROSS_PLATFORM_LOOK_AND_FEEL_NAME)) {
131                    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
132                }
133                else {
134                    LookAndFeelInfo[] feels = UIManager.getInstalledLookAndFeels();
135                    for (LookAndFeelInfo feel : feels)
136                    {
137                        if (feel.getName().equalsIgnoreCase(lookAndFeelName))
138                        {
139                            UIManager.setLookAndFeel(feel.getClassName());
140                            break;
141                        }
142                    }
143                }
144            }
145            catch (Exception e) {
146                throw new ApplicationException("Unable to set look and feel", e);
147            }
148        }
149    }