225 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Drawing;
 | |
| using System.Drawing.Drawing2D;
 | |
| using System.Text;
 | |
| 
 | |
| #if AdvTree
 | |
| namespace DevComponents.Tree.TextMarkup
 | |
| #elif DOTNETBAR
 | |
| namespace DevComponents.DotNetBar.TextMarkup
 | |
| #elif SUPERGRID
 | |
| namespace DevComponents.SuperGrid.TextMarkup
 | |
| #elif LAYOUT
 | |
| namespace DevComponents.DotNetBar.Layout.TextMarkup
 | |
| #endif
 | |
| {
 | |
|     internal class TextElement : MarkupElement
 | |
|     {
 | |
|         private static bool PadText = false;
 | |
|         static TextElement()
 | |
|         {
 | |
|             string lc = System.Windows.Forms.Application.CurrentCulture.TwoLetterISOLanguageName;
 | |
|             if (lc == "ja")
 | |
|                 PadText = true;
 | |
|         }
 | |
|         #region Private Variables
 | |
|         private string m_Text = "";
 | |
|         private bool m_TrailingSpace = false;
 | |
|         private bool m_EnablePrefixHandling = true;
 | |
|         #endregion
 | |
| 
 | |
|         #region Internal Implementation
 | |
|         public override void Measure(System.Drawing.Size availableSize, MarkupDrawContext d)
 | |
|         {
 | |
| #if (FRAMEWORK20)
 | |
|             if (BarUtilities.UseTextRenderer)
 | |
|             {
 | |
|                 eTextFormat format = eTextFormat.Default | eTextFormat.NoPadding;
 | |
|                 if (!d.HotKeyPrefixVisible || m_EnablePrefixHandling)
 | |
|                     format |= eTextFormat.HidePrefix;
 | |
|                 Size size = Size.Empty;
 | |
|                 if (m_TrailingSpace)
 | |
|                 {
 | |
|                     if (d.CurrentFont.Italic)
 | |
|                     {
 | |
|                         size = Size.Ceiling(TextDrawing.MeasureString(d.Graphics, m_Text, d.CurrentFont, 0, format));
 | |
|                         size.Width += (int)(d.Graphics.MeasureString("||", d.CurrentFont).Width / 4);
 | |
|                     }
 | |
|                     else
 | |
|                         size = Size.Ceiling(TextDrawing.MeasureString(d.Graphics, m_Text + (BarFunctions.IsVista && m_Text.Length > 0 ? "|" : "||"), d.CurrentFont, 0, format));
 | |
|                 }
 | |
|                 else
 | |
|                     size = Size.Ceiling(TextDrawing.MeasureString(d.Graphics, m_Text, d.CurrentFont, 0, format));
 | |
|                 if (PadText)
 | |
|                 {
 | |
|                     size.Width += BarUtilities.TextMarkupCultureSpecificPadding;
 | |
|                     size.Height += BarUtilities.TextMarkupCultureSpecificPadding;
 | |
|                 }
 | |
|                 this.Bounds = new Rectangle(Point.Empty, size);
 | |
|             }
 | |
|             else
 | |
| #endif
 | |
|             {
 | |
|                 using (StringFormat format = new StringFormat(StringFormat.GenericTypographic))
 | |
|                 {
 | |
|                     format.FormatFlags = StringFormatFlags.NoWrap;
 | |
|                     if (d.HotKeyPrefixVisible || !m_EnablePrefixHandling)
 | |
|                         format.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show;
 | |
|                     else
 | |
|                         format.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Hide;
 | |
| 
 | |
|                     if (m_TrailingSpace)
 | |
|                     {
 | |
|                         if (d.CurrentFont.Italic)
 | |
|                         {
 | |
|                             Size size = Size.Ceiling(d.Graphics.MeasureString(m_Text, d.CurrentFont, 0, format));
 | |
|                             size.Width += (int)(d.Graphics.MeasureString("|", d.CurrentFont).Width / 4);
 | |
|                             if (PadText)
 | |
|                             {
 | |
|                                 size.Width += BarUtilities.TextMarkupCultureSpecificPadding;
 | |
|                                 size.Height += BarUtilities.TextMarkupCultureSpecificPadding;
 | |
|                             }
 | |
|                             this.Bounds = new Rectangle(Point.Empty, size);
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             Size size = Size.Ceiling(d.Graphics.MeasureString(m_Text + "|", d.CurrentFont, 0, format));
 | |
|                             if (PadText)
 | |
|                             {
 | |
|                                 size.Width += BarUtilities.TextMarkupCultureSpecificPadding;
 | |
|                                 size.Height += BarUtilities.TextMarkupCultureSpecificPadding;
 | |
|                             }
 | |
|                             this.Bounds = new Rectangle(Point.Empty, size);
 | |
|                         }
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         Size size = Size.Ceiling(d.Graphics.MeasureString(m_Text, d.CurrentFont, 0, format));
 | |
|                         if (PadText)
 | |
|                         {
 | |
|                             size.Width += BarUtilities.TextMarkupCultureSpecificPadding;
 | |
|                             size.Height += BarUtilities.TextMarkupCultureSpecificPadding;
 | |
|                         }
 | |
|                         this.Bounds = new Rectangle(Point.Empty, size);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             IsSizeValid = true;
 | |
|         }
 | |
| 
 | |
|         public override void Render(MarkupDrawContext d)
 | |
|         {
 | |
|             Rectangle r = this.Bounds;
 | |
|             r.Offset(d.Offset);
 | |
| 
 | |
|             if (!d.ClipRectangle.IsEmpty && !r.IntersectsWith(d.ClipRectangle))
 | |
|                 return;
 | |
| 
 | |
|             Graphics g = d.Graphics;
 | |
|             #if (FRAMEWORK20)
 | |
|             if (BarUtilities.UseTextRenderer)
 | |
|             {
 | |
|                 eTextFormat format = eTextFormat.Default | eTextFormat.NoClipping | eTextFormat.NoPadding;
 | |
|                 if (d.RightToLeft) format |= eTextFormat.RightToLeft;
 | |
|                 if (!d.HotKeyPrefixVisible)
 | |
|                     format |= eTextFormat.HidePrefix;
 | |
| 
 | |
|                 if (!d.ClipRectangle.IsEmpty && r.Right > d.ClipRectangle.Right)
 | |
|                 {
 | |
|                     format|= eTextFormat.EndEllipsis;
 | |
|                     r.Width -= (r.Right - d.ClipRectangle.Right);
 | |
|                 }
 | |
|                 TextDrawing.DrawString(g, m_Text, d.CurrentFont, d.CurrentForeColor, r, format);
 | |
|                 
 | |
|             }
 | |
|             else
 | |
|             #endif
 | |
|             {
 | |
|                 using (StringFormat format = new StringFormat(StringFormat.GenericTypographic))
 | |
|                 {
 | |
|                     format.FormatFlags |= StringFormatFlags.NoWrap;
 | |
|                     if (d.RightToLeft) format.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
 | |
|                     if (d.HotKeyPrefixVisible)
 | |
|                         format.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show;
 | |
|                     else
 | |
|                         format.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Hide;
 | |
|                     if (!d.ClipRectangle.IsEmpty && r.Right > d.ClipRectangle.Right)
 | |
|                     {
 | |
|                         format.Trimming = StringTrimming.EllipsisCharacter;
 | |
|                         r.Width -= (r.Right - d.ClipRectangle.Right);
 | |
|                     }
 | |
|                     
 | |
|                     using (SolidBrush brush = new SolidBrush(d.CurrentForeColor))
 | |
|                         g.DrawString(m_Text, d.CurrentFont, brush, r, format);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (d.StrikeOut == true)
 | |
|             {
 | |
|                 // StrikeOut
 | |
| 
 | |
|                 float descent = d.CurrentFont.FontFamily.GetCellDescent(d.CurrentFont.Style) *
 | |
|                     d.CurrentFont.Size / d.CurrentFont.FontFamily.GetEmHeight(d.CurrentFont.Style) + 1;
 | |
| 
 | |
|                 using (Pen pen = new Pen(d.CurrentForeColor, 1))
 | |
|                 {
 | |
|                     SmoothingMode sm = g.SmoothingMode;
 | |
|                     g.SmoothingMode = SmoothingMode.Default;
 | |
| 
 | |
|                     float y = r.Top + (r.Height + descent) / 2;
 | |
| 
 | |
|                     g.DrawLine(pen, r.X, y, r.Right - 1, y);
 | |
|                     g.SmoothingMode = sm;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if ((d.HyperLink && (d.HyperlinkStyle == null || d.HyperlinkStyle.UnderlineStyle != eHyperlinkUnderlineStyle.None)) || d.Underline)
 | |
|             {
 | |
|                 // Underline Hyperlink
 | |
|                 float descent = d.CurrentFont.FontFamily.GetCellDescent(d.CurrentFont.Style) * d.CurrentFont.Size / d.CurrentFont.FontFamily.GetEmHeight(d.CurrentFont.Style);
 | |
|                 using (Pen pen = new Pen(d.CurrentForeColor, 1))
 | |
|                 {
 | |
|                     if (d.HyperLink && d.HyperlinkStyle != null && d.HyperlinkStyle.UnderlineStyle == eHyperlinkUnderlineStyle.DashedLine)
 | |
|                         pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
 | |
|                     descent -= 1;
 | |
|                     System.Drawing.Drawing2D.SmoothingMode sm = g.SmoothingMode;
 | |
|                     g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
 | |
|                     g.DrawLine(pen, r.X, r.Bottom - descent, r.Right - 1, r.Bottom - descent);
 | |
|                     g.SmoothingMode = sm;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             this.RenderBounds = r;
 | |
|         }
 | |
| 
 | |
|         protected override void ArrangeCore(System.Drawing.Rectangle finalRect, MarkupDrawContext d) {}
 | |
| 
 | |
|         public string Text
 | |
|         {
 | |
|             get { return m_Text; }
 | |
|             set
 | |
|             {
 | |
|                 m_Text = value;
 | |
|                 this.IsSizeValid = false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public bool TrailingSpace
 | |
|         {
 | |
|             get { return m_TrailingSpace; }
 | |
|             set
 | |
|             {
 | |
|                 m_TrailingSpace = value;
 | |
|                 this.IsSizeValid = false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public bool EnablePrefixHandling
 | |
|         {
 | |
|             get { return m_EnablePrefixHandling; }
 | |
|             set { m_EnablePrefixHandling = value; }
 | |
|         }
 | |
|         #endregion
 | |
|     }
 | |
| }
 |