content: /*******************************************************************************
   * Copyright (c) 2009 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
   *******************************************************************************/
  
  package org.eclipse.wst.jsdt.internal.ui.text.spelling;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import org.eclipse.core.runtime.CoreException;
  import org.eclipse.core.runtime.NullProgressMonitor;
  import org.eclipse.core.runtime.Platform;
  import org.eclipse.jface.text.IDocument;
  import org.eclipse.jface.text.IRegion;
  import org.eclipse.jface.text.Region;
  import org.eclipse.jface.text.contentassist.ICompletionProposal;
  import org.eclipse.jface.text.contentassist.IContextInformation;
  import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
  import org.eclipse.jface.text.source.ISourceViewer;
  import org.eclipse.swt.graphics.Image;
  import org.eclipse.swt.graphics.Point;
  import org.eclipse.ui.editors.text.EditorsUI;
  import org.eclipse.ui.texteditor.spelling.ISpellingProblemCollector;
  import org.eclipse.ui.texteditor.spelling.SpellingAnnotation;
  import org.eclipse.ui.texteditor.spelling.SpellingContext;
  import org.eclipse.ui.texteditor.spelling.SpellingProblem;
  import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
  import org.eclipse.wst.jsdt.core.JavaScriptCore;
  import org.eclipse.wst.jsdt.internal.core.DocumentAdapter;
  import org.eclipse.wst.jsdt.ui.text.java.IInvocationContext;
  import org.eclipse.wst.jsdt.ui.text.java.IJavaCompletionProposal;
  import org.eclipse.wst.jsdt.ui.text.java.IProblemLocation;
  import org.eclipse.wst.jsdt.ui.text.java.IQuickFixProcessor;
  
  /**
   * Provides a JSDT IQuickFixProcessor for SpellingAnnotations
   */
  public class SpellingQuickFixProcessor implements IQuickFixProcessor {
  	private static class SpellingProposal implements IJavaCompletionProposal {
  		ICompletionProposal fProposal;
  
  		SpellingProposal(ICompletionProposal spellingProposal) {
  			super();
  			fProposal = spellingProposal;
  		}
  
  		/*
  		 * (non-Javadoc)
  		 * 
  		 * @see
  		 * org.eclipse.wst.jsdt.ui.text.java.IJavaCompletionProposal#getRelevance
  		 * ()
  		 */
  		public int getRelevance() {
  			return 50;
  		}
  
  		/*
  		 * (non-Javadoc)
  		 * 
  		 * @see
  		 * org.eclipse.jface.text.contentassist.ICompletionProposal#apply(
  		 * org.eclipse.jface.text.IDocument)
  		 */
  		public void apply(IDocument document) {
  			fProposal.apply(document);
  		}
  
  		/*
  		 * (non-Javadoc)
  		 * 
  		 * @seeorg.eclipse.jface.text.contentassist.ICompletionProposal#
  		 * getAdditionalProposalInfo()
  		 */
  		public String getAdditionalProposalInfo() {
  			return fProposal.getAdditionalProposalInfo();
  		}
  
  		/*
  		 * (non-Javadoc)
  		 * 
  		 * @seeorg.eclipse.jface.text.contentassist.ICompletionProposal#
  		 * getContextInformation()
  		 */
  		public IContextInformation getContextInformation() {
  			return fProposal.getContextInformation();
  		}
  
  		/*
  		 * (non-Javadoc)
  		 * 
  		 * @seeorg.eclipse.jface.text.contentassist.ICompletionProposal#
  		 * getDisplayString()
  		 */
  		public String getDisplayString() {
  			return fProposal.getDisplayString();
  		}
  
  		/*
  		 * (non-Javadoc)
  		 * 
  		 * @see
  		 * org.eclipse.jface.text.contentassist.ICompletionProposal#getImage()
  		 */
  		public Image getImage() {
  			return fProposal.getImage();
  		}
  
  		/*
  		 * (non-Javadoc)
  		 * 
  		 * @see
  		 * org.eclipse.jface.text.contentassist.ICompletionProposal#getSelection
  		 * (org.eclipse.jface.text.IDocument)
  		 */
  		public Point getSelection(IDocument document) {
  			return fProposal.getSelection(document);
  		}
  	}
  
  	static final class SpellingProblemCollector implements ISpellingProblemCollector {
  		IQuickAssistInvocationContext fContext = null;
  
  		SpellingProblemCollector(final IInvocationContext context) {
  			fContext = new IQuickAssistInvocationContext() {
  				public ISourceViewer getSourceViewer() {
  					return null;
  				}
  
  				public int getOffset() {
  					return context.getSelectionOffset();
  				}
  
  				public int getLength() {
  					return context.getSelectionLength();
  				}
  			};
  		}
  
  		private List fProposals = new ArrayList();
  
  		/*
  		 * (non-Javadoc)
  		 * 
  		 * @see
  		 * org.eclipse.ui.texteditor.spelling.ISpellingProblemCollector#accept
  		 * (org.eclipse.ui.texteditor.spelling.SpellingProblem)
  		 */
  		public void accept(SpellingProblem problem) {
  			ICompletionProposal[] proposals = problem.getProposals(fContext);
  			for (int i = 0; i < proposals.length; i++) {
  				fProposals.add(new SpellingProposal(proposals[i]));
  			}
  		}
  
  		/*
  		 * (non-Javadoc)
  		 * 
  		 * @seeorg.eclipse.ui.texteditor.spelling.ISpellingProblemCollector#
  		 * beginCollecting()
  		 */
  		public void beginCollecting() {
  			fProposals.clear();
  		}
  
  		/*
  		 * (non-Javadoc)
  		 * 
  		 * @seeorg.eclipse.ui.texteditor.spelling.ISpellingProblemCollector#
  		 * endCollecting()
  		 */
  		public void endCollecting() {
  		}
  
  		IJavaCompletionProposal[] getProposals() {
  			return (IJavaCompletionProposal[]) fProposals.toArray(new IJavaCompletionProposal[fProposals.size()]);
  		}
  	}
  
  	/**
  	 * 
  	 */
  	public SpellingQuickFixProcessor() {
  	}
  
  	/*
  	 * (non-Javadoc)
  	 * 
  	 * @see
  	 * org.eclipse.wst.jsdt.ui.text.java.IQuickFixProcessor#hasCorrections
  	 * (org.eclipse.wst.jsdt.core.IJavaScriptUnit, int)
  	 */
  	public boolean hasCorrections(IJavaScriptUnit unit, int problemId) {
  		return false;
  	}
  
  	/*
  	 * (non-Javadoc)
  	 * 
  	 * @see
  	 * org.eclipse.wst.jsdt.ui.text.java.IQuickFixProcessor#getCorrections
  	 * (org.eclipse.wst.jsdt.ui.text.java.IInvocationContext,
  	 * org.eclipse.wst.jsdt.ui.text.java.IProblemLocation[])
  	 */
  	public IJavaCompletionProposal[] getCorrections(IInvocationContext context, IProblemLocation[] locations) throws CoreException {
  		List regions = new ArrayList();
  		for (int i = 0; i < locations.length; i++) {
  			if (locations[i].getMarkerType() == SpellingAnnotation.TYPE) {
  				regions.add(new Region(locations[i].getOffset(), locations[i].getLength()));
  			}
  		}
  		SpellingProblemCollector collector = new SpellingProblemCollector(context);
  		if (!regions.isEmpty()) {
  			SpellingContext spellingContext = new SpellingContext();
  			spellingContext.setContentType(Platform.getContentTypeManager().getContentType(JavaScriptCore.JAVA_SOURCE_CONTENT_TYPE));
  			EditorsUI.getSpellingService().check(new DocumentAdapter(context.getCompilationUnit().getBuffer()), (IRegion[]) regions.toArray(new IRegion[regions.size()]), spellingContext, collector, new NullProgressMonitor());
  		}
  		return collector.getProposals();
  	}
  
  }
  