private void DoExtendDebugMenu(NSMenu menu) { #if DEBUG NSApplication app = NSApplication.sharedApplication(); menu.addItem(NSMenuItem.Create("Dump Bosses", "dumpBosses:", app.delegate_())); menu.addItem(NSMenuItem.separatorItem()); menu.addItem(NSMenuItem.Create("Dump Object Details", "dumpObjectDetails:", app.delegate_())); menu.addItem(NSMenuItem.Create("Dump Active Objects", "dumpActiveObjects:", app.delegate_())); #endif }
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); } }