// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
//
// 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.Globalization;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.TextFormatting;
using ICSharpCode.AvalonEdit.Utils;
namespace ICSharpCode.AvalonEdit.Rendering
{
///
/// implementation that allows changing the properties.
/// A instance usually is assigned to a single
/// .
///
public class VisualLineElementTextRunProperties : TextRunProperties, ICloneable
{
Brush backgroundBrush;
BaselineAlignment baselineAlignment;
CultureInfo cultureInfo;
double fontHintingEmSize;
double fontRenderingEmSize;
Brush foregroundBrush;
Typeface typeface;
TextDecorationCollection textDecorations;
TextEffectCollection textEffects;
TextRunTypographyProperties typographyProperties;
NumberSubstitution numberSubstitution;
///
/// Creates a new VisualLineElementTextRunProperties instance that copies its values
/// from the specified .
/// For the and collections, deep copies
/// are created if those collections are not frozen.
///
public VisualLineElementTextRunProperties(TextRunProperties textRunProperties)
{
if (textRunProperties == null)
throw new ArgumentNullException("textRunProperties");
backgroundBrush = textRunProperties.BackgroundBrush;
baselineAlignment = textRunProperties.BaselineAlignment;
cultureInfo = textRunProperties.CultureInfo;
fontHintingEmSize = textRunProperties.FontHintingEmSize;
fontRenderingEmSize = textRunProperties.FontRenderingEmSize;
foregroundBrush = textRunProperties.ForegroundBrush;
typeface = textRunProperties.Typeface;
textDecorations = textRunProperties.TextDecorations;
if (textDecorations != null && !textDecorations.IsFrozen) {
textDecorations = textDecorations.Clone();
}
textEffects = textRunProperties.TextEffects;
if (textEffects != null && !textEffects.IsFrozen) {
textEffects = textEffects.Clone();
}
typographyProperties = textRunProperties.TypographyProperties;
numberSubstitution = textRunProperties.NumberSubstitution;
}
///
/// Creates a copy of this instance.
///
public virtual VisualLineElementTextRunProperties Clone()
{
return new VisualLineElementTextRunProperties(this);
}
object ICloneable.Clone()
{
return Clone();
}
///
public override Brush BackgroundBrush {
get { return backgroundBrush; }
}
///
/// Sets the .
///
public void SetBackgroundBrush(Brush value)
{
ExtensionMethods.CheckIsFrozen(value);
backgroundBrush = value;
}
///
public override BaselineAlignment BaselineAlignment {
get { return baselineAlignment; }
}
///
/// Sets the .
///
public void SetBaselineAlignment(BaselineAlignment value)
{
baselineAlignment = value;
}
///
public override CultureInfo CultureInfo {
get { return cultureInfo; }
}
///
/// Sets the .
///
public void SetCultureInfo(CultureInfo value)
{
if (value == null)
throw new ArgumentNullException("value");
cultureInfo = value;
}
///
public override double FontHintingEmSize {
get { return fontHintingEmSize; }
}
///
/// Sets the .
///
public void SetFontHintingEmSize(double value)
{
fontHintingEmSize = value;
}
///
public override double FontRenderingEmSize {
get { return fontRenderingEmSize; }
}
///
/// Sets the .
///
public void SetFontRenderingEmSize(double value)
{
fontRenderingEmSize = value;
}
///
public override Brush ForegroundBrush {
get { return foregroundBrush; }
}
///
/// Sets the .
///
public void SetForegroundBrush(Brush value)
{
ExtensionMethods.CheckIsFrozen(value);
foregroundBrush = value;
}
///
public override Typeface Typeface {
get { return typeface; }
}
///
/// Sets the .
///
public void SetTypeface(Typeface value)
{
if (value == null)
throw new ArgumentNullException("value");
typeface = value;
}
///
/// Gets the text decorations. The value may be null, a frozen
/// or an unfrozen .
/// If the value is an unfrozen , you may assume that the
/// collection instance is only used for this instance and it is safe
/// to add s.
///
public override TextDecorationCollection TextDecorations {
get { return textDecorations; }
}
///
/// Sets the .
///
public void SetTextDecorations(TextDecorationCollection value)
{
ExtensionMethods.CheckIsFrozen(value);
textDecorations = value;
}
///
/// Gets the text effects. The value may be null, a frozen
/// or an unfrozen .
/// If the value is an unfrozen , you may assume that the
/// collection instance is only used for this instance and it is safe
/// to add s.
///
public override TextEffectCollection TextEffects {
get { return textEffects; }
}
///
/// Sets the .
///
public void SetTextEffects(TextEffectCollection value)
{
ExtensionMethods.CheckIsFrozen(value);
textEffects = value;
}
///
/// Gets the typography properties for the text run.
///
public override TextRunTypographyProperties TypographyProperties {
get { return typographyProperties; }
}
///
/// Sets the .
///
public void SetTypographyProperties(TextRunTypographyProperties value)
{
typographyProperties = value;
}
///
/// Gets the number substitution settings for the text run.
///
public override NumberSubstitution NumberSubstitution {
get { return numberSubstitution; }
}
///
/// Sets the .
///
public void SetNumberSubstitution(NumberSubstitution value)
{
numberSubstitution = value;
}
}
}