176 lines
6.9 KiB
Java
176 lines
6.9 KiB
Java
/*
|
|
* 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),
|
|
};
|
|
|
|
|
|
}
|