diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2019-04-09 01:47:48 +0300 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2019-04-09 01:47:48 +0300 |
| commit | 080f1697e97e13461ec6df4d31c8924d01257a1b (patch) | |
| tree | b1fe0285de7bc9bc52e9e2195e66fe022bf8f5b3 /Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineLinkText.cs | |
| parent | 1608e69a417bc5e40a607c3958c4a60f19f66f1a (diff) | |
| download | Tango-080f1697e97e13461ec6df4d31c8924d01257a1b.tar.gz Tango-080f1697e97e13461ec6df4d31c8924d01257a1b.zip | |
MERGE
Diffstat (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineLinkText.cs')
| -rw-r--r-- | Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineLinkText.cs | 114 |
1 files changed, 114 insertions, 0 deletions
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 +{ + /// <summary> + /// VisualLineElement that represents a piece of text and is a clickable link. + /// </summary> + public class VisualLineLinkText : VisualLineText + { + /// <summary> + /// Gets/Sets the URL that is navigated to when the link is clicked. + /// </summary> + public Uri NavigateUri { get; set; } + + /// <summary> + /// Gets/Sets the window name where the URL will be opened. + /// </summary> + public string TargetName { get; set; } + + /// <summary> + /// Gets/Sets whether the user needs to press Control to click the link. + /// The default value is true. + /// </summary> + public bool RequireControlModifierForClick { get; set; } + + /// <summary> + /// Creates a visual line text element with the specified length. + /// It uses the <see cref="ITextRunConstructionContext.VisualLine"/> and its + /// <see cref="VisualLineElement.RelativeTextOffset"/> to find the actual text string. + /// </summary> + public VisualLineLinkText(VisualLine parentVisualLine, int length) : base(parentVisualLine, length) + { + this.RequireControlModifierForClick = true; + } + + /// <inheritdoc/> + 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); + } + + /// <summary> + /// Gets whether the link is currently clickable. + /// </summary> + /// <remarks>Returns true when control is pressed; or when + /// <see cref="RequireControlModifierForClick"/> is disabled.</remarks> + protected bool LinkIsClickable() + { + if (NavigateUri == null) + return false; + if (RequireControlModifierForClick) + return (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control; + else + return true; + } + + /// <inheritdoc/> + protected internal override void OnQueryCursor(QueryCursorEventArgs e) + { + if (LinkIsClickable()) { + e.Handled = true; + e.Cursor = Cursors.Hand; + } + } + + /// <inheritdoc/> + [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; + } + } + + /// <inheritdoc/> + protected override VisualLineText CreateInstance(int length) + { + return new VisualLineLinkText(ParentVisualLine, length) { + NavigateUri = this.NavigateUri, + TargetName = this.TargetName, + RequireControlModifierForClick = this.RequireControlModifierForClick + }; + } + } +} |
