#region Using Directives
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
#endregion Using Directives
namespace ScintillaNET
{
public static class Utilities
{
#region Methods
///
/// Returns an HTML #XXXXXX format for a color. Unlike the ColorTranslator class it
/// never returns named colors.
///
public static string ColorToHtml(Color c)
{
return "#" + c.R.ToString("X2", null) + c.G.ToString("X2", null) + c.B.ToString("X2", null);
}
public static int ColorToRgb(Color c)
{
return c.R + (c.G << 8) + (c.B << 16);
}
public static Keys GetKeys(char c)
{
switch (c)
{
case '/':
return Keys.Oem2;
case '`':
return Keys.Oem3;
case '[':
return Keys.Oem4;
case '\\':
return Keys.Oem5;
case ']':
return Keys.Oem6;
case '-':
return (Keys)189;
}
return (Keys)Enum.Parse(typeof(Keys), c.ToString(), true);
}
public static Keys GetKeys(string s)
{
switch (s)
{
case "/":
return Keys.Oem2;
case "`":
return Keys.Oem3;
case "[":
return Keys.Oem4;
case "\\":
return Keys.Oem5;
case "]":
return Keys.Oem6;
case "-":
return (Keys)189;
}
return (Keys)Enum.Parse(typeof(Keys), s, true);
}
public static uint GetMarkerMask(IEnumerable markers)
{
uint mask = 0;
foreach (int i in markers)
mask |= ((uint)1) << i;
return mask;
}
public static uint GetMarkerMask(IEnumerable markers)
{
uint mask = 0;
foreach (Marker m in markers)
mask |= m.Mask;
return mask;
}
public static byte[] GetZeroTerminatedBytes(string text, Encoding encoding)
{
if (string.IsNullOrEmpty(text))
return new byte[] { 0 };
// This should be a little less wasteful than simply appending
// a null terminator to the string and then converting it
int byteCount = encoding.GetByteCount(text);
byte[] buffer = new byte[byteCount + 1];
unsafe
{
fixed (byte* bp = buffer)
fixed (char* ch = text)
{
int count = encoding.GetBytes(ch, text.Length, bp, byteCount);
Debug.Assert(count == byteCount);
}
}
// And the end cap...
buffer[buffer.Length - 1] = 0;
return buffer;
}
public static unsafe string IntPtrToString(Encoding encoding, IntPtr ptr)
{
if (ptr == IntPtr.Zero)
return null;
// Find the length of the null terminated bytes
int length = 0;
while (*((byte*)ptr + length) != (byte)0)
length++;
return IntPtrToString(encoding, ptr, length);
}
///
/// Marshals an IntPtr pointing to un unmanaged byte[] to a .NET String using the given Encoding.
///
///
/// I'd love to have this as en extension method but ScintillaNET's probably going to be 2.0 for a long
/// time to come. There's nothing really compelling in later versions that applies to ScintillaNET that
/// can't be done with a 2.0 construct (extension methods, linq, etc)
///
public static string IntPtrToString(Encoding encoding, IntPtr ptr, int length)
{
// null pointer = null string
if (ptr == IntPtr.Zero)
return null;
// 0 _length string = string.Empty
if (length == 0)
return string.Empty;
byte[] buff = new byte[length];
Marshal.Copy(ptr, buff, 0, length);
// We don't want to carry over the Trailing null
if (buff[buff.Length - 1] == 0)
length--;
return encoding.GetString(buff, 0, length);
}
public static Color RgbToColor(int color)
{
return Color.FromArgb(color & 0x0000ff, (color & 0x00ff00) >> 8, (color & 0xff0000) >> 16);
}
public static int SignedHiWord(IntPtr hiWord)
{
return (short)(((int)(long)hiWord >> 0x10) & 0xffff);
}
public static int SignedLoWord(IntPtr loWord)
{
return (short)((int)(long)loWord & 0xffff);
}
#endregion Methods
}
}