/* Jazzy - a Java library for Spell Checking Copyright (C) 2001 Mindaugas Idzelis Full text of license can be found in LICENSE.txt 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; either version 2.1 of the License, or (at your option) any later version. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package com.swabunga.spell.swing; import java.awt.Color; import java.util.StringTokenizer; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultStyledDocument; import javax.swing.text.Style; import javax.swing.text.StyleConstants; import javax.swing.text.StyleContext; import com.swabunga.spell.engine.SpellDictionary; /** * @author Stig Tanggaard * * */ public class SpellCheckedDocument extends DefaultStyledDocument { public static final String ERROR_STYLE = "errorstyle"; Style errorstyle; Style normalstyle; static AttributeSet normal; int checkoffset, checkend; String checkingline; static SpellDictionary dictionary; boolean checkspelling = false; public SpellCheckedDocument(SpellDictionary dictionary) { super(); SpellCheckedDocument.dictionary = dictionary; // StyleContext context = StyleContext.getDefaultStyleContext(); Style def = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE); normal = addStyle("normal", def); errorstyle = addStyle(ERROR_STYLE, def); StyleConstants.setForeground(errorstyle, Color.red); StyleConstants.setUnderline(errorstyle, true); } public void checkSpelling() { if (dictionary != null) { int start = 0; int end = getLength(); try { String text = getText(start, end - start); // System.out.println(text); checkoffset = text.indexOf(" "); if (checkoffset == -1) { return; } checkend = text.lastIndexOf(" "); if (checkend == -1) { return; } if (checkoffset == checkend) { return; } checkoffset += 1; checkingline = text.substring(checkoffset, checkend); if (checkingline == null) { return; } // System.out.println(":" + checkingline + ":"); checkoffset += start; checkend += start; setCharacterAttributes(checkoffset, checkend - checkoffset, normal, true); // System.out.println("" + checkoffset + ":" + (checkend - checkoffset)); StringTokenizer token = new StringTokenizer(checkingline, " "); // errors = new Vector(); while (token.hasMoreTokens()) { String tok = token.nextToken(); tok = clean(tok); if (tok.indexOf("\n") != -1) { String t1 = tok.substring(0, tok.indexOf("\n")); String t2 = tok.substring(tok.indexOf("\n") + 1); if (!dictionary.isCorrect(t1)) { setCharacterAttributes(checkingline.indexOf(t1) + checkoffset, t1.length(), errorstyle, false); } if (!dictionary.isCorrect(t2)) { setCharacterAttributes(checkingline.indexOf(t2) + checkoffset, t2.length(), errorstyle, false); } } else if (tok.indexOf("/") != -1) { String t1 = tok.substring(0, tok.indexOf("/")); String t2 = tok.substring(tok.indexOf("/") + 1); if (!dictionary.isCorrect(t1)) { setCharacterAttributes(checkingline.indexOf(t1) + checkoffset, t1.length(), errorstyle, false); } if (!dictionary.isCorrect(t2)) { setCharacterAttributes(checkingline.indexOf(t2) + checkoffset, t2.length(), errorstyle, false); } } else if (!dictionary.isCorrect(tok)) { // System.out.println(tok + tok.length()); setCharacterAttributes(checkingline.indexOf(tok) + checkoffset, tok.length(), errorstyle, false); } } // setAttributes(a, errorstyle); } catch (BadLocationException f) { } } } public void setCheckSpelling(boolean check) { if (!checkspelling) { checkSpelling(); } checkspelling = check; } @Override public void insertString(int offset, String string, AttributeSet a) throws BadLocationException { // if(normal == null) normal = a; super.insertString(offset, string, normal); if (!checkspelling) { return; } if (dictionary != null) { int start = offset - 30; int end = offset + 30; if (start < 0) { start = 0; } if (end > getLength()) { end = getLength(); } try { String text = getText(start, end - start); // System.out.println(text); checkoffset = text.indexOf(" "); if (checkoffset == -1) { return; } checkend = text.lastIndexOf(" "); if (checkend == -1) { return; } if (checkoffset == checkend) { return; } checkoffset += 1; checkingline = text.substring(checkoffset, checkend); if (checkingline == null) { return; } // System.out.println(":" + checkingline + ":"); checkoffset += start; checkend += start; setCharacterAttributes(checkoffset, checkend - checkoffset, normal, true); // System.out.println("" + checkoffset + ":" + (checkend - checkoffset)); StringTokenizer token = new StringTokenizer(checkingline, " "); // errors = new Vector(); while (token.hasMoreTokens()) { String tok = token.nextToken(); tok = clean(tok); if (tok.indexOf("\n") != -1) { String t1 = tok.substring(0, tok.indexOf("\n")); String t2 = tok.substring(tok.indexOf("\n") + 1); if (!dictionary.isCorrect(t1)) { setCharacterAttributes(checkingline.indexOf(t1) + checkoffset, t1.length(), errorstyle, false); } if (!dictionary.isCorrect(t2)) { setCharacterAttributes(checkingline.indexOf(t2) + checkoffset, t2.length(), errorstyle, false); } } else if (tok.indexOf("/") != -1) { String t1 = tok.substring(0, tok.indexOf("/")); String t2 = tok.substring(tok.indexOf("/") + 1); if (!dictionary.isCorrect(t1)) { setCharacterAttributes(checkingline.indexOf(t1) + checkoffset, t1.length(), errorstyle, false); } if (!dictionary.isCorrect(t2)) { setCharacterAttributes(checkingline.indexOf(t2) + checkoffset, t2.length(), errorstyle, false); } } else if (!dictionary.isCorrect(tok)) { System.out.println(tok + tok.length()); setCharacterAttributes(checkingline.indexOf(tok) + checkoffset, tok.length(), errorstyle, false); } } // setAttributes(a, errorstyle); } catch (BadLocationException f) { } } } @Override public void remove(int offset, int len) throws BadLocationException { super.remove(offset, len); if (!checkspelling) { return; } if (dictionary != null) { int start = offset - 30; int end = offset + 30; if (start < 0) { start = 0; } if (end > getLength()) { end = getLength(); } try { String text = getText(start, end - start); // System.out.println(text); checkoffset = text.indexOf(" "); if (checkoffset == -1) { return; } checkend = text.lastIndexOf(" "); if (checkend == -1) { return; } if (checkoffset == checkend) { return; } checkoffset += 1; checkingline = text.substring(checkoffset, checkend); if (checkingline == null) { return; } // System.out.println(":" + checkingline + ":"); checkoffset += start; checkend += start; setCharacterAttributes(checkoffset, checkend - checkoffset, normal, true); // System.out.println("" + checkoffset + ":" + (checkend - checkoffset)); StringTokenizer token = new StringTokenizer(checkingline, " "); // errors = new Vector(); while (token.hasMoreTokens()) { String tok = token.nextToken(); tok = clean(tok); if (tok.indexOf("\n") != -1) { String t1 = tok.substring(0, tok.indexOf("\n")); String t2 = tok.substring(tok.indexOf("\n") + 1); if (!dictionary.isCorrect(t1)) { setCharacterAttributes(checkingline.indexOf(t1) + checkoffset, t1.length(), errorstyle, false); } if (!dictionary.isCorrect(t2)) { setCharacterAttributes(checkingline.indexOf(t2) + checkoffset, t2.length(), errorstyle, false); } } else if (!dictionary.isCorrect(tok)) { // System.out.println(tok + tok.length()); setCharacterAttributes(checkingline.indexOf(tok) + checkoffset, tok.length(), errorstyle, false); } } // setAttributes(a, errorstyle); } catch (BadLocationException f) { } } } public String clean(String word) { char[] chars = word.toCharArray(); // String wordd = ""; // if(chars.length > 0) int index = chars.length - 1; while (!Character.isLetterOrDigit(chars[index]) && index > 0) { // System.out.println("isocontrol " + word); index--; } word = word.substring(0, index + 1); if (word.endsWith(",") || word.endsWith(";") || word.endsWith(".") || word.endsWith("\n") || word.endsWith("?") || word.endsWith("!")) { return word.substring(0, word.length() - 1); } index = 0; chars = word.toCharArray(); while (!Character.isLetterOrDigit(chars[index]) && index < chars.length - 1) { // System.out.println("isocontrol " + word); index++; } word = word.substring(index); return word; } public void checkSplittedWords(String divider, String line) { } }