/* DefaultEditorKit.java --
   Copyright (C) 2002, 2004, 2005  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath 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 for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package javax.swing.text;

import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;

import javax.swing.Action;
import javax.swing.SwingConstants;

/**
 * The default implementation of {@link EditorKit}. This <code>EditorKit</code>
 * a plain text <code>Document</code> and several commands that together
 * make up a basic editor, like cut / copy + paste.
 *
 * @author original author unknown
 * @author Roman Kennke (roman@kennke.org)
 * @author Robert Schuster (robertschuster@fsfe.org)
 */
public class DefaultEditorKit extends EditorKit
{
  static class SelectionPreviousWordAction
      extends TextAction
  {
    SelectionPreviousWordAction()
    {
      super(selectionPreviousWordAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      try
        {
          JTextComponent t = getTextComponent(event);
      
          if (t != null)
            {
              int offs = Utilities.getPreviousWord(t, t.getCaretPosition());
      
              Caret c = t.getCaret();
              c.moveDot(offs);
              c.setMagicCaretPosition(t.modelToView(offs).getLocation());
            }
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }

  static class SelectionNextWordAction
      extends TextAction
  {
    SelectionNextWordAction()
    {
      super(selectionNextWordAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      try
        {
          JTextComponent t = getTextComponent(event);
      
          if (t != null)
            {
              int offs = Utilities.getNextWord(t, t.getCaretPosition());
      
              Caret c = t.getCaret();
              c.moveDot(offs);
              c.setMagicCaretPosition(t.modelToView(offs).getLocation());
            }
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }

  static class SelectionBeginWordAction extends TextAction
  {
    SelectionBeginWordAction()
    {
      super(selectionBeginWordAction);
    }
  
    public void actionPerformed(ActionEvent event)
    {
      try
        {
          JTextComponent t = getTextComponent(event);
      
          if (t != null)
            {
              int offs = Utilities.getWordStart(t, t.getCaretPosition());
      
              Caret c = t.getCaret();
              c.moveDot(offs);
              c.setMagicCaretPosition(t.modelToView(offs).getLocation());
            }
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }
  
  static class SelectionEndWordAction extends TextAction
  {
    SelectionEndWordAction()
    {
      super(selectionEndWordAction);
    }
  
    public void actionPerformed(ActionEvent event)
    {
      try
        {
          JTextComponent t = getTextComponent(event);
      
          if (t != null)
            {
              int offs = Utilities.getWordEnd(t, t.getCaretPosition());
      
              Caret c = t.getCaret();
              c.moveDot(offs);
              c.setMagicCaretPosition(t.modelToView(offs).getLocation());
            }
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }
  
  static class BeginWordAction extends TextAction
  {
    BeginWordAction()
    {
      super(beginWordAction);
    }
  
    public void actionPerformed(ActionEvent event)
    {
      try
        {
          JTextComponent t = getTextComponent(event);
      
          if (t != null)
            {
              int offs = Utilities.getWordStart(t, t.getCaretPosition());
      
              Caret c = t.getCaret();
              c.setDot(offs);
              c.setMagicCaretPosition(t.modelToView(offs).getLocation());
            }
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }
  
  static class EndWordAction extends TextAction
  {
    EndWordAction()
    {
      super(endWordAction);
    }
  
    public void actionPerformed(ActionEvent event)
    {
      try
        {
          JTextComponent t = getTextComponent(event);
      
          if (t != null)
            {
              int offs = Utilities.getWordEnd(t, t.getCaretPosition());
      
              Caret c = t.getCaret();
              c.setDot(offs);
              c.setMagicCaretPosition(t.modelToView(offs).getLocation());
            }
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }

  static class PreviousWordAction
      extends TextAction
  {
    PreviousWordAction()
    {
      super(previousWordAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      try
        {
          JTextComponent t = getTextComponent(event);
      
          if (t != null)
            {
              int offs = Utilities.getPreviousWord(t, t.getCaretPosition());
      
              Caret c = t.getCaret();
              c.setDot(offs);
              c.setMagicCaretPosition(t.modelToView(offs).getLocation());
            }
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }

  static class NextWordAction
      extends TextAction
  {
    NextWordAction()
    {
      super(nextWordAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      try
        {
          JTextComponent t = getTextComponent(event);
      
          if (t != null)
            {
              int offs = Utilities.getNextWord(t, t.getCaretPosition());
      
              Caret c = t.getCaret();
              c.setDot(offs);
              c.setMagicCaretPosition(t.modelToView(offs).getLocation());
            }
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }

  static class SelectAllAction
      extends TextAction
  {
    SelectAllAction()
    {
      super(selectAllAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      int offs = t.getDocument().getLength();
      Caret c = t.getCaret();
      c.setDot(0);
      c.moveDot(offs);
      
      try
      {   
        c.setMagicCaretPosition(t.modelToView(offs).getLocation());
      }
    catch(BadLocationException ble)
      {
        // Can't happen.
      }
    }
  }

  static class SelectionBeginAction
      extends TextAction
  {
    SelectionBeginAction()
    {
      super(selectionBeginAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      Caret c = t.getCaret();
      c.moveDot(0);
      try
        {   
          c.setMagicCaretPosition(t.modelToView(0).getLocation());
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }

  static class SelectionEndAction
      extends TextAction
  {
    SelectionEndAction()
    {
      super(selectionEndAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      int offs = t.getDocument().getLength();
      Caret c = t.getCaret();
      c.moveDot(offs);
      try
        {   
          c.setMagicCaretPosition(t.modelToView(offs).getLocation());
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }
  
  static class SelectionBeginLineAction
    extends TextAction
  {
    
    SelectionBeginLineAction()
    {
      super(selectionBeginLineAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      Caret c = t.getCaret();
      try
        {
          int offs = Utilities.getRowStart(t, c.getDot());
          c.setMagicCaretPosition(t.modelToView(offs).getLocation());
        }
      catch(BadLocationException ble)
      {
        // Can't happen.
      }

    }
  }

  static class SelectionEndLineAction
      extends TextAction
  {
    SelectionEndLineAction()
    {
      super(selectionEndLineAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      Caret c = t.getCaret();
      try
        {
          int offs = Utilities.getRowEnd(t, c.getDot());
          c.setMagicCaretPosition(t.modelToView(offs).getLocation());
        }
      catch(BadLocationException ble)
        {
        // Can't happen.
        }

    }
  }
  
  static class SelectLineAction extends TextAction
  {
    SelectLineAction()
    {
      super(selectLineAction);
    }
  
    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      Caret c = t.getCaret();
      try
        {
          int offs1 = Utilities.getRowStart(t, c.getDot());
          int offs2 = Utilities.getRowEnd(t, c.getDot());
          
          c.setDot(offs2);
          c.moveDot(offs1);
          
          c.setMagicCaretPosition(t.modelToView(offs2).getLocation());
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }
  
  static class SelectWordAction extends TextAction
  {
    SelectWordAction()
    {
      super(selectWordAction);
    }
  
    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      Caret c = t.getCaret();
      int dot = c.getDot();

      try
        {
          int wordStart = Utilities.getWordStart(t, dot);
      
          if (dot == wordStart)
            {
              // Current cursor position is on the first character in a word.
              c.setDot(wordStart);
              c.moveDot(Utilities.getWordEnd(t, wordStart));
            }
          else
            {
              // Current cursor position is not on the first character
              // in a word. 
              int nextWord = Utilities.getNextWord(t, dot);
              int previousWord = Utilities.getPreviousWord(t, dot);
              int previousWordEnd = Utilities.getWordEnd(t, previousWord);
              
              // Cursor position is in the space between two words. In such a
              // situation just select the space.
              if (dot >= previousWordEnd && dot <= nextWord)
                {
                  c.setDot(previousWordEnd);
                  c.moveDot(nextWord);
                }
              else
                {
                  // Cursor position is inside a word. Just select it then.
                  c.setDot(previousWord);
                  c.moveDot(previousWordEnd);
                }
            }

          // If the position was updated change the magic caret position
          // as well.
          if (c.getDot() != dot)
            c.setMagicCaretPosition(t.modelToView(c.getDot()).getLocation());
          
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }

  static class SelectionDownAction
      extends TextAction.VerticalMovementAction
  {
    SelectionDownAction()
    {
      super(selectionDownAction, SwingConstants.SOUTH);
    }

    protected void actionPerformedImpl(Caret c, int offs)
    {
      c.moveDot(offs);
    }
    
  }

  static class SelectionUpAction
  extends TextAction.VerticalMovementAction
  {
    SelectionUpAction()
    {
      super(selectionUpAction, SwingConstants.NORTH);
    }

    protected void actionPerformedImpl(Caret c, int offs)
    {
      c.moveDot(offs);
    }

  }

  static class SelectionForwardAction
      extends TextAction.HorizontalMovementAction
  {
    SelectionForwardAction()
    {
      super(selectionForwardAction, SwingConstants.EAST);
    }

    protected void actionPerformedImpl(Caret c, int offs)
    {
      c.moveDot(offs);
    }
  }

  static class SelectionBackwardAction
      extends TextAction.HorizontalMovementAction
  {
    SelectionBackwardAction()
    {
      super(selectionBackwardAction, SwingConstants.WEST);
    }

    protected void actionPerformedImpl(Caret c, int offs)
    {
      c.moveDot(offs);
    }
  }

  static class DownAction
      extends TextAction.VerticalMovementAction
  {
    DownAction()
    {
      super(downAction, SwingConstants.SOUTH);
    }

    protected void actionPerformedImpl(Caret c, int offs)
    {
      c.setDot(offs);
    }
  }

  static class UpAction
      extends TextAction.VerticalMovementAction
  {
    UpAction()
    {
      super(upAction, SwingConstants.NORTH);
    }

    protected void actionPerformedImpl(Caret c, int offs)
    {
      c.setDot(offs);
    }
    
  }

  static class ForwardAction
      extends TextAction.HorizontalMovementAction
  {
    ForwardAction()
    {
      super(forwardAction, SwingConstants.EAST);
    }

    protected void actionPerformedImpl(Caret c, int offs)
    {
      c.setDot(offs);
    }
    
  }

  static class BackwardAction
      extends TextAction.HorizontalMovementAction
  {
    BackwardAction()
    {
      super(backwardAction, SwingConstants.WEST);
    }

    protected void actionPerformedImpl(Caret c, int offs)
    {
      c.setDot(offs);
    }
    
  }

  static class DeletePrevCharAction
      extends TextAction
  {
    DeletePrevCharAction()
    {
      super(deletePrevCharAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      if (t != null)
        {
          try
            {
              int pos = t.getSelectionStart();
              int len = t.getSelectionEnd() - pos;
              
              if (len > 0)
                  t.getDocument().remove(pos, len);
              else if (pos > 0)
                {
                  pos--;
                  t.getDocument().remove(pos, 1);
                  Caret c = t.getCaret();
                  c.setDot(pos);
                  c.setMagicCaretPosition(t.modelToView(pos).getLocation());
                }
            }
          catch (BadLocationException e)
            {
              // FIXME: we're not authorized to throw this.. swallow it?
            }
        }
    }
  }

  static class DeleteNextCharAction
      extends TextAction
  {
    DeleteNextCharAction()
    {
      super(deleteNextCharAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      if (t != null)
        {
          try
            {
              int pos = t.getSelectionStart();
              int len = t.getSelectionEnd() - pos;
              
              if (len > 0)
                  t.getDocument().remove(pos, len);
              else if (pos < t.getDocument().getLength())
                  t.getDocument().remove(pos, 1);
    
              Caret c = t.getCaret();
              c.setDot(pos);
              c.setMagicCaretPosition(t.modelToView(pos).getLocation());
            }
          catch (BadLocationException e)
            {
              // FIXME: we're not authorized to throw this.. swallow it?
            }
        }
    }
  }

  static class EndLineAction
      extends TextAction
  {
    EndLineAction()
    {
      super(endLineAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      try
     {
       int offs = Utilities.getRowEnd(t, t.getCaretPosition());
       
       if (offs > -1)
         {
           Caret c = t.getCaret();
           c.setDot(offs);
           c.setMagicCaretPosition(t.modelToView(offs).getLocation());
         }
     }
     catch (BadLocationException ble)
     {
       // Nothing to do here
     }
    }
  }

  static class BeginLineAction
      extends TextAction
  {
    BeginLineAction()
    {
      super(beginLineAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      try
      {
        int offs = Utilities.getRowStart(t, t.getCaretPosition());
        
        if (offs > -1)
          {
            Caret c = t.getCaret();
            c.setDot(offs);
            c.setMagicCaretPosition(t.modelToView(offs).getLocation());
          }
      }
      catch (BadLocationException ble)
      {
        // Do nothing here.
      }
    }
  }

  static class BeginAction extends TextAction
  {
    
    BeginAction()
    {
      super(beginAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      Caret c = t.getCaret();
      c.setDot(0);
      try
      {   
        c.setMagicCaretPosition(t.modelToView(0).getLocation());
      }
      catch(BadLocationException ble)
      {
        // Can't happen.
      }
    }
  }

  static class EndAction extends TextAction
  {
      
    EndAction()
    {
      super(endAction);
    }

    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      int offs = t.getDocument().getLength();
      Caret c = t.getCaret();
      c.setDot(offs);
      try
        {   
          c.setMagicCaretPosition(t.modelToView(offs).getLocation());
        }
      catch(BadLocationException ble)
        {
          // Can't happen.
        }
    }
  }
  
  /**
   * Creates a beep on the PC speaker.
   *
   * @see Toolkit#beep()
   */
  public static class BeepAction extends TextAction
  {
    /**
     * Creates a new <code>BeepAction</code>.
     */
    public BeepAction()
    {
      super(beepAction);
    }

    /**
     * Performs the <code>Action</code>.
     *
     * @param event the action event describing the user action
     */
    public void actionPerformed(ActionEvent event)
    {
      Toolkit.getDefaultToolkit().beep();
    }
  }

  /**
   * Copies the selected content into the system clipboard.
   *
   * @see Toolkit#getSystemClipboard()
   * @see CutAction
   * @see PasteAction
   */
  public static class CopyAction extends TextAction
  {

    /**
     * Create a new <code>CopyAction</code>.
     */
    public CopyAction()
    {
      super(copyAction);
    }

    /**
     * Performs the <code>Action</code>.
     *
     * @param event the action event describing the user action
     */
    public void actionPerformed(ActionEvent event)
    {
      getTextComponent(event).copy();
    }
  }


  /**
   * Copies the selected content into the system clipboard and deletes the
   * selection.
   *
   * @see Toolkit#getSystemClipboard()
   * @see CopyAction
   * @see PasteAction
   */
  public static class CutAction extends TextAction
  {

    /**
     * Create a new <code>CutAction</code>.
     */
    public CutAction()
    {
      super(cutAction);
    }

    /**
     * Performs the <code>Action</code>.
     *
     * @param event the action event describing the user action
     */
    public void actionPerformed(ActionEvent event)
    {
      getTextComponent(event).cut();
    }
  }

  /**
   * Copies content from the system clipboard into the editor.
   *
   * @see Toolkit#getSystemClipboard()
   * @see CopyAction
   * @see CutAction
   */
  public static class PasteAction extends TextAction
  {

    /**
     * Create a new <code>PasteAction</code>.
     */
    public PasteAction()
    {
      super(pasteAction);
    }

    /**
     * Performs the <code>Action</code>.
     *
     * @param event the action event describing the user action
     */
    public void actionPerformed(ActionEvent event)
    {
      getTextComponent(event).paste();
    }
  }

  /**
   * This action is executed as default action when a KEY_TYPED
   * event is received and no keymap entry exists for that. The purpose
   * of this action is to filter out a couple of characters. This includes
   * the control characters and characters with the ALT-modifier.
   * 
   * If an event does not get filtered, it is inserted into the document
   * of the text component. If there is some text selected in the text
   * component, this text will be replaced.
   */
  public static class DefaultKeyTypedAction 
    extends TextAction
  {

    /**
     * Creates a new <code>DefaultKeyTypedAction</code>.
     */
    public DefaultKeyTypedAction()
    {
      super(defaultKeyTypedAction);
    }

    /**
     * Performs the <code>Action</code>.
     *
     * @param event the action event describing the user action
     */
    public void actionPerformed(ActionEvent event)
    {
      // first we filter the following events:
      // - control characters
      // - key events with the ALT modifier (FIXME: filter that too!)
      int cp = event.getActionCommand().codePointAt(0);
      if (Character.isISOControl(cp))
        return;

      JTextComponent t = getTextComponent(event);
      if (t != null && t.isEnabled() && t.isEditable())
        t.replaceSelection(event.getActionCommand());
    }    
  }

  /**
   * This action inserts a newline character into the document
   * of the text component. This is typically triggered by hitting
   * ENTER on the keyboard.
   */
  public static class InsertBreakAction extends TextAction
  {

    /**
     * Creates a new <code>InsertBreakAction</code>.
     */
    public InsertBreakAction()
    {
      super(insertBreakAction);
    }

    /**
     * Performs the <code>Action</code>.
     *
     * @param event the action event describing the user action
     */
    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      t.replaceSelection("\n");
    }
  }

  /**
   * Places content into the associated editor. If there currently is a
   * selection, this selection is replaced.
   */
  // FIXME: Figure out what this Action is supposed to do. Obviously text
  // that is entered by the user is inserted through DefaultKeyTypedAction.
  public static class InsertContentAction extends TextAction
  {

    /**
     * Creates a new <code>InsertContentAction</code>.
     */
    public InsertContentAction()
    {
      super(insertContentAction);
    }

    /**
     * Performs the <code>Action</code>.
     *
     * @param event the action event describing the user action
     */
    public void actionPerformed(ActionEvent event)
    {
      // FIXME: Figure out what this Action is supposed to do. Obviously text
      // that is entered by the user is inserted through DefaultKeyTypedAction.
    }
  }

  /**
   * Inserts a TAB character into the text editor.
   */
  public static class InsertTabAction extends TextAction
  {

    /**
     * Creates a new <code>TabAction</code>.
     */
    public InsertTabAction()
    {
      super(insertTabAction);
    }

    /**
     * Performs the <code>Action</code>.
     *
     * @param event the action event describing the user action
     */
    public void actionPerformed(ActionEvent event)
    {
      JTextComponent t = getTextComponent(event);
      t.replaceSelection("\t");
    }
  }

  /**
   * The serial version of DefaultEditorKit.
   */
  private static final long serialVersionUID = 9017245433028523428L;

  /**
   * The name of the <code>Action</code> that moves the caret one character
   * backwards.
   *
   * @see #getActions()
   */
  public static final String backwardAction = "caret-backward";

  /**
   * The name of the <code>Action</code> that creates a beep in the speaker.
   *
   * @see #getActions()
   */
  public static final String beepAction = "beep";

  /**
   * The name of the <code>Action</code> that moves the caret to the beginning
   * of the <code>Document</code>.
   *
   * @see #getActions()
   */
  public static final String beginAction = "caret-begin";

  /**
   * The name of the <code>Action</code> that moves the caret to the beginning
   * of the current line.
   *
   * @see #getActions()
   */
  public static final String beginLineAction = "caret-begin-line";

  /**
   * The name of the <code>Action</code> that moves the caret to the beginning
   * of the current paragraph.
   *
   * @see #getActions()
   */
  public static final String beginParagraphAction = "caret-begin-paragraph";

  /**
   * The name of the <code>Action</code> that moves the caret to the beginning
   * of the current word.
   *
   * @see #getActions()
   */
  public static final String beginWordAction = "caret-begin-word";

  /**
   * The name of the <code>Action</code> that copies the selected content
   * into the system clipboard.
   *
   * @see #getActions()
   */
  public static final String copyAction = "copy-to-clipboard";

  /**
   * The name of the <code>Action</code> that copies the selected content
   * into the system clipboard and removes the selection.
   *
   * @see #getActions()
   */
  public static final String cutAction = "cut-to-clipboard";

  /**
   * The name of the <code>Action</code> that is performed by default if
   * a key is typed and there is no keymap entry.
   *
   * @see #getActions()
   */
  public static final String defaultKeyTypedAction = "default-typed";

  /**
   * The name of the <code>Action</code> that deletes the character that
   * follows the current caret position.
   *
   * @see #getActions()
   */
  public static final String deleteNextCharAction = "delete-next";

  /**
   * The name of the <code>Action</code> that deletes the character that
   * precedes the current caret position.
   *
   * @see #getActions()
   */
  public static final String deletePrevCharAction = "delete-previous";

  /**
   * The name of the <code>Action</code> that moves the caret one line down.
   *
   * @see #getActions()
   */
  public static final String downAction = "caret-down";

  /**
   * The name of the <code>Action</code> that moves the caret to the end
   * of the <code>Document</code>.
   *
   * @see #getActions()
   */
  public static final String endAction = "caret-end";

  /**
   * The name of the <code>Action</code> that moves the caret to the end
   * of the current line.
   *
   * @see #getActions()
   */
  public static final String endLineAction = "caret-end-line";

  /**
   * When a document is read and an CRLF is encountered, then we add a property
   * with this name and a value of &quot;\r\n&quot;.
   */
  public static final String EndOfLineStringProperty = "__EndOfLine__";

  /**
   * The name of the <code>Action</code> that moves the caret to the end
   * of the current paragraph.
   *
   * @see #getActions()
   */
  public static final String endParagraphAction = "caret-end-paragraph";

  /**
   * The name of the <code>Action</code> that moves the caret to the end
   * of the current word.
   *
   * @see #getActions()
   */
  public static final String endWordAction = "caret-end-word";

  /**
   * The name of the <code>Action</code> that moves the caret one character
   * forward.
   *
   * @see #getActions()
   */
  public static final String forwardAction = "caret-forward";

  /**
   * The name of the <code>Action</code> that inserts a line break.
   *
   * @see #getActions()
   */
  public static final String insertBreakAction = "insert-break";

  /**
   * The name of the <code>Action</code> that inserts some content.
   *
   * @see #getActions()
   */
  public static final String insertContentAction = "insert-content";

  /**
   * The name of the <code>Action</code> that inserts a TAB.
   *
   * @see #getActions()
   */
  public static final String insertTabAction = "insert-tab";

  /**
   * The name of the <code>Action</code> that moves the caret to the beginning
   * of the next word.
   *
   * @see #getActions()
   */
  public static final String nextWordAction = "caret-next-word";

  /**
   * The name of the <code>Action</code> that moves the caret one page down.
   *
   * @see #getActions()
   */
  public static final String pageDownAction = "page-down";

  /**
   * The name of the <code>Action</code> that moves the caret one page up.
   *
   * @see #getActions()
   */
  public static final String pageUpAction = "page-up";

  /**
   * The name of the <code>Action</code> that copies content from the system
   * clipboard into the document.
   *
   * @see #getActions()
   */
  public static final String pasteAction = "paste-from-clipboard";

  /**
   * The name of the <code>Action</code> that moves the caret to the beginning
   * of the previous word.
   *
   * @see #getActions()
   */
  public static final String previousWordAction = "caret-previous-word";

  /**
   * The name of the <code>Action</code> that sets the editor in read only
   * mode.
   *
   * @see #getActions()
   */
  public static final String readOnlyAction = "set-read-only";

  /**
   * The name of the <code>Action</code> that selects the whole document.
   *
   * @see #getActions()
   */
  public static final String selectAllAction = "select-all";

  /**
   * The name of the <code>Action</code> that moves the caret one character
   * backwards, possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionBackwardAction = "selection-backward";

  /**
   * The name of the <code>Action</code> that moves the caret to the beginning
   * of the document, possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionBeginAction = "selection-begin";

  /**
   * The name of the <code>Action</code> that moves the caret to the beginning
   * of the current line, possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionBeginLineAction = "selection-begin-line";

  /**
   * The name of the <code>Action</code> that moves the caret to the beginning
   * of the current paragraph, possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionBeginParagraphAction =
    "selection-begin-paragraph";

  /**
   * The name of the <code>Action</code> that moves the caret to the beginning
   * of the current word, possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionBeginWordAction = "selection-begin-word";

  /**
   * The name of the <code>Action</code> that moves the caret one line down,
   * possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionDownAction = "selection-down";

  /**
   * The name of the <code>Action</code> that moves the caret to the end
   * of the document, possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionEndAction = "selection-end";

  /**
   * The name of the <code>Action</code> that moves the caret to the end
   * of the current line, possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionEndLineAction = "selection-end-line";

  /**
   * The name of the <code>Action</code> that moves the caret to the end
   * of the current paragraph, possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionEndParagraphAction =
    "selection-end-paragraph";

  /**
   * The name of the <code>Action</code> that moves the caret to the end
   * of the current word, possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionEndWordAction = "selection-end-word";

  /**
   * The name of the <code>Action</code> that moves the caret one character
   * forwards, possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionForwardAction = "selection-forward";

  /**
   * The name of the <code>Action</code> that moves the caret to the beginning
   * of the next word, possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionNextWordAction = "selection-next-word";

  /**
   * The name of the <code>Action</code> that moves the caret to the beginning
   * of the previous word, possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionPreviousWordAction =
    "selection-previous-word";

  /**
   * The name of the <code>Action</code> that moves the caret one line up,
   * possibly extending the current selection.
   *
   * @see #getActions()
   */
  public static final String selectionUpAction = "selection-up";

  /**
   * The name of the <code>Action</code> that selects the line around the
   * caret.
   *
   * @see #getActions()
   */
  public static final String selectLineAction = "select-line";

  /**
   * The name of the <code>Action</code> that selects the paragraph around the
   * caret.
   *
   * @see #getActions()
   */
  public static final String selectParagraphAction = "select-paragraph";

  /**
   * The name of the <code>Action</code> that selects the word around the
   * caret.
   *
   * @see #getActions()
   */
  public static final String selectWordAction = "select-word";

  /**
   * The name of the <code>Action</code> that moves the caret one line up.
   *
   * @see #getActions()
   */
  public static final String upAction = "caret-up";

  /**
   * The name of the <code>Action</code> that sets the editor in read-write
   * mode.
   *
   * @see #getActions()
   */
  public static final String writableAction = "set-writable";

  /**
   * Creates a new <code>DefaultEditorKit</code>.
   */
  public DefaultEditorKit()
  {
    // Nothing to do here.
  }

  /**
   * The <code>Action</code>s that are supported by the
   * <code>DefaultEditorKit</code>.
   */
  private static Action[] defaultActions = 
  new Action[] {
    // These classes are public because they are so in the RI.            
    new BeepAction(),
    new CopyAction(),
    new CutAction(),
    new DefaultKeyTypedAction(),
    new InsertBreakAction(),
    new InsertContentAction(),
    new InsertTabAction(),
    new PasteAction(),
    
    // These are (package-)private inner classes.
    new DeleteNextCharAction(),
    new DeletePrevCharAction(),

    new BeginLineAction(),
    new SelectionBeginLineAction(),
    
    new EndLineAction(),
    new SelectionEndLineAction(),
    
    new BackwardAction(),
    new SelectionBackwardAction(),

    new ForwardAction(),
    new SelectionForwardAction(),
    
    new UpAction(),
    new SelectionUpAction(),

    new DownAction(),
    new SelectionDownAction(),
    
    new NextWordAction(),
    new SelectionNextWordAction(),

    new PreviousWordAction(),
    new SelectionPreviousWordAction(),

    new BeginAction(),
    new SelectionBeginAction(),
    
    new EndAction(),
    new SelectionEndAction(),
    
    new BeginWordAction(),
    new SelectionBeginWordAction(),
    
    new EndWordAction(),
    new SelectionEndWordAction(),
    
    new SelectAllAction(),
    new SelectLineAction(),
    new SelectWordAction()
  };

  /**
   * Creates the <code>Caret</code> for this <code>EditorKit</code>. This
   * returns a {@link DefaultCaret} in this case.
   *
   * @return the <code>Caret</code> for this <code>EditorKit</code>
   */
  public Caret createCaret()
  {
    return new DefaultCaret();
  }

  /**
   * Creates the default {@link Document} that this <code>EditorKit</code>
   * supports. This is a {@link PlainDocument} in this case.
   *
   * @return the default {@link Document} that this <code>EditorKit</code>
   *         supports
   */
  public Document createDefaultDocument()
  {
    return new PlainDocument();
  }

  /**
   * Returns the <code>Action</code>s supported by this <code>EditorKit</code>.
   *
   * @return the <code>Action</code>s supported by this <code>EditorKit</code>
   */
  public Action[] getActions()
  {
    return defaultActions;
  }

  /**
   * Returns the content type that this <code>EditorKit</code> supports.
   * The <code>DefaultEditorKit</code> supports the content type
   * <code>text/plain</code>.
   *
   * @return the content type that this <code>EditorKit</code> supports
   */
  public String getContentType()
  {
    return "text/plain";
  }

  /**
   * Returns a {@link ViewFactory} that is able to create {@link View}s for
   * the <code>Element</code>s that are used in this <code>EditorKit</code>'s
   * model. This returns null which lets the UI of the text component supply
   * <code>View</code>s.
   *
   * @return a {@link ViewFactory} that is able to create {@link View}s for
   *         the <code>Element</code>s that are used in this
   *         <code>EditorKit</code>'s model
   */
  public ViewFactory getViewFactory()
  {
    return null;
  }

  /**
   * Reads a document of the supported content type from an {@link InputStream}
   * into the actual {@link Document} object.
   *
   * @param in the stream from which to read the document
   * @param document the document model into which the content is read
   * @param offset the offset inside to document where the content is inserted
   *
   * @throws BadLocationException if <code>offset</code> is an invalid location
   *         inside <code>document</code>
   * @throws IOException if something goes wrong while reading from
   *        <code>in</code>
   */
  public void read(InputStream in, Document document, int offset)
    throws BadLocationException, IOException
  {
    read(new InputStreamReader(in), document, offset);
  }

  /**
   * Reads a document of the supported content type from a {@link Reader}
   * into the actual {@link Document} object.
   *
   * @param in the reader from which to read the document
   * @param document the document model into which the content is read
   * @param offset the offset inside to document where the content is inserted
   *
   * @throws BadLocationException if <code>offset</code> is an invalid location
   *         inside <code>document</code>
   * @throws IOException if something goes wrong while reading from
   *        <code>in</code>
   */
  public void read(Reader in, Document document, int offset)
    throws BadLocationException, IOException
  {
    BufferedReader reader = new BufferedReader(in);

    String line;
    StringBuffer content = new StringBuffer();

    while ((line = reader.readLine()) != null)
      {
	content.append(line);
	content.append("\n");
      }
    
    document.insertString(offset, content.substring(0, content.length() - 1),
			  SimpleAttributeSet.EMPTY);
  }

  /**
   * Writes the <code>Document</code> (or a fragment of the
   * <code>Document</code>) to an {@link OutputStream} in the
   * supported content type format.
   *
   * @param out the stream to write to
   * @param document the document that should be written out
   * @param offset the beginning offset from where to write
   * @param len the length of the fragment to write
   *
   * @throws BadLocationException if <code>offset</code> or
   *         <code>offset + len</code>is an invalid location inside
   *         <code>document</code>
   * @throws IOException if something goes wrong while writing to
   *        <code>out</code>
   */
  public void write(OutputStream out, Document document, int offset, int len)
    throws BadLocationException, IOException
  {
    write(new OutputStreamWriter(out), document, offset, len);
  }

  /**
   * Writes the <code>Document</code> (or a fragment of the
   * <code>Document</code>) to a {@link Writer} in the
   * supported content type format.
   *
   * @param out the writer to write to
   * @param document the document that should be written out
   * @param offset the beginning offset from where to write
   * @param len the length of the fragment to write
   *
   * @throws BadLocationException if <code>offset</code> is an 
   * invalid location inside <code>document</code>.
   * @throws IOException if something goes wrong while writing to
   *        <code>out</code>
   */
  public void write(Writer out, Document document, int offset, int len)
      throws BadLocationException, IOException
  {
    // Throw a BLE if offset is invalid
    if (offset < 0 || offset > document.getLength())
      throw new BadLocationException("Tried to write to invalid location",
                                     offset);

    // If they gave an overly large len, just adjust it
    if (offset + len > document.getLength())
      len = document.getLength() - offset;

    out.write(document.getText(offset, len));
  }
}
