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.border.Border;
042: import javax.swing.event.MouseInputListener;
043: import javax.swing.plaf.ComponentUI;
044: import javax.swing.plaf.metal.MetalToolBarUI;
045:
046: import com.jgoodies.looks.BorderStyle;
047: import com.jgoodies.looks.HeaderStyle;
048: import com.jgoodies.looks.Options;
049:
050: /**
051: * Corrects superclass behavior for rollover borders
052: * and adds behavior for handling different types of borders.
053: *
054: * @author Karsten Lentzsch
055: * @version $Revision: 1.4 $
056: */
057: public final class WindowsToolBarUI extends MetalToolBarUI {
058:
059: private PropertyChangeListener listener;
060:
061: public static ComponentUI createUI(JComponent b) {
062: return new WindowsToolBarUI();
063: }
064:
065: // Handling Special Borders *********************************************
066:
067: protected void installDefaults() {
068: super .installDefaults();
069: installSpecialBorder();
070: }
071:
072: protected void installListeners() {
073: super .installListeners();
074: listener = createBorderStyleListener();
075: toolBar.addPropertyChangeListener(listener);
076: }
077:
078: protected void uninstallListeners() {
079: toolBar.removePropertyChangeListener(listener);
080: super .uninstallListeners();
081: }
082:
083: private PropertyChangeListener createBorderStyleListener() {
084: return new PropertyChangeListener() {
085:
086: public void propertyChange(PropertyChangeEvent e) {
087: String prop = e.getPropertyName();
088: if (prop.equals(Options.HEADER_STYLE_KEY)
089: || prop
090: .equals(WindowsLookAndFeel.BORDER_STYLE_KEY)) {
091: WindowsToolBarUI.this .installSpecialBorder();
092: }
093: }
094:
095: };
096: }
097:
098: /**
099: * Installs a special border, if either a look-dependent
100: * <code>BorderStyle</code> or a look-independent
101: * <code>HeaderStyle</code> has been specified.
102: * A look specific BorderStyle shadows a HeaderStyle.<p>
103: *
104: * Specifying a HeaderStyle is recommend.
105: */
106: private void installSpecialBorder() {
107: String suffix;
108: BorderStyle borderStyle = BorderStyle.from(toolBar,
109: WindowsLookAndFeel.BORDER_STYLE_KEY);
110: if (borderStyle == BorderStyle.EMPTY)
111: suffix = "emptyBorder";
112: else if (borderStyle == BorderStyle.SEPARATOR)
113: suffix = "separatorBorder";
114: else if (borderStyle == BorderStyle.ETCHED)
115: suffix = "etchedBorder";
116: else if (HeaderStyle.from(toolBar) == HeaderStyle.BOTH)
117: suffix = "headerBorder";
118: else
119: return;
120: LookAndFeel.installBorder(toolBar, "ToolBar." + suffix);
121: }
122:
123: // Misc *****************************************************************
124:
125: /**
126: * Unlike the superclass MetalToolBarUI,
127: * this class uses the docking listener from the BasicToolBarUI.
128: */
129: protected MouseInputListener createDockingListener() {
130: return new DockingListener(toolBar);
131: }
132:
133: // Handling Rollover Borders ********************************************
134:
135: protected Border createRolloverBorder() {
136: return WindowsBorders.getRolloverButtonBorder();
137: }
138:
139: protected void setBorderToRollover(Component c) {
140: if (c instanceof AbstractButton) {
141: super .setBorderToRollover(c);
142: } else if (c instanceof Container) {
143: Container cont = (Container) c;
144: for (int i = 0; i < cont.getComponentCount(); i++)
145: super.setBorderToRollover(cont.getComponent(i));
146: }
147: }
148:
149: }
|