/******************************************************************************* * Copyright (c) 2005, 2012 eBay Inc. * 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 * *******************************************************************************/ package org.eclipse.vjet.eclipse.ui; import org.eclipse.vjet.dsf.jst.IJstMethod; import org.eclipse.vjet.dsf.jst.IJstNode; import org.eclipse.vjet.dsf.jst.IJstProperty; import org.eclipse.vjet.dsf.jst.IJstType; import org.eclipse.vjet.dsf.jst.declaration.JstVars; import org.eclipse.vjet.dsf.jst.reserved.JsCoreKeywords; import org.eclipse.vjet.eclipse.codeassist.CodeassistUtils; import org.eclipse.vjet.eclipse.core.IVjoSourceModule; import org.eclipse.vjet.eclipse.core.VjoLanguageToolkit; import org.eclipse.vjet.eclipse.internal.codeassist.select.VjoSelectionEngine; import org.eclipse.vjet.eclipse.internal.ui.editor.VjoEditor; import org.eclipse.vjet.vjo.tool.codecompletion.CodeCompletionUtils; import org.eclipse.vjet.vjo.tool.typespace.TypeSpaceMgr; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.dltk.mod.codeassist.ISelectionEngine; import org.eclipse.dltk.mod.core.DLTKLanguageManager; import org.eclipse.dltk.mod.core.IDLTKLanguageToolkit; import org.eclipse.dltk.mod.core.IModelElement; import org.eclipse.dltk.mod.core.ISourceModule; import org.eclipse.dltk.mod.core.IType; import org.eclipse.dltk.mod.internal.core.VjoSourceModule; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRewriteTarget; import org.eclipse.jface.text.link.LinkedModeModel; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.DocumentChange; import org.eclipse.ltk.core.refactoring.TextChange; import org.eclipse.text.edits.InsertEdit; import org.eclipse.text.edits.MultiTextEdit; import org.eclipse.text.edits.TextEdit; public class VjetUIUtils { /** * Answer whether type is mixed * @return boolean */ public static boolean isMixin(IType type) { ISourceModule sourceModule = type.getSourceModule(); IJstType jstType = null; if (sourceModule instanceof VjoSourceModule) { jstType = ((IVjoSourceModule)sourceModule).getJstType(); } else { String name = type.getScriptFolder().getElementName() + '.' + type.getElementName(); String groupName = type.getScriptProject().getElementName(); jstType = TypeSpaceMgr.findType(groupName, name); } if(jstType == null) return false; return (jstType.hasMixins()); } /** * Get JstType from current vjo editor * * @return */ public static IJstType getJstType(VjoEditor editor) { if (editor == null) { return null; } IModelElement modelElement = editor.getInputModelElement(); if (modelElement instanceof IVjoSourceModule) { return ((IVjoSourceModule) modelElement).getJstType(); } else { return null; } } /** * Get document from VjoEditor * @param vjoEditor * @return */ public static IDocument getDocument(VjoEditor vjoEditor) { return vjoEditor.getScriptSourceViewer().getDocument(); } public static int getCommentOffset(JstVars node, IDocument document) { int offset = node.getSource().getEndOffSet(); try { char c = document.getChar(offset); while (c != ';' && c != '\r' && c != '\n') { offset++; c = document.getChar(offset); } if (c == '\r' || c == '\n') { return offset; } else if (c == ';') { return offset + 1; } else { return -1; } } catch (BadLocationException e) { return -1; } } public static int getCommentOffset(IJstProperty node, IDocument document) { int offset = node.getSource().getEndOffSet(); try { char c = document.getChar(offset); while (c != ';' && c != '\r' && c != '\n') { offset++; c = document.getChar(offset); } if (c == '\r' || c == '\n') { return offset; } else if (c == ';') { return offset + 1; } else { return -1; } } catch (BadLocationException e) { return -1; } } public static int getCommentOffset(IJstMethod method, IDocument document) { int offset = method.getSource().getStartOffSet(); try { int line = document.getLineOfOffset(offset); if (line == 0) { return -1; } else { offset = document.getLineOffset(line-1); } char c = document.getChar(offset); while (c != '\r' && c != '\n') { offset++; c = document.getChar(offset); } if (c == '\r' || c == '\n') { return offset; } else if (c == ';') { return offset + 1; } else { return -1; } } catch (BadLocationException e) { return -1; } } public static String getCommentText(JstVars node) { IJstType type = node.getType(); if (type != null) { return CodeCompletionUtils.getAliasOrTypeName(node.getOwnerType(), type); } else { return ""; } } public static String getCommentText(IJstMethod method) { String s = ""; if (!method.isConstructor()) { s = CodeassistUtils.calculateRtnType(method) + " "; } return JsCoreKeywords.EXT_PUBLIC + " " + s + method.getName() + "()"; } public static String getCommentText(IJstProperty node) { IJstType type = node.getType(); if (type != null) { return CodeCompletionUtils.getAliasOrTypeName(node.getOwnerType(), type); } else { return ""; } } public static void performChange(VjoEditor activeEditor, String text, int offset) throws CoreException { IDocument document = activeEditor.getScriptSourceViewer().getDocument(); Change change = createTextChange(activeEditor, text, offset); if (change == null) { return; } IRewriteTarget rewriteTarget = null; try { if (change != null) { if (document != null) { LinkedModeModel.closeAllModels(document); } if (activeEditor != null) { rewriteTarget = (IRewriteTarget) activeEditor .getAdapter(IRewriteTarget.class); if (rewriteTarget != null) { rewriteTarget.beginCompoundChange(); } } change.initializeValidationData(new NullProgressMonitor()); change.perform(new NullProgressMonitor()); } } finally { if (rewriteTarget != null) { rewriteTarget.endCompoundChange(); } if (change != null) { change.dispose(); } } } public static TextChange createTextChange(VjoEditor editor, String text, int offset) throws CoreException { TextChange change; change = new DocumentChange(text, editor.getViewer().getDocument()); TextEdit rootEdit = new MultiTextEdit(); change.setEdit(rootEdit); InsertEdit edit = new InsertEdit(offset, text); rootEdit.addChild(edit); return change; } /** * Get the first matched node which can be commented * @param node * @return */ public static IJstNode getCommentableJstNode(IJstNode node) { while (node != null && !(node instanceof IJstMethod) && !(node instanceof IJstProperty) && !(node instanceof JstVars)) { node = node.getParentNode(); } return node; } /** * * @return the registered VJO selection engine */ public static VjoSelectionEngine getSelectionEngine() { IDLTKLanguageToolkit toolKit = VjoLanguageToolkit.getDefault(); ISelectionEngine selectionEngine = DLTKLanguageManager .getSelectionEngine(toolKit.getNatureId()); if (!(selectionEngine instanceof VjoSelectionEngine)) { return null; } VjoSelectionEngine vjoSelectionEngine = (VjoSelectionEngine) selectionEngine; return vjoSelectionEngine; } }