summaryrefslogtreecommitdiff
path: root/Juick/Classes
diff options
context:
space:
mode:
authorGravatar k0st1x2012-09-30 23:22:25 +0400
committerGravatar k0st1x2012-09-30 23:22:25 +0400
commit28986641046c8ee1dc2aba0055dfa36b811b25d2 (patch)
tree8ec69b4c461048403d1952428bf1ebb0ca7a1140 /Juick/Classes
parentc6c15caf54c6a648c7bd87c9161147ead4046988 (diff)
replace TextBlock by RichTextBox
Diffstat (limited to 'Juick/Classes')
-rw-r--r--Juick/Classes/ParagraphBindingBehavior.cs36
-rw-r--r--Juick/Classes/RichTextConverter.cs68
2 files changed, 75 insertions, 29 deletions
diff --git a/Juick/Classes/ParagraphBindingBehavior.cs b/Juick/Classes/ParagraphBindingBehavior.cs
new file mode 100644
index 0000000..6a05579
--- /dev/null
+++ b/Juick/Classes/ParagraphBindingBehavior.cs
@@ -0,0 +1,36 @@
+using System.Collections.Generic;
+using System.Windows;
+using System.Windows.Documents;
+
+namespace Juick.Classes
+{
+ public static class ParagraphBindingBehavior
+ {
+ static void AssignedInlinesCallback(DependencyObject target, DependencyPropertyChangedEventArgs e)
+ {
+ var inlines = ((Paragraph)target).Inlines;
+ inlines.Clear();
+ var value = e.NewValue as IEnumerable<Inline>;
+ if (value != null)
+ {
+ foreach (var inline in value)
+ {
+ inlines.Add(inline);
+ }
+ }
+ }
+
+ public static IEnumerable<Inline> GetAssignedInlines(DependencyObject obj)
+ {
+ return (IEnumerable<Inline>)obj.GetValue(AssignedInlinesProperty);
+ }
+
+ public static void SetAssignedInlines(DependencyObject obj, IEnumerable<Inline> value)
+ {
+ obj.SetValue(AssignedInlinesProperty, value);
+ }
+
+ public static readonly DependencyProperty AssignedInlinesProperty =
+ DependencyProperty.RegisterAttached("AssignedInlines", typeof(IEnumerable<Inline>), typeof(Paragraph), new PropertyMetadata(null, AssignedInlinesCallback));
+ }
+}
diff --git a/Juick/Classes/RichTextConverter.cs b/Juick/Classes/RichTextConverter.cs
index ee6ffa7..cdc1938 100644
--- a/Juick/Classes/RichTextConverter.cs
+++ b/Juick/Classes/RichTextConverter.cs
@@ -1,53 +1,63 @@
using System;
using System.Collections.Generic;
using System.Globalization;
-using System.Net;
-using System.Windows;
-using System.Windows.Controls;
+using System.Linq;
+using System.Text.RegularExpressions;
using System.Windows.Data;
using System.Windows.Documents;
-using System.Windows.Ink;
-using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Animation;
-using System.Windows.Shapes;
-using Microsoft.Phone.Tasks;
namespace Juick.Classes
{
public class RichTextConverter : IValueConverter
{
+ static readonly Regex UrlRegex = new Regex(@"http(s)?://([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?", RegexOptions.Compiled);
+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
- var message = value as string;
- var runs = new List<Inline>();
-
- foreach (var word in message.Split(new char[] {' ', '\n'}))
+ var stringValue = (string)value;
+ if (string.IsNullOrEmpty(stringValue))
{
- Uri uri;
+ return Enumerable.Empty<Inline>();
+ }
- if (Uri.TryCreate(word, UriKind.Absolute, out uri) ||
- (word.StartsWith("www.") && Uri.TryCreate("http://" + word, UriKind.Absolute, out uri)))
+ var result = new List<Inline>();
+ var index = 0;
+ foreach (var match in UrlRegex.Matches(stringValue).Cast<Match>())
+ {
+ Uri uri = null;
+ if (!Uri.TryCreate(match.Value, UriKind.Absolute, out uri))
{
- var link = new Hyperlink();
- link.Inlines.Add(new Run() { Text = word });
- link.Click += (sender, e) =>
- {
- var hyperLink = (sender as Hyperlink);
- new WebBrowserTask() { Uri = uri }.Show();
- };
-
- runs.Add(link);
+ continue;
}
- else
+ if (match.Index > 0)
{
- runs.Add(new Run() { Text = word });
+ var length = match.Index - index;
+ if (length > 0)
+ {
+ result.Add(new Run { Text = stringValue.Substring(index, length) });
+ }
}
- runs.Add(new Run() { Text = " " });
+ var hyperLink = new Hyperlink
+ {
+ NavigateUri = uri,
+ TargetName = "_blank"
+ };
+ hyperLink.Inlines.Add(uri.Host);
+ result.Add(hyperLink);
+
+ index = match.Index + match.Length;
}
- return runs;
+ if (index == 0 || index < stringValue.Length - 1)
+ {
+ var lastRunText = stringValue.Substring(index);
+ if (lastRunText.Length > 0)
+ {
+ result.Add(new Run { Text = lastRunText });
+ }
+ }
+ return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)