| /******************************************************************************* |
| * Copyright (c) 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 |
| *******************************************************************************/ |
| package org.eclipse.jst.jsp.ui.internal.correction; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.jdt.core.ICompilationUnit; |
| import org.eclipse.jdt.core.compiler.IProblem; |
| import org.eclipse.jdt.internal.ui.javaeditor.IJavaAnnotation; |
| import org.eclipse.jdt.internal.ui.text.correction.AssistContext; |
| import org.eclipse.jdt.internal.ui.text.correction.ProblemLocation; |
| import org.eclipse.jdt.internal.ui.text.correction.QuickFixProcessor; |
| import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; |
| import org.eclipse.jdt.ui.text.java.IProblemLocation; |
| import org.eclipse.jdt.ui.text.java.IQuickAssistProcessor; |
| import org.eclipse.jdt.ui.text.java.IQuickFixProcessor; |
| import org.eclipse.jface.text.Position; |
| import org.eclipse.jface.text.contentassist.ICompletionProposal; |
| import org.eclipse.jface.text.source.Annotation; |
| import org.eclipse.jst.jsp.core.internal.java.IJSPTranslation; |
| import org.eclipse.jst.jsp.core.internal.java.JSPTranslation; |
| import org.eclipse.jst.jsp.core.internal.java.JSPTranslationAdapter; |
| import org.eclipse.ui.texteditor.ITextEditor; |
| import org.eclipse.wst.sse.core.IModelManager; |
| import org.eclipse.wst.sse.core.StructuredModelManager; |
| import org.eclipse.wst.sse.core.exceptions.SourceEditingRuntimeException; |
| import org.eclipse.wst.sse.ui.StructuredTextViewer; |
| import org.eclipse.wst.sse.ui.internal.correction.StructuredCorrectionProcessor; |
| import org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation; |
| import org.eclipse.wst.xml.core.document.XMLDocument; |
| import org.eclipse.wst.xml.core.document.XMLModel; |
| |
| public class CorrectionProcessorJSP extends StructuredCorrectionProcessor { |
| protected IQuickFixProcessor fQuickFixProcessor; |
| protected IQuickAssistProcessor fQuickAssistProcessor; |
| |
| public CorrectionProcessorJSP(ITextEditor editor) { |
| super(editor); |
| } |
| |
| protected IQuickFixProcessor getQuickFixProcessorJSP() { |
| if (fQuickFixProcessor == null) |
| fQuickFixProcessor = new QuickFixProcessor(); |
| |
| return fQuickFixProcessor; |
| } |
| |
| protected IQuickAssistProcessor getQuickAssistProcessorJSP() { |
| if (fQuickAssistProcessor == null) |
| fQuickAssistProcessor = new QuickAssistProcessorJSP(); |
| |
| return fQuickAssistProcessor; |
| } |
| |
| protected void addQuickFixProposals(StructuredTextViewer viewer, ArrayList proposals, int documentOffset) { |
| ArrayList problems = new ArrayList(); |
| Iterator iter = fAnnotationModel.getAnnotationIterator(); |
| while (iter.hasNext()) { |
| Annotation annotation = (Annotation) iter.next(); |
| Position pos = fAnnotationModel.getPosition(annotation); |
| if (documentOffset >= pos.offset && documentOffset <= pos.offset + pos.length) { |
| IQuickFixProcessor processor = getQuickFixProcessorJSP(); |
| |
| XMLModel xmlModel = (XMLModel) getModelManager().getExistingModelForRead(viewer.getDocument()); |
| XMLDocument xmlDoc = xmlModel.getDocument(); |
| xmlModel.releaseFromRead(); |
| JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) xmlDoc.getAdapterFor(IJSPTranslation.class); |
| if (translationAdapter != null) { |
| JSPTranslation translation = translationAdapter.getJSPTranslation(); |
| |
| ICompilationUnit cu = translation.getCompilationUnit(); |
| int problemID = -1; |
| if (annotation instanceof TemporaryAnnotation) { |
| problemID = ((TemporaryAnnotation) annotation).getProblemID(); |
| if (problemID != -1) { |
| IJavaAnnotation javaAnnotation = new ProblemAnnotation((IProblem) ((TemporaryAnnotation) annotation).getAdditionalFixInfo(), cu); |
| problems.add(new ProblemLocation(translation.getJavaOffset(pos.offset), pos.getLength(), javaAnnotation)); |
| } |
| } |
| |
| int length = viewer != null ? viewer.getSelectedRange().y : 0; |
| AssistContext context = new AssistContext(cu, translation.getJavaOffset(documentOffset), length); |
| |
| if (processor != null && processor.hasCorrections(cu, problemID)) { |
| try { |
| IProblemLocation[] problemLocations = (IProblemLocation[]) problems.toArray(new IProblemLocation[problems.size()]); |
| IJavaCompletionProposal[] res = ((QuickFixProcessor) processor).getCorrections(context, problemLocations); |
| if (res != null) { |
| for (int k = 0; k < res.length; k++) { |
| //proposals.add(res[k]); |
| } |
| } |
| } |
| catch (CoreException e) { |
| throw new SourceEditingRuntimeException(); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| protected void addQuickAssistProposals(StructuredTextViewer viewer, ArrayList proposals, int documentOffset) { |
| try { |
| IQuickAssistProcessor processor = getQuickAssistProcessorJSP(); |
| |
| XMLModel xmlModel = (XMLModel) getModelManager().getExistingModelForRead(viewer.getDocument()); |
| XMLDocument xmlDoc = xmlModel.getDocument(); |
| xmlModel.releaseFromRead(); |
| JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) xmlDoc.getAdapterFor(IJSPTranslation.class); |
| if (translationAdapter != null) { |
| JSPTranslation translation = translationAdapter.getJSPTranslation(); |
| ICompilationUnit cu = translation.getCompilationUnit(); |
| |
| if (cu != null) { |
| synchronized(cu) { |
| if (processor instanceof QuickAssistProcessorJSP) |
| ((QuickAssistProcessorJSP) processor).setJSPDocument(viewer.getDocument()); |
| |
| int length = viewer != null ? viewer.getSelectedRange().y : 0; |
| AssistContext context = new AssistContext(cu, translation.getJavaOffset(documentOffset), length); |
| |
| if (processor != null) { |
| ICompletionProposal[] res = processor.getAssists(context, null); |
| if (res != null) { |
| for (int k = 0; k < res.length; k++) { |
| proposals.add(res[k]); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| catch (Exception e) { |
| throw new SourceEditingRuntimeException(); |
| } |
| } |
| |
| private IModelManager getModelManager() { |
| return StructuredModelManager.getInstance().getModelManager(); |
| } |
| } |