Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/PinnedWatches/PinnedWatchView.cs')
-rw-r--r--main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/PinnedWatches/PinnedWatchView.cs195
1 files changed, 195 insertions, 0 deletions
diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/PinnedWatches/PinnedWatchView.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/PinnedWatches/PinnedWatchView.cs
new file mode 100644
index 0000000000..eee1df7af6
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger.VSTextView/PinnedWatches/PinnedWatchView.cs
@@ -0,0 +1,195 @@
+//
+// MacPinnedWatchView.cs
+//
+// Author:
+// Jeffrey Stedfast <jestedfa@microsoft.com>
+//
+// Copyright (c) 2019 Microsoft Corp.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+using AppKit;
+
+using Mono.Debugging.Client;
+
+namespace MonoDevelop.Debugger.VSTextView.PinnedWatches
+{
+ sealed class PinnedWatchView : NSScrollView
+ {
+ readonly ObjectValueTreeViewController controller;
+ readonly NSLayoutConstraint heightConstraint;
+ readonly NSLayoutConstraint widthConstraint;
+ readonly MacObjectValueTreeView treeView;
+ NSLayoutConstraint superHeightConstraint;
+ NSLayoutConstraint superWidthConstraint;
+ ObjectValue objectValue;
+ bool disposed;
+
+ public PinnedWatchView (PinnedWatch watch, StackFrame frame)
+ {
+ HasVerticalScroller = true;
+ AutohidesScrollers = true;
+
+ controller = new ObjectValueTreeViewController ();
+ controller.SetStackFrame (frame);
+ controller.AllowEditing = true;
+
+ treeView = controller.GetMacControl (headersVisible: false, compactView: true, allowPinning: true);
+
+ controller.PinnedWatch = watch;
+
+ if (watch.Value != null)
+ controller.AddValue (watch.Value);
+
+ var rect = treeView.Frame;
+
+ if (rect.Height < 1)
+ treeView.Frame = new CoreGraphics.CGRect (rect.X, rect.Y, rect.Width, 19);
+
+ DocumentView = treeView;
+ Frame = treeView.Frame;
+
+ heightConstraint = HeightAnchor.ConstraintEqualToConstant (treeView.Frame.Height);
+ heightConstraint.Active = true;
+
+ widthConstraint = WidthAnchor.ConstraintEqualToConstant (treeView.Frame.Width);
+ widthConstraint.Active = true;
+
+ DebuggingService.ResumedEvent += OnDebuggerResumed;
+ DebuggingService.PausedEvent += OnDebuggerPaused;
+ treeView.Resized += OnTreeViewResized;
+ }
+
+ public void SetObjectValue (ObjectValue value)
+ {
+ if (value == objectValue)
+ return;
+
+ controller.ClearAll ();
+
+ if (value != null)
+ controller.AddValue (value);
+
+ objectValue = value;
+ }
+
+ public override void ViewDidMoveToSuperview ()
+ {
+ base.ViewDidMoveToSuperview ();
+
+ if (Superview != null) {
+ superHeightConstraint = Superview.HeightAnchor.ConstraintEqualToConstant (Frame.Height);
+ superWidthConstraint = Superview.WidthAnchor.ConstraintEqualToConstant (Frame.Width);
+ superHeightConstraint.Active = true;
+ superWidthConstraint.Active = true;
+ } else {
+ superHeightConstraint?.Dispose ();
+ superWidthConstraint?.Dispose ();
+ superHeightConstraint = null;
+ superWidthConstraint = null;
+ }
+ }
+
+ void OnTreeViewResized (object sender, EventArgs e)
+ {
+ //const string CocoaTextViewScrollView = "CocoaTextViewScrollView";
+ const string CocoaTextViewControl = "CocoaTextViewControl";
+ //const string CocoaEditorGridView = "CocoaEditorGridView";
+
+ var materialView = Superview;
+
+ // Find our parent CocoaTextViewControl
+ var textView = materialView;
+ while (textView != null && textView.GetType ().Name != CocoaTextViewControl)
+ textView = textView.Superview;
+
+ if (textView == null)
+ return;
+
+ var origin = textView.ConvertPointFromView (Frame.Location, this);
+ var maxHeight = NMath.Max (textView.Frame.Bottom - origin.Y, treeView.RowHeight * 2);
+ var height = treeView.FittingSize.Height;
+ var width = treeView.Frame.Width;
+
+ height = NMath.Min (height, maxHeight);
+
+ heightConstraint.Constant = height;
+ widthConstraint.Constant = width;
+
+ superHeightConstraint.Constant = height;
+ superWidthConstraint.Constant = width;
+
+#if REPARENT_SO_SCROLLING_WORKS
+ // Find our parent CocoaEditorGridView
+ var gridView = textView.Superview;
+ while (gridView != null && gridView.GetType ().Name != CocoaEditorGridView)
+ gridView = gridView.Superview;
+
+ if (gridView == null)
+ return;
+
+ // Find the CocoaTextViewScrollView
+ NSView textViewScrollView = null;
+ foreach (var child in gridView.Subviews) {
+ if (child.GetType ().Name == CocoaTextViewScrollView) {
+ textViewScrollView = child;
+ break;
+ }
+ }
+
+ materialView.RemoveFromSuperview ();
+
+ gridView.AddSubview (materialView, NSWindowOrderingMode.Above, textViewScrollView);
+#endif
+ }
+
+ void OnDebuggerResumed (object sender, EventArgs e)
+ {
+ controller.ChangeCheckpoint ();
+ controller.AllowExpanding = false;
+ controller.AllowEditing = false;
+ }
+
+ void OnDebuggerPaused (object sender, EventArgs e)
+ {
+ controller.AllowExpanding = true;
+ controller.AllowEditing = true;
+ }
+
+ protected override void Dispose (bool disposing)
+ {
+ if (disposing && !disposed) {
+ DebuggingService.ResumedEvent -= OnDebuggerResumed;
+ DebuggingService.PausedEvent -= OnDebuggerPaused;
+ treeView.Resized -= OnTreeViewResized;
+ superHeightConstraint?.Dispose ();
+ superWidthConstraint?.Dispose ();
+ superHeightConstraint = null;
+ superWidthConstraint = null;
+ heightConstraint.Dispose ();
+ widthConstraint.Dispose ();
+ disposed = true;
+ }
+
+ base.Dispose (disposing);
+ }
+ }
+}