alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Jazzy example source code file (AutoSpellCheckHandler.java)

This example Jazzy source code file (AutoSpellCheckHandler.java) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Jazzy tags/keywords

autospellcheckhandler, awt, documentwordtokenizer, documentwordtokenizer, event, gui, ignorealllistener, jmenuitem, markupspellingall, replacelistener, replacelistener, runnable, runnable, simpleattributeset, spellcheckchange, styleddocument, styleddocument, swing, text, util

The Jazzy AutoSpellCheckHandler.java source code

/*
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.autospell;

import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import com.swabunga.spell.event.*;
import com.swabunga.spell.engine.*;

/**
 * This class handles the actual autospelling by implementing some listeners
 * on the spellchecked JEditorPane and Document.
 * 
 * @author Robert Gustavsson (robert@lindesign.se)
 *
 */
public class AutoSpellCheckHandler extends MouseAdapter implements DocumentListener, 
																   AutoSpellConstants{

	private SpellChecker			sCheck=null;
	private Configuration 			config = Configuration.getConfiguration();
	private ResourceBundle			messages=null;
	
	public AutoSpellCheckHandler(SpellChecker sc){
		sCheck=sc;
	}
	
	public AutoSpellCheckHandler(SpellChecker sc, ResourceBundle rs){
		this(sc);
		messages=rs;
	}
	
	public void addJEditorPane(JEditorPane pane){
		StyledDocument doc=(StyledDocument)pane.getDocument();
		markupSpelling(doc, 0, doc.getLength()-1);
		doc.addDocumentListener(this);
		pane.addMouseListener(this);
	}
	
	public void removeJEditorPane(JEditorPane pane){
		Document doc=pane.getDocument();
		pane.removeMouseListener(this);
		doc.removeDocumentListener(this);
	}
	
	private void markupSpelling(StyledDocument doc, int start, int end){
		int						wordStart=-1,
								wordEnd=-1;
		String					word;
		DocumentWordTokenizer	docTok;
		Segment					seg=new Segment();
		
		docTok=new DocumentWordTokenizer(doc);
		if(start>0){
			docTok.posStartFullWordFrom(start);
		}
		
		while(docTok.hasMoreWords() && docTok.getCurrentWordPosition()<=end){
			word=docTok.nextWord();
			wordStart=docTok.getCurrentWordPosition();
			
			// Mark non word parts (spaces) as correct
			if(wordEnd!=-1){
				//System.out.println("Space:"+wordEnd+","+wordStart);
				markAsCorrect(doc, wordEnd, wordStart);
			}
			wordEnd=docTok.getCurrentWordEnd();
			
			if(wordEnd>doc.getLength())
				wordEnd=doc.getLength()-1;
			if(wordStart>=wordEnd)
				continue;
			//System.out.println("Word:"+wordStart+","+wordEnd);
			if(sCheck.isCorrect(word) || sCheck.isIgnored(word)){
				markAsCorrect(doc, wordStart, wordEnd);
			}else{
				markAsMisspelled(doc, wordStart, wordEnd);
			}
		}
		// Mark the rest (if any) as correct.
		if(wordEnd<end && wordEnd!=-1){
			//System.out.println("End:"+wordEnd+","+end);
			markAsCorrect(doc, wordEnd, end);
		}
	}
	
	private void markAsMisspelled(StyledDocument doc, int start, int end){
		SimpleAttributeSet attr;
		attr=new SimpleAttributeSet();
		attr.addAttribute(wordMisspelled, wordMisspelledTrue);
		doc.setCharacterAttributes(start, end-start, attr, false);
	}
	
	private void markAsCorrect(StyledDocument doc, int start, int end){
		SimpleAttributeSet attr;
		attr=new SimpleAttributeSet(doc.getCharacterElement((start+end)/2).getAttributes());
		attr.removeAttribute(wordMisspelled);
		if(end>=start)
			doc.setCharacterAttributes(start, end-start, attr, true);
	}
	
	private void handleDocumentChange(DocumentEvent evt){
		Element			curElem,
						parElem;
		StyledDocument	doc;
		int				start,
						end;
		
		if(evt.getDocument() instanceof StyledDocument){
			doc=(StyledDocument)evt.getDocument();
			curElem=doc.getCharacterElement(evt.getOffset());
			parElem=curElem.getParentElement();
			if(parElem!=null){
				start=parElem.getStartOffset();
				end=parElem.getEndOffset();
			}else{
				start=curElem.getStartOffset();
				end=curElem.getEndOffset();
			}
			//System.out.println("curElem: "+curElem.getStartOffset()+", "+curElem.getEndOffset());
			//System.out.println("parElem: "+parElem.getStartOffset()+", "+parElem.getEndOffset());
			//System.out.println("change: "+start+", "+end);
			markupSpelling(doc,start, end);
		}		
	}
	
	private void showSuggestionPopup(JEditorPane pane, Point p){
		StyledDocument 			doc;
		JMenuItem 				item;
		AttributeSet			attr;
		int 					pos = pane.viewToModel(p);
		DocumentWordTokenizer	docTok;
		String					word;
		java.util.List			suggestions;
		JPopupMenu 				popup;
		ReplaceListener			repList;
		
		if (pos >= 0) {
			doc=(StyledDocument)pane.getDocument();
			attr=doc.getCharacterElement(pos).getAttributes();
			if(attr.containsAttribute(wordMisspelled, wordMisspelledTrue)){
				docTok=new DocumentWordTokenizer(doc);
				docTok.posStartFullWordFrom(pos);
				word=docTok.nextWord();
				suggestions=sCheck.getSuggestions(word, config.getInteger(Configuration.SPELL_THRESHOLD));
				
				popup=new JPopupMenu();
				repList=new ReplaceListener(docTok);
				for(int i=0;i<suggestions.size();i++) {
					com.swabunga.spell.engine.Word w = (com.swabunga.spell.engine.Word) suggestions.get(i);
					item = new JMenuItem(w.getWord());
					item.setActionCommand(w.getWord());
					item.addActionListener(repList);
					popup.add(item);
				}
				popup.addSeparator();
				item = new JMenuItem();
				if(messages!=null)
					item.setText(messages.getString("IGNOREALL"));
				else
					item.setText("Ignore All");
				item.setActionCommand(word);
				item.addActionListener(new IgnoreAllListener(doc));
				popup.add(item);
				item = new JMenuItem();
				if(messages!=null)
					item.setText(messages.getString("ADD"));
				else
					item.setText("Add word to wordlist");
				item.setActionCommand(word);
				item.addActionListener(new AddToDictListener(doc));
				popup.add(item);
				popup.show(pane, p.x, p.y);	
			}
		}
	}
	
	// DocumentListener implementation
	// ------------------------------------------------------------------
	public void changedUpdate(DocumentEvent evt){
	}
	
	public void insertUpdate(DocumentEvent evt){
		Runnable r=new SpellCheckChange(evt);
		SwingUtilities.invokeLater(r);
	}
	
	public void removeUpdate(DocumentEvent evt){
		Runnable r=new SpellCheckChange(evt);
		SwingUtilities.invokeLater(r);
	}
	
	// MouseListener implementation
	// ------------------------------------------------------------------
	public void mouseReleased(MouseEvent evt){
		JEditorPane pane;
		if(!(evt.getComponent() instanceof JEditorPane))
			return;
		
		if(evt.isPopupTrigger()){
			pane=(JEditorPane)evt.getComponent();
			if(pane.isEditable())
				showSuggestionPopup(pane, new Point(evt.getX(), evt.getY()));
		}
	}
	
	// INNER CLASSES
	// ------------------------------------------------------------------
	private class SpellCheckChange implements Runnable{
	
		private DocumentEvent evt;
		
		public SpellCheckChange(DocumentEvent evt){
			this.evt=evt;
		}
		
		public void run(){
			handleDocumentChange(evt);
		}
		
	}
	
	private class ReplaceListener implements ActionListener{
		
		DocumentWordTokenizer	tok;
		
		public ReplaceListener(DocumentWordTokenizer tok){
			this.tok=tok;
		}
		
		public void actionPerformed(ActionEvent evt){
			tok.replaceWord(evt.getActionCommand());
		}
	}
	
	private class AddToDictListener implements ActionListener{
		
		private StyledDocument	doc;
		
		public AddToDictListener(StyledDocument doc){
			this.doc=doc;
		}
		
		public void actionPerformed(ActionEvent evt){
			sCheck.addToDictionary(evt.getActionCommand());
			Runnable r=new MarkUpSpellingAll(doc);
			SwingUtilities.invokeLater(r);
		}
	}
	
	private class IgnoreAllListener implements ActionListener{
		
		private StyledDocument	doc;
		
		public IgnoreAllListener(StyledDocument doc){
			this.doc=doc;
		}
		
		public void actionPerformed(ActionEvent evt){
			sCheck.ignoreAll(evt.getActionCommand());
			Runnable r=new MarkUpSpellingAll(doc);
			SwingUtilities.invokeLater(r);
		}
	}
	
	private class MarkUpSpellingAll implements Runnable{
		
		private StyledDocument doc;
		
		public MarkUpSpellingAll(StyledDocument doc){
			this.doc=doc;
		}
		
		public void run(){
			markupSpelling(doc,0,doc.getLength());
		}
	}
	
}

Other Jazzy examples (source code examples)

Here is a short list of links related to this Jazzy AutoSpellCheckHandler.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.