public override void Run(RefactoringOptions options)
        {
            DocumentLocation location      = options.GetTextEditorData().Caret.Location;
            IType            interfaceType = options.Dom.GetType(options.ResolveResult.ResolvedType);
            IType            declaringType = options.Document.CompilationUnit.GetTypeAt(location.Line + 1, location.Column + 1);

            var editor = options.GetTextEditorData().Parent;

            InsertionCursorEditMode mode       = new InsertionCursorEditMode(editor, HelperMethods.GetInsertionPoints(editor.Document, declaringType));
            ModeHelpWindow          helpWindow = new ModeHelpWindow();

            helpWindow.TransientFor = IdeApp.Workbench.RootWindow;
            helpWindow.TitleText    = GettextCatalog.GetString("<b>Implement Interface -- Targeting</b>");
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Key</b>"), GettextCatalog.GetString("<b>Behavior</b>")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Up</b>"), GettextCatalog.GetString("Move to <b>previous</b> target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Down</b>"), GettextCatalog.GetString("Move to <b>next</b> target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Enter</b>"), GettextCatalog.GetString("<b>Declare interface implementation</b> at target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Esc</b>"), GettextCatalog.GetString("<b>Cancel</b> this refactoring.")));
            mode.HelpWindow = helpWindow;
            mode.CurIndex   = mode.InsertionPoints.Count - 1;
            mode.StartMode();
            mode.Exited += delegate(object s, InsertionCursorEventArgs args) {
                if (args.Success)
                {
                    CodeGenerator generator = CodeGenerator.CreateGenerator(options.GetTextEditorData().Document.MimeType);
                    args.InsertionPoint.Insert(editor, generator.CreateInterfaceImplementation(declaringType, interfaceType, false));
                }
            };
        }
Esempio n. 2
0
        void OnOKClicked(object sender, EventArgs e)
        {
            try {
                StringBuilder code          = new StringBuilder();
                CodeGenerator generator     = CodeGenerator.CreateGenerator(editor.Editor.Document.MimeType, editor.Editor.TabsToSpaces, editor.Editor.Options.TabSize, editor.Editor.EolMarker);
                IType         declaringType = editor.GetType(cls.Location.Line, cls.Location.Column) ?? cls;

                foreach (KeyValuePair <IType, IEnumerable <TreeIter> > kvp in GetAllClasses())
                {
                    if (code.Length > 0)
                    {
                        code.AppendLine();
                        code.AppendLine();
                    }

                    //update the target class so that new members don't get inserted in weird locations
                    StringBuilder curImpl = new StringBuilder();
                    foreach (var pair in YieldImpls(kvp))
                    {
                        if (curImpl.Length > 0)
                        {
                            curImpl.AppendLine();
                            curImpl.AppendLine();
                        }
                        curImpl.Append(generator.CreateMemberImplementation(declaringType, pair.Key, pair.Value != null).Code);
                    }
                    if (kvp.Key.ClassType == ClassType.Interface)
                    {
                        code.Append(generator.WrapInRegions(kvp.Key.Name + " implementation", curImpl.ToString()));
                    }
                    else
                    {
                        code.Append(curImpl.ToString());
                    }
                }

                var mode       = new InsertionCursorEditMode(editor.Editor.Parent, CodeGenerationService.GetInsertionPoints(editor, this.cls));
                var helpWindow = new ModeHelpWindow();
                helpWindow.Shown       += (s, a) => DesktopService.RemoveWindowShadow(helpWindow);
                helpWindow.TransientFor = IdeApp.Workbench.RootWindow;
                helpWindow.TitleText    = GettextCatalog.GetString("<b>Override -- Targeting</b>");
                helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Key</b>"), GettextCatalog.GetString("<b>Behavior</b>")));
                helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Up</b>"), GettextCatalog.GetString("Move to <b>previous</b> target point.")));
                helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Down</b>"), GettextCatalog.GetString("Move to <b>next</b> target point.")));
                helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Enter</b>"), GettextCatalog.GetString("<b>Declare overrides</b> at target point.")));
                helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Esc</b>"), GettextCatalog.GetString("<b>Cancel</b> this refactoring.")));
                mode.HelpWindow = helpWindow;
                mode.CurIndex   = mode.InsertionPoints.Count - 1;
                mode.StartMode();
                mode.Exited += delegate(object s, InsertionCursorEventArgs args) {
                    if (args.Success)
                    {
                        args.InsertionPoint.Insert(editor.Editor, code.ToString());
                    }
                };
            } finally {
                ((Widget)this).Destroy();
            }
        }
 public void DestroyHelpWindow()
 {
     if (HelpWindow == null)
     {
         return;
     }
     editor.SizeAllocated -= MoveHelpWindow;
     HelpWindow.Destroy();
     HelpWindow = null;
 }
Esempio n. 4
0
 public virtual void DestroyHelpWindow()
 {
     if (HelpWindow == null)
     {
         return;
     }
     editor.SizeAllocated -= MoveHelpWindow;
     editor.Destroyed     -= HandleEditorDestroy;
     HelpWindow.Destroy();
     HelpWindow = null;
 }
 public virtual void DestroyHelpWindow()
 {
     if (HelpWindow == null)
     {
         return;
     }
     editor.BoundsChanged -= MoveHelpWindow;
     editor.Dispose       -= HandleEditorDestroy;
     HelpWindow.Dispose();
     HelpWindow = null;
 }
 public virtual void DestroyHelpWindow()
 {
     if (HelpWindow == null)
     {
         return;
     }
     editor.TextArea.Remove(HelpWindow);
     editor.SizeAllocated -= MoveHelpWindow;
     editor.VScroll       -= HandleVScroll;
     editor.Destroyed     -= HandleEditorDestroy;
     HelpWindow.Destroy();
     HelpWindow = null;
 }
Esempio n. 7
0
 public virtual void DisposeHelpWindow()
 {
     if (HelpWindow == null)
     {
         return;
     }
     editor.TextArea.RemoveChild(HelpWindow);
     editor.SizeAllocated -= MoveHelpWindow;
     editor.VScroll       -= HandleVScroll;
     editor.Disposed      -= HandleEditorDispose;
     HelpWindow.Dispose();
     HelpWindow = null;
 }
Esempio n. 8
0
        void OnOKClicked(object sender, EventArgs e)
        {
            TextEditorData data = options.GetTextEditorData();

            Mono.TextEditor.TextEditor editor = data.Parent;
// Insertion cursor mode test:
            if (editor != null)
            {
                IType type = properties.DeclaringMember.DeclaringType;

                InsertionCursorEditMode mode = new InsertionCursorEditMode(editor, CodeGenerationService.GetInsertionPoints(options.Document, type));
                for (int i = 0; i < mode.InsertionPoints.Count; i++)
                {
                    var point = mode.InsertionPoints[i];
                    if (point.Location < editor.Caret.Location)
                    {
                        mode.CurIndex = i;
                    }
                    else
                    {
                        break;
                    }
                }
                ModeHelpWindow helpWindow = new ModeHelpWindow();
                helpWindow.TransientFor = IdeApp.Workbench.RootWindow;
                helpWindow.TitleText    = GettextCatalog.GetString("<b>Extract Method -- Targeting</b>");
                helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Key</b>"), GettextCatalog.GetString("<b>Behavior</b>")));
                helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Up</b>"), GettextCatalog.GetString("Move to <b>previous</b> target point.")));
                helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Down</b>"), GettextCatalog.GetString("Move to <b>next</b> target point.")));
                helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Enter</b>"), GettextCatalog.GetString("<b>Declare new method</b> at target point.")));
                helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Esc</b>"), GettextCatalog.GetString("<b>Cancel</b> this refactoring.")));
                mode.HelpWindow = helpWindow;
                mode.StartMode();
                methodName       = entry.Text;
                activeModifier   = comboboxModifiers.Active;
                generateComments = checkbuttonGenerateComment.Active;

                mode.Exited += delegate(object s, InsertionCursorEventArgs args) {
                    if (args.Success)
                    {
                        SetProperties();
                        properties.InsertionPoint = args.InsertionPoint;
                        List <Change>    changes = extractMethod.PerformChanges(options, properties);
                        IProgressMonitor monitor = IdeApp.Workbench.ProgressMonitors.GetBackgroundProgressMonitor(this.Title, null);
                        RefactoringService.AcceptChanges(monitor, options.Dom, changes);
                    }
                };
            }

            ((Widget)this).Destroy();
        }
        public static void Implement(MonoDevelop.Ide.Gui.Document document, IType abstractType)
        {
            TextEditor editor = document.Editor.Parent;

            DocumentLocation location      = editor.Caret.Location;
            IType            declaringType = document.CompilationUnit.GetTypeAt(location.Line, location.Column);

            InsertionCursorEditMode mode       = new InsertionCursorEditMode(editor, CodeGenerationService.GetInsertionPoints(document, declaringType));
            ModeHelpWindow          helpWindow = new ModeHelpWindow();

            helpWindow.TransientFor = IdeApp.Workbench.RootWindow;
            helpWindow.TitleText    = GettextCatalog.GetString("<b>Implement abstract members -- Targeting</b>");
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Key</b>"), GettextCatalog.GetString("<b>Behavior</b>")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Up</b>"), GettextCatalog.GetString("Move to <b>previous</b> target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Down</b>"), GettextCatalog.GetString("Move to <b>next</b> target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Enter</b>"), GettextCatalog.GetString("<b>Declare interface implementation</b> at target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Esc</b>"), GettextCatalog.GetString("<b>Cancel</b> this refactoring.")));
            mode.HelpWindow = helpWindow;
            mode.CurIndex   = mode.InsertionPoints.Count - 1;
            mode.StartMode();
            mode.Exited += delegate(object s, InsertionCursorEventArgs args) {
                if (args.Success)
                {
                    CodeGenerator generator = document.CreateCodeGenerator();
                    var           missingAbstractMembers = abstractType.Members.Where(member => member.IsAbstract && !member.IsSpecialName && !declaringType.Members.Any(m => member.Name == m.Name));
                    StringBuilder sb = new StringBuilder();
                    foreach (var member in missingAbstractMembers)
                    {
                        if (sb.Length > 0)
                        {
                            sb.Append(editor.EolMarker);
                            sb.Append(editor.EolMarker);
                        }

                        sb.Append(generator.CreateMemberImplementation(declaringType, member, false).Code);
                    }
                    args.InsertionPoint.Insert(document.Editor, generator.WrapInRegions("implemented abstract members of " + abstractType.FullName, sb.ToString()));
                }
            };
        }
        void OnOKClicked(object sender, EventArgs e)
        {
            TreeIter iter;

            if (!store.GetIterFirst(out iter))
            {
                return;
            }

            List <FieldData> data = new List <FieldData> ();

            do
            {
                bool selected = (bool)store.GetValue(iter, colCheckedIndex);
                if (!selected)
                {
                    continue;
                }

                string    propertyName = (string)store.GetValue(iter, colPropertyNameIndex);
                string    visibility   = (string)store.GetValue(iter, colVisibilityIndex);
                bool      read_only    = (bool)store.GetValue(iter, colReadOnlyIndex);
                IField    field        = (IField)store.GetValue(iter, colFieldIndex);
                Modifiers mod          = Modifiers.None;
                if (visibility.ToUpper() == "PUBLIC")
                {
                    mod = Modifiers.Public;
                }
                if (visibility.ToUpper() == "PRIVATE")
                {
                    mod = Modifiers.Private;
                }
                if (visibility.ToUpper() == "PROTECTED")
                {
                    mod = Modifiers.Protected;
                }
                if (visibility.ToUpper() == "INTERNAL")
                {
                    mod = Modifiers.Internal;
                }
                data.Add(new FieldData(field, propertyName, read_only, mod));
            } while (store.IterNext(ref iter));

            InsertionCursorEditMode mode       = new InsertionCursorEditMode(editor, HelperMethods.GetInsertionPoints(editor.Document, declaringType));
            ModeHelpWindow          helpWindow = new ModeHelpWindow();

            helpWindow.TransientFor = IdeApp.Workbench.RootWindow;
            helpWindow.TitleText    = GettextCatalog.GetString("<b>Encapsulate Field -- Targeting</b>");
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Key</b>"), GettextCatalog.GetString("<b>Behavior</b>")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Up</b>"), GettextCatalog.GetString("Move to <b>previous</b> target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Down</b>"), GettextCatalog.GetString("Move to <b>next</b> target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Enter</b>"), GettextCatalog.GetString("<b>Declare new property</b> at target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Esc</b>"), GettextCatalog.GetString("<b>Cancel</b> this refactoring.")));
            mode.HelpWindow = helpWindow;
            mode.CurIndex   = mode.InsertionPoints.Count - 1;
            int         idx = -1, i = 0;
            DomLocation lastLocation = DomLocation.Empty;

            foreach (IMember member in declaringType.Members)
            {
                if (lastLocation != member.Location && data.Any(d => d.Field.Location == member.Location))
                {
                    idx = i;
                }
                lastLocation = member.Location;
                i++;
            }
            if (idx >= 0)
            {
                mode.CurIndex = idx + 1;
            }
            mode.StartMode();
            mode.Exited += delegate(object s, InsertionCursorEventArgs args) {
                if (args.Success)
                {
                    CodeGenerator generator = CodeGenerator.CreateGenerator(editor.Document.MimeType);
                    StringBuilder code      = new StringBuilder();
                    for (int j = 0; j < data.Count; j++)
                    {
                        if (j > 0)
                        {
                            code.AppendLine();
                            code.AppendLine();
                        }
                        var f = data[j];
                        code.Append(generator.CreateFieldEncapsulation(declaringType, f.Field, f.PropertyName, f.Modifiers, f.ReadOnly));
                    }
                    args.InsertionPoint.Insert(editor, code.ToString());
                }
            };
            ((Widget)this).Destroy();
        }
Esempio n. 11
0
        public override void Run(RefactoringOptions options)
        {
            IResolver resolver = options.GetResolver();
            INRefactoryASTProvider provider = options.GetASTProvider();
            TextEditorData         data     = options.GetTextEditorData();
            IType type = options.ResolveResult.CallingType;

            if (invoke.TargetObject is IdentifierExpression)
            {
                fileName      = options.Document.FileName;
                newMethodName = ((IdentifierExpression)invoke.TargetObject).Identifier;
                indent        = options.GetIndent(options.ResolveResult.CallingMember);
                if (options.ResolveResult.CallingMember.IsStatic)
                {
                    modifiers |= ICSharpCode.NRefactory.Ast.Modifiers.Static;
                }
            }
            else
            {
                newMethodName = ((MemberReferenceExpression)invoke.TargetObject).MemberName;
                string        callingObject = provider.OutputNode(options.Dom, ((MemberReferenceExpression)invoke.TargetObject).TargetObject);
                ResolveResult resolveResult = resolver.Resolve(new ExpressionResult(callingObject), resolvePosition);
                type     = options.Dom.GetType(resolveResult.ResolvedType);
                fileName = type.CompilationUnit.FileName;
                if (resolveResult.StaticResolve)
                {
                    modifiers |= ICSharpCode.NRefactory.Ast.Modifiers.Static;
                }

                if (fileName == options.Document.FileName)
                {
                    indent = options.GetIndent(options.ResolveResult.CallingMember);
//					insertNewMethod.Offset = options.Document.TextEditor.GetPositionFromLineColumn (options.ResolveResult.CallingMember.BodyRegion.End.Line, options.ResolveResult.CallingMember.BodyRegion.End.Column);
                }
                else
                {
                    var openDocument = IdeApp.Workbench.OpenDocument(fileName);
                    data = openDocument.TextEditorData;
                    if (data == null)
                    {
                        return;
                    }
                    modifiers |= ICSharpCode.NRefactory.Ast.Modifiers.Public;
                    bool isInInterface = type.ClassType == MonoDevelop.Projects.Dom.ClassType.Interface;
                    if (isInInterface)
                    {
                        modifiers = ICSharpCode.NRefactory.Ast.Modifiers.None;
                    }
                    if (data == null)
                    {
                        throw new InvalidOperationException("Can't open file:" + modifiers);
                    }
                    try {
                        indent = data.Document.GetLine(type.Location.Line - 1).GetIndentation(data.Document) ?? "";
                    } catch (Exception) {
                        indent = "";
                    }
                    indent += "\t";
//					insertNewMethod.Offset = otherFile.Document.LocationToOffset (type.BodyRegion.End.Line - 1, 0);
                }
            }

            InsertionCursorEditMode mode = new InsertionCursorEditMode(data.Parent, HelperMethods.GetInsertionPoints(data.Document, type));

            if (fileName == options.Document.FileName)
            {
                for (int i = 0; i < mode.InsertionPoints.Count; i++)
                {
                    var point = mode.InsertionPoints[i];
                    if (point.Location < data.Caret.Location)
                    {
                        mode.CurIndex = i;
                    }
                    else
                    {
                        break;
                    }
                }
            }

            ModeHelpWindow helpWindow = new ModeHelpWindow();

            helpWindow.TransientFor = IdeApp.Workbench.RootWindow;
            helpWindow.TitleText    = GettextCatalog.GetString("<b>Create Method -- Targeting</b>");
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Key</b>"), GettextCatalog.GetString("<b>Behavior</b>")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Up</b>"), GettextCatalog.GetString("Move to <b>previous</b> target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Down</b>"), GettextCatalog.GetString("Move to <b>next</b> target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Enter</b>"), GettextCatalog.GetString("<b>Declare new method</b> at target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Esc</b>"), GettextCatalog.GetString("<b>Cancel</b> this refactoring.")));
            mode.HelpWindow = helpWindow;
            mode.StartMode();
            mode.Exited += delegate(object s, InsertionCursorEventArgs args) {
                if (args.Success)
                {
                    insertionPoint  = args.InsertionPoint;
                    insertionOffset = data.Document.LocationToOffset(args.InsertionPoint.Location);
                    base.Run(options);
                    if (string.IsNullOrEmpty(fileName))
                    {
                        return;
                    }
                    MonoDevelop.Ide.Gui.Document document = IdeApp.Workbench.OpenDocument(fileName);
                    TextEditorData docData = document.TextEditorData;
                    if (docData != null)
                    {
                        docData.ClearSelection();
                        docData.Caret.Offset = selectionEnd;
                        docData.SetSelection(selectionStart, selectionEnd);
                    }
                }
            };
        }
Esempio n. 12
0
        public override void Run(RefactoringOptions options)
        {
            TextEditorData data = options.GetTextEditorData();

            fileName = declaringType.CompilationUnit.FileName;

            var openDocument = IdeApp.Workbench.OpenDocument(fileName);

            if (openDocument == null)
            {
                MessageService.ShowError(string.Format(GettextCatalog.GetString("Can't open file {0}."), fileName));
                return;
            }
            data = openDocument.Editor;
            if (data == null)
            {
                return;
            }

            if (data == null)
            {
                throw new InvalidOperationException("Can't open file:" + modifiers);
            }
            try {
                indent = data.Document.GetLine(declaringType.Location.Line).GetIndentation(data.Document) ?? "";
            } catch (Exception) {
                indent = "";
            }
            indent += "\t";

            InsertionCursorEditMode mode = new InsertionCursorEditMode(data.Parent, CodeGenerationService.GetInsertionPoints(options.Document, declaringType));

            if (fileName == options.Document.FileName)
            {
                for (int i = 0; i < mode.InsertionPoints.Count; i++)
                {
                    var point = mode.InsertionPoints [i];
                    if (point.Location < data.Caret.Location)
                    {
                        mode.CurIndex = i;
                    }
                    else
                    {
                        break;
                    }
                }
            }

            ModeHelpWindow helpWindow = new ModeHelpWindow();

            helpWindow.TransientFor = IdeApp.Workbench.RootWindow;
            helpWindow.TitleText    = GettextCatalog.GetString("<b>Create Method -- Targeting</b>");
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Key</b>"), GettextCatalog.GetString("<b>Behavior</b>")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Up</b>"), GettextCatalog.GetString("Move to <b>previous</b> target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Down</b>"), GettextCatalog.GetString("Move to <b>next</b> target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Enter</b>"), GettextCatalog.GetString("<b>Declare new method</b> at target point.")));
            helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Esc</b>"), GettextCatalog.GetString("<b>Cancel</b> this refactoring.")));
            mode.HelpWindow = helpWindow;
            mode.StartMode();
            mode.Exited += delegate(object s, InsertionCursorEventArgs args) {
                if (args.Success)
                {
                    SetInsertionPoint(args.InsertionPoint);
                    BaseRun(options);
                    if (string.IsNullOrEmpty(fileName))
                    {
                        return;
                    }
                    MonoDevelop.Ide.Gui.Document document = IdeApp.Workbench.OpenDocument(fileName);
                    TextEditorData docData = document.Editor;
                    if (docData != null)
                    {
                        docData.ClearSelection();
                        docData.Caret.Offset = selectionEnd;
                        docData.SetSelection(selectionStart, selectionEnd);
                    }
                }
            };
        }
Esempio n. 13
0
        public override void Run(RefactoringOptions options)
        {
            if (options.SelectedItem is LocalVariable || options.SelectedItem is IParameter)
            {
                var col = ReferenceFinder.FindReferences(options.SelectedItem);
                if (col == null)
                {
                    return;
                }
                TextEditorData             data   = options.GetTextEditorData();
                Mono.TextEditor.TextEditor editor = data.Parent;
                if (editor == null)
                {
                    MessageService.ShowCustomDialog(new RenameItemDialog(options, this));
                    return;
                }

                List <TextLink> links      = new List <TextLink> ();
                TextLink        link       = new TextLink("name");
                int             baseOffset = Int32.MaxValue;
                foreach (MemberReference r in col)
                {
                    baseOffset = Math.Min(baseOffset, data.Document.LocationToOffset(r.Line, r.Column));
                }
                foreach (MemberReference r in col)
                {
                    Segment segment = new Segment(data.Document.LocationToOffset(r.Line, r.Column) - baseOffset, r.Name.Length);
                    if (segment.Offset <= data.Caret.Offset - baseOffset && data.Caret.Offset - baseOffset <= segment.EndOffset)
                    {
                        link.Links.Insert(0, segment);
                    }
                    else
                    {
                        link.AddLink(segment);
                    }
                }

                links.Add(link);
                if (editor.CurrentMode is TextLinkEditMode)
                {
                    ((TextLinkEditMode)editor.CurrentMode).ExitTextLinkMode();
                }
                TextLinkEditMode tle = new TextLinkEditMode(editor, baseOffset, links);
                tle.SetCaretPosition  = false;
                tle.SelectPrimaryLink = true;
                if (tle.ShouldStartTextLinkMode)
                {
                    ModeHelpWindow helpWindow = new ModeHelpWindow();
                    helpWindow.TransientFor = IdeApp.Workbench.RootWindow;
                    helpWindow.TitleText    = options.SelectedItem is LocalVariable?GettextCatalog.GetString("<b>Local Variable -- Renaming</b>") : GettextCatalog.GetString("<b>Parameter -- Renaming</b>");

                    helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Key</b>"), GettextCatalog.GetString("<b>Behavior</b>")));
                    helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Return</b>"), GettextCatalog.GetString("<b>Accept</b> this refactoring.")));
                    helpWindow.Items.Add(new KeyValuePair <string, string> (GettextCatalog.GetString("<b>Esc</b>"), GettextCatalog.GetString("<b>Cancel</b> this refactoring.")));
                    tle.HelpWindow = helpWindow;
                    tle.Cancel    += delegate {
                        editor.Document.Undo();
                    };
                    tle.OldMode = data.CurrentMode;
                    tle.StartMode();
                    data.CurrentMode = tle;
                }
            }
            else
            {
                MessageService.ShowCustomDialog(new RenameItemDialog(options, this));
            }
        }