001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: /*
042: * UIBootstrapValue.java
043: *
044: * Created on March 29, 2004, 4:17 PM
045: */
046:
047: package org.netbeans.swing.plaf.util;
048:
049: import javax.swing.*;
050:
051: /**
052: * Value that can be placed into UIDefaults, which will put additional items into
053: * UIDefaults when its value is requested.
054: * <p>
055: * The idea is to avoid putting a lot of things that may not be used into
056: * UIDefaults on startup. So, for example, the first time a tab control's UI
057: * is requested, this value will return the string from which the UI can be
058: * fetched - but first it will put the assorted keys and values that that UI
059: * will need into UIDefaults.
060: * <p>
061: * Since multiple UIs may require the same things in UIDefaults, there is the
062: * method createShared(), which will create another instance (really an inner
063: * class instance) that shares the code and key/value pairs. Whichever is
064: * asked for first will initialize the keys and values required. So the usage
065: * pattern is something like:
066: * <pre>
067: * Object someKeysAndValues = new Object[] {"fooColor", Color.BLUE, "barColor", Color.RED};
068: * UIBootstrapValue bv = new UIBootstrapValue ("com.foo.FnordUIClass", someKeysAndValues);
069: * Object next = bv.createShared ("com.foo.ThiptUIClass");
070: * UIManager.put ("FnordUI", bv);
071: * UIManager.put ("ThiptUI", next);
072: * </pre>
073: *
074: * @author Tim Boudreau
075: */
076: public class UIBootstrapValue implements UIDefaults.LazyValue {
077: private boolean installed = false;
078: private final String uiClassName;
079: protected Object[] defaults;
080:
081: /** Creates a new instance of UIBootstrapValue */
082: public UIBootstrapValue(String uiClassName, Object[] defaults) {
083: this .defaults = defaults;
084: this .uiClassName = uiClassName;
085: }
086:
087: /** Create the value that UIDefaults will return. If the keys and values
088: * the UI class we're representing requires have not yet been installed,
089: * this will install them.
090: */
091: public Object createValue(UIDefaults uidefaults) {
092: if (!installed) {
093: installKeysAndValues(uidefaults);
094: }
095: return uiClassName;
096: }
097:
098: /** Install the defaults the UI we're representing will need to function */
099: private void installKeysAndValues(UIDefaults ui) {
100: ui.putDefaults(getKeysAndValues());
101: installed = true;
102: }
103:
104: public Object[] getKeysAndValues() {
105: return defaults;
106: }
107:
108: public void uninstall() {
109: if (defaults == null) {
110: return;
111: }
112: for (int i = 0; i < defaults.length; i += 2) {
113: UIManager.put(defaults[i], null);
114: }
115: //null defaults so a Meta instance won't cause us to do work twice
116: defaults = null;
117: }
118:
119: public String toString() {
120: return getClass() + " for " + uiClassName; //NOI18N
121: }
122:
123: /** Create another entry value to put in UIDefaults, which will also
124: * trigger installing the keys and values, to ensure that they are only
125: * added once, by whichever entry is asked for the value first. */
126: public UIDefaults.LazyValue createShared(String uiClassName) {
127: return new Meta(uiClassName);
128: }
129:
130: private class Meta implements UIDefaults.LazyValue {
131: private String name;
132:
133: public Meta(String uiClassName) {
134: this .name = uiClassName;
135: }
136:
137: public Object createValue(javax.swing.UIDefaults uidefaults) {
138: if (!installed) {
139: installKeysAndValues(uidefaults);
140: }
141: return name;
142: }
143:
144: public String toString() {
145: return "Meta-" + super .toString() + " for " + uiClassName; //NOI18N
146: }
147: }
148:
149: public abstract static class Lazy extends UIBootstrapValue
150: implements UIDefaults.LazyValue {
151: public Lazy(String uiClassName) {
152: super (uiClassName, null);
153: }
154:
155: public Object[] getKeysAndValues() {
156: if (defaults == null) {
157: defaults = createKeysAndValues();
158: }
159: return defaults;
160: }
161:
162: public abstract Object[] createKeysAndValues();
163:
164: }
165: }
|