/*
* Copyright (C) 2013 FooProject
* * 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
* the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see .
*/
using System;
using System.Linq;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
namespace FooEditEngine
{
class Util
{
#if METRO
public static Windows.Foundation.Point GetClientPoint(Windows.Foundation.Point screen, Windows.UI.Xaml.UIElement element)
{
var gt = element.TransformToVisual(element);
return gt.TransformPoint(screen);
}
public static Windows.Foundation.Point GetScreentPoint(Windows.Foundation.Point client, Windows.UI.Xaml.UIElement element)
{
var gt = element.TransformToVisual(Windows.UI.Xaml.Window.Current.Content);
return gt.TransformPoint(client);
}
public static Windows.Foundation.Rect GetClientRect(Windows.Foundation.Rect screen, Windows.UI.Xaml.UIElement element)
{
var gt = element.TransformToVisual(element);
return gt.TransformBounds(screen);
}
public static Windows.Foundation.Rect GetScreentRect(Windows.Foundation.Rect client, Windows.UI.Xaml.UIElement element)
{
var gt = element.TransformToVisual(Windows.UI.Xaml.Window.Current.Content);
return gt.TransformBounds(client);
}
public static IEnumerable GetEnumrator(string s)
{
char[] chars = s.ToCharArray();
return chars;
}
#else
public static IEnumerable GetEnumrator(string s)
{
return s;
}
#endif
public static T ConvertAbsIndexToRelIndex(T n, int StartIndex, int Length) where T : IRange
{
n = Util.NormalizeIMaker(n);
int markerEnd = n.start + n.length - 1;
int EndIndex = StartIndex + Length;
if (n.start >= StartIndex && markerEnd <= EndIndex)
n.start -= StartIndex;
else if (n.start >= StartIndex && n.start <= EndIndex)
{
n.start -= StartIndex;
n.length = EndIndex - StartIndex + 1;
}
else if (markerEnd >= StartIndex && markerEnd <= EndIndex)
{
n.start = 0;
n.length = markerEnd - StartIndex + 1;
}
else if (n.start >= StartIndex && markerEnd <= EndIndex)
n.start -= StartIndex;
else if (n.start <= StartIndex && markerEnd > EndIndex)
{
n.start = 0;
n.length = EndIndex - StartIndex + 1;
}
else
{
n.start = -1;
n.length = 0;
}
return n;
}
public static bool IsWordSeparator(char c)
{
if (c == Document.NewLine || char.IsSeparator(c) || char.IsPunctuation(c) || CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.MathSymbol)
return true;
else
return false;
}
public static void Swap(ref T a, ref T b)
{
T c = b;
b = a;
a = c;
}
public static string Generate(char c, int count)
{
StringBuilder tabstr = new StringBuilder();
for (int j = count; j > 0; j--)
tabstr.Append(c);
return tabstr.ToString();
}
public static Rectangle OffsetAndDeflate(Rectangle r, Size s)
{
return new Rectangle(r.X + s.Width,r.Y + s.Height, r.Width - s.Width, r.Height - s.Height);
}
public static T NormalizeIMaker(T m) where T : IRange
{
if (m.length > 0)
return m;
m.start = m.start + m.length;
m.length = Math.Abs(m.length);
return m;
}
public static int RoundUp(double x)
{
return (int)(x + 0.5);
}
}
}