예제 #1
0
        public void InsertTemplate(object obj, EventArgs args)
        {
            ICompletionDataList completionList = new CompletionDataList();

            completionList           = ShowCodeTemplatesCommand();
            currentCompletionContext = widget.CreateCodeCompletionContext();            //this.editor.Caret.Offset
            CompletionWindowManager.IsTemplateModes = true;
            CompletionWindowManager.ShowWindow((char)0, completionList, widget, currentCompletionContext, OnCompletionWindowClosed);
            editor.GrabFocus();
        }
예제 #2
0
            CodeCompletionContext ICompletionWidget.CreateCodeCompletionContext(int triggerOffset)
            {
                var originalTriggerOffset = ConvertOffset(triggerOffset);
                var completionContext     = completionWidget.CreateCodeCompletionContext(originalTriggerOffset);

                return(ConvertContext(completionContext, projection));
            }
예제 #3
0
        // Returns the index of the parameter where the cursor is currently positioned.
        // -1 means the cursor is outside the method parameter list
        // 0 means no parameter entered
        // > 0 is the index of the parameter (1-based)
        public int GetCurrentParameterIndex(ICompletionWidget widget, CodeCompletionContext ctx)
        {
            int cursor = widget.CreateCodeCompletionContext().TriggerOffset;
            int i = ctx.TriggerOffset;
            //if (i < 0 || i >= editor.Length || editor.GetCharAt (i) == ')')
            //	return -1;

            if (i > cursor)
                return -1;
            else if (i == cursor)
                return 0;

            int parameterIndex = 1;

            while (i++ < cursor) {
                if (i >= widget.TextLength)
                    break;
                char ch = widget.GetChar (i);
                if (ch == ',')
                    parameterIndex++;
                else if (ch == ')')
                    return -1;
            }

            return parameterIndex;
        }
예제 #4
0
        protected override void Run(RefactoringOptions options)
        {
            Gtk.Menu menu = new Gtk.Menu();

            bool          resolveDirect;
            List <string> namespaces = GetResolveableNamespaces(options, out resolveDirect);

            foreach (string ns in namespaces)
            {
                // remove used namespaces for conflict resolving.
                if (options.Document.CompilationUnit.IsNamespaceUsedAt(ns, options.ResolveResult.ResolvedExpression.Region.Start))
                {
                    continue;
                }
                Gtk.MenuItem menuItem = new Gtk.MenuItem(string.Format(GettextCatalog.GetString("Add using '{0}'"), ns));
                CurrentRefactoryOperationsHandler.ResolveNameOperation resolveNameOperation = new CurrentRefactoryOperationsHandler.ResolveNameOperation(options.Dom, options.Document, options.ResolveResult, ns);
                menuItem.Activated += delegate
                {
                    resolveNameOperation.AddImport();
                };
                menu.Add(menuItem);
            }
            if (resolveDirect)
            {
                foreach (string ns in namespaces)
                {
                    Gtk.MenuItem menuItem = new Gtk.MenuItem(string.Format(GettextCatalog.GetString("Add '{0}'"), ns));
                    CurrentRefactoryOperationsHandler.ResolveNameOperation resolveNameOperation = new CurrentRefactoryOperationsHandler.ResolveNameOperation(options.Dom, options.Document, options.ResolveResult, ns);
                    menuItem.Activated += delegate
                    {
                        resolveNameOperation.ResolveName();
                    };
                    menu.Add(menuItem);
                }
            }

            if (menu.Children != null && menu.Children.Length > 0)
            {
                menu.ShowAll();

                ICompletionWidget     widget = options.Document.GetContent <ICompletionWidget> ();
                CodeCompletionContext codeCompletionContext = widget.CreateCodeCompletionContext(options.GetTextEditorData().Caret.Offset);

                menu.Popup(null, null, delegate(Gtk.Menu menu2, out int x, out int y, out bool pushIn)
                {
                    x      = codeCompletionContext.TriggerXCoord;
                    y      = codeCompletionContext.TriggerYCoord;
                    pushIn = false;
                }, 0, Gtk.Global.CurrentEventTime);
                menu.SelectFirst(true);
            }
        }
		public void ShowCompletion (ICompletionDataList completionList)
		{
			completionWidget = Document.GetContent <ICompletionWidget> ();
			currentCompletionContext = completionWidget.CreateCodeCompletionContext (Document.TextEditorData.Caret.Offset);
			int cpos, wlen;
			if (!GetCompletionCommandOffset (out cpos, out wlen)) {
				cpos = Document.TextEditorData.Caret.Offset;
				wlen = 0;
			}
			currentCompletionContext.TriggerOffset = cpos;
			currentCompletionContext.TriggerWordLength = wlen;
			
			CompletionWindowManager.ShowWindow ('\0', completionList, completionWidget, currentCompletionContext, OnCompletionWindowClosed);
		}
        public void ShowCompletion(ICompletionDataList completionList)
        {
            completionWidget         = Document.GetContent <ICompletionWidget> ();
            currentCompletionContext = completionWidget.CreateCodeCompletionContext(Document.TextEditorData.Caret.Offset);
            int cpos, wlen;

            if (!GetCompletionCommandOffset(out cpos, out wlen))
            {
                cpos = Document.TextEditorData.Caret.Offset;
                wlen = 0;
            }
            currentCompletionContext.TriggerOffset     = cpos;
            currentCompletionContext.TriggerWordLength = wlen;

            CompletionWindowManager.ShowWindow('\0', completionList, completionWidget, currentCompletionContext, OnCompletionWindowClosed);
        }
        public static void ShowWindow(ICompletionWidget widget, IParameterDataProvider provider)         //, CodeCompletionContext ctx, IParameterDataProvider provider)
        {
            if (provider.OverloadCount == 0)
            {
                return;
            }

            // There can be several method parameter lists open at the same time, so
            // they have to be queued. The last one of queue is the one being shown
            // in the information window.

            MethodData md = new MethodData();

            md.MethodProvider    = provider;
            md.CurrentOverload   = 0;
            md.CompletionContext = widget.CreateCodeCompletionContext();             //ctx;
            methods.Add(md);
            UpdateWindow(widget);
        }
예제 #8
0
        // Returns the index of the parameter where the cursor is currently positioned.
        // -1 means the cursor is outside the method parameter list
        // 0 means no parameter entered
        // > 0 is the index of the parameter (1-based)
        public int GetCurrentParameterIndex(ICompletionWidget widget, CodeCompletionContext ctx)
        {
            int cursor = widget.CreateCodeCompletionContext().TriggerOffset;
            int i      = ctx.TriggerOffset;

            //if (i < 0 || i >= editor.Length || editor.GetCharAt (i) == ')')
            //	return -1;

            if (i > cursor)
            {
                return(-1);
            }
            else if (i == cursor)
            {
                return(0);
            }

            int parameterIndex = 1;

            while (i++ < cursor)
            {
                if (i >= widget.TextLength)
                {
                    break;
                }
                char ch = widget.GetChar(i);
                if (ch == ',')
                {
                    parameterIndex++;
                }
                else if (ch == ')')
                {
                    return(-1);
                }
            }

            return(parameterIndex);
        }
        internal static void UpdateWindow(ICompletionWidget widget)
        {
            // Updates the parameter information window from the information
            // of the current method overload
            if (window == null && methods.Count > 0)
            {
                window   = new ParameterInformationWindow();
                wasAbove = false;
            }

            if (methods.Count == 0)
            {
                if (window != null)
                {
                    window.Hide();
                    wasAbove = false;
                }
                return;
            }
            var        ctx    = widget.CreateCodeCompletionContext();
            MethodData md     = methods[methods.Count - 1];
            int        cparam = md.MethodProvider.GetCurrentParameterIndex(widget, md.CompletionContext);

            Gtk.Requisition reqSize = window.ShowParameterInfo(md.MethodProvider, md.CurrentOverload, cparam - 1);
            X = md.CompletionContext.TriggerXCoord;
            if (CompletionWindowManager.IsVisible)
            {
                // place above
                Y = ctx.TriggerYCoord - ctx.TriggerTextHeight - reqSize.Height - 10;
            }
            else
            {
                // place below
                Y = ctx.TriggerYCoord;
            }

            Gdk.Rectangle geometry = window.Screen.GetMonitorGeometry(window.Screen.GetMonitorAtPoint(X, Y));

            if (X + reqSize.Width > geometry.Right)
            {
                X = geometry.Right - reqSize.Width;
            }

            if (Y < geometry.Top)
            {
                Y = ctx.TriggerYCoord;
            }

            if (wasAbove || Y + reqSize.Height > geometry.Bottom)
            {
                Y        = Y - ctx.TriggerTextHeight - reqSize.Height - 4;
                wasAbove = true;
            }

            if (CompletionWindowManager.IsVisible)
            {
                Rectangle completionWindow = new Rectangle(CompletionWindowManager.X, CompletionWindowManager.Y,
                                                           CompletionWindowManager.Wnd.Allocation.Width, CompletionWindowManager.Wnd.Allocation.Height);
                if (completionWindow.IntersectsWith(new Rectangle(X, Y, reqSize.Width, reqSize.Height)))
                {
                    X = completionWindow.X;
                    Y = completionWindow.Y - reqSize.Height - 6;
                    if (Y < 0)
                    {
                        Y = completionWindow.Bottom + 6;
                    }
                }
            }

            window.Move(X, Y);
            window.Show();
        }
        internal static void UpdateWindow(ICompletionWidget widget)
        {
            // Updates the parameter information window from the information
            // of the current method overload
            if (window == null && methods.Count > 0) {
                window = new ParameterInformationWindow ();
                wasAbove = false;
            }

            if (methods.Count == 0) {
                if (window != null) {
                    window.Hide ();
                    wasAbove = false;
                }
                return;
            }
            var ctx = widget.CreateCodeCompletionContext();
            MethodData md = methods[methods.Count - 1];
            int cparam = md.MethodProvider.GetCurrentParameterIndex (widget, md.CompletionContext);
            Gtk.Requisition reqSize = window.ShowParameterInfo (md.MethodProvider, md.CurrentOverload, cparam - 1);
            X = md.CompletionContext.TriggerXCoord;
            if (CompletionWindowManager.IsVisible) {
                // place above
                Y = ctx.TriggerYCoord - ctx.TriggerTextHeight - reqSize.Height - 10;
            } else {
                // place below
                Y = ctx.TriggerYCoord;
            }

            Gdk.Rectangle geometry = window.Screen.GetMonitorGeometry (window.Screen.GetMonitorAtPoint (X, Y));

            if (X + reqSize.Width > geometry.Right)
                X = geometry.Right - reqSize.Width;

            if (Y < geometry.Top)
                Y = ctx.TriggerYCoord;

            if (wasAbove || Y + reqSize.Height > geometry.Bottom) {
                Y = Y - ctx.TriggerTextHeight - reqSize.Height - 4;
                wasAbove = true;
            }

            if (CompletionWindowManager.IsVisible) {
                Rectangle completionWindow = new Rectangle (CompletionWindowManager.X, CompletionWindowManager.Y,
                                                            CompletionWindowManager.Wnd.Allocation.Width, CompletionWindowManager.Wnd.Allocation.Height);
                if (completionWindow.IntersectsWith (new Rectangle (X, Y, reqSize.Width, reqSize.Height))) {
                    X = completionWindow.X;
                    Y = completionWindow.Y - reqSize.Height - 6;
                    if (Y < 0)
                        Y = completionWindow.Bottom + 6;
                }
            }

            window.Move (X, Y);
            window.Show ();
        }
        //, CodeCompletionContext ctx, IParameterDataProvider provider)
        public static void ShowWindow(ICompletionWidget widget, IParameterDataProvider provider)
        {
            if (provider.OverloadCount == 0)
                return;

            // There can be several method parameter lists open at the same time, so
            // they have to be queued. The last one of queue is the one being shown
            // in the information window.

            MethodData md = new MethodData ();
            md.MethodProvider = provider;
            md.CurrentOverload = 0;
            md.CompletionContext = widget.CreateCodeCompletionContext(); //ctx;
            methods.Add (md);
            UpdateWindow (widget);
        }
        // When a key is pressed, and before the key is processed by the editor, this method will be invoked.
        // Return true if the key press should be processed by the editor.
        public override bool KeyPress(Gdk.Key key, char keyChar, Gdk.ModifierType modifier)
        {
            bool res;

            KeyActions ka = KeyActions.None;

            if (currentCompletionContext != null)
            {
                autoHideCompletionWindow = false;
                if (CompletionWindowManager.PreProcessKeyEvent(key, keyChar, modifier, out ka))
                {
                    CompletionWindowManager.PostProcessKeyEvent(ka);
                    autoHideCompletionWindow = true;
                    return(false);
                }
                autoHideCompletionWindow = false;
            }

            if (ParameterInformationWindowManager.IsWindowVisible)
            {
                if (ParameterInformationWindowManager.ProcessKeyEvent(key, modifier))
                {
                    return(false);
                }
                autoHideCompletionWindow = false;
            }

//			int oldPos = Editor.CursorPosition;
//			int oldLen = Editor.TextLength;

            res = base.KeyPress(key, keyChar, modifier);

            CompletionWindowManager.PostProcessKeyEvent(ka);

            var ignoreMods = Gdk.ModifierType.ControlMask | Gdk.ModifierType.MetaMask
                             | Gdk.ModifierType.Mod1Mask | Gdk.ModifierType.SuperMask;

            // Handle parameter completion
            if (ParameterInformationWindowManager.IsWindowVisible)
            {
                ParameterInformationWindowManager.CurrentCodeCompletionContext = Editor.CurrentCodeCompletionContext;
                ParameterInformationWindowManager.PostProcessKeyEvent(key, modifier);
            }

            if ((modifier & ignoreMods) != 0)
            {
                return(res);
            }

            /*
             * if (Document.TextEditorData == null || Document.TextEditorData.IsSomethingSelected && Document.TextEditorData.SelectionMode != Mono.TextEditor.SelectionMode.Block) {
             *      int posChange = Editor.CursorPosition - oldPos;
             *      if (currentCompletionContext != null && (Math.Abs (posChange) > 1 || (Editor.TextLength - oldLen) != posChange)) {
             *              currentCompletionContext = null;
             *              CompletionWindowManager.HideWindow ();
             *              ParameterInformationWindowManager.HideWindow ();
             *              return res;
             *      }
             * }*/

            if (!enableCodeCompletion)
            {
                return(res);
            }

            // Handle code completion

            if (keyChar != '\0' && completionWidget != null && currentCompletionContext == null)
            {
                currentCompletionContext = completionWidget.CreateCodeCompletionContext(Editor.CursorPosition);

                int triggerWordLength = currentCompletionContext.TriggerWordLength;
                ICompletionDataList completionList = HandleCodeCompletion(currentCompletionContext, keyChar,
                                                                          ref triggerWordLength);

                if (triggerWordLength > 0 && (triggerWordLength < Editor.CursorPosition ||
                                              (triggerWordLength == 1 && Editor.CursorPosition == 1)))
                {
                    currentCompletionContext
                        = completionWidget.CreateCodeCompletionContext(Editor.CursorPosition - triggerWordLength);
                    currentCompletionContext.TriggerWordLength = triggerWordLength;
                }

                if (completionList != null)
                {
                    if (!CompletionWindowManager.ShowWindow(keyChar, completionList, completionWidget,
                                                            currentCompletionContext, OnCompletionWindowClosed))
                    {
                        currentCompletionContext = null;
                    }
                }
                else
                {
                    currentCompletionContext = null;
                }
            }

            if (enableParameterInsight && completionWidget != null)
            {
                CodeCompletionContext  ctx           = completionWidget.CreateCodeCompletionContext(Editor.CursorPosition);
                IParameterDataProvider paramProvider = HandleParameterCompletion(ctx, keyChar);
                if (paramProvider != null)
                {
                    ParameterInformationWindowManager.ShowWindow(ctx, paramProvider);
                }
            }

            autoHideCompletionWindow = true;

            return(res);
        }