From 080f1697e97e13461ec6df4d31c8924d01257a1b Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Tue, 9 Apr 2019 01:47:48 +0300 Subject: MERGE --- .../Rendering/VisualLineLinkText.cs | 114 +++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineLinkText.cs (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineLinkText.cs') diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineLinkText.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineLinkText.cs new file mode 100644 index 000000000..57c472641 --- /dev/null +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineLinkText.cs @@ -0,0 +1,114 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Windows; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; + +namespace Tango.Scripting.Editors.Rendering +{ + /// + /// VisualLineElement that represents a piece of text and is a clickable link. + /// + public class VisualLineLinkText : VisualLineText + { + /// + /// Gets/Sets the URL that is navigated to when the link is clicked. + /// + public Uri NavigateUri { get; set; } + + /// + /// Gets/Sets the window name where the URL will be opened. + /// + public string TargetName { get; set; } + + /// + /// Gets/Sets whether the user needs to press Control to click the link. + /// The default value is true. + /// + public bool RequireControlModifierForClick { get; set; } + + /// + /// Creates a visual line text element with the specified length. + /// It uses the and its + /// to find the actual text string. + /// + public VisualLineLinkText(VisualLine parentVisualLine, int length) : base(parentVisualLine, length) + { + this.RequireControlModifierForClick = true; + } + + /// + public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context) + { + this.TextRunProperties.SetForegroundBrush(context.TextView.LinkTextForegroundBrush); + this.TextRunProperties.SetBackgroundBrush(context.TextView.LinkTextBackgroundBrush); + this.TextRunProperties.SetTextDecorations(TextDecorations.Underline); + return base.CreateTextRun(startVisualColumn, context); + } + + /// + /// Gets whether the link is currently clickable. + /// + /// Returns true when control is pressed; or when + /// is disabled. + protected bool LinkIsClickable() + { + if (NavigateUri == null) + return false; + if (RequireControlModifierForClick) + return (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control; + else + return true; + } + + /// + protected internal override void OnQueryCursor(QueryCursorEventArgs e) + { + if (LinkIsClickable()) { + e.Handled = true; + e.Cursor = Cursors.Hand; + } + } + + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", + Justification = "I've seen Process.Start throw undocumented exceptions when the mail client / web browser is installed incorrectly")] + protected internal override void OnMouseDown(MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left && !e.Handled && LinkIsClickable()) { + RequestNavigateEventArgs args = new RequestNavigateEventArgs(this.NavigateUri, this.TargetName); + args.RoutedEvent = Hyperlink.RequestNavigateEvent; + FrameworkElement element = e.Source as FrameworkElement; + if (element != null) { + // allow user code to handle the navigation request + element.RaiseEvent(args); + } + if (!args.Handled) { + try { + Process.Start(this.NavigateUri.ToString()); + } catch { + // ignore all kinds of errors during web browser start + } + } + e.Handled = true; + } + } + + /// + protected override VisualLineText CreateInstance(int length) + { + return new VisualLineLinkText(ParentVisualLine, length) { + NavigateUri = this.NavigateUri, + TargetName = this.TargetName, + RequireControlModifierForClick = this.RequireControlModifierForClick + }; + } + } +} -- cgit v1.3.1