blob: 3bfad49441b141bb25fe3d673aaffd65cab1f42f [file] [log] [blame]
/*
* 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),
};
}