/*******************************************************************************
* 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.internal.ui.text.completion;
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.JstModifiers;
import org.eclipse.vjet.eclipse.ui.VjoElementImageDescriptor;
import org.eclipse.vjet.vjo.tool.codecompletion.StringUtils;
import org.eclipse.dltk.mod.ast.Modifiers;
import org.eclipse.dltk.mod.core.DLTKCore;
import org.eclipse.dltk.mod.ui.templates.IScriptTemplateIndenter;
import org.eclipse.dltk.mod.ui.templates.NopScriptTemplateIndenter;
import org.eclipse.dltk.mod.utils.TextUtils;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.TextUtilities;
public class VjoProposalLabelUtil {
// public static void initLineSeperator(IDocument document) {
// lineSeperator = TextUtilities.getDefaultLineDelimiter(document);
// }
public static String evaluateIndent(String str, IDocument document,
int replaceOffset) {
if (document == null) {
return str;
}
final String[] lines = TextUtils.splitLines(str);
if (lines.length > 1) {
final String delimeter = TextUtilities
.getDefaultLineDelimiter(document);
final String indent = calculateIndent(document, replaceOffset);
final IScriptTemplateIndenter indenter = getIndenter();
final StringBuffer buffer = new StringBuffer(lines[0]);
// Except first line
for (int i = 1; i < lines.length; i++) {
buffer.append(delimeter);
indenter.indentLine(buffer, indent, lines[i]);
}
return buffer.toString();
} else {
return str;
}
}
protected static String calculateIndent(IDocument document, int offset) {
try {
final IRegion region = document.getLineInformationOfOffset(offset);
String indent = document.get(region.getOffset(), offset
- region.getOffset());
int i = 0;
while (i < indent.length()
&& StringUtils.isSpaceOrTab(indent.charAt(i))) {
++i;
}
if (i > 0) {
return indent.substring(0, i);
}
} catch (BadLocationException e) {
if (DLTKCore.DEBUG) {
e.printStackTrace();
}
}
return ""; //$NON-NLS-1$
}
/**
* Tranlate JstModifiers to DLTK modifier
*
* @param jstModifer
* @return
*/
public static int translateModifers(int jstModifer) {
if ((jstModifer & JstModifiers.PUBLIC) != 0) {
return Modifiers.AccPublic;
}
if ((jstModifer & JstModifiers.PROTECTED) != 0) {
return Modifiers.AccProtected;
}
if ((jstModifer & JstModifiers.PRIVATE) != 0) {
return Modifiers.AccPrivate;
}
return Modifiers.AccDefault;
}
/**
* @return
*/
protected static IScriptTemplateIndenter getIndenter() {
return new NopScriptTemplateIndenter();
}
public static int getVjoModifierForImage(JstModifiers modifiers) {
int result = 0;
if (modifiers == null) {
return result;
}
if (modifiers.isStatic()) {
result = result | VjoElementImageDescriptor.STATIC;
}
if (modifiers.isAbstract()) {
result = result | VjoElementImageDescriptor.ABSTRACT;
}
if (modifiers.isFinal()) {
result = result | VjoElementImageDescriptor.FINAL;
}
return result;
}
public static int getDltkModifyFlag(JstModifiers modifiers) {
if (modifiers.isPublic()) {
return Modifiers.AccPublic;
} else if (modifiers.isProtected()) {
return Modifiers.AccProtected;
} else if (modifiers.isPrivate()) {
return Modifiers.AccPrivate;
} else {
return Modifiers.AccDefault;
}
}
public static JstModifiers getModifiers(IJstNode node) {
JstModifiers modifies = null;
if (node instanceof IJstMethod) {
IJstMethod method = (IJstMethod) node;
modifies = method.getModifiers();
} else if (node instanceof IJstProperty) {
IJstProperty property = (IJstProperty) node;
modifies = property.getModifiers();
} else if (node instanceof IJstType) {
IJstType type = (IJstType) node;
modifies = type.getModifiers();
}
return modifies;
}
}