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.awt.Component;
034: import java.awt.Container;
035: import java.beans.PropertyChangeEvent;
036: import java.beans.PropertyChangeListener;
037:
038: import javax.swing.AbstractButton;
039: import javax.swing.JComponent;
040: import javax.swing.LookAndFeel;
041: import javax.swing.plaf.ComponentUI;
042:
043: import com.jgoodies.looks.BorderStyle;
044: import com.jgoodies.looks.HeaderStyle;
045: import com.jgoodies.looks.Options;
046: import com.sun.java.swing.plaf.windows.WindowsToolBarUI;
047:
048: /**
049: * Adds behavior for handling different types of borders.
050: *
051: * @author Karsten Lentzsch
052: * @version $Revision: 1.4 $
053: */
054: public final class WindowsXPToolBarUI extends WindowsToolBarUI {
055:
056: private PropertyChangeListener listener;
057:
058: public static ComponentUI createUI(JComponent b) {
059: return new WindowsXPToolBarUI();
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: toolBar.addPropertyChangeListener(listener);
073: }
074:
075: protected void uninstallListeners() {
076: toolBar.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: WindowsXPToolBarUI.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 <code>HeaderStyle</code>
098: * has been specified. A look specific BorderStyle shadows
099: * a HeaderStyle.<p>
100: *
101: * Specifying a HeaderStyle is recommend.
102: */
103: private void installSpecialBorder() {
104: String suffix;
105: BorderStyle borderStyle = BorderStyle.from(toolBar,
106: WindowsLookAndFeel.BORDER_STYLE_KEY);
107: if (borderStyle == BorderStyle.EMPTY)
108: suffix = "emptyBorder";
109: else if (borderStyle == BorderStyle.SEPARATOR)
110: suffix = "separatorBorder";
111: else if (borderStyle == BorderStyle.ETCHED)
112: suffix = "etchedBorder";
113: else if (HeaderStyle.from(toolBar) == HeaderStyle.BOTH)
114: suffix = "headerBorder";
115: else
116: suffix = "border";
117: LookAndFeel.installBorder(toolBar, "ToolBar." + suffix);
118: }
119:
120: // Handling Rollover Borders ********************************************
121:
122: protected void setBorderToRollover(Component c) {
123: if (c instanceof AbstractButton) {
124: super .setBorderToRollover(c);
125: } else if (c instanceof Container) {
126: Container cont = (Container) c;
127: for (int i = 0; i < cont.getComponentCount(); i++)
128: super.setBorderToRollover(cont.getComponent(i));
129: }
130: }
131:
132: }
|