Package de.sebastianbenz.task.ui.editor.spelling

Source Code of de.sebastianbenz.task.ui.editor.spelling.TaskSpellingReconcileStrategy$SpellingProblemCollector

package de.sebastianbenz.task.ui.editor.spelling;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.ISynchronizable;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.IAnnotationModelExtension;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.ui.texteditor.spelling.ISpellingProblemCollector;
import org.eclipse.ui.texteditor.spelling.SpellingAnnotation;
import org.eclipse.ui.texteditor.spelling.SpellingProblem;
import org.eclipse.ui.texteditor.spelling.SpellingReconcileStrategy;
import org.eclipse.ui.texteditor.spelling.SpellingService;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.inject.Inject;

import de.sebastianbenz.task.ui.editor.TaskTokenTypeToPartitionTypeMapper;
import de.sebastianbenz.task.ui.internal.TaskActivator;
import de.sebastianbenz.task.ui.preferences.TaskPreferenceConstants;

public class TaskSpellingReconcileStrategy extends SpellingReconcileStrategy {

  /*
   * copied from org.eclipse.ui.texteditor.spelling.SpellingReconcileStrategy.SpellingProblemCollector but ignores code blocks
   */
  private class SpellingProblemCollector implements ISpellingProblemCollector {

    /** Annotation model. */
    private IAnnotationModel fAnnotationModel;

    /** Annotations to add. */
    private Map<SpellingAnnotation, Position> fAddAnnotations;

    /** Lock object for modifying the annotations. */
    private Object fLockObject;

    /**
     * Initializes this collector with the given annotation model.
     *
     * @param annotationModel the annotation model
     */
    public SpellingProblemCollector(IAnnotationModel annotationModel) {
      Assert.isLegal(annotationModel != null);
      fAnnotationModel= annotationModel;
      if (fAnnotationModel instanceof ISynchronizable)
        fLockObject= ((ISynchronizable)fAnnotationModel).getLockObject();
      else
        fLockObject= fAnnotationModel;
    }

    /*
     * @see org.eclipse.ui.texteditor.spelling.ISpellingProblemCollector#accept(org.eclipse.ui.texteditor.spelling.SpellingProblem)
     */
    public void accept(SpellingProblem problem) {
      try {
        if(!TaskActivator.getInstance().getPreferenceStore().getBoolean(TaskPreferenceConstants.SPELL_CHECKING)){
          return;
        }
        String contentType = getDocument().getContentType(problem.getOffset());
        if(TaskTokenTypeToPartitionTypeMapper.CODE_PARTITION.equals(contentType)){
          return;
        }
      } catch (BadLocationException e) {
        // ignore
      }
      fAddAnnotations.put(new SpellingAnnotation(problem), new Position(problem.getOffset(), problem.getLength()));
    }

    /*
     * @see org.eclipse.ui.texteditor.spelling.ISpellingProblemCollector#beginCollecting()
     */
    public void beginCollecting() {
      fAddAnnotations= Maps.newHashMap();
    }

    /*
     * @see org.eclipse.ui.texteditor.spelling.ISpellingProblemCollector#endCollecting()
     */
    public void endCollecting() {

      List<Object> toRemove= Lists.newArrayList();

      synchronized (fLockObject) {
        Iterator<?> iter= fAnnotationModel.getAnnotationIterator();
        while (iter.hasNext()) {
          Annotation annotation= (Annotation)iter.next();
          if (SpellingAnnotation.TYPE.equals(annotation.getType()))
            toRemove.add(annotation);
        }
        Annotation[] annotationsToRemove= (Annotation[])toRemove.toArray(new Annotation[toRemove.size()]);

        if (fAnnotationModel instanceof IAnnotationModelExtension)
          ((IAnnotationModelExtension)fAnnotationModel).replaceAnnotations(annotationsToRemove, fAddAnnotations);
        else {
          for (int i= 0; i < annotationsToRemove.length; i++)
            fAnnotationModel.removeAnnotation(annotationsToRemove[i]);
          for (iter= fAddAnnotations.keySet().iterator(); iter.hasNext();) {
            Annotation annotation= (Annotation)iter.next();
            fAnnotationModel.addAnnotation(annotation, (Position)fAddAnnotations.get(annotation));
          }
        }
      }

      fAddAnnotations= null;
    }
  }
 
 
  @Inject
  public TaskSpellingReconcileStrategy(ISourceViewer viewer,
      SpellingService spellingService) {
    super(viewer, spellingService);
  }
 
  @Override
  protected ISpellingProblemCollector createSpellingProblemCollector() {
    IAnnotationModel model= getAnnotationModel();
    if (model == null)
      return null;
    return new SpellingProblemCollector(getAnnotationModel());
  }

 
}
TOP

Related Classes of de.sebastianbenz.task.ui.editor.spelling.TaskSpellingReconcileStrategy$SpellingProblemCollector

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.