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

📄 syntaxhighlightingcolorscheme.java

📁 具有不同语法高亮的编辑器实例
💻 JAVA
字号:
/*
 * 02/26/2004
 *
 * SyntaxHighlightingColorScheme.java - The set of colors and tokens used by
 * an RSyntaxTextArea to color tokens.
 * Copyright (C) 2004 Robert Futrell
 * email@address.com
 * www.website.com
 *
 * This program 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
 * of the License, or any later version.
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package org.fife.ui.rsyntaxtextarea;

import java.awt.Color;
import java.awt.Font;

import org.fife.RUtilities;

/**
 * The set of colors and styles used by an <code>RSyntaxTextArea</code> to
 * color tokens.
 *
 * @author Robert Futrell
 * @version 1.0
 */
public class SyntaxHighlightingColorScheme {

  public SyntaxScheme[] syntaxSchemes;

      /*****************************************************************************/

  /**
   * Creates a color scheme that either has all color values set to
   * a default value or set to <code>null</code>.
   *
   * @param useDefaults If <code>true</code>, all color values will
   *                    be set to default colors; if <code>false</code>,
   *                    all colors will be initially <code>null</code>.
   */
  public SyntaxHighlightingColorScheme(boolean useDefaults) {

    syntaxSchemes = new SyntaxScheme[Token.NUM_TOKEN_TYPES];

    if (useDefaults) {

      // Colors used by tokens.
      Color commentGreen = new Color(0, 128, 0);
      Color literalNumberPurple = new Color(100, 0, 200);
      Color literalStringPink = new Color(220, 0, 156);
      Color errorYellow = new Color(148, 148, 0);

      // Special fonts.
      /*
          Font commentFont = new Font("Comic Sans MS", Font.ITALIC, 13);
          Font reservedWordFont = new Font("Arial", Font.BOLD, 13);
          Font stringFont = new Font("Fat", Font.PLAIN, 13);
          Font numberFont = new Font("Croobie", Font.PLAIN, 13);
       */
      Font commentFont = new Font("Monospaced", Font.ITALIC, 13);
      Font reservedWordFont = new Font("Monospaced", Font.BOLD, 13);

      syntaxSchemes[Token.COMMENT] = null;
      syntaxSchemes[Token.COMMENT_EOL] = new SyntaxScheme(commentGreen, null,
          commentFont);
      syntaxSchemes[Token.COMMENT_MULTILINE] = new SyntaxScheme(commentGreen, null,
          commentFont);
      syntaxSchemes[Token.COMMENT_DOCUMENTATION] = new SyntaxScheme(new Color(
          164, 0, 0), null, commentFont);
      syntaxSchemes[Token.RESERVED_WORD] = new SyntaxScheme(Color.BLUE, null,
          reservedWordFont);
      syntaxSchemes[Token.FUNCTION] = new SyntaxScheme(new Color(173, 128, 0), null);
      syntaxSchemes[Token.LITERAL] = null;
      syntaxSchemes[Token.LITERAL_BOOLEAN] = new SyntaxScheme(
          literalNumberPurple, null);
      syntaxSchemes[Token.LITERAL_NUMBER_DECIMAL_INT] = new SyntaxScheme(
          literalNumberPurple, null); //, numberFont);
      syntaxSchemes[Token.LITERAL_NUMBER_FLOAT] = new SyntaxScheme(
          literalNumberPurple, null); //, numberFont);
      syntaxSchemes[Token.LITERAL_NUMBER_HEXADECIMAL] = new SyntaxScheme(
          literalNumberPurple, null); //, numberFont);
      syntaxSchemes[Token.LITERAL_STRING_DOUBLE_QUOTE] = new SyntaxScheme(
          literalStringPink, null); //, stringFont);
      syntaxSchemes[Token.LITERAL_CHAR] = new SyntaxScheme(literalStringPink, null);
      syntaxSchemes[Token.LITERAL_BACKQUOTE] = new SyntaxScheme(
          literalStringPink, null);
      syntaxSchemes[Token.DATA_TYPE] = new SyntaxScheme(new Color(0, 128, 128), null);
      syntaxSchemes[Token.VARIABLE] = new SyntaxScheme(new Color(255, 153, 0), null);
      syntaxSchemes[Token.IDENTIFIER] = new SyntaxScheme(Color.BLACK, null);
      syntaxSchemes[Token.WHITESPACE] = new SyntaxScheme(Color.WHITE, null);
      syntaxSchemes[Token.SEPARATOR] = new SyntaxScheme(Color.RED, null);
      syntaxSchemes[Token.OPERATOR] = new SyntaxScheme(new Color(128, 64, 64), null);
      syntaxSchemes[Token.PREPROCESSOR] = new SyntaxScheme(new Color(128, 128,
          128), null);
      syntaxSchemes[Token.ERROR] = null;
      syntaxSchemes[Token.ERROR_IDENTIFIER] = new SyntaxScheme(errorYellow, null);
      syntaxSchemes[Token.ERROR_NUMBER_FORMAT] = new SyntaxScheme(errorYellow, null);
      syntaxSchemes[Token.ERROR_STRING_DOUBLE] = new SyntaxScheme(errorYellow, null);
      syntaxSchemes[Token.ERROR_CHAR] = new SyntaxScheme(errorYellow, null);

    }

  }

      /*****************************************************************************/

  /**
   * Creates a new syntax highlighting color scheme with the same colors
   * as the one passed in.  This will be a deep copy.
   *
   * @param colorScheme The color scheme to copy.
   * @throws NullPointerException if <code>colorScheme</code>
   *         is <code>null</code>.
   */
  public SyntaxHighlightingColorScheme(
      SyntaxHighlightingColorScheme colorScheme) {
    syntaxSchemes = new SyntaxScheme[Token.NUM_TOKEN_TYPES];
    for (int i = 0; i < Token.NUM_TOKEN_TYPES; i++) {
      SyntaxScheme s = colorScheme.syntaxSchemes[i];
      if (s != null) {
        syntaxSchemes[i] = new SyntaxScheme(s.foreground,
                                            s.background,
                                            s.font,
                                            s.underline);
        syntaxSchemes[i].fontMetrics = s.fontMetrics;
      }
    }
  }

      /*****************************************************************************/

  /**
   * Tests whether this color scheme is the same as another color scheme.
   *
   * @param otherScheme The color scheme to compare to.
   * @return <code>true</code> if this color scheme and
   *         <code>otherScheme</code> are the same scheme;
   *         <code>false</code> otherwise.
   */
  public boolean equals(Object otherScheme) {

    if (! (otherScheme instanceof SyntaxHighlightingColorScheme) ||
        otherScheme == null) {
      return false;
    }

    SyntaxScheme[] otherSchemes =
        ( (SyntaxHighlightingColorScheme) otherScheme).syntaxSchemes;

    int length = syntaxSchemes.length;
    for (int i = 0; i < length; i++) {
      if (syntaxSchemes[i] == null) {
        if (otherSchemes[i] != null) {
          return false;
        }
      }
      else if (!syntaxSchemes[i].equals(otherSchemes[i])) {
        return false;
      }
    }
    return true;

  }

      /*****************************************************************************/

  /**
   * Loads a syntax highlighting color scheme from a string created from
   * <code>toCommaSeparatedString</code>.  This method is useful for saving
   * and restoring color schemes.
   *
   * @param string A string generated from
   *               <code>toCommaSeparatedString</code>.
   * @return A color scheme.
   */
  public static SyntaxHighlightingColorScheme loadFromString(String string) {

    SyntaxHighlightingColorScheme scheme =
        new SyntaxHighlightingColorScheme(true);

    try {

      if (string != null) {
        int tokenTypeCount = Token.NUM_TOKEN_TYPES;
        int tokenCount = tokenTypeCount * 7;
        String[] tokens = string.split(",");
        if (tokens.length != tokenCount) {
          throw new Exception(
              "Not enough tokens in packed color scheme- expected " +
              tokenCount + ", found " + tokens.length);
        }
        for (int i = 0; i < tokenTypeCount; i++) {
          int integer = Integer.parseInt(tokens[i * 7]); // == i.
          if (integer != i) {
            throw new Exception("Expected " + (i * 7) + ", found " + integer);
          }
          Color fg = null;
          String temp = tokens[i * 7 + 1];
          fg = "-".equals(temp) ? null :
              RUtilities.getColorFromPacked(Integer.parseInt(temp));
          Color bg = null;
          temp = tokens[i * 7 + 2];
          bg = "-".equals(temp) ? null :
              RUtilities.getColorFromPacked(Integer.parseInt(temp));
          // Check for "true" or "false" since we don't want to
          // accidentally suck in an int representing the next
          // packed color, and any string != "true" means false.
          temp = tokens[i * 7 + 3];
          if (!"t".equals(temp) && !"f".equals(temp)) {
            throw new Exception("Expected 't' or 'f', found " + temp);
          }
          boolean underline = "t".equals(temp) ? true : false;
          Font font = new Font(
              tokens[i * 7 + 4], // family
              Integer.parseInt(tokens[i * 7 + 5]), // style
              Integer.parseInt(tokens[i * 7 + 6])); // size
          scheme.syntaxSchemes[i] = new SyntaxScheme(fg, bg, font, underline);
        }
      }

    }
    catch (Exception e) {
      e.printStackTrace();
    }

    return scheme;

  }

      /*****************************************************************************/

  /**
   * Returns this syntax highlighting scheme as a comma-separated list of
   * values as follows:
   * <ul>
   *   <li>If a color is non-null, it is added as a 24-bit integer
   *      of the form <code>((r<<16) | (g<<8) | (b))</code>; if it is
   *       <code>null</code>, it is added as "<i>-,</i>".
   *   <li>The style (bold/italic) is added as an integer like so:
   *       "<i>family,</i> <i>style,</i> <i>size</i>".
   *   <li>The entire syntax highlighting scheme is thus one long string of
   *       color schemes of the format "<i>i,[fg],[bg],uline,[style]</i>,
   *       where:
   *       <ul>
   *          <li><code>i</code> is the index of the syntax scheme.
   *          <li><i>fg</i> and <i>bg</i> are the foreground and background
   *              colors for the scheme, and may be null (represented by
   *              <code>-</code>).
   *          <li><code>uline</code> is whether or not the font should be
   *              underlined, and is either <code>t</code> or <code>f</code>.
   *          <li><code>style</code> is the <code>family,style,size</code>
   *              triplet described above.
   *       </ul>
   * </ul>
   *
   * @return A string representing the rgb values of the colors.
   * @see org.fife.RUtilities#getPackedColor
   */
  public String toCommaSeparatedString() {

    String retVal = "";

    for (int i = 0; i < Token.NUM_TOKEN_TYPES; i++) {

      retVal += i + ",";

      SyntaxScheme ss = syntaxSchemes[i];
      if (ss == null) { // Only true for i==0 (NULL token)
        retVal += "-,-,f,monospaced," + Font.PLAIN + "," + "13,";
        continue;
      }

      Color c = ss.foreground;
      retVal += c != null ? (RUtilities.getPackedColor(c) + ",") : "-,";
      c = ss.background;
      retVal += c != null ? (RUtilities.getPackedColor(c) + ",") : "-,";

      retVal += ss.underline ? "t," : "f,";

      Font font = ss.font;
      retVal += font.getFamily() + "," + font.getStyle() + "," + font.getSize() +
          ",";

    }

    return retVal.substring(0, retVal.length() - 1); // Take off final ','.

  }

      /*****************************************************************************/

}

⌨️ 快捷键说明

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