001 /*
002 * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation. Sun designates this
008 * particular file as subject to the "Classpath" exception as provided
009 * by Sun in the LICENSE file that accompanied this code.
010 *
011 * This code is distributed in the hope that it will be useful, but WITHOUT
012 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014 * version 2 for more details (a copy is included in the LICENSE file that
015 * accompanied this code).
016 *
017 * You should have received a copy of the GNU General Public License version
018 * 2 along with this work; if not, write to the Free Software Foundation,
019 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020 *
021 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022 * CA 95054 USA or visit www.sun.com if you need additional information or
023 * have any questions.
024 */
025
026 package javax.swing.plaf.synth;
027
028 import javax.swing.*;
029 import javax.swing.text.*;
030 import javax.swing.event.*;
031 import javax.swing.plaf.*;
032 import javax.swing.plaf.basic.BasicTextAreaUI;
033 import java.awt.*;
034 import java.beans.PropertyChangeEvent;
035 import sun.swing.plaf.synth.SynthUI;
036
037 /**
038 * Provides the look and feel for a plain text editor in the
039 * Synth look and feel. In this implementation the default UI
040 * is extended to act as a simple view factory.
041 * <p>
042 * <strong>Warning:</strong>
043 * Serialized objects of this class will not be compatible with
044 * future Swing releases. The current serialization support is
045 * appropriate for short term storage or RMI between applications running
046 * the same version of Swing. As of 1.4, support for long term storage
047 * of all JavaBeans<sup><font size="-2">TM</font></sup>
048 * has been added to the <code>java.beans</code> package.
049 * Please see {@link java.beans.XMLEncoder}.
050 *
051 * @author Shannon Hickey
052 * @version 1.16 05/05/07
053 */
054 class SynthTextAreaUI extends BasicTextAreaUI implements SynthUI {
055 private SynthStyle style;
056
057 /**
058 * Creates a UI for a JTextArea.
059 *
060 * @param ta a text area
061 * @return the UI
062 */
063 public static ComponentUI createUI(JComponent ta) {
064 return new SynthTextAreaUI();
065 }
066
067 protected void installDefaults() {
068 // Installs the text cursor on the component
069 super .installDefaults();
070 updateStyle((JTextComponent) getComponent());
071 }
072
073 protected void uninstallDefaults() {
074 SynthContext context = getContext(getComponent(), ENABLED);
075
076 getComponent().putClientProperty("caretAspectRatio", null);
077
078 style.uninstallDefaults(context);
079 context.dispose();
080 style = null;
081 super .uninstallDefaults();
082 }
083
084 public void installUI(JComponent c) {
085 super .installUI(c);
086 }
087
088 private void updateStyle(JTextComponent comp) {
089 SynthContext context = getContext(comp, ENABLED);
090 SynthStyle oldStyle = style;
091
092 style = SynthLookAndFeel.updateStyle(context, this );
093
094 if (style != oldStyle) {
095 SynthTextFieldUI.updateStyle(comp, context,
096 getPropertyPrefix());
097
098 if (oldStyle != null) {
099 uninstallKeyboardActions();
100 installKeyboardActions();
101 }
102 }
103 context.dispose();
104 }
105
106 public SynthContext getContext(JComponent c) {
107 return getContext(c, getComponentState(c));
108 }
109
110 private SynthContext getContext(JComponent c, int state) {
111 return SynthContext.getContext(SynthContext.class, c,
112 SynthLookAndFeel.getRegion(c), style, state);
113 }
114
115 private int getComponentState(JComponent c) {
116 return SynthLookAndFeel.getComponentState(c);
117 }
118
119 public void update(Graphics g, JComponent c) {
120 SynthContext context = getContext(c);
121
122 SynthLookAndFeel.update(context, g);
123 context.getPainter().paintTextAreaBackground(context, g, 0, 0,
124 c.getWidth(), c.getHeight());
125 paint(context, g);
126 context.dispose();
127 }
128
129 protected void paint(SynthContext context, Graphics g) {
130 super .paint(g, getComponent());
131 }
132
133 protected void paintBackground(Graphics g) {
134 // Overriden to do nothing, all our painting is done from update/paint.
135 }
136
137 public void paintBorder(SynthContext context, Graphics g, int x,
138 int y, int w, int h) {
139 context.getPainter()
140 .paintTextAreaBorder(context, g, x, y, w, h);
141 }
142
143 /**
144 * This method gets called when a bound property is changed
145 * on the associated JTextComponent. This is a hook
146 * which UI implementations may change to reflect how the
147 * UI displays bound properties of JTextComponent subclasses.
148 * This is implemented to rebuild the View when the
149 * <em>WrapLine</em> or the <em>WrapStyleWord</em> property changes.
150 *
151 * @param evt the property change event
152 */
153 protected void propertyChange(PropertyChangeEvent evt) {
154 if (SynthLookAndFeel.shouldUpdateStyle(evt)) {
155 updateStyle((JTextComponent) evt.getSource());
156 }
157 super.propertyChange(evt);
158 }
159 }
|