Browse Source
			
			
			
			
				
		Fixed FxCop issues in AvalonEdit. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5040 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
				 20 changed files with 345 additions and 40 deletions
			
			
		| 
		 After Width: | Height: | Size: 49 KiB  | 
@ -0,0 +1,105 @@
				@@ -0,0 +1,105 @@
					 | 
				
			||||
// Copyright (c) 2009 Daniel Grunwald
 | 
				
			||||
// 
 | 
				
			||||
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
 | 
				
			||||
// software and associated documentation files (the "Software"), to deal in the Software
 | 
				
			||||
// without restriction, including without limitation the rights to use, copy, modify, merge,
 | 
				
			||||
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
 | 
				
			||||
// to whom the Software is furnished to do so, subject to the following conditions:
 | 
				
			||||
// 
 | 
				
			||||
// The above copyright notice and this permission notice shall be included in all copies or
 | 
				
			||||
// substantial portions of the Software.
 | 
				
			||||
// 
 | 
				
			||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 | 
				
			||||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 | 
				
			||||
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
 | 
				
			||||
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 | 
				
			||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
				
			||||
// DEALINGS IN THE SOFTWARE.
 | 
				
			||||
 | 
				
			||||
using System; | 
				
			||||
using System.IO; | 
				
			||||
using System.Text.RegularExpressions; | 
				
			||||
using System.Windows; | 
				
			||||
using System.Windows.Controls; | 
				
			||||
using System.Windows.Media; | 
				
			||||
using System.Windows.Media.Imaging; | 
				
			||||
 | 
				
			||||
using ICSharpCode.AvalonEdit.Document; | 
				
			||||
using ICSharpCode.AvalonEdit.Rendering; | 
				
			||||
 | 
				
			||||
namespace AvalonEdit.Sample | 
				
			||||
{ | 
				
			||||
	/// <summary>
 | 
				
			||||
	/// This class can be used to embed images inside AvalonEdit like this: <img src="Images/Save.png"/>
 | 
				
			||||
	/// </summary>
 | 
				
			||||
	public class ImageElementGenerator : VisualLineElementGenerator | 
				
			||||
	{ | 
				
			||||
		readonly static Regex imageRegex = new Regex(@"<img src=""([\.\/\w\d]+)""/?>", RegexOptions.IgnoreCase); | 
				
			||||
		readonly string basePath; | 
				
			||||
		 | 
				
			||||
		public ImageElementGenerator(string basePath) | 
				
			||||
		{ | 
				
			||||
			if (basePath == null) | 
				
			||||
				throw new ArgumentNullException("basePath"); | 
				
			||||
			this.basePath = basePath; | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		Match FindMatch(int startOffset) | 
				
			||||
		{ | 
				
			||||
			// fetch the end offset of the VisualLine being generated
 | 
				
			||||
			int endOffset = CurrentContext.VisualLine.LastDocumentLine.EndOffset; | 
				
			||||
			string relevantText = CurrentContext.Document.GetText(startOffset, endOffset - startOffset); | 
				
			||||
			return imageRegex.Match(relevantText); | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		/// <summary>
 | 
				
			||||
		/// Gets the first offset >= startOffset where the generator wants to construct an element.
 | 
				
			||||
		/// Return -1 to signal no interest.
 | 
				
			||||
		/// </summary>
 | 
				
			||||
		public override int GetFirstInterestedOffset(int startOffset) | 
				
			||||
		{ | 
				
			||||
			Match m = FindMatch(startOffset); | 
				
			||||
			return m.Success ? (startOffset + m.Index) : -1; | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		/// <summary>
 | 
				
			||||
		/// Constructs an element at the specified offset.
 | 
				
			||||
		/// May return null if no element should be constructed.
 | 
				
			||||
		/// </summary>
 | 
				
			||||
		public override VisualLineElement ConstructElement(int offset) | 
				
			||||
		{ | 
				
			||||
			Match m = FindMatch(offset); | 
				
			||||
			// check whether there's a match exactly at offset
 | 
				
			||||
			if (m.Success && m.Index == 0) { | 
				
			||||
				BitmapImage bitmap = LoadBitmap(m.Groups[1].Value); | 
				
			||||
				if (bitmap != null) { | 
				
			||||
					Image image = new Image(); | 
				
			||||
					image.Source = bitmap; | 
				
			||||
					image.Width = bitmap.PixelWidth; | 
				
			||||
					image.Height = bitmap.PixelHeight; | 
				
			||||
					// Pass the length of the match to the 'documentLength' parameter of InlineObjectElement.
 | 
				
			||||
					return new InlineObjectElement(m.Length, image); | 
				
			||||
				} | 
				
			||||
			} | 
				
			||||
			return null; | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		BitmapImage LoadBitmap(string fileName) | 
				
			||||
		{ | 
				
			||||
			// TODO: add some kind of cache to avoid reloading the image whenever the VisualLine is reconstructed
 | 
				
			||||
			try { | 
				
			||||
				string fullFileName = Path.Combine(basePath, fileName); | 
				
			||||
				if (File.Exists(fullFileName)) { | 
				
			||||
					BitmapImage bitmap = new BitmapImage(new Uri(fullFileName)); | 
				
			||||
					bitmap.Freeze(); | 
				
			||||
					return bitmap; | 
				
			||||
				} | 
				
			||||
			} catch (ArgumentException) { | 
				
			||||
				// invalid filename syntax
 | 
				
			||||
			} catch (IOException) { | 
				
			||||
				// other IO error
 | 
				
			||||
			} | 
				
			||||
			return null; | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
									
										Binary file not shown.
									
								
							
						| 
		 Before Width: | Height: | Size: 28 KiB  | 
					Loading…
					
					
				
		Reference in new issue