package org.objectstyle.wolips.wodclipse.core.refactoring; import jp.aonir.fuzzyxml.FuzzyXMLAttribute; import jp.aonir.fuzzyxml.FuzzyXMLDocument; import jp.aonir.fuzzyxml.FuzzyXMLElement; import jp.aonir.fuzzyxml.FuzzyXMLNode; import jp.aonir.fuzzyxml.util.NodeSelectUtil; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.link.ILinkedModeListener; import org.eclipse.jface.text.link.LinkedModeModel; import org.eclipse.jface.text.link.LinkedModeUI; import org.eclipse.jface.text.link.LinkedPosition; import org.eclipse.jface.text.link.LinkedPositionGroup; import org.eclipse.ui.texteditor.link.EditorLinkedModeUI; import org.objectstyle.wolips.bindings.wod.IWodElement; import org.objectstyle.wolips.bindings.wod.IWodModel; import org.objectstyle.wolips.bindings.wod.IWodUnit; import org.objectstyle.wolips.wodclipse.core.completion.WodParserCache; import org.objectstyle.wolips.wodclipse.core.util.WodHtmlUtils; public class QuickRenameRefactoring { public static void renameWodSelection(int offset, ITextViewer htmlViewer, ITextViewer wodViewer, WodParserCache cache) throws Exception { IWodModel wodModel = cache.getWodEntry().getModel(); if (wodModel != null) { IWodUnit wodUnit = wodModel.getWodUnitAtIndex(offset); if (wodUnit != null && wodUnit instanceof IWodElement) { IWodElement wodElement = (IWodElement) wodUnit; Position elementNamePosition = wodElement.getElementNamePosition(); if (elementNamePosition != null && elementNamePosition.includes(offset)) { String elementName = wodElement.getElementName(); if (elementName != null) { QuickRenameRefactoring.renameElement(elementName, htmlViewer, wodViewer, cache, false); } } } } } public static void renameHtmlSelection(int offset, ITextViewer htmlViewer, ITextViewer wodViewer, WodParserCache cache) throws Exception { FuzzyXMLDocument htmlModel = cache.getHtmlEntry().getModel(); FuzzyXMLElement element = htmlModel.getElementByOffset(offset); if (element != null) { String tagName = element.getName(); if (tagName != null && element.getOffset() + element.getNameOffset() + 1 <= offset && element.getOffset() + element.getNameOffset() + element.getNameLength() >= offset) { QuickRenameRefactoring.renameHtmlTag(element, htmlViewer, cache); } else if (WodHtmlUtils.isWOTag(tagName)) { FuzzyXMLAttribute nameAttribute = element.getAttributeNode("name"); if (nameAttribute != null) { String woElementName = nameAttribute.getValue(); if (woElementName != null && element.getOffset() + nameAttribute.getValueDataOffset() + 1 <= offset && element.getOffset() + nameAttribute.getValueDataOffset() + nameAttribute.getValueDataLength() >= offset) { QuickRenameRefactoring.renameElement(woElementName, htmlViewer, wodViewer, cache, true); } } } } } public static void renameHtmlTag(FuzzyXMLElement element, ITextViewer htmlViewer, final WodParserCache cache) throws BadLocationException { IDocument htmlDocument = htmlViewer.getDocument(); LinkedModeModel.closeAllModels(htmlDocument); LinkedPositionGroup linkedGroup = new LinkedPositionGroup(); linkedGroup.addPosition(new LinkedPosition(htmlDocument, element.getOffset() + element.getNameOffset() + 1, element.getNameLength(), 0)); if (element.hasCloseTag()) { linkedGroup.addPosition(new LinkedPosition(htmlDocument, element.getCloseTagOffset() + element.getCloseNameOffset() + 1, element.getCloseNameLength(), 1)); } QuickRenameRefactoring.enterLinkedMode(linkedGroup, cache, htmlViewer); } protected static int linkHtml(String woElementName, IDocument htmlDocument, LinkedPositionGroup linkedGroup, WodParserCache cache, int sequence) throws Exception { FuzzyXMLDocument htmlModel = cache.getHtmlEntry().getModel(); FuzzyXMLNode[] woTags = NodeSelectUtil.getNodeByFilter(htmlModel.getDocumentElement(), new NamedWebobjectTagFilter(woElementName)); LinkedModeModel.closeAllModels(htmlDocument); for (FuzzyXMLNode woTag : woTags) { FuzzyXMLElement woElement = (FuzzyXMLElement) woTag; FuzzyXMLAttribute woNameAttr = woElement.getAttributeNode("name"); if (woNameAttr != null) { int offset = woElement.getOffset() + woNameAttr.getValueDataOffset() + 1; int length = woNameAttr.getValueDataLength(); linkedGroup.addPosition(new LinkedPosition(htmlDocument, offset, length, sequence++)); } } return sequence; } protected static int linkWod(String woElementName, IDocument wodDocument, LinkedPositionGroup linkedGroup, WodParserCache cache, int sequence) throws Exception { LinkedModeModel.closeAllModels(wodDocument); IWodModel wodModel = cache.getWodEntry().getModel(); IWodElement wodElement = wodModel.getElementNamed(woElementName); if (wodElement != null) { Position namePosition = wodElement.getElementNamePosition(); if (namePosition != null) { linkedGroup.addPosition(new LinkedPosition(wodDocument, namePosition.getOffset(), namePosition.getLength(), sequence++)); } } return sequence; } public static void renameElement(String woElementName, ITextViewer htmlViewer, ITextViewer wodViewer, final WodParserCache cache, boolean highlightHtml) throws Exception { int sequence = 0; LinkedPositionGroup linkedGroup = new LinkedPositionGroup(); IDocument htmlDocument = htmlViewer.getDocument(); IDocument wodDocument = wodViewer.getDocument(); if (highlightHtml) { sequence = QuickRenameRefactoring.linkHtml(woElementName, htmlDocument, linkedGroup, cache, sequence); sequence = QuickRenameRefactoring.linkWod(woElementName, wodDocument, linkedGroup, cache, sequence); } else { sequence = QuickRenameRefactoring.linkWod(woElementName, wodDocument, linkedGroup, cache, sequence); sequence = QuickRenameRefactoring.linkHtml(woElementName, htmlDocument, linkedGroup, cache, sequence); } QuickRenameRefactoring.enterLinkedMode(linkedGroup, cache, htmlViewer, wodViewer); } protected static void enterLinkedMode(LinkedPositionGroup linkedGroup, final WodParserCache cache, ITextViewer... textViewers) throws BadLocationException { if (!linkedGroup.isEmpty()) { LinkedModeModel linkedModeModel = new LinkedModeModel(); linkedModeModel.addGroup(linkedGroup); linkedModeModel.forceInstall(); // JavaEditor editor = getJavaEditor(); // if (editor != null) { // model.addLinkingListener(new EditorHighlightingSynchronizer(editor)); // } linkedModeModel.addLinkingListener(new ILinkedModeListener() { public void resume(LinkedModeModel model, int flags) { // DO NOTHING } public void suspend(LinkedModeModel model) { // DO NOTHING } public void left(LinkedModeModel model, int flags) { try { cache.clearCache(); } catch (Exception e) { e.printStackTrace(); } } }); LinkedModeUI htmlUI = new EditorLinkedModeUI(linkedModeModel, textViewers); // ui.setInitialOffset(offset); // htmlUI.setExitPosition(textViewers[0], 0, 0, LinkedPositionGroup.NO_STOP); htmlUI.enter(); } } }