/* |
|
* Copyright (c) 1997, 1998, Oracle and/or its affiliates. All rights reserved. |
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
* |
|
* This code is free software; you can redistribute it and/or modify it |
|
* under the terms of the GNU General Public License version 2 only, as |
|
* published by the Free Software Foundation. Oracle designates this |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle in the LICENSE file that accompanied this code. |
|
* |
|
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
* version 2 for more details (a copy is included in the LICENSE file that |
|
* accompanied this code). |
|
* |
|
* You should have received a copy of the GNU General Public License version |
|
* 2 along with this work; if not, write to the Free Software Foundation, |
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
* |
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.com if you need additional information or have any |
|
* questions. |
|
*/ |
|
package com.sun.java.swing.plaf.motif; |
|
import java.awt.*; |
|
import java.awt.event.*; |
|
import javax.swing.*; |
|
import javax.swing.text.*; |
|
import javax.swing.plaf.*; |
|
/** |
|
* Provides the look and feel features that are common across |
|
* the Motif/CDE text LAF implementations. |
|
* <p> |
|
* <strong>Warning:</strong> |
|
* Serialized objects of this class will not be compatible with |
|
* future Swing releases. The current serialization support is appropriate |
|
* for short term storage or RMI between applications running the same |
|
* version of Swing. A future release of Swing will provide support for |
|
* long term persistence. |
|
* |
|
* @author Timothy Prinzing |
|
*/ |
|
public class MotifTextUI { |
|
/** |
|
* Creates the object to use for a caret for all of the Motif |
|
* text components. The caret is rendered as an I-beam on Motif. |
|
* |
|
* @return the caret object |
|
*/ |
|
public static Caret createCaret() { |
|
return new MotifCaret(); |
|
} |
|
/** |
|
* The motif caret is rendered as an I beam. |
|
* <p> |
|
* <strong>Warning:</strong> |
|
* Serialized objects of this class will not be compatible with |
|
* future Swing releases. The current serialization support is appropriate |
|
* for short term storage or RMI between applications running the same |
|
* version of Swing. A future release of Swing will provide support for |
|
* long term persistence. |
|
*/ |
|
public static class MotifCaret extends DefaultCaret implements UIResource { |
|
/** |
|
* Called when the component containing the caret gains |
|
* focus. This is implemented to repaint the component |
|
* so the focus rectangle will be re-rendered, as well |
|
* as providing the superclass behavior. |
|
* |
|
* @param e the focus event |
|
* @see FocusListener#focusGained |
|
*/ |
|
public void focusGained(FocusEvent e) { |
|
super.focusGained(e); |
|
getComponent().repaint(); |
|
} |
|
/** |
|
* Called when the component containing the caret loses |
|
* focus. This is implemented to set the caret to visibility |
|
* to false. |
|
* |
|
* @param e the focus event |
|
* @see FocusListener#focusLost |
|
*/ |
|
public void focusLost(FocusEvent e) { |
|
super.focusLost(e); |
|
getComponent().repaint(); |
|
} |
|
/** |
|
* Damages the area surrounding the caret to cause |
|
* it to be repainted. If paint() is reimplemented, |
|
* this method should also be reimplemented. |
|
* |
|
* @param r the current location of the caret, does nothing if null |
|
* @see #paint |
|
*/ |
|
protected void damage(Rectangle r) { |
|
if (r != null) { |
|
x = r.x - IBeamOverhang - 1; |
|
y = r.y; |
|
width = r.width + (2 * IBeamOverhang) + 3; |
|
height = r.height; |
|
repaint(); |
|
} |
|
} |
|
/** |
|
* Renders the caret as a vertical line. If this is reimplemented |
|
* the damage method should also be reimplemented as it assumes the |
|
* shape of the caret is a vertical line. Does nothing if isVisible() |
|
* is false. The caret color is derived from getCaretColor() if |
|
* the component has focus, else from getDisabledTextColor(). |
|
* |
|
* @param g the graphics context |
|
* @see #damage |
|
*/ |
|
public void paint(Graphics g) { |
|
if(isVisible()) { |
|
try { |
|
JTextComponent c = getComponent(); |
|
Color fg = c.hasFocus() ? c.getCaretColor() : |
|
c.getDisabledTextColor(); |
|
TextUI mapper = c.getUI(); |
|
int dot = getDot(); |
|
Rectangle r = mapper.modelToView(c, dot); |
|
int x0 = r.x - IBeamOverhang; |
|
int x1 = r.x + IBeamOverhang; |
|
int y0 = r.y + 1; |
|
int y1 = r.y + r.height - 2; |
|
g.setColor(fg); |
|
g.drawLine(r.x, y0, r.x, y1); |
|
g.drawLine(x0, y0, x1, y0); |
|
g.drawLine(x0, y1, x1, y1); |
|
} catch (BadLocationException e) { |
|
// can't render I guess |
|
//System.err.println("Can't render caret"); |
|
} |
|
} |
|
} |
|
static final int IBeamOverhang = 2; |
|
} |
|
/** |
|
* Default bindings all keymaps implementing the Motif feel. |
|
*/ |
|
static final JTextComponent.KeyBinding[] defaultBindings = { |
|
new JTextComponent.KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, |
|
InputEvent.CTRL_MASK), |
|
DefaultEditorKit.copyAction), |
|
new JTextComponent.KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, |
|
InputEvent.SHIFT_MASK), |
|
DefaultEditorKit.pasteAction), |
|
new JTextComponent.KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, |
|
InputEvent.SHIFT_MASK), |
|
DefaultEditorKit.cutAction), |
|
new JTextComponent.KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, |
|
InputEvent.SHIFT_MASK), |
|
DefaultEditorKit.selectionBackwardAction), |
|
new JTextComponent.KeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, |
|
InputEvent.SHIFT_MASK), |
|
DefaultEditorKit.selectionForwardAction), |
|
}; |
|
} |