private void Dispose(bool disposing)
        {
            DebugOutput("~~~~~~~~~~~~~~~~~~~~~~ InPlaceEditor.Dispose(" + disposing + ")" ENTER);
#if DO_CLEANUP
            if (EditingEndedObserver != null)
            {
                DebugOutput("  ~!~!~!~! InPlaceEditor.Dispose: removing end edit observer");
                NSNotificationCenter.DefaultCenter.RemoveObserver(EditingEndedObserver);
                EditingEndedObserver.Dispose();
                EditingEndedObserver = null;
            }
            if (EditingTextChanged != null)
            {
                DebugOutput("  ~!~!~!~! InPlaceEditor.Dispose: removing edit text changed observer");
                NSNotificationCenter.DefaultCenter.RemoveObserver(EditingTextChanged);
                EditingTextChanged.Dispose();
                EditingTextChanged = null;
            }
            if (EditingStartedObserver != null)
            {
                DebugOutput("  ~!~!~!~! InPlaceEditor.Dispose: removing edit started observer");
                NSNotificationCenter.DefaultCenter.RemoveObserver(EditingStartedObserver);
                EditingStartedObserver.Dispose();
                EditingStartedObserver = null;
            }
#endif // DO_CLEANUP
            if (KeyMonitor != null)
            {
                DebugOutput("  ~!~!~!~! InPlaceEditor.Dispose: removing key monitor");
                NSEvent.RemoveMonitor(KeyMonitor);
                KeyMonitor.Dispose();
                KeyMonitor = null;
            }
            DebugOutput("~~~~~~~~~~~~~~~~~~~~~~ InPlaceEditor.Dispose(" + disposing + ") EXIT");
        }
        private void CellTextEditEnded(NSNotification notification)
        {
            DebugOutput("---------------------- CellEdit ended");
#if ENABLE_INPLACEEDIT_TRACE
            if (notification != null)
            {
                var editor = notification.UserInfo.ValueForKey(FieldEditorKey) as NSTextView;
                var value  = editor == null ? "<null editor>" : editor.Value;
                DebugOutput("  -!-!-!-! CellEdit ended: Notification field editor value: " + value);
            }
#endif // ENABLE_INPLACEEDIT_TRACE
#if DO_CLEANUP
            if (EditingEndedObserver != null)
            {
                DebugOutput("  -!-!-!-! CellEdit ended: Removing end edit observer");
                NSNotificationCenter.DefaultCenter.RemoveObserver(EditingEndedObserver);
                EditingEndedObserver.Dispose();
                EditingEndedObserver = null;
            }
            if (EditingTextChanged != null)
            {
                DebugOutput(" -!-!-!-! CellEdit ended: Removing edit text changed observer");
                NSNotificationCenter.DefaultCenter.RemoveObserver(EditingTextChanged);
                EditingTextChanged.Dispose();
                EditingTextChanged = null;
            }
            if (EditingStartedObserver != null)
            {
                DebugOutput("  -!-!-!-! CellEdit ended: Removing edit started observer");
                NSNotificationCenter.DefaultCenter.RemoveObserver(EditingStartedObserver);
                EditingStartedObserver.Dispose();
                EditingStartedObserver = null;
            }
#endif // DO_CLEANUP
            if (KeyMonitor != null)
            {
                DebugOutput("  -!-!-!-! CellEdit ended: Removing key event monitor");
                NSEvent.RemoveMonitor(KeyMonitor);
                KeyMonitor.Dispose();
                KeyMonitor = null;
            }
            EditingObject = null;
            LiveValue     = null;
            TextStorage   = null; // do NOT dispose this - it refers to the storage maintained by Owner
            DebugOutput("---------------------- CellEdit ended: Finished");
        }