Files
2024-02-23 07:03:56 -05:00

315 lines
7.4 KiB
C#

/*************************************************************************************
Extended WPF Toolkit
Copyright (C) 2007-2013 Xceed Software Inc.
This program is provided to you under the terms of the Microsoft Public
License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
For more features, controls, and fast professional support,
pick up the Plus Edition at http://xceed.com/wpf_toolkit
Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
***********************************************************************************/
using System;
using System.ComponentModel;
using System.Windows;
using Xceed.Wpf.Toolkit.Core.Utilities;
using Xceed.Wpf.Toolkit.Core;
namespace Xceed.Wpf.Toolkit.Zoombox
{
[TypeConverter( typeof( ZoomboxViewConverter ) )]
public class ZoomboxView
{
#region Constructors
public ZoomboxView()
{
}
public ZoomboxView( double scale )
{
this.Scale = scale;
}
public ZoomboxView( Point position )
{
this.Position = position;
}
public ZoomboxView( double scale, Point position )
{
this.Position = position;
this.Scale = scale;
}
public ZoomboxView( Rect region )
{
this.Region = region;
}
public ZoomboxView( double x, double y )
: this( new Point( x, y ) )
{
}
public ZoomboxView( double scale, double x, double y )
: this( scale, new Point( x, y ) )
{
}
public ZoomboxView( double x, double y, double width, double height )
: this( new Rect( x, y, width, height ) )
{
}
#endregion
#region Empty Static Property
public static ZoomboxView Empty
{
get
{
return _empty;
}
}
private static readonly ZoomboxView _empty = new ZoomboxView( ZoomboxViewKind.Empty );
#endregion
#region Fill Static Property
public static ZoomboxView Fill
{
get
{
return _fill;
}
}
private static readonly ZoomboxView _fill = new ZoomboxView( ZoomboxViewKind.Fill );
#endregion
#region Fit Static Property
public static ZoomboxView Fit
{
get
{
return _fit;
}
}
private static readonly ZoomboxView _fit = new ZoomboxView( ZoomboxViewKind.Fit );
#endregion
#region Center Static Property
public static ZoomboxView Center
{
get
{
return _center;
}
}
private static readonly ZoomboxView _center = new ZoomboxView( ZoomboxViewKind.Center );
#endregion
#region ViewKind Property
public ZoomboxViewKind ViewKind
{
get
{
if( _kindHeight > 0 )
{
return ZoomboxViewKind.Region;
}
else
{
return ( ZoomboxViewKind )( int )_kindHeight;
}
}
}
private double _kindHeight = ( int )ZoomboxViewKind.Empty;
#endregion
#region Position Property
public Point Position
{
get
{
if( this.ViewKind != ZoomboxViewKind.Absolute )
throw new InvalidOperationException( ErrorMessages.GetMessage( "PositionOnlyAccessibleOnAbsolute" ) );
return new Point( _x, _y );
}
set
{
if( this.ViewKind != ZoomboxViewKind.Absolute && this.ViewKind != ZoomboxViewKind.Empty )
throw new InvalidOperationException( String.Format( ErrorMessages.GetMessage( "ZoomboxViewAlreadyInitialized" ), this.ViewKind.ToString() ) );
_x = value.X;
_y = value.Y;
_kindHeight = ( int )ZoomboxViewKind.Absolute;
}
}
private double _x = double.NaN;
private double _y = double.NaN;
#endregion
#region Scale Property
public double Scale
{
get
{
if( this.ViewKind != ZoomboxViewKind.Absolute )
throw new InvalidOperationException( ErrorMessages.GetMessage( "ScaleOnlyAccessibleOnAbsolute" ) );
return _scaleWidth;
}
set
{
if( this.ViewKind != ZoomboxViewKind.Absolute && this.ViewKind != ZoomboxViewKind.Empty )
throw new InvalidOperationException( String.Format( ErrorMessages.GetMessage( "ZoomboxViewAlreadyInitialized" ), this.ViewKind.ToString() ) );
_scaleWidth = value;
_kindHeight = ( int )ZoomboxViewKind.Absolute;
}
}
private double _scaleWidth = double.NaN;
#endregion
#region Region Property
public Rect Region
{
get
{
// a region view has a positive _typeHeight value
if( _kindHeight < 0 )
throw new InvalidOperationException( ErrorMessages.GetMessage( "RegionOnlyAccessibleOnRegionalView" ) );
return new Rect( _x, _y, _scaleWidth, _kindHeight );
}
set
{
if( this.ViewKind != ZoomboxViewKind.Region && this.ViewKind != ZoomboxViewKind.Empty )
throw new InvalidOperationException( String.Format( ErrorMessages.GetMessage( "ZoomboxViewAlreadyInitialized" ), this.ViewKind.ToString() ) );
if( !value.IsEmpty )
{
_x = value.X;
_y = value.Y;
_scaleWidth = value.Width;
_kindHeight = value.Height;
}
}
}
#endregion
public override int GetHashCode()
{
return _x.GetHashCode() ^ _y.GetHashCode() ^ _scaleWidth.GetHashCode() ^ _kindHeight.GetHashCode();
}
public override bool Equals( object o )
{
bool result = false;
if( o is ZoomboxView )
{
ZoomboxView other = ( ZoomboxView )o;
if( this.ViewKind == other.ViewKind )
{
switch( this.ViewKind )
{
case ZoomboxViewKind.Absolute:
result = ( DoubleHelper.AreVirtuallyEqual( _scaleWidth, other._scaleWidth ) )
&& ( DoubleHelper.AreVirtuallyEqual( Position, other.Position ) );
break;
case ZoomboxViewKind.Region:
result = DoubleHelper.AreVirtuallyEqual( Region, other.Region );
break;
default:
result = true;
break;
}
}
}
return result;
}
public override string ToString()
{
switch( ViewKind )
{
case ZoomboxViewKind.Empty:
return "ZoomboxView: Empty";
case ZoomboxViewKind.Center:
return "ZoomboxView: Center";
case ZoomboxViewKind.Fill:
return "ZoomboxView: Fill";
case ZoomboxViewKind.Fit:
return "ZoomboxView: Fit";
case ZoomboxViewKind.Absolute:
return string.Format( "ZoomboxView: Scale = {0}; Position = ({1}, {2})", _scaleWidth.ToString( "f" ), _x.ToString( "f" ), _y.ToString( "f" ) );
case ZoomboxViewKind.Region:
return string.Format( "ZoomboxView: Region = ({0}, {1}, {2}, {3})", _x.ToString( "f" ), _y.ToString( "f" ), _scaleWidth.ToString( "f" ), _kindHeight.ToString( "f" ) );
}
return base.ToString();
}
private ZoomboxView( ZoomboxViewKind viewType )
{
_kindHeight = ( int )viewType;
}
#region Operators Methods
public static bool operator ==( ZoomboxView v1, ZoomboxView v2 )
{
if( ( object )v1 == null )
return ( object )v2 == null;
if( ( object )v2 == null )
return ( object )v1 == null;
return v1.Equals( v2 );
}
public static bool operator !=( ZoomboxView v1, ZoomboxView v2 )
{
return !( v1 == v2 );
}
#endregion
}
}