39
39
using MonoDevelop.Components.Commands;
40
40
using MonoDevelop.Ide.Commands;
42
41
using MonoDevelop.Ide.Gui.Content;
43
42
using MonoDevelop.Ide.Navigation;
44
43
using MonoDevelop.Ide.Gui.Components;
45
44
using MonoDevelop.Components;
48
46
namespace MonoDevelop.Ide.FindInFiles
50
48
class SearchResultWidget : HBox, ILocationList
120
118
resultsScroll.Add (treeviewSearchResults);
122
var projectColumn = new TreeViewColumn {
125
Title = GettextCatalog.GetString ("Project"),
129
var projectPixbufRenderer = new CellRendererImage ();
130
projectColumn.PackStart (projectPixbufRenderer, false);
131
projectColumn.SetCellDataFunc (projectPixbufRenderer, ResultProjectIconDataFunc);
133
projectColumn.PackStart (treeviewSearchResults.TextRenderer, true);
134
projectColumn.SetCellDataFunc (treeviewSearchResults.TextRenderer, ResultProjectDataFunc);
135
treeviewSearchResults.AppendColumn (projectColumn);
124
137
var fileNameColumn = new TreeViewColumn {
125
138
Resizable = true,
127
Title = GettextCatalog.GetString("File")
140
Title = GettextCatalog.GetString ("File"),
130
fileNameColumn.FixedWidth = 200;
132
var fileNamePixbufRenderer = new CellRendererPixbuf ();
144
var fileNamePixbufRenderer = new CellRendererImage ();
133
145
fileNameColumn.PackStart (fileNamePixbufRenderer, false);
134
146
fileNameColumn.SetCellDataFunc (fileNamePixbufRenderer, FileIconDataFunc);
136
148
fileNameColumn.PackStart (treeviewSearchResults.TextRenderer, true);
137
149
fileNameColumn.SetCellDataFunc (treeviewSearchResults.TextRenderer, FileNameDataFunc);
138
150
treeviewSearchResults.AppendColumn (fileNameColumn);
140
// TreeViewColumn lineColumn = treeviewSearchResults.AppendColumn (GettextCatalog.GetString ("Line"), new CellRendererText (), ResultLineDataFunc);
141
// lineColumn.SortColumnId = 1;
142
// lineColumn.FixedWidth = 50;
145
153
TreeViewColumn textColumn = treeviewSearchResults.AppendColumn (GettextCatalog.GetString ("Text"),
146
154
treeviewSearchResults.TextRenderer, ResultTextDataFunc);
147
155
textColumn.SortColumnId = 2;
155
163
pathColumn.Resizable = true;
156
164
pathColumn.FixedWidth = 500;
159
store.SetSortFunc (0, CompareFileNames);
160
// store.SetSortFunc (1, CompareLineNumbers);
167
store.SetSortFunc (0, CompareProjectFileNames);
168
store.SetSortFunc (1, CompareFileNames);
161
169
store.SetSortFunc (3, CompareFilePaths);
163
171
treeviewSearchResults.RowActivated += TreeviewSearchResultsRowActivated;
165
buttonStop = new ToolButton (Stock.Stop) { Sensitive = false };
173
buttonStop = new ToolButton (Ide.Gui.Stock.Stop) { Sensitive = false };
167
175
buttonStop.Clicked += ButtonStopClicked;
169
177
buttonStop.TooltipText = GettextCatalog.GetString ("Stop");
170
178
toolbar.Insert (buttonStop, -1);
172
var buttonClear = new ToolButton (Gtk.Stock.Clear);
180
var buttonClear = new ToolButton (Ide.Gui.Stock.Clear);
173
181
buttonClear.Clicked += ButtonClearClicked;
174
182
buttonClear.TooltipText = GettextCatalog.GetString ("Clear results");
175
183
toolbar.Insert (buttonClear, -1);
245
248
public void EndProgress ()
247
250
buttonStop.Sensitive = false;
248
newStore.SetSortFunc (0, CompareFileNames);
249
newStore.SetSortFunc (1, CompareLineNumbers);
251
newStore.SetSortFunc (0, CompareProjectFileNames);
252
newStore.SetSortFunc (1, CompareFileNames);
250
253
newStore.SetSortFunc (3, CompareFilePaths);
252
255
treeviewSearchResults.Model = newStore;
355
357
if (TreeIter.Zero.Equals (iter))
357
var fileNamePixbufRenderer = (CellRendererPixbuf) cell;
359
var fileNamePixbufRenderer = (CellRendererImage) cell;
358
360
var searchResult = (SearchResult)store.GetValue (iter, SearchResultColumn);
359
361
if (searchResult == null)
361
if (searchResult.Pixbuf == null)
362
searchResult.Pixbuf = DesktopService.GetPixbufForFile (searchResult.FileName, IconSize.Menu);
363
fileNamePixbufRenderer.Pixbuf = searchResult.Pixbuf;
363
if (searchResult.FileIcon == null)
364
searchResult.FileIcon = DesktopService.GetIconForFile (searchResult.FileName, IconSize.Menu);
365
fileNamePixbufRenderer.Image = searchResult.FileIcon;
409
411
return System.IO.Path.GetFileName (searchResult1.FileName).CompareTo (System.IO.Path.GetFileName (searchResult2.FileName));
414
static int CompareProjectFileNames (TreeModel model, TreeIter first, TreeIter second)
416
var searchResult1 = (SearchResult)model.GetValue (first, SearchResultColumn);
417
var searchResult2 = (SearchResult)model.GetValue (second, SearchResultColumn);
418
if (searchResult1 == null || searchResult2 == null ||
419
searchResult1.Projects == null || searchResult2.Projects == null ||
420
searchResult1.Projects.Count == 0 || searchResult2.Projects.Count == 0)
422
return System.IO.Path.GetFileName (searchResult1.Projects[0].FileName).CompareTo (System.IO.Path.GetFileName (searchResult2.Projects[0].FileName));
412
425
static int CompareFilePaths (TreeModel model, TreeIter first, TreeIter second)
414
427
var searchResult1 = (SearchResult)model.GetValue (first, SearchResultColumn);
431
444
bool didRead = (bool)store.GetValue (iter, DidReadColumn);
432
445
pathRenderer.Markup = MarkupText (System.IO.Path.GetDirectoryName (searchResult.FileName), didRead);
435
// void ResultLineDataFunc (TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
437
// if (TreeIter.Zero.Equals (iter))
439
// var lineRenderer = (CellRendererText)cell;
440
// var searchResult = (SearchResult)store.GetValue (iter, SearchResultColumn);
441
// if (searchResult == null)
444
// Document doc = GetDocument (searchResult);
445
// int lineNr = doc.OffsetToLineNumber (searchResult.Offset) + 1;
446
// bool didRead = (bool)store.GetValue (iter, DidReadColumn);
447
// lineRenderer.Markup = MarkupText (lineNr.ToString (), didRead);
448
void ResultProjectIconDataFunc (TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
450
if (TreeIter.Zero.Equals (iter))
452
var fileNamePixbufRenderer = (CellRendererImage) cell;
453
var searchResult = (SearchResult)store.GetValue (iter, SearchResultColumn);
454
if (searchResult == null)
456
if (searchResult.ProjectIcon == null && searchResult.Projects.Count > 0)
457
searchResult.ProjectIcon = ImageService.GetIcon (searchResult.Projects [0].StockIcon).WithSize (Gtk.IconSize.Menu);
458
fileNamePixbufRenderer.Image = searchResult.ProjectIcon;
461
void ResultProjectDataFunc (TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
463
if (TreeIter.Zero.Equals (iter))
465
var pathRenderer = (CellRendererText)cell;
466
var searchResult = (SearchResult)store.GetValue (iter, SearchResultColumn);
467
if (searchResult == null)
469
bool didRead = (bool)store.GetValue (iter, DidReadColumn);
470
if (searchResult.Projects.Count > 0)
471
pathRenderer.Markup = MarkupText (String.Join (", ", searchResult.Projects.Select (p => p.Name)), didRead);
473
pathRenderer.Markup = "";
450
476
void ResultTextDataFunc (TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
452
478
if (TreeIter.Zero.Equals (iter))
487
513
GLib.Markup.EscapeText (lineText);
488
514
searchResult.Markup = AdjustColors (markup.Replace ("\t", new string (' ', TextEditorOptions.DefaultOptions.TabSize)));
493
start = (uint)TextViewMargin.TranslateIndexToUTF8 (lineText, col);
494
end = (uint)TextViewMargin.TranslateIndexToUTF8 (lineText, col + searchResult.Length);
495
} catch (Exception e) {
496
LoggingService.LogError ("Exception while translating index to utf8 (column was:" +col + " search result length:" + searchResult.Length + " line text:" + lineText + ")", e);
520
start = (uint)TextViewMargin.TranslateIndexToUTF8 (lineText, col);
521
end = (uint)TextViewMargin.TranslateIndexToUTF8 (lineText, Math.Min (lineText.Length, col + searchResult.Length));
522
} catch (Exception e) {
523
LoggingService.LogError ("Exception while translating index to utf8 (column was:" + col + " search result length:" + searchResult.Length + " line text:" + lineText + ")", e);
526
searchResult.StartIndex = start;
527
searchResult.EndIndex = end;
499
searchResult.StartIndex = start;
500
searchResult.EndIndex = end;
505
533
textRenderer.Markup = searchResult.Markup;
507
535
if (!isSelected) {
508
var searchColor = highlightStyle.SearchResult.Color;
536
var searchColor = searchResult.GetBackgroundMarkerColor (highlightStyle).Color;
509
537
double b1 = Mono.TextEditor.HslColor.Brightness (searchColor);
510
538
double b2 = Mono.TextEditor.HslColor.Brightness (AdjustColor (Style.Base (StateType.Normal), (Mono.TextEditor.HslColor)highlightStyle.PlainText.Foreground));
511
539
double delta = Math.Abs (b1 - b2);
519
547
searchColor = color1;
521
var attr = new Pango.AttrBackground ((ushort)(searchColor.R * ushort.MaxValue), (ushort)(searchColor.G * ushort.MaxValue), (ushort)(searchColor.B * ushort.MaxValue));
522
attr.StartIndex = searchResult.StartIndex;
523
attr.EndIndex = searchResult.EndIndex;
549
if (searchResult.StartIndex != searchResult.EndIndex) {
550
var attr = new Pango.AttrBackground ((ushort)(searchColor.R * ushort.MaxValue), (ushort)(searchColor.G * ushort.MaxValue), (ushort)(searchColor.B * ushort.MaxValue));
551
attr.StartIndex = searchResult.StartIndex;
552
attr.EndIndex = searchResult.EndIndex;
525
using (var list = textRenderer.Attributes.Copy ()) {
527
textRenderer.Attributes = list;
554
using (var list = textRenderer.Attributes.Copy ()) {
556
textRenderer.Attributes = list;
530
560
} catch (Exception e) {
635
665
return DocumentLocation.Empty;
636
666
int lineNr = doc.OffsetToLineNumber (searchResult.Offset);
637
667
DocumentLine line = doc.GetLine (lineNr);
669
return DocumentLocation.Empty;
638
670
return new DocumentLocation (lineNr, searchResult.Offset - line.Offset + 1);
756
788
var buf = doc.GetContent<IEditableTextBuffer> ();
758
buf.SetCaretTo (Math.Max (Line, 1), Math.Max (Column, 1));
790
doc.DisableAutoScroll ();
791
buf.RunWhenLoaded (() => {
792
buf.SetCaretTo (Math.Max (Line, 1), Math.Max (Column, 1));