/*******************************************************************************
* Copyright (c) 2011 Andrey Loskutov.
* 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:
* Clemens Fuchslocher - initial API and implementation
* Andrey Loskutov - bugfixes
*******************************************************************************/
package de.loskutov.anyedit.actions.sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import de.loskutov.anyedit.actions.AbstractTextAction;
import de.loskutov.anyedit.util.LineReplaceResult;
import de.loskutov.anyedit.util.TextReplaceResultSet;
/**
* @author Clemens Fuchslocher
*/
public abstract class AbstractSortAction extends AbstractTextAction {
protected abstract Comparator<LineReplaceResult> getComparator();
@Override
protected TextReplaceResultSet estimateActionRange(IDocument document) {
ITextSelection selection = getSelection();
if (selection == null || selection.isEmpty()) {
return new TextReplaceResultSet();
}
TextReplaceResultSet result = new TextReplaceResultSet();
if(selection.getLength() > 0) {
result.setStartLine(selection.getStartLine());
result.setStopLine(selection.getEndLine());
} else {
result.setStartLine(0);
result.setStopLine(document.getNumberOfLines() - 1);
}
return result;
}
@Override
protected void doTextOperation(IDocument document, String action, TextReplaceResultSet results) throws BadLocationException {
List<LineReplaceResult> lines = getLines(results, document);
if (lines.isEmpty() || lines.size() == 1) {
return;
}
sortLines(lines);
addLines(results, lines);
}
private List<LineReplaceResult> getLines(TextReplaceResultSet result, IDocument document) throws BadLocationException {
List<LineReplaceResult> lines = new ArrayList<LineReplaceResult>();
int start = result.getStartLine();
int stop = result.getStopLine();
for (int n = start; n <= stop; n++) {
IRegion lineInfo = document.getLineInformation(n);
String text = document.get(lineInfo.getOffset(), lineInfo.getLength());
LineReplaceResult line = new LineReplaceResult();
line.startReplaceIndex = 0;
line.rangeToReplace = -1;
line.textToReplace = text;
lines.add(line);
}
return lines;
}
private void sortLines(List<LineReplaceResult> lines) {
Collections.sort(lines, getComparator());
}
private void addLines(TextReplaceResultSet results, List<LineReplaceResult> lineList) {
Iterator<LineReplaceResult> lines = lineList.iterator();
while (lines.hasNext()) {
results.add(lines.next());
}
}
private ITextSelection getSelection() {
ISelectionProvider selectionProvider = getEditor().getSelectionProvider();
if (selectionProvider == null) {
return null;
}
ISelection selection = selectionProvider.getSelection();
if (selection == null) {
return null;
}
if (!(selection instanceof ITextSelection)) {
return null;
}
return (ITextSelection) selection;
}
}