blob: 5cdc49c9ec3666ee314819a123f01fc8f779b700 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Jens Lukowski/Innoopract - initial renaming/restructuring
*
*******************************************************************************/
package org.eclipse.wst.sse.ui;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.text.IFindReplaceTarget;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.wst.sse.core.IStructuredModel;
import org.eclipse.wst.sse.core.text.IStructuredDocument;
import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.text.ITextRegion;
import org.eclipse.wst.sse.core.text.ITextRegionList;
import org.eclipse.wst.sse.ui.extensions.spellcheck.SpellCheckElement;
import org.eclipse.wst.sse.ui.extensions.spellcheck.SpellCheckException;
import org.eclipse.wst.sse.ui.extensions.spellcheck.SpellCheckOptionDialog;
import org.eclipse.wst.sse.ui.extensions.spellcheck.SpellCheckSelectionManager;
import org.eclipse.wst.sse.ui.extensions.spellcheck.SpellCheckTarget;
import org.eclipse.wst.sse.ui.extensions.spellcheck.SpellChecker;
import org.eclipse.wst.sse.ui.internal.SSEUIPlugin;
import org.eclipse.wst.sse.ui.util.Assert;
/**
* SpellCheckTargetImpl
*/
public class SpellCheckTargetImpl implements SpellCheckTarget {
public static class EditorSpellCheckException extends SpellCheckException {
/**
* Comment for <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 1L;
EditorSpellCheckException(String msg) {
super(msg);
}
public IStatus getStatus() {
return new Status(IStatus.ERROR, SSEUIPlugin.ID, 0, getMessage(), this);
}
}
public static final String ID = "spellchecktarget"; //$NON-NLS-1$
private SpellChecker checker;
private StructuredTextEditor editor;
private IFindReplaceTarget target;
public SpellCheckTargetImpl() {
super();
}
/**
* @see ISpellCheckTarget#beginRecording()
*/
public void beginRecording(Object requester, String label) {
if (editor == null)
return;
IStructuredModel model = editor.getModel();
if (model == null)
return;
model.beginRecording(requester, label);
}
/**
* @see ISpellCheckTarget#canPerformChange()
*/
public boolean canPerformChange() {
if (editor == null || checker == null || target == null)
return false;
//return target.isEditable() && editor.isEditable() &&
// !editor.isEditorInputReadOnly();
return target.isEditable() && editor.isEditable();
}
/**
* @see ISpellCheckTarget#canPerformChangeAll()
*/
public boolean canPerformChangeAll() {
return canPerformChange();
}
/**
* @see ISpellCheckTarget#canPerformIgnore()
*/
public boolean canPerformIgnore() {
return (editor != null && checker != null ? true : false);
}
/**
* @see ISpellCheckTarget#canPerformIgnoreAll()
*/
public boolean canPerformIgnoreAll() {
return (editor != null && checker != null ? true : false);
}
/**
* @see ISpellCheckTarget#canPerformSpellCheck()
*/
public boolean canPerformSpellCheck() {
return (editor != null && checker != null ? true : false);
}
/**
* @see ISpellCheckTarget#endRecording()
*/
public void endRecording(Object requester) {
if (editor == null)
return;
IStructuredModel model = editor.getModel();
if (model == null)
return;
model.endRecording(requester);
}
/**
* @see ISpellCheckTarget#findAndSelect(int, String)
*/
public int findAndSelect(int pos, String find) {
return (target != null ? target.findAndSelect(pos, find, true, true, true) : -1);
}
/**
* @see ISpellCheckTarget#getAndSelectNextMisspelledElement(boolean)
*/
public SpellCheckElement getAndSelectNextMisspelledElement(boolean init) throws SpellCheckException {
if (checker == null || editor == null || target == null)
return null;
IStructuredModel sm = editor.getModel();
IStructuredDocument fm = sm.getStructuredDocument();
int start;
if (init) {
start = 0;
} else {
Point pt = target.getSelection();
start = pt.x + pt.y;
}
IStructuredDocumentRegion node = fm.getRegionAtCharacterOffset(start);
if (node == null) {
return null;
}
ITextRegion startRegion = node.getRegionAtCharacterOffset(start);
if (startRegion == null) {
return null;
}
boolean skip = true;
while (node != null) {
ITextRegionList regions = node.getRegions();
int size = regions.size();
for (int i = 0; i < size; ++i) {
ITextRegion r = regions.get(i);
if (skip && startRegion.equals(r)) {
skip = false;
}
if (skip == false) {
if (isValidType(r.getType())) {
String text;
if (start > node.getStartOffset(r)) {
text = node.getText(r);
int offset = start - node.getStartOffset(r);
for (; offset < text.length(); ++offset) {
if (!Character.isLetterOrDigit(text.charAt(offset - 1))) {
break;
}
}
text = text.substring(offset);
} else {
text = node.getText(r);
}
SpellCheckElement[] elms = checker.createSingleWords(text);
if (elms != null) {
for (int j = 0; j < elms.length; ++j) {
SpellCheckElement element = checker.verifySpell(elms[j]);
if (element.isSpellError()) {
target.findAndSelect(start, element.getString(), true, true, true);
return element;
}
}
}
}
}
}
node = node.getNext();
}
return null;
}
/**
* @see ISpellCheckTarget#getOptionDialog()
*/
public SpellCheckOptionDialog getOptionDialog() {
return null;
}
/**
* @see ISpellCheckTarget#getSpellCheckSelectionManager()
*/
public SpellCheckSelectionManager getSpellCheckSelectionManager() {
if ((editor == null) || !(editor.getViewerSelectionManager() instanceof SpellCheckSelectionManager))
return null;
return (SpellCheckSelectionManager) editor.getViewerSelectionManager();
}
/**
*/
protected boolean isValidType(String type) {
return false;
}
/**
* @see ISpellCheckTarget#replaceSelection(String)
*/
public void replaceSelection(String text, Shell shell) throws SpellCheckException {
if (target == null)
return;
IStatus status = editor.validateEdit(shell);
if (!status.isOK()) {
throw new EditorSpellCheckException(status.getMessage());
}
target.replaceSelection(text);
}
/**
* @see ISpellCheckTarget#setSpellChecker(ISpellChecker)
*/
public void setSpellChecker(SpellChecker checker) {
this.checker = checker;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.sse.ui.extensions.spellcheck.SpellCheckTarget#setTextEditor(org.eclipse.ui.texteditor.ITextEditor)
*/
public void setTextEditor(ITextEditor editor) {
Assert.isTrue(editor instanceof StructuredTextEditor);
this.editor = (StructuredTextEditor) editor;
target = (IFindReplaceTarget) editor.getAdapter(IFindReplaceTarget.class);
}
}