void ShowPopup(Gdk.EventButton evt)
        {
            view.FireCompletionContextChanged();
            CompletionWindowManager.HideWindow();
            ParameterInformationWindowManager.HideWindow(null, view);
            HideTooltip();
            const string    menuPath = "/MonoDevelop/SourceEditor2/ContextMenu/Editor";
            var             ctx      = ExtensionContext ?? AddinManager.AddinEngine;
            CommandEntrySet cset     = IdeApp.CommandService.CreateCommandEntrySet(ctx, menuPath);

            Gtk.Menu menu = IdeApp.CommandService.CreateMenu(cset);

            var imMenu = CreateInputMethodMenuItem(GettextCatalog.GetString("_Input Methods"));

            if (imMenu != null)
            {
                menu.Append(new SeparatorMenuItem());
                menu.Append(imMenu);
            }

            menu.Destroyed += delegate {
                this.QueueDraw();
            };

            if (evt != null)
            {
                GtkWorkarounds.ShowContextMenu(menu, this, evt);
            }
            else
            {
                var pt = LocationToPoint(this.Caret.Location);
                GtkWorkarounds.ShowContextMenu(menu, this, new Gdk.Rectangle(pt.X, pt.Y, 1, (int)LineHeight));
            }
        }
 void HAdjustment_ValueChanged(object sender, EventArgs e)
 {
     if (!isInKeyStroke)
     {
         CompletionWindowManager.HideWindow();
         ParameterInformationWindowManager.HideWindow(null, view);
     }
 }
 protected void OnCompletionContextChanged(object o, EventArgs a)
 {
     if (autoHideCompletionWindow)
     {
         CompletionWindowManager.HideWindow();
         ParameterInformationWindowManager.HideWindow(this, CompletionWidget);
     }
 }
Пример #4
0
        public override bool KeyPress(Gdk.Key key, char keyChar, Gdk.ModifierType modifier)
        {
            if (this.CompletionWidget != null && (keyChar == ')' || keyChar == ';'))
            {
                ParameterInformationWindowManager.HideWindow(this, CompletionWidget);
            }

            return(base.KeyPress(key, keyChar, modifier));
        }
Пример #5
0
 protected override void HAdjustmentValueChanged()
 {
     base.HAdjustmentValueChanged();
     if (!isInKeyStroke)
     {
         CompletionWindowManager.HideWindow();
         ParameterInformationWindowManager.HideWindow();
     }
 }
Пример #6
0
        public override void CursorPositionChanged()
        {
            if (CompletionWidget != null && Document.Editor.Caret.Offset < lastTriggerOffset)
            {
                ParameterInformationWindowManager.HideWindow(this, CompletionWidget);
                lastTriggerOffset = -1;
            }

            base.CursorPositionChanged();
        }
Пример #7
0
 protected void OnCompletionContextChanged(object o, EventArgs a)
 {
     if (autoHideCompletionWindow)
     {
         CompletionWindowManager.HideWindow();
     }
     if (autoHideParameterWindow)
     {
         ParameterInformationWindowManager.HideWindow(this, CompletionWidget);
     }
     ParameterInformationWindowManager.UpdateCursorPosition(this, CompletionWidget);
 }
Пример #8
0
        public override bool KeyPress(Gdk.Key key, char keyChar, Gdk.ModifierType modifier)
        {
            updater.BeginUpdate();
            if (this.CompletionWidget != null && (keyChar == ')' || keyChar == ';'))
            {
                ParameterInformationWindowManager.HideWindow(this, CompletionWidget);
            }

            var ret = base.KeyPress(key, keyChar, modifier);

            updater.FinishUpdate();
            return(ret);
        }
Пример #9
0
        void ShowPopup(Gdk.EventButton evt)
        {
            view.FireCompletionContextChanged();
            CompletionWindowManager.HideWindow();
            ParameterInformationWindowManager.HideWindow(null, view);
            HideTooltip();
            if (string.IsNullOrEmpty(menuPath))
            {
                return;
            }
            var             ctx  = view.WorkbenchWindow?.ExtensionContext ?? AddinManager.AddinEngine;
            CommandEntrySet cset = IdeApp.CommandService.CreateCommandEntrySet(ctx, menuPath);

            if (Platform.IsMac)
            {
                if (evt == null)
                {
                    int x, y;
                    var pt = LocationToPoint(this.Caret.Location);
                    TranslateCoordinates(Toplevel, pt.X, pt.Y, out x, out y);

                    IdeApp.CommandService.ShowContextMenu(this, x, y, cset, this);
                }
                else
                {
                    IdeApp.CommandService.ShowContextMenu(this, evt, cset, this);
                }
            }
            else
            {
                Gtk.Menu menu   = IdeApp.CommandService.CreateMenu(cset);
                var      imMenu = CreateInputMethodMenuItem(GettextCatalog.GetString("_Input Methods"));
                if (imMenu != null)
                {
                    menu.Append(new SeparatorMenuItem());
                    menu.Append(imMenu);
                }

                menu.Hidden += HandleMenuHidden;
                if (evt != null)
                {
                    GtkWorkarounds.ShowContextMenu(menu, this, evt);
                }
                else
                {
                    var pt = LocationToPoint(this.Caret.Location);

                    GtkWorkarounds.ShowContextMenu(menu, this, (int)pt.X, (int)pt.Y);
                }
            }
        }
Пример #10
0
        public override void Dispose()
        {
            if (!disposed)
            {
                CompletionWindowManager.HideWindow();
                ParameterInformationWindowManager.HideWindow(this, CompletionWidget);

                disposed = true;
                CompletionWindowManager.WindowClosed -= HandleWindowClosed;
                if (CompletionWidget != null)
                {
                    CompletionWidget.CompletionContextChanged -= OnCompletionContextChanged;
                }
            }
            base.Dispose();
        }
Пример #11
0
 internal protected virtual void OnCompletionContextChanged(object o, EventArgs a)
 {
     if (!IsActiveExtension())
     {
         return;
     }
     if (autoHideCompletionWindow)
     {
         CompletionWindowManager.HideWindow();
     }
     if (autoHideParameterWindow)
     {
         ParameterInformationWindowManager.HideWindow(this, CompletionWidget);
     }
     ParameterInformationWindowManager.UpdateCursorPosition(this, CompletionWidget);
 }
        public override void Dispose()
        {
            if (!disposed)
            {
                completionTokenSrc.Cancel();
                parameterHintingSrc.Cancel();

                CompletionWindowManager.HideWindow();
                ParameterInformationWindowManager.HideWindow(this, CompletionWidget);

                disposed          = true;
                Editor.FocusLost -= HandleFocusOutEvent;
                //				document.Editor.Paste -= HandlePaste;
                Deinitialize();
            }
            base.Dispose();
        }
Пример #13
0
        public virtual void RunParameterCompletionCommand()
        {
            IParameterDataProvider cp = null;
            int cpos;

            if (!GetParameterCompletionCommandOffset(out cpos))
            {
                cpos = Editor.Caret.Offset;
            }
            CodeCompletionContext ctx = CompletionWidget.CreateCodeCompletionContext(cpos);

            cp = ParameterCompletionCommand(ctx);
            if (cp != null)
            {
                ParameterInformationWindowManager.ShowWindow(CompletionWidget, ctx, cp);
                ParameterInformationWindowManager.PostProcessKeyEvent(CompletionWidget, Gdk.Key.F, Gdk.ModifierType.None);
            }
        }
        public virtual async void RunParameterCompletionCommand()
        {
            if (Editor.SelectionMode == SelectionMode.Block || CompletionWidget == null)
            {
                return;
            }
            ParameterHintingResult cp = null;
            int cpos = Editor.CaretOffset;
            CodeCompletionContext ctx = CompletionWidget.CreateCodeCompletionContext(cpos);

            cp = await ParameterCompletionCommand(ctx);

            if (cp != null)
            {
                ParameterInformationWindowManager.ShowWindow(this, CompletionWidget, ctx, cp);
                ParameterInformationWindowManager.PostProcessKeyEvent(this, CompletionWidget, KeyDescriptor.FromGtk(Gdk.Key.F, 'f', Gdk.ModifierType.None));
            }
        }
Пример #15
0
        protected override bool OnButtonReleaseEvent(Gdk.EventButton e)
        {
            int         offset      = this.Document.LocationToOffset(this.Caret.Location);
            int         lineNumber  = this.Document.OffsetToLineNumber(offset);
            LineSegment lineSegment = this.Document.GetLine(lineNumber);

            string lineText = this.Document.GetTextBetween(lineSegment.Offset, offset);


            int countBrackets1 = lineText.Count(c => c == '(');
            int countBrackets2 = lineText.Count(c => c == ')');

            if (countBrackets1 <= countBrackets2)
            {
                ParameterInformationWindowManager.HideWindow(this);
            }
            return(base.OnButtonReleaseEvent(e));
        }
Пример #16
0
        public override bool KeyPress(Gdk.Key key, char keyChar, Gdk.ModifierType modifier)
        {
            updater.BeginUpdate();
            if (this.CompletionWidget != null)
            {
                switch (keyChar)
                {
                case '(':
                case ')':
                case ';':
                case ']':
                    ParameterInformationWindowManager.HideWindow(this, CompletionWidget);
                    break;

                default:
                    if (lastTriggerOffset >= 0 && char.IsDigit(keyChar))
                    {
                        bool containsDigitsOnly = true;

                        for (int offset = lastTriggerOffset; offset < CompletionWidget.CaretOffset; offset++)
                        {
                            if (!char.IsDigit(CompletionWidget.GetChar(offset)))
                            {
                                containsDigitsOnly = false;
                                break;
                            }
                        }

                        if (containsDigitsOnly)
                        {
                            CompletionWindowManager.HideWindow();
                        }
                    }
                    break;
                }
            }

            var ret = base.KeyPress(key, keyChar, modifier);

            updater.FinishUpdate();
            return(ret);
        }
Пример #17
0
        public override void Dispose()
        {
            if (!disposed)
            {
                CompletionWindowManager.HideWindow();
                ParameterInformationWindowManager.HideWindow(this, CompletionWidget);

                disposed = true;
                if (document.Editor.Parent != null)
                {
                    document.Editor.Parent.TextArea.FocusOutEvent -= HandleFocusOutEvent;
                }
                document.Editor.Paste -= HandlePaste;
                document.Editor.Caret.PositionChanged -= HandlePositionChanged;
                CompletionWindowManager.WindowClosed  -= HandleWindowClosed;
                if (CompletionWidget != null)
                {
                    CompletionWidget.CompletionContextChanged -= OnCompletionContextChanged;
                }
            }
            base.Dispose();
        }
Пример #18
0
        public virtual void RunParameterCompletionCommand()
        {
            if (Document.Editor.SelectionMode == Mono.TextEditor.SelectionMode.Block || CompletionWidget == null)
            {
                return;
            }
            ParameterDataProvider cp = null;
            int cpos;

            if (!GetParameterCompletionCommandOffset(out cpos))
            {
                cpos = Editor.Caret.Offset;
            }
            CodeCompletionContext ctx = CompletionWidget.CreateCodeCompletionContext(cpos);

            cp = ParameterCompletionCommand(ctx);
            if (cp != null)
            {
                ParameterInformationWindowManager.ShowWindow(this, CompletionWidget, ctx, cp);
                ParameterInformationWindowManager.PostProcessKeyEvent(this, CompletionWidget, Gdk.Key.F, Gdk.ModifierType.None);
            }
        }
Пример #19
0
        public override void Initialize()
        {
            base.Initialize();

            CompletionWindowManager.WindowClosed += HandleWindowClosed;
            CompletionWidget = Document.GetContent <ICompletionWidget> ();
            if (CompletionWidget != null)
            {
                CompletionWidget.CompletionContextChanged += OnCompletionContextChanged;
            }
            document.Editor.Paste += (insertionOffset, text, insertedChars) => {
                ParameterInformationWindowManager.HideWindow(this, CompletionWidget);
                CompletionWindowManager.HideWindow();
            };
            if (document.Editor.Parent != null)
            {
                document.Editor.Parent.TextArea.FocusOutEvent += delegate {
                    ParameterInformationWindowManager.HideWindow(this, CompletionWidget);
                    CompletionWindowManager.HideWindow();
                };
            }
        }
 protected override bool OnFocusOutEvent(Gdk.EventFocus evnt)
 {
     CompletionWindowManager.HideWindow();
     ParameterInformationWindowManager.HideWindow(null, view);
     return(base.OnFocusOutEvent(evnt));
 }
Пример #21
0
        // 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(KeyDescriptor descriptor)
        {
            bool res;

            if (CurrentCompletionContext != null)
            {
                if (CompletionWindowManager.PreProcessKeyEvent(descriptor))
                {
                    CompletionWindowManager.PostProcessKeyEvent(descriptor);
                    autoHideCompletionWindow = true;
                    // in named parameter case leave the parameter window open.
                    autoHideParameterWindow = descriptor.KeyChar != ':';
                    if (!autoHideParameterWindow && ParameterInformationWindowManager.IsWindowVisible)
                    {
                        ParameterInformationWindowManager.PostProcessKeyEvent(this, CompletionWidget, descriptor);
                    }

                    return(false);
                }
                autoHideCompletionWindow = autoHideParameterWindow = false;
            }

            if (ParameterInformationWindowManager.IsWindowVisible)
            {
                if (ParameterInformationWindowManager.ProcessKeyEvent(this, CompletionWidget, descriptor))
                {
                    return(false);
                }
                autoHideCompletionWindow = autoHideParameterWindow = false;
            }

            //			int oldPos = Editor.CursorPosition;
            //			int oldLen = Editor.TextLength;
            char deleteOrBackspaceTriggerChar = '\0';

            if (descriptor.SpecialKey == SpecialKey.Delete && Editor.CaretOffset < Editor.Length)
            {
                deleteOrBackspaceTriggerChar = Editor.GetCharAt(Editor.CaretOffset);
            }
            if (descriptor.SpecialKey == SpecialKey.BackSpace && Editor.CaretOffset > 0)
            {
                deleteOrBackspaceTriggerChar = Editor.GetCharAt(Editor.CaretOffset - 1);
            }

            res = base.KeyPress(descriptor);

            CompletionWindowManager.PostProcessKeyEvent(descriptor);

            var ignoreMods = ModifierKeys.Control | ModifierKeys.Alt
                             | ModifierKeys.Command;

            // Handle parameter completion
            if (ParameterInformationWindowManager.IsWindowVisible)
            {
                ParameterInformationWindowManager.PostProcessKeyEvent(this, CompletionWidget, descriptor);
            }

            if ((descriptor.ModifierKeys & ignoreMods) != 0)
            {
                return(res);
            }

            // don't complete on block selection
            if (/*!EnableCodeCompletion ||*/ Editor.SelectionMode == MonoDevelop.Ide.Editor.SelectionMode.Block)
            {
                return(res);
            }
            // Handle code completion
            if (descriptor.KeyChar != '\0' && CompletionWidget != null && !CompletionWindowManager.IsVisible)
            {
                CurrentCompletionContext = CompletionWidget.CurrentCodeCompletionContext;
                completionTokenSrc.Cancel();
                completionTokenSrc = new CancellationTokenSource();
                var caretOffset = Editor.CaretOffset;
                var token       = completionTokenSrc.Token;
                try {
                    var task = HandleCodeCompletionAsync(CurrentCompletionContext, descriptor.KeyChar, token);
                    if (task != null)
                    {
                        // Show the completion window in two steps. The call to PrepareShowWindow creates the window but
                        // it doesn't show it. It is used only to process the keys while the completion data is being retrieved.
                        CompletionWindowManager.PrepareShowWindow(this, descriptor.KeyChar, CompletionWidget, CurrentCompletionContext);
                        EventHandler windowClosed = delegate(object o, EventArgs a) {
                            completionTokenSrc.Cancel();
                        };
                        CompletionWindowManager.WindowClosed += windowClosed;

                        task.ContinueWith(t => {
                            CompletionWindowManager.WindowClosed -= windowClosed;
                            if (token.IsCancellationRequested)
                            {
                                return;
                            }
                            var result = t.Result;
                            if (result != null)
                            {
                                int triggerWordLength = result.TriggerWordLength + (Editor.CaretOffset - caretOffset);

                                if (triggerWordLength > 0 && (triggerWordLength < Editor.CaretOffset ||
                                                              (triggerWordLength == 1 && Editor.CaretOffset == 1)))
                                {
                                    CurrentCompletionContext = CompletionWidget.CreateCodeCompletionContext(Editor.CaretOffset - triggerWordLength);
                                    CurrentCompletionContext.TriggerWordLength = triggerWordLength;
                                }
                                // Now show the window for real.
                                if (!CompletionWindowManager.ShowWindow(result, CurrentCompletionContext))
                                {
                                    CurrentCompletionContext = null;
                                }
                            }
                            else
                            {
                                CompletionWindowManager.HideWindow();
                                CurrentCompletionContext = null;
                            }
                        }, Runtime.MainTaskScheduler);
                    }
                    else
                    {
                        CurrentCompletionContext = null;
                    }
                } catch (TaskCanceledException) {
                    CurrentCompletionContext = null;
                } catch (AggregateException) {
                    CurrentCompletionContext = null;
                }
            }

            if ((descriptor.SpecialKey == SpecialKey.Delete || descriptor.SpecialKey == SpecialKey.BackSpace) && CompletionWidget != null && !CompletionWindowManager.IsVisible)
            {
                CurrentCompletionContext = CompletionWidget.CurrentCodeCompletionContext;

                int cpos, wlen;
                if (!GetCompletionCommandOffset(out cpos, out wlen))
                {
                    cpos = Editor.CaretOffset;
                    wlen = 0;
                }
                CurrentCompletionContext.TriggerOffset     = cpos;
                CurrentCompletionContext.TriggerWordLength = wlen;

                completionTokenSrc.Cancel();
                completionTokenSrc = new CancellationTokenSource();
                var caretOffset = Editor.CaretOffset;
                var token       = completionTokenSrc.Token;
                try {
                    var task = HandleBackspaceOrDeleteCodeCompletionAsync(CurrentCompletionContext, descriptor.SpecialKey, deleteOrBackspaceTriggerChar, token);
                    if (task != null)
                    {
                        // Show the completion window in two steps. The call to PrepareShowWindow creates the window but
                        // it doesn't show it. It is used only to process the keys while the completion data is being retrieved.
                        CompletionWindowManager.PrepareShowWindow(this, descriptor.KeyChar, CompletionWidget, CurrentCompletionContext);
                        EventHandler windowClosed = delegate(object o, EventArgs a) {
                            completionTokenSrc.Cancel();
                        };
                        CompletionWindowManager.WindowClosed += windowClosed;

                        task.ContinueWith(t => {
                            CompletionWindowManager.WindowClosed -= windowClosed;
                            if (token.IsCancellationRequested)
                            {
                                return;
                            }
                            var result = t.Result;
                            if (result != null)
                            {
                                int triggerWordLength = result.TriggerWordLength + (Editor.CaretOffset - caretOffset);

                                if (triggerWordLength > 0 && (triggerWordLength < Editor.CaretOffset ||
                                                              (triggerWordLength == 1 && Editor.CaretOffset == 1)))
                                {
                                    CurrentCompletionContext = CompletionWidget.CreateCodeCompletionContext(Editor.CaretOffset - triggerWordLength);
                                    CurrentCompletionContext.TriggerWordLength = triggerWordLength;
                                }
                                // Now show the window for real.
                                if (!CompletionWindowManager.ShowWindow(result, CurrentCompletionContext))
                                {
                                    CurrentCompletionContext = null;
                                }
                                else
                                {
                                    CompletionWindowManager.Wnd.StartOffset = CurrentCompletionContext.TriggerOffset;
                                    CompletionWindowManager.Wnd.EndOffset   = Editor.CaretOffset;
                                }
                            }
                            else
                            {
                                CompletionWindowManager.HideWindow();
                                CurrentCompletionContext = null;
                            }
                        }, Runtime.MainTaskScheduler);
                    }
                    else
                    {
                        CurrentCompletionContext = null;
                    }
                } catch (TaskCanceledException) {
                    CurrentCompletionContext = null;
                } catch (AggregateException) {
                    CurrentCompletionContext = null;
                }
            }

            if (CompletionWidget != null)
            {
                CodeCompletionContext ctx = CompletionWidget.CurrentCodeCompletionContext;
                parameterHintingSrc.Cancel();
                parameterHintingSrc = new CancellationTokenSource();
                var token = parameterHintingSrc.Token;
                try {
                    var task = HandleParameterCompletionAsync(ctx, descriptor.KeyChar, token);
                    if (task != null)
                    {
                        task.ContinueWith(t => {
                            if (!token.IsCancellationRequested && t.Result != null)
                            {
                                ParameterInformationWindowManager.ShowWindow(this, CompletionWidget, ctx, t.Result);
                            }
                        }, Runtime.MainTaskScheduler);
                    }
                } catch (TaskCanceledException) {
                } catch (AggregateException) {
                }
            }

            /*			autoHideCompletionWindow = true;
             *                      autoHideParameterWindow = keyChar != ':';*/
            return(res);
        }
//		void HandlePaste (int insertionOffset, string text, int insertedChars)
//		{
//			ParameterInformationWindowManager.HideWindow (this, CompletionWidget);
//			CompletionWindowManager.HideWindow ();
//		}
//
        void HandleFocusOutEvent(object sender, EventArgs args)
        {
            ParameterInformationWindowManager.HideWindow(this, CompletionWidget);
            CompletionWindowManager.HideWindow();
        }
Пример #23
0
 void HandlePaste(int insertionOffset, string text, int insertedChars)
 {
     ParameterInformationWindowManager.HideWindow(this, CompletionWidget);
     CompletionWindowManager.HideWindow();
 }
Пример #24
0
        protected override bool OnKeyPressEvent(Gdk.EventKey evnt)
        {
            char charKey = (char)Gdk.Keyval.ToUnicode(evnt.KeyValue);

            if ((evnt.State == Gdk.ModifierType.ControlMask) && (charKey == 'v'))
            {
                PasteClipboard();
                return(true);
            }
            ;
            if ((evnt.State == Gdk.ModifierType.ControlMask) && (charKey == 'c'))
            {
                CopyClipboard();
                return(true);
            }
            ;

            KeyActions ka = KeyActions.None;

            //if (currentCompletionContext != null) {
            if (CompletionWindowManager.PreProcessKeyEvent(evnt.Key, (char)evnt.Key, evnt.State, out ka))
            {
                CompletionWindowManager.PostProcessKeyEvent(ka);

                if (evnt.Key == Gdk.Key.Up || evnt.Key == Gdk.Key.Down || evnt.Key == Gdk.Key.Return ||
                    evnt.Key == Gdk.Key.Left || evnt.Key == Gdk.Key.Right)                          //)
                {
                    return(true);
                }
            }
            //}

            if (ParameterInformationWindowManager.IsWindowVisible)
            {
                if (ParameterInformationWindowManager.ProcessKeyEvent(this, evnt.Key, evnt.State))
                {
                    return(false);
                }
            }

            if (CompletionWindowManager.IsTemplateModes)
            {
                return(true);
            }


            bool result = base.OnKeyPressEvent(evnt);

            if (!MainClass.Settings.SourceEditorSettings.AggressivelyTriggerCL)
            {
                return(result);
            }
            if (banCompletion)
            {
                return(result);
            }

            completionType = CompletionTyp.allType;

            if ((evnt.State != Gdk.ModifierType.None) && charKey != '(' && charKey != ')')
            {
                return(result);
            }

            int         offset      = this.Document.LocationToOffset(this.Caret.Location);
            int         lineNumber  = this.Document.OffsetToLineNumber(offset);
            LineSegment lineSegment = this.Document.GetLine(lineNumber);

            string lineText = this.Document.GetTextBetween(lineSegment.Offset, offset);


            int countBrackets1 = lineText.Count(c => c == '(');
            int countBrackets2 = lineText.Count(c => c == ')');

            if (countBrackets1 <= countBrackets2)
            {
                ParameterInformationWindowManager.HideWindow(this);
            }

            if (((charKey == '\0') || (char.IsPunctuation(charKey)) &&
                 (char.IsSymbol(charKey))
                 // ||( char.IsWhiteSpace(charKey) )
                 ) &&
                (charKey != '#') &&
                (charKey != '_') &&
                (charKey != '.'))
            {
                return(result);
            }


            int endOffset = offset;

            offset = FindPrevWordOffset(offset);

            if (offset > 0 || endOffset > 0 || offset < endOffset)
            {
                int    offset2      = FindPrevWordOffsetStartSpace(offset);
                string previousWord = this.Document.GetTextBetween(offset2, offset).Trim();

                int    offset3         = FindPrevWordOffsetWithoutDot(offset);
                string previousWordDot = this.Document.GetTextBetween(offset3, offset).Trim();

                //Console.WriteLine("previousWord-> {0}",previousWord);
                //Console.WriteLine("previousWord-> {0}",previousWordDot);

                /*int lineNumber= this.Document.OffsetToLineNumber(endOffset);
                 * LineSegment lineSegment = this.Document.GetLine(lineNumber);
                 *
                 * string lineText =this.Document.GetTextBetween(lineSegment.Offset,endOffset);
                 */

                if (!string.IsNullOrEmpty(lineText))                  // som za komentarom
                {
                    if (lineText.Contains("//"))
                    {
                        return(result);
                    }
                }

                string docText = this.Document.GetTextBetween(0, endOffset);

                int countCommentStart = CountExpresion("/*", docText);             //
                int countCommentEnd   = CountExpresion("*/", docText);             //
                //int countComment = CountExpresion(""",docText);

                int countSem = docText.Count(c => c == '"');

                if (charKey == '(')
                {
                    int    offsetB       = FindPrevWordOffsetWithoutBrackets(offset);
                    string previousWordB = this.Document.GetTextBetween(offsetB, offset - 1).Trim();
                    if ((charKey == '(') || (previousWordB.Trim().Contains('(')))
                    {
                        ParameterDataProvider pdp = new ParameterDataProvider(this, previousWordB.Trim());

                        /*IParameterDataProvider cp = null;
                         * CodeCompletionContext ctx = CreateCodeCompletionContext (cpos);
                         * cp = ParameterCompletionCommand (ctx);
                         */
                        ParameterInformationWindowManager.ShowWindow(this, pdp);

                        return(result);
                    }
                    return(result);
                }
                if (charKey == ')')
                {
                    ParameterInformationWindowManager.HideWindow(this);
                    return(result);
                }

                /*if(lineText.Trim().StartsWith("include")){
                 *      completionType = CompletionTyp.includeType;
                 *
                 *      Gtk.Action act = MainClass.MainWindow.EditorNotebook.EditorAction.GetAction("sourceeditor_insertautocomplete");
                 *      if (act!=null){
                 *              act.Activate();
                 *      }
                 *      return result;
                 * }*/

                // komentar alebo string "" /**/
                if ((countCommentStart > countCommentEnd) || (!ItEven(countSem)))
                {
                    return(result);
                }

                if ((charKey == '.') || (previousWordDot.Trim().Contains('.')))
                {
                    completionType = CompletionTyp.dotType;
                }

                if (previousWord.Trim() == "new")
                {
                    completionType = CompletionTyp.newType;
                }



                string word = this.Document.GetTextAt(offset, endOffset - offset).Trim();
                if ((!IsKeyvord(previousWord.Trim()) && IsIdentifier(word)) ||
                    (previousWord.Trim() == "new") ||
                    (charKey == '.'))
                {
                    Gtk.Action act = MainClass.MainWindow.EditorNotebook.EditorAction.GetAction("sourceeditor_insertautocomplete");
                    if (act != null)
                    {
                        act.Activate();
                    }
                }
            }

            return(result);
        }
        // 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(KeyDescriptor descriptor)
        {
            if (!IsActiveExtension())
            {
                return(base.KeyPress(descriptor));
            }
            bool res;

            if (CurrentCompletionContext != null)
            {
                if (CompletionWindowManager.PreProcessKeyEvent(descriptor))
                {
                    CompletionWindowManager.PostProcessKeyEvent(descriptor);
                    autoHideCompletionWindow = true;
                    // in named parameter case leave the parameter window open.
                    autoHideParameterWindow = descriptor.KeyChar != ':';
                    if (!autoHideParameterWindow && ParameterInformationWindowManager.IsWindowVisible)
                    {
                        ParameterInformationWindowManager.PostProcessKeyEvent(this, CompletionWidget, descriptor);
                    }

                    return(false);
                }
                autoHideCompletionWindow = autoHideParameterWindow = false;
            }

            if (ParameterInformationWindowManager.IsWindowVisible)
            {
                if (ParameterInformationWindowManager.ProcessKeyEvent(this, CompletionWidget, descriptor))
                {
                    return(false);
                }
                autoHideCompletionWindow = autoHideParameterWindow = false;
            }

            //			int oldPos = Editor.CursorPosition;
            //			int oldLen = Editor.TextLength;
            char deleteOrBackspaceTriggerChar = '\0';

            if (descriptor.SpecialKey == SpecialKey.Delete && Editor.CaretOffset < Editor.Length)
            {
                deleteOrBackspaceTriggerChar = Editor.GetCharAt(Editor.CaretOffset);
            }
            if (descriptor.SpecialKey == SpecialKey.BackSpace && Editor.CaretOffset > 0)
            {
                deleteOrBackspaceTriggerChar = Editor.GetCharAt(Editor.CaretOffset - 1);
            }

            res = base.KeyPress(descriptor);
            if (Editor.EditMode == EditMode.TextLink && Editor.TextLinkPurpose == TextLinkPurpose.Rename)
            {
                return(res);
            }
            if (descriptor.KeyChar == (char)16 || descriptor.KeyChar == (char)17)
            {
                return(res);
            }

            CompletionWindowManager.PostProcessKeyEvent(descriptor);

            var ignoreMods = ModifierKeys.Control | ModifierKeys.Alt
                             | ModifierKeys.Command;

            // Handle parameter completion
            if (ParameterInformationWindowManager.IsWindowVisible)
            {
                ParameterInformationWindowManager.PostProcessKeyEvent(this, CompletionWidget, descriptor);
            }

            if ((descriptor.ModifierKeys & ignoreMods) != 0)
            {
                return(res);
            }

            // don't complete on block selection
            if (/*!EnableCodeCompletion ||*/ Editor.SelectionMode == MonoDevelop.Ide.Editor.SelectionMode.Block)
            {
                return(res);
            }
            // Handle code completion
            if (descriptor.KeyChar != '\0' && CompletionWidget != null && !CompletionWindowManager.IsVisible)
            {
                completionTokenSrc.Cancel();
                CurrentCompletionContext = CompletionWidget.CurrentCodeCompletionContext;
                completionTokenSrc       = new CancellationTokenSource();
                var caretOffset = Editor.CaretOffset;
                var token       = completionTokenSrc.Token;
                try {
                    var task = HandleCodeCompletionAsync(CurrentCompletionContext, new CompletionTriggerInfo(CompletionTriggerReason.CharTyped, descriptor.KeyChar), token);
                    if (task != null)
                    {
                        // Show the completion window in two steps. The call to PrepareShowWindow creates the window but
                        // it doesn't show it. It is used only to process the keys while the completion data is being retrieved.
                        CompletionWindowManager.PrepareShowWindow(this, descriptor.KeyChar, CompletionWidget, CurrentCompletionContext);
                        EventHandler windowClosed = delegate(object o, EventArgs a) {
                            completionTokenSrc.Cancel();
                        };
                        CompletionWindowManager.WindowClosed += windowClosed;
                        task.ContinueWith(t => {
                            CompletionWindowManager.WindowClosed -= windowClosed;
                            if (token.IsCancellationRequested)
                            {
                                return;
                            }
                            var result = t.Result;
                            if (result != null)
                            {
                                int triggerWordLength = result.TriggerWordLength + (Editor.CaretOffset - caretOffset);
                                if (triggerWordLength > 0 && (triggerWordLength < Editor.CaretOffset ||
                                                              (triggerWordLength == 1 && Editor.CaretOffset == 1)))
                                {
                                    CurrentCompletionContext = CompletionWidget.CreateCodeCompletionContext(Editor.CaretOffset - triggerWordLength);
                                    if (result.TriggerWordStart >= 0)
                                    {
                                        CurrentCompletionContext.TriggerOffset = result.TriggerWordStart;
                                    }
                                    CurrentCompletionContext.TriggerWordLength = triggerWordLength;
                                }
                                // Now show the window for real.
                                if (!CompletionWindowManager.ShowWindow(result, CurrentCompletionContext))
                                {
                                    CurrentCompletionContext = null;
                                }
                            }
                            else
                            {
                                CompletionWindowManager.HideWindow();
                                CurrentCompletionContext = null;
                            }
                        }, Runtime.MainTaskScheduler);
                    }
                    else
                    {
                        CurrentCompletionContext = null;
                    }
                } catch (TaskCanceledException) {
                } catch (AggregateException) {
                }
            }

            if ((descriptor.SpecialKey == SpecialKey.Delete || descriptor.SpecialKey == SpecialKey.BackSpace) && CompletionWidget != null && !CompletionWindowManager.IsVisible)
            {
                if (!char.IsLetterOrDigit(deleteOrBackspaceTriggerChar) && deleteOrBackspaceTriggerChar != '_')
                {
                    return(res);
                }
                CurrentCompletionContext = CompletionWidget.CurrentCodeCompletionContext;

                int cpos, wlen;
                if (!GetCompletionCommandOffset(out cpos, out wlen))
                {
                    cpos = Editor.CaretOffset;
                    wlen = 0;
                }

                CurrentCompletionContext.TriggerOffset     = cpos;
                CurrentCompletionContext.TriggerWordLength = wlen;

                completionTokenSrc.Cancel();
                completionTokenSrc = new CancellationTokenSource();
                var caretOffset = Editor.CaretOffset;
                var token       = completionTokenSrc.Token;
                try {
                    var task = HandleCodeCompletionAsync(CurrentCompletionContext, new CompletionTriggerInfo(CompletionTriggerReason.BackspaceOrDeleteCommand, deleteOrBackspaceTriggerChar), token);
                    if (task != null)
                    {
                        // Show the completion window in two steps. The call to PrepareShowWindow creates the window but
                        // it doesn't show it. It is used only to process the keys while the completion data is being retrieved.
                        CompletionWindowManager.PrepareShowWindow(this, descriptor.KeyChar, CompletionWidget, CurrentCompletionContext);
                        EventHandler windowClosed = delegate(object o, EventArgs a) {
                            completionTokenSrc.Cancel();
                        };
                        CompletionWindowManager.WindowClosed += windowClosed;

                        task.ContinueWith(t => {
                            CompletionWindowManager.WindowClosed -= windowClosed;
                            if (token.IsCancellationRequested)
                            {
                                return;
                            }
                            var result = t.Result;
                            if (result != null)
                            {
                                int triggerWordLength = result.TriggerWordLength + (Editor.CaretOffset - caretOffset);

                                if (triggerWordLength > 0 && (triggerWordLength < Editor.CaretOffset ||
                                                              (triggerWordLength == 1 && Editor.CaretOffset == 1)))
                                {
                                    CurrentCompletionContext = CompletionWidget.CreateCodeCompletionContext(Editor.CaretOffset - triggerWordLength);
                                    if (result.TriggerWordStart >= 0)
                                    {
                                        CurrentCompletionContext.TriggerOffset = result.TriggerWordStart;
                                    }
                                    CurrentCompletionContext.TriggerWordLength = triggerWordLength;
                                }
                                // Now show the window for real.
                                if (!CompletionWindowManager.ShowWindow(result, CurrentCompletionContext))
                                {
                                    CurrentCompletionContext = null;
                                }
                                else
                                {
                                    CompletionWindowManager.Wnd.StartOffset = CurrentCompletionContext.TriggerOffset;
                                }
                            }
                            else
                            {
                                CompletionWindowManager.HideWindow();
                                CurrentCompletionContext = null;
                            }
                        }, Runtime.MainTaskScheduler);
                    }
                    else
                    {
                        CurrentCompletionContext = null;
                    }
                } catch (TaskCanceledException) {
                    CurrentCompletionContext = null;
                } catch (AggregateException) {
                    CurrentCompletionContext = null;
                }
            }

            if (CompletionWidget != null)
            {
                CodeCompletionContext ctx  = CompletionWidget.CurrentCodeCompletionContext;
                var newparameterHintingSrc = new CancellationTokenSource();
                var token = newparameterHintingSrc.Token;
                try {
                    var task = HandleParameterCompletionAsync(ctx, descriptor.KeyChar, token);
                    if (task != null)
                    {
                        parameterHintingSrc.Cancel();
                        parameterHintingSrc = newparameterHintingSrc;
                        parameterHingtingCursorPositionChanged = false;
                        task.ContinueWith(t => {
                            if (!token.IsCancellationRequested && t.Result != null)
                            {
                                ParameterInformationWindowManager.ShowWindow(this, CompletionWidget, ctx, t.Result);
                                if (parameterHingtingCursorPositionChanged)
                                {
                                    ParameterInformationWindowManager.UpdateCursorPosition(this, CompletionWidget);
                                }
                            }
                        }, token, TaskContinuationOptions.None, Runtime.MainTaskScheduler);
                    }
                    else
                    {
                        //Key was typed that was filtered out, no heavy processing will be performed(task==null)
                        //but we still want to update ParameterInfo window to avoid displaying it outside method call
                        parameterHingtingCursorPositionChanged = true;
                    }
                } catch (TaskCanceledException) {
                } catch (AggregateException) {
                }
            }
            return(res);
        }
Пример #26
0
 protected override void VAdjustmentValueChanged()
 {
     base.VAdjustmentValueChanged();
     CompletionWindowManager.HideWindow();
     ParameterInformationWindowManager.HideWindow();
 }
        // 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)
            {
                if (CompletionWindowManager.PreProcessKeyEvent(key, keyChar, modifier, out ka))
                {
                    CompletionWindowManager.PostProcessKeyEvent(ka, key, keyChar, modifier);
                    autoHideCompletionWindow = true;
                    return(false);
                }
                autoHideCompletionWindow = false;
            }

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

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

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

            CompletionWindowManager.PostProcessKeyEvent(ka, key, keyChar, modifier);

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

            // Handle parameter completion
            if (ParameterInformationWindowManager.IsWindowVisible)
            {
                ParameterInformationWindowManager.PostProcessKeyEvent(CompletionWidget, 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;
             *      }
             * }*/

            // don't complete on block selection
            if (!enableCodeCompletion || Document.Editor.SelectionMode == Mono.TextEditor.SelectionMode.Block)
            {
                return(res);
            }

            // Handle code completion

            if (keyChar != '\0' && CompletionWidget != null && currentCompletionContext == null)
            {
                currentCompletionContext = CompletionWidget.CurrentCodeCompletionContext;

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

                if (triggerWordLength > 0 && (triggerWordLength < Editor.Caret.Offset ||
                                              (triggerWordLength == 1 && Editor.Caret.Offset == 1)))
                {
                    currentCompletionContext
                        = CompletionWidget.CreateCodeCompletionContext(Editor.Caret.Offset - 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.CurrentCodeCompletionContext;
                IParameterDataProvider paramProvider = HandleParameterCompletion(ctx, keyChar);
                if (paramProvider != null)
                {
                    ParameterInformationWindowManager.ShowWindow(CompletionWidget, ctx, paramProvider);
                }
            }

            autoHideCompletionWindow = true;

            return(res);
        }
        // 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;

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

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

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

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

            CompletionWindowManager.PostProcessKeyEvent(key, keyChar, modifier);

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

            // Handle parameter completion
            if (ParameterInformationWindowManager.IsWindowVisible)
            {
                ParameterInformationWindowManager.PostProcessKeyEvent(this, CompletionWidget, key, modifier);
            }

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

            // don't complete on block selection
            if (!EnableCodeCompletion || Document.Editor.SelectionMode == Mono.TextEditor.SelectionMode.Block)
            {
                return(res);
            }

            // Handle code completion

            if (keyChar != '\0' && CompletionWidget != null && currentCompletionContext == null)
            {
                currentCompletionContext = CompletionWidget.CurrentCodeCompletionContext;
                int triggerWordLength = currentCompletionContext.TriggerWordLength;
                ICompletionDataList completionList = HandleCodeCompletion(currentCompletionContext, keyChar,
                                                                          ref triggerWordLength);

                if (triggerWordLength > 0 && (triggerWordLength < Editor.Caret.Offset ||
                                              (triggerWordLength == 1 && Editor.Caret.Offset == 1)))
                {
                    currentCompletionContext
                        = CompletionWidget.CreateCodeCompletionContext(Editor.Caret.Offset - triggerWordLength);
                    currentCompletionContext.TriggerWordLength = triggerWordLength;
                }
                if (completionList != null)
                {
                    if (!CompletionWindowManager.ShowWindow(this, keyChar, completionList, CompletionWidget, currentCompletionContext))
                    {
                        currentCompletionContext = null;
                    }
                }
                else
                {
                    currentCompletionContext = null;
                }
            }

            if (EnableParameterInsight && CompletionWidget != null)
            {
                CodeCompletionContext  ctx           = CompletionWidget.CurrentCodeCompletionContext;
                IParameterDataProvider paramProvider = HandleParameterCompletion(ctx, keyChar);
                if (paramProvider != null)
                {
                    ParameterInformationWindowManager.ShowWindow(this, CompletionWidget, ctx, paramProvider);
                }
            }

            autoHideCompletionWindow = true;

            return(res);
        }