223 lines
7.7 KiB
C#
223 lines
7.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Diagnostics;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.Runtime.InteropServices;
|
|
namespace AMT_SW_GUI
|
|
{
|
|
|
|
//Parts of this file taken from codeproject
|
|
public enum LineSpacingRule
|
|
{
|
|
Single, //single line
|
|
Normal, // 1.5 line
|
|
Double, // double line
|
|
}
|
|
|
|
public partial class AMT_RichTextbox : RichTextBox
|
|
{
|
|
private bool labelMode = true;
|
|
public AMT_RichTextbox()
|
|
{
|
|
InitializeComponent();
|
|
this.TextChanged += new EventHandler(AMT_RichTextbox_TextChanged);
|
|
}
|
|
|
|
public AMT_RichTextbox(IContainer container)
|
|
{
|
|
container.Add(this);
|
|
|
|
InitializeComponent();
|
|
this.TextChanged+=new EventHandler(AMT_RichTextbox_TextChanged);
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
private class PARAFORMAT2
|
|
{
|
|
public int cbSize;
|
|
public int dwMask;
|
|
public short wNumbering;
|
|
public short wReserved;
|
|
public int dxStartIndent;
|
|
public int dxRightIndent;
|
|
public int dxOffset;
|
|
public short wAlignment;
|
|
public short cTabCount;
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)]
|
|
public int[] rgxTabs;
|
|
|
|
public int dySpaceBefore; // Vertical spacing before para
|
|
public int dySpaceAfter; // Vertical spacing after para
|
|
public int dyLineSpacing; // Line spacing depending on Rule
|
|
public short sStyle; // Style handle
|
|
public byte bLineSpacingRule; // Rule for line spacing (see tom.doc)
|
|
public byte bOutlineLevel; // Outline Level
|
|
public short wShadingWeight; // Shading in hundredths of a per cent
|
|
public short wShadingStyle; // Byte 0: style, nib 2: cfpat, 3: cbpat
|
|
public short wNumberingStart; // Starting value for numbering
|
|
public short wNumberingStyle; // Alignment, Roman/Arabic, (), ), ., etc.
|
|
public short wNumberingTab; // Space bet 1st indent and 1st-line text
|
|
public short wBorderSpace; // Border-text spaces (nbl/bdr in pts)
|
|
public short wBorderWidth; // Pen widths (nbl/bdr in half twips)
|
|
public short wBorders; // Border styles (nibble/border)
|
|
|
|
public PARAFORMAT2()
|
|
{
|
|
this.cbSize = Marshal.SizeOf(typeof(PARAFORMAT2));
|
|
}
|
|
}
|
|
|
|
#region PARAFORMAT MASK VALUES
|
|
// PARAFORMAT mask values
|
|
private const uint PFM_STARTINDENT = 0x00000001;
|
|
private const uint PFM_RIGHTINDENT = 0x00000002;
|
|
private const uint PFM_OFFSET = 0x00000004;
|
|
private const uint PFM_ALIGNMENT = 0x00000008;
|
|
private const uint PFM_TABSTOPS = 0x00000010;
|
|
private const uint PFM_NUMBERING = 0x00000020;
|
|
private const uint PFM_OFFSETINDENT = 0x80000000;
|
|
|
|
// PARAFORMAT 2.0 masks and effects
|
|
private const uint PFM_SPACEBEFORE = 0x00000040;
|
|
private const uint PFM_SPACEAFTER = 0x00000080;
|
|
private const uint PFM_LINESPACING = 0x00000100;
|
|
private const uint PFM_STYLE = 0x00000400;
|
|
private const uint PFM_BORDER = 0x00000800; // (*)
|
|
private const uint PFM_SHADING = 0x00001000; // (*)
|
|
private const uint PFM_NUMBERINGSTYLE = 0x00002000; // RE 3.0
|
|
private const uint PFM_NUMBERINGTAB = 0x00004000; // RE 3.0
|
|
private const uint PFM_NUMBERINGSTART = 0x00008000; // RE 3.0
|
|
|
|
private const uint PFM_RTLPARA = 0x00010000;
|
|
private const uint PFM_KEEP = 0x00020000; // (*)
|
|
private const uint PFM_KEEPNEXT = 0x00040000; // (*)
|
|
private const uint PFM_PAGEBREAKBEFORE = 0x00080000; // (*)
|
|
private const uint PFM_NOLINENUMBER = 0x00100000; // (*)
|
|
private const uint PFM_NOWIDOWCONTROL = 0x00200000; // (*)
|
|
private const uint PFM_DONOTHYPHEN = 0x00400000; // (*)
|
|
private const uint PFM_SIDEBYSIDE = 0x00800000; // (*)
|
|
private const uint PFM_TABLE = 0x40000000; // RE 3.0
|
|
private const uint PFM_TEXTWRAPPINGBREAK = 0x20000000; // RE 3.0
|
|
private const uint PFM_TABLEROWDELIMITER = 0x10000000; // RE 4.0
|
|
|
|
// The following three properties are read only
|
|
private const uint PFM_COLLAPSED = 0x01000000; // RE 3.0
|
|
private const uint PFM_OUTLINELEVEL = 0x02000000; // RE 3.0
|
|
private const uint PFM_BOX = 0x04000000; // RE 3.0
|
|
private const uint PFM_RESERVED2 = 0x08000000; // RE 4.0
|
|
|
|
#endregion
|
|
|
|
[DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
|
|
private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam,
|
|
[In, Out, MarshalAs(UnmanagedType.LPStruct)] PARAFORMAT2 lParam);
|
|
|
|
|
|
#region AutoSize
|
|
private bool autoSize = false;
|
|
|
|
public void SetAutoSize(bool turnOn)
|
|
{
|
|
autoSize = turnOn;
|
|
}
|
|
#endregion
|
|
|
|
#region Line Spacing
|
|
|
|
public void SetLineSpacingRule(byte rule)
|
|
{
|
|
PARAFORMAT2 pf = new PARAFORMAT2();
|
|
pf.dwMask = (int)(PFM_LINESPACING);
|
|
pf.bLineSpacingRule = rule;
|
|
SendMessage(new System.Runtime.InteropServices.HandleRef(this, this.Handle),
|
|
0x447, 0, pf);
|
|
}
|
|
|
|
|
|
|
|
private double lineSpacingRule = 0;
|
|
|
|
private LineSpacingRule lineSpacing = LineSpacingRule.Single;
|
|
|
|
public LineSpacingRule LineSpacing
|
|
{
|
|
get { return lineSpacing; }
|
|
set
|
|
{
|
|
lineSpacing = value;
|
|
switch (value)
|
|
{
|
|
case LineSpacingRule.Single:
|
|
{
|
|
lineSpacingRule = 1;
|
|
SetLineSpacingRule(0); break;
|
|
}
|
|
case LineSpacingRule.Normal:
|
|
{
|
|
lineSpacingRule = 1.5;
|
|
SetLineSpacingRule(1); break;
|
|
}
|
|
case LineSpacingRule.Double:
|
|
{
|
|
lineSpacingRule = 2;
|
|
SetLineSpacingRule(2); break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
protected override void WndProc(ref Message m)
|
|
{
|
|
const int WM_SETFOCUS = 0x0007;
|
|
if (labelMode == true)
|
|
{
|
|
//this code prevents from the user to edit/get focus the rich text box
|
|
if (m.Msg == WM_SETFOCUS)
|
|
{
|
|
m.Result = IntPtr.Zero;
|
|
}
|
|
else
|
|
base.WndProc(ref m);
|
|
}
|
|
else
|
|
{
|
|
base.WndProc(ref m);
|
|
}
|
|
}
|
|
|
|
public bool LabelMode
|
|
{
|
|
get
|
|
{
|
|
return labelMode;
|
|
}
|
|
set
|
|
{
|
|
labelMode = value;
|
|
if (labelMode == true)
|
|
{
|
|
// for label mode , the control is readonly
|
|
this.ReadOnly = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
void AMT_RichTextbox_TextChanged(object sender, EventArgs e)
|
|
{
|
|
if (autoSize == true)
|
|
{
|
|
LineSpacing = lineSpacing;
|
|
this.Height = Convert.ToInt32((((this.GetLineFromCharIndex(this.Text.Length) + 1) * this.Font.Height + 1 + this.Margin.Vertical) * lineSpacingRule)) + 2;
|
|
this.SelectionStart = 0;
|
|
}
|
|
this.SelectionStart = this.Text.Length;
|
|
this.ScrollToCaret();
|
|
}
|
|
|
|
}
|
|
}
|