/******************************************************************
* JADE - Java Agent DEvelopment Framework is a framework to develop
* multi-agent systems in compliance with the FIPA specifications.
* Copyright (C) 2002 TILAB S.p.A.
*
* This file is donated by Acklin B.V. to the JADE project.
*
*
* GNU Lesser General Public License
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation,
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
* ***************************************************************/
package jade.tools.gui;
import java.awt.*;
import javax.swing.JComponent;
import javax.swing.text.*;
/**
* Class with several utility functions used by jEdit's syntax colorizing
* subsystem. The original file is written by Slava Pestov (www.gjt.org) and
* altered to fit ACL/SL.
*
* @author Chris van Aart - Acklin B.V., the Netherlands & Slava Pestov
* @created June 14, 2002
*/
public class ACLSyntaxUtilities {
// private members
private ACLSyntaxUtilities() { }
/**
* Returns the default style table. This can be passed to the <code>setStyles()</code>
* method of <code>SyntaxDocument</code> to use the default syntax styles.
*
* @param theComp Description of Parameter
* @return The DefaultSyntaxStyles value
*/
public static ACLSytntaxStyle[] getDefaultSyntaxStyles(JComponent theComp) {
ACLSytntaxStyle[] styles = new ACLSytntaxStyle[ACLToken.ID_COUNT];
styles[ACLToken.COMMENT1] = new ACLSytntaxStyle(Color.black, true, false, theComp);
styles[ACLToken.COMMENT2] = new ACLSytntaxStyle(new Color(0x990033), true, false, theComp);
styles[ACLToken.KEYWORD1] = new ACLSytntaxStyle(Color.darkGray, false, false, theComp);
styles[ACLToken.KEYWORD2] = new ACLSytntaxStyle(new Color(17, 0, 154), false, false, theComp);
styles[ACLToken.KEYWORD3] = new ACLSytntaxStyle(new Color(0x009600), false, false, theComp);
styles[ACLToken.LITERAL1] = new ACLSytntaxStyle(new Color(0x650099), false, false, theComp);
styles[ACLToken.LITERAL2] = new ACLSytntaxStyle(new Color(0x650099), false, false, theComp);
styles[ACLToken.LABEL] = new ACLSytntaxStyle(new Color(0x990033), false, false, theComp);
styles[ACLToken.OPERATOR] = new ACLSytntaxStyle(Color.black, false, true, theComp);
styles[ACLToken.INVALID] = new ACLSytntaxStyle(Color.red, false, false, theComp);
return styles;
}
/**
* Checks if a subregion of a <code>Segment</code> is equal to a string.
*
* @param ignoreCase True if case should be ignored, false otherwise
* @param text The segment
* @param offset The offset into the segment
* @param match The string to match
* @return Description of the Returned Value
*/
public static boolean regionMatches(boolean ignoreCase, Segment text,
int offset, String match) {
int length = offset + match.length();
char[] textArray = text.array;
if (length > text.offset + text.count) {
return false;
}
for (int i = offset, j = 0; i < length; i++, j++) {
char c1 = textArray[i];
char c2 = match.charAt(j);
if (ignoreCase) {
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
}
if (c1 != c2) {
return false;
}
}
return true;
}
/**
* Checks if a subregion of a <code>Segment</code> is equal to a character
* array.
*
* @param ignoreCase True if case should be ignored, false otherwise
* @param text The segment
* @param offset The offset into the segment
* @param match The character array to match
* @return Description of the Returned Value
*/
public static boolean regionMatches(boolean ignoreCase, Segment text,
int offset, char[] match) {
int length = offset + match.length;
char[] textArray = text.array;
if (length > text.offset + text.count) {
return false;
}
for (int i = offset, j = 0; i < length; i++, j++) {
char c1 = textArray[i];
char c2 = match[j];
if (ignoreCase) {
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
}
if (c1 != c2) {
return false;
}
}
return true;
}
/**
* Paints the specified line onto the graphics context. Note that this
* method munges the offset and count values of the segment.
*
* @param line The line segment
* @param tokens The token list for the line
* @param styles The syntax style list
* @param expander The tab expander used to determine tab stops. May be
* null
* @param gfx The graphics context
* @param x The x co-ordinate
* @param y The y co-ordinate
* @return The x co-ordinate, plus the width of the painted string
*/
public static int paintSyntaxLine(Segment line, ACLToken tokens, ACLSytntaxStyle[] styles, TabExpander expander, Graphics gfx,
int x, int y) {
Font defaultFont = gfx.getFont();
Color defaultColor = gfx.getColor();
int offset = 0;
for (; ; ) {
byte id = tokens.id;
if (id == ACLToken.END) {
break;
}
int length = tokens.length;
if (id == ACLToken.NULL) {
if (!defaultColor.equals(gfx.getColor())) {
gfx.setColor(defaultColor);
}
if (!defaultFont.equals(gfx.getFont())) {
gfx.setFont(defaultFont);
}
}
else {
styles[id].setGraphicsFlags(gfx, defaultFont);
}
line.count = length;
x = Utilities.drawTabbedText(line, x, y, gfx, expander, 0);
line.offset += length;
offset += length;
tokens = tokens.next;
}
return x;
}
}
// ***EOF***