OSDN Git Service

UWP版で変換候補の位置がずれるバグを修正した
[fooeditengine/FooEditEngine.git] / Core / Util.cs
1 /*
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.
5
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.
8
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/>.
10  */
11 using System;
12 using System.Linq;
13 using System.Collections.Generic;
14 using System.Globalization;
15 using System.Text;
16 using System.Reflection;
17 using System.Collections;
18
19 namespace FooEditEngine
20 {
21     class Util
22     {
23 #if METRO || WINDOWS_UWP
24         public static void GetDpi(out float dpix, out float dpiy)
25         {
26             dpix = Windows.Graphics.Display.DisplayInformation.GetForCurrentView().LogicalDpi;
27             dpiy = Windows.Graphics.Display.DisplayInformation.GetForCurrentView().LogicalDpi;
28         }
29
30         public static double GetScale()
31         {
32             float dpi;
33             Util.GetDpi(out dpi, out dpi);
34             return dpi / 96.0;
35         }
36
37         public static Point GetClientPoint(Point screen, Windows.UI.Xaml.UIElement element)
38         {
39             //Windows10以降では補正する必要がある
40             Windows.Foundation.Rect win_rect = Windows.UI.Xaml.Window.Current.CoreWindow.Bounds;
41             screen = screen.Offset(-win_rect.X, -win_rect.Y);
42
43             var gt = Windows.UI.Xaml.Window.Current.Content.TransformToVisual(element);
44             return gt.TransformPoint(screen);
45         }
46
47         public static Point GetPointInWindow(Point client, Windows.UI.Xaml.UIElement element)
48         {
49             //ウィンドウ内での絶対座標を取得する
50             var gt = element.TransformToVisual(null);
51             return gt.TransformPoint(client);
52         }
53
54         public static Point GetScreentPoint(Point client, Windows.UI.Xaml.UIElement element)
55         {
56             //ウィンドウ内での絶対座標を取得する
57             Point screenPoint = GetPointInWindow(client, element);
58
59             //Windows10以降では補正する必要がある
60             Windows.Foundation.Rect win_rect = Windows.UI.Xaml.Window.Current.CoreWindow.Bounds;
61             screenPoint = screenPoint.Offset(win_rect.X, win_rect.Y);
62
63             return screenPoint;
64         }
65         public static Windows.Foundation.Rect GetClientRect(Windows.Foundation.Rect screen, Windows.UI.Xaml.UIElement element)
66         {
67             //Windows10以降では補正する必要がある
68             Windows.Foundation.Rect win_rect = Windows.UI.Xaml.Window.Current.CoreWindow.Bounds;
69             screen.X -= win_rect.X;
70             screen.Y -= win_rect.Y;
71
72             var gt = Windows.UI.Xaml.Window.Current.Content.TransformToVisual(element);
73             return gt.TransformBounds(screen);
74         }
75         public static Windows.Foundation.Rect GetScreentRect(Windows.Foundation.Rect client, Windows.UI.Xaml.UIElement element)
76         {
77             //ウィンドウ内での絶対座標を取得する
78             var gt = element.TransformToVisual(null);
79             Windows.Foundation.Rect screenRect = gt.TransformBounds(client);
80
81             //Windows10以降では補正する必要がある
82             Windows.Foundation.Rect win_rect = Windows.UI.Xaml.Window.Current.CoreWindow.Bounds;
83             screenRect.X += win_rect.X;
84             screenRect.Y += win_rect.Y;
85
86             return screenRect;
87         }
88         public static IEnumerable<char> GetEnumrator(string s)
89         {
90             char[] chars = s.ToCharArray();
91             return chars;
92         }
93 #else
94         public static IEnumerable<char> GetEnumrator(string s)
95         {
96             return s;
97         }
98 #endif
99
100         public static T ConvertAbsIndexToRelIndex<T>(T n, int StartIndex, int Length) where T : IRange
101         {
102             n = Util.NormalizeIMaker<T>(n);
103
104             int markerEnd = n.start + n.length - 1;
105
106             int EndIndex = StartIndex + Length;
107
108             if (n.start >= StartIndex && markerEnd <= EndIndex)
109                 n.start -= StartIndex;
110             else if (n.start >= StartIndex && n.start <= EndIndex)
111             {
112                 n.start -= StartIndex;
113                 n.length = EndIndex - StartIndex + 1;
114             }
115             else if (markerEnd >= StartIndex && markerEnd <= EndIndex)
116             {
117                 n.start = 0;
118                 n.length = markerEnd - StartIndex + 1;
119             }
120             else if (n.start >= StartIndex && markerEnd <= EndIndex)
121                 n.start -= StartIndex;
122             else if (n.start <= StartIndex && markerEnd > EndIndex)
123             {
124                 n.start = 0;
125                 n.length = EndIndex - StartIndex + 1;
126             }
127             else
128             {
129                 n.start = -1;
130                 n.length = 0;
131             }
132             return n;
133         }
134
135         public static bool IsWordSeparator(char c)
136         {
137             if (c == Document.NewLine || char.IsSeparator(c) || char.IsPunctuation(c) || CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.MathSymbol)
138                 return true;
139             else
140                 return false;
141         }
142         public static void Swap<T>(ref T a, ref T b)
143         {
144             T c = b;
145             b = a;
146             a = c;
147         }
148
149         public static string Generate(char c, int count)
150         {
151             StringBuilder tabstr = new StringBuilder();
152             for (int j = count; j > 0; j--)
153                 tabstr.Append(c);
154             return tabstr.ToString();
155         }
156
157         public static Rectangle OffsetAndDeflate(Rectangle r, Size s)
158         {
159             return new Rectangle(r.X + s.Width,r.Y + s.Height, r.Width - s.Width, r.Height - s.Height);
160         }
161
162         public static T NormalizeIMaker<T>(T m) where T : IRange
163         {
164             if (m.length > 0)
165                 return m;
166             m.start = m.start + m.length;
167             m.length = Math.Abs(m.length);
168             return m;
169         }
170
171         public static int RoundUp(double x)
172         {
173             return (int)(x + 0.5);
174         }
175
176     }
177 }