001: /*
002: * Copyright (c) 2001-2007 JGoodies Karsten Lentzsch. All Rights Reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of JGoodies Karsten Lentzsch nor the names of
015: * its contributors may be used to endorse or promote products derived
016: * from this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package com.jgoodies.looks.windows;
032:
033: import java.beans.PropertyChangeEvent;
034: import java.beans.PropertyChangeListener;
035:
036: import javax.swing.JComponent;
037: import javax.swing.LookAndFeel;
038: import javax.swing.plaf.ComponentUI;
039:
040: import com.jgoodies.looks.BorderStyle;
041: import com.jgoodies.looks.HeaderStyle;
042: import com.jgoodies.looks.Options;
043:
044: /**
045: * The JGoodies Windows look and feel implemenation of <code>MenuBarUI</code>.<p>
046: *
047: * Can handle optional <code>Border</code> types as specified by the
048: * <code>BorderStyle</code> or <code>HeaderStyle</code> client properties.
049: *
050: * @author Karsten Lentzsch
051: * @version $Revision: 1.3 $
052: */
053: public final class WindowsMenuBarUI extends
054: com.sun.java.swing.plaf.windows.WindowsMenuBarUI {
055:
056: private PropertyChangeListener listener;
057:
058: public static ComponentUI createUI(JComponent b) {
059: return new WindowsMenuBarUI();
060: }
061:
062: // Handling Special Borders *********************************************************
063:
064: protected void installDefaults() {
065: super .installDefaults();
066: installSpecialBorder();
067: }
068:
069: protected void installListeners() {
070: super .installListeners();
071: listener = createBorderStyleListener();
072: menuBar.addPropertyChangeListener(listener);
073: }
074:
075: protected void uninstallListeners() {
076: menuBar.removePropertyChangeListener(listener);
077: super .uninstallListeners();
078: }
079:
080: private PropertyChangeListener createBorderStyleListener() {
081: return new PropertyChangeListener() {
082:
083: public void propertyChange(PropertyChangeEvent e) {
084: String prop = e.getPropertyName();
085: if (prop.equals(Options.HEADER_STYLE_KEY)
086: || prop
087: .equals(WindowsLookAndFeel.BORDER_STYLE_KEY)) {
088: WindowsMenuBarUI.this .installSpecialBorder();
089: }
090: }
091:
092: };
093: }
094:
095: /**
096: * Installs a special border, if either a look-dependent
097: * <code>BorderStyle</code> or a look-independent
098: * <code>HeaderStyle</code> has been specified.
099: * A look specific BorderStyle shadows
100: * a HeaderStyle.<p>
101: *
102: * Specifying a HeaderStyle is recommend.
103: */
104: private void installSpecialBorder() {
105: String suffix;
106: BorderStyle borderStyle = BorderStyle.from(menuBar,
107: WindowsLookAndFeel.BORDER_STYLE_KEY);
108: if (borderStyle == BorderStyle.EMPTY)
109: suffix = "emptyBorder";
110: else if (borderStyle == BorderStyle.ETCHED)
111: suffix = "etchedBorder";
112: else if (borderStyle == BorderStyle.SEPARATOR)
113: suffix = "separatorBorder";
114: else if (HeaderStyle.from(menuBar) == HeaderStyle.BOTH)
115: suffix = "headerBorder";
116: else
117: return;
118:
119: LookAndFeel.installBorder(menuBar, "MenuBar." + suffix);
120: }
121:
122: }
|