5
// Mike KrĆ¼ger <mkrueger@novell.com>
7
// Copyright (c) 2010 Novell, Inc (http://www.novell.com)
9
// Permission is hereby granted, free of charge, to any person obtaining a copy
10
// of this software and associated documentation files (the "Software"), to deal
11
// in the Software without restriction, including without limitation the rights
12
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
// copies of the Software, and to permit persons to whom the Software is
14
// furnished to do so, subject to the following conditions:
16
// The above copyright notice and this permission notice shall be included in
17
// all copies or substantial portions of the Software.
19
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
31
using MonoDevelop.Core;
32
using MonoDevelop.Core.Text;
33
using MonoDevelop.Projects;
34
using ICSharpCode.NRefactory.TypeSystem;
35
using MonoDevelop.Ide.TypeSystem;
36
using MonoDevelop.Components.Commands;
37
using MonoDevelop.Ide.CodeCompletion;
38
using MonoDevelop.Ide;
40
namespace MonoDevelop.Components.MainToolbar
42
public enum SearchResultType
50
abstract class SearchResult
52
protected string match;
54
public virtual string GetMarkupText (Widget widget)
56
return HighlightMatch (widget, PlainText, match);
59
public virtual string GetDescriptionMarkupText (Widget widget)
61
return AmbienceService.EscapeText (Description);
65
public abstract SearchResultType SearchResultType { get; }
66
public abstract string PlainText { get; }
68
public int Rank { get; private set; }
70
public virtual int Row { get { return -1; } }
71
public virtual int Column { get { return -1; } }
73
public abstract string File { get; }
74
public abstract Gdk.Pixbuf Icon { get; }
76
public abstract string Description { get; }
77
public string MatchedString { get; private set;}
79
public abstract TooltipInformation TooltipInformation { get; }
81
public SearchResult (string match, string matchedString, int rank)
84
this.MatchedString = matchedString;
88
protected static string HighlightMatch (Widget widget, string text, string toMatch)
90
var lane = StringMatcher.GetMatcher (toMatch, true).GetMatch (text);
91
StringBuilder result = new StringBuilder ();
94
for (int n=0; n < lane.Length; n++) {
96
if (pos - lastPos > 0)
97
MarkupUtilities.AppendEscapedString (result, text.Substring (lastPos, pos - lastPos));
98
result.Append ("<span foreground=\"#4d4d4d\" font_weight=\"bold\">");
99
MarkupUtilities.AppendEscapedString (result, text[pos].ToString ());
100
result.Append ("</span>");
103
if (lastPos < text.Length)
104
MarkupUtilities.AppendEscapedString (result, text.Substring (lastPos, text.Length - lastPos));
106
MarkupUtilities.AppendEscapedString (result, text);
108
return result.ToString ();
111
public virtual bool CanActivate {
112
get { return false; }
115
public virtual void Activate ()
120
class TypeSearchResult : MemberSearchResult
122
ITypeDefinition type;
124
public override SearchResultType SearchResultType { get { return SearchResultType.Type; } }
126
public override string File {
127
get { return type.Region.FileName; }
130
public override Gdk.Pixbuf Icon {
132
return ImageService.GetPixbuf (type.GetStockIcon (false), IconSize.Menu);
136
public override int Row {
137
get { return type.Region.BeginLine; }
140
public override int Column {
141
get { return type.Region.BeginColumn; }
144
public static string GetPlainText (ITypeDefinition type, bool useFullName)
146
if (type.TypeParameterCount == 0)
147
return useFullName ? type.FullName : type.Name;
148
StringBuilder sb = new StringBuilder (useFullName ? type.FullName : type.Name);
150
for (int i = 0; i < type.TypeParameterCount; i++) {
153
sb.Append (type.TypeParameters [i].Name);
156
return sb.ToString ();
159
public override string PlainText {
161
return GetPlainText (type, false);
165
public override MonoDevelop.Ide.CodeCompletion.TooltipInformation TooltipInformation {
167
return Ambience.GetTooltip (type);
171
public override string Description {
174
if (type.GetSourceProject () != null) {
175
loc = GettextCatalog.GetString ("project {0}", type.GetSourceProject ().Name);
177
loc = GettextCatalog.GetString ("file {0}", type.Region.FileName);
181
case TypeKind.Interface:
182
return GettextCatalog.GetString ("interface ({0})", loc);
183
case TypeKind.Struct:
184
return GettextCatalog.GetString ("struct ({0})", loc);
185
case TypeKind.Delegate:
186
return GettextCatalog.GetString ("delegate ({0})", loc);
188
return GettextCatalog.GetString ("enumeration ({0})", loc);
190
return GettextCatalog.GetString ("class ({0})", loc);
195
public override string GetMarkupText (Widget widget)
197
return HighlightMatch (widget, GetPlainText (type, useFullName), match);
200
public TypeSearchResult (string match, string matchedString, int rank, ITypeDefinition type, bool useFullName) : base (match, matchedString, rank, null, null, useFullName)
206
class FileSearchResult: SearchResult
211
public override SearchResultType SearchResultType { get { return SearchResultType.File; } }
213
public override string PlainText {
216
return System.IO.Path.GetFileName (file.FilePath);
217
return GetRelProjectPath (file);
221
public override string File {
223
return file.FilePath;
227
public override Gdk.Pixbuf Icon {
229
return DesktopService.GetPixbufForFile (file.FilePath, IconSize.Menu);
233
public override MonoDevelop.Ide.CodeCompletion.TooltipInformation TooltipInformation {
239
public override string Description {
242
return file.Project != null
243
? GettextCatalog.GetString ("file \"{0}\" in project \"{1}\"", GetRelProjectPath (file), file.Project.Name)
244
: GettextCatalog.GetString ("file \"{0}\"", GetRelProjectPath (file));
245
return file.Project != null ? GettextCatalog.GetString ("file in project \"{0}\"", file.Project.Name) : "";
249
public FileSearchResult (string match, string matchedString, int rank, ProjectFile file, bool useFileName)
250
: base (match, matchedString, rank)
253
this.useFileName = useFileName;
256
internal static string GetRelProjectPath (ProjectFile file)
258
if (file.Project != null)
259
return file.ProjectVirtualPath;
260
return file.FilePath;
264
class MemberSearchResult : SearchResult
266
protected bool useFullName;
267
protected IUnresolvedMember member;
268
protected ITypeDefinition declaringType;
270
public override SearchResultType SearchResultType { get { return SearchResultType.Member; } }
272
protected virtual OutputFlags Flags {
274
return OutputFlags.IncludeParameters | OutputFlags.IncludeGenerics
275
| (useFullName ? OutputFlags.UseFullName : OutputFlags.None);
279
public override string PlainText {
285
public override MonoDevelop.Ide.CodeCompletion.TooltipInformation TooltipInformation {
287
var ctx = member.DeclaringTypeDefinition.CreateResolveContext (new SimpleTypeResolveContext (declaringType));
288
return Ambience.GetTooltip (member.Resolve (ctx));
292
public override string File {
293
get { return member.DeclaringTypeDefinition.Region.FileName; }
296
public override Gdk.Pixbuf Icon {
298
return ImageService.GetPixbuf (member.GetStockIcon (false), IconSize.Menu);
302
public override int Row {
303
get { return member.Region.BeginLine; }
306
public override int Column {
307
get { return member.Region.BeginColumn; }
310
public override string Description {
312
string loc = GettextCatalog.GetString ("type \"{0}\"", member.DeclaringTypeDefinition.Name);
314
switch (member.EntityType) {
315
case EntityType.Field:
316
return GettextCatalog.GetString ("field ({0})", loc);
317
case EntityType.Property:
318
return GettextCatalog.GetString ("property ({0})", loc);
319
case EntityType.Indexer:
320
return GettextCatalog.GetString ("indexer ({0})", loc);
321
case EntityType.Event:
322
return GettextCatalog.GetString ("event ({0})", loc);
323
case EntityType.Method:
324
return GettextCatalog.GetString ("method ({0})", loc);
325
case EntityType.Operator:
326
return GettextCatalog.GetString ("operator ({0})", loc);
327
case EntityType.Constructor:
328
return GettextCatalog.GetString ("constructor ({0})", loc);
329
case EntityType.Destructor:
330
return GettextCatalog.GetString ("destrutcor ({0})", loc);
332
throw new NotSupportedException (member.EntityType + " is not supported.");
337
public MemberSearchResult (string match, string matchedString, int rank, ITypeDefinition declaringType, IUnresolvedMember member, bool useFullName) : base (match, matchedString, rank)
339
this.declaringType = declaringType;
340
this.member = member;
341
this.useFullName = useFullName;
344
public override string GetMarkupText (Widget widget)
347
return HighlightMatch (widget, member.EntityType == EntityType.Constructor ? member.DeclaringTypeDefinition.FullName : member.FullName, match);
348
return HighlightMatch (widget, member.EntityType == EntityType.Constructor ? member.DeclaringTypeDefinition.Name : member.Name, match);
351
internal Ambience Ambience {
357
class CommandResult: SearchResult
361
CommandTargetRoute route;
363
public CommandResult (Command cmd, CommandInfo ci, CommandTargetRoute route, string match, string matchedString, int rank): base (match, matchedString, rank)
370
public override SearchResultType SearchResultType {
372
return SearchResultType.Command;
376
public override string PlainText {
378
return MatchedString;
382
public override string File {
388
public override Pixbuf Icon {
390
return ImageService.GetPixbuf ("md-command", IconSize.Menu);
394
public override MonoDevelop.Ide.CodeCompletion.TooltipInformation TooltipInformation {
400
public override string Description {
403
if (!string.IsNullOrEmpty (ci.AccelKey))
404
desc = KeyBindingManager.BindingToDisplayLabel (ci.AccelKey, false);
405
if (!string.IsNullOrEmpty (ci.Description)) {
408
desc += ci.Description;
410
else if (desc.Length == 0) {
413
if (!string.IsNullOrEmpty (command.Category))
414
desc += " (" + command.Category + ")";
419
public override string GetMarkupText (Widget widget)
421
return HighlightMatch (widget, MatchedString, match);
424
public override bool CanActivate {
430
public override void Activate ()
432
IdeApp.CommandService.DispatchCommand (command.Id, null, route.InitialTarget, CommandSource.MainToolbar);