コード例 #1
0
        public void ExtendSelection(NSTextView view, NSEvent evt)
        {
            int index = DoMouseEventToIndex(view, evt);

            NSRange range = view.selectedRange();
            if (range.length == 0 && index < view.string_().length() && view.string_()[index] == '\n')
            {
                // don't extend the selection if the user clicked off to the right side of a line
            }
            else if (index >= view.string_().length())
            {
                // don't extend the selection if the user clicked below the last line of text
                view.setSelectedRange(NSRange.Empty);
            }
            else
            {
                // Extend the selection so that it contains the entire word the user right-clicked on.
                if (range.length == 0 || !range.Intersects(index))
                {
                    range = new NSRange(index, 1);
                    range = view.selectionRangeForProposedRange_granularity(range, Enums.NSSelectByWord);
                    view.setSelectedRange(range);
                }
            }
        }
コード例 #2
0
        public void Populate(NSMenu menu, NSTextView view, Boss window)
        {
            // ITextContextCommands expect that the main window is the one the user
            // is working with.
            view.window().makeKeyAndOrderFront(view);

            // We don't extend the default menu because it has tons of stuff that we
            // don't really want. But we should add the services...
            //			NSMenu menu = SuperCall("menuForEvent:", evt).To<NSMenu>();
            //			menu.addItem(NSMenuItem.separatorItem());

            try
            {
                // Get the selection.
                m_view = view;
                m_range = view.selectedRange();
                m_selection = null;
                if (m_range.length > 0)
                    view.string_().getCharacters_range(m_range, out m_selection);

                // Get the language.
                string language = null;
                if (window.Has<ITextEditor>())
                {
                    var editor = window.Get<ITextEditor>();
                    language = editor.Language;
                }

                // Get the commands.
                var watch = new Stopwatch();
                watch.Start();
                m_entries.Clear();
                if (window != null)
                    DoGetEntries(view, m_selection, language, window);
                DoGetEntries(view, m_selection, language, m_boss);

                if (m_entries.Count == 0)
                {
                    if (window != null)
                        DoGetEntries(view, null, language, window);
                    DoGetEntries(view, null, language, m_boss);
                }
                Log.WriteLine("ContextMenu", "took {0:0.000} secs to open the menu", watch.ElapsedMilliseconds/1000.0);

                m_entries.Sort(this.DoCompareEntry);

                // Remove duplicate separators and any at the start or end.
                for (int i = m_entries.Count - 1; i > 0; --i)
                {
                    if (m_entries[i].Command.Name == null && m_entries[i - 1].Command.Name == null)
                        m_entries.RemoveAt(i);
                }
                while (m_entries.Count > 0 && m_entries[0].Command.Name == null)
                    m_entries.RemoveAt(0);
                while (m_entries.Count > 0 && m_entries[m_entries.Count - 1].Command.Name == null)
                    m_entries.RemoveAt(m_entries.Count - 1);

                // Build the menu.
                menu.removeAllItems();
                for (int i = 0; i < m_entries.Count; ++i)
                {
                    NSMenuItem item = null;

                    if (m_entries[i].Command.Name != null)
                    {
                        if (m_entries[i].Command.Name != Constants.Ellipsis)
                        {
                            item = NSMenuItem.Create(m_entries[i].Command.Name, "dispatchTextContextMenu:");

                            if (m_entries[i].Command.Title != null)
                                item.setAttributedTitle(m_entries[i].Command.Title);
                        }
                        else
                            item = NSMenuItem.Create(Constants.Ellipsis);
                        item.setTag(i);
                    }
                    else
                    {
                        Contract.Assert(m_entries[i].Command.Handler == null, "names is null, but handlers is not");
                        item = NSMenuItem.separatorItem();
                    }

                    if (item != null)
                        menu.addItem(item);
                }
            }
            catch (DatabaseLockedException)
            {
                NSString title = NSString.Create("Database was locked.");
                NSString message = NSString.Create("Try again.");
                Unused.Value = Functions.NSRunAlertPanel(title, message);
            }
            catch (Exception e)
            {
                Log.WriteLine(TraceLevel.Error, "App", "Error building context menu:");
                Log.WriteLine(TraceLevel.Error, "App", "{0}", e);

                NSString title = NSString.Create("Error building the menu.");
                NSString message = NSString.Create(e.Message);
                Unused.Value = Functions.NSRunAlertPanel(title, message);
            }
        }