1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
6
using ICSharpCode.Core;
7
using ICSharpCode.SharpDevelop.Editor;
8
using ICSharpCode.SharpDevelop.Gui;
9
using System.Collections.Generic;
11
namespace ICSharpCode.AvalonEdit.AddIn.Commands
13
public class SortSelectionCommand : AbstractMenuCommand
15
public override void Run()
17
SortOptionsDialog dlg = new SortOptionsDialog();
18
dlg.Owner = WorkbenchSingleton.MainWindow;
19
if (dlg.ShowDialog() == true) {
20
StringComparer comparer = SortOptions.CaseSensitive ? StringComparer.CurrentCulture : StringComparer.CurrentCultureIgnoreCase;
21
if (SortOptions.IgnoreTrailingWhitespaces)
22
comparer = new IgnoreTrailingWhitespaceComparer(comparer);
23
if (SortOptions.SortDirection == SortDirection.Descending)
24
comparer = new DescendingStringComparer(comparer);
26
ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider;
27
if (provider != null) {
28
ITextEditor editor = provider.TextEditor;
29
if (editor.SelectionLength > 0) {
30
int start = editor.Document.GetLineForOffset(editor.SelectionStart).LineNumber;
31
int end = editor.Document.GetLineForOffset(editor.SelectionStart + editor.SelectionLength).LineNumber;
32
SortLines(editor.Document, start, end, comparer, SortOptions.RemoveDuplicates);
34
SortLines(editor.Document, 1, editor.Document.TotalNumberOfLines, comparer, SortOptions.RemoveDuplicates);
40
public void SortLines(IDocument document, int startLine, int endLine, StringComparer comparer, bool removeDuplicates)
42
List<string> lines = new List<string>();
43
for (int i = startLine; i <= endLine; ++i) {
44
IDocumentLine line = document.GetLine(i);
45
lines.Add(document.GetText(line.Offset, line.Length));
50
if (removeDuplicates) {
51
lines = lines.Distinct(comparer).ToList();
54
using (document.OpenUndoGroup()) {
55
for (int i = 0; i < lines.Count; ++i) {
56
IDocumentLine line = document.GetLine(startLine + i);
57
document.Replace(line.Offset, line.Length, lines[i]);
60
// remove removed duplicate lines
61
for (int i = startLine + lines.Count; i <= endLine; ++i) {
62
IDocumentLine line = document.GetLine(startLine + lines.Count);
63
document.Remove(line.Offset, line.TotalLength);
68
sealed class DescendingStringComparer : StringComparer
70
StringComparer baseComparer;
72
public DescendingStringComparer(StringComparer baseComparer)
74
this.baseComparer = baseComparer;
77
public override int Compare(string x, string y)
79
return -baseComparer.Compare(x, y);
82
public override bool Equals(string x, string y)
84
return baseComparer.Equals(x, y);
87
public override int GetHashCode(string obj)
89
return baseComparer.GetHashCode(obj);
93
sealed class IgnoreTrailingWhitespaceComparer : StringComparer
95
StringComparer baseComparer;
97
public IgnoreTrailingWhitespaceComparer(StringComparer baseComparer)
99
this.baseComparer = baseComparer;
102
public override int Compare(string x, string y)
108
return baseComparer.Compare(x, y);
111
public override bool Equals(string x, string y)
117
return baseComparer.Equals(x, y);
120
public override int GetHashCode(string obj)
124
return baseComparer.GetHashCode(obj);
129
public static class SortOptions
131
public static bool RemoveDuplicates {
132
get { return PropertyService.Get("ICSharpCode.SharpDevelop.Gui.SortOptionsDialog.RemoveDuplicateLines", false); }
133
set { PropertyService.Set("ICSharpCode.SharpDevelop.Gui.SortOptionsDialog.RemoveDuplicateLines", value); }
136
public static bool CaseSensitive {
137
get { return PropertyService.Get("ICSharpCode.SharpDevelop.Gui.SortOptionsDialog.CaseSensitive", true); }
138
set { PropertyService.Set("ICSharpCode.SharpDevelop.Gui.SortOptionsDialog.CaseSensitive", value); }
141
public static bool IgnoreTrailingWhitespaces {
142
get { return PropertyService.Get("ICSharpCode.SharpDevelop.Gui.SortOptionsDialog.IgnoreWhitespaces", false); }
143
set { PropertyService.Set("ICSharpCode.SharpDevelop.Gui.SortOptionsDialog.IgnoreWhitespaces", value); }
146
public static SortDirection SortDirection {
147
get { return PropertyService.Get("ICSharpCode.SharpDevelop.Gui.SortOptionsDialog.SortDirection", SortDirection.Ascending); }
148
set { PropertyService.Set("ICSharpCode.SharpDevelop.Gui.SortOptionsDialog.SortDirection", value); }
152
public enum SortDirection