| /******************************************************************************* |
| * Copyright (c) 2004, 2007 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.core.internal.java; |
| |
| import org.eclipse.jdt.core.ICompilationUnit; |
| import org.eclipse.jface.text.IDocument; |
| import org.eclipse.jst.jsp.core.internal.modelhandler.ModelHandlerForJSP; |
| import org.eclipse.text.edits.CopySourceEdit; |
| import org.eclipse.text.edits.CopyTargetEdit; |
| import org.eclipse.text.edits.DeleteEdit; |
| import org.eclipse.text.edits.InsertEdit; |
| import org.eclipse.text.edits.MoveSourceEdit; |
| import org.eclipse.text.edits.MoveTargetEdit; |
| import org.eclipse.text.edits.MultiTextEdit; |
| import org.eclipse.text.edits.ReplaceEdit; |
| import org.eclipse.text.edits.TextEdit; |
| import org.eclipse.wst.sse.core.StructuredModelManager; |
| import org.eclipse.wst.sse.core.internal.provisional.IModelManager; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; |
| |
| public class JSPTranslationUtil { |
| protected IDocument fDocument = null; |
| protected JSPTranslationExtension fTranslation = null; |
| |
| public JSPTranslationUtil(IDocument document) { |
| fDocument = document; |
| } |
| |
| public TextEdit translateTextEdit(TextEdit textEdit) { |
| TextEdit translatedTextEdit = null; |
| |
| int javaOffset = textEdit.getOffset(); |
| int jspOffset = getTranslation().getJspOffset(textEdit.getOffset()); |
| int length = textEdit.getLength(); |
| |
| if (textEdit instanceof MultiTextEdit) { |
| translatedTextEdit = new MultiTextEdit(); |
| TextEdit[] children = ((MultiTextEdit) textEdit).getChildren(); |
| for (int i = 0; i < children.length; i++) { |
| TextEdit translatedChildTextEdit = translateTextEdit(children[i]); |
| if (translatedChildTextEdit != null) |
| ((MultiTextEdit) translatedTextEdit).addChild(translatedChildTextEdit); |
| } |
| } |
| else if (textEdit instanceof ReplaceEdit) { |
| if (jspOffset == -1) |
| return null; |
| |
| if (!getTranslation().javaSpansMultipleJspPartitions(javaOffset, length)) |
| translatedTextEdit = new ReplaceEdit(jspOffset, length, ((ReplaceEdit) textEdit).getText()); |
| } |
| else if (textEdit instanceof InsertEdit) { |
| translatedTextEdit = new InsertEdit(jspOffset, ((InsertEdit) textEdit).getText()); |
| } |
| else if (textEdit instanceof DeleteEdit) { |
| translatedTextEdit = new DeleteEdit(jspOffset, length); |
| TextEdit[] children = ((DeleteEdit) textEdit).getChildren(); |
| for (int i = 0; i < children.length; i++) { |
| TextEdit translatedChildTextEdit = translateTextEdit(children[i]); |
| if (translatedChildTextEdit != null) |
| ((DeleteEdit) translatedTextEdit).addChild(translatedChildTextEdit); |
| } |
| } |
| else if (textEdit instanceof CopySourceEdit) { |
| translatedTextEdit = new CopySourceEdit(jspOffset, length); |
| ((CopySourceEdit) translatedTextEdit).setTargetEdit(((CopySourceEdit) textEdit).getTargetEdit()); |
| ((CopySourceEdit) translatedTextEdit).setSourceModifier(((CopySourceEdit) textEdit).getSourceModifier()); |
| } |
| else if (textEdit instanceof CopyTargetEdit) { |
| translatedTextEdit = new CopyTargetEdit(jspOffset); |
| ((CopyTargetEdit) textEdit).getSourceEdit().setTargetEdit((CopyTargetEdit) translatedTextEdit); |
| } |
| else if (textEdit instanceof MoveSourceEdit) { |
| translatedTextEdit = new MoveSourceEdit(jspOffset, length); |
| ((MoveSourceEdit) translatedTextEdit).setTargetEdit(((MoveSourceEdit) textEdit).getTargetEdit()); |
| } |
| else if (textEdit instanceof MoveTargetEdit) { |
| translatedTextEdit = new MoveTargetEdit(jspOffset); |
| ((MoveTargetEdit) textEdit).getSourceEdit().setTargetEdit((MoveTargetEdit) translatedTextEdit); |
| } |
| else { |
| System.out.println("Need to translate " + textEdit); //$NON-NLS-1$ |
| } |
| |
| return translatedTextEdit; |
| } |
| |
| public JSPTranslationExtension getTranslation() { |
| if (fTranslation == null) { |
| IDOMModel xmlModel = (IDOMModel) getModelManager().getExistingModelForRead(fDocument); |
| ModelHandlerForJSP.ensureTranslationAdapterFactory(xmlModel); |
| try { |
| IDOMDocument xmlDoc = xmlModel.getDocument(); |
| |
| JSPTranslationAdapter translationAdapter = (JSPTranslationAdapter) xmlDoc.getAdapterFor(IJSPTranslation.class); |
| if (translationAdapter != null) |
| fTranslation = translationAdapter.getJSPTranslation(); |
| } |
| finally { |
| if (xmlModel != null) { |
| xmlModel.releaseFromRead(); |
| } |
| } |
| } |
| |
| return fTranslation; |
| } |
| |
| public ICompilationUnit getCompilationUnit() { |
| return getTranslation().getCompilationUnit(); |
| } |
| |
| protected IModelManager getModelManager() { |
| return StructuredModelManager.getModelManager(); |
| } |
| } |