~halega/+junk/sharpdevelop

« back to all changes in this revision

Viewing changes to src/Main/Base/Project/Src/Editor/CodeCompletion/OverrideCompletionItem.cs

  • Committer: sk
  • Date: 2011-09-10 05:17:57 UTC
  • Revision ID: halega@halega.com-20110910051757-qfouz1llya9m6boy
4.1.0.7915 Release Candidate 1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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)
 
3
 
 
4
using System;
 
5
using System.Collections.Generic;
 
6
using ICSharpCode.Core;
 
7
using ICSharpCode.SharpDevelop.Dom;
 
8
using ICSharpCode.SharpDevelop.Dom.Refactoring;
 
9
 
 
10
namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
 
11
{
 
12
        public sealed class OverrideCompletionItem : ICompletionItem
 
13
        {
 
14
                IMember member;
 
15
                
 
16
                public IMember Member {
 
17
                        get { return member; }
 
18
                }
 
19
                
 
20
                string text;
 
21
                IImage image;
 
22
                
 
23
                static readonly List<ICompletionItemHandler> handlers = AddInTree.BuildItems<ICompletionItemHandler>("/SharpDevelop/ViewContent/TextEditor/OverrideCompletionHandler", null, false);
 
24
                
 
25
                public OverrideCompletionItem(IMember member)
 
26
                {
 
27
                        if (member == null)
 
28
                                throw new ArgumentNullException("member");
 
29
                        this.member = member;
 
30
                        
 
31
                        this.text = GetName(member, ConversionFlags.ShowParameterList);
 
32
                        this.image = ClassBrowserIconService.GetIcon(member);
 
33
                }
 
34
                
 
35
                public string Text {
 
36
                        get { return text; }
 
37
                }
 
38
                
 
39
                public IImage Image {
 
40
                        get { return image; }
 
41
                }
 
42
                
 
43
                public string Description {
 
44
                        get {
 
45
                                return "override " + GetName(member, ConversionFlags.ShowReturnType
 
46
                                                             | ConversionFlags.ShowParameterList
 
47
                                                             | ConversionFlags.ShowAccessibility)
 
48
                                        + "\n\n" + CodeCompletionItem.ConvertDocumentation(member.Documentation);
 
49
                        }
 
50
                }
 
51
                
 
52
                double ICompletionItem.Priority { get { return 0; } }
 
53
                
 
54
                static string GetName(IMember member, ConversionFlags flags)
 
55
                {
 
56
                        IAmbience ambience = AmbienceService.GetCurrentAmbience();
 
57
                        ambience.ConversionFlags = flags | ConversionFlags.ShowParameterNames | ConversionFlags.ShowTypeParameterList;
 
58
                        return ambience.Convert(member);
 
59
                }
 
60
                
 
61
                public void Complete(CompletionContext context)
 
62
                {
 
63
                        ITextEditor editor = context.Editor;
 
64
                        ClassFinder classFinder = new ClassFinder(ParserService.GetParseInformation(editor.FileName),
 
65
                                                                  editor.Caret.Line, editor.Caret.Column);
 
66
                        int caretPosition = editor.Caret.Offset;
 
67
                        IDocumentLine line = editor.Document.GetLine(editor.Caret.Line);
 
68
                        string lineText = editor.Document.GetText(line.Offset, caretPosition - line.Offset);
 
69
                        foreach (char c in lineText) {
 
70
                                if (!char.IsWhiteSpace(c) && !char.IsLetterOrDigit(c)) {
 
71
                                        editor.Document.Replace(context.StartOffset, context.Length, this.Text);
 
72
                                        context.EndOffset = context.StartOffset + this.Text.Length;
 
73
                                        return;
 
74
                                }
 
75
                        }
 
76
                        
 
77
                        string indentation = lineText.Substring(0, lineText.Length - lineText.TrimStart().Length);
 
78
 
 
79
                        editor.Document.Remove(line.Offset, caretPosition - line.Offset);
 
80
                        
 
81
                        foreach (ICompletionItemHandler handler in handlers) {
 
82
                                if (handler.Handles(this)) {
 
83
                                        editor.Document.Insert(line.Offset, indentation);
 
84
                                        handler.Insert(context, this);
 
85
                                        return;
 
86
                                }
 
87
                        }
 
88
                        
 
89
                        CodeGenerator codeGen = ParserService.CurrentProjectContent.Language.CodeGenerator;
 
90
                        
 
91
                        string text = codeGen.GenerateCode(codeGen.GetOverridingMethod(member, classFinder), indentation);
 
92
                        text = text.TrimEnd(); // remove newline from end
 
93
                        
 
94
                        editor.Document.Insert(line.Offset, text);
 
95
                        
 
96
                        int endPos = line.Offset + text.Length;
 
97
                        line = editor.Document.GetLineForOffset(endPos);
 
98
                        editor.JumpTo(line.LineNumber, endPos - line.Offset + 1);
 
99
                }
 
100
        }
 
101
}