/***** BEGIN LICENSE BLOCK *****
* Version: CPL 1.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Common Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.eclipse.org/legal/cpl-v10.html
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* Copyright (C) 2006 Lukas Felber <lfelber@hsr.ch>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the CPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the CPL, the GPL or the LGPL.
***** END LICENSE BLOCK *****/
package org.rubypeople.rdt.refactoring.core;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PlatformUI;
import org.rubypeople.rdt.core.IMember;
import org.rubypeople.rdt.core.RubyModelException;
import org.rubypeople.rdt.internal.ui.rubyeditor.RubyEditor;
public class RefactoringContext implements IRefactoringContext {
private String source;
private int start;
private int end;
private int caret;
private IFile file;
public RefactoringContext(int start, int end, String src) {
this(start, end, start, src);
}
public RefactoringContext(int start, int end, int caret, String src) {
this.start = start;
this.end = end;
this.caret = caret;
this.source = src;
}
public RefactoringContext() {
initEditor();
}
public RefactoringContext(IAction action) {
if (action == null || action instanceof org.eclipse.ui.internal.EditorPluginAction) {
initEditor();
} else {
initOutline(action);
}
}
private void initEditor() {
RubyEditor editor = (RubyEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
start = selection.getOffset();
end = start + selection.getLength();
if (end > start) {
end--;
}
caret = editor.getCaretPosition().getOffset();
if (editor.getEditorInput() instanceof IFileEditorInput)
file = ((IFileEditorInput) editor.getEditorInput()).getFile();
}
private void initOutline(IAction action) {
TreeSelection selection = (TreeSelection) ((org.eclipse.ui.internal.PluginAction)action).getSelection();
IMember member = (IMember) selection.toArray()[0];
try {
start = member.getNameRange().getOffset();
end = start + member.getNameRange().getLength();
caret = start;
file = (IFile) member.getRubyScript().getResource();
} catch (RubyModelException e) {
e.printStackTrace();
}
}
public IFile getActiveFile() {
return file;
}
/* (non-Javadoc)
* @see org.rubypeople.rdt.refactoring.core.IRefactoringContext#getCarretPosition()
*/
public int getCaretPosition() {
return caret;
}
/* (non-Javadoc)
* @see org.rubypeople.rdt.refactoring.core.IRefactoringContext#getStartOffset()
*/
public int getStartOffset() {
return start;
}
/* (non-Javadoc)
* @see org.rubypeople.rdt.refactoring.core.IRefactoringContext#getEndOffset()
*/
public int getEndOffset() {
return end;
}
public String getSource() {
if (source == null) {
RubyEditor editor = (RubyEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
source = editor.getViewer().getDocument().get();
}
return source;
}
}