| /* |
| * 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), |
| }; |
| |
| |
| } |