You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.8 KiB
101 lines
2.8 KiB
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) |
|
// This code is distributed under MIT X11 license (for details please see \doc\license.txt) |
|
|
|
using System; |
|
using System.Diagnostics; |
|
using System.Windows; |
|
using System.Windows.Input; |
|
using System.Windows.Media; |
|
using System.Windows.Media.TextFormatting; |
|
using ICSharpCode.AvalonEdit.Rendering; |
|
|
|
namespace EmbeddedImageAddIn |
|
{ |
|
/// <summary> |
|
/// VisualLineElement implementation for embedded images. |
|
/// </summary> |
|
public class ImageElement : VisualLineElement |
|
{ |
|
readonly string imageFileName; |
|
readonly ImageSource image; |
|
|
|
public ImageElement(string imageFileName, ImageSource image, int documentLength) : base(1, documentLength) |
|
{ |
|
if (imageFileName == null) |
|
throw new ArgumentNullException("imageFileName"); |
|
if (image == null) |
|
throw new ArgumentNullException("image"); |
|
this.imageFileName = imageFileName; |
|
this.image = image; |
|
} |
|
|
|
public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context) |
|
{ |
|
return new ImageTextRun(image, this.TextRunProperties); |
|
} |
|
|
|
protected override void OnMouseDown(MouseButtonEventArgs e) |
|
{ |
|
base.OnMouseDown(e); |
|
if (!e.Handled && e.ClickCount == 2) { |
|
// double click on image: open the image in editor |
|
try { |
|
Process.Start(imageFileName); |
|
} catch (Exception ex) { |
|
MessageBox.Show(ex.Message); |
|
} |
|
} |
|
} |
|
|
|
sealed class ImageTextRun : TextEmbeddedObject |
|
{ |
|
readonly ImageSource image; |
|
readonly TextRunProperties properties; |
|
|
|
public ImageTextRun(ImageSource image, TextRunProperties properties) |
|
{ |
|
this.image = image; |
|
this.properties = properties; |
|
} |
|
|
|
public override LineBreakCondition BreakBefore { |
|
get { return LineBreakCondition.BreakPossible; } |
|
} |
|
|
|
public override LineBreakCondition BreakAfter { |
|
get { return LineBreakCondition.BreakPossible; } |
|
} |
|
|
|
public override bool HasFixedSize { |
|
get { return true; } |
|
} |
|
|
|
public override CharacterBufferReference CharacterBufferReference { |
|
get { return new CharacterBufferReference(); } |
|
} |
|
|
|
public override int Length { |
|
get { return 1; } |
|
} |
|
|
|
public override TextRunProperties Properties { |
|
get { return properties; } |
|
} |
|
|
|
public override TextEmbeddedObjectMetrics Format(double remainingParagraphWidth) |
|
{ |
|
return new TextEmbeddedObjectMetrics(image.Width, image.Height, image.Height); |
|
} |
|
|
|
public override Rect ComputeBoundingBox(bool rightToLeft, bool sideways) |
|
{ |
|
return new Rect(0, 0, image.Width, image.Height); |
|
} |
|
|
|
public override void Draw(DrawingContext drawingContext, Point origin, bool rightToLeft, bool sideways) |
|
{ |
|
drawingContext.DrawImage(image, new Rect(origin.X, origin.Y - image.Height, image.Width, image.Height)); |
|
} |
|
} |
|
} |
|
}
|
|
|