2 * Copyright (C) 2013 FooProject
3 * * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
6 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
7 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
9 You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
13 using System.Collections.Generic;
14 using System.Globalization;
16 using System.Reflection;
17 using System.Collections;
19 namespace FooEditEngine
23 #if METRO || WINDOWS_UWP
24 static float? _LogicalDpi;
25 public static void GetDpi(out float dpix, out float dpiy)
27 if(_LogicalDpi == null)
28 _LogicalDpi = Windows.Graphics.Display.DisplayInformation.GetForCurrentView().LogicalDpi;
29 dpix = _LogicalDpi.Value;
30 dpiy = _LogicalDpi.Value;
33 public static double GetScale()
36 Util.GetDpi(out dpi, out dpi);
40 public static Point GetClientPoint(Point screen, Windows.UI.Xaml.UIElement element)
42 //Windows10以降では補正する必要がある
43 Windows.Foundation.Rect win_rect = Windows.UI.Xaml.Window.Current.CoreWindow.Bounds;
44 screen = screen.Offset(-win_rect.X, -win_rect.Y);
46 var gt = Windows.UI.Xaml.Window.Current.Content.TransformToVisual(element);
47 return gt.TransformPoint(screen);
50 public static Point GetPointInWindow(Point client, Windows.UI.Xaml.UIElement element)
53 var gt = element.TransformToVisual(Windows.UI.Xaml.Window.Current.Content);
54 return gt.TransformPoint(client);
57 public static Point GetScreentPoint(Point client, Windows.UI.Xaml.UIElement element)
59 var gt = element.TransformToVisual(Windows.UI.Xaml.Window.Current.Content);
60 Point p = gt.TransformPoint(client);
62 //Windows10以降では補正する必要がある
63 Windows.Foundation.Rect win_rect = Windows.UI.Xaml.Window.Current.CoreWindow.Bounds;
64 var screenPoint = p.Offset(win_rect.X, win_rect.Y);
67 public static Windows.Foundation.Rect GetClientRect(Windows.Foundation.Rect screen, Windows.UI.Xaml.UIElement element)
69 //Windows10以降では補正する必要がある
70 Windows.Foundation.Rect win_rect = Windows.UI.Xaml.Window.Current.CoreWindow.Bounds;
71 screen.X -= win_rect.X;
72 screen.Y -= win_rect.Y;
74 var gt = Windows.UI.Xaml.Window.Current.Content.TransformToVisual(element);
75 return gt.TransformBounds(screen);
77 public static Windows.Foundation.Rect GetScreentRect(Windows.Foundation.Rect client, Windows.UI.Xaml.UIElement element)
80 var gt = element.TransformToVisual(Windows.UI.Xaml.Window.Current.Content);
81 Windows.Foundation.Rect screenRect = gt.TransformBounds(client);
83 //Windows10以降では補正する必要がある
84 Windows.Foundation.Rect win_rect = Windows.UI.Xaml.Window.Current.CoreWindow.Bounds;
85 screenRect.X += win_rect.X;
86 screenRect.Y += win_rect.Y;
90 public static IEnumerable<char> GetEnumrator(string s)
92 char[] chars = s.ToCharArray();
96 public static void GetDpi(out float dpix, out float dpiy)
98 var dpiXProperty = typeof(System.Windows.SystemParameters).GetProperty("DpiX", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
99 var dpiYProperty = typeof(System.Windows.SystemParameters).GetProperty("Dpi", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
101 dpix = (int)dpiXProperty.GetValue(null, null);
102 dpiy = (int)dpiYProperty.GetValue(null, null);
105 public static double GetScale()
108 Util.GetDpi(out dpi, out dpi);
112 public static Point GetClientPoint(Point screen, System.Windows.FrameworkElement element)
114 return element.PointFromScreen(screen);
117 public static Point GetScreentPoint(Point client, System.Windows.FrameworkElement element)
119 return element.PointFromScreen(client);
122 public static IEnumerable<char> GetEnumrator(string s)
127 public static IEnumerable<char> GetEnumrator(string s)
133 public static T ConvertAbsIndexToRelIndex<T>(T n, int StartIndex, int Length) where T : IRange
135 n = Util.NormalizeIMaker<T>(n);
137 int markerEnd = n.start + n.length - 1;
139 int EndIndex = StartIndex + Length;
141 if (n.start >= StartIndex && markerEnd <= EndIndex)
142 n.start -= StartIndex;
143 else if (n.start >= StartIndex && n.start <= EndIndex)
145 n.start -= StartIndex;
146 n.length = EndIndex - StartIndex + 1;
148 else if (markerEnd >= StartIndex && markerEnd <= EndIndex)
151 n.length = markerEnd - StartIndex + 1;
153 else if (n.start >= StartIndex && markerEnd <= EndIndex)
154 n.start -= StartIndex;
155 else if (n.start <= StartIndex && markerEnd > EndIndex)
158 n.length = EndIndex - StartIndex + 1;
168 public static bool IsWordSeparator(char c)
170 if (c == Document.NewLine || char.IsSeparator(c) || char.IsPunctuation(c) || CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.MathSymbol)
175 public static void Swap<T>(ref T a, ref T b)
182 public static string Generate(char c, int count)
184 StringBuilder tabstr = new StringBuilder();
185 for (int j = count; j > 0; j--)
187 return tabstr.ToString();
190 public static Rectangle OffsetAndDeflate(Rectangle r, Size s)
192 return new Rectangle(r.X + s.Width,r.Y + s.Height, r.Width - s.Width, r.Height - s.Height);
195 public static T NormalizeIMaker<T>(T m) where T : IRange
199 m.start = m.start + m.length;
200 m.length = Math.Abs(m.length);
204 public static int RoundUp(double x)
206 return (int)(x + 0.5);