package org.rubypeople.rdt.ui.actions;
import java.util.ResourceBundle;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.TextEditorAction;
import org.rubypeople.rdt.internal.ui.RubyPlugin;
import org.rubypeople.rdt.internal.ui.rubyeditor.RubyEditor;
public class FormatAction extends TextEditorAction {
public FormatAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
super(bundle, prefix, editor);
}
public void run() {
IDocument doc = this.getTextEditor().getDocumentProvider().getDocument(this.getTextEditor().getEditorInput());
try {
ISelection selection = this.getTextEditor().getSelectionProvider().getSelection();
if (selection instanceof TextSelection) {
TextSelection textSelection = (TextSelection) selection;
String text = textSelection.getText();
if (text == null || text.length() == 0) {
String original = doc.get();
String allFormatted = RubyPlugin.getDefault().getCodeFormatter().formatString(original);
if (original.equals(allFormatted)) return;
RubyEditor rubyEditor = (RubyEditor) this.getTextEditor();
RubyEditor.CaretPosition cursorPos = rubyEditor.getCaretPosition();
doc.set(allFormatted);
rubyEditor.setCaretPosition(cursorPos);
} else {
// format always complete lines, otherwise the indentation
// of the first line is lost
int startPos = doc.getLineOffset(textSelection.getStartLine());
int endLine = textSelection.getEndLine();
int endPos = doc.getLineOffset(endLine) + doc.getLineLength(endLine);
String unformatted = doc.get(startPos, endPos - startPos);
String formatted = RubyPlugin.getDefault().getCodeFormatter().formatString(unformatted);
if (!formatted.equals(unformatted)) {
doc.replace(startPos, endPos - startPos, formatted);
}
}
}
} catch (BadLocationException e) {
RubyPlugin.log(e);
}
super.run();
}
}