FileDocCategorySizeDatePackage
MotifTextUI.javaAPI DocJava SE 5 API4922Fri Aug 26 14:54:48 BST 2005com.sun.java.swing.plaf.motif

MotifTextUI.java

/*
 * @(#)MotifTextUI.java	1.20 03/12/19
 *
 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
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
 * @version 1.20 12/19/03
 */
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),
    };


}