OSDN Git Service

WPF版にも自動補完機能を追加した
[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 void GetDpi(out float dpix, out float dpiy)
95         {
96             var dpiXProperty = typeof(System.Windows.SystemParameters).GetProperty("DpiX", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
97             var dpiYProperty = typeof(System.Windows.SystemParameters).GetProperty("Dpi", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
98
99             dpix = (int)dpiXProperty.GetValue(null, null);
100             dpiy = (int)dpiYProperty.GetValue(null, null);
101         }
102
103         public static double GetScale()
104         {
105             float dpi;
106             Util.GetDpi(out dpi, out dpi);
107             return dpi / 96.0;
108         }
109
110         public static IEnumerable<char> GetEnumrator(string s)
111         {
112             return s;
113         }
114 #endif
115
116         public static T ConvertAbsIndexToRelIndex<T>(T n, int StartIndex, int Length) where T : IRange
117         {
118             n = Util.NormalizeIMaker<T>(n);
119
120             int markerEnd = n.start + n.length - 1;
121
122             int EndIndex = StartIndex + Length;
123
124             if (n.start >= StartIndex && markerEnd <= EndIndex)
125                 n.start -= StartIndex;
126             else if (n.start >= StartIndex && n.start <= EndIndex)
127             {
128                 n.start -= StartIndex;
129                 n.length = EndIndex - StartIndex + 1;
130             }
131             else if (markerEnd >= StartIndex && markerEnd <= EndIndex)
132             {
133                 n.start = 0;
134                 n.length = markerEnd - StartIndex + 1;
135             }
136             else if (n.start >= StartIndex && markerEnd <= EndIndex)
137                 n.start -= StartIndex;
138             else if (n.start <= StartIndex && markerEnd > EndIndex)
139             {
140                 n.start = 0;
141                 n.length = EndIndex - StartIndex + 1;
142             }
143             else
144             {
145                 n.start = -1;
146                 n.length = 0;
147             }
148             return n;
149         }
150
151         public static bool IsWordSeparator(char c)
152         {
153             if (c == Document.NewLine || char.IsSeparator(c) || char.IsPunctuation(c) || CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.MathSymbol)
154                 return true;
155             else
156                 return false;
157         }
158         public static void Swap<T>(ref T a, ref T b)
159         {
160             T c = b;
161             b = a;
162             a = c;
163         }
164
165         public static string Generate(char c, int count)
166         {
167             StringBuilder tabstr = new StringBuilder();
168             for (int j = count; j > 0; j--)
169                 tabstr.Append(c);
170             return tabstr.ToString();
171         }
172
173         public static Rectangle OffsetAndDeflate(Rectangle r, Size s)
174         {
175             return new Rectangle(r.X + s.Width,r.Y + s.Height, r.Width - s.Width, r.Height - s.Height);
176         }
177
178         public static T NormalizeIMaker<T>(T m) where T : IRange
179         {
180             if (m.length > 0)
181                 return m;
182             m.start = m.start + m.length;
183             m.length = Math.Abs(m.length);
184             return m;
185         }
186
187         public static int RoundUp(double x)
188         {
189             return (int)(x + 0.5);
190         }
191
192     }
193 }