203 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Text;
 | |
| using System.Drawing;
 | |
| using System.Xml;
 | |
| using System.Reflection;
 | |
| 
 | |
| #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 ImageElement : MarkupElement
 | |
|     {
 | |
|         #region Private Variables
 | |
|         private Size m_ImageSize = Size.Empty;
 | |
|         private string m_ImageSource = "";
 | |
|         private Image m_Image = null;
 | |
|         #endregion
 | |
| 
 | |
|         #region Internal Implementation
 | |
|         public override void Measure(System.Drawing.Size availableSize, MarkupDrawContext d)
 | |
|         {
 | |
|             if (!m_ImageSize.IsEmpty)
 | |
|                 this.Bounds = new Rectangle(Point.Empty, m_ImageSize);
 | |
|             else if (m_ImageSource.Length == 0)
 | |
|                 this.Bounds = Rectangle.Empty;
 | |
|             else
 | |
|             {
 | |
|                 Image img = this.GetImage();
 | |
|                 if (img != null)
 | |
|                     this.Bounds = new Rectangle(Point.Empty, img.Size);
 | |
|                 else
 | |
|                     this.Bounds = new Rectangle(Point.Empty, new Size(16,16));
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public override bool IsBlockElement
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private Image GetImage()
 | |
|         {
 | |
|             if (m_Image != null) return m_Image;
 | |
|             Assembly a = null;
 | |
| 
 | |
|             // Try static custom image resolver
 | |
|             ResolveImageEventArgs e = new ResolveImageEventArgs();
 | |
|             e.Key = m_ImageSource;
 | |
|             e.ResolvedImage = null;
 | |
|             MarkupSettings.InvokeResolveImage(e);
 | |
|             if (e.Handled)
 | |
|                 return e.ResolvedImage;
 | |
| 
 | |
|             // Load from format: ClassLibrary1/ClassLibrary1.MyImage.png or ClassLibrary1/global::ClassLibrary1.Resources.MyImage
 | |
|             if (m_ImageSource.IndexOf('/') >= 0)
 | |
|             {
 | |
|                 string[] parts = m_ImageSource.Split('/');
 | |
|                 a = Assembly.Load(parts[0]);
 | |
|                 string ResourceName = parts[1];
 | |
|                 if (a != null)
 | |
|                 {
 | |
|                     m_Image = LoadImageGlobalResource(parts[1], a);
 | |
|                     if (m_Image == null)
 | |
|                         m_Image = LoadImageResource(parts[1], a);
 | |
| 
 | |
|                     if (m_Image != null) return m_Image;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // Probe Executing Assembly
 | |
|             a = Assembly.GetExecutingAssembly();
 | |
|             m_Image = LoadImageGlobalResource(m_ImageSource, a);
 | |
|             if(m_Image==null)
 | |
|                 m_Image = LoadImageResource(m_ImageSource, a);
 | |
| 
 | |
|             // Probe Entry Assembly
 | |
|             if (m_Image == null)
 | |
|             {
 | |
|                 a = Assembly.GetEntryAssembly();
 | |
|                 m_Image = LoadImageGlobalResource(m_ImageSource, a);
 | |
|                 if (m_Image == null)
 | |
|                     m_Image = LoadImageResource(m_ImageSource, a);
 | |
|             }
 | |
| 
 | |
|             return m_Image;
 | |
|         }
 | |
| 
 | |
|         private Image LoadImageGlobalResource(string imageSource, Assembly a)
 | |
|         {
 | |
|             Image img = null;
 | |
| #if FRAMEWORK20
 | |
|             if (imageSource.StartsWith("global::"))
 | |
|             {
 | |
|                 string name = imageSource.Substring(8);
 | |
|                 if (name.Length > 0)
 | |
|                 {
 | |
|                     try
 | |
|                     {
 | |
|                         int i = name.LastIndexOf('.');
 | |
|                         string resName = name.Substring(0, i);
 | |
|                         name = name.Substring(i + 1);
 | |
|                         System.Resources.ResourceManager r = new System.Resources.ResourceManager(resName, a);
 | |
|                         object obj = r.GetObject(name);
 | |
|                         img = (Bitmap)obj;
 | |
|                     }
 | |
|                     catch
 | |
|                     {
 | |
|                         img = null;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| #endif
 | |
|             return img;
 | |
|         }
 | |
| 
 | |
|         private Image LoadImageResource(string imageSource, Assembly a)
 | |
|         {
 | |
|             Image img = null;
 | |
|             try
 | |
|             {
 | |
|                 img = new Bitmap(a.GetManifestResourceStream(imageSource));
 | |
|             }
 | |
|             catch { }
 | |
| 
 | |
|             return img;
 | |
|         }
 | |
| 
 | |
|         public override void Render(MarkupDrawContext d)
 | |
|         {
 | |
|             Rectangle r = this.Bounds;
 | |
|             r.Offset(d.Offset);
 | |
| 
 | |
|             if (!d.ClipRectangle.IsEmpty && !r.IntersectsWith(d.ClipRectangle))
 | |
|                 return;
 | |
| 
 | |
|             Image img = this.GetImage();
 | |
|             if (img != null)
 | |
|             {
 | |
|                 Rectangle imageRect = r;
 | |
|                 if (m_ImageSize.IsEmpty)
 | |
|                     imageRect.Size = img.Size;
 | |
|                 else
 | |
|                     imageRect.Size = m_ImageSize;
 | |
|                 d.Graphics.DrawImage(img, imageRect);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 using (SolidBrush brush = new SolidBrush(Color.White))
 | |
|                 {
 | |
|                     d.Graphics.FillRectangle(brush, r);
 | |
|                 }
 | |
|                 using (Pen pen = new Pen(Color.DarkGray, 1))
 | |
|                 {
 | |
|                     d.Graphics.DrawRectangle(pen, r);
 | |
|                     d.Graphics.DrawLine(pen, r.X, r.Y, r.Right, r.Bottom);
 | |
|                     d.Graphics.DrawLine(pen, r.Right, r.Y, r.X, r.Bottom);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             this.RenderBounds = r;
 | |
|         }
 | |
| 
 | |
|         protected override void ArrangeCore(System.Drawing.Rectangle finalRect, MarkupDrawContext d)  { }
 | |
| 
 | |
|         public override void ReadAttributes(XmlTextReader reader)
 | |
|         {
 | |
|             m_ImageSize = Size.Empty;
 | |
|             m_ImageSource = "";
 | |
|             m_Image = null;
 | |
| 
 | |
|             for (int i = 0; i < reader.AttributeCount; i++)
 | |
|             {
 | |
|                 reader.MoveToAttribute(i);
 | |
|                 if (reader.Name.ToLower() == "width")
 | |
|                 {
 | |
|                     string s = reader.Value;
 | |
|                     m_ImageSize.Width = int.Parse(s);
 | |
|                 }
 | |
|                 else if (reader.Name.ToLower() == "height")
 | |
|                 {
 | |
|                     string s = reader.Value;
 | |
|                     m_ImageSize.Height = int.Parse(s);
 | |
|                 }
 | |
|                 else if (reader.Name.ToLower() == "src")
 | |
|                 {
 | |
|                     m_ImageSource = reader.Value;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         #endregion
 | |
|     }
 | |
| }
 |