⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 textutilities.java

📁 报表设计软件,很好的
💻 JAVA
字号:
package org.jfree.designer.text.jedit;

/*
 * TextUtilities.java - Utility functions used by the text area classes
 * Copyright (C) 1999 Slava Pestov
 *
 * You may use and modify this package for any purpose. Redistribution is
 * permitted, in both source and binary form, provided that this notice
 * remains intact in all source distributions of this package.
 */

import javax.swing.text.BadLocationException;
import javax.swing.text.Document;

/**
 * Class with several utility functions used by the text area component.
 *
 * @author Slava Pestov
 * @version $Id: TextUtilities.java,v 1.2 2004/04/20 18:54:52 taqua Exp $
 */
public final class TextUtilities
{
  /**
   * Returns the offset of the bracket matching the one at the specified offset of the
   * document, or -1 if the bracket is unmatched (or if the character is not a bracket).
   *
   * @param doc    The document
   * @param offset The offset
   * @throws javax.swing.text.BadLocationException
   *          If an out-of-bounds access was attempted on the document text
   */
  public static int findMatchingBracket (final Document doc, int offset)
          throws BadLocationException
  {
    if (doc.getLength() == 0)
    {
      return -1;
    }
    final char c = doc.getText(offset, 1).charAt(0);
    final char cprime; // c` - corresponding character
    final boolean direction; // true = back, false = forward

    switch (c)
    {
      case '(':
        cprime = ')';
        direction = false;
        break;
      case ')':
        cprime = '(';
        direction = true;
        break;
      case '[':
        cprime = ']';
        direction = false;
        break;
      case ']':
        cprime = '[';
        direction = true;
        break;
      case '{':
        cprime = '}';
        direction = false;
        break;
      case '}':
        cprime = '{';
        direction = true;
        break;
      default:
        return -1;
    }

    int count;

    // How to merge these two cases is left as an exercise
    // for the reader.

    // Go back or forward
    if (direction)
    {
      // Count is 1 initially because we have already
      // `found' one closing bracket
      count = 1;

      // Get text[0,offset-1];
      final String text = doc.getText(0, offset);

      // Scan backwards
      for (int i = offset - 1; i >= 0; i--)
      {
        // If text[i] == c, we have found another
        // closing bracket, therefore we will need
        // two opening brackets to complete the
        // match.
        final char x = text.charAt(i);
        if (x == c)
        {
          count++;
        }

        // If text[i] == cprime, we have found a
        // opening bracket, so we return i if
        // --count == 0
        else if (x == cprime)
        {
          if (--count == 0)
          {
            return i;
          }
        }
      }
    }
    else
    {
      // Count is 1 initially because we have already
      // `found' one opening bracket
      count = 1;

      // So we don't have to + 1 in every loop
      offset++;

      // Number of characters to check
      final int len = doc.getLength() - offset;

      // Get text[offset+1,len];
      final String text = doc.getText(offset, len);

      // Scan forwards
      for (int i = 0; i < len; i++)
      {
        // If text[i] == c, we have found another
        // opening bracket, therefore we will need
        // two closing brackets to complete the
        // match.
        final char x = text.charAt(i);

        if (x == c)
        {
          count++;
        }

        // If text[i] == cprime, we have found an
        // closing bracket, so we return i if
        // --count == 0
        else if (x == cprime)
        {
          if (--count == 0)
          {
            return i + offset;
          }
        }
      }
    }

    // Nothing found
    return -1;
  }

  /**
   * Locates the start of the word at the specified position.
   *
   * @param line The text
   * @param pos  The position
   */
  public static int findWordStart (final String line, final int pos, String noWordSep)
  {
    char ch = line.charAt(pos - 1);

    if (noWordSep == null)
    {
      noWordSep = "";
    }
    final boolean selectNoLetter = (!Character.isLetterOrDigit(ch)
            && noWordSep.indexOf(ch) == -1);

    int wordStart = 0;
    for (int i = pos - 1; i >= 0; i--)
    {
      ch = line.charAt(i);
      if (selectNoLetter ^ (!Character.isLetterOrDigit(ch) &&
              noWordSep.indexOf(ch) == -1))
      {
        wordStart = i + 1;
        break;
      }
    }

    return wordStart;
  }

  /**
   * Locates the end of the word at the specified position.
   *
   * @param line The text
   * @param pos  The position
   */
  public static int findWordEnd (final String line, final int pos, String noWordSep)
  {
    char ch = line.charAt(pos);

    if (noWordSep == null)
    {
      noWordSep = "";
    }
    final boolean selectNoLetter = (!Character.isLetterOrDigit(ch)
            && noWordSep.indexOf(ch) == -1);

    int wordEnd = line.length();
    for (int i = pos; i < line.length(); i++)
    {
      ch = line.charAt(i);
      if (selectNoLetter ^ (!Character.isLetterOrDigit(ch) &&
              noWordSep.indexOf(ch) == -1))
      {
        wordEnd = i;
        break;
      }
    }
    return wordEnd;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -