// NPP plugin platform for .Net v0.94.00 by Kasper B. Graversen etc. using System; using System.Runtime.InteropServices; namespace NppChnConvPlugin.NppPluginInfrastructure { /// /// Colours are set using the RGB format (Red, Green, Blue). The intensity of each colour is set in the range 0 to 255. /// If you have three such intensities, they are combined as: red | (green << 8) | (blue << 16). /// If you set all intensities to 255, the colour is white. If you set all intensities to 0, the colour is black. /// When you set a colour, you are making a request. What you will get depends on the capabilities of the system and the current screen mode. /// public class Colour { public readonly int Red, Green, Blue; public Colour(int rgb) { Red = rgb & 0xFF; Green = (rgb >> 8) & 0xFF; Blue = (rgb >> 16) & 0xFF; } /// /// /// /// a number 0-255 /// a number 0-255 /// a number 0-255 public Colour(int red, int green, int blue) { if(red > 255 || red < 0) throw new ArgumentOutOfRangeException("red", "must be 0-255"); if(green > 255 || green < 0) throw new ArgumentOutOfRangeException("green", "must be 0-255"); if(blue > 255 || blue < 0) throw new ArgumentOutOfRangeException("blue", "must be 0-255"); Red = red; Green = green; Blue = blue; } public int Value { get { return Red + (Green << 8) + (Blue << 16); } } } /// /// Positions within the Scintilla document refer to a character or the gap before that character. /// The first character in a document is 0, the second 1 and so on. If a document contains nLen characters, the last character is numbered nLen-1. The caret exists between character positions and can be located from before the first character (0) to after the last character (nLen). /// /// There are places where the caret can not go where two character bytes make up one character. /// This occurs when a DBCS character from a language like Japanese is included in the document or when line ends are marked with the CP/M /// standard of a carriage return followed by a line feed.The INVALID_POSITION constant(-1) represents an invalid position within the document. /// /// All lines of text in Scintilla are the same height, and this height is calculated from the largest font in any current style.This restriction /// is for performance; if lines differed in height then calculations involving positioning of text would require the text to be styled first. /// /// If you use messages, there is nothing to stop you setting a position that is in the middle of a CRLF pair, or in the middle of a 2 byte character. /// However, keyboard commands will not move the caret into such positions. /// public class Position : IEquatable { private readonly int pos; public Position(int pos) { this.pos = pos; } public int Value { get { return pos; } } public static Position operator +(Position a, Position b) { return new Position(a.pos + b.pos); } public static Position operator -(Position a, Position b) { return new Position(a.pos - b.pos); } public static bool operator ==(Position a, Position b) { if (ReferenceEquals(a, b)) return true; if (ReferenceEquals(a, null)) return false; if (ReferenceEquals(b, null)) return false; return a.pos == b.pos; } public static bool operator !=(Position a, Position b) { return !(a == b); } public static bool operator >(Position a, Position b) { return a.Value > b.Value; } public static bool operator <(Position a, Position b) { return a.Value < b.Value; } public static Position Min(Position a, Position b) { if (a < b) return a; return b; } public static Position Max(Position a, Position b) { if (a > b) return a; return b; } public override string ToString() { return "Postion: " + pos; } public bool Equals(Position other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; return pos == other.pos; } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != this.GetType()) return false; return Equals((Position)obj); } public override int GetHashCode() { return pos; } } /// /// Class containing key and modifiers /// /// The key code is a visible or control character or a key from the SCK_* enumeration, which contains: /// SCK_ADD, SCK_BACK, SCK_DELETE, SCK_DIVIDE, SCK_DOWN, SCK_END, SCK_ESCAPE, SCK_HOME, SCK_INSERT, SCK_LEFT, SCK_MENU, SCK_NEXT(Page Down), SCK_PRIOR(Page Up), S /// CK_RETURN, SCK_RIGHT, SCK_RWIN, SCK_SUBTRACT, SCK_TAB, SCK_UP, and SCK_WIN. /// /// The modifiers are a combination of zero or more of SCMOD_ALT, SCMOD_CTRL, SCMOD_SHIFT, SCMOD_META, and SCMOD_SUPER. /// On OS X, the Command key is mapped to SCMOD_CTRL and the Control key to SCMOD_META.SCMOD_SUPER is only available on GTK+ which is commonly the Windows key. /// If you are building a table, you might want to use SCMOD_NORM, which has the value 0, to mean no modifiers. /// public class KeyModifier { private readonly int value; /// /// The key code is a visible or control character or a key from the SCK_* enumeration, which contains: /// SCK_ADD, SCK_BACK, SCK_DELETE, SCK_DIVIDE, SCK_DOWN, SCK_END, SCK_ESCAPE, SCK_HOME, SCK_INSERT, SCK_LEFT, SCK_MENU, SCK_NEXT(Page Down), SCK_PRIOR(Page Up), /// SCK_RETURN, SCK_RIGHT, SCK_RWIN, SCK_SUBTRACT, SCK_TAB, SCK_UP, and SCK_WIN. /// /// The modifiers are a combination of zero or more of SCMOD_ALT, SCMOD_CTRL, SCMOD_SHIFT, SCMOD_META, and SCMOD_SUPER. /// On OS X, the Command key is mapped to SCMOD_CTRL and the Control key to SCMOD_META.SCMOD_SUPER is only available on GTK+ which is commonly the Windows key. /// If you are building a table, you might want to use SCMOD_NORM, which has the value 0, to mean no modifiers. /// public KeyModifier(SciMsg SCK_KeyCode, SciMsg SCMOD_modifier) { value = (int) SCK_KeyCode | ((int) SCMOD_modifier << 16); } public int Value { get { return Value; } } } [StructLayout(LayoutKind.Sequential)] public struct CharacterRange { public CharacterRange(int cpmin, int cpmax) { cpMin = cpmin; cpMax = cpmax; } public int cpMin; public int cpMax; } public class Cells { char[] charactersAndStyles; public Cells(char[] charactersAndStyles) { this.charactersAndStyles = charactersAndStyles; } public char[] Value { get { return charactersAndStyles; } } } public class TextRange : IDisposable { Sci_TextRange _sciTextRange; IntPtr _ptrSciTextRange; bool _disposed = false; public TextRange(CharacterRange chrRange, int stringCapacity) { _sciTextRange.chrg = chrRange; _sciTextRange.lpstrText = Marshal.AllocHGlobal(stringCapacity); } public TextRange(int cpmin, int cpmax, int stringCapacity) { _sciTextRange.chrg.cpMin = cpmin; _sciTextRange.chrg.cpMax = cpmax; _sciTextRange.lpstrText = Marshal.AllocHGlobal(stringCapacity); } [StructLayout(LayoutKind.Sequential)] struct Sci_TextRange { public CharacterRange chrg; public IntPtr lpstrText; } public IntPtr NativePointer { get { _initNativeStruct(); return _ptrSciTextRange; } } public string lpstrText { get { _readNativeStruct(); return Marshal.PtrToStringAnsi(_sciTextRange.lpstrText); } } public CharacterRange chrg { get { _readNativeStruct(); return _sciTextRange.chrg; } set { _sciTextRange.chrg = value; _initNativeStruct(); } } void _initNativeStruct() { if (_ptrSciTextRange == IntPtr.Zero) _ptrSciTextRange = Marshal.AllocHGlobal(Marshal.SizeOf(_sciTextRange)); Marshal.StructureToPtr(_sciTextRange, _ptrSciTextRange, false); } void _readNativeStruct() { if (_ptrSciTextRange != IntPtr.Zero) _sciTextRange = (Sci_TextRange)Marshal.PtrToStructure(_ptrSciTextRange, typeof(Sci_TextRange)); } public void Dispose() { if (!_disposed) { if (_sciTextRange.lpstrText != IntPtr.Zero) Marshal.FreeHGlobal(_sciTextRange.lpstrText); if (_ptrSciTextRange != IntPtr.Zero) Marshal.FreeHGlobal(_ptrSciTextRange); _disposed = true; } } ~TextRange() { Dispose(); } } /* ++Autogenerated -- start of section automatically generated from Scintilla.iface */ /* --Autogenerated -- end of section automatically generated from Scintilla.iface */ }