/*******************************************************************************
* Copyright (c) 2010 György Orosz.
* 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:
* György Orosz - initial API and implementation
******************************************************************************/
package org.erlide.wrangler.refactoring.selection.internal;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
import org.erlide.engine.ErlangEngine;
import org.erlide.engine.model.ErlModelException;
import org.erlide.engine.model.IErlElement;
import org.erlide.engine.model.erlang.IErlMember;
import org.erlide.engine.model.root.IErlModule;
import org.erlide.wrangler.refactoring.backend.SyntaxInfo;
import org.erlide.wrangler.refactoring.backend.internal.WranglerBackendManager;
import org.erlide.wrangler.refactoring.exception.WranglerException;
import org.erlide.wrangler.refactoring.util.ErlRange;
import org.erlide.wrangler.refactoring.util.IErlRange;
import org.erlide.wrangler.refactoring.util.WranglerUtils;
/**
* Selected Erlang member, from the editor
*
* @author Gyorgy Orosz
* @version %I%, %G%
*/
public class ErlTextMemberSelection extends AbstractErlMemberSelection {
/**
* Constructor
*
* @param selection
* textselection from an Erlang editor
* @param editor
* editor, where the text is selected
* @throws WranglerException
*/
public ErlTextMemberSelection(final ITextSelection selection,
final ITextEditor editor) throws WranglerException {
final IEditorInput input = editor.getEditorInput();
if (!(input instanceof IFileEditorInput)) {
throw new WranglerException("Can not refactor external modules!");
}
document = editor.getDocumentProvider().getDocument(input);
final IFileEditorInput fileInput = (IFileEditorInput) input;
final IFile theFile = fileInput.getFile();
store(selection, theFile, document);
}
/**
* Constructor
*
* @param editor
* editor, which contains the selection
*/
public ErlTextMemberSelection(final ITextEditor editor) {
super(editor);
}
protected int getStartCol() {
return WranglerUtils.calculateColumnFromOffset(textSelection.getOffset(),
getStartLine() - 1, document);
}
protected int getEndLine() {
return textSelection.getEndLine() + 1;
}
protected int getEndCol() {
return WranglerUtils.calculateColumnFromOffset(
textSelection.getOffset() + textSelection.getLength(), getEndLine() - 1,
document);
}
protected int getStartLine() {
return textSelection.getStartLine() + 1;
}
@Override
public IErlElement getErlElement() {
final IErlModule module = (IErlModule) ErlangEngine.getInstance().getModel()
.findElement(file);
try {
final IErlElement element = module.getElementAt(textSelection.getOffset());
if (element == null) {
return module;
}
return element;
} catch (final ErlModelException e) {
}
return module;
}
@Override
public IErlRange getMemberRange() {
if (getErlElement() instanceof IErlMember) {
IErlRange range = null;
final IErlMember member = (IErlMember) getErlElement();
int sL, sC, eL, eC;
sL = member.getLineStart() + 1;
eL = member.getLineEnd() + 1;
sC = WranglerUtils.calculateColumnFromOffset(
member.getSourceRange().getOffset(), sL - 1, document);
eC = WranglerUtils
.calculateColumnFromOffset(
member.getSourceRange().getOffset()
+ member.getSourceRange().getLength(),
eL - 1, document);
range = new ErlRange(sL, sC, eL, eC, member.getSourceRange().getOffset(),
member.getSourceRange().getLength());
return range;
}
return getSelectionRange();
}
@Override
public IErlRange getSelectionRange() {
return new ErlRange(getStartLine(), getStartCol(), getEndLine(), getEndCol(),
textSelection.getOffset(), textSelection.getLength());
}
@Override
public SelectionKind getDetailedKind() {
if (getKind() == SelectionKind.FUNCTION
|| getKind() == SelectionKind.FUNCTION_CLAUSE) {
final SyntaxInfo si = WranglerBackendManager.getSyntaxBackend()
.getSyntaxInfo(file, getStartLine(), getStartCol());
if (si.isVariable()) {
return SelectionKind.VARIABLE;
// TODO:: expression checking is not implemented
}
return getKind();
}
return getKind();
}
@Override
public IErlModule getErlModule() {
return (IErlModule) ErlangEngine.getInstance().getModel().findElement(file);
}
}